数据分析实践——AB测试【python】

1、项目简介

\quad \quad 我们现在网站也给开通了,然后我们给网站投放广告的时候,一开始给大家看到的落地页是访问课程资料,现在我们又推出了开始免费试学这个落地页,要求检测两个落地页的转化效果了,下面是测试的24天,看数据会有24天的。AB测试理论

2、数据集简介

\quad \quad 本数据集来源AB测试

\quad \quad 本数据集包含了测试时长24天内的数据。

  • user_id:用户id
  • timestamp:时间戳
  • group:把新的落地页分到treatment组、把旧的落地页分到了control组
  • landing_page:落地页
  • converted:是否转化,1表示转化,0表示未转化

3、实践

3.1 导入相关库

import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt

3.2 数据处理

1、导入数据

# 导入数据
df = pd.read_csv('E:/ab_data.csv')

# 查看数据首尾5行
df.head().append(df.tail())

在这里插入图片描述

2、描述性分析

# 查看数据形状
print(df.shape)
# 查看数据信息
print(df.info())
(294478, 5)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 294478 entries, 0 to 294477
Data columns (total 5 columns):
 #   Column        Non-Null Count   Dtype 
---  ------        --------------   ----- 
 0   user_id       294478 non-null  int64 
 1   timestamp     294478 non-null  object
 2   group         294478 non-null  object
 3   landing_page  294478 non-null  object
 4   converted     294478 non-null  int64 
dtypes: int64(2), object(3)
memory usage: 11.2+ MB
None

3、查看缺失值

# 查看缺失值
df.isnull().sum()  # 没有缺失值

4、清洗数据

  • 根据分流的规则:treatment实验组对应new_page,control 控制对照组对应old_page。
  • user_id不能重复
# 查看对于treatment和 new_page,或者control和old_page会出现不一致的行
df.loc[(df['group'] == 'treatment') != (df['landing_page'] == 'new_page')].count()

Output:

user_id         3893
timestamp       3893
group           3893
landing_page    3893
converted       3893
dtype: int64
# 去除无效数据,并将其赋值到df2中
df2 = df.loc[((df['group'] == 'treatment') == (df['landing_page'] == 'new_page'))]
# 删除重复值
df2 = df2.drop_duplicates(subset=['user_id'], keep='first')  # 保留重复项中的第一项
# 查看df2的形状
print(df2.shape)

# 查看df2中是否还有重复值
print(df2.user_id.nunique())
(290584, 5)
290584

3.3 假设检验

验证:新页面转化率高于旧页面转化率
先了解下新旧版本各自对应的转换率

#整体转化率
p_total=df2['converted'].mean()
print('整体转化率%.2f%%'%(p_total*100))  
# 新页面转化率
p_new=df2[df2['landing_page'] == 'new_page']['converted'].mean()
print('新页面转化率%.2f%%'%(p_new*100))   
# 旧页面转化率
p_old=df2[df2['landing_page'] == 'old_page']['converted'].mean()
print('旧页面转化率%.2f%%'%(p_old*100))    

Output:

整体转化率12.17%
新页面转化率12.30%
旧页面转化率12.04%

原假设H0:P_new-P_old<=0
备择假设H1:P_new-P_old>0

根据备择假设 ,假设条件中符号为“>”,因此检验方向应为单侧右尾;

样本大于30,总体的均值和标准差未知,用Z检验检验方法可为以下几类:

方法一:根据公式计算检验统计量Z值

Z = P b − P a P b ( 1 − P b ) N b + P a ( 1 − P a ) N a Z=\frac{P_b-P_a}{\sqrt{\frac{P_b(1-P_b)}{N_b}+\frac{P_a(1-P_a)}{N_a}}} Z=NbPb(1Pb)+NaPa(1Pa) PbPa

# 新页面数量
n_new = df2[df2['landing_page'] == 'new_page'].shape[0]
# 旧页面数量
n_old = df2[df2['landing_page'] == 'old_page'].shape[0]
# 引入SciPy库
from scipy.stats import norm
# 计算显著性检验Z值
z_score = (p_new - p_old) / np.sqrt(p_old * (1 - p_old) / n_old + p_new * (1 - p_new) / n_new)
# 计算置信区间
z_alpha = norm.ppf(0.05)#-1.64485
print("z:",z_score,"z_alpha:",z_alpha)
z: 2.1484251875260187 z_alpha: -1.6448536269514729
  • 可以看出z值在拒绝域内,因此得出结论显著性水平 =0.05时,拒绝零假设。

方法二:使用Python包直接计算

  • Z值和P值可以通过Python包直接算出
import statsmodels.stats.weightstats as sw
z_value, p_value = sw.ztest(df2.query('landing_page=="new_page"')['converted'], df2.query('landing_page=="old_page"')['converted'],
                        alternative='larger')
#依照备择假设的设定输入,alternative='smaller'表示左尾,'larger'表示右尾
print(z_value,p_value)
2.148415338961362 0.01584038766094882
  • Z值与公式所得基本一致。p=0.0158< =0.05,因此拒绝零假设。

4、总结

\quad \quad 本文对ABtest进行数据统计,分析新旧页面的转化率以及其他因素的影响。通过分析可知,零假设不成立,即拒绝旧页面转化率高于或等于新页面的可能,新页面的转化率很大机会高于旧页面,也就意味着我们可以将新页面投入使用了。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值