파이썬의 대표적인 시각화 도구로는 matplotlib와 seaborn이 있습니다. 여기서 seaborn은 matplotlib를 더 편하게 사용할 수 있도록 만든 라이브러리입니다. seaborn같은 경우 matplotlib에 있는 개념을 확장해서 사용가능하기 때문에 시각화에 유용하다 할 수 있습니다. 이번 포스팅에서 이런 Seaborn을 활용해 데이터 시각화를 진행해 보겠습니다.
실습에 사용될 데이터는 seaborn에 내장된 penguins dataset입니다. seaborn 같은 경우 내장 데이터를 지원해 줘 처음 접하는 사람들이 공부하기 편하게 만들었습니다.
penguins dataset은 아래와 같은 변수들로 구성되어 있습니다.
- species : 펭귄 종
- island : 서식지
- bill_length_mm : 부리 길이
- bill_depth_mm : 부리 위아래 두께
- flipper_length_mm : 팔 길이
- body_mass_g : 몸무게
- sex : 성별
그럼 이제 시각화를 위해 데이터를 불러오겠습니다.
# data load
import seaborn as sns
data = sns.load_dataset('penguins') # (344 rows x 7 columns)
4행을 보면 nan값이 있는 걸 확인할 수 있는데, 깔끔한 시각화를 위해 우선 nan값을 지워주겠습니다.
# 데이터 전처리
data = data.dropna() # (333 rows x 7 columns)
dropna를 통해 결측값을 제거하니 344개의 row데이터가 333개로 줄었습니다.
데이터 전처리가 끝났으니 이제 그래프를 유형별로 하나씩 그려보겠습니다.
1. Histplot
Histplot은 가장 기본적으로 사용되는 히스토그램을 출력하는 plot입니다. 전체 데이터를 특정 구간별 정보를 확인할 때 사용됩니다.
몸무게의 분포를 히스토그램으로 그려보겠습니다.
sns.histplot(data = data, x = 'body_mass_g'
히스토그램의 경우 구간에 따른 카운트를 그래프에 표현하기 때문에, y는 count로 고정되어 있어 x값만 설정하면 됩니다.
히스토그램은 구간의 개수에 따라 분포를 다르게 표현될 수 있는데, 이를 조정하는 옵션은 bins입니다.
sns.histplot(data = data, x = 'body_mass_g', bins = 15)
또한 그려진 히스토그램 내에 범례를 추가하여 볼 수도 있습니다.
sns.histplot(data = data, x = 'body_mass_g', bins = 15)
hue 옵션은 ~에 따라 색을 다르게 표현하라는 기능입니다. species 변수를 설정하여 종별로 다른 색으로 표시된 것을 확인할 수 있습니다.
그런데, 여기서 종의 종류는 3가지인데 그래프 내에 표현된 색상은 5개입니다. 이는 겹치는 부분이 존재하기 때문에 다른 색으로 보이게 된 것입니다. 이를 수정하여 3개의 범례로만 보고 싶은 경우 multiplt 옵션을 지정하면 됩니다.
sns.histplot(data = data, x = 'body_mass_g', bins = 15, hue = 'species', multiple='stack')
multiplt = ‘stack’을 추가하면 한 구간에 종별 카운트를 해줍니다. 그러나 위의 그림과는 y축 범위가 다른 것을 알 수 있습니다. 한 구간에 존재하는 종별로 카운트를 구해 쌓아 표현한 것이기 때문에 그렇습니다. 그렇기 때문에 시각화 목적에 따라 옵션 선택에 유의하세요.
각설하고, 앞에서 seaborn의 경우 matplotlib에 있는 개념을 확장해서 사용가능하다 했는데 정말 그런지 확인해 보겠습니다.
import matplotlib.pyplot as plt
plt.figure()
plt.title('Distribution over body_mass', fontsize = 14)
sns.histplot(data = data, x = 'body_mass_g', bins = 15, hue = 'species', multiple='stack')
plt.show()
위의 그래프에 title을 추가해 봤습니다. 잘 적용된걸 보니 맞는 말이네요!
2. Distplot
Distplot의 경우 distribution을 여러 subplot으로 나눠 출력해 주는 plot입니다. distplot의 kind를 변경하여 hist, kde, ecd 모두 출력 가능합니다.
종별 몸무게의 분포를 그려보겠습니다.
sns.displot(data= data, kind = 'kde', x = 'body_mass_g', hue = 'species')
Distplot의 경우에도 옵션을 통해 다른 식으로 표현 가능합니다.
sns.displot(data= data, kind = 'kde', x = 'body_mass_g',hue = 'species', col = 'island')
#sns.displot(data= data, kind = 'kde', x = 'body_mass_g',hue = 'species', row = 'island')
col 옵션을 추가하여 서식지에 따른 종별 몸무게를 그려봤습니다. row의 그래프는 추가하지 않았으니 궁금하신 분들은 한번 그려보세요!
3. Barplot
Barplot의 경우 어떤 데이터에 대한 값의 크기를 막대로 보여주는 plot입니다. 가로/세로 두 가지로 모두 출력 가능하며, x축에는 범주형 변수 y축에는 수치형 변수로 설정합니다.
종애 따른 몸무게 분포를 그려보겠습니다.
sns.barplot(data = data, x = 'species', y = 'body_mass_g')
막대그래프의 경우 종류에 따른 값을 비교하는데 많이 사용됩니다.
그래프 위에 표시된 검은색 직선은 허용 오차를 의미합니다.
이번에는 막대그래프를 가로 방향으로 그려보겠습니다.
sns.barplot(data = data, x = 'body_mass_g', y = 'species')
가로형 막대그래프의 경우 x축, y축에 입력한 변수를 서로 바꿔 생성 가능합니다.
그래프를 보면 gentoo 종의 몸무게가 다른 종에 비해 상대적으로 높은 것을 확인할 수 있습니다.
이번엔 위의 그래프에 성별 옵셥을 추가해 그려보겠습니다.
sns.barplot(data = data, x = 'body_mass_g', y = 'species', hue = 'sex')
종별, 성별로 몸무게 분포를 확인하면 종에 상관없이 수컷 펭귄의 몸무게가 암컷보다 평균적으로 높은 걸 알 수 있네요.
4. Countplot
countplot의 경우 범주형 속성을 가지는 데이터들의 히스토그램을 보여주는 plot입니다. 종류별 count를 시각화하고 싶을 때 사용합니다.
sns.countplot(data = data, x = 'sex', hue = 'species')
펭귄의 성별과 종에 따른 빈도그래프를 그려보니 chinstrap 종의 펭귄이 가장 작은 빈도를 보이는 걸 알 수 있습니다.
그리고 seaborn 라이브러리 같은 경우 다양한 컬러 테마를 지원하고 있습니다.
원하는 색을 설정하기 위해서는 set_palette 옵션을 사용하면 됩니다.
sns.set_palette('Set2')
sns.countplot(data = data, x = 'sex', hue = 'species')
5. Boxplot
Boxplot은 데이터의 변수별로 사분위수를 표시하는 plot입니다. 그러기 때문에 데이터의 전체적인 분포를 확인하기 좋은 방법이며 이상치 존재 유무를 파악하기 쉽습니다.
종에 따른 부리 두께에 대한 박스 플랏을 그려보겠습니다.
sns.boxplot(data = data, x = 'species', y = 'bill_depth_mm' )
adelie종 같은 경우 이상치가 존재하는 것으로 보입니다.
위의 그래프에 성별 조건을 추가해 보면,
sns.boxplot(data = data, x = 'species', y = 'bill_depth_mm', hue= 'sex')
성별에 상관없이 이상치가 존재하는 것을 알 수 있습니다.
6. Violineplot
Violineplot은 변수에 대한 분포 자체를 보여주는 plot입니다. 상자그림과 비슷하지만, 전체 분포를 보여준다는 점에서 차이가 존재하며, 상자그림과 같이 그려 평균 근처에 데이터가 얼마나 있는지 전체적으로 어떻게 퍼져있는지 확인 가능합니다.
sns.violinplot(data = data, x = 'species', y = 'bill_depth_mm', hue= 'sex')
위에서 그린 상자그림과 비교해 보면, 상단 부분 유사하나 바이올린 플랏의 경우 전체적인 모양을 보여주는 걸 알 수 있습니다. 이때 바이올린 플랏에 표시되어 있는 직선이 상자그림에서 사분위수에 해당하는 범위를 나타낸 것입니다.
이것으로 Seaborn 라이브러리에서 지원하는 plot 일부분에 대해 알아봤습니다.
Line plot, Point plot, Scatter plot, Pair plot, Heatmap에 해당하는 내용도 정리해 뒀는데 포스팅이 길어지는 관계로 해당하는 내용은 다음 포스팅으로 찾아뵙겠습니다.
지금까지 읽어주셔서 감사합니다 :)
'Python' 카테고리의 다른 글
[Python] Seaborn 라이브러리를 활용한 데이터 시각화2 (0) | 2023.03.27 |
---|