
ํต๊ณ๋?
- ์ด๋ค ์ํฉ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ซ์๋ก ์ ๋ฆฌํ๋ ๊ฒ
- ๊ธฐ์ ํต๊ณ(descriptive statisics)์ ์ถ๋ก ํต๊ณ(Inferential statistics)๋ก ๋๋จ
โ๏ธ ๊ธฐ์ ํต๊ณ : ์ฃผ์ด์ง ๋ฐ์ดํฐ์ ์ ์ ์์ฝํ๊ณ ํต์ฌ์ ์ธ ํน์ง์ ํ์ ํ๋ ๋ถ์ผ
โ๏ธ ์ถ๋ก ํต๊ณ : ํ๋ณธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ์ง๋จ์ด ์ด๋จ ๊ฒ์ธ๊ฐ์ ๋ํ ์ถ๋ก ์ ํ๋ ๋ถ์ผ
- seaborn ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ฉด matplotlib ๋ณด๋ค ๊ทผ์ฌํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆด ์ ์๊ฒ ๋จ
๋ฐ์ค ํ๋กฏ๊ณผ ์ด์์
1. IQR๊ณผ ์ด์์ ์ ๊ฐ๋

- Interquartile Range(IQR) : ๋ฐ์ค์ ๊ฐ์ฅ ์๋ ๋ถ๋ถ์ 25%์ธ 1์ฌ๋ถ์์์ด๊ณ ์ ๋ถ๋ถ์ 75%์ธ 3์ฌ๋ถ์์๋ก, ๋ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธ
- ์ด์์ (Outlier) : ์ ๋ ํ๋ ๊ฐ๋ค
- ์ด์์ ์ ์ ์ : Q1 - 1.5 * IQR ~ Q3 + 1.5 * IQR
2. Jupyter ์ค์ต
[ ์ฝ๋ ]
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/test_school.csv')
df
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
df['english_score']
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
df['english_score'].describe()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
df['english_score'].plot(kind='box')
plt.show()

[ ์ฝ๋(์ด์ด์) ]
# 1์ฌ๋ถ์์
q1 = df['english_score'].quantile(0.25)
# 3์ฌ๋ถ์์
q3 = df['english_score'].quantile(0.75)
# Interquartile Range
iqr = q3 - q1
q1 - 1.5 * iqr
q3 + 1.5 * iqr
[ ์ถ๋ ฅ๋ฌผ ]
38.75
88.75
[ ์ฝ๋(์ด์ด์) ]
df.plot(kind='box')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# ๋ง์ฝ ์ํ๊ณผ ๊ณผํ์ ๋ฐ์ดํฐ๋ง ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ
df[['math_score', 'science_score']].plot(kind='box')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

ํ์คํ ๊ทธ๋จ
1. ๋ฐ์ดํฐ์ ๋ฒ์ฃผ
(1) ์์นํ ๋ฐ์ดํฐ
- ์ด์ฐํ ๋ฐ์ดํฐ
- ์ฐ์ํ ๋ฐ์ดํฐ -> ํ์คํ ๊ทธ๋จ ์ฌ์ฉ
(2) ๋ฒ์ฃผํ ๋ฐ์ดํฐ
- ๋ช ๋ชฉํ ๋ฐ์ดํฐ
- ์์ํ ๋ฐ์ดํฐ
[ ์ฝ๋ ]
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/body.csv')
df
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
df['height']
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# ๋ฐ๋ก ์ค์ ์ ํ์ง ์์ผ๋ฉด pandas๋ ์๋์ผ๋ก ๊ตฌ๊ฐ์ 10๊ฐ๋ก ๋๋ ์ค
# ์ํ๋ ๊ตฌ๊ฐ์ ๊ฐ์๊ฐ ์์ผ๋ฉด bins๋ฅผ ์ด์ฉ
df['height'].plot(kind='hist', bins=7)
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

ํ๋ฅ ๋ฐ๋ ํจ์์ KDE plot
1. ํ๋ฅ ๋ฐ๋ ํจ์
- ํ์คํ ๊ทธ๋จ์ด ๋๋ต์ ์ธ ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ์ฝ๊ฒ ํ์ ํ๋ ๋ฐ์๋ ์ฅ์ ์ด ์์ง๋ง ์ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ํ ์ผํ๊ฒ ์ถ์ ๋์๋ ์ฐ์ํ ๋ฐ์ดํฐ๋ฅผ ์ข ๋ ์ธ๋ฐํ๊ฒ ํํํ ์ ์๋ ํ๋ฅ ๋ฐ๋ํจ์๊ฐ ํ์
- ํ๋ฅ ๋ฐ๋ํจ์๋ ๊ฐ ๊ตฌ๊ฐ์ด ์ ์ฒด์์ ์ฐจ์งํ๋ ๋น์ค์ ์๋ฏธ
2. KDE plot(Kernel Density Estimation Plot)
- ์ฃผ์ด์ง ์ ๋ณด๋ง ๊ฐ์ง๊ณ ์ ์ฒด ๋ฐ์ดํฐ ๋ถํฌ, ์ฆ PDF์ ๋ํ ์ถ์ ์ ํด์ ํ๋์ ๋ถ๋๋ฌ์ด ๊ณก์ ๋ชจ์์ ๋ง๋ค ์ ์์
[ ์ฝ๋ ]
import pandas as pd
import matplotlib.pyplot as plt
# ํ๋ผ๋ฏธํฐ๋ก bw_method๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ง๋ ์ธ๋ถ์ ์ผ๋ก ํํํ ์ ํ ์ ์์ / ์ซ์๊ฐ ํด ์๋ก ๋จ์ํ
df['height'].plot(kind='kde', bw_method=0.1)
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

๋ฐ์ดํฐ ๋ถํฌ์ ๋ชจ์

- Right-skewed = Positively-skewed / Left-skewed = Negatively-skewed
- ์๋์ ์ ๋๊ฐ์ด ํด์๋ก ๋ฐ์ดํฐ๊ฐ ๋ ๋ง์ด ์๋ค์ด์ง

๋ถ์ฐ๊ณผ ํ์คํธ์ฐจ
- ๋ถ์ฐ(Variance)
- ํ์คํธ์ฐจ(Standard Deviation)

seaborn
- seaborn์ ํต๊ณ ์ ๋ณด ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๊ฐ๊ฒฐํ ์ฝ๋๋ก ๊ทธ๋ํ ์์ฑ์ด ๊ฐ๋ฅ
- ๊ฐํธํ๊ฒ ๊ทผ์ฌํ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ณ ์ถ์ผ๋ฉด seaborn, ์ํ๋ ๋๋ก ์ปค์คํ ํ๊ฒ ๊ทธ๋ํ๋ฅผ ์์ฑํ๊ณ ์ถ์ผ๋ฉด matplotlib
1. seaborn ์ค์นํ๊ธฐ
!conda install --yes seaborn

2. seaborn์ผ๋ก ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
[ ์ฝ๋ ]
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('data/bike.csv')
df
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# ๊ทธ๋ํ์ ํ
๋ง๋ฅผ ์ค์
# rc={'figure.figsize': (8, 4)} : ๊ทธ๋ํ์ ํฌ๊ธฐ ์ค์
# style='white' : ๋ฐฐ๊ฒฝ์ ์ค์
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.barplot(data=df, x='month', y='total', errorbar=None)
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# ๋ง๋๋ฅผ ์๋ณ๋ก ๋ณด๋ ๋ฐฉ๋ฒ(0: ์์
์ผ์ด ์๋ ๋ / 1: ์์
์ผ์ธ ๋ )
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.barplot(data=df, x='month', y='total', errorbar=None, hue='workingday')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# registered๋ ์ ๊ธฐ๊ถ์ ๊ฒฐ์ ํ ์ฌ๋๋ค๋ก, ์์
์ผ์ ์ด์ฉํ๋ ์ฌ๋๋ค์ด ๋ง๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.barplot(data=df, x='month', y='registered', errorbar=None, hue='workingday')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋ ]
# ์ ๊ธฐ๊ถ ์์ด ์์ ๊ฑฐ๋ฅผ ๋น๋ฆฌ๋ ์ฌ๋์ ํด์ผ์ ๋์ฌํ๋ค๋ ์ฌ์ค์ ์ ์ ์์
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.barplot(data=df, x='month', y='casual', errorbar=None, hue='workingday')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

[ ์ฝ๋(์ด์ด์) ]
# ์ ๊ทธ๋ํ
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.lineplot(data=df, x='month', y='total', errorbar=None, hue='workingday')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

3. set_theme() ํจ์๋ก ๊ทธ๋ํ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ
(1) font ํ๋ผ๋ฏธํฐ๋ก ํฐํธ ์ค์ ํ๊ธฐ
# Windows
set_theme(style='white', font='Malgun Gothic')
# Mac
set_theme(style='white', font='AppleGothic')
- ๊ธฐ๋ณธ ํฐํธ์๋ ํ๊ธ์ ํํํ ์ ์๋ ๊ธ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๊ธ ํฐํธ๋ฅผ ์ค์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธ์๊ฐ ๊นจ์ ธ์ ๋์ด
- font_scale๋ก ํฐํธ์ ํฌ๊ธฐ๋ ๋ฐ๊ฟ ์ ์์(๊ธฐ๋ณธ๊ฐ : 1)
(2) ํ๋ ํธ ์ค์
# ํ๋ ํธ์ ์ข
๋ฅ์๋ pastel, muted, bright, dark, colorblind ๋ฑ์ด ์์
sns.set_theme(palette='pastel')
4. ๋ฐ์ดํฐ ๋ถํฌ ์๊ฐํ
(1) stripplot
[ ์ฝ๋(์ด์ด์) ]
sns.stripplot(data=df, x='month', y='total')
[ ์ถ๋ ฅ๋ฌผ ]

- ์๋ณ๋ก ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ๋ถํฌ๋์ด ์๋์ง ๊ฒฝํฅ์ฑ์ ํ์ ํ ์ ์์
- ์์ ์ผ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํด์ ๋ณด๊ธฐ ์ํด์๋ hue ํ๋ผ๋ฏธํฐ ์ฌ์ฉ

(2) swarmplot
[ ์ฝ๋(์ด์ด์) ]
sns.swarmplot(data=df, x='month', y='total', hue='workingday')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

(3) boxplot
[ ์ฝ๋(์ด์ด์) ]
# order์ด๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก x์ถ์ ์์๋ฅผ ์ ํ ์ ์์
sns.boxplot(data=df, x='day_of_week', y='registered', order={'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'})
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

(4) violinplot
[ ์ฝ๋(์ด์ด์) ]
sns.boxplot(data=df, x='day_of_week', y='registered', order={'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'})
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

- ํฐ ์ ์ด ์ค๊ฐ ๊ฐ, ๊ตต์ ์ ์ด IQR(์ ๋์ 1์ฌ๋ถ์์์ 3์ฌ๋ถ์์)
- KDE plot์ ์ ์์ผ๋ก ๋ถ์ฌ๋์ ๋ฏํ ๋ชจ์์
(5) ํ์คํ ๊ทธ๋จ
[ ์ฝ๋(์ด์ด์) ]
sns.histplot(data=df, x='registered')
[ ์ถ๋ ฅ๋ฌผ ]

- ํ์คํ ๊ทธ๋จ์ ํ ๊ฐ์ง ๊ฐ์ ๋ํด ๋ถํฌ๋ฅผ ์ดํด๋ณด๋ ๊ฒ
- x๊ฐ ์๋ y = 'registered'๋ก ์ ๋ ฅํ๋ฉด ๊ฐ๋ก๋ก ๋์ค๊ฒ ๋จ
- ํ์คํ ๊ทธ๋จ์์๋ hue ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์


(6) KDE plot
[ ์ฝ๋(์ด์ด์) ]
sns.kdeplot(data=df, x='registered')
[ ์ถ๋ ฅ๋ฌผ ]

5. ์๊ด๊ด๊ณ ์๊ฐํ
(1) ์๊ด๊ณ์(correlation coefficient)
- ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๊ฒ์ด ํผ์ด์จ ์๊ด๊ณ์(Pearson Correlation Coefficient)
- -1๋ถํฐ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง
โ๏ธ ์๊ด๊ณ์ = 0 : ๋ ๊ฐ ์ฌ์ด์ ์๊ด ๊ด๊ณ๊ฐ ์๋ค
โ๏ธ ์๊ด๊ณ์ > 0 : ์ด๋ค ๊ฐ์ด ์ปค์ง ๋ ๋ค๋ฅธ ๊ฐ๋ ํจ๊ป ์ปค์ง (์์ ์๊ด๊ด๊ณ)
โ๏ธ ์๊ด๊ณ์ > 0 : ์ด๋ค ๊ฐ์ด ์ปค์ง ๋ ๋ค๋ฅธ ๊ฐ์ ์์์ง (์์ ์๊ด๊ด๊ณ)
- ์๊ด๊ด๊ณ์ ๊ฐ๋ : ์๊ด๊ณ์๊ฐ ์ผ๋ง๋ ํฌ๊ฑฐ๋ ์์ ๊ฐ์ธ์ง? -> ๊ฐ์ด 0์ ๊ฐ๊น์์ง์๋ก ์ฐ๊ด์ฑ์ด ๋จ์ด์ง๊ณ 1, -1์ ๊ฐ๊น์ธ ์๋ก ๊ฐํด์ง
(2) scatterplot
[ ์ฝ๋ ]
sns.set_theme(rc={'figure.figsize': (6,6)}, style='white')
sns.scatterplot(data=df, x='temperature', y='total')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

(3) regplot
[ ์ฝ๋(์ด์ด์) ]
sns.regplot(data=df, x='temperature', y='total')
plt.show()
[ ์ถ๋ ฅ๋ฌผ ]

- ํ๊ท์ (regression line) : ๋ ์ ์ ์๊ด๊ด๊ณ๋ฅผ ํ๋์ ์ ์ผ๋ก ํํ
(4) corr : ๊ฐ ์ปฌ๋ผ๋ค ์ฌ์ด์ ์ด๋ค ๊ด๊ณ๊ฐ ์๋์ง, ์ฆ ์นผ๋ผ๋ค ๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ

- ๋ณด๋ค ๋ ์๊ฐ์ ์ผ๋ก ํํํ๋ ๋ฒ : heatmap

- annot=True ํ๋ผ๋ฏธํฐ๋ก ์๊ด๊ณ์๋ฅผ ํ๊ธฐํ ์๋ ์์
