오랑우탄의 반란
[기초통계] 유의성검정 (파이썬) 본문
반응형
이전 포스트에 이어 몇 가지 데이터의 유의성 검정을 살펴보겠습니다.
A/B 테스트
- A/B 두 그룹에 대해 어느 것이 더 효과적인지 확인하려는 검정법
- 독립표본 t검정을 수행해 두 개의 독립된 집단 간 평균 차이가 유의미한지 평가
- 사용자를 그룹으로 나눠 다른 버전으로 테스트해보는 등 마케팅, UX 쪽에서 많이 사용됨
- 전환율, 클릭률, 구매수, 방문 기간, 방문한 페이지 수, 특정 페이지 방문 여부, 매출 등의 지표를 비교
import numpy as np
import scipy.stats as stats
# 가정된 전환율 데이터
group_a = np.random.binomial(1, 0.30, 100) # 30% 전환율
group_b = np.random.binomial(1, 0.45, 100) # 45% 전환율
# t-test를 이용한 비교
t_stat, p_val = stats.ttest_ind(group_a, group_b)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")
t_stat 은 두 집단 간 평균 차이의 크기와 방향
p_value는 귀무가설 H0이 참일 때 현재 데이터보다 극단적인 결과가 나올 확률로,
유의수준(α, 보통 0.05) 보다 작으면 유의성이 있다고 보아 귀무 가설을 기각하는 반면,
유의수준(α) 보다 크면 귀무 가설을 채택
위 코드의 p-value 가 0.05 보다 낮기 때문에 두 그룹의 차이가 우연이 아닌, 유의미한 차이가 있다는 뜻입니다.
가설검정
- 문제 발생 시 해결하기 위해 세운 가설이 맞았는지 검정하는 것 (귀무가설 기각 여부 결정)
- 확증적 자료분석(미리 가설 세우고 검증) vs 탐색적 자료분석 EDA(데이터 탐색하면서 가설 후보와 특징 찾는 것)
- 신뢰구간과 밀접한 개념
검정 단계
- 귀무가설(H0)과 대립가설(H1) 설정
- 유의수준(α) 결정
- 검정통계량 계산
- p-값과 유의수준 비교
- 결론 도출
# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성
A = np.random.normal(50, 10, 100)
B = np.random.normal(55, 10, 100)
# 평균 효과 계산
mean_A = np.mean(A)
mean_B = np.mean(B)
# t-검정 수행
t_stat, p_value = stats.ttest_ind(A, B)
print(f"A 평균 효과: {mean_A}")
print(f"B 평균 효과: {mean_B}")
print(f"t-검정 통계량: {t_stat}")
print(f"p-값: {p_value}")
# t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용)
print(f"p-값: {p_value}")
if p_value < 0.05:
print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.")
else:
print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")
새로운 약물이 기존 약물보다 효과가 있는지 검정한 결과로, 실제 새로운 약물이 기존 약물에 비해 효과가 있었다는 것을 볼 수가 있습니다.
t검정
- 독립표본 t검정: 두 개의 다른 그룹 비교
- 대응표본 t검정: 하나의 그룹 내 전후 비교
다중검정
- 여러 가설을 동시에 검정할 때 발생하는 문제
- 유의수준을 무조건 0.05로 설정해서 귀무가설을 기각했을 때 틀릴 수 있음
- 본페로니 보정: 유의수준을 더 좁게 잡기, 유의수준/ p_value의 길이
import numpy as np
import scipy.stats as stats
# 세 그룹의 데이터 생성
np.random.seed(42)
group_A = np.random.normal(10, 2, 30)
group_B = np.random.normal(12, 2, 30)
group_C = np.random.normal(11, 2, 30)
# 세 그룹 간 평균 차이에 대한 t검정 수행
p_values = []
p_values.append(stats.ttest_ind(group_A, group_B).pvalue)
p_values.append(stats.ttest_ind(group_A, group_C).pvalue)
p_values.append(stats.ttest_ind(group_B, group_C).pvalue)
print(p_values) # 3개의 pvalue 출력
# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values)
# 결과 출력
print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}")
for i, p in enumerate(p_values):
if p < adjusted_alpha:
print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})")
else:
print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})")
3개의 pvalue 가 출력되어 재확인이 필요합니다.
카이제곱검정
- 적합도 검정: 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정
- p값이 높으면 관찰된 데이터가 귀무가설에 적합
- p값이 낮으면 관찰된 데이터가 귀무가설에 부적합
- scipy.stats.chisquare 함수 사용
- 독립성 검정: 두 범주형 변수 간의 독립성 검정
- p값이 높으면 두 변수 간 연관성 없음 = 독립적임
- p값이 낮으면 두 변수 간 연관성 있음 = 독립적이지 않음
- scipy.stats.chi2_contingency 함수 사용
# 적합도 검정
observed = [20, 30, 25, 25]
expected = [25, 25, 25, 25]
chi2_stat, p_value = stats.chisquare(observed, f_exp=expected)
print(f"적합도 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 독립성 검정
observed = np.array([[10, 10, 20], [20, 20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
# 나이과 흡연 여부 독립성 검정
observed = np.array([[30, 10], [20, 40]])
chi2_stat, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"독립성 검정 카이제곱 통계량: {chi2_stat}, p-값: {p_value}")
적합도 검정 결과 두 데이터 사이 차이가 없어 귀무가설에 적합
독립성 검정 결과 각각 p값이 굉장히 높고 굉장히 낮기에 독립적, 독립적이지 않음
제1종 오류, 제2종 오류
- 제1종 오류: 귀무가설이 참인데 기각하는 오류
- 잘못된 긍정의 의미 (아무 영향이 없는데 영향이 없다고 한 것) = 위양성
- α를 경계로 귀무가설을 기각하기 때문에 제1종 오류가 α만큼 발생
- 유의수준을 최대한 낮춰서 제어 가능
- ex) 새로운 약물이 효과가 없는데 있다고 결론 내리는 것
- 제2종 오류: 귀무가설이 거짓인데 기각하지 않는 오류
- 잘못된 부정의 의미(영향이 있는데 없다고 한 것) = 위음성
- 제 2종 오류가 일어날 확률은 β로 정의, 일어나지 않을 확률은 검정력(1-β)으로 정의
- 직접 통제할 방법 없음
- 표본크기 n이 커질수록 β가 작아짐, 즉 표본이 클수록 오류 발생 확률 낮아짐
- α 와 β 는 상충 관계여서 너무 낮은 α (즉 제1종 오류를 너무 통제하려고 하면) 높은 β를 만들어냄 (제2종 오류가 발생할 확률이 높아짐)
- ex) 새로운 약물이 효과가 있는데 없다고 결론 내리는 것
이상 유의검증 관련해서 살펴봤습니다.
다음 포스트에서는 회귀에 대해 알아보겠습니다.
오랑우탄이 영어를 하고 오랑이가 데이터분석가가 되는 그날까지~
반응형
'PYTHON > 데이터분석' 카테고리의 다른 글
[기초통계] 상관관계 (파이썬) (0) | 2024.08.02 |
---|---|
[기초통계] 회귀 (파이썬) (0) | 2024.08.02 |
[기초통계] 데이터 분포 시각화 (파이썬) (0) | 2024.08.01 |
[기초통계] 통계 기초 개념 시각화 (파이썬) (0) | 2024.08.01 |
[Pandas] Pivot Table 피벗테이블 완전분석 (실습 포함) (0) | 2024.07.23 |