<TIL> 2024-03-21
- 오늘 진행한 일
- 개인 프로젝트 대시보드 작성
- A/B 테스트 관련 내용 검색 및 학습
- SQL 코드테스트
https://jinhyunbae.tistory.com/168
<TIL> 2024-02-28
오늘 진행한 일 SQL 코딩 테스트 개인 프로젝트 (통계 분석) 하루 루틴인 SQL 코딩테스트 3문제를 클리어한 뒤 개인 프로젝트 데이터에 대한 전처리 및 통계분석을 실시했다. 우선 어제 EDA를 해본
jinhyunbae.tistory.com
한 달 전쯤 프로젝트를 시작하기 전에 개인 프로젝트 용으로 찾아놨던 데이터에 대해서
간단하게 EDA를 하고 전처리 한 뒤 통계 분석까지 했던 것을 이제 대시보드화 하기 위해서
다시 훑어보기 시작했다.
A/B 테스트 결과 해석에서 자주 발생하는 12가지 함정들
[Microsoft Research] Common Metric Interpretation Pitfalls in A/B Test
medium.com
지난 번에는 이상치를 단순히 Z-score를 기준으로 잘라서 제거를 하는 방식으로 진행을 했는데
위 블로그를 참고해서 여러 방식으로 이상치에 대한 대처를 고민해보고 이를 반영하였다.
def z_score_outlier_remover(df:pd.DataFrame, threshold:float) -> pd.DataFrame :
total_outlier_count = 0
iteration = 0
outlier_df_list = []
if threshold <= 0:
raise ValueError("Threshold must larger than zero")
while True:
iteration += 1
m = df['sum_gamerounds'].mean()
s = df['sum_gamerounds'].std()
ser_outlier_bool = ((df['sum_gamerounds']-m)/s).abs() > threshold
outlier_count = ser_outlier_bool.sum()
print(f'{iteration}회차 반복 : outlier의 개수는 {outlier_count}개 입니다.')
if outlier_count > 0:
outlier_df_list.append(df[ser_outlier_bool])
total_outlier_count += outlier_count
df = df[~ser_outlier_bool]
else:
if total_outlier_count > 0:
print(f"The number of outliers(z-score > {threshold}): {total_outlier_count}")
break
return df, outlier_df_list
이상치 처리에 있어서 반복문을 이용해서 Z-score 3 기준으로 이상치를 정제 한 뒤 이상치를 확인하는 방식으로
데이터를 정제하였다.
print(cookie_cats['sum_gamerounds'].mean())
print(outlier_df['sum_gamerounds'].mean())
51.8724567297564
199.43998356518168
이렇게해서 정제한 데이터의 평균과 기존 데이터의 평균을 비교해 보았을 땐 상당히 큰 차이가
있는 것을 알 수 있었다.
이렇게 이상치를 제거한 상태에서 통계분석한 결과로 대시보드를 작성하였다.
아래는 간단하게 틀만 잡은 대시보드이다.
분석은 지난 번과 동일하게 gate30과 gate40 집단의 Sum_GameRound의 평균차이와
retention_1, retention_7의 여부 독립성 검정으로 수행하였다.
분석 결과 세 분석 모두 통계적으로 유의한 것으로 나타나였다.
다시 말해 gate30의 Sum_GameRound보다 gate40의 Sum_GameRound가 낮았으며
retention_1과 7의 여부는 gate의 차이와 독립적이지 않았다. 즉 연관이 있었다.
다음주 내로 위 내용을 좀 더 잘 정리한 다음에 A/B 테스트에 대한 포트폴리오를 작성하고자 한다.