데이터 분석/ADP 자격증 공부

[ADP 실기] 2. 통계분석 총정리

나르시스트 2026. 4. 6. 22:05

*부호검정: 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)