Summary

두 집단 간 평균 차이를 표준편차 단위로 표준화한 effect size 지표. “두 집단의 분포가 얼마나 겹치는가?”를 나타낸다.

용어 설명

  • 표준화 (Standardization): 평균 차이를 표준편차로 나누어 단위에 무관한 비교가 가능하게 하는 것
  • Pooled SD (, 합동 표준편차): 두 집단의 표준편차를 표본 크기에 따라 가중 평균한 값. 두 집단의 변동성을 하나로 통합
  • 분포 겹침 (Overlap): 두 집단의 분포가 얼마나 겹치는지. d가 클수록 겹침이 적음 → 집단 차이가 뚜렷
  • 소표본 편향 (Small-sample bias): 표본이 작을 때 Cohen’s d가 실제보다 크게 추정되는 경향. Hedges’ g로 보정

Cohen’s d

수식

Independent samples (독립 표본)

수식 변수 풀이

  • : 각 집단의 표본 평균
  • : 합동 표준편차 (Pooled SD) — 두 집단의 SD를 하나로 통합한 값
  • 직관: “두 평균의 차이가 표준편차 몇 개분인가?” → d = 0.5면 반 개분 차이

여기서 pooled standard deviation:

수식 변수 풀이

  • : 각 집단의 표본 크기
  • : 각 집단의 분산 (표준편차의 제곱)
  • : 자유도 기반 가중치 — 표본이 큰 집단의 분산에 더 큰 비중
  • : 전체 자유도 — 분모로 사용하여 불편추정량(unbiased estimator)을 구성

Paired samples (대응 표본)

  • : 차이 점수의 평균
  • : 차이 점수의 표준편차

해석 기준 (Cohen, 1988)

d 값해석분포 겹침 (overlap)
0.2Small약 85%
0.5Medium약 67%
0.8Large약 53%

구체적 해석

d = 0.5라면, 실험 집단의 평균이 통제 집단 분포의 69번째 백분위수에 해당한다.
즉, 실험 집단의 “평균적인 사람”이 통제 집단의 69%보다 높은 점수를 받았다는 의미.


Hedges’ g: 소표본 보정

Cohen’s d는 소표본에서 effect size를 과대추정하는 편향이 있다. Hedges’ g는 보정 계수를 적용:

수식 변수 풀이

  • : Hedges’ g — 소표본 편향을 보정한 Cohen’s d
  • 괄호 안의 값: 보정 계수 (항상 1보다 약간 작음) → d를 살짝 줄여줌
  • 표본이 클수록 보정 계수가 1에 가까워져
  • n < 20일 때 Hedges’ g 사용 권장
  • 대표본에서는 d ≈ g

Glass’s Δ

두 집단의 표준편차가 크게 다를 때, 통제 집단의 SD만 분모로 사용:

수식 변수 풀이

  • : 통제 집단의 표준편차만 분모로 사용. 실험 처치가 분산 자체를 바꿀 수 있을 때 적절

d와 r의 변환

수식 변수 풀이

  • : 상관계수 (Pearson’s r 또는 point-biserial r) — -1~1 범위
  • 변환 활용: Mann-Whitney U test 등에서 r로 보고된 효과를 d로 재해석할 때 유용

Implementation

import pingouin as pg
from scipy import stats
 
# pingouin — 자동으로 Cohen's d 계산
result = pg.ttest(group1, group2, paired=False)
print(f"Cohen's d = {result['cohen-d'].values[0]:.3f}")
 
# Hedges' g (pingouin)
result = pg.ttest(group1, group2, paired=False, correction='hedges')
print(f"Hedges' g = {result['cohen-d'].values[0]:.3f}")  # hedges 보정 적용됨
 
# 수동 계산
import numpy as np
mean_diff = np.mean(group1) - np.mean(group2)
n1, n2 = len(group1), len(group2)
sp = np.sqrt(((n1-1)*np.var(group1, ddof=1) + (n2-1)*np.var(group2, ddof=1)) / (n1+n2-2))
d = mean_diff / sp
print(f"Cohen's d (manual) = {d:.3f}")

관련 문서