카테고리 없음

데이터분석 - A/B 테스트, 유의수준, 검정통계량과 p-value

박지강(Data_2기) 2024. 6. 14. 21:12

01. 데이터 분석가의 통계적 실험

 

통계적 실험

정의 어떤 목적을 가지고 관찰을 통해 측정값을 얻어내는 것
목적 통계적 추론을 통해 보다 진실에 가까운 값을 도출하기 위함
프로세스 가설 수립 - 실험 설계 - 데이터 수집 - 추론 및 결론의 도출

02. A/B TEST

 

개념이해

A/B 테스트 : 마케팅 고객데이터 분석중 가장 널리 사용되는 방법. 대조실험(가설을 입증하기 위해 대조군, 실험군을 설정하고 검증)과 같다. 따라서, 테스트 과정에서 다양한 통계적 개념을 바탕으로 실험이 진행된다.


프로세스

순서 내용
1 현행 데이터 탐색
- 앞서 살펴본 주요 지표를 기준으로 현재 데이터 탐색
2 가설 설정
- 비즈니스 목표를 달성하는 데 필요한 KPI를 정의
- KPI 전환율을 증가를 위한 귀무가설, 대립가설을 설정

- 귀무가설
- 통계학에서 처음부터 버릴 것을 예상하는 가설
- 차이가 없거나 의미 있는 차이가 없는 경우의 가설(새로운 광고배너를 게재해도 기존과 차이 없을 것이다.)

- 대립가설
- 귀무가설에 대립하는 명제(새로운 광고배너를 게재하면 기존과 차이가 있을 것이다.)

3 유의수준 설정
- 귀무가설이 맞을 때 오류를 얼마나 허용할 것인지 기준을 정하는 단계
4 테스트 설계 및 실행
- 사용자를 대조군과 실험군의 두 그룹으로 분리
- 대조군 그룹에게는 제품이나 서비스의 현재 버전을 보여주고, 실험군 그룹에게는 개 버전을 노출 처리
5 테스트 결과 분석
- 측정 항목(가설)에 대해 두 그룹의 결과를 분석(검정통계량 분석)
- 통계적 방법으로 결과를 분석하여 대조군과 실험군 사이의 통계적으로 유의미한 차이가 있는지 확인

 

A/B테스트 주의사항

  • 적절한 표본 크기 : 표본의 크기가 충분하지 않으면 유의미한 결과를 얻을 수 없다.
  • 하나의 변수만 변경 : 하나의 변수만을 변경해야 한다.
  • 무작위성 : 무작위로 선택된 사용자들에게 각각 다른 변수를 적용해야 한다.
  • 적절한 분석 방법 : 결과를 해석할 때는 가설 검증을 위한 통계적 분석 방법을 선택하고, 유의수준을 설정해야 한다.
  • 테스트 결과의 의미 : 결과가 통계적으로 유의미하더라도 항상 실제로 의미 있는 결과인지 한 번 더 생각해보아야한다.
  • 정해진 기간 동안 진행 : 일정 기간 동안에만 결과를 수집하고, 분석해야 한다.

03. 유의수준 설정하기

 

유의수준 = 오류 허용 범위

가설 검정에서 결론을 해석하기 위해서는 기준을 세우고, 그 기준을 만족하는지 확인해야한다. 여기서 그 기준이 되는 것이 유의수준이다.

 

유의수준 : 귀무가설이 맞을 때 오류허용 기준(확률)

α로 표시하고 95%의 신뢰도를 기준으로 한다면 (1-0.95)인 0.05값이 유의수준 값이 된다.

유의수준은 신뢰수준의 반대 개념 = 오류가 나타날 확률

확률값이므로 0부터 1 사이의 값을 가진다.


04. 검정통계량과 P-VALUE

 

결과 해석 단계 1 : 검정 방식 정하기 & 검정통계량 계산하기

 

검정통계량 : 귀무가설을 채택 또는 기각하기 위해 사용하는 확률변수를 의미

확률변수 : 특정 확률로 발생하는 각각의 결과를 수치값으로 표현하는 변수 X

 

검정통계량은 표본 평균, 비율, 상관계수 간의 차이 등 다양한 형태를 취할 수 있다.

검정 방식 검정통계량 비교대상 대상
Z검정 Z-VALUE 표본의 평균(차이 분석)
모집단의 분산을 알 수 있는 경우
연속형 자료
T검정 T-VALUE 표본의 평균(차이 분석)
모집단의 분산을 알 수 없는 경우
연속형 자료
카이제곱검정 x^2-VALUE 표본의 분산(상관관계 분석) 범주형 자료
F 검정 F-VALUE 표본의 분산(상관관계 분석) 범주형 자료

 

결과 해석 단계 2 : P-VALUE

 

P-VALUE : Probablity-value, 확률. 0이상 1이하의 값을 가진다.

 

유의수준보다 VALUE가 작은 경우에 우연히 일어날 가능성이 거의 없어 대립가설을 채택하게 될 수 있다.

p-value가 0.05보다 작다 = 우연히 일어났을 가능성이 거의 없다. = 인과관계가 있다고 추정 = 대립가설 채택
p -value가 0.05 보다 크다 = 우연히 일어났을 가능성이 높다. = 인과관계가 없다고 추정 = 대립가설 기각

중심극한정리를 통해, 모집단이 큰 경우 표본이평균이 정규분포를 따르게 된다고 가정.

정규분포의 그래프 아래쪽이 확률값.

우리는 유의 수준을 설정하고, p-value를 도출해서 의미를 해석

# 라이브러리 호출 
import pandas as pd
import numpy as np 
# 과학 계산용 파이썬 라이브러리 
import scipy.stats as stats
from PIL import Image

df = pd.read_csv("users1.csv")

#t-test
# 가설 설정
# 귀무가설: 남성과 여성의 구매금액에 차이가 없을 것이다 
# 대립가설: 남성과 여성의 구매금액에 차이가 있을 것이다
# 실제 데이터 비교
df.groupby(['Gender'])['Purchase Amount (USD)'].mean().reset_index()

# 데이터 분리 
# mask method 
mask=(df['Gender']=='Male')
mask1 = (df['Gender']=='Female')

m_df = df[mask]
f_df = df[mask1]

# 결제금액 컬럼만 가져오기 
m_df=m_df[['Purchase Amount (USD)']]
f_df=f_df[['Purchase Amount (USD)']]

# 차이가 있는 것으로 보여짐
# 유의수준은 통상적으로 많이 쓰이는 0.05 로 정함 
# scipy 라이브러리를 이용해 t-score 와 pvalue 를 확인할 수 있습니다. 
# t-test 는 표본의 평균(차이 분석)을 알고자 할 때 사용되며, 모집단의 분산을 알 수 없는 경우 주로 사용됩니다. 
t, pvalue=stats.ttest_ind(m_df, f_df)

# tscore 는 그룹 간 얼마나 차이가 있는지에 대한 지표
# tscore 가 크면 그룹 간 차이가 큼을 의미합니다.

# p-value 는 우연에 의해 나타날 확률에 대한 지표입니다.
# p-value가 0.05 보다 크다 = 우연히 일어났을 가능성이 높다 = 인과관계가 없다고 추정 
# 여기서 p-value 값은 0.05 보다 크므로, 인과관계가 없다고 추정할 수 있습니다. 
# 대립가설 기각
t, pvalue

#카이제곱검정
# 가설 설정
# 귀무가설: 성별과 구매Size 에는 관련성이 없을 것이다 
# 대립가설: 성별과 구매Size 에는 관련성이 있을 것이다 
# 실제 데이터 비교
df.groupby(['Gender','Size'])['Customer ID'].count().reset_index()

# pandas 라이브러리의 crosstab 함수를 통해, 두 범주형 자료의 빈도표를 만들어 주겠습니다.

result = pd.crosstab(df['Gender'], df['Size'])

# 카이제곱 검정을 stat 함수를 통해 구현
# chi2_contingency를 통해, 카이제곱통계량, p-value를 출력할 수 있습니다.  
stats.chi2_contingency(observed=result)

# 각 값들을 별도로 보기
# 카이제곱 검정 통계량, pvalue, 자유도를 확인할 수 있습니다. 
stats.chi2_contingency(observed=result)[0]

# p-value 는 우연에 의해 나타날 확률에 대한 지표입니다.
# p-value가 0.05 보다 크다 = 우연히 일어났을 가능성이 높다 = 인과관계가 없다고 추정 
# 여기서 p-value 값은 0.05 보다 크므로, 인과관계가 없다고 추정할 수 있습니다. 
# 대립가설 기각
stats.chi2_contingency(observed=result)[1]

# 자유도와 유의수준을 통해 귀무가설 기각 여부를 판단하기도 합니다. 
# 자유도란, 굉장히 복잡한 개념이므로,,, (변수1 그룹의 수-1)*(변수2 그룹의 수-1) 가 되겠습니다. 
# 1*3 = 3 이 도출되었습니다. 
stats.chi2_contingency(observed=result)[2]