상관관계분석
1. 개념 이해
1.1 상관분석이란?
- 상관분석은 두 변수 간에 얼마나 직선적(linear) 관계가 있는지를 측정하고자 할 때 사용합니다.
- 일반적으로 **상관계수(Correlation Coefficient)**를 통해 “변수 간 관계의 정도와 방향”을 수치화합니다.
- 상관계수 는 과 사이의 값을 가지며,
rr
−1-1
+1+1
- r=0r = 0이면 직선적 관계가 전혀 없음(“독립”을 의미하진 않음)
- r=+1r = +1이면 완벽한 양의 선형관계(한 변수가 증가할 때 다른 변수도 일정 비율로 증가)
- r=−1r = -1이면 완벽한 음의 선형관계(한 변수가 증가할 때 다른 변수는 일정 비율로 감소)
- 상관계수 는 과 사이의 값을 가지며,
rr
−1-1
+1+1
1.2 사용 사례
- 예: 학생의 공부 시간과 시험 점수 간의 관계,
- 광고 비용과 매출액 간의 관계,
- 나이와 혈압 간의 관계 등.
1.3 상관분석 시 주의사항
- 선형적(직선적) 관계만 반영
- 상관계수는 주로 선형 관계성을 측정. 곡선 관계(예: U자형)에는 민감하게 반응하지 않음.
- 인과관계를 의미하지 않음
- 상관이 높다고 해서 반드시 A가 B를 야기(causation)하는 것은 아님.
- 제3의 변수 영향, 시간 선후 관계 등 종합 고려 필요.
- *이상값(Outlier)**에 민감
- 한두 개의 극단치에 의해 상관계수가 크게 왜곡될 수 있으므로 사전 확인 중요.
- 변수 척도
- 상관계수는 등간척도, 비율척도 자료에 주로 적용. 서열척도(순위)라면 Spearman 상관이 더 적절.
2. 상관계수의 종류
2.1 피어슨 상관계수 (Pearson Correlation)
- 가장 흔히 사용되는 상관계수
- 연속형(정량적) 데이터에 대해, 두 변수가 정규분포를 가정할 때 사용
- 계산 공식:
2.2 스피어만 상관계수 (Spearman’s Rank Correlation)
- 비모수적(non-parametric) 방법
- 변수들이 꼭 정규분포를 따르지 않아도 됨
- 각 데이터 값을 **순위(Rank)**로 변환한 뒤, 피어슨 공식을 적용
- “서열척도” 자료나 극단값(outliers)이 많아 정규성 가정이 어렵다면 Spearman을 고려
2.3 켄달의 타우 (Kendall’s tau)
- 순위 상관의 또 다른 방법
- 표본 크기가 작을 때나, 서열데이터(순위데이터)의 정확한 일치·불일치를 엄밀하게 보고 싶을 때 사용
- Spearman과 유사하게 순위 변환을 하지만, 계산 방식이 다름(짝 비교(pairwise comparison)에 기반)
실무에서는 정규성 가정이 유효하다고 볼 수 있으면 “피어슨 상관”을, 그렇지 않다면 “스피어만 상관”을 가장 많이 사용합니다.
3. 상관계수의 해석
3.1 계수 값 해석 (일반적 가이드라인)
- ∣r∣|r|이 0.1~0.3이면 약한(Weak) 상관
- ∣r∣|r|이 0.3~0.5이면 보통(Moderate) 상관
- ∣r∣|r|이 0.5~0.7이면 꽤 강한(Strong) 상관
- ∣r∣|r|이 0.7~0.9이면 매우 강한(Very Strong) 상관
- ∣r∣|r|이 0.9 이상이면 사실상 거의 완벽(Almost Perfect)
이 구간은 절대적 기준은 아니며, 연구 분야와 맥락에 따라 조금씩 달리 적용될 수 있습니다.
3.2 유의성 검정 (p-value)
- 상관계수 이 0이 아닌 값을 가질 때, 우연히 발생한 것인지 아니면 통계적으로 의미가 있는지 확인하기 위해 p-value를 활용. rr
- 귀무가설(H₀): “상관계수() = 0” ρ\rho
- 대립가설(H₁): “” (양측 검정) ρ≠0\rho \neq 0
- p-value < (0.05 등) → “통계적으로 유의한 상관관계가 있다.” (하지만 인과를 의미하진 않음) α\alpha
4. Python 실습 예시
아래는 Python에서 상관계수를 계산하고, 유의성 검정까지 해보는 예시입니다.
4.1 라이브러리 임포트
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import pearsonr, spearmanr
4.2 예시 데이터 생성
- 예: 간단히 공부 시간(study_hours)과 시험 점수(exam_score)의 관계를 가정
- 정규분포 기반으로 랜덤하게 생성하되, “공부시간이 많을수록 시험점수가 높아진다”라는 상관성 부여
np.random.seed(42)
n = 50
study_hours = np.random.normal(loc=5, scale=2, size=n) # 평균 5시간, 표준편차 2
# 일부 음수 값 방지 (0 이하라면 절댓값 등으로 처리)
study_hours = np.abs(study_hours)
# exam_score: study_hours에 양의 상관이 있게끔 만듦 (예: 10 * hours + 노이즈)
exam_score = 10 * study_hours + np.random.normal(loc=0, scale=5, size=n)
df = pd.DataFrame({
'study_hours': study_hours,
'exam_score': exam_score
})
print(df.head())
4.3 시각화: 산점도
plt.figure(figsize=(6,4))
plt.scatter(df['study_hours'], df['exam_score'], color='blue', alpha=0.7)
plt.xlabel("Study Hours")
plt.ylabel("Exam Score")
plt.title("Scatter Plot: Study Hours vs. Exam Score")
plt.show()
- 시각적으로 양의 상관(시간이 늘어나면 점수가 전반적으로 높음)을 확인
4.4 피어슨 상관계수 (Pearson’s r) 계산
r_pearson, p_pearson = pearsonr(df['study_hours'], df['exam_score'])
print("[Pearson Correlation]")
print(f"r = {r_pearson:.4f}, p-value = {p_pearson:.4e}")
pearsonr함수는(상관계수, p-value)를 반환- p-value가 매우 작다면(예: 1e-5 미만), 통계적으로 유의한 상관관계임
4.5 스피어만 상관계수 (Spearman’s rho) 계산
r_spearman, p_spearman = spearmanr(df['study_hours'], df['exam_score'])
print("\n[Spearman Correlation]")
print(f"rho = {r_spearman:.4f}, p-value = {p_spearman:.4e}")
- 스피어만은 “순위”를 기준으로 한 상관계수
- 정규성이나 선형성 가정이 어려운 경우에 유리
4.6 상관행렬 (Correlation Matrix) 예시
만약 여러 변수(예: study_hours, exam_score, IQ, etc.)가 있을 때는, df.corr() 메서드를 사용해 상관행렬을 쉽게 구할 수 있습니다.
- 기본적으로 피어슨 상관계수를 계산해줍니다(
method='pearson'). - 스피어만 상관행렬을 보려면
df.corr(method='spearman')로 지정
corr_matrix = df.corr(method='pearson')
print("\nCorrelation Matrix (Pearson):\n", corr_matrix)
- 시각적으로는
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')등을 활용하면 편리
5. 결과 해석
- 상관계수의 절댓값이 클수록, 선형적 관계가 강하다고 해석.
- *부호(+/-)**가 관계의 방향(양/음)을 의미.
- p-value < 0.05 → 통계적으로 유의미한 상관관계 가능성이 높음.
- 실제로 “원인-결과 관계”를 입증하려면 추가 분석(회귀분석, 실험 설계 등)이 필요.
- 이상치가 있는지, 혹은 두 변수 간 관계가 비선형인지 등을 사전에 확인해야 정확한 해석 가능.
6. 요약
- 상관분석은 두 변수 간 선형적 관계를 측정하고자 할 때 유용하며, 상관계수()와 p-value로 결과를 해석합니다. −1≤r≤1-1 \leq r \leq 1
- 피어슨 상관계수: 연속형 정규 자료에 주로 사용, 가장 보편적.
- 스피어만 상관계수: 정규성 가정이 어렵거나 서열데이터(순위)일 때 사용.
- 상관분석은 “함께 움직이는 경향”을 측정할 뿐, 인과관계를 보장하지 않는다는 점을 유의해야 합니다.
- Python에서는
scipy.stats.pearsonr,scipy.stats.spearmanr,DataFrame.corr()등을 통해 손쉽게 계산할 수 있습니다.
참고문헌
- Pearson, K. (1895). Contributions to the mathematical theory of evolution. Philosophical Transactions of the Royal Society of London. Series A, 185, 71–110.
- Spearman, C. (1904). The proof and measurement of association between two things. The American Journal of Psychology, 15(1), 72–101.
- Cohen, J., Cohen, P., West, S. G., & Aiken, L. S. (2013). Applied multiple regression/correlation analysis for the behavioral sciences (3rd ed.). Routledge.
- McElreath, R. (2020). Statistical Rethinking: A Bayesian Course with Examples in R and Stan (2nd ed.). Chapman & Hall/CRC. 이상으로 **상관분석(Correlation Analysis)**의 개념과 구현 방법, 그리고 주의사항을 살펴보았습니다. 실제 데이터 분석 환경에서는 이상치 검사, 분포 확인(정규성/비정규성), 결과 해석 시 인과관계 착각 주의 등이 중요합니다.