통계 기반의 그래프¶
!pip install seaborn==0.13.0
Defaulting to user installation because normal site-packages is not writeable Collecting seaborn==0.13.0 Downloading seaborn-0.13.0-py3-none-any.whl (294 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 294.6/294.6 kB 4.8 MB/s eta 0:00:00a 0:00:01 Requirement already satisfied: pandas>=1.2 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.4.2) Requirement already satisfied: matplotlib!=3.6.1,>=3.3 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (3.6.0) Requirement already satisfied: numpy!=1.24.0,>=1.20 in ./.local/lib/python3.9/site-packages (from seaborn==0.13.0) (1.23.3) Requirement already satisfied: kiwisolver>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.4.4) Requirement already satisfied: cycler>=0.10 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (0.11.0) Requirement already satisfied: pillow>=6.2.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (9.3.0) Requirement already satisfied: fonttools>=4.22.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (4.38.0) Requirement already satisfied: python-dateutil>=2.7 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (2.8.2) Requirement already satisfied: packaging>=20.0 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (21.3) Requirement already satisfied: pyparsing>=2.2.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (3.0.9) Requirement already satisfied: contourpy>=1.0.1 in ./.local/lib/python3.9/site-packages (from matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.0.6) Requirement already satisfied: pytz>=2020.1 in ./.local/lib/python3.9/site-packages (from pandas>=1.2->seaborn==0.13.0) (2022.5) Requirement already satisfied: six>=1.5 in ./.local/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.3->seaborn==0.13.0) (1.16.0) Installing collected packages: seaborn Attempting uninstall: seaborn Found existing installation: seaborn 0.12.0 Uninstalling seaborn-0.12.0: Successfully uninstalled seaborn-0.12.0 Successfully installed seaborn-0.13.0 [notice] A new release of pip available: 22.2.2 -> 24.1.1 [notice] To update, run: pip install --upgrade pip
seaborn
라이브러리가 매력적인 이유는 바로 통계 차트 입니다.
이번 실습에서는 seaborn
의 다양한 통계 차트 중 대표적인 차트 몇 개를 뽑아서 다뤄볼 예정입니다.
더 많은 통계 차트를 경험해보고 싶으신 분은 공식 도큐먼트에서 확인하실 수 있습니다.
모듈 Import¶
from IPython.display import Image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
# Unicode warning 제거 (폰트 관련 경고메시지)
plt.rcParams['axes.unicode_minus']=False
# 스타일 설정
sns.set_style('white')
# 그래프 출력 사이즈 설정
plt.rcParams["figure.figsize"] = (12, 8)
# 엘리스 환경에서 한글 폰트를 사용하기 위한 코드입니다.
font_dirs = ['/usr/share/fonts/truetype/nanum', ]
font_files = fm.findSystemFonts(fontpaths=font_dirs)
for font_file in font_files:
fm.fontManager.addfont(font_file)
plt.rc('font', family='NanumBarunGothic')
샘플 데이터셋 로드¶
titanic = sns.load_dataset('titanic')
titanic
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 0 | 2 | male | 27.0 | 0 | 0 | 13.0000 | S | Second | man | True | NaN | Southampton | no | True |
887 | 1 | 1 | female | 19.0 | 0 | 0 | 30.0000 | S | First | woman | False | B | Southampton | yes | True |
888 | 0 | 3 | female | NaN | 1 | 2 | 23.4500 | S | Third | woman | False | NaN | Southampton | no | False |
889 | 1 | 1 | male | 26.0 | 0 | 0 | 30.0000 | C | First | man | True | C | Cherbourg | yes | True |
890 | 0 | 3 | male | 32.0 | 0 | 0 | 7.7500 | Q | Third | man | True | NaN | Queenstown | no | True |
891 rows × 15 columns
- survived: 생존여부
- pclass: 좌석등급
- sex: 성별
- age: 나이
- sibsp: 형제자매 + 배우자 숫자
- parch: 부모자식 숫자
- fare: 요금
- embarked: 탑승 항구
- class: 좌석등급 (영문)
- who: 사람 구분
- deck: 데크
- embark_town: 탑승 항구 (영문)
- alive: 생존여부 (영문)
- alone: 혼자인지 여부
tips = sns.load_dataset('tips')
tips
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
... | ... | ... | ... | ... | ... | ... | ... |
239 | 29.03 | 5.92 | Male | No | Sat | Dinner | 3 |
240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2 |
241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2 |
242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2 |
243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2 |
244 rows × 7 columns
- total_bill: 총 합계 요금표
- tip: 팁
- sex: 성별
- smoker: 흡연자 여부
- day: 요일
- time: 식사 시간
- size: 식사 인원
Countplot¶
항목별 갯수를 세어주는 countplot
입니다.
알아서 해당 column을 구성하고 있는 value들을 구분하여 보여줍니다.
세로로 그리기¶
sns.countplot(x="class", hue="who", data=titanic)
<AxesSubplot: xlabel='class', ylabel='count'>
가로로 그리기¶
sns.countplot(y="class", hue="who", data=titanic, palette='rocket')
<AxesSubplot: xlabel='count', ylabel='class'>
kdeplot¶
kde
는 histogram보다 부드러운 형태의 분포 곡선을 보여주는 방법
# 샘플데이터 생성
x = np.random.randn(100)
sns.kdeplot(x=x)
<AxesSubplot: ylabel='Density'>
rugplot¶
rugplot
의 rug
는 데이터 위치를 x축 위에 작은 선분(rug)으로 나타내어 데이터들의 위치 및 분포를 보여준다.
sns.kdeplot(x=x)
sns.rugplot(x=x)
<AxesSubplot: ylabel='Density'>
heatmap¶
색상으로 표현할 수 있는 다양한 정보를 일정한 이미지위에 열분포 형태의 비쥬얼한 그래픽으로 출력하는 것이 특징이다
correlation(상관관계)를 시각화¶
corr() 함수는 데이터의 상관관계를 보여줍니다.
titanic.corr()
survived | pclass | age | sibsp | parch | fare | adult_male | alone | |
---|---|---|---|---|---|---|---|---|
survived | 1.000000 | -0.338481 | -0.077221 | -0.035322 | 0.081629 | 0.257307 | -0.557080 | -0.203367 |
pclass | -0.338481 | 1.000000 | -0.369226 | 0.083081 | 0.018443 | -0.549500 | 0.094035 | 0.135207 |
age | -0.077221 | -0.369226 | 1.000000 | -0.308247 | -0.189119 | 0.096067 | 0.280328 | 0.198270 |
sibsp | -0.035322 | 0.083081 | -0.308247 | 1.000000 | 0.414838 | 0.159651 | -0.253586 | -0.584471 |
parch | 0.081629 | 0.018443 | -0.189119 | 0.414838 | 1.000000 | 0.216225 | -0.349943 | -0.583398 |
fare | 0.257307 | -0.549500 | 0.096067 | 0.159651 | 0.216225 | 1.000000 | -0.182024 | -0.271832 |
adult_male | -0.557080 | 0.094035 | 0.280328 | -0.253586 | -0.349943 | -0.182024 | 1.000000 | 0.404744 |
alone | -0.203367 | 0.135207 | 0.198270 | -0.584471 | -0.583398 | -0.271832 | 0.404744 | 1.000000 |
plt.figure(figsize=(10, 8))
sns.heatmap(titanic.corr(), annot=True, cmap="RdBu_r")
plt.show()
pairplot¶
pairplot은 그리드(grid) 형태로 각 집합의 조합에 대해 히스토그램과 분포도를 그립니다.
또한, 숫자형 column에 대해서만 그려줍니다.
iris = sns.load_dataset('iris')
iris.head()
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
기본 pairplot 생성¶
sns.pairplot(iris)
<seaborn.axisgrid.PairGrid at 0x7f26a2487e20>
hue 옵션으로 특성 구분¶
sns.pairplot(iris, hue='species', palette="Set1")
<seaborn.axisgrid.PairGrid at 0x7f26a2581400>
violinplot¶
바이올린처럼 생긴 violinplot 입니다.
column에 대한 데이터의 비교 분포도를 확인할 수 있습니다.
- 곡선진 부분 (뚱뚱한 부분)은 데이터의 분포를 나타냅니다.
- 양쪽 끝 뾰족한 부분은 데이터의 최소값과 최대값을 나타냅니다.
기본 violinplot 그리기¶
sns.violinplot(x=tips["total_bill"])
<AxesSubplot: xlabel='total_bill'>
비교 분포 확인¶
x, y축을 지정해줌으로썬 바이올린을 분할하여 비교 분포를 볼 수 있습니다.
sns.violinplot(x="day", y="total_bill", data=tips)
<AxesSubplot: xlabel='day', ylabel='total_bill'>
hue 옵션으로 분포 비교¶
사실 hue 옵션을 사용하지 않으면 바이올린이 대칭이기 때문에 비교 분포의 큰 의미는 없습니다.
하지만, hue 옵션을 주면, 단일 column에 대한 바이올린 모양의 비교를 할 수 있습니다.
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted")
<AxesSubplot: xlabel='day', ylabel='total_bill'>
split 옵션으로 바이올린을 합쳐서 볼 수 있습니다.¶
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted", split=True)
<AxesSubplot: xlabel='day', ylabel='total_bill'>
lmplot¶
lmplot
은 column 간의 선형관계를 확인하기에 용이한 차트입니다.
또한, outlier도 같이 짐작해 볼 수 있습니다.
기본 lmplot¶
sns.lmplot(x="total_bill", y="tip", data=tips)
<seaborn.axisgrid.FacetGrid at 0x7f269ceb4df0>
hue 옵션으로 다중 선형관계 그리기¶
아래의 그래프를 통하여 비흡연자가, 흡연자 대비 좀 더 가파른 선형관계를 가지는 것을 볼 수 있습니다.
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
<seaborn.axisgrid.FacetGrid at 0x7f269ccdddc0>
col 옵션을 추가하여 그래프를 별도로 그려볼 수 있습니다¶
또한, col_wrap
으로 한 줄에 표기할 column의 갯수를 명시할 수 있습니다.
sns.lmplot(x='total_bill', y='tip', hue='smoker', col='day', col_wrap=2, data=tips)
<seaborn.axisgrid.FacetGrid at 0x7f269cf296a0>
jointplot¶
scatter(산점도)와 histogram(분포)을 동시에 그려줍니다.
숫자형 데이터만 표현 가능하니, 이 점 유의하세요.
기본 jointplot 그리기¶
sns.jointplot(x="total_bill", y="tip", height=7, data=tips)
<seaborn.axisgrid.JointGrid at 0x7f269c6127f0>
선형관계를 표현하는 regression 라인 그리기¶
옵션에 kind='reg'을 추가해 줍니다.
sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg")
<seaborn.axisgrid.JointGrid at 0x7f269c409d30>
hex 밀도 보기¶
kind='hex' 옵션을 통해 hex 모양의 밀도를 확인할 수 있습니다.
sns.jointplot(x="total_bill", y="tip", data=tips, kind="hex")
<seaborn.axisgrid.JointGrid at 0x7f269cbe5790>
Swarm Plot¶
sns.swarmplot(x='day', y='total_bill', data=tips)
<AxesSubplot: xlabel='day', ylabel='total_bill'>
sns.boxplot(x='day', y='total_bill', data=tips)
sns.swarmplot(x='day', y='total_bill', data=tips, color='black')
<AxesSubplot: xlabel='day', ylabel='total_bill'>
Catplot¶
카테고리에 따른, row/col으로 분류하여 각각의 그래프를 시각화할 수 있습니다.
- 검은색 bar는 오차막대(error bar) 이며 신뢰구간(confidence interval) 95%
titanic.head()
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
barplot¶
sns.catplot(x='who', y='survived',
col='pclass',
row='embarked',
kind='bar',
height=3,
data=titanic)
<seaborn.axisgrid.FacetGrid at 0x7f269c2e9310>
countplot¶
sns.catplot(x='survived',
col='pclass',
row='embarked',
kind='count',
height=3,
data=titanic)
<seaborn.axisgrid.FacetGrid at 0x7f269c49af40>
sns.catplot(x='who',
y='age',
col='pclass',
row='embarked',
kind='box',
height=3,
data=titanic)
<seaborn.axisgrid.FacetGrid at 0x7f269d00f1c0>
violinplot¶
sns.catplot(x='who',
y='fare',
col='pclass',
kind='violin',
height=3,
data=titanic)
<seaborn.axisgrid.FacetGrid at 0x7f269b947b50>
제출¶
제출을 위해 violinplot의 split 옵션으로 바이올린을 합쳐서 볼 수 있습니다에서 그렸던 그래프와 똑같은 그래프를 다시 그리세요.
- tips 데이터셋 활용
- x축은
day
, y축은total_bill
- hue는
smoker
- palette는
muted
' split
옵션을 활성화
tips = sns.load_dataset('tips')
# TODO: "split 옵션으로 바이올린을 합쳐서 볼 수 있습니다"에서 그렸던 그래프를 그리세요.
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted", split=True)
# 이 아래를 수정하면 제대로 채점되지 않습니다.
plt.tight_layout()
plt.savefig('result.png')
'Biusiness Insight > Data Science' 카테고리의 다른 글
분석/학습용 공개 데이터 세트들 (Public Dataset Resources) 링크 포함 (0) | 2024.07.21 |
---|---|
[Python] Seaborn을 활용한 시각화 실습 (0) | 2024.06.30 |
[Python] Seaborn을 활용한 시각화 (0) | 2024.06.30 |
[Python] Matplotlib을 활용한 시각화 실습 (0) | 2024.06.30 |
[Python] Matplotlib을 활용한 시각화 (0) | 2024.06.30 |