Seaborn 개요
- Seaborn의 많은 시각화 함수들은 판다스 DataFrame과 잘 통합되어 있다. 이들 시각화 함수들은 X축과 Y축 각각에 DataFrame을 컬럼명을 입력받아서 처리할 수 있도록 설계되어 있다. 이를 위해 대부분의 시각화 함수들은 data, x, y를 각각 인자로 가지는데, data 인자는 시각화 대상 DataFrame 객체, x 인자는 X축에 사용될 컬럼명, y 인자는 Y축에 사용될 컬럼명을 입력받는다.
- Seaborn은 Axes level, Figure level 함수로 나뉘어져 있다.
- Axes level은 matplotlib의 axes에 plotting을 하는거라 matplotlib 메서드로 커스터마이징 가능하다.
→ matplotlib에서 사용했던 그래프 크기를 조정하는 plt.figure(figsize=(10,6))이 가능하다.
- Figure level은 seaborn 독자적인 figure를 만들어서 거기에 plotting을 한다. 그러므로 Figure level은 facetgrid(seaborn의 figure)를 통해서 커스터마이징이 가능하다.
즉, matplotlib API 사용을 최소화하고, 기본 matplotlib에서 사용하는 기능들을 Figure level 함수의 인자 등으로 대체하게 설계되었다.
→ matplotlib에서 사용했던 그래프 크기를 조정하는 plt.figure(figsize=(10,6))이 불가능하고, 그래프를 그리는 함수 내 인자로 조정해야 한다.
※ Figure level 함수를 사용할 경우 새로운 API에 적응을 해야하기 때문에 우리는 matplotlib을 기본적으로 알고있으므로 Axes level 함수를 사용하는게 효율적이다.(하단 히스토그램 part에서 둘의 차이를 확인하고, 그 이후에 나오는 차트들은 Axes level 함수만 다룬다.)
정보의 종류에 따른 시각화 차트 유형
1) 히스토그램
연속형 값에 대한 도수 분포를 나타낸다. X축 값은 도수 분포를 원하는 연속형 값의 구간, Y축 값은 해당 구간의 도수 분포를 나타낸다.
2) 바 플롯(막대 그래프)
특정 컬럼의 범주형 값에 따른 다른 컬럼의 연속형 값(평균, 총합 등)을 막대 그래프 형태로 시각화한다.
3) 박스 플롯(상자 수염 그래프)
연속형 값의 사분위 IQR과 최대, 최소, 이상치 값을 시각화한다. 보통 단일 컬럼의 연속형 값에 적용하지만, 이 연속형 값의 사분위를 다른 컬럼의 범주형 값별로 시각화할 때 사용할 수 있다.
4) 바이올린 플롯
히스토그램의 연속 확률 분포 곡선과 박스 플롯을 바이올린 형태로 함께 시각화한다. 보통 단일 컬럼의 연속형 값에 적용하지만, 이 연속형 값의 분포를 다른 컬럼의 범주형 값별로 시각화할 때 유용하다.
5) 스캐터 플롯(산점도)
산점도로 불리며 2개의 연속형 값들을 X, Y 좌표상의 점으로 시각화하여 해당 값들이 어떻게 관계되어 있는지 나타낸다.
6) 상관 히트맵
다수의 연속형 컬럼들에 대해서 상호 간의 상관 관계를 시각화한다.
히스토그램
- 히스토그램은 막대 차트처럼 보이지만 연속형 값을 범위 또는 구간으로 그룹화해 개별 구간에 해당되는 데이터의 건수를 시각화해준다.
- Seaborn 히스토그램은 초기에는 distplot() 함수를 사용했지만 기능 개선 등의 이유로 현재는 deprecated된 상태이며, 이제 histplot() 또는 displot() 함수 사용을 권장하고 있다.
- histplot()은 Axes level 함수이며, displot()은 Figure level 함수이다.
- 히스토그램은 기본적으로 한 개의 변수만 시각화하므로 y 인자는 생략한다. bins 인자는 구간 개수를 설정할 수 있으며, kde 인자는 연속 확률분포 곡선을 나타낼지 여부를 설정할 수 있다.
histplot
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(8,4))
sns.histplot(x='Age', data=titanic_df, bins=30, kde=True)
plt.show()

displot
# Figure level 함수는 plt.figure()로 Figure의 크기를 조절 할 수 없음
# 아래에 변하지 않는 그래프
plt.figure(figsize=(8,4))
sns.displot(x='Age', data=titanic_df, bins=30, kde=True)
plt.show()

# Figure 크기를 조절하기 위한 인자로 height, aspect 사용
# height는 세로의 크기 / aspect는 가로와 세로의 배율
# width와 같은 별도의 가로 크기를 설정하는 인자는 제공되지 않고, height * aspect를 적용하여 자동으로 가로의 크기가 결정
# ex) height가 4이고 aspect가 2인 경우, 가로 크기는 4*2=8로 주어짐
sns.displot(x='Age', data=titanic_df, bins=30, kde=True, height=4, aspect=2)
plt.show()

카운트 플롯
- 범주형 값의 건수를 막대 그래프 형태로 시각화
sns.countplot(x='Pclass', data=titanic_df)
plt.show()

바 플롯(막대 그래프)
- 수직 막대 그래프로 가정하면 X축 값이 범주형 값으로 값의 종류가 너무 많지 않을 때 유용하다.
- 보통 Y축 값은 Y축에 해당하는 컬럼값의 평균이나 총합으로 표현되는 연속형 값을 가진다.
- 물론 바 플롯을 수직 막대 그래프가 아닌 수평 막대 그래프로 그리면 X축과 Y축이 바뀌게 되므로 Y축이 범주형 값, X축이 연속형 값을 가지게 설정해야 한다.
sns.barplot(x='Pclass', y='Age', data=titanic_df)
plt.show()

- barplot() 함수는 기본적으로 Y축 값의 평균 값을 나타낸다. 평균 외에도 총합, 중앙값 등을 나타낼 수도 있는데, 이는 estimator 인자값을 설정하여 변경할 수 있다. estimator='sum'으로 설정하면 평균이 아니라 총합으로 나타낼 수 있다.
# estimator='sum'을 적용하여 평균이 아니라 총합으로 표현.
sns.barplot(x='Pclass', y='Survived', data=titanic_df, errorbar=None, estimator='sum')
plt.show()

- barplot() 함수는 orient 인자를 이용해 수직 또는 수평 막대 그래프를 선택할 수 있다. orient가 v일 경우 수직(Vertical) 막대 그래프, h일 경우 수평(Horizontal) 막대 그래프를 그린다.
- hue 인자를 사용하여 시각화 정보를 추가적으로 세분화 할 수 있다.
# 아래는 Pclass가 X축값이며 hue파라미터로 Sex를 설정하여 개별 Pclass 값 별로 Sex에 따른 Age 평균 값을 구함
sns.barplot(x='Pclass', y='Age', hue='Sex', data=titanic_df)
plt.show()

박스 플롯(상자 수염 그래프)
- 박스 플롯은 분위수를 기반으로 하고 있는데, 분위수는 연속형 값에 적용해야 의미 있는 정보가 될 수 있다. 박스 플롯은 연속형 값에 대한 IQR분위와 최소/최대 그리고 이상치 정보를 시각화한다.
- boxplot() 함수의 x 또는 y 인자로 연속형 값을 입력할 수 있는데, y에 입력 시 수직 박스 플롯을, x에 입력 시 수평 박스 플롯을 나타낸다.
sns.boxplot(y='Age', data=titanic_df)
plt.show()

- 기본적으로 박스 플롯은 단일 컬럼에 대한 분위수를 기반으로 하고 있지만, 수직 박스 플롯을 기준으로 x 인자에 범주형 값을 부여하면 범주형 값에 따른 박스 플롯을 시각화 할 수 있다.
sns.boxplot(x='Pclass', y='Age', data=titanic_df)
plt.show()

- hue 인자를 사용하여 시각화 정보를 추가적으로 세분화 할 수 있다.
sns.boxplot(x='Pclass', y='Age', hue='Sex', data=titanic_df)
plt.show()

바이올린 플롯
- 히스토그램의 연속 확률 분포 곡선과 박스 플롯을 함께 시각화할 수 있다. 연속 확률 분포 곡선을 대칭적으로 그리고 가운데에 박스 플롯을 검은색 몸통과 수염으로 나타낸 모습이 흡사 바이올린과 유사하다고 해서 붙여진 명칭이다.
- 연속형 값에 적용해야 의미 있는 정보로 시각화 될 수 있다.
- boxplot() 함수와 동일하게 x 또는 y인자로 연속형 값을 입력할 수 있는데, y에 입력 시 수직 바이올린 플롯, x에 입력 시 수평 바이올린 플롯을 나타낸다.
sns.violinplot(y='Age', data=titanic_df)
plt.show()

- 히스토그램이나 박스 플롯이 별도로 존재하기 때문에 굳이 바이올린 플롯까지 활용할 필요가 없다고 생각할 수 있지만 boxplot() 함수와 유사하게 violinplot() 함수는 여러 범주형값별로 여러 개의 바이올린 플롯들을 그릴 수 있다. 이는 여러 범주형값별로 여러 개의 히스토그램 연속 확률 분포 곡선들을 그려 줄 수 있는 장점을 가지고 있다.
sns.violinplot(x='Pclass', y='Age', data=titanic_df)
plt.show()

- hue 인자를 사용하여 시각화 정보를 추가적으로 세분화 할 수 있다. 추가적으로 histplot() 함수도 hue 기능을 제공하지만 그보다는 vilolinplot() 함수가 특정 범주형값에 해당하는 연속형 값의 데이터 분포도를 훨씬 더 효과적으로 시각화해주기 때문에 데이터 분석 시 활용도가 높다.
sns.violinplot(x='Pclass', y='Age', hue='Sex', data=titanic_df)
plt.show()

sns.histplot(x='Age', data=titanic_df, bins=30, kde=True, hue='Pclass')
plt.show()

스캐터 플롯(산점도)
- X축에 해당하는 변숫값과 Y축에 해당하는 변숫값이 만나는 지점에 점을 표시하여 변수 간의 관계를 시각화한다. 즉, 좌표상에 점을 표시하여 변수 간의 관계를 나타낸다.
- 산점도에 사용되는 X축 값, Y축 값 모두 연속형값을 적용해야 의미 있는 시각화 정보를 얻을 수 있다.
- 산점도의 형태를 보고 양의 상관관계, 음의 상관관계, 무상관인지 파악이 가능하다.
sns.scatterplot(x='Age', y='Fare', data=titanic_df)
plt.show()

- hue 인자를 사용하여 시각화 정보를 추가적으로 세분화 할 수 있다.
sns.scatterplot(x='Age', y='Fare', hue='Survived', data=titanic_df)
plt.show()

- hue 외에도 한 단계 더 세분화된 추가 정보를 제공할 수 있는 style 인자가 있다.
sns.scatterplot(x='Age', y='Fare', hue='Survived', style='Sex', data=titanic_df)
plt.show()

상관 히트맵
- 다수의 컬럼들 간의 상관계수를 히트맵 형태로 나타낸 시각화 기법
- heatmap() 함수는 인자로 컬럼들 간의 상관계수를 가지는 DataFrame을 입력받아야 시각화가 가능하다. 판다스 DataFrame의 corr() 메서드를 호출하면 간단하게 상관계수를 가지는 DataFrame을 생성할 수 있다.
corr() 메서드는 연속형 컬럼들의 상관계수만 계산하여 상관계수 DataFrame으로 생성한다.
corr_df = titanic_df.corr()
corr_df

sns.heatmap(corr_df)
plt.show()

참고로 가운데 대각선 방향으로 위치한 상관계수는 모두 1인데 이는 자기 자신과의 상관계수이기 때문이다.
일반적으로 상관계수는 연속형값에서 해석되어야 한다. Survived와 Pclass는 숫자값이지만 범주형 컬럼이지만 Survived가 0일 때(즉 사망)는 Pclass가 1보다는 3인 값이 더 많고(즉 3등실 승객이 더 사망할 확률이 높음), Survived가 1일 때(즉 생존)는 Pclass가 3보다는 1인 값이 더 많기 때문에 이러한 상관계수를 가지게 되었음에 유의하자
→ Survived와 Pclass는 음의 상관관계를 가짐
- cmap 인자는 color map으로서 히트맵의 색상을 변경할 수 있게 해준다.color map의 종류는 너무 다양해서 아래 URL을 참조하자.
seaborn의 기본 컬러맵: https://seaborn.pydata.org/tutorial/color_palettes.html
matplotlib의 기본 컬러맵: https://matplotlib.org/stable/users/explain/colors/colormaps.html
- annot 인자는 상관계수값을 표시할지 여부를 설정한다. (디폴트 False)
- fmt 인자는 상관계수값의 포맷을 변환할 수 있다.(fmt='.1f' 로 설정하면 소수점 한 자리까지만 상관계수값을 표시)
- cbar 인자는 색깔 기준 막대를 표시할지 여부를 설정한다. (디폴트 True)
sns.heatmap(corr_df, annot=True, fmt='.1f', cbar=True, cmap='Blues')
plt.show()

subplots를 이용하여 seaborn의 다양한 그래프 시각화
seaborn의 시각화 함수를 subplots로 할당된 개별 Axes 객체에 적용하는 방식은 맷플롯립과 약간 다르다.
seaborn의 모든 Axes level 시각화 함수는 ax라는 인자를 가지고 있으며, 시각화 함수 호출 시 이 ax 인자에 개별 Axes 객체를 할당하면 된다.
예를 들어 fig, axs = plt.subplots(nrows=1, ncols=3)라고 한다면 sns.countplot(x=컬럼명, data=DataFrame, ax=axs[0])과 같이 ax 인자값으로 첫번째 로우 위치의 첫번째 컬럼 위치에 해당하는 Axes 객체 변수를 입력하게 되면 해당 위치의 subplot에 카운트 플롯을 시각화해준다.
cat_columns = ['Survived', 'Pclass', 'Sex']
fig, axs = plt.subplots(nrows=1, ncols=len(cat_columns), figsize=(14, 4))
for index, column in enumerate(cat_columns):
print('index:', index)
sns.countplot(x=column, data=titanic_df, ax=axs[index])
plt.show()
index: 0
index: 1
index: 2

cat_columns = ['Pclass', 'Sex', 'Embarked', 'SibSp']
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
for index, column in enumerate(cat_columns):
row_index = index // 2
col_index = index % 2
ax = axs[row_index, col_index]
sns.barplot(x=column, y='Survived', data=titanic_df, ax=ax)
plt.show()

# 위 코드와 다르게 figure가 2개
cont_columns = ['Age', 'Fare']
for column in cont_columns:
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(8,4))
sns.violinplot(x='Survived', y=column, data=titanic_df, ax=axs[0])
sns.histplot(x=column, data=titanic_df, kde=True, hue='Survived', ax=axs[1])
plt.show()


→ 시각화 할 때 인자값 설정 및 내가 원하는 시각화 옵션들을 구글링해서 참고하자
'파이썬 머신러닝 완벽가이드 > [10장] 시각화' 카테고리의 다른 글
| 시각화(1) - Matplotlib (0) | 2024.03.19 |
|---|