고차원의 데이터를 압축하거나 정보가 더 잘 드러나는 표현을 찾기 위해 분포의 주성분을 분석하는 방법을 주성분분석 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)

 

 

 

+ Recent posts