Today I Learned (TIL)/Python

[TIL] 통계학 기초 - 3주차

신짜린 2024. 8. 2. 13:57

1. A/B 검정

 두 버전(A와 B) 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정방법이다. 사용자들을 두 그룹으로 나눠 각 그룹에 다른 버전을 제공한 후 반응을 비교하는 것으로 마케팅, 웹사이트 디자인 등에서 많이 사용된다. 

 두 그룹 간의 변화가 우연이 아닌 통계적으로 유의미한지를 확인하는 것으로 일반적으로 전환율, 클릭률, 구매수, 방문 기간, 방문한 페이지 수, 특정 페이지 방문 여부, 매출 등의 지표를 통해 비교한다.

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}")

 

- stats.ttest_ind

 cipy.stats.ttest_ind 함수는 독립표본 t-검정(Independent Samples t-test)을 수행하여 두 개의 독립된 집단 간 평균의 차이가 유의미한지 평가한다.

 두 집단의 데이터 배열을 입력으로 받아서 t-통계량(두 집단 간 평균 차이의 크기와 방향을 나타냄)과 p-값(유의수준)을 반환한다.

실전 예시 주소
딜라이트룸 A/B 테스트 사례 Jaemyung Shin알라미의 A/B 테스팅 일지 #1
당근마켓 A/B 테스트 사례 Yedaeun거래 후기 실험을 통해 따뜻한 거래 경험 만들기

 

2. 가설검정

 표본 데이터를 통해 모집단의 가설을 검증하는 과정으로 데이터가 특정 가설을 지지하는지 평가하는 과정을 말한다.

 확증적 자료분석(가설을 먼저 세워 검증) 또는 탐색적 자료분석(데이터를 먼저 탐색)을 통해 귀무가설(H0)과 대립가설(H1)을 설정하고 귀무가설을 기각할지 결정한다.

귀무가설(H0)과 대립가설(H1) 설정 → 유의수준(α) 결정 → 검정통계량 계산 → p-값과 유의수준 비교 → 결론 도출 단계로 진행한다.

 

- 통계적 유의성과 p값

 통계적 유의성은 결과가 우연히 발생한 것이 아닌 어떤 효과가 실제로 존재함을 나타내는 지표이다.

 p 값은 귀무가설이 참일 경우 관찰된 통계치가 나올 확률을 의미하여 일반적으로 p값이 0.05 미만이면 결과를 통계적으로 유의하다고 판단한다.

- 신뢰구간과 가설검정

 신뢰구간과 가설검정은 밀접하게 관련된 개념으로 두 다 데이터의 모수에 대한 정보를 구하고자 하는 것이지만 접근 방식이 다르다.

 신뢰구간은 특정 모수가 포함될 범위를 제공하여 모집단의 편균이 특정 범위 내에 있을 것이라는 확률을 나타낸다. 일반적으로 95% 신뢰구간이 사용되며 이는 모집단 평균이 95% 확률로 이 구간 내에 있음을 의미한다.

 만약 어떤 설문조사에서 편균 만족도가 75점이고 신뢰구간이 70~80점이라면 95% 확률로 실제 평균 만족도가 이 범위 내에 있다고 말할 수 있다.

# 기존 약물(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("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")

 

3. t검정

 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 검정 방법이다. 독립표본 t검정(두 독립된 그룹의 평균 비교)과 대응표본 t검정(동일한 그룹의 사전/사후 평균 비교)으로 나뉜다.

 두 클래스의 시험 성적을 비교할 때는 독립표본 t검정을 사용하고 다이어트 전후 체중을 비교할 때는 대응표본 t검정을 사용한다.

# 학생 점수 데이터
scores_method1 = np.random.normal(70, 10, 30)
scores_method2 = np.random.normal(75, 10, 30)

# 독립표본 t검정
t_stat, p_val = stats.ttest_ind(scores_method1, scores_method2)
print(f"T-Statistic: {t_stat}, P-value: {p_val}")

 

4. 다중검정

 여러 가설을 동시에 검정할 때 발생하는 것으로 각 검정마다 유의수준을 조정하지 않으면 1종 오류 발생 확률이 증가한다.

 이를 줄이기 위해 본페로니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등과 같은 보정방법이 있다. 그중 본페로니 보정이 가장 대표적이고 기본적이다.

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)

# 본페로니 보정 적용
alpha = 0.05
adjusted_alpha = alpha / len(p_values) # p값을 0.05보다 더 낮추기 위해 시행

# 결과 출력
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})")

 

5. 카이제곱검정

 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정(적합도 검정)하거나 두 범주형 변수 간의 독립성을 검정(독립성 검정)하기 위해 사용한다.

- 적합도 검정

 관찰된 분포와 기대된 분포가 일치하는지 검정하는 것으로 p값이 높으면 데이터가 귀무가설에 잘 맞아 '관찰된 데이터와 귀무가설이 적합'한 것을 뜻하며 p값이 낮으면 데이터가 귀무가설에 잘 맞이 않아 '관찰된 데이터와 귀무가설이 부적합'함을 뜻한다.

 주사위의 각 면이 동일한 확률로 나오는지 검정할 때 사용 가능하다.

- 독립성 검정

두 범주형 변수 간의 독립성을 검정하는 것으로 p값이 높으면 두 변수 간의 관계가 연관성이 없어 '독립성이 있'음을 뜻하며 p값이 낮으면 두 변수 간의 관계가 연관성이 있어 '독립성이 없음'을 뜻한다.

 성별과 직업 만족도 간의 독립성 검정에 사용 가능하다.

# 적합도 검정
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}")

 

- stats.chisquare

 scipy.stats.chisquare 함수는 카이제곱 적합도 검정을 수행하여 관찰된 빈도 분포가 기대된 빈도 분포와 일치하는지 평가한다. 이 검정은 주로 단일 표본에 대해 관찰된 빈도가 특정 이론적 분포(예: 균등 분포)와 일치하는지 확인하는 데 사용된다.

반환값 < chi2 - 카이제곱 통계량 >, < p - 관찰된 데이터가 귀무 가설 하에서 발생할 확률 >

 

- stats.chi2_contingency

scipy.stats.chi2_contingency 함수는 카이제곱 검정을 수행하여 두 개 이상의 범주형 변수 간의 독립성을 검정한다. 이 함수는 관측 빈도를 담고 있는 교차표(contingency table)를 입력으로 받아 카이제곱 통계량, p-값, 자유도, 그리고 기대 빈도(expected frequencies)를 반환한다.

 반환 값 < chi2 - 카이제곱 통계량 >, < p - 관측된 데이터가 귀무 가설 하에서 발생할 확률 >, < dof - 자유도, (행의 수 - 1) * (열의 수 - 1)로 계산 >, < expected - 기대 빈도, 행 합계와 열 합계를 사용하여 계산된 이론적 빈도 >

 

6. 제 1종 오류와 제 2종 오류

- 제 1종 오류(위양성)

 귀무가설이 참인데 기각하는 오류를 말한다. 잘못된 긍정(아무런 영향이 없는데 영햐이 있다)을 의미한다.

 α를 경계로 귀무가설을 기각하기 때문에 제1종 오류가 α만큼 발생하므로 유의수준(α)을 정함으로써 제 1종 오류를 제어할 수 있다.

- 제 2종 오류(위음성)

 귀무가설이 거짓인데 기각하지 않는 오류를 말한다. 잘못된 부정(영향이 있는데 영향이 없다)을 의미한다.

 제 2종 오류가 일어날 확률은 β로 정의하고 제 2종 오류가 일어나지 않을 확률은 검정력(1-β)으로 정의한다.