Machine Learning

[Machine Learning]PCA로 cluster 그래프 그리기

heedy 2022. 11. 11. 15:37
728x90

다차원의 변수를 2차원의 그래프로 나타내기 위해서는 PCA를 사용해야 합니다.
오늘은 PCA로 변수를 압축 후 target이 잘 분리되어 있는지 그래프로 나타내겠습니다.


- Data Load 및 Import

iris data를 사용하여 진행하겠습니다.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA

data = load_iris()

이 data는 dictionary 형태로 되어 있으며, keys를 통해 어떤 데이터 항목이 있는지 알 수 있습니다.

data.keys()

>>> dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

- DataFrame 만들기

위 데이터 중에서 data, target, feature_names를 이용하여 DataFrame을 만들겠습니다.

df = pd.DataFrame(data.data, columns = data.feature_names)
df['target'] = data.target

df

이런 형태의 DataFrame이 만들어졌습니다.

이제 이 변수들을 2차원으로 압축하겠습니다.

- 변수 2차원으로 압축

2차원으로 압축하는 것은 n_components = 2를 설정해주시고, 3차원이면 3, 4차원은 4로 설정해주시면 됩니다.

pca = PCA(n_components=2)

x = df.drop('target', axis = 1)
y = df.target

pca_x = pca.fit_transform(x)
pca_x

압축한 변수를 pca_x로 선언하고 확인하면 이런 형태의  array로 구성됩니다.

이 array를 다시 보기 좋게 DataFrafme으로 변경해줍니다.

pca_df = pd.DataFrame(pca_x, columns = ['pca_1','pca_2'])
pca_df['target'] = y
pca_df

이제 그래프를 그리면 되는데, target이 숫자로 되어있어 어떤 것인지 분간이 가지 않아 변경을 해주려고 합니다.
iris data 중에서 target_names를 확인해보겠습니다.

data.target_names

>>> array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

각 index number 별로 이름이 있습니다.
for문을 써서 빠르게 바꿔주겠습니다.
enumerate는 data의 순서(번호)와 값을 변환해주는 함수입니다.

for num, i in enumerate(data.target_names):
    pca_df.replace(num, i, inplace = True)

보기 좋게 변환된 것을 확인 할 수 있습니다.

- 그래프 그리기

seaborn을 이용하여 scatterplot을 그리겠습니다.
여기서 style을 target column에 적용하면 marker가 변합니다. marker size는 's' args를 통해 변경할 수 있습니다.

import seaborn as sns
plt.figure(figsize = (12, 8))

ax = sns.scatterplot(data = pca_df, x = 'pca_1', y = 'pca_2', hue = 'target', style = 'target', s = 100)
plt.show()

pca 후 그래프

다차원 그래프를 pca로 압축한 후 2차원 그래프로 분포가 어떻게 되어있는지 확인할 수 있습니다.

728x90