
*부호검정: n ≤ 100 – 이항분포, n > 100 – 정규분포
*부호순위검정: n ≤ 20 – 이항분포, n > 20 – 정규분포
*윌콕슨 순위합검정: n ≤ 25 – 이항분포, n > 25 – 정규분포
*프리드먼: 3개 범주 – 9개 이하, 4개 범주 – 5개 이하 이외는 카이제곱
*크루스칼 월리스: 3개 범주 – 15개 이하, 4개 범주 – 14개 이하 이외는 카이제곱
*카이제곱: 각 셀 최소 5개 이상
*Run 검정 (연관분석?)
import pandas as pd
from statsmodels.sandbox.stats.runs import runstest_1samp
data=['a','a','b','b','a','a','a','a','b','b','b','b','b','a','a','b','b','a','b','b']
test_df = pd.DataFrame(data, columns=['product'])
test_df.loc[test_df['product']=='a', 'product'] = 1
test_df.loc[test_df['product']=='b', 'product'] = 0
print(runstest_1samp(test_df['product'], cutoff=0.5, correction=True))

*맥니머 검정 (p.197)
두 변수의 대응관계가 있는 데이터 분포 차이 검정

- 귀무가설: 두 변수 데이터 분포는 차이가 없다
- 대립가설: 두 변수 데이터 분포는 차이가 있다
import numpy as np
from statsmodels.sandbox.stats.runs import mcnemar
table = np.array([[20, 15], [5, 10]])
stat, p = mcnemar(table, exact=True)
print(f"McNemar 통계량: {stat}")
print(f"p-값: {p:.4f}")
*코크란Q 검정 (p.197)
이항변수인 세 변수 이상의 대응관계가 있는 데이터 분포 차이 검정

- 귀무가설: 각 변수 데이터 분포는 차이가 없다
- 대립가설: 적어도 한 쌍의 변수 데이터 분포는 차이가 있다
import pandas as pd
from statsmodels.stats.contingency_tables import cochrans_q
df = pd.DataFrame({'Patient': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'Drug_A': [1, 0, 1, 0, 1, 1, 0, 1, 0, 1],
'Drug_B': [0, 1, 1, 1, 0, 1, 0, 1, 1, 0],
'Drug_C': [1, 0, 0, 1, 0, 1, 0, 1, 0, 1]})
result = cochrans_q(df[['Drug_A', 'Drug_B', 'Drug_C']])
print(f"Q 통계량: {result.statistic:.4f}")
print(f"p-값: {result.pvalue:.4f}")
*일표본 부호 검정 (p.199)
*이표본 부호 검정
*일표본 윌콕슨 부호순위 검정 (p.203)
*이표본 윌콕슨 부호순위 검정
import numpy as np
from scipy.stats import wilcoxon
work_hours = [203, 204, 197, 195, 201, 205, 198, 199, 194, 207]
baseline = 200
diff = np.array(work_hours) - baseline
stat, p_value = wilcoxon(diff)
print(f"윌콕슨 검정 통계량: {stat}")
print(f"p-값: {p_value:.4f}")
import numpy as np
from scipy.stats import wilcoxon
cats_Bwt = np.array([2.5, 2.9, 3.1, 2.8, 3.3, 3.0])
mu = 3.0 # 검정하고자 하는 중앙값
diffs = cats_Bwt - mu
stat, p = wilcoxon(diffs, alternative='two-sided')
print(f"검정 통계량: {stat:.4f}")
print(f"p-value: {p:.4f}")
import numpy as np
from scipy.stats import wilcoxon
before = [120, 130, 115, 140, 135, 128, 132, 110, 125, 137]
after = [115, 128, 118, 135, 130, 124, 131, 109, 120, 133]
stat, p_value = wilcoxon(before, after)
print(f"윌콕슨 검정 통계량: {stat}")
print(f"p-값: {p_value:.4f}")
*윌콕슨 순위합 검정
두 독립된 그룹 간의 차이를 비교하는 비모수 검정
독립표본 t-검정의 비모수 버전
from scipy.stats import ranksums, mannwhitneyu
group_a = [4.1, 3.5, 5.0, 4.8, 3.8]
group_b = [3.9, 4.2, 3.1, 4.0, 3.6]
stat, p_value = ranksums(group_a, group_b)
print(f"윌콕슨 순위합 검정 통계량: {stat}")
print(f"p-값: {p_value:.4f}")
stat, p_value = mannwhitneyu(group_a, group_b)
print(f"맨-휘트니 U 통계량: {stat}")
print(f"p-값: {p_value:.4f}")

*크루스칼 월리스 (p.208)
세 개 이상의 독립된 그룹 간의 중앙값 차이를 비교하는 비모수 검정
from scipy.stats import kruskal
group_a = [5.1, 4.8, 6.2, 5.0, 5.3]
group_b = [4.5, 4.9, 5.1, 4.6, 4.8]
group_c = [6.0, 5.9, 6.3, 6.1, 6.4]
stat, p_value = kruskal(group_a, group_b, group_c)
print(f"크러스칼-월리스 검정 통계량: {stat}")
print(f"p-값: {p_value:.4f}")
data = np.array(group_a + group_b + group_c)
groups = ['A']*len(group_a) + ['B']*len(group_b) + ['C']*len(group_c)
dunn_result = sp.posthoc_dunn([group_a, group_b, group_c], p_adjust = 'bonferroni')
dunn_result
→ 사후검정 – Dunn’s test

→ 0.05 이하면, 두 그룹 간 차이가 유의미함
*프리드먼 검정 (p.210)
세 개 이상의 관련된 그룹 간의 차이를 비교하는 비모수 검정
import numpy as np
from scipy.stats import friedmanchisquare
import scikit_posthocs as sp
method_a = [85, 78, 92, 88]
method_b = [90, 85, 95, 89]
method_c = [88, 82, 91, 87]
stat, p_value = friedmanchisquare(method_a, method_b, method_c)
print(f"프리드먼 검정 통계량: {stat}")
print(f"p-값: {p_value:.4f}")
# 데이터를 하나로 결합하여 사후 검정을 수행
data = np.array([method_a, method_b, method_c]).T # Transpose to match students by rows
dunn_result = sp.posthoc_dunn(data, p_adjust='bonferroni')
print(dunn_result)



'데이터 분석 > ADP 자격증 공부' 카테고리의 다른 글
| [ADP 실기] Pandas to_datetime 관련 함수 정리 (0) | 2026.04.06 |
|---|---|
| [ADP 실기] 기타 문제 모음 (0) | 2026.04.06 |
| [ADP 실기] 1. 분류분석 총정리 (0) | 2026.04.06 |
| [ADP 실기] 확률분포 계산 문제 (0) | 2026.04.06 |
| [ADP 실기] NPV(Net Present Value, 순현재가치), IRR 구하기 (0) | 2026.04.06 |