1. 상관관계분석 개요
- 정의: 두 변수가 함께 움직이는 경향이 있는지, 그 방향과 강도를 수치로 나타내는 분석 방법
- 중요 포인트:
- 상관은 “함께 변하는 정도”를 의미
- **인과관계(원인-결과)**를 증명하는 것이 아님!
- 예: 아이스크림 판매량과 온도는 **상관**이 있지만, 아이스크림이 날씨를 덥게 만드는 건 아님
2. 산점도를 통한 관계 시각화
- 산점도: 두 변수를 각각 x축, y축에 찍어 관계를 시각적으로 보여줌
- 해석 포인트:
- 방향
- 양의 상관: 한 변수가 커질수록 다른 변수도 커짐
- 음의 상관: 한 변수가 커질수록 다른 변수는 작아짐
- 강도
- 점들이 직선에 얼마나 가깝게 모여 있는지
- 퍼져 있으면 약한 상관, 직선에 가깝게 몰리면 강한 상관
3. 상관계수의 의미
- 피어슨 상관계수 (r)
- 연속형 변수 간 **선형관계** 측정
- 값의 범위: -1 ~ +1
- 스피어만 상관계수
상관계수 해석 기준
- 0.00 ~ 0.20: 거의 없음
- 0.20 ~ 0.40: 낮음
- 0.40 ~ 0.60: 중간 정도 있음
- 0.60 ~ 0.80: 높음
- 0.80 ~ 1.00: 매우 높음
예시 해석:
- r = 0.75 → 양의 강한 상관
- r = -0.10 → 상관 거의 없음
- r = -0.55 → 음의 중간 정도 상관
4. 가설 설정과 검정
- 귀무가설($H_0$): 두 변수 사이에는 선형관계가 없다 (r=0)
- 연구가설($H_a$): 두 변수 사이에는 선형관계가 있다 (r≠0)
- 검정 방법:
- 표본 상관계수를 계산하고, 유의확률(p-value) 확인
- p < 0.05 → 귀무가설 기각 → “상관관계가 있다” 결론
- 상관관계분석은 두 변수의 관계 방향과 강도를 수치(r)로 표현
- **산점도**를 먼저 보고, **상관계수**로 강도 확인
- 상관은 **인과**가 아니라 “함께 움직이는 정도”
- 검정 결과(p-value)로 유의미한 상관인지 판단
상관관계분석 실습: 피어슨 상관관계
1. 실습 목표
- 두 변수(훈련시간, 생산성) 간의 **상관관계**를 이해하고 직접 계산해본다.
- 산점도로 관계를 시각화하고, 피어슨 상관계수와 p-값을 통해 통계적으로 해석한다.
- 상관이 **인과관계와 다르다**는 점을 다시 확인한다.
2. 실습 데이터
- 데이터:
- 독립변수 → 훈련시간(시간 단위)
- 종속변수 → 생산성(점수, 단위 없음)
- 설정: “훈련 시간이 길수록 생산성이 높아질까?”
import pandas as pd
# 데이터 준비
data = {
'훈련시간': [10, 20, 30, 40, 50, 60, 70],
'생산성': [40, 45, 50, 65, 70, 70, 80]
}
df = pd.DataFrame(data)
print(df)
3. 산점도 시각화
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(8, 6))
sns.scatterplot(x='훈련시간', y='생산성', data=df, s=100)
plt.title('훈련시간과 생산성 간의 상관관계')
plt.xlabel('훈련시간(시간)')
plt.ylabel('생산성(점수)')
plt.grid(True)
plt.show()
- 산점도 해석:
- 점들이 **오른쪽 위 방향으로 모여 있음** → 양의 관계
- 직선에 가까움 → 관계가 강함
4. 피어슨 상관계수 계산
from scipy.stats import pearsonr
# 상관계수 및 p-값 계산
corr, p_value = pearsonr(df['훈련시간'], df['생산성'])
print(f"피어슨 상관계수 (r): {corr:.3f}")
print(f"p-값: {p_value:.3f}")
# 통계적 유의성 판단
if p_value < 0.05:
print("→ p < 0.05: 두 변수는 통계적으로 유의한 상관관계가 있음")
else:
print("→ p ≥ 0.05: 통계적으로 유의한 상관관계가 없음")
# 관계 방향 해석
if corr > 0:
print("→ 양의 상관: 훈련시간이 길수록 생산성이 높아짐")
elif corr < 0:
print("→ 음의 상관: 훈련시간이 길수록 생산성이 낮아짐")
else:
print("→ 상관 없음: 선형적 관계가 거의 없음")
5. 결과 해석
- 계산 예시:
- 상관계수 $r \approx 0.98$ → **매우 강한 양의 상관관계**
- p-값 < 0.05 → **통계적으로 유의**
- 해석:
- 훈련시간이 늘어날수록 생산성이 높아지는 경향이 있다.
- 다만, 이는 “상관”일 뿐, “훈련시간이 생산성을 높인다”라는 **인과관계**를 증명하는 것은 아니다.
- 예: 훈련 시간이 긴 사람일수록 본래 성실했을 가능성도 있음.
- 상관계수는 **방향(+)과 강도**를 보여줌
- p-값으로 “통계적으로 유의한 상관인지” 확인
- 상관 ≠ 인과!
- 실제 연구에서는 상관분석을 시작으로, 인과분석(회귀, 실험)이 이어진다.
상관관계분석 실습: 스피어만 상관관계
1. 실습 목표
- **서열형 데이터(5점 척도)**에서 두 변수 간 상관을 분석하는 방법을 익힌다.
- 피어슨 상관과의 차이를 이해한다.
- “직무내용 만족도 ↔ 전반적 직장 만족도” 관계를 예시로 분석한다.
2. 실습 데이터
- 데이터:
- 변수1: 직무내용에 대한 만족도 (1~5점 척도)
- 변수2: 전반적 직장 만족도 (1~5점 척도)
- 척도가 **서열형(순위 데이터)**이므로 → **스피어만 상관계수 사용**
import pandas as pd
# 예시 데이터 (5점 척도, 10명)
data_satisfaction = {
'직무내용_만족도': [5, 4, 3, 2, 1, 5, 4, 3, 2, 1],
'전반적_만족도': [5, 4, 3, 2, 1, 4, 3, 2, 1, 1]
}
df_satisfaction = pd.DataFrame(data_satisfaction)
print(df_satisfaction)
3. 스피어만 상관계수 계산
from scipy.stats import spearmanr
# 스피어만 상관계수 및 p-값 계산
corr_s, p_value_s = spearmanr(df_satisfaction['직무내용_만족도'],
df_satisfaction['전반적_만족도'])
print(f"스피어만 상관계수 (rho): {corr_s:.3f}")
print(f"p-값: {p_value_s:.3f}")
# 통계적 유의성 판정
if p_value_s < 0.05:
print("→ p < 0.05: 두 변수는 통계적으로 유의한 상관관계가 있음")
else:
print("→ p ≥ 0.05: 통계적으로 유의한 상관관계가 없음")
# 관계 방향 해석
if corr_s > 0:
print("→ 양의 상관: 직무내용 만족도가 높을수록 전반적 만족도도 높음")
elif corr_s < 0:
print("→ 음의 상관: 직무내용 만족도가 높을수록 전반적 만족도는 낮음")
else:
print("→ 두 변수 간에 선형적 관계 없음")
4. 결과 해석
- 계산 예시:
- 스피어만 상관계수 $\rho \approx 0.557$
- p-값 < 0.05
- 해석:
- 두 변수 사이에 **중간 정도의 양의 상관관계** 존재
- 즉, **직무내용에 만족하는 사람이 전반적으로 직장에도 만족할 가능성이 높음**
5. 수업 정리 & 토론
- **피어슨 vs 스피어만**
- 피어슨: 연속형, 정규성/선형성 가정 필요
- 스피어만: 순위형·서열형, 비선형에도 강건
- 실제 연구 활용 예:
- 만족도 조사, 설문(5점/7점 척도) → 스피어만 적합
- 토론 질문:
- “왜 피어슨 대신 스피어만을 써야 했을까?”
- “만약 데이터가 정규분포 점수였다면 결과가 달라질까?”
피어슨 vs 스피어만 비교 실습
1. 학습 목표
- 피어슨 상관계수와 스피어만 상관계수의 **차이와 공통점** 이해
- 같은 데이터에 대해 두 방법을 적용해 비교
- 어떤 상황에서 각각을 써야 하는지 학습
2. 개념 비교
| 구분 |
피어슨 상관계수 |
스피어만 상관계수 |
| 데이터 유형 |
연속형 변수 |
서열형(순위형) 변수 |
| 관계 측정 |
**선형 관계** |
**순위 기반(단조 관계)** |
| 가정 |
정규성·등분산성 필요 |
가정이 덜 엄격함 |
| 해석 범위 |
-1 ~ +1 |
-1 ~ +1 |
| 활용 예시 |
시험 점수, 키·몸무게 |
만족도(5점 척도), 순위 데이터 |
3. 실습 데이터
import pandas as pd
# 예시 데이터
data_compare = {
'훈련시간': [10, 20, 30, 40, 50, 60, 70],
'생산성': [40, 45, 50, 65, 70, 70, 80], # 연속형: 피어슨 적합
'직무만족도': [5, 4, 3, 2, 1, 5, 4, 3, 2, 1], # 서열형: 스피어만 적합
'전반만족도': [5, 4, 3, 2, 1, 4, 3, 2, 1, 1]
}
df_compare = pd.DataFrame(data_compare)
4. Python 실습
from scipy.stats import pearsonr, spearmanr
# (1) 피어슨 상관 (훈련시간-생산성)
r_p, p_p = pearsonr(df_compare['훈련시간'], df_compare['생산성'])
print(f"[피어슨] 훈련시간 vs 생산성 → r={r_p:.3f}, p={p_p:.3f}")
# (2) 스피어만 상관 (직무만족도-전반만족도)
r_s, p_s = spearmanr(df_compare['직무만족도'], df_compare['전반만족도'])
print(f"[스피어만] 직무만족도 vs 전반만족도 → rho={r_s:.3f}, p={p_s:.3f}")
5. 결과 해석
- 피어슨: `r ≈ 0.98`, p < 0.05 → 훈련시간↑ → 생산성↑ (**매우 강한 양의 선형 상관**)
- 스피어만: `rho ≈ 0.56`, p < 0.05 → 직무만족도↑ → 전반만족도↑ (**중간 정도 양의 순위 상관**)
6. 정리 & 토론
- **피어슨**은 연속형 데이터의 **선형성** 확인에 적합
- **스피어만**은 순위·서열 데이터, 비선형이더라도 단조 관계 확인에 적합
- 실제 연구에서는 **데이터 성격에 맞는 방법** 선택해야 함
토론 질문
- 설문조사 만족도(1~5점)를 피어슨으로 분석하면 어떤 문제가 생길까?
- 피어슨과 스피어만이 같은 방향의 결과를 주더라도 해석에서 어떤 차이가 있을까?