-
통계-17 다변량분석(주성분, 인자, 군집, 생존)통계 2023. 6. 5. 14:06
1. 다변량 분석
다변량 분석은 한 번에 둘 이상의 변수를 분석하는 방법이다. 다변량 분석의 목적은 차원 축소(주성분 분석, 인자 분석), 분류(군집 분석, 판별 분석, cart 군집화), 예측(회귀 분석), 상관관계파악(다변량분산분석, 다중비교), 범주형 자료의 분석(로지스틱 회귀, 대응 분석)이 있다.
다변량 데이터가 정규분포를 따르는지 확인하기 위해 다변량 산점도 그래프, 단변량 카이제곱 검정, 다변량 shapiro-wilk 검정, 다변량 커트리스 마라테스 테스트 등을 통하여 정규성 검정을 진행한다.
2. PCA(주성분 분석)
pca는 차원 축소 기법 중 하나이다. 차원 축소란 원 데이터의 분포를 최대한 유지하면서 데이터의 차원을 줄이는 것을 말한다. 차원을 축소함으로써 데이터를 가볍고 해석하기 쉽게 만들 수 있다.
pca는 데이터의 분산을 가장 잘 보존하는 주성분을 찾는 것이 목적이다. 주성분은 원본 데이터들의 변동성을 가장 잘 설명하는 변수들의 선형 조합이며 첫번째 성분이 가장 큰 분산을 가지며 이후로 감소한다.
pca를 사용하기 위해 데이터의 분포를 확인한다. 그 다음 공분산 행렬을 계산하여 변수 x와 y의 상관관계를 파악한다. 그다음 공분산 행렬의 고유값과 고유벡터를 계산한다. 고유벡터는 주성분의 방향을 나타내며 고유값은 고유벡터에 대응하는 주성분의 중요도 값이다. 고유값이 큰 순서대로 주성분을 선택하며 주성분의 개수는 축소할 차원의 개수이다.
from sklearn.decomposition import PCA X = np.random.rand(100,3) pca = PCA(n_components= 2) pca.fit(X) transformed_data = pca.transform(X) explained_variance_ratio = pca.explained_variance_ratio_ print(explained_variance_ratio) components = pca.components_ print(components) plt.scatter(transformed_data[:,0], transformed_data[:,1]) plt.title('PCA result') plt.show() [0.37919682 0.33785856] [[-0.14674495 -0.90375672 -0.4021066 ] [-0.89274605 0.29606785 -0.33962968]]
100개의 랜덤한 데이터를 만들고 PCA모델을 적용한다. n_components를 2로 설정하여 주성분의 개수를 2개로 설정한다. ㄹit으로 데이터를 적합시키고 transform으로 변환한다.
explained_variance_ratio_ 메소드는 주성분의 설명력을 나타내며 각 0.37, 0.33으로 주성분들이 전체의 80 퍼센트의 분산을 설명하고 있는 것을 알 수 있다.
components_ 메소드는 주성분이 원본 변수에 어떠한 가중치를 가지는지를 나타낸다. 가중치 큰 변수들은 주성분과 강한 관련이 있으며 주성분 1은 변수 3과 가장 큰 관련이 있다는 것을 알 수 있다.
3. 인자 분석
인자 분석 역시 데이터의 차원을 축소한다는 점에서 pca와 동일하지만 인자 분석은 변수간의 상관관계가 없고 대등한 관계를 가지며 목적은 여러 개의 데이터 변수들이 함께 변화하는 구조나 패턴을 알아내는 것이다.
인자 분석은 특정 변수가 다른 변수와 함께 변하는 영향을 주는 요인이 있다라는 가정 하에 요인을 찾아내는 것이다. 요인의 종류는 공통 요인과 고유 요인 두 가지로 구분하며 변수에 영향을 미치는 공통 요인 외에 각 변수들 자체에만 영향을 미치는 고유 요인을 고려하는 것이 pca와의 차이점이다.
인자 모델에서 인자의 개수를 선택하기 위해 주로 scree plot과 kaiser criterion을 사용한다.
scree plot은 각 주성분의 고유값을 그래프로 나타내는 방법이다. 고유값은 해당 주성분의 분산을 나타내며 scree plot에서는 고유값이 급격히 감소하는 지점을 찾아 이 지점까지의 주성분 개수를 인자 개수로 선택한다.
kaiser criterion은 고유값의 크기를 기준으로 인자의 개수를 결정한다. 고유값이 1보다 큰 상태를 유지하는 인자만 선택하며 1보다 큰 경우는 주성분의 분산이 랜덤한 데이터의 분산보다 큰 경우이다.
import numpy as np from sklearn.decomposition import FactorAnalysis np.random.seed(0) n_samples = 100 n_features = 5 X= np.random.randn(n_samples, n_features) n_components =2 factor_analysis = FactorAnalysis(n_components= n_components, random_state= 0) X_factors = factor_analysis.fit_transform(X) print(X.shape) print(n_components) print(X_factors) (100, 5) 2 [[-1.01244523e+00 -1.30255487e-01] [-4.66728317e-01 1.13128805e-01] [-5.43752664e-01 -5.21333643e-03] [ 7.84485254e-02 5.18446209e-01]
랜덤한 5개의 특성을 가진 100개의 데이터를 생성한다. 추출할 인자의 수를 결정하고 random_state의 값을 지정하여 모델을 생성한다 fit_transform에 데이터를 넣고 인자를 추출한다. 출력된 인자를 확인해 보면 두 개의 인자가 추출되었다.
첫 번째 인자가 양수인 데이터는 첫 번째 인자가 음수인 데이터보다 큰 값을 가진다. 두 번째 인자가 양수인 데이터는 두 번째 인자가 음수인 데이터보다 큰 값을 가진다.
인자 분석과 pca분석은 선형적 가정, 독립성 가정, 정규성 가정을 따라야 하며 그렇지 않을 경우 결과가 왜곡되거나 타당성이 저하될 수 있으며 데이터를 축소하는 과정에서 데이터의 정보손실이 일어난다. 따라서 차원 축소를 하기 전 데이터 전처리는 매우 중요한 부분이며 스케일링과 결측치, 이상치 처리, 정규화 및 표준화는 필수적이다.
4. 군집 분석
군집 분석은 비슷한 특성을 가진 개체들을 그룹으로 분류하는 방법이다. 군집 분석은 계층적 분석과 비계층적 분석으로 나뉘어지며 계층적 군집 분석은 데이터를 계층 구조로 분리하며 비계층적 군집 분석은 데이터를 클러스터 수에 따라 분류한다.
1. 데이터를 준비하고 전처리한다.(표준화, 정규화, 이상치, 결측치 처리 등)
2. 거리 또는 유사도를 측정한다.(유클라디안 거리: 데이터 간 직선 거리, 맨하탄 거리: 데이터의 가로 세로 이동 거리, 코사인 유사도: 데이터 간 각도, 자카드 유사고: 두 집합의 공통요소 비율 계산 등)
3. 군집화 알고리즘(k-means, hirearchical clustering, dbscan, gmm 등)을 선택한다.
4. 군집의 개수를 설정한다.(엘보우 방법: 군집 수가 증가할수록 응집도가 감소하는 구간인 엘보우를 찾는 방법, 실루엣 분석: 군집 내의 응집력과 분리도를 실루엣 계수로 평가하며 1에 가까울수록 군집 간 차이가 크고 군집 내 유사성이 높음, gap statistic: 실제 데이터와 무작위 데이터를 비교하여 gap statistic이 최대가 되는 군집 수를 선택 등)
5. 군집화를 실행한다.
6. 군집 결과를 해석한다.(산점도, 덴드로그랩, 히트맵 t-sne 등)
from sklearn.datasets import make_blobs from sklearn.cluster import KMeans X, y = make_blobs(n_samples=100, centers=4, random_state=42) kmeans = KMeans(n_clusters=4, random_state=42) kmeans.fit(X)
데이터를 랜덤하게 생성한 후 kmeans 알고리즘의 군집 수와 random_state 수를 지정하여 모델을 생성하고 학습한다.
centroids = kmeans.cluster_centers_ print(centroids) labels = kmeans.labels_ print(labels) for i in range(len(centroids)): cluster_data = X[labels == i] cluster_center = centroids[i] print(i+1) print(cluster_center) print(len(cluster_data)) [[ 4.44441765 2.02122148] [-8.8546122 7.54808242] [-6.9749469 -6.76471966] [-2.69827251 8.74341951]] [1 2 3 2 1 2 0 0 0 3 3 2 2 0 3 1 1 0 1 1 3 1 1 0 0 3 0 1 1 2 2 0 2 1 3 3 3 3 0 0 1 0 2 3 3 2 2 1 1 0 0 0 0 2 1 1 3 3 0 3 2 0 1 2 1 1 2 1 0 2 0 2 1 3 2 1 2 1 2 2 0 2 3 1 3 3 3 2 3 0 0 2 3 2 3 3 3 0 1 0] 1 [4.44441765 2.02122148] 25 2 [-8.8546122 7.54808242] 25 3 [-6.9749469 -6.76471966] 25 4 [-2.69827251 8.74341951] 25
kmeans.cluster_centers_는 군집의 중심점 좌표이며 centroids에 저장한다. kmeans.labels는 데이터의 레이블이며 labels에 저장한다. 군집 1번부터 4번까지 순차적으로 중심점의 좌표와 데이터의 개수를 출력해 확인한다.
5. 생존 분석
생존 분석은 어떠한 사건이 발생하기까지 걸리는 시간에 대해 분석하는 것이다. 주로 생존 시간, 사망 시간, 고장 시간 등의 사건의 발생까지 경과 시간에 대해 분석하며 의학분야에 주로 사용되며 목적은 생존 패턴의 이해, 사건 발생 위험 평가, 그룹 간 비교, 사건 발생 예측 등이 있다.
생존 함수는 t 시점까지 사건이 발생할지 않을 확률이며 시간에 따라 감소하며 0에 수렴하는 그래프를 그린다.
위험 함수는 t 시점에서 생존했을 때 사건이 발생할 확률이다.
위험 비율은 두 개 이상의 그룹의 사건 발생률을 비교하기 위해 사용되며 한 그룹의 사건 발생 위험을 다른 그룹의 사건 발생 위험으로 나눈 값으로 1보다 크면 해당 그룹의 사건 발생 위험이 높다고 판단한다.
누적 위험 함수는 t 시점까지 사건 발생 위험을 누적하여 계산하며 생존 함수와 반대의 그래프를 나타낸다.
생존 함수를 추정하는 방법에는 일반적으로 kaplan-meier 추정법, cox 비례위험 모형이 있다.
카플란 마이어 추정법: 비모수적인 방법으로 시간을 일정 구간으로 나누고 해당 구간에서 사건이 발생하지 않은 값의 비율을 계산하여 생존 함수를 추정한다.
cox 비례위험 모형: cox 모형은 생존함수가 지수함수를 따르고 두 집단의 위험비가 일정하게 유지된다는 비례위험가정을 요구하며 카플란 메이어 추정법과 달리 데이터의 특성을 반영하여 어떻게 영향을 받는지 확인할 수 있다.
'통계' 카테고리의 다른 글
통계-16 ar, ma, arma, arima, sarima (0) 2023.06.04 통계-15 정규화, 표준화, 변환 (0) 2023.06.04 통계-14 이상치 (0) 2023.06.04 통계-13 결측치 (0) 2023.06.01