이전 포스팅에서 Seaborn을 이용하여 Histplot, Distplot, Barplot, Countplot, Boxplot, Violineplot을 그리는 방법을 알아봤습니다. 이어서 다른 plot들을 그리는 방법에 대해 알아보겠습니다.
이전 내용이 궁금하신 분들은 https://data-gongbu.tistory.com/44여기로 이동해 주세요 :)
사용한 데이터 셋은 이전과 동일하게 penguins dataset입니다.
변수에 대해서만 다시 한번 언급하고 가겠습니다.
- species : 펭귄 종
- island : 서식지
- bill_length_mm : 부리 길이
- bill_depth_mm : 부리 위아래 두께
- flipper_length_mm : 팔 길이
- body_mass_g : 몸무게
- sex : 성별
7. Lineplot
Lineplot은 두 변수 간의 관계를 확인할 수 있는 plot으로, 수치형 지표들 간의 경향을 파악할 때 사용됩니다.
몸무게와 펭귄의 팔 길이에 대한 관계를 lineplot을 통해 그려보겠습니다.
sns.lineplot(data = data, x = 'body_mass_g', y = 'flipper_length_mm')
몸무게와 필 길이 간의 관계를 선그래프를 통해 확인해 보면 전반적으로 몸무게가 증가할수록 팔 길이도 증가하는 경향이 있는 걸 알 수 있습니다. 그렇지만 증가, 하락을 반복하며 우상향을 하기 때문에 무조건은 아닙니다.
또한 lineplot 상에 옅게 칠해진 백그라운드는 해당 범위에 있는 수치값의 에러에 대한 허용 범위를 의미합니다. 이 에러에 대한 범위를 조정하고 싶은 경우 ci를 설정해 주면 됩니다.
sns.lineplot(data = data, x = 'body_mass_g', y = 'flipper_length_mm', ci = None)
백그라운드가 사라졌네요!
8. point plot
특정 수치 데이터를 error bar와 함께 출력해 주는 plot입니다. 수치 데이터를 다양한 각도에서 한 번에 바라보고 싶을때 사용하며, 데이터와 error bar를 한번에 찍어주기 때문에 살펴보고 싶은 특정 지표들만 사용하는 것이 좋습니다.
성별에 따른 부리 길이를 포인트 플랏을 사용하여 살펴보겠습니다.
sns.pointplot(data = data, x = 'sex', y = 'bill_length_mm')
직선은 각 분포를 표현한 것이고 직선 중간에 있는 점은 각 변수의 평균에 해당합니다.
수컷의 부리가 암컷의 부리보다 길어 보입니다.
9. Scatter plot
scatter plot line plot과 비슷하게 x, y에 대한 전체적인 분포를 확인하는 plot입니다. 선 그래프의 경우 경향성에 초점을 둔다면, 산점도의 경우 데이터 그 자체가 퍼져있는 모양에 중점을 두고 있습니다.
성별에 따른 펭귄의 팔 길이와 몸무게를 산점도로 그려보겠습니다.
sns.scatterplot(data = data, x ='flipper_length_mm', y = 'body_mass_g', hue = 'sex')
팔 길이가 증가하면 몸무게가 증가하는 경향이 있음을 확인할 수 있고,
암컷의 분포가 수컷의 분포보다 상재적으로 밑에 형성된 것을 알 수 있습니다.
10. Pair plot
Pair plot은 주어진 데이터의 각 변수들 사이의 관계를 표현하는 plot입니다. scatterplot, facetGrid, kdeplot을 이용하여 각 변수들 간의 관계를 보여줍니다. 각 변수에 대해 계산된 모든 결과를 보여주기 때문에, 변수가 많은 경우 사용하기 적합하진 않습니다. 권장 사이즈는 6 x 6 정도까지입니다.
그럼 펭귄 데이터의 pair plot을 그려보겠습니다.
sns.pairplot(data= data)
pair plot의 경우 수치형 변수들 간의 관계에 대해 그리게 설계되어 있어, data에 따로 지정을 해 주지 않아도 됩니다.
hue 옵션에 species 변수를 추가해서 종에 따른 분포를 살펴보겠습니다.
sns.pairplot(data= data, hue = 'species')
그래프를 살펴보겠습니다.
우선, 몸무게와 부리 두께 사이의 그래프를 보면 adelie와 chinstrap은 유사하지만 gentoo 종의 경우 확실하게 구분되어 있는 걸 확인할 수 있습니다. 이를 통해 몸무게와 부리 두께에 대한 정보를 알고 있다면 gentoo 종을 분리하는 게 가능하겠네요.
다음으로 팔 길이와 부리 길이를 살펴보면 종 별로 조금씩 다 떨어져 있는 경향을 보입니다.
플랏을 전체적으로 보면 adelie와 chinstrap이 비슷한 결을 띄고 있고, gentoo가 다른 경향을 보이고 있습니다.
이번에는 성별에 따른 분포를 한번 살펴보겠습니다.
sns.pairplot(data= data, hue = 'sex')
암컷 펭귄이 수컷 펭귄보다 대부분 아래에 위치해 있는 것으로 보이네요
11. Heatmap
Heatmap은 정사각형 그림에 데이터에 대한 정도 차이를 보여주는 plot입니다. 말 그대로 heatmap이기 때문에 열화상 카메라로 사물을 찍은 것처럼 정보의 차이를 보여줍니다. pairplot과 비슷하게 변수들 간의 관계를 시각화할 때 많이 사용되며 특히 변수 간의 상관계수를 표현할 때 자주 사용됩니다.
(*상관계수: 어떤 x값이 변화함에 따라 y값의 선형적으로 변화하는지를 측정한 지표)
우선 Heatmap을 그리기 위해 상관계수를 구해보겠습니다.
corr = data.corr()
corr
구해진 상관계수를 heatmap을 통해 그려보면
sns.heatmap(data = corr, square= True, cmap = 'Blues')
다음과 같은 오른쪽 바에 표시된 색의 정도에 따라 시각화를 해 주는 걸 확인할 수 있습니다.
상관계수 값을 표시하고 싶은 경우 annot 옵션을 지정하면 됩니다.
sns.heatmap(data = corr, square= True, cmap = 'Blues', annot=True)
몸무게와 팔 길이 사이의 상관계수가 0.87로 강한 양의 상관을 가지네요.
Seaborn을 이용하여 데이터 시각화를 진행해 봤습니다. 사실 seaborn에서 제공하고 있는 기능은 이것보다 훨씬 많습니다.
더 자세한 내용이 궁금하신 분들은 https://matplotlib.org/cheatsheets/ 이 내용을 보시는 것도 좋을 거 같아요!
개인적으로 matplitlib보다 seaborn이 더 예쁘게 보이는 거 같습니다. 여러분들도 그러시나요? ㅎㅎ
'Python' 카테고리의 다른 글
[Python] Seaborn 라이브러리를 활용한 데이터 시각화1 (0) | 2023.03.26 |
---|