๋ฌ๋์คํผ์ฆ ์์
์ ๋ฆฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
- ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
data = pd.read_csv('./data/boston.csv')
data.head()
- ๋ฐ์ดํฐ ์ดํด๋ณด๊ธฐ
data.info()
506๊ฐ ์ row ๊ฐ ์กด์ฌํ๊ณ , ๊ฒฐ์ธก๊ฐ์ ์๋ ๊ฒ์ ์ ์ ์๋ค.
data.columns
์ด 14๊ฐ์ ์ปฌ๋ผ์ด ์๋ค. ๊ฐ ์ปฌ๋ผ์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
crim: ๋ฒ์ฃ์จ
zn: 25,000 ํ๋ฐฉํผํธ๋ฅผ ์ด๊ณผ ๊ฑฐ์ฃผ์ง์ญ ๋น์จ
indus: ๋น์๋งค์์
์ง์ญ ๋ฉด์ ๋น์จ
chas: ์ฐฐ์ค๊ฐ์ ๊ฒฝ๊ณ์ ์์นํ ๊ฒฝ์ฐ๋ 1, ์๋๋ฉด 0
nox: ์ผ์ฐํ์ง์ ๋๋
rm: ์ฃผํ๋น ๋ฐฉ ์
age: 1940๋
์ด์ ์ ๊ฑด์ถ๋ ์ฃผํ์ ๋น์จ
dis: ์ง์
์ผํฐ์ ๊ฑฐ๋ฆฌ
rad: ๋ฐฉ์ฌํ ๊ณ ์๋๋ก๊น์ง์ ๊ฑฐ๋ฆฌ
tax: ์ฌ์ฐ์ธ์จ
ptratio: ํ์/๊ต์ฌ ๋น์จ
b: ์ธ๊ตฌ ์ค ํ์ธ ๋น์จ
lstat: ์ธ๊ตฌ ์ค ํ์ ๊ณ์ธต ๋น์จ
medv : ๋ณด์คํด 506๊ฐ ํ์ด์ 1978๋
์ฃผํ ๊ฐ๊ฒฉ ์ค์๊ฐ (๋จ์ 1,000 ๋ฌ๋ฌ)
Feature Selection : ์๊ด๊ณ์์ ๊ณต๋ถ์ฐ
- ๋ฒ์ฃผํ ๋ณ์ ์ ๊ฑฐ
del data['chas']
์๊ด๊ณ์์ ๊ณต๋ถ์ฐ์ ์ฐ์ํ ์๋ฃ๋ฅผ ๋ถ์ํ๋ฏ๋ก ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ค. ์ค์ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ ์คํ๊ฒ ํํด์ผ ํ์ง๋ง , ํ์ต์ ์ํ์ฌ ์ ๊ฑฐํ๋ค.
๊ฐ์ค ์ธ์ฐ๊ธฐ
1. ๋ฒ์ฃ์จ์ด ๋์ ๊ณณ์ ์ง๊ฐ์ ๋ฎ์๊น?
2. ๋ฐฉ์ ๊ฐ์๊ฐ ๋ง์ ๊ณณ์ ์ง๊ฐ์ ๋์๊น?
3. ์ผ์ฐํ์ง์ ๋๋๊ฐ ๋์์๋ก ์ง๊ฐ์ ๋ฎ์๊น?
4. ์ฌ์ฐ์ธ์จ์ด ๋์์๋ก ์ง๊ฐ์ ๋์๊น?
1. ๋ฒ์ฃ์จ์ด ๋์ ๊ณณ์ ์ง๊ฐ์ ๋ฎ์๊น?
sns.jointplot(data=data, x='crim', y='medv', kind='reg')
๊ทน๋จ์ ์ธ ์์ ๊ด๊ณ๋ ์๋์ง๋ง , ๋ฒ์ฃ์จ์ด ๋์์ง ์๋ก ์ง๊ฐ์ด ๋ฎ์์ง๋ ์ถ์ธ ๋ฅผ ๋ณผ ์ ์๋ค.
- ๊ณต๋ถ์ฐ
data['crim'].cov(data['medv'])
์์ ๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์์์ ์ ์ ์๋ค.
- ์๊ด๊ณ์
data['crim'].corr(data['medv']) # ํผ์ด์จ์๊ด๊ณ์ 0.3 ~ 0.6 ๊ฐํ ์๊ด๊ณ์
r์ด -1.0๊ณผ -0.7 ์ฌ์ด์ด๋ฉด, ๊ฐํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.7๊ณผ -0.3 ์ฌ์ด์ด๋ฉด, ๋๋ ทํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.3๊ณผ -0.1 ์ฌ์ด์ด๋ฉด, ์ฝํ ์์ ์ ํ๊ด๊ณ,
r์ด -0.1๊ณผ +0.1 ์ฌ์ด์ด๋ฉด, ๊ฑฐ์ ๋ฌด์๋ ์ ์๋ ์ ํ๊ด๊ณ,
r์ด +0.1๊ณผ +0.3 ์ฌ์ด์ด๋ฉด, ์ฝํ ์์ ์ ํ๊ด๊ณ,
r์ด +0.3๊ณผ +0.7 ์ฌ์ด์ด๋ฉด, ๋๋ ทํ ์์ ์ ํ๊ด๊ณ,
r์ด +0.7๊ณผ +1.0 ์ฌ์ด์ด๋ฉด, ๊ฐํ ์์ ์ ํ๊ด๊ณ
์ถ์ฒ - https://ko.wikipedia.org/wiki/%EC%83%81%EA%B4%80_%EB%B6%84%EC%84%9D
์์ ๊ฐ์ ํผ์ด์จ ์๊ด๊ณ์ ํด์์ ๋ณด์์ ๋ ๋ฒ์ฃ์จ๊ณผ ์ง๊ฐ์ ๋๋ ทํ ์์ ์ ํ๊ด๊ณ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
[ ๊ฐ์ค1 : True ]
2. ๋ฐฉ์ ๊ฐ์๊ฐ ๋ง์ ๊ณณ์ ์ง๊ฐ์ ๋์๊น?
sns.jointplot(data=data, x='rm', y='medv', kind='reg')
๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด, ๋ฐฉ์ ๊ฐ์๊ฐ ๋ง์์๋ก ์ง๊ฐ์ด ๋์์ง๋ ๊ฒฝํฅ ์ด ์๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ๊ณต๋ถ์ฐ
data['rm'].cov(data['medv'])
๊ณต๋ถ์ฐ์ ๋ณด์์ ๋ ์์ ๊ด๊ณ๋ฅผ ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
- ์๊ด๊ณ์
data['rm'].corr(data['medv'])
์๊ด๊ณ์๋ฅผ ๋ณด๋ ๊ฐํ ์์ ์ ํ๊ด๊ณ์ ๊ฐ๊น์ด ๋๋ ทํ ์์ ์ ํ๊ด๊ณ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค. ์ฌ๊ธฐ์ ๊ณต๋ถ์ฐ์ ํ์ ์ ๋ณผ ์ ์๋ค. ๊ฐ์ค2์ ์๊ด๊ณ์ ๋ ๊ฐ์ค1์์ ์๊ด๊ณ์ ๋ณด๋ค ๋ ๋๋ ทํ ๊ด๊ณ ์ด์ง๋ง, ๊ณต๋ถ์ฐ์ ๊ฐ์ค2๊ฐ ๋ ๋๋ค.
[ ๊ฐ์ค2 : True ]
3. ์ผ์ฐํ์ง์ ๋๋๊ฐ ๋์์๋ก ์ง๊ฐ์ ๋ฎ์๊น?
sns.jointplot(data=data, x='nox', y='medv', kind='reg')
data['nox'].corr(data['medv'])
-0.4273207723732824
๋๋ ทํ ์์ ์๊ด๊ด๊ณ ์ธ ๊ฒ์ ์ ์ ์๋ค. ์ผ์ฐํ์ง์ ๋๋๊ฐ ๋์ ์๋ก ์ง๊ฐ์ ๋ฎ์์ง๋ ๊ฒฝํฅ ์ ๋ณด์ธ๋ค.
[ ๊ฐ์ค3 : True ]
4. ์ฌ์ฐ์ธ์จ์ด ๋์์๋ก ์ง๊ฐ์ ๋์๊น?
sns.jointplot(data=data, x='tax', y='medv', kind='reg')
data['tax'].corr(data['medv'])
-0.46853593356776696
๋๋ ทํ ์์ ์๊ด๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์๊ณ , ์ฌ์ฐ์ธ์จ์ด ๋์์๋ก ์ง๊ฐ์ด ๋ฎ์์ง๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
[ ๊ฐ์ค4 : False ]
- ๋ชจ๋ ๋ฐ์ดํฐ์ ์๊ด๊ณ์ ์๊ธฐ - heatmap
plt.figure(figsize=(10, 7))
sns.heatmap(data.corr(), cmap='RdBu_r', annot=True, fmt='0.1f')
lstat์ rm ์ ์ง๊ฐ๊ณผ์ ์๊ด๊ณ์๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ์ ์ ์๋ค. ์ธ๊ตฌ ์ค ํ์ ๊ณ์ธต ๋น์จ(lstat)์๋ ์์ ์๊ด๊ด๊ณ, ๋ฐฉ์ ๊ฐ์(rm) ๊ณผ๋ ์์ ์๊ด๊ด๊ณ๋ฅผ ๋๋ค. ๋ฐ๋ฉด dis(์ง์
์ผํฐ์ ๊ฑฐ๋ฆฌ ), b(์ธ๊ตฌ ์ค ํ์ธ ๋น์จ) ์ ์ง๊ฐ์ ๋ฎ์ ์๊ด๊ด๊ณ๋ฅผ ๋ณด์ธ๋ค.
Feature Extraction
- ์๊ด๊ด๊ณ ๋น๊ตํ์ฌ ๋ช๊ฐ์ ๋ณ์๋ฅผ ๋ช๊ฐ๋ก ์ค์ผ ๊ฒ์ธ์ง ๊ฒฐ์
corr_bar = []
for column in data.columns:
print(f"{column}๊ณผ ์ง๊ฐ์ ์๊ด๊ด๊ณ: {data[column].corr(data['medv'])}")
corr_bar.append(abs(data[column].corr(data['medv'])))
๊ฐ ์ปฌ๋ผ๋ณ ์ง๊ฐ๊ณผ์ ์๊ด๊ณ์๋ฅผ ์ถ๋ ฅํด๋ณด๊ณ , corr_bar ๋ฆฌ์คํธ์๋ ์ ๋๊ฐ์ ์ทจํ์ฌ ์ถ๊ฐํด์ค๋ค.
corr_bar
sns.barplot(data.columns, corr_bar)
๋ง๋๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ dis, b ๊ฐ ๋ค๋ฅธ ์ปฌ๋ผ๋ค๋ณด๋ค ์๊ด๊ณ์๊ฐ ์์ ๊ฒ ์ ํ๋์ ๋ณผ ์ ์๋ค.
x = data[['dis', 'b']]
data ์์ ๋ ๋ณ์๋ฅผ ์ ํํ์ฌ x ์ ์ ์ฅํ๋ค.
x.head()
PCA ์ฌ์ฉ
from sklearn.decomposition import PCA
PCA(n_components)
n_components : ๋ช๊ฐ์ง์ ๋ณ์๋ฅผ ๋ง๋ค์ง ๊ฐ์๋ฅผ ์ ํ๋ค.
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฐ๋
PCA.fit(x)
x์ ๋ฐ์ดํฐ๋ฅผ ํ์ต์ํด์ผ๋ก์จ ์์์ ์์ฑํ ๊ฐ์ฒด๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต๋ถํ๋ ๊ฐ๋
PCA.components_
์์ ํ์ตํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ง ๋ณ์์์ ๋ด๊ธด ์ด ์ ๋ณ์์ ๋ถ์ฐ์ด ๋ด๊ธด ์ ๋
PCA.explained_variance_ratio_
์๋ก์ด ๋ณ์๊ฐ ์ค๋ช
ํ๋ ๋ถ์ฐ์ ๋น์จ
PCA.transform
ํ์ตํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ง ํ์ต๊ธฐ๋ก x์ ๋ฐ์ดํฐ๋ฅผ ๋ณํ
- 2๊ฐ์ ๋ณ์ -> 1๊ฐ์ ๋ณ์
pca = PCA(n_components=1)
n_components ์ ์์ฑํ ๋ณ์๋ฅผ ์์ฑํด์ค๋ค.
pca.fit(x)
๋ฐ์ดํฐ๋ฅผ ํ์ตํจ๋ค.
pca.components_
์๋ก์ด ๋ณ์์ ๋ด๊ธด ๊ฐ ๋ณ์์ ๋ถ์ฐ ์ ํ์ธํด ๋ณธ๋ค. ๊ทธ๋ฐ๋ฐ ์ค๋ฅธ์ชฝ (b) ์ ๋ถ์ฐ์ด ๋๋ฌด ํฌ๋ค. ์ด๋ ์ค๋ฅธ์ชฝ ๋ณ์์ ์ ๋ณด๋ง ๋ง์ด ๋ด๊ฒผ๋ค๊ณ ํด์ ํ ์ ์๋ค. ( -> ์ ๊ทํ๊ฐ ํ์ํ ์ด์ / ๋ค์์ ํ์ต )
pca.explained_variance_ratio_
์๋ก์ด ๋ณ์๊ฐ ์ค๋ช
ํ๋ ๋ถ์ฐ์ ๋น์จ์ด๋ค.
data['pc1'] = pca.transform(x)
ํ์ต์ํจ pca ๋ฅผ ์ด์ฉํ์ฌ x ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ๋ฐ์ดํฐ๋ฅผ data ์ pc1 ์ด๋ผ๋ ์ปฌ๋ผ์ ์ถ๊ฐํ๋ค.
data
์ถ๊ฐ ์๋ฃ๋ ๋ฐ์ดํฐํ๋ ์.
sns.jointplot(data=data, x='pc1', y='medv', kind='reg')
data['pc1'].corr(data['medv'])
์๋ก์ด ์ปฌ๋ผ๊ณผ ์ง๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ๋ณด๋ฉด ์ ์ b๋ณ์์ ์๊ด๊ณ์์ ๋ณ ์ฐจ์ด๊ฐ ์๋ค. ์ ๊ทํ๋ฅผ ์งํํ์ฌ ๋ค์ ํ์ตํด ๋ณด์.
์ ๊ทํ
from sklearn.preprocessing import StandardScaler
StandardScaler()
scaler.fit(x)
์ ๊ทํ ๊ฐ์ฒด๋ก ํ์ต
scaler.transform(x)
ํ์ต๋ ํ์ต๊ธฐ๋ก ๋ณ์ x์ ๋ฐ์ดํฐ๋ฅผ ๋ณํ
scaler = StandardScaler()
์ ๊ทํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
scaler.fit(x)
scaler_x = scaler.transform(x)
x ๋ฐ์ดํฐ๋ฅผ ํ์ต์ํจ ํ, ์ ๊ทํ ๋ x ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํํ์ฌ scaler_x ์ ์ ์ฅํด์ค๋ค.
scaler_x
- ์ ๊ทํ๋ ๋ฐ์ดํฐ๋ก pca ์คํ
# ๋ณ์ 1๊ฐ๋ก ์ค์
pca = PCA(n_components=1)
# ๋ฐ์ดํฐ๋ฅผ ํ์ต
pca.fit(scaler_x)
# ์๋ก์ด ๋ณ์์ ๋ด๊ธด ๊ฐ ๋ณ์์ ๋ถ์ฐ์ ํ์ธ
# ์์ ๋ฌ๋ผ์ง ๋ถ์ฐ์ ์ ๋๋ฅผ ํ์ธ
pca.components_
์ ๊ทํ๋ ๋ฐ์ดํฐ๋ก pca๋ฅผ ์งํํ๋ ์๋ก์ด ๋ณ์์ ๋๊ฐ์ง์ ๋ณ์์ ๋ถ์ฐ์ด ๋์ผํ๊ฒ ๋ด๊ธด ๊ฒ ์ ๋ณผ ์ ์๋ค.
pca.explained_variance_ratio_
์๋ก์ด ๋ณ์๊ฐ ์ค๋ช
ํ๋ ๋ถ์ฐ์ ๋น์จ์ ์ค์ด๋ค์์ง๋ง , ๋๊ฐ์ง ๋ณ์์ ๊ฐ ๋ถ์ฐ์ด ๋์ผํ๊ฒ ๋ด๊ธด๊ฒ์ด ๋ ์ค์ํ๋ค.
data['pc1'] = pca.transform(scaler_x)
data.head()
์ ๊ทํ๋ ๋ฐ์ดํฐ๋ฅผ pca ๋ณํํ์ฌ pc1 ์ปฌ๋ผ์ ๋ฃ์ด์ฃผ์๋ค.
- ์๊ด๊ณ์ ๋น๊ต
sns.jointplot(data=data, x=data['pc1'], y=data['medv'], kind='reg')
data['pc1'].corr(data['medv'])
data['b'].corr(data['medv'])
์ด์ฒ๋ผ ์๋ก์ด ๋ณ์ pc1๊ณผ ์ง๊ฐ์ ์๊ด๊ณ์ ๊ฐ ์์ ๋ ๋ณ์์ ์๊ด๊ณ์๋ณด๋ค ๋ ๋์ ์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๊ด์ฑ์ด ์๋ ๋ ๊ฐ์ง์ ๋ณ์๋ฅผ ์๊ด์ฑ์ด ๋ ๋์์ง๋๋ก ํ๋ ๋ณ์๋ฅผ ์์ฑํ๋ pca๋ฅผ ํ์ตํ์๋ค. ๋ค์์๊ฐ์๋ ์ค๋ ํ์ตํ pca๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจ์์ ์ถ์ํ๊ณ , ๊ตฐ์งํ, ์๊ฐํ๋ฅผ ํ๋ ์ค์ต์ ํ๋ค.