A / B 테스트 : Python의 단계별 가이드

실험 설계에서 가설 테스트까지

이 도움말에서는 가설을 세우고, 테스트하고, 결과를 해석하는 것부터 A / B 실험을 분석하는 과정을 살펴 보겠습니다. 데이터의 경우 웹 사이트 페이지의 2 가지 다른 디자인 (old_page vs. new_page)에 대한 A / B 테스트 결과가 포함 된 Kaggle의 데이터 세트를 사용합니다. 내가 사용한 코드를 따르고 싶다면 내 GitHub 페이지에서 jupyter 노트북을 자유롭게 다운로드하세요.

우리가 할 일은 다음과 같습니다.

좀 더 현실적으로 만들기 위해 다음은 연구를위한 잠재적 인 시나리오 입니다.

중규모 온라인 전자 상거래 비즈니스 의 제품 팀에서 일한다고 가정 해 보겠습니다. UX 디자이너는 더 높은 전환율로 이어질 것이라는 희망으로 제품 페이지의 새 버전에서 정말 열심히 작업했습니다. 제품 관리자 (PM)는 현재 전환율 이 1 년 내내 평균 약 13 % 이며 팀은 증가율에 만족할 것이라고 말했습니다. 2 % , 즉 전환율을 15 %로 높이면 새 디자인이 성공한 것으로 간주됩니다.

e 변경 사항을 배포하기 전에 팀은 적은 수의 사용자에게 변경 사항을 테스트하여 성능을 확인하는 것이 더 편하므로 <일부 사용자 기반 사용자에 대한 강력한> A / B 테스트

1. 실험 설계

가설 수립

먼저 우리는 프로젝트를 시작할 때 가설을 세우고 싶습니다. 이렇게하면 결과에 대한 우리의 해석이 정확할뿐만 아니라 엄격하다는 것을 확인할 수 있습니다.

새 디자인이 현재 디자인보다 더 나은지 또는 더 나빠질 지 (또는 동일합니까?) 알 수 없으므로 양측 테스트 를 선택합니다.

Hₒ : p = p

Hₐ : p p

여기서 p p 는 각각 새 디자인과 기존 디자인의 전환율을 나타냅니다. 또한 신뢰 수준을 95 %로 설정합니다.

α = 0.05

α 값은 우리가 설정 한 임계 값으로, “결과를 관찰 할 확률이 극단적이거나 그 이상인 경우 ( p -value )이 α 보다 낮 으면 Null 가설을 기각합니다.” α = 0.05 (5 % 확률을 나타냄)이므로 신뢰도 (1 — α )는 95 %입니다.

위 내용에 익숙하지 않더라도 걱정하지 마십시오.이 모든 것은 테스트에서 새로운 디자인에 대해 관찰 한 전환율이 무엇이든간에 통계적으로 전환율과 차이가 있다는 95 % 확신을 원한다는 것을 의미합니다. Null 가설 Hₒ를 거부하기 전에 이전 설계의

변수 선택

테스트를 위해서는 두 그룹 이 필요합니다.

이것은 독립 변수 가됩니다. 기준 전환율을 알고 있지만 두 그룹이있는 이유는 계절 성과 같이 결과에 영향을 미칠 수있는 다른 변수를 제어하고 싶기 때문입니다. control 그룹을 사용하면 그룹 간의 체계적인 유일한 차이점은 제품 페이지의 디자인이기 때문에 결과를 treatment 그룹과 직접 비교합니다. 따라서 결과의 차이를 디자인에 기인 할 수 있습니다.

종속 변수 (즉, 측정하려는 항목)의 경우 전환율 을 파악하는 데 관심이 있습니다. 이것을 코딩 할 수있는 방법은 바이너리 변수를 사용하는 각 사용자 세션에 의한 것입니다.

이렇게하면 각 그룹의 평균을 쉽게 계산하여 각 디자인의 전환율을 얻을 수 있습니다.

샘플 크기 선택

전체 사용자층 (인구)을 테스트하지 않기 때문에 얻을 수있는 전환율은 필연적으로 실제 비율의 추정 일뿐입니다.

각 그룹에서 캡처하기로 결정한 사용자 (또는 사용자 세션) 수는 예상 전환율의 정밀도에 영향을 미칩니다. 샘플 크기가 클수록 예상치가 더 정확 해집니다. (즉, 신뢰 구간이 작을수록 두 그룹이있는 경우 차이를 감지 할 확률이 높아집니다

.

반면에 샘플이 커질수록 연구 비용이 더 많이 들고 비실용적입니다.

그러면 각 그룹에 몇 명의 사람이 있어야합니까?

필요한 표본 크기는 검증력 분석 이라는 것을 통해 추정되며 다음과 같은 몇 가지 요인에 따라 달라집니다.

우리 팀은 2 %의 차이에 만족할 것이기 때문에 예상되는 효과 크기를 계산하는 데 13 %와 15 %를 사용할 수 있습니다.

다행히도 Python이 이러한 모든 계산을 처리합니다 .

4720

각 그룹에 대해 최소 4720 개의 관찰 이 필요합니다.

실제로 power 매개 변수를 0.8로 설정한다는 것은 설계간에 전환율에 실제 차이가있는 경우 차이가 우리가 추정 한 차이라고 가정하고 (13 % 대 15 %) , 계산 한 표본 크기로 테스트에서 통계적으로 유의미한 것으로 감지 할 확률이 약 80 %입니다.

2. 데이터 수집 및 준비

대단합니다! 이제 필요한 샘플 크기가 확보되었으므로 데이터를 수집해야합니다. 일반적으로이 시점에서 엔지니어링 팀의 도움을 받아 팀과 협력하여 실험을 설정하고 필요한 샘플 크기에 따라 충분한 데이터를 수집해야합니다.

그러나 온라인에서 찾은 데이터 세트를 사용하므로이 상황을 시뮬레이션하기 위해 다음을 수행합니다.

* 참고 : 일반적으로 4 단계는 수행 할 필요가 없습니다. 이것은 연습을위한 것입니다.

이미 데이터 세트를 다운로드 했으므로 2 번으로 바로 이동하겠습니다.

DataFrame에는 각각 사용자 세션을 나타내는 294478 개의 행 5 개의 열 이 있습니다.

실제로는 그룹 변환 된 열만 분석에 사용합니다.

계속해서 데이터를 샘플링하여 하위 집합을 가져 오기 전에 여러 번 샘플링 된 사용자가 없는지 확인하겠습니다.

데이터 세트에 여러 번 나타나는 3894 명의 사용자가 있습니다.

사실 3894 명의 사용자가 두 번 이상 나타납니다. 숫자가 매우 적으므로 동일한 사용자를 두 번 샘플링하지 않도록 DataFrame에서 제거하겠습니다.

업데이트 된 데이터 세트에는 이제 286690 개의 항목이 있습니다.

샘플링

이제 DataFrame이 멋지고 깨끗해 졌으므로 각 그룹에 대한 n = 4720 항목을 계속해서 샘플링 할 수 있습니다. 팬더를 사용할 수 있습니다. & # x27; 이를 위해 DataFrame.sample () 메서드를 사용하면 단순 무작위 샘플링이 수행됩니다.

참고 : 자신의 노트북에서 다음을 따르고 싶은 경우 결과를 재현 할 수 있도록 random_state = 22 를 설정했습니다. random_state = 22를 사용하면됩니다. 함수에 입력하면 저와 동일한 샘플을 얻을 수 있습니다.

& lt; class & # x27; pandas.core.frame.DataFrame & # x27; & gt;
RangeIndex : 항목 9440 개, 0 ~ 9439
데이터 열 (총 5 개 열) :
# Null이 아닌 열 개수 Dtype
--- ------ -------------- -----
0 user_id 9440 non-null int64
타임 스탬프 1 개 9440 null이 아닌 개체
2 그룹 9440 null이 아닌 개체
3 land_page 9440 null이 아닌 개체
4 개 변환 된 9440 null이 아닌 int64
dtypes : int64 (2), object ( 3)
메모리 사용량 : 368.9+ KB

control 4720
treatment 4720
이름 : 그룹, dtype : int64

좋습니다. 모든 것이 계획대로 진행된 것 같습니다. 이제 결과를 분석 할 준비가되었습니다.

3. 결과 시각화

가장 먼저 할 수있는 일은 기본 통계 를 계산하여 샘플이 어떻게 보이는지 파악하는 것입니다.

위의 통계로 판단하면 우리의 두 디자인이 매우 유사하게 수행 한 것처럼 보이며 새 디자인은 약 12.3 % vs. 12.6 % 전환율 .

데이터를 플로팅하면 이러한 결과를 더 쉽게 파악할 수 있습니다.

우리 그룹의 전환율은 실제로 매우 가깝습니다. 또한 control 그룹의 전환율은 평균에 대해 알고있는 것을 고려할 때 예상했던 것보다 낮습니다. 전환율 (12.3 % 대 13 %). 이것은 모집단에서 샘플링 할 때 결과에 ​​약간의 차이가 있음을 보여줍니다.

그래서… 치료 그룹의 가치가 더 높습니다. 이 차이가 통계적으로 유의미한 인가요?

4. 가설 검증

분석의 마지막 단계는 가설을 테스트하는 것입니다. 샘플이 매우 크기 때문에 p -값 (즉, z-test)을 계산하는 데 정규 근사를 사용할 수 있습니다.

다시 말하지만, Python은 모든 계산을 매우 쉽게 만듭니다. statsmodels.stats.proportion 모듈을 사용하여 p -값과 신뢰 구간

을 얻을 수 있습니다.

z 통계 : -0.34
p- 값 : 0.732
ci 95 % 대조군 : [0.114, 0.133]
ci 95 % 처리 그룹 : [0.116, 0.135]

5. 결론 도출

p -value = 0.732가 α = 0.05 임계 값보다 훨씬 높기 때문에 Null 가설 Hₒ를 기각 할 수 없습니다. 이는 새로운 설계가 이전 제품과 크게 다르지 않은 (더 나은 성능은 고사) : (

또한 치료 그룹 ([0.116, 0.135] 또는 11.6-13.5 %)에 대한 신뢰 구간을 살펴보면 다음을 알 수 있습니다.

이것은 새로운 디자인의 실제 전환율이 우리가 기대했던 15 % 목표가 아닌 기준과 유사 할 가능성이 더 크다는 것을 의미합니다. 이것은 우리의 새로운 디자인이 우리의 이전 디자인을 개선 할 가능성이 없다는 추가적인 증거이며, 불행히도 우리는 다시 도면으로 돌아 왔습니다!

읽어 주셔서 감사합니다. 제 GitHub 페이지에서 jupyter 노트북을 다운로드 해 주시기 바랍니다.