2025년 2학기 계량분석 강의자료

10주차: 상관관계분석의 이해

1. 상관관계분석 개요



2. 산점도를 통한 관계 시각화


3. 상관계수의 의미

상관계수 해석 기준

예시 해석:


4. 가설 설정과 검정

  • 상관관계분석은 두 변수의 관계 방향과 강도를 수치(r)로 표현
  • **산점도**를 먼저 보고, **상관계수**로 강도 확인
  • 상관은 **인과**가 아니라 “함께 움직이는 정도”
  • 검정 결과(p-value)로 유의미한 상관인지 판단

상관관계분석 실습: 피어슨 상관관계


1. 실습 목표


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. 결과 해석

  • 상관계수는 **방향(+)과 강도**를 보여줌
  • p-값으로 “통계적으로 유의한 상관인지” 확인
  • 상관 ≠ 인과!
  • 실제 연구에서는 상관분석을 시작으로, 인과분석(회귀, 실험)이 이어진다.

상관관계분석 실습: 스피어만 상관관계


1. 실습 목표


2. 실습 데이터

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. 결과 해석


5. 수업 정리 & 토론

피어슨 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. 결과 해석


6. 정리 & 토론

토론 질문