지난 시간에 matplotlib을 활용하여 데이터를 시각화하는 방법에 대하여 알아보았습니다. matplotlib보다 좀 더 편리하게 시각화를 사용할 수 있도록 만들어주는 것이 seaborn 라이브러리입니다. 이번 시간에는 seaborn 라이브러리를 활용하여 데이터를 시각화하는 방법을 알아보도록 하겠습니다.
지난 글 : 2022.08.29 - [Language/Python] - matplotlib을 활용한 시각화 기초
seaborn 라이브러리
import seaborn as sns
seaborn은 matplotlib를 좀 더 쉽게 사용할 수 있도록 도와주는 라이브러리입니다. 라이브러리를 정의하는 방법은 위와 같습니다.
seaborn 라이브러리를 활용하면 matplotlib를 활용하는 것보다 좀 더 짧은 코드로 아름다운 그래프를 그릴 수 있습니다.
seaborn 라이브러리를 활용하여 그래프를 그릴 때 반드시 matplotlib를 이해하고 있어야 좀 더 쉽게 seaborn을 익힐 수 있습니다. 그리고 seaborn을 활용하면서도 약간의 matplotlib 라이브러리를 사용해야 하는 경우가 있습니다. 예를 들어 figure의 size를 변경해야 하는 경우에는 matplotlib의 figure를 사용해서 사이즈를 변경해주어야 합니다. matplotlib에서는 axes에서 그래프를 그려주었습니다. 하지만 seaborn에서는 axes관점에서도 그래프를 그릴 수 있지만 figure관점으로도 그래프를 그릴 수 있는 함수를 제공합니다. (즉 하나의 함수에서 그래프도 그리고 figure의 사이즈도 건드릴 수 있습니다.)
figure의 관점에서 그래프를 그리는 방법은 다소 생소한 라이브러리 사용 방법들을 따로 익혀야 합니다. 하지만 axes는 지난 시간에 알아본 matplotlib의 방법을 이해하였다면 그리 어려운 내용이 아닐 것입니다. 따라서 이번 시간에는 axes관점에서 그래프를 그리는 방법을 알아보도록 하겠습니다.
시각화를 위한 데이터
시각화를 위한 데이터를 먼저 가져오겠습니다. 이번 시간에 시각화를 공부하기 위해서 타이타닉 생존 예측과 관련된 데이터를 사용하겠습니다.
https://www.kaggle.com/competitions/titanic/data
데이터와 관련된 정보는 위 링크를 참조해주시기 바랍니다.
import pandas as pd
df = pd.read_csv('./titanic_train.csv')
데이터를 가져오는 방법은 다음과 같습니다. pandas에 dataframe형태로 데이터를 가져오고 시각화하겠습니다.
Histogram
히스토그램은 도수 분포라고 부릅니다. 보통 연속 값에 대한 구간별 도수 분포를 의미합니다.
sns.histplot(df['Age'], kde = True)
histplot()을 활용하면 histogram을 생성할 수 있습니다. kde를 True로 설정하면 위 그래프처럼 선으로 동향이 함께 그려집니다.
histplot()은 다른 방법으로도 활용할 수 있습니다.
plt.figure(figsize=(12,6))
sns.histplot(data= df, x='Age', kde=True, bins=30)
위 코드처럼 그려질 x값과 dataframe을 입력하여 그래프를 그릴 수 있습니다. 그리고 bins를 추가하였는데 이는 막대의 개수를 의미합니다. 여기서 figure의 size를 조절하기 위해서 matplotlib를 활용하였습니다.
countplot
seaborn의 countplot은 특정 값의 개수를 보여주는 그래프를 그려줍니다.
x값으로 카테고리형 변수를 넣어주면 y는 카테고리별로 데이터의 개수로 그래프가 그려집니다.
주로 카테고리별 데이터 개수를 확인하기 위해 countplot을 사용합니다.
sns.countplot(df['Pclass'])
sns.countplot(x = 'Pclass', data= df)
Pclass는 선실의 클래스를 의미합니다. 각 클래스별 사람들의 수를 보여줍니다. seaborn으로 그래프를 그리는 방법은 위처럼 2가지 방법이 있으며 결과는 모두 동일합니다. (저는 보통 아래의 방법으로 그래프를 그리는 것을 좀 더 선호합니다. 그려지는 x클래스가 무엇인지 명시해주는 느낌이 있기 때문입니다.)
barplot
barplot은 2개의 feature의 관계를 나타내기 위해 그려줍니다.
x축에는 카테고리 변수 y축에는 연속형의 변수가 옵니다. default로 카테고리 변수 별 연속형 변수의 평균값을 보여주게 됩니다.
sns.barplot(x='Pclass',y='Age',data=df)
Age는 나이에 대한 값들을 의미합니다. 따라서 위 그래프는 각 클래스별로 평균 연령대를 보여주게 됩니다.
barplot을 그릴 때 주의해야 할 점이 있습니다. barplot의 y축 값에는 반드시 숫자형 변수가 와야 한다는 것입니다.
만약 숫자형 변수가 아닌 변수가 오는 경우 seaborn에서 그래프를 변경해서 그려줍니다.
sns.barplot(x='Pclass',y='Sex',data=df)
y축에 성별(문자)을 입력하였더니 의도하지 않았던 누워있는 barplot의 결과가 나오는 것을 알 수 있습니다.
barplot을 활용하여 카테고리 변수별 연속형 변수의 평균값 말고 다른 값을 가져오는 방법을 알아보겠습니다.
sns.barplot(x='Pclass',y='Survived',data=df, estimator=sum, ci=80)
estimator를 변경해주면 연속형 변수의 다른 값으로 측정할 수 있습니다. sum을 입력하면 연속형 변수들의 합을 가져오게 됩니다. 이때 survived는 생존하였는지에 대한 이산형 데이터이며 1일 경우 생존 0일 경우 생존하지 못한 것이므로 각 카테고리별 총합은 생존한 사람의 수를 보여주게 됩니다.
추가로 ci라는 값을 주었는데 이는 각 바의 위쪽 중간에 보면 선을 볼 수 있는데 그 선을 그릴 때 어느 정도의 신뢰구간으로 그려줄지에 대한 정보입니다. 그 선이 의미하는 것은 우리가 구하고자 하는 값이 대략 선이 나타내는 범위 정도의 구간에 있다는 것을 의미합니다. 즉 ci는 신뢰구간을 정해주게 되는 것입니다.
barplot에서 hue를 활용하면 3개의 feature의 특성을 볼 수 있습니다.
sns.barplot(data= df, x= 'Pclass', y = 'Survived', hue='Sex')
hue로 feature를 주면 위 그래프처럼 Pclass의 카테고리별 성별을 나누어 Survived를 그려주게 됩니다.
그래프를 잠깐 해석해보면 y축에 생존에 대한 정보를 넣어주었으며 이를 평균한 값을 나타내 주었습니다.
이는 '생존한 사람 / (생존한 사람 + 생 존 하지 못 한 사람)'의 정보이므로 생존율을 나타내게 됩니다. 각 클래스별 성별에 따른 생존율을 보여주게 되며 1번 클래스의 생존율이 가장 높으며, 여성의 생존율이 남성의 생존율보다 높다는 것을 알 수 있습니다.
마지막으로 barplot을 옆으로 눕혀 그릴 수 있는 방법을 알아보겠습니다.
sns.barplot(data= df, x= 'Survived', y = 'Pclass', hue='Sex', orient='h')
orient에 h값을 주면 누워있는 barplot을 그릴 수 있습니다. 이때 주의해야 할 점은 y축에 카테고리형 변수를 입력해주어야 한다는 것입니다. 즉 우리가 사용해왔던 x와 y를 변경해주어야 합니다. hue를 적용하면 y에 적용되는 것을 알 수 있습니다.
violin plot
violin plot은 바이올린과 비슷하게 생긴 그래프입니다. 주로 카테고리 변수에 대한 연속형 변수의 분포를 확인하고자 할 때 사용합니다.
sns.violinplot(y ='Age', data=df)
violin plot은 y축에 연속형 변수를 넣어주어 그려줍니다. 그래프의 가운데를 보면 boxplot이 있음을 알 수 있습니다. boxplot은 4분 위수를 보여주는 그래프로 아래 선은 0~25%, 박스의 시작 지점부터 점까지는 25~50%, 박스의 점에서부터 위쪽 박스 끝까지 50~75%, 그리고 위쪽 선이 75~100%의 분포를 의미합니다.
violin plot을 활용하여 카테고리 변수에 대한 연속형 변수의 분포를 알아보도록 하겠습니다.
sns.violinplot(x='Pclass',y='Age',data=df)
x에 카테고리 변수를 넣어주면 각 카테고리의 값 별로 바이올린 플롯이 그려집니다. 직관적으로 1번 클래스에 탑승한 승객들이 2번과 3번보다 평균 연령이 높다는 것을 인지할 수 있습니다.
boxplot
위에 바이올린 플롯에서 잠시 언급했던 boxplot을 그리는 방법을 알아보겠습니다.
boxplot은 4 분위를 박스 형태로 표시해주는 그래프입니다. 바이올린 플롯과 비슷한 용도로 사용되며 x에는 카테고리 변수, y에는 연속 값으로 그려집니다.
sns.boxplot(x='Pclass', y = 'Age', data=df)
각 그래프 별로 0~25%, 25~50%, 50~75%, 75~100%의 범위로 그래프를 보여주게 됩니다. 이때 해당 박스 이외에 표시되어 있는 값들을 확인할 수 있습니다. 이는 outlier라고 부르며 평균에서 벗어나는 값들을 의미합니다.
scatter plot
scatterplot() 함수를 활용하면 산포도를 그릴 수 있습니다. 산포도는 x와 y에 연속 값을 입력해주어 해당 값들의 관계를 확인할 수 있습니다. scatter plot을 그리면 outlier를 쉽게 확인할 수 있습니다.
sns.scatterplot(x= 'Age', y = 'Fare', data = df)
scatter plot을 그렸을 때 가장 큰 장점은 쉽게 outlier를 확인할 수 있다는 것입니다. 여기에서도 나이가 35~40 사이에 500 이상의 fare라는 outlier를 바로 확인할 수 있습니다.
scatterplot도 hue를 적용할 수 있습니다. hue에 카테고리 변수를 지정해주면 됩니다. 그러면 지정된 카테고리 변수에 따른 값을 보여주게 됩니다.
sns.scatterplot(x='Age', y='Fare', data=df, hue='Pclass')
각 클래스 별로 fare와 age의 값을 그려주는 것을 볼 수 있습니다. 우리가 위에서 확인했었던 outlier는 Pclass가 1인 값임을 알 수 있습니다. scatterplot에서는 특별하게 'style'이라는 값을 받을 수 있습니다. 결과는 hue와 동일하지만 변수를 하나 더 쪼개서 확인하고 싶다면 style에 추가해서 확인할 수 있습니다. (궁금하신 분은 직접 style로 이산형 데이터를 넣어 그래프를 그려보시길 바랍니다.)
HeatMap
히트맵은 연속형인 값들의 상관관계를 나타내 줄 때 주로 사용합니다. 상관관계란 피어슨 상관계수에 대한 정보를 의미합니다.
간단하게 설명하면 feature들은 각각이 상관관계를 가지고 있으며, 양의 상관관계와 음의 상관관계를 가집니다. 피어슨 상관계수는 그러한 상관관계를 표시해주며 -1 ~ 1 사이의 값을 갖습니다. 절댓값이 클수록 큰 상관관계를 갖고 있는 것이며 1에 가까울수록 양의 상관관계를 -1에 가까울수록 음의 상관관계를 갖습니다. 양의 상관관계는 특정값이 커질 때 함께 커지는 관계를 의미합니다. 구름과 비의 관계를 양의 상관관계라고 할 수 있습니다.(구름이 많으면 비가 많이 올 수 있다.)
df.corr()
pandas의 dataframe에서 상관계수를 가져오는 방법은 다음과 같습니다. 각 행과 열의 시작지점에는 feature의 이름이 있습니다. 각 행과 열이 만나는 지점의 값이 해당 feature의 상관계수의 값을 의미하게 됩니다. 예를 들어 2행(Survived) 3열(Pclass)에 해당하는 값 -0.338481은 Pclass와 Survived의 상관계수를 의미합니다. 음의 상관관계를 갖고 있는 것을 알 수 있습니다.
sns.heatmap(corr, annot=True, fmt= '.3f', linewidths=0.5)
seaborn의 heatmap()을 활용하여 그릴 수 있습니다. 위에서 받은 df.corr()을 입력해주면 상관계수에 대한 heatmap을 그려줍니다. 이때 annot은 박스에 상관계수의 값을 넣어주도록 하는 것입니다. fmt는 상관계수를 어느 포맷에 맞추어 그려줄지를 정해줍니다. 마지막으로 linewidths는 각 상관계수 박스의 line을 그려주는 역할을 합니다.
이렇게 보면 굉장히 깔끔하게 그래프가 나온다고 생각할 수 있습니다. 하지만 이는 annot, fmt, linewidths를 넣어주었기 때문에 깔끔하게 나온 것이라고 할 수 있습니다. 만약 annot, fmt, linewidths를 없이 default로 그래프를 그리면 다음과 같이 hearmap이 나오게 됩니다.
색감으로만 이해해야 하기 때문에 굉장히 어렵고 가독성도 조금 떨어지는 것을 알 수 있습니다. 따라서 반드시 최소한 annot은 True로 설정하여 그래프를 좀 더 가독성 좋게 그려주시는 것을 추천합니다.
subplot 여러 개의 그래프 그리기
matplotlib을 활용하여 여러 개의 그래프를 하나의 figure에 그리기 위해 subplot을 활용하였습니다. seaborn에서도 동일하게 matplotlib의 subplot을 활용하여 여러개의 그래프를 하나의 figurep 그려주게 됩니다.
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(8,4))
sns.violinplot(x='Pclass', y = 'Age', data= df, ax = axes[1])
위 코드를 보면 subplots를 axes에 받아주었습니다. 이는 3개의 그림을 그릴 수 있는 ax가 생성됩니다. seaborn 라이브러리의 그래프를 그려주는 코드에서 ax에 원하는 위치의 axes정보를 넣어주기만 하면 특정 위치에 그래프를 그려주게 됩니다.
위 코드에서는 1행 3열의 axes가 생성되고 그중 2열에 바이올린 플롯을 그려주는 것임을 알 수 있습니다.
seaborn을 활용하여 그래프를 그려주면 matplotlib을 활용할 때 보다 굉장히 짧게 그래프를 그려줄 수 있습니다. 하지만 위와 같은 코드에서도 알 수 있듯 seaborn을 유용하게 사용하기 위해서는 matplotlib을 어느 정도는 이해해야 한다는 것을 알 수 있습니다.
포스팅을 마치며
지난 시간에 이어 이번 시간에는 seaborn으로 데이터를 시각화하는 방법에 대하여 알아보았습니다. 제가 소개해드린 방법 이외에도 굉장히 다양한 방법이 있습니다. 만약 다른 여러 가지 방법을 좀 더 공부해보고 싶으신 분들은 seaborn 공식 문서를 참고하여 공부해주시면 감사하겠습니다.
References
- https://dining-developer.tistory.com/30
'Language > Python' 카테고리의 다른 글
matplotlib을 활용한 시각화 기초 (0) | 2022.08.29 |
---|---|
파이썬스러운 코드 개발(PEP-8) (0) | 2022.05.28 |