๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/62
[boston ๋ฐ์ดํฐ ๋ถ์] 1. ์ฐจ์์ถ์ (PCA) ํ์ด์ฌ ์์
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ import pandas as pd import matplotlib.pyplot as plt import seaborn as sns - ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ data = pd.read_csv('./data/bosto..
silvercoding.tistory.com
๋ผ์ด๋ธ๋ฌ๋ฆฌ & ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = pd.read_csv('./data/boston.csv')
data.head()
๊ตฐ์งํ Clustering
del data['chas']
์ฐ์ํ ๋ฐ์ดํฐ๋ง ๋ค๋ฃจ๊ธฐ ์ํ์ฌ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ ์ ๊ฑฐํ๋ค.
medv = data['medv']
del data['medv']
ํ๊ฒ๋ณ์๋ฅผ ๋ณต์ฌํด ๋๊ณ , ํ๊ฒ๋ณ์ ์ปฌ๋ผ์ ์ง์์ค๋ค. ( pca๋ฅผ ์ํ์ฌ )
์ฐจ์ ์ถ์ (PCA) : 12์ฐจ์ -> 2์ฐจ์
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
์ฐจ์ ์ถ์์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ import ํด์ค๋ค.
- ์ ๊ทํ
scaler = StandardScaler()
์ ๊ทํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
# ๋ฐ์ดํฐ ํ์ต
scaler.fit(data)
# ๋ณํ
scaler_data = scaler.transform(data)
data ์ ์ฒด๋ฅผ ์ ๊ทํํ์ฌ scaler_data์ ์ ์ฅํด ์ค๋ค.
- PCA
pca = PCA(n_components = 2)
PCA ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. 2์ฐจ์ ์๊ฐํ๋ฅผ ์ํ์ฌ ๋ณ์๋ 2๊ฐ๋ก ์ค์ ํ๋ค.
pca.fit(scaler_data)
pca๋ก scaler_data๋ฅผ ํ์ต์ํจ๋ค.
data2 = pd.DataFrame(data = pca.transform(scaler_data), columns=['pc1', 'pc2'])
pca๋ก ๋ณํํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก data2์ ์ ์ฅํ๋ค.
data2.head()
๊ตฐ์ง์ ๊ฐ์ ์ ํ๊ธฐ - Elbow Point ์ง์
from sklearn.cluster import KMeans
KMeans(n_cluster = k)
- k๊ฐ์ ๊ตฐ์งํ๋ฅผ ํ๊ฒ ๋ค๋ ๊ฐ์ฒด ์์ฑ
Kmeans.fit()
- ํ์ต์ํค๊ธฐ
KMeans.inertia_
- ํ์ต๋ KMeans์ ์์ง๋๋ฅผ ํ์ธ
- ์์ง๋๋ ๊ฐ ๋ฐ์ดํฐ๋ก๋ถํฐ ์์ ์ด ์ํ ๊ตฐ์ง์ ์ค์ฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธ
- ์ฆ, ๋ฎ์์๋ก ๊ตฐ์งํ๊ฐ ๋ ์๋์ด์์.
KMeans.predict(data)
- ํ์ต๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํ์์ผ์ค
x = [] # k ๊ฐ ๋ช๊ฐ์ธ์ง
y = [] # ์์ง๋๊ฐ ๋ช์ธ์ง
for k in range(1, 30):
kmeans = KMeans(n_clusters = k)
kmeans.fit(data2)
x.append(k)
y.append(kmeans.inertia_)
1๋ถํฐ 30๊น์ง ๊ตฐ์งํ๋ฅผ ํด๋ณด๊ณ , ๊ฐ์ฅ ์ ์ ํ ์์ง๋์ ๊ตฐ์ง๊ฐ์๋ฅผ ์ ํด์ฃผ๊ธฐ ์ํ์ฌ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณธ๋ค.
plt.plot(x, y)
๊ตฐ์ง์ ๊ฐ์ ๋ณ ์์ง๋ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ณด๋ 3~5๊ฐ ์ ๋๊ฐ ์ ๋นํ ๊ฒ ๊ฐ๋ค. Elbow Point๋ฅผ 4๋ก ์ง์ ํ๊ณ ๊ตฐ์งํ๋ฅผ ํด๋ณด๋๋ก ํ๋ค.
๊ตฐ์งํ
kmeans = KMeans(n_clusters=4)
๊ตฐ์ง์ ๊ฐ์๋ฅผ 4๋ก ์ค์ ํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
kmeans.fit(data2)
์์์ ์์ฑํด ๋์ data2๋ฅผ ํ์ตํ๋ค.
data2['labels'] = kmeans.predict(data2)
๊ฐ๊ฐ์ ์์ธก๋ ๊ตฐ์ง ์ข ๋ฅ๋ฅผ labels ์ปฌ๋ผ์ ๋ฃ์ด์ค๋ค.
data2.head()
lebels๊ฐ 1์ด๋ผ๋ ๊ฒ์ ํด๋น ๋ฐ์ดํฐ๊ฐ 1๋ฒ ๊ตฐ์ง์ ํฌํจ๋์๋ค๋ ์๋ฏธ์ด๋ค.
sns.scatterplot(x='pc1', y='pc2', hue='labels', data=data2)
์์ ๊ฐ์ด ๊ตฐ์ง์ด ํ์ฑ๋์์์ ํ์ธํ ์ ์๋ค.
๊ฒฐ๊ณผ ํด์
- ์ด๋ค ๊ทธ๋ฃน์ ์ง ๊ฐ์ด ๊ฐ์ฅ ๋์๊น ? : ํ๊ท ์ผ๋ก ๋น๊ต
data2['medv'] = medv
๊ฐ ๊ทธ๋ฃน์ ์ง๊ฐ ํ๊ท ์ ๊ตฌํ๊ธฐ ์ํด ์ฒ์์ ์ ์ฅํด ์ฃผ์๋ medv ์ปฌ๋ผ์ data2์ medv ์ปฌ๋ผ์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
data2.head()
data2[data2['labels']==0]['medv'].mean()
0๋ฒ ๊ตฐ์ง์ ์ง๊ฐ์ ํ๊ท ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ ๊ตฐ์ง์ ์ง๊ฐ์ ํ๊ท ์ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณด๋๋ก ํ๋ค.
medv_list = []
for i in range(4):
medv_avg = data2[data2['labels']==i]['medv'].mean()
medv_list.append(medv_avg)
sns.barplot(x=['group_0', 'group_1', 'group_2', 'group_3'], y=medv_list)
์ง๊ฐ์ ํ๊ท ์ต์์ ๊ทธ๋ฃน : group_2
์ง๊ฐ์ ํ๊ท ์ตํ์ ๊ทธ๋ฃน : group_0
---> ์ต์์ ๊ทธ๋ฃน๊ณผ ์ตํ์ ๊ทธ๋ฃน์ ๋น๊ตํ์ฌ ์ง๊ฐ์ ํ๊ท ์ด ๋๊ฑฐ๋ ๋ฎ์ ์ด์ ์ ๋ํ์ฌ ํ์ธํด ๋ณธ๋ค.
* ์๋ณธ ๋ฐ์ดํฐ ์ฌ์ฉํ์ฌ ์์ธ ๋ถ์ํด๋ณด๊ธฐ
data['labels'] = data2['labels']
์๋ณธ๋ฐ์ดํฐ์ ๊ทธ๋ฃน labels๋ฅผ ์ถ๊ฐํด ์ค๋ค.
group = data[(data['labels']==0) | (data['labels']==2)]
๊ทธ๋ฃน0, ๊ทธ๋ฃน2 ๋ง ์ ํํ์ฌ group ๋ณ์์ ์ ์ฅํ๋ค.
group = group.groupby('labels').mean().reset_index()
gropuby๋ฅผ ์ฌ์ฉํ์ฌ labels ์ปฌ๋ผ ๋ณ๋ก ๋ชจ๋ ์ปฌ๋ผ์ ํ๊ท ๊ฐ์ ๊ตฌํ๊ณ , groupby๋ก ์ธํ์ฌ ์ธ๋ฑ์ค๊ฐ ๋์๋ labels๋ฅผ reset_index()๋ฅผ ์ด์ฉํ์ฌ ๋ค์ ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
group
๊ฐ ๊ทธ๋ฃน๋ณ ํ๊ท ์ด ๊ตฌํด์ง ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ์๊ฐํ ํ์ฌ ๋น๊ตํด ๋ณด๋๋ก ํ๋ค.
๊ฒฐ๊ณผ ํด์ - ์๊ฐํ
column = group.columns
fig, ax = plt.subplots(2, 6, figsize=(30, 13))
for i in range(12):
sns.barplot('labels', column[i+1], data=group, ax=ax[i//6, i%6])
๋๊ฐ์ ๋ง๋๊ฐ ๊ทธ๋ ค์ ธ ์๋ ๋ง๋๊ทธ๋ํ๋ก, ์ผ์ชฝ์ด ๋์ผ๋ฉด ์ง๊ฐ์ด ๋ฎ์ ์ด์ ์ ๊ทผ๊ฑฐ๊ฐ, ์ค๋ฅธ์ชฝ์ด ๋์ผ๋ฉด ์ง๊ฐ์ด ๋์ ์ด์ ์ ๊ทผ๊ฑฐ๊ฐ ๋๋ค๊ณ ํด์ํ๋ค.
๊ฒฐ๋ก
- (0,0) ์์น์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด crim( ๋ฒ์ฃ์จ )์ด 0๋ฒ ๊ทธ๋ฃน์์ ์๋ฑํ ๋๋ค. ์ด๋ ๋ฒ์ฃ์จ์ด ๋์์๋ก ์ง๊ฐ์ด ๋ฎ๋ค๊ณ ํด์ํ ์ ์๋ค.
- (0, 1) ์์น์ ๊ทธ๋ํ์์๋ zn( 25,000 ํ๋ฐฉ๋นํธ๋ฅผ ์ด๊ณผํ๋ ๊ฑฐ์ฃผ์ง์ญ ๋น์จ ) ์ด ๋์์๋ก ์ง๊ฐ์ด ๋๋ค๊ณ ํด์๋๋ค.
- ๊ทธ๋ค์์ผ๋ก ์ฐจ์ด๊ฐ ์ ์ด ๋ณด์ด๋ ๊ฒ์ (1, 1) ์์น์ ๊ทธ๋ํ์ด๋ค. rad( ๋ฐฉ์ฌํ ๊ณ ์๋๋ก๊น์ง์ ๊ฑฐ๋ฆฌ ) ๊ฐ ๋์์๋ก ( ๋ฐฉ์ฌํ ๊ณ ์๋๋ก๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์๋ก ) ์ง๊ฐ์ด ๋ฎ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ด์ ๊ฐ์ด ์ฌ๋ฌ ํด์์ ํด๋ณผ ์ ์๋ค.