์๋ก์ด ๋ฐ์ดํฐ ์ธํธ๋ก ์์ ์ ์์ํ ๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ํด์๋ ์๋ฅผ ๋ค์ด ๋ณ์๊ฐ ํ์ฉํ๋ ๊ฐ์ ๋ฒ์์ ํด๋น ์ ํ์ ํ์ธํ๊ณ ๋๋ฝ๋ ๊ฐ์ ๊ฐ์๋ ์์๋ด์ผ ํฉ๋๋ค.
Pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์์ ๋ฐ์ดํฐ ๋ถ์(EDA)์ ์ํํ๋ ๋ฐ ์ ์ฉํ ๋ง์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ผ๋ฐ์ ์ผ๋ก df.describe()์ ๊ฐ์ ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ๋ถํฐ ์์ํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ ํ์ ์ด๋ฉฐ EDA๋ฅผ ์ํํ ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ์ด๊ธฐ ๋จ๊ณ๋ ์๋ก ๋งค์ฐ ์ ์ฌํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ค๋ ์ฐ๋ฆฌ๊ฐ ์ถํํ๋ ์๋ฃ์ ์ ์๋ ๋ฐ๋ณต์ ์ธ ์์
์ ์ํํ๋ ๊ฒ์ ์ข์ํ์ง ์๋๋ค๊ณ ๋งํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ํ์์ ๋ฐ์ดํฐ ๋ถ์์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ฐพ๋ ์ค ๊ทธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ฌ๊ธฐ์๋ Titanic ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์๋ก ๋ค์ด pandas-profiling ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ํน์ง์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Pandas๋ฅผ ์ฌ์ฉํ ํ์์ ๋ฐ์ดํฐ ๋ถ์
๋๋ Titanic ๋ฐ์ดํฐ ์ธํธ์ ํฌํจ๋ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ์ ๋๋ฝ๋ ๊ฐ์ ์กด์ฌ๋ก ์ธํด Pandas ํ๋กํ์ผ๋ง์ ์คํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ ๋ฐ์ดํฐ๊ฐ ์์ง ์ ๋ฆฌ๋์ง ์์๊ณ ๋ฐ์ดํฐ์ ํน์ฑ์ ๋ฐ๋ผ ์ถ๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ pandas ํ๋กํ์ผ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํนํ ํฅ๋ฏธ๋กญ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ํํ๋ ค๋ฉด ์ด๋์๋ถํฐ ์์ํ๊ณ ๋ฌด์์ ์ฃผ์ํด์ผ ํ๋์ง ์์์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ํฌ๋ ํ๋กํ์ผ๋ง ๊ธฐ๋ฅ์ด ์ ์ฉํ ๊ณณ์ ๋๋ค.
๋จผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ํฌ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์ ํต๊ณ๋ฅผ ์ป์ต๋๋ค.
# ะธะผะฟะพัั ะฝะตะพะฑั
ะพะดะธะผัั
ะฟะฐะบะตัะพะฒ
import pandas as pd
import pandas_profiling
import numpy as np
# ะธะผะฟะพัั ะดะฐะฝะฝัั
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# ะฒััะธัะปะตะฝะธะต ะฟะพะบะฐะทะฐัะตะปะตะน ะพะฟะธัะฐัะตะปัะฝะพะน ััะฐัะธััะธะบะธ
df.describe()
์ด ์ฝ๋ ์กฐ๊ฐ์ ์คํํ๋ฉด ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
ํ์ค Pandas ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ป์ ๊ธฐ์ ํต๊ณ
์ฌ๊ธฐ์๋ ์ ์ฉํ ์ ๋ณด๊ฐ ๋ง์ด ์์ง๋ง ์ฐ๊ตฌ ์ค์ธ ๋ฐ์ดํฐ์ ๋ํด ํฅ๋ฏธ๋ก์ด ์ ๋ณด๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์์ง๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ ํ๋ ์์ ๊ตฌ์กฐ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ ์ ์์ต๋๋ค. DataFrame
, 891๊ฐ์ ๋ผ์ธ์ด ์์ต๋๋ค. ์ด๋ฅผ ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ํ๋ ์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ค๋ฉด ๋ ๋ค๋ฅธ ์ฝ๋ ์ค์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ๊ณ์ฐ์ ํน๋ณํ ๋ฆฌ์์ค ์ง์ฝ์ ์ด์ง๋ ์์ง๋ง ํญ์ ๋ฐ๋ณตํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ๋ฐ ๋ ๋์ ์๊ฐ์ ๋ญ๋นํ ์ ์์ต๋๋ค.
ํฌ๋ ํ๋กํ์ผ๋ง์ ์ฌ์ฉํ ํ์์ ๋ฐ์ดํฐ ๋ถ์
์ด์ pandas-profiling์ ์ฌ์ฉํ์ฌ ๋์ผํ ์์ ์ ์ํํด ๋ณด๊ฒ ์ต๋๋ค.
pandas_profiling.ProfileReport(df)
์์ ์ฝ๋ ์ค์ ์คํํ๋ฉด ํ์์ ๋ฐ์ดํฐ ๋ถ์ ์งํ๊ฐ ํฌํจ๋ ๋ณด๊ณ ์๊ฐ ์์ฑ๋ฉ๋๋ค. ์์ ํ์๋ ์ฝ๋๋ ๋ฐ๊ฒฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ์ง๋ง ์๋ฅผ ๋ค์ด ๋๊ตฐ๊ฐ์๊ฒ ๋ณด์ฌ์ค ์ ์๋ HTML ํ์ผ์ ์ถ๋ ฅํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ณด๊ณ ์์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์๋ ๋ฐ์ดํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด(๊ด์ฐฐ ์, ๋ณ์ ์ ๋ฑ)๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ ์น์ ์ด ํฌํจ๋ฉ๋๋ค. ๋ํ ๋ถ์๊ฐ์๊ฒ ํน๋ณํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ ์ฌํญ์ ์๋ฆฌ๋ ๊ฒฝ๊ณ ๋ชฉ๋ก๋ ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ๊ณ ๋ ๋ฐ์ดํฐ ์ ๋ฆฌ ์์ ์ ์ง์คํ ์ ์๋ ์์น์ ๋ํ ๋จ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฐ์ ๋ณด๊ณ ์ ์น์
ํ์๋ณ์ ๋ถ์
๋ณด๊ณ ์์ ๊ฐ์ ์น์ ์๋์์ ๊ฐ ๋ณ์์ ๋ํ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ฌด์๋ณด๋ค๋ ๊ฐ ๋ณ์์ ๋ถํฌ๋ฅผ ์ค๋ช ํ๋ ์์ ์ฐจํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
์ฐ๋ น ์ซ์ ๋ณ์ ์ ๋ณด
์ด์ ์์์ ๋ณผ ์ ์๋ฏ์ด pandas ํ๋กํ์ผ๋ง์ ๋๋ฝ๋ ๊ฐ์ ๋ฐฑ๋ถ์จ ๋ฐ ์๋ ๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๋ณธ ๊ธฐ์ ํต๊ณ ์ธก์ ๊ฐ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ ์ฉํ ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ํ๋ฉด Age
๋ ์์น ๋ณ์์ด๋ฏ๋ก ํ์คํ ๊ทธ๋จ ํํ๋ก ๋ถํฌ๋ฅผ ์๊ฐํํ๋ฉด ๋ถํฌ๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์ณ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋ฒ์ฃผํ ๋ณ์๋ฅผ ๊ณ ๋ คํ ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์ซ์ ๋ณ์์ ๊ฒฐ๊ณผ์ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค.
์ฑ๋ณ ๋ฒ์ฃผํ ๋ณ์ ์ ๋ณด
์ฆ, Pandas ํ๋กํ์ผ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๊ท , ์ต์, ์ต๋๋ฅผ ์ฐพ๋ ๋์ ํด๋์ค ์๋ฅผ ์ฐพ์์ต๋๋ค. ์๋ํ๋ฉด Sex
โ ์ด์ง ๋ณ์์ด๋ฉฐ ํด๋น ๊ฐ์ ๋ ๊ฐ์ ํด๋์ค๋ก ํ์๋ฉ๋๋ค.
๋์ฒ๋ผ ์ฝ๋๋ฅผ ๊ฒ์ฌํ๊ณ ์ถ๋ค๋ฉด pandas ํ๋กํ์ผ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ฌํ ์ธก์ ํญ๋ชฉ์ ์ ํํ ์ด๋ป๊ฒ ๊ณ์ฐํ๋์ง์ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๊ฐ ๊ณต๊ฐ๋์ด ์๊ณ GitHub์์ ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ด์ ๋ํด ์์๋ด๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค. ๋๋ ๋ด ํ๋ก์ ํธ์์ ๋ธ๋๋ฐ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ทธ๋ค์ง ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ซ์ ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
def describe_numeric_1d(series, **kwargs):
"""Compute summary statistics of a numerical (`TYPE_NUM`) variable (a Series).
Also create histograms (mini an full) of its distribution.
Parameters
----------
series : Series
The variable to describe.
Returns
-------
Series
The description of the variable as a Series with index being stats keys.
"""
# Format a number as a percentage. For example 0.25 will be turned to 25%.
_percentile_format = "{:.0%}"
stats = dict()
stats['type'] = base.TYPE_NUM
stats['mean'] = series.mean()
stats['std'] = series.std()
stats['variance'] = series.var()
stats['min'] = series.min()
stats['max'] = series.max()
stats['range'] = stats['max'] - stats['min']
# To avoid to compute it several times
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# The dropna() is a workaround for https://github.com/pydata/pandas/issues/13098
stats[_percentile_format.format(percentile)] = _series_no_na.quantile(percentile)
stats['iqr'] = stats['75%'] - stats['25%']
stats['kurtosis'] = series.kurt()
stats['skewness'] = series.skew()
stats['sum'] = series.sum()
stats['mad'] = series.mad()
stats['cv'] = stats['std'] / stats['mean'] if stats['mean'] else np.NaN
stats['n_zeros'] = (len(series) - np.count_nonzero(series))
stats['p_zeros'] = stats['n_zeros'] * 1.0 / len(series)
# Histograms
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name)
์ด ์ฝ๋ ์กฐ๊ฐ์ ๊ฝค ํฌ๊ณ ๋ณต์กํด ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ์ดํดํ๊ธฐ๊ฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ค ์ฝ๋์ ๋ณ์ ์ ํ์ ๊ฒฐ์ ํ๋ ํจ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ซ์ ๋ณ์๋ฅผ ๋ฐ๊ฒฌํ ๊ฒ์ผ๋ก ๋ฐํ์ง๋ฉด ์ ํจ์๋ ์ฐ๋ฆฌ๊ฐ ๋ณด๊ณ ์๋ ์ธก์ ํญ๋ชฉ์ ์ฐพ์ต๋๋ค. ์ด ํจ์๋ ์ ํ์ ๊ฐ์ฒด ์์
์ ์ํด ํ์ค ํฌ๋ ์์
์ ์ฌ์ฉํฉ๋๋ค. Series
, ์ข๋ค series.mean()
. ๊ณ์ฐ ๊ฒฐ๊ณผ๋ ์ฌ์ ์ ์ ์ฅ๋ฉ๋๋ค. stats
. ํ์คํ ๊ทธ๋จ์ ์ ์๋ ๋ฒ์ ์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. matplotlib.pyplot.hist
. ์ ์์ ํจ์๊ฐ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ ์ธํธ์์ ์๋ํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ฐ๊ตฌ๋ ์๊ด๊ด๊ณ ์งํ ๋ฐ ์ํ ๋ฐ์ดํฐ
๋ณ์ ๋ถ์ ๊ฒฐ๊ณผ ํ ์๊ด๊ด๊ณ ์น์ ์ pandas ํ๋กํ์ผ๋ง์ Pearson ๋ฐ Spearman ์๊ด๊ด๊ณ ํ๋ ฌ์ ํ์ํฉ๋๋ค.
ํผ์ด์จ ์๊ด ํ๋ ฌ
ํ์ํ ๊ฒฝ์ฐ ๋ณด๊ณ ์ ์์ฑ์ ํธ๋ฆฌ๊ฑฐํ๋ ์ฝ๋ ์ค์์ ์๊ด ๊ด๊ณ ๊ณ์ฐ์ ์ฌ์ฉ๋๋ ์๊ณ๊ฐ ํ์๊ธฐ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ถ์์ ์ค์ํ๋ค๊ณ ๊ฐ์ฃผ๋๋ ์๊ด ๊ด๊ณ์ ๊ฐ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ํ ์น์ ์ pandas ํ๋กํ์ผ๋ง ๋ณด๊ณ ์๋ ๋ฐ์ดํฐ ์ธํธ์ ์์ ๋ถ๋ถ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์๋ก ํ์ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฒ์ ๋ช ๊ฐ์ ๊ด์ฐฐ์ด ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ์ ํน์ฑ์ ๋ฐ์ํ์ง ์๋ ์ํ์ ๋ํ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ์พํ ๋๋ผ์์ ์ด๋ํ ์ ์์ต๋๋ค.
์ฐ๊ตฌ ์ค์ธ ์ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์น์
๋ฐ๋ผ์ ์ด ๋ง์ง๋ง ์น์
์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. df.sample(5)
, ๋ฐ์ดํฐ ์ธํธ์์ 5๊ฐ์ ๊ด์ธก์น๋ฅผ ๋ฌด์์๋ก ์ ํํฉ๋๋ค.
๊ฒฐ๊ณผ
์์ฝํ์๋ฉด, pandas ํ๋กํ์ผ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ถ์๊ฐ์๊ฒ ๋ฐ์ดํฐ์ ๋ํ ๋๋ต์ ์ธ ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ป๊ฑฐ๋ ์ธํ ๋ฆฌ์ ์ค ๋ถ์ ๋ณด๊ณ ์๋ฅผ ๋๊ตฐ๊ฐ์๊ฒ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ ๋ช ๊ฐ์ง ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋์์, Pandas ํ๋กํ์ผ๋ง์ ์ฌ์ฉํ์ง ์๊ณ ์๋์ผ๋ก ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ ์ค์ ์์ ์ด ์ํ๋ฉ๋๋ค.
ํ๋์ Jupyter ๋
ธํธ๋ถ์์ ๋ชจ๋ ์ธํ
๋ฆฌ์ ์ค ๋ฐ์ดํฐ ๋ถ์์ด ์ด๋ค ๋ชจ์ต์ธ์ง ์ดํด๋ณด๊ณ ์ถ๋ค๋ฉด ๋ค์์ ์ดํด๋ณด์ธ์.
๋ ์ ์ฌ๋ฌ๋ถ! ์๋ก์ด ๋ฐ์ดํฐ ์ธํธ ๋ถ์์ ์ด๋์์ ์์ํฉ๋๊น?
์ถ์ฒ : habr.com