배또가또 2024. 3. 21. 22:44
  • 오늘 진행한 일 
    • 개인 프로젝트 대시보드 작성
    • A/B 테스트 관련 내용 검색 및 학습
    • SQL 코드테스트

https://jinhyunbae.tistory.com/168

 

<TIL> 2024-02-28

오늘 진행한 일 SQL 코딩 테스트 개인 프로젝트 (통계 분석) 하루 루틴인 SQL 코딩테스트 3문제를 클리어한 뒤 개인 프로젝트 데이터에 대한 전처리 및 통계분석을 실시했다. 우선 어제 EDA를 해본

jinhyunbae.tistory.com

 

한 달 전쯤 프로젝트를 시작하기 전에 개인 프로젝트 용으로 찾아놨던 데이터에 대해서 

간단하게 EDA를 하고 전처리 한 뒤 통계 분석까지 했던 것을 이제 대시보드화 하기 위해서 

다시 훑어보기 시작했다. 

 

https://medium.com/bondata/a-b-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B2%B0%EA%B3%BC-%ED%95%B4%EC%84%9D%EC%97%90%EC%84%9C-%EC%9E%90%EC%A3%BC-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-12%EA%B0%80%EC%A7%80-%ED%95%A8%EC%A0%95%EB%93%A4-2fe273b76a2d

 

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 테스트에 대한 포트폴리오를 작성하고자 한다.