데이터를 기반으로

A/B 테스트 - 1(집단 분할) 본문

통계/검정

A/B 테스트 - 1(집단 분할)

이노후 2020. 7. 12. 01:02
728x90
반응형

안녕하세요!


오늘은 과거에 진행했던 A/B테스트에 대해서 정리를 해볼까 합니다!!


사실 아직 유명하지 않은 쇼핑몰이고 고객이 적은 부분을 감안하여 본 글을 읽어주셨으면 합니다 :)




저희 회사에서 운영하는 쇼핑몰이 있어 고객들에게 할인 문자를 보내는 프로모션을 진행하고자 했습니다.


그 중 프로모션 관련 문자에 대한 A/B 테스트를 진행했습니다.


A그룹(통제집단)은 일반적으로 기존에 저희가 보냈던 문구로 보내고


B그룹(실험집단)은 할인율을 강조하는 문구로 문자를 보내고자 했습니다.




우선 그룹을 구성하기 전 저는 모집단에서 표본을 추출할 때 층화표본추출법을 이용하고자 하였습니다.

※ 모집단(쇼핑몰 고객 중 구매 이력이 1회 이상인 고객)




우선 층화추출법에 대한 위키백과에 나온 설명입니다~~ 다들 한번에 이해가실 것이라 생각하고 넘어가겠습니다!


제가 층화추출법을 이용한 이유는 구매 이력의 시간에 따라 고객들의 성향이 조금 씩 다를 것이라 예상하였기 때문입니다.



그렇게 저는 층을 총 3가지로 나누었습니다.


1. 1~2개월 이내 구매이력이 있는 고객들


2. 3~6개월 이내 구매이력이 있는 고객들


3. 6개월 이후 구매이력이 있는 고객들



가장 먼저 고객을 추출해야할 시간입니다!!


큰 회사는 데이터 분석가가 DB 접근권한이 없는 곳도 있다고 이야기들었습니다....ㅠㅠ 데이터 신청을 따로 IT부서에 요청해서 csv파일로 받아서 작업을 한다고 하는 곳도 있다고 들었습니다..ㅠㅠ


하지만!!! 저희 회사는!!!!


데이터 분석가도 DB 접근권한이 있어서 아주 편하게 데이터 추출을 하고 있습니다!! ㅎㅎㅎ

(그 덕분에 쿼리를 짜야하는 고생이 추가되었지만요...)




pymysql 이라는 패키지를 통해 DB Connection을 해서 쿼리를 날려 해당 데이터를 받아오는 작업입니다!


해당 코드는 저희 DB 접속정보 및 테이블에 대한 정보를 보게되면 제가 어디회사인지 추측이 가능할까봐 살짝 지운점 양해 부탁드립니다~ㅎ


저희 DB는 Mysql 을 사용하고 고객 데이터 추출할 때 case 문으로 구매날짜로 하나의 컬럼을 새로 생성하여 추출했습니다.



그렇게!!! 데이터를 얻어왔습니다!!! ㅎㅎㅎ


데이터 또한 고객 정보가 포함되어 있고 사내 데이터이다 보니 사진으로 보여드릴 수 없는 점 양해부탁드립니다 ㅠㅠ흑흑



그렇게 뽑은 데이터로 이제 각각의 샘플링을 해봐야겠죠?


우선 코드에 앞서 설명을 드리면


df_os_cs : 데이터 프레임

df_os_cs 중 order_gb는 상단에 데이터 뽑을 때 구분했던 gb 값

mb_id는 고객 아이디 입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rm1=df_os_cs.loc[df_os_cs['order_gb']=='3~6개월전 구매자'].sample(n=1)
rm2=df_os_cs.loc[df_os_cs['order_gb']=='6개월이후 구매자'].sample(n=1)
rm3=df_os_cs.loc[df_os_cs['order_gb']=='1~2개월 내 구매자'].sample(n=1)
 
df_os_cs1=df_os_cs.loc[(df_os_cs['mb_id'].isin(rm1['mb_id'])==False) &
                       (df_os_cs['mb_id'].isin(rm2['mb_id'])==False) &
                       (df_os_cs['mb_id'].isin(rm3['mb_id'])==False)]
 
def sampling_func(data, sample_pct):
    np.random.seed(123)
    N = len(data)
    sample_n = int(len(data)*sample_pct) # integer
    sample = data.take(np.random.permutation(N)[:sample_n])
    return sample
 
sample_set_A = df_os_cs1.groupby('order_gb', group_keys=False).apply(sampling_func, sample_pct=0.5)
sample_set_B = df_os_cs1.loc[df_os_cs1['mb_id'].isin(sample_set_A['mb_id'])==False]
 
sample_set_A['gb']='C'
sample_set_B['gb']='D'
df_os_cs1=pd.concat([sample_set_A,sample_set_B])
cs


우선 통계학과 출신이다 보니 뭔가 샘플링도 그룹별로 숫자가 딱딱 맞았으면 하는 저의 바램때문에...


각 층별 수를 맞추기위해 랜덤하게 1명씩을 제외했습니다...하핳ㅎ


그러고 난뒤 그 램덤하게 뽑힌 1명을 제외한 데이터 프레임에서


샘플링을 진행하였습니다!!


sample_pct는 샘플링할 퍼센트지여서 50%만 추출을 한뒤 그 50%를 제외한 나머지 그룹을 나머지 집단으로 만들었습니다!!


혹시 제가 헷갈릴까봐 sample_set_A는 구분자 'C'로 B는 'D'로 만들어 두었습니다!! ㅎㅎ



여기까지가 A/B테스트의 집단을 나누는 과정에 대한 설명이었습니다! ㅎㅎ


다음 글에 A/B테스트 실행과 결과에 대한 글을 올리도록 하겠습니다~ㅎㅎ


긴 글 읽어주셔서 감사합니다!!


 



728x90
반응형