์ฃผ์ด์ง ํญ๊ท ๋ฐ์ดํฐ์ ์ ํ์ฉํ์ฌ ํญ๊ท์ ๋ชธ๋ฌด๊ฒ๋ฅผ ์์ธกํ๋ ํ๊ท ๋ชจ๋ธ์ ๋ง๋ ๋ค. ํ๊ท ๋ชจ๋ธ์ ๋ค์ค ํ๊ท, ๋ผ์, ๋ฆฟ์ง ๋ฆฌ๊ทธ๋ ์ ์ ์ด์ฉํ๋ค. ๋ํ ์ด๋ค ๋ ๋ฆฝ ๋ณ์๊ฐ ๋ชธ๋ฌด๊ฒ์ ๊ฐ์ฅ ์ํฅ์ ๋ง์ด ๋ฏธ์น๋์ง ์์๋ณด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค.
species: ํญ๊ท ์ข (Chinstrap, Adรฉlie, or Gentoo)
culmen_length_mm: ๋ถ๋ฆฌ ๊ธธ์ด (mm)
culmen_depth_mm: ๋ถ๋ฆฌ ๋๊ป (mm)
flipper_length_mm: ๋ ๊ฐ ๊ธธ์ด (mm)
body_mass_g: ๋ชธ๋ฌด๊ฐ (g)
island: Palmer ๊ตฐ๋์ ์ฌ ์ด๋ฆ (Dream, Torgersen, or Biscoe)
sex: ์ฑ๋ณ
์ด๊ฐ๋จ ํญ๊ท ์ง์โ๏ธ
ํญ๊ท์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ข ๋ฅ๊ฐ ์ด 5๊ฐ์ง๋ก ๋๋๋ค. ๊ทธ ์ค ์ฐ๋ฆฌ ๋ฐ์ดํฐ ์ ์๋ ์ ํฌํญ๊ท ์ข ๋ง ์๊ธฐ ๋๋ฌธ์ ์ ํฌํญ๊ท์ ๋ํด์ ์์ธํ ์์๋ณด๋ฉด!
Gentooํญ๊ท
Chinstrapํญ๊ท
Adeliํญ๊ท
โ ๋ชธ๋ฌด๊ฒ: ์ ํฌ > ํฑ๋ > ์๋ธ๋ฆฌ ์์ผ๋ก ๋์ ๊ฒ์ ์๊ณ ๊ฐ๋ฉด ์ข๊ฒ ๋ค!
๊ฒฐ์ธก์น ํ์ธ
์ฑ๋ณ์ 7๊ฐ์ ๊ฒฐ์ธก์น๊ฐ ์์๋ค. 7๊ฐ๋ฐ์ ์์ด์ ์ ๊ฑฐ๋ฅผ ํด์ผํ๋ ์๊ฐํ์ง๋ง train ๋ฐ์ดํฐ ์ ์ด 273๊ฐ๋ก ์๊ฐ๋ณด๋ค ์ ์ด์ ์์๋ก ๋ฃ์ด์ฃผ๊ธฐ๋ก ํ๋ค.
๊ฐ ์ฑ๋ณ์ ๋ชธ๋ฌด๊ฒ ํ๊ท ๊ฐ์ ๋ด๊ณ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ ํ๊ท ์ ๋ด์ 4220.162๋ณด๋ค ๋์ผ๋ฉด MALE๋ก, ๋ฎ์ผ๋ฉด FEMALE๋ก ์ฑ์์ฃผ์๋ค.
๋, ์ฑ๋ณ์ ์๋ฏธ์๋ ๊ฐ โ.โ(์ )์ด ํฌํจ๋์ด ์์ด ํด๋น ๋ฐ์ดํฐ๋ ์ ๊ฑฐํด์ฃผ์๋ค.
์ ์ฒด 273๊ฐ ๋ฐ์ดํฐ ์ค 1๊ฐ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค๐
๊ฐ ๋ณ์(๋ถ๋ฆฌ ๊ธธ์ด, ๋ถ๋ฆฌ ๋์ด(?), ๋ ๊ฐ ๊ธธ์ด)์ ํ์คํ ๊ทธ๋จ์ ๊ทธ๋ ค๋ดค๋ค. ์๊ฐํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ๊ฝค ์๋งํ ๋ถํฌ๋ฅผ ๋ ๊ณ ์๋ค๊ณ ํ๋จํด์ ๋ฐ๋ก ์ฒ๋ฆฌ๋ ํ์ง ์์๋ค.
๊ฐ ์ข ๋ค์ ๊ฐ์ฒด ์๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ด ๋ณด์๋ค. ์๋ธ๋ฆฌ ํญ๊ท์ 43.38%, ์ ํฌ ํญ๊ท์ 37.13%, ํฑ๋์ 19.49%๋ก ์๋ธ๋ฆฌ ํญ๊ท์ ๊ฐ์ฒด ์๊ฐ ๊ฐ์ฅ ๋ง์๋ค.
๊ฐ ์์์ง์ ๋ถํฌํ๊ณ ์๋ ํญ๊ท์ ์๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ด ๋ณด์๋ค. Biscoe ์ฌ์ ์์ํ๋ ํญ๊ท์ด ์๋์ ์ผ๋ก ๋ง์๊ณ Dream, Torgersen ์ฌ์ด ์ฐจ๋ก๋ก ์ด์ด์ก๋ค.
์ผ์ชฝ bar ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ์ผ๋ผ๋ฆฌ?.? ์๋ธ๋ฆฌ ํญ๊ท์ ๋ชจ๋ ์ฌ์ ๊ณจ๊ณ ๋ฃจ ๋ถํฌํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ํตํด
์์์ง์ ๋ฐ๋ผ ๋ชธ๋ฌด๊ฒ์ ๋ณํ๊ฐ ์์ ๊ฒ์ด๋ค! ๋ผ๋ ๊ฐ์ค์ ์ธ์๋ณด์๋ค.
๊ท๋ฌด๊ฐ์ค: ๋ชจ๋ ๊ทธ๋ฃน์ ํ๊ท ์ด ๊ฐ๋ค. (๊ฐ ์ฌ์ ์์ํ๋ ์๋ธ๋ฆฌ ํญ๊ท์ ๋ชธ๋ฌด๊ฒ ํ๊ท ์ ๊ฐ๋ค)
๋๋ฆฝ๊ฐ์ค: ์ ์ด๋ ํ ๊ทธ๋ฃน์ ํ๊ท ์ ๋ค๋ฅด๋ค. (์ ์ด๋ ํ๋์ ์ฌ์์์ ํ๊ท ๋ชธ๋ฌด๊ฒ๋ ๋ค๋ฅด๋ค)
stat, pvalue = f_oneway(biscoe.loc[:, "weight"], dream.loc[:, "weight"], torgersen.loc[:, "weight"])
if pvalue < 0.05:
print(f"p-value: {pvalue} -> ๊ท๋ฌด๊ฐ์ค ๊ธฐ๊ฐ!")
else:
print(f"p-value: {pvalue} -> ๊ท๋ฌด๊ฐ์ค ์ฑํ!")
One_way ANOVA๋ฅผ ์ค์ํ ๊ฒฐ๊ณผ ์ ์ํ๋ฅ ์ด ์ ์์์ค 0.05๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ๊ท๋ฌด๊ฐ์ค์ ๊ธฐ๊ฐํ ์ ์๋ค. ์ฆ, Biscoe, Dream, Torgersen 3๊ฐ ์ฌ์ ์์ํ๋ ์๋ธ๋ฆฌ ํญ๊ท์ ๋ชธ๋ฌด๊ฒ ํ๊ท ์ ๊ฐ๋ค๊ณ ํ ์ ์๋ค. ๊ณ ๋ก ์์์ง์ ๋ชธ๋ฌด๊ฒ ๊ฐ์ ๊ด๊ณ๋ ์๋ค๊ณ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
violinplot์ ๊ทธ๋ ค๋ด๋ ๋ณ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โ ์์ผ๋ก island ๋ณ์ ๊ณ ๋ คโ
๊ทธ๋ ๋ค๋ฉด ๋ชธ๋ฌด๊ฒ์ ์ํฅ์ ๋ฏธ์น๋ ๋ณ์๋ ๋ฌด์์ด ์์๊น? ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ํํธ๋งต์ ๊ทธ๋ ค๋ณด์๋ค.
๊ทธ ์ ์, ์ฑ๋ณ๊ณผ ํญ๊ท ์ข ์ด ๋ชธ๋ฌด๊ฒ์ ์ํฅ์ ๋ฏธ์น ๊ฒ ๊ฐ์์ ๊ฐ๊ฐ label encoding๊ณผ one-hot encoding์ ์งํํ๋ค.
์ฑ๋ณ Label encoding
0: Female, 1: Male
ํญ๊ท ์ข one-hot encoding
dummy ๋ณ์(?)๋ฅผ ์ถ๊ฐํ๊ณ ์๋ ์๋ species ์ด์ ์ ๊ฑฐํด์ฃผ์๋ค.
์ ์ฒ๋ฆฌ๋ฅผ ๋ง์น ํ ํํธ๋งต์ ๊ทธ๋ ค๋ณด์๋ค. ANOVA ๋ถ์ ๊ฒฐ๊ณผ์์ ์์์ง์ ๋ชธ๋ฌด๊ฒ๋ ๋ณ๋ค๋ฅธ ์ฐ๊ด์ฑ์ด ์๋ค๊ณ ๋์๊ธฐ ๋๋ฌธ์ island ์ด์ ์ ์ธํ๊ณ ๊ทธ๋ ธ๋ค.
๋ ๊ฐ ๊ธธ์ด์ ์ ํฌํญ๊ท์์ ๊ฐํ ์๊ด๊ด๊ณ๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ค์ค ์ ํ ํ๊ท ๋ชจ๋ธ์ ํ์ต์ํฌ ๋ 2๊ฐ(flipper_length_mm, species_Gentoo)๋ ๊ธฐ๋ณธ์ผ๋ก ๊ฐ์ ธ๊ฐ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
๋ชจ๋ ๋ถ๋ถ์์ ์์ปท ํญ๊ท์ด ์์ปท ํญ๊ท๋ณด๋ค ์ ์ฒด์ ์ธ ํน์ง์์ ์ฐ์์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ค์ค ์ ํ ํ๊ท ํ์ต
์ฒ์ ํ์ต์ํฌ ๋ ์๊ด๊ด๊ณ๊ฐ ๋์ 4๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํด์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ด๋ณด์๋ค.
x_cur_train = x_train[["flipper_length_mm", "species_Gentoo", "sex", "culmen_depth_mm"]]
results = train_multiple_linear_regression(x_cur_train, y_train)
R2๊ฐ์ด 0.867๋ก ๋๊ณ ๊ฐ ๋ณ์๋ค์ ์ ์ํ๋ฅ ๋ ๋งค์ฐ ์ ์ํด์ ์ฒ์๋ถํฐ ์ข์ ๋ชจ๋ธ์ดโ๏ธย ํ๊ณ ๊ธฐ๋ํ๋ฉด์ VIF ๊ฐ์ ์ฐ์ด๋ณด์๋ค.
VIF ๊ฐ์ ํ์ธํ ๊ฒฐ๊ณผ flipper_length์ culmen_depth์ ๊ฐ์ด 10๋ณด๋ค ๋โจโจโจโจ๋ฌด ํฌ๊ฒ ๋์จ ๊ฒ์ ํ์ธํ๋ค. ์ด๋ ํด๋น ๋ ๋ฆฝ ๋ณ์๊ฐ ๋ค๋ฅธ ๋ ๋ฆฝ ๋ณ์์ ์์กดํ๊ณ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์ผ๋จ ๊ฐ์ฅ ๋์ VIF ๊ฐ์ ์ถ๋ ฅํ flipper_length๋ฅผ ์ ๊ฑฐํ ํ ๋ค์ ํ์ธํด๋ณด์๋ค.
flipper_length๋ฅผ ์ ๊ฑฐํ ํ VIF ๊ฐ์ ๋ค์ ํ์ธํด๋ณด๋ ๋๋จธ์ง ๋ณ์๋ค ๋ชจ๋ 10์ดํ๋ก ๋ฎ๊ฒ ๋์จ ๊ฒ์ ํ์ธํ๋ค.
flipper_length๋ฅผ ์ ๊ฑฐํ ๋ฐ์ดํฐ๋ก ๋ค์ ๋ค์ค ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋๋ ธ์ ๋ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์๋ค.
๋ณ์๊ฐ 4๊ฐ์์ ๋ R2(0.867) ๋ณด๋ค ์กฐ๊ธ ๋ฎ์ 0.855(85%๋ ์ค๋ช ํ ์ ์๋ค๋โฆ)๋ก ๊ฝค ๋์์ง ์์ ์ฑ๋ฅ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ f์ค์ฝ์ด์ ์ ์ํ๋ฅ ์ ํ์ธํ์ ๋์๋ ์ ์ํ๋ฅ ์ด ๋งค์ฐ ์์์ ๊ด์ฐฎ์ ๋ชจ๋ธ์ด๋ผ๊ณ ์๊ฐํ๋ค.
2๋ฒ์งธ ํ) ๊ฐ ๋ณ์๋ค์ ์ ์ํ๋ฅ ์ด 0.00์ผ๋ก ๋งค์ฐ ์ ์ํ ๊ฐ์ด๋ฏ๋ก ์ ๊ฑฐํ ๋ณ์๋ ์์๋ค.
3๋ฒ์งธ ํ) skewness์ ์ ๋๊ฐ์ด 2๋ณด๋ค ์์ผ๋ฏ๋ก ์ ๊ท๋ถํฌ์์ ํฌ๊ฒ ๋ฒ์ด๋์ง ์๋๋ค๊ณ ํ ์ ์๊ฒ ๋ค. ๋ํ kurtosis์ ์ ๋๊ฐ์ด 7๋ณด๋ค ์๊ธฐ ๋๋ฌธ์ ์ ๊ท์ฑ์ ๋ฒ์ด๋์ง ์๋๋ค๊ณ ํ ์ ์๋ค.
โ R2 ๊ฐ ๋๊ณ , ๊ฐ ๋ณ์๋ค์ ์ ์ํ๋ฅ ๋ชจ๋ ์ ์ํ๊ณ , ๋ง์ง๋ง์ผ๋ก ์ ๊ท์ฑ์ ๋ฒ์ด๋์ง ์์๊ธฐ ๋๋ฌธ์ ๊ฝค ๊ด์ฐฎ์ ๋ชจ๋ธ์ด๋ผ๊ณ ํ ์ ์๊ฒ ์ง? (์ข์ ์ฑ๋ฅ์ ๊ธฐ๋ํ๋ค๋ฉด ๋ฏธ์ํ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๊ฐ์๊ธธ...)
Lasso (L1)
Lasso ๋ชจ๋ธ์ ํ์ต์ํค๊ธฐ ์ ์ x_test ๋ฐ์ดํฐ์ ๋ x_train๊ณผ ๋๊ฐ์ด ์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค.
์ฑ๋ณ โ label encoding, ํญ๊ท ์ข โ one-hot encoding ์งํ
import numpy as np
model = Lasso()
model.fit(x_cur_train, y_train)
y_pred = model.predict(x_cur_test)
print("R2 score", r2_score(y_test, y_pred))
print("MSE", np.sqrt(mean_squared_error(y_test, y_pred)))
print("sum of abs coefficient", np.abs(model.coef_).sum())
๋ค์ค ์ ํ ํ๊ท์ R2 ๊ฐ ๋ณด๋ค ์กฐ๊ธ ๋จ์ด์ง์ง๋ง ๋น์ทํ ๊ฐ์ ์ ์งํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
alpha ๊ฐ์ ๋ญ ์ง์ ํ๋์ง ๋ชฐ๋ผ์ ์ง์ ํ์ง ์์์ต๋๋ค
Ridge (L2)
import numpy as np
model = Ridge()
model.fit(x_cur_train, y_train)
y_pred = model.predict(x_cur_test)
print("R2 score", r2_score(y_test, y_pred))
print("MSE", np.sqrt(mean_squared_error(y_test, y_pred)))
print("sum of abs coefficient", np.abs(model.coef_).sum())
Lasso ๋ชจ๋ธ๊ณผ ๋น์ทํ R2 ๊ฐ์ ๊ฐ์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ฐํ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค๊ณ ํด์ ์ ํ ํ๊ท ๋ชจ๋ธ์์ ์ ์ํ ๋ณ์๊ฐ ๋๋ ๊ฒ์ ์๋๋ค. ์๊ด๊ด๊ณ๋ ๊ทธ์ ์ฐธ๊ณ ์ฌํญ์ ์ง๋์ง ์์๋ค.
ํญ๊ท์ ๋ฌด๊ฒ๋ฅผ ์์ธกํ ๋ ์ฑ๋ณ, ๋ถ๋ฆฌ ๋๊ป ๊ทธ๋ฆฌ๊ณ ์ ํฌํญ๊ท์ธ์ง ์๋์ง์ ์ฌ๋ถ๋ง ์๋ค๋ฉด ์ด๋์ ๋ ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
๋ค์ค ์ ํ ํ๊ท ๋ชจ๋ธ์ ๋ณ์์ ์ ํฌ ํญ๊ท์ ์ฌ๋ถ๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ์ ํฌ ํญ๊ท์ ๋ฌด๊ฒ๊ฐ ๋ค๋ฅธ ์ข ๋ค์ ๋นํด ๋์ ๋ ๊ฒ ๋์์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค๊ณ ์์ํด๋ณด์๋ค.
์ฑ๋ฅ์ ์ํ๋ค๋ฉด ๋์๊ฐ์ธ์โฆ