상세 컨텐츠

본문 제목

Clustering analysis와 Factor analysis

Omics

by zinomi 2024. 3. 11. 23:28

본문

 

건강 빅데이터를 다루다보면 변수(차원)의 개수가 매우 많아지는 상황을 마주하게 된다. 특히, 유전체 데이터의 경우, 분석시 각각 하나하나의 Single Nucleotide Polymorphism(SNP)마다 어떤 특정한 질병 또는 표현형과 연관되었는지를 통계적으로 검증하는 상황에 마주하고는 한다. 유전체 데이터뿐 아니라 전사체, 단백체, 대사체 등 대부분의 오믹스 데이터가 이러한 경우에 해당된다. 오믹스가 아니라 표현형 중에서도 다양한 표현형 요소들의 패턴을 분석하고자 할 때도 있다.

 

클러스터링

 

이런 경우에 활용할 수 있는 방법론이 바로 Clustering analysis(군집분석)와 Factor analysis(요인분석)이다.

 

Clustering analysis

먼저 Clustering analysis는 개인별로 새로운 표현형을 새롭게 재정의하는 것이라고 이해하면 쉽다. 식품을 예로 들었을 때, 원래 내가 가지고 있는 데이터에는 식품군별 섭취량 정보에 대한 식품군별 변수가 포함되어 있다면, 우리는 clustering analysis를 통해서 개인들을 그룹화할 수 있다. 그렇게 되면 그 그룹이 새로운 변수가 되는 것이다. 같은 그룹에 포함된 개인들은 가장 거리가 가까우며 차이가 적은 개인들이며, 다른 그룹에 포함된 개인들은 가장 거리가 멀고 차이가 크도록 그룹(군집)이 형성된다.

클러스터링

 

그룹에 대한 해석은, 내가 clustering analysis를 하기 위해, 다른 말로, 개인들을 그룹화하기 위해 넣어준 변수들에 기반하여 하게 된다. 예를 들어, 새롭게 정의한 클러스터(그룹) 변수가 있다면, 그 변수를 만드는 데 알고리즘에 넣어준 정보들이 있다. 더 구체적인 예시를 들자면, 식이와 관련해서 수많은 세세한 식품군에 대한 섭취량 변수들이 있다면, 그것들을 가지고 클러스터링 알고리즘에 넣어서 만든 클러스터(그룹) 변수에 대한 해석은, 어떤 식품군이 각 클러스터에서 다른 클러스터들에 비해 높은 평균값이나 빈도가 나타나는지를 확인해봄으로써 클러스터의 특성을 파악해보는 방식으로 진행하는 것이다. 이러한 방식은 여러 가지 방법 중 하나로, 각 클러스터 내 데이터의 통계적 특성(평균, 중앙값, 표준 편차 등)을 계산함으로써 각 클러스터의 주요 특성을 요약하여, 해당 클러스터를 대표하는 프로파일을 만드는 프로파일링 방식이다. 이를 코드로 구현해보자면 다음과 같다.

 

import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import seaborn as sns

# K-means 클러스터링
kmeans = KMeans(n_clusters=3, random_state=42)
data['cluster'] = kmeans.fit_predict(data[['feature1', 'feature2', 'feature3']])

# 프로파일링: 클러스터별 통계적 분석
cluster_summary = data.groupby('cluster').agg(['mean', 'std', 'min', 'max'])
print(cluster_summary)

 

프로파일링 방식 외에도, 중심값(Centroid) 분석이 있다. 중심값 분석 방법이란, 클러스터링의 결과로 클러스터 내에 포함된 데이터 포인트들의 평균값인 각 클러스터의 중심값을 계산이 되는데, 그렇게 계산된 각 클러스터의 중심값을 분석함으로써 해당 클러스터가 어떤 특성을 가지는지 파악하는 방법이다. 코드는 다음과 같다.

# 클러스터별 중심값 분석
centroids = kmeans.cluster_centers_
print("Centroids:\n", centroids)

 

Factor analysis

다음으로 Factor analysis는 수많은 변수들 간의 상관성을 바탕으로 변수들 간의 관계를 몇 개의 잠재적인 요인으로 축약하여 설명하는 방법이다. 변수들 간의 상관성 정도에 따라서 같은 요인으로 분류가 된다. 앞서 소개한 Clustering analysis와 다른 점은, 클러스터처럼 요인 자체가 새로운 변수로 생성이 되어 각 개인들에게 그대로 바로 부여되는 것이 아니라, 여러 가지 요인들의 기여 정도가 합쳐진 요인 점수가 각 개인들에게 부여된다는 것이다. 따라서 Clustering analysis에서와 달리 한 가지 분석 단계가 추가되는데, 바로 factor loading을 산출하는 것이다. 개인적으로 코드로 확인했을 때 더 개념의 구체화가 명확하고 이해가 빨라 바로 코드로 확인해보도록 하겠다.

 

import pandas as pd
from sklearn.decomposition import FactorAnalysis
from sklearn.datasets import load_digits

# 요인분석
factor = FactorAnalysis(n_components=10, random_state=42)  # 10개의 요인으로 설정
X_factor = factor.fit_transform(X)

# 결과 확인
print("Factor Loadings:\n", factor.components_.T)  # Factor loading: 변수와 요인 간의 관계

# 요인 점수 확인: 데이터 포인트가 각 요인에 대해 얻는 점수
factor_scores_df = pd.DataFrame(X_factor, columns=[f'Factor{i+1}' for i in range(10)])
print("Factor Scores:\n", factor_scores_df.head())

# 설명된 분산 확인: 각 요인이 데이터의 변동성을 얼마나 설명하는지 확인
print("Variance Explained by Each Factor:", factor.explained_variance_ratio_)

 

이렇듯 Clustering analysis와 Factor analysis는 겉핥기로 언뜻 보면 비슷한 개념으로 오해하거나, 분석 절차가 뒤엉켜 혼란스러울 수 있다. 분석을 진행하기에 앞서, 개념을 정확히 이해하고 더 적합한 방법론을 선택하는 것을 권장한다.

'Omics' 카테고리의 다른 글

Mendelian Randomization 3  (0) 2024.03.22
Mendelian Randomization 2  (0) 2024.03.17
Mendelian Randomization 1  (0) 2024.03.12
리포프로틴(Lipoprotein)이란?  (0) 2024.03.06

관련글 더보기