고차원의 데이터를 압축하거나 정보가 더 잘 드러나는 표현을 찾기 위해 분포의 주성분을 분석하는 방법을 주성분분석 PCA라고 한다.
변수들의 분산을 최대한 많이 설명하는 방향으로 원변수들의 선형결합으로 이루어진 새로운 주성분을 생성해낸다.
분산이 작은 변수는 이 과정에서 희생당할 수 있지만 그만큼 하나의 개체를 설명하는데에 도움이 되지않는다고 할 수 있ㅈ다?
데이터를 표준화하고 실시한 pca와 그렇지 않은 pca의 결과에는 차이가 발생하는데
각각 표준화를 한다면 상관행렬을 이용한 주성분분석, 공분산행렬을 이용한 주성분분석이다
공분산행렬을 이용한 주성분분석은 각 변수별 분산의 영향을 크게 받고
(변수간 분산 차이가 크다면 그 변수를 많이 사용. 하지만 단위가 같다 생각하면 직관적일 수 있음)
상관행렬을 이용한 주성분분석은 영향을 상대적으로 덜 받는다.
(표준화 때문임 -> 단위가 사라짐 -> 단위가 변수간 다를 때 good)
앞의 주성분일 수록 더 많은 정보를 가지고 있다.
앞의 몇가지 주성분을 사용한다 cum proportion을 보며 판단.
각 주성분은 서로 직교한다 (독립이다. cov가 0이다.)
from sklearn import datasets
iris_datasets = datasets.load_iris()
iris = pd.DataFrame(iris_datasets['data'], columns = list(map(lambda x :'_'.join(x.split()[:2]),iris_datasets['feature_names'])))
iris.head()
sepal_length | sepal_width | petal_length | petal_width | |
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
pca = PCA(n_components=4)
pca.fit(iris)
re_pca = pca.fit_transform(iris) # 주성분 값들
cov = pca.get_covariance() # 사용된 공분산행렬
weights = pca.components_ # 주성분을 만드는데 사용된 가중치들
def pca_scree_plot(data, max_num):
pca = PCA(n_components=max_num)
pca.fit(data)
value = pca.explained_variance_ratio_
plt.title('scree plot')
plt.xlabel('num of component')
plt.ylabel('cum explained Var')
plt.plot(value, 'bo-')
plt.show()
v = pca.explained_variance_
v_ratio = pca.explained_variance_ratio_
cum_v_ratio = np.cumsum(v_ratio)
summary = pd.DataFrame(np.stack((v,v_ratio,cum_v_ratio), axis=0), index = ['Standard deviation', 'Proportion of Variance', 'Cumulative Proportion'])
display(summary)