浏览时长分析
可视化分析
这里的我们将使用 seaborn 结合 markdown 公式的方式来实现快捷又强大的数据可视化
结果分析
- 新界面的注册率有所提高,而浏览时长方面均呈现轻微的右偏
- 实验组的浏览时长平均值比控制组高 15mins 左右,方差差别不大
所以我们可以初步判断新改版的课程首页更吸引用户,后续将进行假设检验来进一步验证我们的猜想
假设检验
我们将从控制组和实验组中各抽取一定数量的样本来进行假设检验,下面是置信水平 α 的选择经验:
样本量 |
α-level |
≤ 100 |
10% |
100 < n ≤ 500 |
5% |
500 < n ≤ 1000 |
1% |
n > 2000 |
千分之一 |
样本量过大,α-level 就没什么意义了。为了使假设检验的数据样本更加合理,我们可以使用分层抽样。Python 没有现成的库或函数,可以使用前人的轮子。
from mysampling import get_sample # df: 输入的数据框 pandas.dataframe 对象 # sampling:抽样方法 str ## 可选值有 ["simple_random","stratified","systematic"] ## 按顺序分别为: 简单随机抽样、分层抽样、系统抽样 # stratified_col: 需要分层的列名的列表 list,只有在分层抽样时才生效 # k: 抽样个数或抽样比例 int or float ## (int, 则必须大于0; float,则必须在区间(0,1)中) ## 如果 0< k <1, 则 k 表示抽样对于总体的比例 ## 如果 k >=1, 则 k 表示抽样的个数;当为分层抽样时,代表每层的样本量 data =get_sample(df=course, sampling='stratified', stratified_col=['group'], k=300) data.sample(4); data.info()
因为总体未知,所以我们可以使用两独立样本 T 检验,其实双样本 Z 检验也能达到类似的效果
# 总体未知,可采用两独立样本T检验 from scipy import stats exp_duration = data.query('group == "experiment"')['duration'] con_duration = data.query('group == "control"')['duration'] print('两独立样本 T 检验...') stats.ttest_ind(a=exp_duration, b=con_duration) print('-'*45)print('双样本 Z 检验...') import statsmodels. api as sm sm.stats.ztest(x1=exp_duration, x2=con_duration)
不难发现,有时双样本 Z 检验同样可以达到两独立样本 T 检验的效果。
综述,我们将拒绝零假设,接受 “ 新界面的浏览时长显著不同于(高于)旧界面 ” 的这个假设。
AB测试的不足
但 A/B 测试也有不足之处。虽然测试能帮你比较两种选择,但无法告诉你你还没想到的选择,在对老用户进行测试时,抗拒改变心理、新奇效应等因素都可能使测试结果出现偏差。
- 抗拒改变心理:老用户可能会因为纯粹不喜欢改变而偏爱旧版本,哪怕从长远来看新版本更好。
- 新奇效应:老用户可能会觉得变化很新鲜,受变化吸引而偏爱新版本,哪怕从长远看来新版本并无益处。
所以在设计 A/B 测试、基于测试结果得出结论时都需要考虑诸多因素。下面总结了一些常见考虑因素:
- 老用户第一次体验改动会有新奇效应和改变抗拒心理;
- 要得到可靠的显著结果,需要有足够的流量和转化率;
- 要做出最佳决策,需选用最佳指标(如营收 vs 点击率);
- 应进行足够的实验时长,以便解释天/周/季度事件引起的行为变化;
- 转化率需具备现实指导意义(推出新元素的开支 vs 转化率提高带来的效益);
- 对照组和实验组的测试对象要有一致性(两组样本数失衡会造成辛普森悖论等现象的发生)。