점이연 상관과 파이 계수¶
Pearson 상관계수는 두 연속형 변수에 대해 정의되지만, 실무의 많은 상황에는 이진(이분) 변수가 등장한다. 한쪽 또는 양쪽이 이진일 때에도 Pearson 공식이 그대로 적용되며, 고유한 이름과 해석을 갖는 특수한 계수가 나온다. 점이연 계수는 이진 변수 하나와 연속형 변수 하나의 경우를, 파이 계수는 두 이진 변수의 경우를 다룬다.
점이연 상관¶
동기¶
이진 집단 변수(예: 처치 대 대조)와 연속형 결과(예: 시험 점수) 사이의 연관을 재고 싶다고 하자. 점이연 상관은 두 집단 사이에서 연속형 변수가 얼마나 다른지를 익숙한 \([-1, 1]\) 척도로 수치화한다.
정의 1. 점이연 상관계수¶
이진 변수를 \(X \in \{0, 1\}\)로 부호화하고 집단 0에 \(n_0\)개, 집단 1에 \(n_1\)개의 관측값이 있으며 \(n = n_0 + n_1\)이라 하자. \(Y\)를 연속형 변수라 하면 점이연 상관은
이다. 여기서 \(\bar{Y}_0\)과 \(\bar{Y}_1\)은 \(Y\)의 집단 평균이고, \(S_Y\)는 \(Y\) 전체의 표준편차이다. Pearson 상관과 정확히 일치하려면 \(S_Y\)를 \(n\)으로 나눈 형태 \(S_Y = \sqrt{\frac{1}{n}\sum (Y_i - \bar{Y})^2}\)로 잡아야 한다.
\(X\)가 0과 1만 취할 때 이는 \(X\)와 \(Y\) 사이의 Pearson 상관과 대수적으로 동일하다.
이표본 t-검정과의 연결¶
점이연 상관은 이표본 t-검정통계량과 직접 관련된다. \(t\)가 자유도 \(n - 2\)의 등분산 이표본 t-통계량이면
이다. 따라서 \(H_0\!: r_{pb} = 0\)을 검정하는 것은 이표본 t-검정으로 \(H_0\!: \mu_0 = \mu_1\)을 검정하는 것과 동치이다.
해석¶
- \(r_{pb} > 0\): 집단 1의 \(Y\) 값이 더 큰 경향이 있다.
- \(r_{pb} < 0\): 집단 0의 \(Y\) 값이 더 큰 경향이 있다.
- \(r_{pb} = 0\): 두 집단의 평균에 차이가 없다.
- \(r_{pb}^2\): \(Y\)의 분산 중 집단 소속으로 설명되는 비율.
파이 계수¶
동기¶
두 변수가 모두 이진일 때(예: 성별과 합격/불합격) \(2 \times 2\) 분할표에 대한 연관 측도가 필요하다. 파이 계수는 두 이진 변수 사이의 Pearson 상관이며 연관의 강도를 재는 자연스러운 측도이다.
정의 2. 파이 계수¶
\(2 \times 2\) 표를 생각하자:
| \(Y = 1\) | \(Y = 0\) | 합계 | |
|---|---|---|---|
| \(X = 1\) | \(a\) | \(b\) | \(a + b\) |
| \(X = 0\) | \(c\) | \(d\) | \(c + d\) |
| 합계 | \(a + c\) | \(b + d\) | \(n\) |
파이 계수는
이며, 이는 \(X\)와 \(Y\)를 0/1로 부호화한 자료에 대해 계산한 Pearson 상관과 대수적으로 동일하다.
카이제곱과의 연결¶
파이 계수는 \(2 \times 2\) 표의 Pearson 카이제곱 통계량과 관련된다:
따라서
이며 부호는 연관의 방향으로 정한다(\(ad > bc\)이면 \(\phi > 0\)).
\(H_0\!: \phi = 0\)을 검정하는 것은 \(2 \times 2\) 표의 카이제곱 독립성 검정과 동치이다.
성질¶
-
범위. \(-1 \le \phi \le 1\)이지만, \(\phi\)가 \(\pm 1\)에 도달할 수 있는 것은 \(X\)와 \(Y\)의 주변분포가 같을 때뿐이다(즉 \(a + b = a + c\)이고 \(c + d = b + d\)일 때).
-
도달 가능한 최댓값. 주변분포가 다르면 \(|\phi|\)가 \(1\)보다 작은 값으로 제한된다. 최댓값은 주변 비율에 달려 있다.
-
대칭성. \(\phi_{XY} = \phi_{YX}\).

이진 변수가 끼어드는 순간 상관계수에는 천장이 생긴다. 두 계수 모두에서 그렇고, 이유도 같다. 이진 변수의 분산이 \(p(1-p)\)로 묶여 있어 비율이 한쪽으로 쏠리면 분산 자체가 작아지기 때문이다.
왼쪽은 점이연 상관이다. 가로축은 집단 1의 비율 \(n_1/n\)이고, 세 곡선은 두 집단의 표준화 평균차 \(d\)를 각각 \(0.5\), \(1.0\), \(2.0\)으로 고정한 경우다. 여기서 \(d\)는 고정되어 있음에 유의하라. 집단 차이의 실질적 크기는 곡선을 따라가는 내내 똑같은데도 \(r_{pb}\)는 \(p = 0.5\)에서 최댓값을 찍고 양옆으로 떨어진다. \(d = 1\)이면 정확히 반반으로 나뉠 때 \(r_{pb} = 0.447\)이 최대이고, 10 대 90으로 나뉘면 같은 \(d\)에서도 \(0.287\)까지 내려간다. \(d = 2\)처럼 아주 큰 차이여도 반반일 때 \(0.707\)을 넘지 못한다. \(r_{pb}\)가 작다고 집단 차이가 작은 것이 아니다. 희귀한 처치군이나 불균형 설계에서는 효과크기 \(d\)를 따로 보고해야 하는 이유가 여기 있다.
오른쪽은 파이 계수의 천장을 두 주변비율 \(P(X=1)\)과 \(P(Y=1)\)의 함수로 그린 것이다. 성질 2가 말한 대로 대각선 위, 곧 두 주변비율이 같을 때만 \(1\)에 닿을 수 있고 거기서 멀어질수록 급격히 낮아진다. 식으로는 \(p \le q\)일 때
이다. 보기 2의 표는 \(p = 90/200 = 0.45\), \(q = 100/200 = 0.50\)이므로 천장이 \(0.905\)이고, 관측된 \(\phi = 0.301\)은 그 천장의 \(33\%\)에 해당한다. 반면 \(P(X=1) = 0.05\)처럼 드문 사건이면 상대방이 어떻든 천장이 \(0.229\)로 주저앉는다.
그래서 파이 계수를 표들 사이에서 비교하려면 주변분포가 비슷해야 한다. 희귀 질환과 노출을 다루는 표에서 \(\phi = 0.2\)는 "약한 연관"이 아니라 거의 천장에 닿은 값일 수 있다. 이런 경우에는 \(\phi\)를 천장으로 나눈 \(\phi/|\phi|_{\max}\)를 보고하거나, 주변분포에 영향을 덜 받는 오즈비를 함께 쓰는 것이 낫다.
보기 1. 점이연 상관. 어떤 연구자가 학생 10명을 스터디 그룹(\(X = 1\)) 또는 무개입(\(X = 0\))에 배정하고 시험 점수를 기록했다:
| 집단 (\(X\)) | 점수 (\(Y\)) |
|---|---|
| 0 | 65, 70, 68, 72, 66 |
| 1 | 78, 82, 85, 80, 76 |
계산하면 \(\bar{Y}_0 = 68.2\), \(\bar{Y}_1 = 80.2\), \(S_Y = 6.65\)(\(n\)으로 나눈 표준편차), \(n_0 = n_1 = 5\), \(n = 10\)이다.
풀이
강한 양의 \(r_{pb}\)는 스터디 그룹의 점수가 상당히 높았음을 나타낸다.
보기 2. 파이 계수. 어떤 조사가 200명에게 운동 습관(\(X\): 규칙적으로 운동함)과 수면의 질(\(Y\): 잘 잔다고 보고함)을 물었다:
| 잘 잠 (\(Y=1\)) | 못 잠 (\(Y=0\)) | 합계 | |
|---|---|---|---|
| 운동함 (\(X=1\)) | 60 | 30 | 90 |
| 운동 안 함 (\(X=0\)) | 40 | 70 | 110 |
| 합계 | 100 | 100 | 200 |
풀이
규칙적인 운동과 좋은 수면의 질 사이에 중간 정도의 양의 연관이 있다.
더 큰 표를 위한 관련 측도¶
파이 계수는 \(2 \times 2\) 표에 특화되어 있다. 더 큰 분할표에는 다음과 같은 관련 측도가 있다:
- Cramér의 V: \(V = \sqrt{\chi^2 / (n \cdot \min(r-1, c-1))}\)으로 파이를 \(r \times c\) 표로 일반화한다.
- 분할계수: \(C = \sqrt{\chi^2 / (\chi^2 + n)}\)이며 위로 1보다 작은 값에서 제한된다.
이들은 카이제곱 검정 장에서 다룬다.
보기 3. 점이연상관과 파이계수. 보기 1 의 점수 자료와 보기 2 의 \(2\times2\) 표를 코드로 다룬다. 두 계수는 이름만 다른 피어슨 상관이라는 것을 확인한다.
(1) \(X \in \{0,1\}\) 이고 \(Y\) 가 연속일 때, 0/1 에 피어슨 공식을 그대로 넣으면 점이연 공식
이 나옴을 보이시오(\(S_Y\) 는 \(n\) 으로 나눈 표준편차).
(2) \(X, Y\) 가 모두 0/1 일 때 피어슨 상관이 파이계수가 되고 \(\chi^2 = n\phi^2\) 임을 보이시오.
(3) 모집단 수준에서 \(p = P(X=1)\), \(d = (\mu_1-\mu_0)/\sigma\) 라 할 때
임을 보이시오. 보기 1 의 자료에서 이 식이 맞는가. 보기 2 의 \(\phi\) 는 천장의 몇 배인가.
(4) 코드로 확인하시오.
풀이
(1) 0/1 을 넣어 보면 저절로 나온다. \(X\) 가 \(n_1\) 번 1 이고 \(n_0\) 번 0 이면 \(\bar X = n_1/n\) 이고
이다. 다음은 \(S_{XY}\) 다. \(X=1\) 인 사람은 \(x\) 편차가 \(1 - n_1/n = n_0/n\), \(X=0\) 인 사람은 \(-n_1/n\) 이므로
다. \(\bar Y\) 가 깨끗이 사라진다. 마지막으로 \(S_{YY} = n S_Y^2\) 이므로
이고 \(\sqrt{n_0n_1}/n = \sqrt{n_0n_1/n^2}\) 이므로 주장한 식이다. \(\square\)
점이연 상관은 새로운 계수가 아니다. 0/1 변수에 피어슨을 쓰면 식이 저절로 저 꼴로 정리될 뿐이다.
(2) 둘 다 0/1 이면 파이계수. 표를 \(2\times2\) 로 적는다(\(a\): \(X=1,Y=1\) 등).
\(XY = 1\) 인 사람은 \(a\) 명뿐이므로 \(\sum X_iY_i = a\) 이고
다(10장 독립성 검정에서 본 것과 같은 계산이다). (1)의 \(S_{XX} = n_0n_1/n\) 을 두 변수에 각각 쓰면
이므로
다. 그리고 10장에서 본 \(2\times2\) 닫힌 꼴이 \(\chi^2 = n(ad-bc)^2/\{(a+b)(c+d)(a+c)(b+d)\}\) 였으므로
이다. \(\square\) 카이제곱을 \(n\) 으로 나누고 제곱근을 씌우면 피어슨 상관이 나온다는 뜻이고, 크래머 \(V\) 가 이것의 일반화다.
(3) 모집단 꼴과 천장. \(X \sim \text{Bern}(p)\) 이고 두 집단의 \(Y\) 분산이 모두 \(\sigma^2\), 평균이 \(\mu_0, \mu_1\) 이라 하자. \(\Delta = \mu_1-\mu_0\) 이라 두면
이다(마지막은 전분산 공식 — 집단 안의 분산 \(\sigma^2\) 에 집단 평균의 분산 \(p(1-p)\Delta^2\) 을 더한 것이다). 따라서
이고 분자·분모를 \(\sigma\sqrt{p(1-p)}\) 로 나누면 \(d = \Delta/\sigma\) 로
이다. \(\square\) \(p = 1/2\) 이면 \(1/\{p(1-p)\} = 4\) 라서 \(\rho_{pb} = d/\sqrt{d^2+4}\) 이고, 이것이 앞 그림의 가운데 곡선이다. \(d\) 가 아무리 커도 \(\rho_{pb} < 1\) 이고, \(p\) 가 치우치면 \(1/\{p(1-p)\}\) 가 커져 같은 \(d\) 에서도 \(\rho_{pb}\) 가 주저앉는다.
보기 1 의 자료로 확인한다. 두 집단 안의 표준편차(\(n\) 으로 나눈 것)를 묶으면 \(\sigma = 2.856571\), \(\Delta = 12\) 이므로 \(d = 4.200840\) 이고 \(p = 1/2\) 다.
로 (1)이 준 \(r_{pb} = 0.902894\) 와 여섯째 자리까지 같다.
보기 2 의 \(\phi\) 는 천장의 정확히 3분의 1 이다. 먼저 \(\phi\) 를 깔끔하게 적으면
이고 \(\chi^2 = n\phi^2 = 200/11 = 18.1818\) 이다. 한편 \(p = 90/200 = 0.45 \le q = 100/200 = 0.5\) 이므로 천장은
다. 둘 다 \(\sqrt{11}\) 이 분모에 있으므로
정확히 \(1/3\) 이다. \(\phi = 0.30\) 이 "약한 연관" 으로 보이지만, 주변분포가 허락하는 최대치의 3분의 1 이라고 적으면 인상이 달라진다.
(4) 수치적으로.
import numpy as np
from scipy import stats
# 점이연상관: 한쪽이 이분변수(0/1), 다른 쪽이 연속변수인 경우다.
group = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
scores = np.array([65, 70, 68, 72, 66, 78, 82, 85, 80, 76])
r_pb, p_val = stats.pointbiserialr(group, scores)
print(f"Point-biserial r = {r_pb:.4f}, p-value = {p_val:.4f}")
# 사실 점이연상관은 0/1 에 그대로 피어슨을 쓴 것과 같다. 이름만 다를 뿐이다.
r_pearson, _ = stats.pearsonr(group, scores)
print(f"Pearson r = {r_pearson:.4f}")
# 파이계수: 양쪽이 모두 이분변수인 경우다. 2x2 표에서 카이제곱을 전체
# 도수로 나눈 뒤 제곱근을 취하면 나온다. 이 또한 0/1 에 대한 피어슨과 같다.
table = np.array([[60, 30], [40, 70]])
chi2, p, dof, expected = stats.chi2_contingency(table, correction=False)
phi = np.sqrt(chi2 / table.sum())
print(f"Phi coefficient = {phi:.4f}")
# (1) 점이연 공식과 직접 비교
n0, n1, N = 5, 5, 10
m0, m1 = scores[:5].mean(), scores[5:].mean()
S_Y = scores.std(ddof=0)
print(f"\n(1) (m1-m0)/S_Y * sqrt(n0*n1/n^2)"
f" = ({m1:.1f}-{m0:.1f})/{S_Y:.6f} * {np.sqrt(n0 * n1 / N**2):.1f}"
f" = {(m1 - m0) / S_Y * np.sqrt(n0 * n1 / N**2):.6f}")
# (2) 파이계수는 0/1 자료에 그대로 피어슨을 쓴 것이다
(a, b), (c, d) = table
xs = np.r_[np.ones(a + b), np.zeros(c + d)]
ys = np.r_[np.ones(a), np.zeros(b), np.ones(c), np.zeros(d)]
print(f"\n(2) 0/1 자료의 피어슨 {stats.pearsonr(xs, ys)[0]:.6f}")
print(f" (ad-bc)/sqrt(...) "
f"{(a * d - b * c) / np.sqrt((a + b) * (c + d) * (a + c) * (b + d)):.6f}")
print(f" chi2 = {chi2:.6f} n*phi^2 = {table.sum() * phi**2:.6f}"
f" 200/11 = {200 / 11:.6f}")
# (3) 모집단 꼴과 천장
sigma = np.sqrt((((scores[:5] - m0)**2).sum() + ((scores[5:] - m1)**2).sum()) / N)
d_eff = (m1 - m0) / sigma
print(f"\n(3) sigma = {sigma:.6f} d = {d_eff:.6f}"
f" d/sqrt(d^2+4) = {d_eff / np.sqrt(d_eff**2 + 4):.6f}")
pp, qq = (a + b) / table.sum(), (a + c) / table.sum()
ceiling = np.sqrt(pp * (1 - qq) / (qq * (1 - pp)))
print(f" phi = 1/sqrt(11) = {1 / np.sqrt(11):.6f}"
f" 천장 3/sqrt(11) = {ceiling:.6f} 비 {phi / ceiling:.6f}")
출력:
Point-biserial r = 0.9029, p-value = 0.0003
Pearson r = 0.9029
Phi coefficient = 0.3015
(1) (m1-m0)/S_Y * sqrt(n0*n1/n^2) = (80.2-68.2)/6.645299 * 0.5 = 0.902894
(2) 0/1 자료의 피어슨 0.301511
(ad-bc)/sqrt(...) 0.301511
chi2 = 18.181818 n*phi^2 = 18.181818 200/11 = 18.181818
(3) sigma = 2.856571 d = 4.200840 d/sqrt(d^2+4) = 0.902894
phi = 1/sqrt(11) = 0.301511 천장 3/sqrt(11) = 0.904534 비 0.333333
점이연 상관과 Pearson 상관이 정확히 같다. 점이연 상관은 별개의 공식이 아니라, 한 변수가 0/1일 때의 Pearson 상관에 붙인 이름일 뿐이다. (1)의 손계산 0.902894 가 pointbiserialr 과 pearsonr 둘 다와 같다.
(2)도 세 길이 한 점에서 만난다. 0/1 자료에 그냥 피어슨을 쓴 값, 파이계수 공식, 그리고 \(\sqrt{\chi^2/n}\) 이 모두 0.301511 이다. \(\chi^2 = 18.181818\) 과 \(n\phi^2\), 그리고 유리수 \(200/11\) 도 여섯째 자리까지 같다.
(3)에서 모집단 꼴 d/sqrt(d^2+4) = 0.902894 가 표본 \(r_{pb}\) 와 정확히 일치한다. 집단 안의 표준편차를 \(n\) 으로 나눈 것으로 맞추었기 때문이다. 그리고 \(\phi\) 대 천장의 비가 0.333333, 곧 정확히 \(1/3\) 이다.
파이 계수도 마찬가지로 두 이진 변수에 대한 Pearson 상관과 같다. 값이 0.30으로 작은 것은 다른 자료(\(2 \times 2\) 표)를 쓰기 때문이지 계수의 성질 때문이 아니다.
연습문제¶
연습문제 1. 성별(0 = 여성, 1 = 남성)과 시험 점수 사이의 점이연 상관을 계산하라. 자료는 여성 \(\{78, 82, 85, 88\}\), 남성 \(\{90, 92, 88, 95\}\)이다.
풀이
\(X\) = 성별(0/1), \(Y\) = 점수라 하자. 여성 평균 \(\bar{Y}_0 = 83.25\), 남성 평균 \(\bar{Y}_1 = 91.25\), 전체 평균 \(\bar{Y} = 87.25\), \(n_0 = n_1 = 4\), \(n = 8\)이다.
점이연 상관은
이며 \(S_Y\)는 \(n\)으로 나눈 표준편차이다.
\(\sum(Y_i - 87.25)^2 = 85.5625 + 27.5625 + 5.0625 + 0.5625 + 7.5625 + 22.5625 + 0.5625 + 60.0625 = 209.5\)
\(S_Y = \sqrt{209.5/8} = \sqrt{26.1875} = 5.117\)
scipy.stats.pointbiserialr가 주는 값과 일치한다.
연습문제 2. 점이연 상관이 이진 변수와 연속형 변수 사이의 Pearson 상관과 동등함을 보여라.
풀이
\(X \in \{0, 1\}\)이고 \(P(X = 1) = p = n_1/n\)이라 하자. Pearson 상관은
이다. \(\bar{X} = p\)이므로 집단 1에서는 \((X_i - p) = 1 - p\), 집단 0에서는 \(-p\)이다. 분자는
가 된다. \(\sum_{i \in \text{group 1}}(Y_i - \bar{Y}) = n_1(\bar{Y}_1 - \bar{Y})\)이고 집단 0도 마찬가지이므로 이는 \(n \cdot p(1-p)(\bar{Y}_1 - \bar{Y}_0)\)으로 단순해진다. 분모에는 \(\sqrt{n \cdot p(1-p) \cdot \sum(Y_i - \bar{Y})^2}\)이 들어가고, 그 비가 점이연 공식을 준다. \(\square\)
연습문제 3. 다음 \(2 \times 2\) 표에 대해 파이 계수를 계산하라:
| 합격 | 불합격 | |
|---|---|---|
| 공부함 | 40 | 10 |
| 공부 안 함 | 20 | 30 |
풀이
칸이 \(a, b, c, d\)인 \(2 \times 2\) 표에서 \(a = 40, b = 10, c = 20, d = 30\)이다.
파이 계수 0.41은 공부와 합격 사이에 중간 정도의 양의 연관이 있음을 나타낸다.
연습문제 4. \(2 \times 2\) 표에서 파이 계수와 카이제곱 검정통계량의 관계를 설명하라. 하나로부터 다른 하나를 어떻게 얻는가?
풀이
파이 계수와 카이제곱 통계량은 직접 관련된다:
여기서 \(n\)은 전체 표본크기이다. 연습문제 3에서 \(\phi = 0.408\), \(n = 100\)이므로
이다. 즉 파이 계수는 카이제곱 통계량을 정규화한 값이다. \(\chi^2\)은 표본크기에 의존하지만(같은 연관이라도 \(n\)이 크면 \(\chi^2\)이 커진다) \(\phi\)는 척도에 자유롭고 \(-1\)과 \(1\) 사이에 있다. 자유도 1의 카이제곱 검정과 \(\phi = 0\)의 검정은 동치이다.
연습문제 5. 점이연 상관은 \(\pm1\)에 도달할 수 있는가? 집단 비율이 치우치면 어떻게 되는지 보여라.
풀이
공식. 두 집단의 표준화 차이를 \(d\), 한 집단의 비율을 \(p\)(\(q=1-p\))라 하면
import numpy as np
print("두 집단이 아무리 떨어져도 (d 를 키워도) |r_pb| 의 한계")
print(f"{'p (한쪽 비율)':>13s} {'d=2':>8s} {'d=5':>8s} {'d=20':>8s} {'d→∞':>8s}")
for p in [0.5, 0.4, 0.3, 0.2, 0.1, 0.05]:
q = 1 - p
vals = [d * np.sqrt(p * q) / np.sqrt(d**2 * p * q + 1) for d in [2, 5, 20]]
print(f"{p:13.2f} {vals[0]:8.4f} {vals[1]:8.4f} {vals[2]:8.4f} {1.0:8.4f}")
두 집단이 아무리 떨어져도 (d 를 키워도) |r_pb| 의 한계
p (한쪽 비율) d=2 d=5 d=20 d→∞
0.50 0.7071 0.9285 0.9950 1.0000
0.40 0.6999 0.9258 0.9948 1.0000
0.30 0.6757 0.9165 0.9941 1.0000
0.20 0.6247 0.8944 0.9923 1.0000
0.10 0.5145 0.8321 0.9864 1.0000
0.05 0.3996 0.7368 0.9747 1.0000
\(d\to\infty\)이면 \(r_{pb}\to1\)이다. 비율이 아무리 치우쳐도 상한 자체는 1이다.
그러나 현실적인 \(d\)에서는 크게 눌린다.
| \(p\) | \(d=2\)일 때 \(r_{pb}\) |
|---|---|
| 0.50 | 0.707 |
| 0.20 | 0.625 |
| 0.05 | 0.400 |
\(d=2\)는 매우 큰 효과다(두 집단 평균이 2 표준편차 차이). 그런데도 균형 설계에서 \(r_{pb}=0.707\)이 최대다.
\(d=2\), \(p=0.05\)이면 0.400으로 떨어진다. 같은 효과인데 상관계수가 절반이다.
실제 자료로 확인하면.
rng = np.random.default_rng(23001)
print("\n두 집단이 50 표준편차 떨어진 (사실상 완전 분리) 자료")
print(f"{'n1':>4s} {'n2':>4s} {'p':>6s} {'r_pb':>8s}")
for n1, n2 in [(50, 50), (40, 60), (20, 80), (10, 90), (5, 95)]:
x = np.r_[np.zeros(n1), np.ones(n2)]
y = np.r_[rng.normal(0, 1, n1), rng.normal(50, 1, n2)]
print(f"{n1:4d} {n2:4d} {n2 / (n1 + n2):6.2f} {np.corrcoef(x, y)[0, 1]:8.4f}")
두 집단이 50 표준편차 떨어진 (사실상 완전 분리) 자료
n1 n2 p r_pb
50 50 0.50 0.9992
40 60 0.60 0.9991
20 80 0.80 0.9985
10 90 0.90 0.9980
5 95 0.95 0.9961
\(d\)가 충분히 크면 비율과 무관하게 1에 붙는다. 앞 표와 모순되지 않는다. \(d=50\)이면 모든 행에서 \(r\approx1\)이다.
실무적 교훈 셋.
- \(r_{pb}\)를 집단 간 비교에 쓸 때 비율이 다르면 직접 비교할 수 없다.
- \(d\)(코언의 \(d\))가 비율에 영향받지 않으므로 효과크기 보고에는 \(d\)가 낫다.
- \(r_{pb}\)는 "이 집단 변수가 결과 분산의 몇 %를 설명하나"를 볼 때 유용하다.
두 측도의 변환.
보고할 때는 \(p\)를 함께 밝힌다. "\(r_{pb}=0.40\)"만 쓰면 \(d\)가 0.8인지 2.0인지 알 수 없다.
연습문제 6. \(r_{pb}\)와 \(t\) 통계량의 관계를 유도하고 수치로 확인하라.
풀이
항등식.
여기서 \(t\)는 등분산 가정 2표본 \(t\) 통계량이다.
import numpy as np
from scipy import stats
rng = np.random.default_rng(23001)
print(f"{'n1':>4s} {'n2':>4s} {'r_pb':>11s} {'t/√(t²+df)':>13s} {'차이':>10s}")
for _ in range(5):
n1, n2 = rng.integers(10, 40, 2)
a = rng.normal(0, 1, n1)
b = rng.normal(0.8, 1, n2)
x = np.r_[np.zeros(n1), np.ones(n2)]
y = np.r_[a, b]
r = np.corrcoef(x, y)[0, 1]
t = stats.ttest_ind(a, b, equal_var=True).statistic
df = n1 + n2 - 2
ident = -t / np.sqrt(t**2 + df) # b 가 x=1 이므로 부호를 맞춘다
print(f"{n1:4d} {n2:4d} {r:+11.6f} {ident:+13.6f} {abs(r - ident):10.2e}")
n1 n2 r_pb t/√(t²+df) 차이
21 19 +0.448066 +0.448066 1.11e-16
22 17 +0.523646 +0.523646 2.22e-16
21 37 +0.273406 +0.273406 1.11e-16
39 26 +0.280764 +0.280764 1.11e-16
37 15 +0.356779 +0.356779 0.00e+00
기계 오차 수준으로 일치한다.
유도. \(t\) 검정의 \(F=t^2\)이고, 1요인 분산분석에서
집단이 둘이면 \(\eta^2=r_{pb}^2\)이므로
이고 양변에 제곱근을 취하면 된다. \(\square\)
이 항등식의 쓸모 셋.
| 상황 | 활용 |
|---|---|
| 논문에 \(t\)와 \(n\)만 있음 | 효과크기 \(r\)을 복원 |
| 메타분석 | 여러 연구를 공통 척도로 |
| \(r\) 보고 후 유의성 확인 | \(t=r\sqrt{\text{df}/(1-r^2)}\) |
메타분석에서 특히 중요하다. 서로 다른 논문이 \(t\), \(F\), \(d\), \(p\)값을 제각각 보고하는데, 모두 \(r\)로 환산할 수 있다.
마지막 식의 검산. \(d=0.8\)이면 \(r=0.8/\sqrt{0.64+4}=0.371\)이다.
주의 — 이 항등식은 등분산 \(t\)에서만 성립한다. 웰치 \(t\)는 자유도가 정수가 아니므로 그대로 쓸 수 없다.
연습문제 7. 파이 계수는 \(\pm1\)에 도달할 수 있는가? 주변 비율이 다르면 어떻게 되는가?
풀이
파이의 상한. 행 비율이 \(p\), 열 비율이 \(q\)일 때
import numpy as np
from scipy import stats
print("행 비율 p, 열 비율 q 일 때 φ 의 최댓값")
print(f"{'p':>6s} {'q':>6s} {'φ_max':>8s}")
for p, q in [(0.5, 0.5), (0.5, 0.3), (0.5, 0.1),
(0.3, 0.3), (0.2, 0.8), (0.1, 0.9)]:
phi = (min(p, q) - p * q) / np.sqrt(p * (1 - p) * q * (1 - q))
print(f"{p:6.1f} {q:6.1f} {phi:8.4f}")
print("\n실제 표에서 확인 (n=1000, 최대한 겹치게 배치)")
for p, q in [(0.5, 0.5), (0.5, 0.2), (0.2, 0.8)]:
n = 1000
a = int(min(p, q) * n)
T = np.array([[a, int(p * n) - a],
[int(q * n) - a, n - a - (int(p * n) - a) - (int(q * n) - a)]])
chi = stats.chi2_contingency(T, correction=False).statistic
print(f" p={p}, q={q}: 표={T.tolist()}, φ=√(χ²/n)={np.sqrt(chi / n):.4f}")
행 비율 p, 열 비율 q 일 때 φ 의 최댓값
p q φ_max
0.5 0.5 1.0000
0.5 0.3 0.6547
0.5 0.1 0.3333
0.3 0.3 1.0000
0.2 0.8 0.2500
0.1 0.9 0.1111
실제 표에서 확인 (n=1000, 최대한 겹치게 배치)
p=0.5, q=0.5: 표=[[500, 0], [0, 500]], φ=√(χ²/n)=1.0000
p=0.5, q=0.2: 표=[[200, 300], [0, 500]], φ=√(χ²/n)=0.5000
p=0.2, q=0.8: 표=[[200, 0], [600, 200]], φ=√(χ²/n)=0.2500
주변 비율이 같으면(\(p=q\)) \(\varphi\)가 1에 도달한다. 다르면 도달하지 못한다.
| \(p\) | \(q\) | \(\varphi_{\max}\) |
|---|---|---|
| 0.5 | 0.5 | 1.000 |
| 0.3 | 0.3 | 1.000 |
| 0.5 | 0.3 | 0.655 |
| 0.2 | 0.8 | 0.250 |
| 0.1 | 0.9 | 0.111 |
\(p=0.1\), \(q=0.9\)이면 최대 0.111이다. 두 변수가 완벽하게 연관되어도 \(\varphi\)는 0.111을 넘을 수 없다.
왜 그런가. 표의 한 칸이 0이 되어도 주변 합이 강제하는 구조 때문에 완전한 대각선 표를 만들 수 없다.
p=0.1, q=0.9 이면 (n=1000)
행 합: 100 / 900
열 합: 900 / 100
"완벽한 연관"을 만들려 해도 100 과 900 을 맞출 수 없다
→ 최선이 φ = 0.111
실무적 함의 셋.
- 드문 사건의 \(\varphi\)는 작게 나올 수밖에 없다. 0.15를 "약한 연관"이라 부르면 틀릴 수 있다.
- 다른 표들의 \(\varphi\)를 직접 비교하면 안 된다. 주변 비율이 다르면 척도가 다르다.
- \(\varphi/\varphi_{\max}\)(크레이머의 보정)를 함께 보고한다.
대안 측도 셋.
| 측도 | 성질 |
|---|---|
| 오즈비 | 주변 비율과 무관, 범위 \((0,\infty)\) |
| 율의 \(Q\) | 오즈비를 \([-1,1]\)로 |
| 사분상관 | 잠재 정규를 가정, \(\rho\) 복원 |
오즈비가 가장 널리 쓰인다. 주변 비율에 영향받지 않아 연구 간 비교가 가능하다.
연습문제 8. 연속형 변수를 중앙값 분할하면 상관이 얼마나 줄어드는가? 이론값을 도출하고 확인하라.
풀이
두 가지 이론값. 이변량 정규에서 중앙값(= 0)으로 자르면
| 무엇을 자르나 | 결과 |
|---|---|
| \(X\)만 | \(\rho\sqrt{2/\pi}=0.7979\rho\) |
| 둘 다 | \(\dfrac{2}{\pi}\arcsin\rho\) |
import warnings
warnings.filterwarnings("ignore")
import numpy as np
rng = np.random.default_rng(23002)
print(f"{'ρ':>6s} {'원래 r':>8s} {'x 만 분할':>10s} {'이론 ρ√(2/π)':>13s} "
f"{'둘 다 분할':>11s} {'이론 (2/π)arcsin ρ':>19s}")
for rho in [0.2, 0.4, 0.6, 0.8]:
z = rng.standard_normal((300_000, 2))
x = z[:, 0]
y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
xd = (x > np.median(x)).astype(float)
yd = (y > np.median(y)).astype(float)
print(f"{rho:6.2f} {np.corrcoef(x, y)[0, 1]:8.4f} "
f"{np.corrcoef(xd, y)[0, 1]:10.4f} {rho * np.sqrt(2 / np.pi):13.4f} "
f"{np.corrcoef(xd, yd)[0, 1]:11.4f} "
f"{2 / np.pi * np.arcsin(rho):19.4f}")
ρ 원래 r x 만 분할 이론 ρ√(2/π) 둘 다 분할 이론 (2/π)arcsin ρ
0.20 0.2003 0.1584 0.1596 0.1268 0.1282
0.40 0.4005 0.3219 0.3192 0.2644 0.2620
0.60 0.5970 0.4754 0.4787 0.4064 0.4097
0.80 0.8004 0.6383 0.6383 0.5911 0.5903
두 이론값이 모두 정확히 맞는다.
\(X\)만 자르면 \(0.798\rho\)다. 약 20% 손실이며 \(\rho\)에 비례한다.
둘 다 자르면 \(\dfrac{2}{\pi}\arcsin\rho\)다. 켄들의 \(\tau\)와 같은 식이다. 우연이 아니다. 중앙값 분할한 두 이분 변수의 \(\varphi\)가 곧 사분면 확률로 정해지기 때문이다.
| \(\rho\) | 손실(둘 다 분할) |
|---|---|
| 0.2 | \(-36\%\) |
| 0.4 | \(-34\%\) |
| 0.6 | \(-32\%\) |
| 0.8 | \(-26\%\) |
약 3분의 1을 잃는다.
검정력은 더 크게 잃는다.
from scipy import stats
rng = np.random.default_rng(23002)
B = 6_000
a = b = c = 0
for _ in range(B):
z = rng.standard_normal((100, 2))
x = z[:, 0]
y = 0.3 * z[:, 0] + np.sqrt(0.91) * z[:, 1]
a += stats.pearsonr(x, y).pvalue < 0.05
xd = (x > np.median(x)).astype(float)
b += stats.pearsonr(xd, y).pvalue < 0.05
yd = (y > np.median(y)).astype(float)
c += stats.pearsonr(xd, yd).pvalue < 0.05
print("검정력 (ρ=0.3, n=100, 명목 0.05)")
print(f" 연속 그대로: {a / B:.4f}")
print(f" x 만 이분화: {b / B:.4f}")
print(f" 둘 다 이분화: {c / B:.4f}")
검정력 (ρ=0.3, n=100, 명목 0.05)
연속 그대로: 0.8647
x 만 이분화: 0.6760
둘 다 이분화: 0.5563
검정력이 0.865에서 0.556으로 떨어진다.
같은 검정력을 되찾으려면 표본을 얼마나 늘려야 하나. 상관이 \(0.30\to0.19\)로 줄었으므로 필요 표본은 대략 \((0.30/0.19)^2\approx2.5\)배다.
n = 100 (연속) 의 정보를
이분화하면 n ≈ 250 이 있어야 회복된다
→ 자료의 60% 를 버린 셈
그런데도 중앙값 분할이 흔히 쓰인다. 이유와 반론.
| 흔한 이유 | 반론 |
|---|---|
| "해석이 쉽다"(고위험군 대 저위험군) | 회귀계수도 충분히 쉽다 |
| "정규성 가정을 피한다" | 이분화가 정규성을 주지는 않는다 |
| "임상적 절단점이 있다" | 이것만이 정당한 이유 |
| "비선형이라서" | 스플라인이나 다항항을 쓴다 |
세 번째만 정당하다. 진짜 임상적 문턱값이 존재하면(예: 진단 기준) 이분화가 자연스럽다.
더 나쁜 경우 — 절단점을 자료에서 고르면. "최적" 절단점을 탐색하면 다중검정 문제가 생겨 1종 오류가 크게 올라간다. 절단점은 자료를 보기 전에 정해야 한다.
연습문제 9. 사분상관은 이분화의 손실을 되돌릴 수 있는가? 가정과 함께 확인하라.
풀이
발상. 관측된 두 이분 변수 뒤에 잠재 이변량 정규가 있다고 가정하고, 관측된 \(2\times2\) 표를 재현하는 \(\rho\)를 역산한다.
import warnings
warnings.filterwarnings("ignore")
import numpy as np
from scipy import stats
from scipy.optimize import brentq
def tetrachoric(T):
"""2x2 표에서 사분상관을 수치적으로 구한다."""
n = T.sum()
h = stats.norm.ppf((T[0, 0] + T[0, 1]) / n)
k = stats.norm.ppf((T[0, 0] + T[1, 0]) / n)
target = T[0, 0] / n
def f(r):
return stats.multivariate_normal.cdf(
[h, k], mean=[0, 0], cov=[[1, r], [r, 1]]) - target
return brentq(f, -0.999, 0.999)
rng = np.random.default_rng(23002)
print(f"{'참 ρ':>7s} {'φ (0 에서 분할)':>15s} {'사분상관':>10s}")
for rho in [0.3, 0.5, 0.7]:
z = rng.standard_normal((200_000, 2))
x = z[:, 0]
y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
xd, yd = (x > 0).astype(int), (y > 0).astype(int)
T = np.array([[((xd == 0) & (yd == 0)).sum(), ((xd == 0) & (yd == 1)).sum()],
[((xd == 1) & (yd == 0)).sum(), ((xd == 1) & (yd == 1)).sum()]])
print(f"{rho:7.2f} {np.corrcoef(xd, yd)[0, 1]:15.4f} {tetrachoric(T):10.4f}")
참 ρ φ (0 에서 분할) 사분상관
0.30 0.1916 0.2964
0.50 0.3380 0.5063
0.70 0.4962 0.7029
사분상관이 참값을 0.006 이내로 복원한다.
| 참 \(\rho\) | \(\varphi\) | 사분상관 |
|---|---|---|
| 0.30 | 0.192 | 0.296 |
| 0.50 | 0.338 | 0.506 |
| 0.70 | 0.496 | 0.703 |
\(\varphi\)는 \((2/\pi)\arcsin\rho\)로 눌려 있고, 사분상관은 그 눌림을 역변환한다.
검산. \(\varphi=0.4962\)이면 \(\sin(0.7794)=0.7029\)다. 표와 일치한다.
그러나 공짜가 아니다.
| 비용 | 내용 |
|---|---|
| 가정 | 잠재 변수가 이변량 정규여야 한다 |
| 표준오차 | 피어슨보다 훨씬 크다 |
| 검정력 | 복원되지 않는다 |
두 번째와 세 번째가 핵심이다. 사분상관은 점추정의 편향만 제거하고 정보 손실은 되돌리지 못한다.
이분화로 잃은 것
├─ 점추정의 축소 → 사분상관이 되돌린다 ✓
└─ 정보(정밀도) → 되돌릴 수 없다 ✗
정규성 가정이 틀리면 심하게 편향된다. 잠재 분포가 치우쳐 있으면 사분상관이 참값을 벗어난다. 연속 자료가 있으면 이분화하지 않는 것이 언제나 낫다.
언제 쓰나.
| 상황 | 적절한가 |
|---|---|
| 처음부터 이분 자료(합격/불합격, 찬성/반대) | 그렇다 |
| 문항반응이론, 요인분석의 상관행렬 | 그렇다(표준 도구) |
| 연속 자료를 스스로 이분화 | 아니다(애초에 하지 말 것) |
다분상관(polychoric)은 서열 자료로의 확장이다. 리커트 5점 척도들의 상관행렬을 만들 때 표준적으로 쓴다.
파이썬: from semopy import ... 또는
factor_analyzer.factor_analyzer.corr 등
R: psych::tetrachoric(), psych::polychoric()
연습문제 10. 이진 변수가 관련된 상관 측도들을 정리하라.
풀이
측도의 지도.
| \(X\) | \(Y\) | 측도 | 비고 |
|---|---|---|---|
| 연속 | 연속 | 피어슨 \(r\) | 기본 |
| 이진 | 연속 | 점이연 \(r_{pb}\) | 피어슨과 같은 공식 |
| 이진(잠재 연속) | 연속 | 이연 \(r_b\) | 잠재 정규 가정 |
| 이진 | 이진 | 파이 \(\varphi\) | 피어슨과 같은 공식 |
| 이진(잠재 연속) | 이진(잠재 연속) | 사분상관 | 잠재 정규 가정 |
| 서열 | 서열 | 다분상관 | 잠재 정규 가정 |
왼쪽 세 줄이 "관측을 그대로", 오른쪽 세 줄이 "잠재 변수를 가정"한다.
핵심 수치 여섯.
| 사실 | 값 |
|---|---|
| \(r_{pb}\) 최대(\(d=2\), \(p=0.5\)) | 0.707 |
| \(r_{pb}\) 최대(\(d=2\), \(p=0.05\)) | 0.400 |
| \(\varphi\) 최대(\(p=0.1\), \(q=0.9\)) | 0.111 |
| \(X\)만 중앙값 분할 | \(0.798\rho\) |
| 둘 다 중앙값 분할 | \(\frac{2}{\pi}\arcsin\rho\) |
| 이분화 후 검정력(\(\rho=0.3\), \(n=100\)) | \(0.865\to\mathbf{0.556}\) |
항등식 셋.
흔한 실수 다섯.
| 실수 | 대가 |
|---|---|
| 연속 변수를 중앙값 분할 | 검정력 36% 손실 |
| 절단점을 자료에서 탐색 | 1종 오류 팽창 |
| \(\varphi\)를 표 간에 직접 비교 | 주변 비율이 다르면 무의미 |
| \(r_{pb}\)를 비율 다른 연구끼리 비교 | 같은 \(d\)가 다른 \(r\) |
| 사분상관이 검정력도 되돌린다고 생각 | 편향만 고친다 |
첫 줄이 가장 흔하고 가장 비싸다.
결정 흐름.
자료가 이진인가?
│
├─ 원래부터 이진 (합격/불합격, 생존/사망)
│ ├─ 상대 변수도 이진 → φ 또는 오즈비
│ │ └─ 잠재 연속이 자연스러운가? → 사분상관
│ └─ 상대 변수가 연속 → 점이연 r_pb (+ 코언 d 병기)
│
└─ 연속인데 이분화하려 한다
├─ 임상적 절단점이 미리 정해져 있다 → 허용
└─ 그렇지 않다 → 하지 말 것
보고 형식.
처치군(n=45)과 대조군(n=55)의 회복 점수
점이연 r = 0.42, 95% CI [0.24, 0.57]
코언 d = 0.93 (집단 비율 p = 0.45)
t(98) = 4.60, p < 0.001
집단 비율이 균형에 가까우므로 r 과 d 의 변환이 안정적이다.
다른 비율의 연구와 비교할 때는 d 를 사용했다.
\(p\)를 밝히고 \(d\)를 병기하는 것이 점이연 보고의 요령이다.
한 문장. 이진 변수의 상관계수는 피어슨 공식을 그대로 쓰지만 도달 가능한 범위가 주변 비율에 묶이므로, 값 자체보다 비율과 함께 읽어야 한다.
정리하며¶
점이연 계수와 파이 계수는 이진 자료에 대한 Pearson 상관의 특수한 경우이다. 점이연 계수는 이진 집단 변수와 연속형 결과 사이의 연관을 재며 그 검정은 이표본 t-검정과 동치이다. 파이 계수는 \(2 \times 2\) 표에서 두 이진 변수 사이의 연관을 재며 그 검정은 카이제곱 독립성 검정과 동치이다. 이런 연결을 알면 서로 달라 보이던 여러 통계 절차가 상관이라는 하나의 틀 아래 통합된다.