기술통계와 가설검정 기초

src/content/documents/data-analysis/descriptive-statistics-and-hypothesis-testing.json

28편에서 히트맵으로 매출과 방문 횟수의 상관계수가 0.95, 할인율과의 상관계수는 0.04라는 것을 봤다. 그런데 이 0.04는 "상관이 없다"고 확신해도 되는 값일까, 아니면 표본이 작아서 우연히 낮게 나온 걸까? 눈으로 본 패턴을 확률로 검증하는 단계가 가설검정이다.

한 줄 정의

기술통계(descriptive statistics) 는 데이터를 평균·중앙값·표준편차 같은 대표값 몇 개로 요약하는 것이고, 가설검정(hypothesis testing) 은 관찰된 차이나 관계가 우연히 나올 수 있는 수준인지, 아니면 우연으로 보기 어려운 수준인지를 확률로 판단하는 절차다.

중심 경향 — 평균과 중앙값은 다른 이야기를 한다

이상치가 있는 데이터일수록 평균과 중앙값의 차이가 커진다. 오른쪽으로 꼬리가 긴(고액 결제 소수가 있는) 매출 데이터 400건으로 확인한다.

df["amount"].describe()
df["amount"].mean(), df["amount"].median()
df["amount"].skew()   # 왜도: 0이면 대칭, 양수면 오른쪽 꼬리
df["amount"].kurt()   # 첨도: 0이면 정규분포와 비슷한 뾰족함
count      400.00
mean     16624.85
std       9131.21
min       3842.28
25%      10663.09
50%      15239.00   # 중앙값
75%      19661.93
max      95014.41

skew: 2.76   (오른쪽으로 강하게 치우침)
kurt: 16.16  (정규분포보다 훨씬 뾰족하고 꼬리가 두꺼움)

평균(16,625)이 중앙값(15,239)보다 크다. 왜도 2.76은 소수의 고액 거래가 평균을 오른쪽으로 끌어올렸다는 뜻이다. 이런 데이터에서는 "평균 매출" 한 줄만 보고하면 대표적이지 않은 값을 대표값처럼 전달하게 된다. 중앙값을 함께 보고하거나, 26편에서 다룬 IQR로 이상치 영향을 줄인 뒤 평균을 다시 계산하는 것이 안전하다.

상관계수 — 관계의 강도이지 원인이 아니다

상관계수는 -1 ~ +1 사이 값으로 두 수치형 변수가 얼마나 같이 움직이는지를 나타낸다.

범위

해석

0.7 ~ 1.0 (또는 -0.7 ~ -1.0)

강한 상관

0.3 ~ 0.7 (또는 -0.3 ~ -0.7)

중간 정도 상관

0 ~ 0.3 (또는 0 ~ -0.3)

약하거나 거의 없음

28편 히트맵의 amount-visits 상관계수 0.95는 강한 양의 상관, amount-discount_rate 의 0.04는 거의 상관이 없는 수준이다. 다만 상관계수가 높다고 한쪽이 다른 쪽의 원인 이라고 결론 내릴 수는 없다. 방문 횟수가 늘어서 매출이 늘었는지, 매출이 큰 고객이 방문도 잦은 것인지, 아니면 둘 다 "활성 고객"이라는 제3의 요인 때문인지는 상관계수만으로 구분되지 않는다.

가설검정의 기본 틀

눈에 보이는 차이가 진짜인지 확인하는 절차는 항상 같은 순서를 따른다.

  1. 귀무가설(H0) 을 세운다 — "차이가 없다" 또는 "관계가 없다"는 보수적인 가정이다.

  2. 대립가설(H1) 을 세운다 — 확인하고 싶은 실제 주장이다.

  3. 유의수준 α\alpha 를 정한다 — 귀무가설을 얼마나 엄격하게 기각할지 정하는 기준값이다.

  4. 검정을 실행해 p-value 를 구한다 — 귀무가설이 맞다고 가정했을 때, 지금 관찰한 정도의 차이가 우연히 나올 확률이다.

  5. p-valueα\alpha 보다 작으면 귀무가설을 기각하고, 그렇지 않으면 기각하지 않는다.

관례적으로 α=0.05\alpha = 0.05 를 많이 쓴다. p-value가 이보다 작으면 "이 차이가 순전히 우연일 확률은 5% 미만이다"라고 해석하고, 통계적으로 유의미하다고 부른다.

t-test — 두 그룹의 평균을 비교한다

UI를 바꾼 B 그룹이 기존 A 그룹보다 매출이 실제로 늘었는지 확인한다. 각 그룹 200명이다.

df.groupby("group")["amount"].agg(["mean", "std", "count"])
group      mean       std  count
A      14980.39   7243.90    200
B      18269.31  10453.10    200

t-test는 두 그룹이 정규분포를 따른다고 가정한다. shapiro 검정으로 먼저 확인한다.

from scipy import stats
stats.shapiro(group_a)
stats.shapiro(group_b)
A: W=0.9049, p=5.22e-10
B: W=0.7844, p=6.99e-16

두 그룹 모두 p-value가 매우 작아 정규분포라는 귀무가설이 기각된다 — 실제로 매출 데이터는 오른쪽으로 치우친 분포가 흔하다. 그렇다고 t-test를 바로 포기하지는 않는다. 표본이 30개를 훌쩍 넘으면(중심극한정리) 평균의 분포는 원래 데이터가 정규분포가 아니어도 정규분포에 가까워진다. 대신 두 그룹의 분산이 같은지도 함께 확인한다.

stats.levene(group_a, group_b)
stat=3.484, p=0.0627  # p > 0.05 → 등분산 가정을 기각할 근거 부족

등분산 여부에 따라 t-test 계산식이 다르다.

검정

가정

scipy 옵션

Student t-test

두 그룹의 분산이 같다

equal_var=True

Welch t-test

분산이 달라도 된다

equal_var=False

t1, p1 = stats.ttest_ind(group_a, group_b, equal_var=True)
t2, p2 = stats.ttest_ind(group_a, group_b, equal_var=False)
Student t-test:  t=-3.657, p=0.00029
Welch t-test:    t=-3.657, p=0.00029

이번 데이터는 두 방식의 결과가 사실상 같지만, 등분산 여부가 불확실할 때는 Welch 쪽이 더 안전한 기본값으로 꼽힌다 — 등분산이면 Student와 결과가 비슷하고, 아니면 Welch만 올바르기 때문이다. p-value(0.00029)가 0.050.05 보다 훨씬 작으므로 귀무가설(두 그룹 평균이 같다)을 기각한다. B 그룹의 평균 매출이 A보다 통계적으로 유의미하게 높다.

정규성이 강하게 위반된 상황을 더 보수적으로 다루고 싶다면, 평균 대신 순위를 비교하는 Mann-Whitney U 검정 을 대안으로 쓴다.

stats.mannwhitneyu(group_a, group_b, alternative="two-sided")
U=15533.0, p=0.00011

분포 가정이 다른 두 검정이 "차이가 있다"는 결론에서 일치했다. 결과가 특정 검정 방법에만 의존하지 않는다는 뜻이라 결론에 더 확신을 가질 수 있다.

카이제곱 검정 — 범주형 변수 사이의 독립성

지역과 구매 여부처럼 둘 다 범주형인 변수 사이의 관계는 t-test로 다룰 수 없다. 교차표(contingency table)를 만들고 카이제곱 검정으로 "두 변수가 서로 독립인가"를 확인한다.

ct = pd.crosstab(df["region"], df["purchased"])
print(ct)
purchased  False  True
region
대구            73     43
부산            96     49
서울           133    121
인천            58     27
from scipy.stats import chi2_contingency
chi2, p, dof, expected = chi2_contingency(ct)
chi2=11.319, p=0.0101, dof=3

p-value(0.0101)가 0.050.05 보다 작으므로 "지역과 구매 여부는 독립"이라는 귀무가설을 기각한다 — 지역에 따라 구매 여부가 달라진다고 볼 근거가 있다. chi2_contingency 는 네 번째 값으로 "두 변수가 정말 독립이라면 각 칸에 기대되는 빈도" 도 함께 돌려준다.

카이제곱 검정은 각 칸의 기대빈도가 5 미만이면 신뢰도가 떨어진다고 알려져 있다. 표본을 더 모으거나 범주를 합쳐서 칸의 기대빈도를 올린 뒤 검정하는 것이 안전하다.

장점과 한계

구분

내용

장점

"차이가 있어 보인다"는 직관을 재현 가능한 확률로 바꿔, 우연과 실제 효과를 구분하는 공통 기준을 제공한다.

한계

p-value는

차이가 통계적으로 존재하는지

만 말할 뿐

그 차이가 실질적으로 큰지

는 말하지 않는다. 표본이 아주 크면 실무적으로 무의미한 차이도 p < 0.05로 나올 수 있다.

자주 발생하는 문제

p-value만 보고 효과 크기를 확인하지 않는다. 위 t-test에서 p-value 0.00029만 보고 끝내면 "차이가 있다"까지만 안다. 실제로 A(14,980) → B(18,269)는 평균이 약 22% 늘었다는 뜻이다. 유의미한지와 함께 얼마나 차이 나는지를 항상 같이 보고한다.

정규성 위반을 이유 없이 무시한다. 표본이 커서 t-test를 써도 괜찮은 경우와, 표본이 작아 결과를 믿기 어려운 경우를 구분해야 한다. 표본이 수십 개 이하로 작고 정규성도 깨졌다면 t-test 대신 Mann-Whitney U처럼 분포를 가정하지 않는 검정을 우선 검토한다.

유의수준을 검정 여러 번에 그대로 적용한다. α=0.05\alpha = 0.05 는 검정을 한 번 할 때 기준이다. 같은 데이터로 열 번 넘게 다른 조합을 검정하면, 우연히 유의미한 결과가 하나쯤 나올 확률이 크게 올라간다. 여러 번 비교할 때는 본페로니 보정처럼 기준을 더 엄격하게 조정하는 방법이 따로 있다.

관련 문서

이 문서의 상관계수 예시는 데이터에 맞는 시각화 도구 선택하기 의 히트맵에서 이어진다. 결측·이상치를 먼저 정리하는 방법은 Pandas로 데이터 탐색·정제·집계하기 를 참고한다.

참고 자료

댓글 0

댓글을 불러오는 중…