통계 검정





p-value 구하기
만약 대학교 학생들 키 평균이 170이라고 알려져 있을때
진짜인지 궁금해서 내가 표본집단 1000명의 키를 측정해봐서 평균을 냈는데 그 평균이 174.46cm였고
표준편차가 7.1cm일때
학생들의 평균키가 170이상이다<- 이게 참일지 보고싶을떄 (모든 모집합을 다 측정 할 수 없으니까)
귀무가설: 학생들의 평균키는 170과 차이가 없다
대립가설: 학생들의 평균키는 170과 유의미한 차이가 있다
과연 대립가설이 성립하는지 확인하고 싶을때
예를들어 가상의 170이 평균으로 두고 표준편차가 7.1cm로 둔 모집단에서
많은 횟수를 반복해서 평균을 많이 뽑아내서

해당 그래프가 나왔다고 쳤을때
174.46이상인 값이 1.5%만 존재한다면
통계에서는 5%를 기준으로 나눠서
키가 174.46이 평균으로 나올 확률이 희박한데 내가 1000명 조사헀을때 그렇게 나왔으니까
학생들 평균키가 170보다 크다고 말할 수 있고 대립가설이 맞다고 할 수 있음
from scipy import stats
stats.ttest_1samp(df_h['son'], 174.46, alternative='greater')
# greater: 큰지만 확인
# two-sided: 서로 다른지 확인
'''
p-value >= 0.05 -> 귀무가설 채택
p-value < 0.05 -> 대립가설 채택
'''
이렇게 구하면 되는데

아까 처럼 여러번 돌리는게 아닌 수학적으로 1번만 돌려서 값을 구함
t-test: 두 그룹 차이 검정

검정 순서 (프로세스)
정규성 검정 (Shapiro-Wilk test)
→ 데이터가 정규분포를 따르는지 확인
정규분포라면 t-test 가능 정규분포가 아니면 비모수검정(Mann-Whitney U test) 사용
등분산 검정 (Levene test 등)
→ 두 그룹의 분산이 같은지 확인 분산이 같다면
→ 독립 표본 t-test (등분산 가정) 분산이 다르면
→ Welch
t-test (비등분산 가정) t검정 수행 → 두 그룹 평균의 차이를 비교
# 함수 모음
# shapiro 함수: 정규성 검정 함수
stats.shapiro(male_math),stats.shapiro(female_math)
# bartlett 함수: 등분산 검정 함수
stats.bartlett(male_math, female_math2)
# kruskal 함수: 그룹 간 차이 검정(중앙값 이용) -> 분산분석 대체
stats.kruskal(g1,g2,g3)
# 비모수(non-parametric) 검정 -> 정규분포 아닐떄 순위를 가지고
stats.mannwhitneyu(group1, group2, alternative='two-sided')
Welch 검정: 분산이 깨졌을때 등분산을 가정하지 않고
stats.ttest_ind(group1, group2, equal_var=False)
# 예시 남여 수학점수 평균 비교
# 대립가설: 두 그룹은 수학 점수에 차이가 있다
df_sp = pd.read_csv('/content/drive/MyDrive/multicampus/시각화/data/StudentsPerformance.csv')
df_sp.groupby('sex')['math score'].mean()
# 정규성 검정 -> 남녀 수학점수 데이터 각각 정규성 검정
male_math = df_sp[df_sp['sex'] == 'male']['math score']
female_math = df_sp[df_sp['sex'] == 'female']['math score']
# shapiro 함수: 정규성 검정 함수 (귀무가설: 데이터가 정규분포를 따른다)
# 각각 정규성 검정
stats.shapiro(male_math),stats.shapiro(female_math)
# (ShapiroResult(statistic=np.float64(0.9948297721426106), pvalue=np.float64(0.10925772997767996)),
# ShapiroResult(statistic=np.float64(0.9923991147460336), pvalue=np.float64(0.010804272932667338)))
# 남자 수학점수는 귀무가설 (-> 정규성 만족)
# 여자 수학점수는 대립가설 채택 (-> 정규성 불만족)
# -> 결국 정규성 불만족
# 데이터 전처리를 해서 여자 수학점수 데이터를 정규성 만족을 시켜보기
sns.histplot(female_math,binwidth=2) # 히스토그램으로 봐서 이상치 제거
# 여자 수학점수 -> 이상치 제거
female_math2 = female_math[female_math > 24]
stats.shapiro(female_math2)
# ShapiroResult(statistic=np.float64(0.9923991147460336), pvalue=np.float64(0.010804272932667338))
# p-value > 0.05이므로 귀무가설 채택 (정규성 만족)
# 여성 수학점수도 정규성 만족
# 등분산 검정 (귀무가설: 두 그룹의 분산이 같다)
stats.bartlett(male_math, female_math2)
# BartlettResult(statistic=np.float64(1.4909143324252987), pvalue=np.float64(0.2220746501924966))
# 귀무가설 채택 -> 등분산 만족
# 독립 표본 t-test
stats.ttest_ind(male_math, female_math2, alternative='two-sided')
# TtestResult(statistic=np.float64(4.678734499882726), pvalue=np.float64(3.291994170663245e-06), df=np.float64(979.0))
# 해석: p-value < 0.05 이므로 대립가설 채택
# 결론: 두 그룹은 수학 점수에 유의한 평균 차이가 있다
비모수(non-parametric) 검정
“정규분포 같은 모양 자체를 가정하지 않는” 검정이에요.
즉, 데이터가 비정규분포일 때 —
예를 들어 한쪽으로 치우쳐 있거나, 이상치가 많을 때 —
평균 대신 순위(rank) 를 써서 비교해요.
그래서 비모수검정은
“분포 모양이 달라도 쓸 수 있는 t-test의 대체제”라고 보면 돼요.
stats.mannwhitneyu(group1, group2, alternative='two-sided')
Welch검정
t-test의 한 변형 버전이에요.
이건 “두 그룹의 분산이 같지 않을 때(등분산 가정 깨짐)”
그걸 보정해주는 버전이에요.
기본 t-test: 등분산을 가정함
Welch t-test: 등분산을 가정하지 않고 계산함
stats.ttest_ind(group1, group2, equal_var=False)
분산분석(anova)
방법 2가지
1. (정석) stats.f_oneway -> 좀 귀찮음
2. anova_lm (정규성, 등분산이 만족일 때) -> 편함
1. (정석) stats.f_oneway
df_ins['ins_type'].unique()
# 정규성 검정
stats.shapiro(g1),stats.shapiro(g2),stats.shapiro(g3)
# 정규성 불만족 -> 분산분석 못 쓰고, 대체 검정 kruskal 검정을 써야 함
# kruskal 함수: 그룹 간 차이 검정(중앙값 이용) -> 분산분석 대체
stats.kruskal(g1,g2,g3)
# 해석: p-value >= 0.05이므로 귀무가설 채택
# 갤론: 그룹 간 유의한 차이가 없다
# if 정규성 만족인 경우
# 분산 분석(anova): 여러 그룹 간 평균 차이 검정
stats.f_oneway(g1,g2,g3)
# 해석: p-value >= 0.05이므로 귀무가설 채택
# 결론: 모둔 ins_type의 period는 유의한 평균 차이가 없다
2. anova_lm 활용한 분석
data = ols('period ~ C(ins_type)', df_ins).fit()
anova_lm(data)
