目錄
一、項目背景
二、字段說明
三、資料處理
1.導入庫
2.讀取資料
3.檢視資料
4 資料預處理
4.1 檢查錯誤資料
5 假設校驗
5.1 提出零假設和備擇假設
5.2 确定抽樣分布類型
5.3 确定檢驗類型
5.4 确定檢驗方向
5.5 顯著性水準α
5.6 計算校驗統計量
一、項目背景
資料集來源于一家電商網站,希望通過對于一次AB測試資料的分析判斷新舊兩版頁面在使用者轉化上是否有顯著差別,幫助公司決定是應當采用新的頁面,還是保留老的頁面。
二、字段說明
user_id :使用者ID
timestamp :使用者行為時間戳
group :分組标簽:control-對照組;treatment-實驗組
landing_page :展示的頁面版本
converted :是否轉化:0-沒有轉化;1-有轉化
三、資料處理
1.導入庫
import pandas as pd
import os
from scipy.stats import norm
import numpy as np
2.讀取資料
df=pd.read_csv('ab_data.csv')
3.檢視資料
df.info()
df.describe()
df.describe(include='object')
df.head()
4 資料預處理
4.1 檢查錯誤資料
df[((df['group']=='control')&(df['landing_page']=='new_page'))|((df['group']=='treatment')&(df['landing_page']=='old_page'))]
存在資料是對照組且為新頁面,實驗組且為舊頁面,需要删除
df=df[((df['group']=='control')&(df['landing_page']=='old_page'))|((df['group']=='treatment')&(df['landing_page']=='new_page'))]
4.2 删除重複值
df.duplicated(subset='user_id').sum()
存在一條重複值,需要删除
df.drop_duplicates(subset='user_id',keep='first',inplace=True)
df.reset_index(inplace=True)
# 檢查流量占比
df[df.group=='control'].shape[0]/df[df.group=='treatment'].shape[0]
新、舊版本流量占比基本一比一
5 假設校驗
5.1 提出零假設和備擇假設
舊頁面的轉化率設為p1,新頁面的轉化率設為p2
- 零假設: p1>p2 即p1-p2>0
- 備擇假設: p1<p2 即p1-p2<0
5.2 确定抽樣分布類型
本次實驗滿足的判斷結果隻有0和1(轉化和未轉化),符合0-1分布
5.3 确定檢驗類型
獨立雙樣本,樣本n>30,總體的均值和标準差未知,用Z檢驗。
5.4 确定檢驗方向
判斷是否相等就是雙側,是否大于或小于就是單測。根據備擇假設,确定檢驗方向為單側(左尾)
5.5 顯著性水準α
本次檢驗α取0.05
5.6 計算校驗統計量
# 舊頁面的使用者數
n_old=df[(df.group=='control')].shape[0]
# 新頁面的使用者數
n_new=df[(df.group=='treatment')].shape[0]
# 舊頁面的轉化使用者數
n_convert_old=df[(df.group=='control')&(df.converted==1)].shape[0]
# 新頁面的轉化使用者數
n_convert_new=df[(df.group=='treatment')&(df.converted==1)].shape[0]
# 舊頁面的轉化率
p_old=n_convert_old/n_old
# 新頁面的轉化率
p_new=n_convert_new/n_new
print('舊頁面的轉化率{:.6f},新頁面的轉化率{:.6f}'.format( p_old, p_new))
# 轉化率的聯合估計
p_c=(n_convert_old+n_convert_new)/(n_old+n_new)
print('轉化率的聯合估計:', p_c)
# 檢驗統計量z
z=(p_old - p_new)/ np.sqrt(p_c*(1 - p_c)*( 1/n_old + 1/n_new))
print('檢驗統計量z:', z)
# z_alpha
z_alpha=norm.ppf(0.05) # 若為雙側,則norm.ppf(0.05/2)
print('z-alpha:{:.2f}'.format(z_alpha))
if abs(z)>abs(z_alpha):
print('拒絕零假設')
else:
print('支援零假設')