[KT AIVLE 4๊ธฐ] EDA
EDA (Explorary Data Analysis)
EDA๋?
๋น ๋ฐ์ดํฐ์์ ์๋ฏธ ์๋ ํจํด์ ์ฐพ๊ณ , ์์ฌ ๊ฒฐ์ ์ ํ์ํ ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ธฐ ์ํด์ ๋ฐ์ดํฐ ๋ถ์์ด ์ํ๋๋ค.
ํน์ AI ๋ชจ๋ธ์ ๊ตฌ์ถํ๊ธฐ ์ ํ๊ฒ ํน์ฑ์ ์์ธกํ๋๋ฐ ๋์์ด ๋ ๋งํ ์ ๋ ฅ ํน์ฑ์ ๊ณ ๋ฅด๊ธฐ ์ํด์ ๋ฐ์ดํฐ ๋ถ์์ ์ํํด์ผ ํ๋ค.
๋ฐ์ดํฐ ๋ถ์์ ํฌ๊ฒ ๋ ๊ฐ์ง์ ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์๋ค. (1) EDA์ (2) CDA(confirmatory Data Analysis) ์ด๋ค.
CDA๊ฐ ์ถ๋ก ํต๊ณ๋ผ๋ฉด, EDA๋ ๊ธฐ์ ํต๊ณ์ ํด๋นํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฐ์ดํฐ ๋ถ์ | ํ๋ก์ธ์ค | ํต๊ณ ๊ธฐ๋ฒ |
---|---|---|
EDA | ๋ฐ์ดํฐ ์์ง > ์๊ฐํ ํ์ > ํจํด ๋์ถ > ์ธ์ฌ์ดํธ ๋ฐ๊ฒฌ | ๊ธฐ์ ํต๊ณ (๋ชจ์ง๋จ์ ํน์ฑ์ ์์ฝ) |
CDA | ๊ฐ์ค ์ค์ > ๋ฐ์ดํฐ ์์ง > ํต๊ณ ๋ถ์ > ๊ฐ์ค ๊ฒ์ฆ | ์ถ๋ก ํต๊ณ (ํ๋ณธ์ง๋จ์ ํตํด ๋ชจ์ง๋จ์ ํน์ฑ์ ์ถ๋ก ) |
EDA๋ฅผ ํตํด ์ป์ ์ธ์ฌ์ดํธ๋ CDA์ ๊ฐ์ค๋ก ์ค์ ๋ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๊ฒ์ฆํ๋ ์ฒ๋๋ p.value(์ ์ ํ๋ฅ )์ด๋ค.
EDA ๊ณผ์
-
๋ฐ์ดํฐ ์ดํด ๋ฐ ์ ์ฒ๋ฆฌ (๊ฒฐ์ธก์น, ์ด์์น ํ์ธ)
-
๋จ๋ณ๋ ๋ถ์ (๊ธฐ์ดํต๊ณ๋ ๋ฐ ๋ถํฌ ํ์ธ)
-
์ด๋ณ๋ ๋ถ์ (์๊ด๊ด๊ณ ํ์ธ)
1. ๋ฐ์ดํฐ ์ดํด ๋ฐ ์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ๊ฐ ๋ง๋ค๋ฉฐ, ์๋ถ๋ถ ํน์ ๋ท๋ถ๋ถ๋ง ๋ณด๋ฉด ์ ๋๋ฏ๋ก, ๋ฌด์์๋ก ํ๋ณธ์ ์ถ์ถํด์ ๊ด์ฐฐํด๋ด์ผ ํ๋ค.
๋จ๋ณ๋ ๋ถ์๊ณผ ํจ๊ป ๋ฐ์ดํฐ๋ฅผ ์ดํดํ ์ ์๋๋ฐ,
-
๋ฐ์ดํฐ์ ์ค์ฌ์ ์๊ธฐ ์ํด : ํ๊ท , ์ค์๊ฐ, ์ต๋น๊ฐ
-
๋ฐ์ดํฐ์ ๋ถ์ฐ๋๋ฅผ ์๊ธฐ ์ํด : ๋ฒ์, ๋ถ์ฐ
-
๋ฐ์ดํฐ์ ๋ถํฌ๋๋ฅผ ์๊ธฐ ์ํด : ์๋(skew), ์ฒจ๋(kurosis) ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
(์ฐธ๊ณ ๋ก, ํ๊ท ์ ์ด์์น๊ฐ์ ์ํฅ์ ๋ง์ด ๋ฐ์ผ๋ฉฐ ์ค์๊ฐ์ ์ด์์น์ ์กด์ฌ์๋ ๋ํ์ฑ์ด ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.)
2. ๋จ๋ณ๋ ๋ถ์
๊ธฐ์ดํต๊ณ๋์ ํ์ ๊ทธ๋ํ๋ก ์๊ฐํํ๋ค.
์ซ์ํ ๋ณ์
๊ธฐ์ดํต๊ณ๋์ describe( ) ๋ฅผ ํตํด ๊ตฌํ๋ค.
def eda_1_num(data, var, bins = 30):
# ๊ธฐ์ดํต๊ณ๋
print('<< ๊ธฐ์ดํต๊ณ๋ >>')
display(data[[var]].describe().T)
print('=' * 100)
# ์๊ฐํ
print('<< ๊ทธ๋ํ >>')
plt.figure(figsize = (10,6))
plt.subplot(2,1,1)
sns.histplot(data[var], bins = bins, kde = True)
plt.grid()
plt.subplot(2,1,2)
sns.boxplot(x = data[var])
plt.grid()
plt.show()
๊ฒฐ๊ณผ
var = 'Income'
eda_1_num(data, var)
๋ฒ์ฃผํ ๋ณ์
๊ธฐ์ดํต๊ณ๋์ value_counts( ) ๋ฅผ ํตํด ๊ตฌํ๋ค.
def eda_1_cat(data, var) :
t1 = data[var].value_counts()
t2 = data[var].value_counts(normalize = True)
t3 = pd.concat([t1, t2], axis = 1)
t3.columns = ['count','ratio']
display(t3)
sns.countplot(x = var, data = data)
plt.show()
๊ฒฐ๊ณผ
var = 'ShelveLoc'
eda_1_cat(data, var)
3. ์ด๋ณ๋ ๋ถ์
์ซ์ํ -> ์ซ์ํ
def analyze(var, target, data=data):
sns.scatterplot(x=var, y = target, data = data)
plt.show()
# sns.regplot(x=var, y = target, data = data)
# plt.show()
result = spst.pearsonr(data[var], data[target])
print(f'์๊ด๊ณ์ : {result[0]}, p-value : {result[1]}')
๊ฒฐ๊ณผ
analyze('Population', 'Sales')
์๊ด๊ณ์ > 0.5 ์ด๋ฉด ๊ฐํ ์๊ด๊ด๊ณ
p-value(์ ์ํ๋ฅ ) < 0.05์ด๋ฉด ์๊ด๊ณ์๊ฐ ์๋ฏธ๊ฐ ์์์ ์๋ฏธ
์๊ด๊ณ์์ ํ๊ณ
-
๋น์ ํ ๊ด๊ณ๋ฅผ ์ก์ง ๋ชปํจ
-
์ง์ ์ ๊ธฐ์ธ๊ธฐ ํ์ ์ ๋ชปํจ
=> ๋ฐ๋ผ์, ์ฐ์ ๋๋ฅผ ํจ๊ป ๋ด์ผํจ
๊ณ๋จ์ ๊ตฌ์กฐ์ ์ฐ์ ๋
๊ตฌ๊ฐ ์์์ ์๊ด๊ด๊ณ๊ฐ ์ฑ๋ฆฝํ์ง ์์. ์ด๋ด ๋๋ ์ซ์๋ฅผ ๋ฒ์ฃผ๋ก ๋ฐ๊ฟ์ ๋ถ์ํ ์ ์๋ค. (pd.cut)
๋ฒ์ฃผํ -> ์ซ์ํ
def analyze(var, target, data=data):
sns.barplot(x = var, y = target, data=data)
plt.show()
temp = data.loc[data[var].notnull()]
cate = data[var].unique()
arg = []
for i in cate:
arg.append(temp.loc[temp[var] == i, target])
## t-test
if len(cate) == 2:
result =spst.ttest_ind(arg[0], arg[1])
print(f't-ํต๊ณ๋ : {result[0]}, p-value : {result[1]}')
## ANOVA
else:
result = spst.f_oneway(*arg)
print(f'f-ํต๊ณ๋ : {result[0]}, p-value : {result[1]}')
๊ฒฐ๊ณผ
analyze('Urban', 'Sales')
t-ํต๊ณ๋, f-ํป๊ณ๋
t-ํต๊ณ๋์ ๋ ๋ณ์์ ํ๊ท ๊ฐ์ ์ฐจ์ด๋ฅผ ํ์ค ์ค์ฐจ๋ก ๋๋ ๊ฐ์.
\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\]- ( $\bar{x}_1$ )์ ( $\bar{x}_2$ ): ๋ ํ๋ณธ์ ํ๊ท
- ( $s_1$ )์ ( $s_2$ ): ๋ ํ๋ณธ์ ํ์คํธ์ฐจ
- ( $n_1$ )์ ( $n_2$ ): ๋ ํ๋ณธ์ ํฌ๊ธฐ
t-ํต๊ณ๋ > |2| ์ด๋ฉด, ์ฐจ์ด๊ฐ ์์์ ์๋ฏธ
f-ํต๊ณ๋์ ๊ทธ๋ฃน ๊ฐ์ ๋ถ์ฐ๊ณผ ๊ทธ๋ฃน ๋ด์ ๋ถ์ฐ์ ๋น์จ๋ก ๊ณ์ฐํ ๊ฐ์.
์ด๋ ๋ถ์ฐ ๋ถ์(ANOVA, ANalysis Of Variance)์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋ ๊ฐ ์ด์์ ๊ทธ๋ฃน ๊ฐ์ ํ๊ท ์ฐจ์ด๊ฐ ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํ์ง๋ฅผ ๊ฒ์ ํ๋ ๋ฐ ์ฌ์ฉํจ.
\[F = \frac{\text{MSB (๊ทธ๋ฃน ๊ฐ์ ๋ถ์ฐ)}}{\text{MSW (๊ทธ๋ฃน ๋ด์ ๋ถ์ฐ)}} = \frac{\text{์ ์ฒด ํ๊ท - ๊ฐ ์ง๋จ ํ๊ท }}{\text{๊ฐ ์ง๋จ์ ํ๊ท - ๊ฐ๋ณ๊ฐ}}\]
f-ํต๊ณ๋ >= 2 ์ด๋ฉด, ์ฐจ์ด๊ฐ ์์์ ์๋ฏธ
p-value(์ ์ํ๋ฅ ) < 0.05์ด๋ฉด t-ํต๊ณ๋, f-ํต๊ณ๋์ด ์๋ฏธ๊ฐ ์์์ ์๋ฏธ
์ซ์ํ -> ๋ฒ์ฃผํ
feature = 'Age'
sns.kdeplot(x= feature, data = data, hue = target,
common_norm = False)
plt.show()
๋ฒ์ฃผํ -> ๋ฒ์ฃผํ
def analyze(var,targ, data=data):
mosaic(data, [var,target])
plt.axhline(1-data[target].mean(), color='r')
plt.show()
table = pd.crosstab(data[var], data[targ])
print(f'๊ต์ฐจํ\n {table}')
print('-'*50)
result = spst.chi2_contingency(table)
print(f'์นด์ด์ ๊ณฑํต๊ณ๋ : {result[0]}')
print(f'p-value : {result[1]}')
print(f'์์ ๋ : {result[2]}')
print(f'๊ธฐ๋๋น๋\n {result[3]}')
๊ฒฐ๊ณผ
analyze('MaritalStatus', 'Attrition')
์นด์ด์ ๊ณฑ ํต๊ณ๋ (x2 ํต๊ณ๋)
๋ ๋ฆฝ๋ณ์์ ์ข ์๋ณ์๊ฐ ๊ด๋ จ์ด ์๋ค๊ณ ๊ฐ์ ํ ๊ฒฝ์ฐ ๊ธฐ๋๋๋ ๋น๋์ ์ค์ ๋ฐ์ดํฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ ๊ฐ์.
๋ ๋ฒ์ฃผํ ๋ณ์ ๊ฐ์ ๋ ๋ฆฝ์ฑ์ ๊ฒ์ ํ๋ ๋ฐ ์ฌ์ฉํจ.
\[\chi^2 = \sum \frac{(O - E)^2}{E}\]์ฌ๊ธฐ์:
- ( O ): ๊ด์ธก๋ ๋น๋
- ( E ): ๊ธฐ๋๋ ๋น๋
์นด์ด์ ๊ณฑ ํต๊ณ๋์ ์์ ๋(ฮฝ)์ 2๋ฐฐ๋ณด๋ค ํฌ๋ฉด ์ฐจ์ด๊ฐ ์๋ค๊ณ ๋ด.
์์ ๋(ฮฝ)๋ ( x ๋ณ์ ๋ฒ์ฃผ์ ์ -1 ) X ( y ๋ณ์ ๋ฒ์ฃผ์ ์ -1 ) ์.
Leave a comment