写在前面
Random thoughts about A/B testing came into my mind while working at LinkedIn.
A/B测试正被越来越多的公司和科研机构使用,它能让决策告别『拍脑袋』,以实际的试验结果对比展示各个方案间的取舍,从而实现数据驱动的决策。LinkedIn作为业界最早以及最广泛使用A/B测试的科技公司之一,在方法论和工程实现上都有丰富的积累。本篇文章并非对其完整地论述,而是在日常工作中产生的随机总结和思考。
Statistical ABC 本章节分级总结A/B测试的统计学基础。简单明了为先,严谨其次。
LEVEL1: 告别『拍脑袋』
这是树立数据驱动思想的第一步:开发者和产品经理都开始意识到,小至用绿色图标还是红色图标,大到内容流的构成和排序,都不能以『拍脑袋』的方式来决定:这种方法并不能帮助他们找到最优解,且倘若彼此意见不一致,彼此都很难说服对方。
于是他们产生了朴素的想法:给一半人展示绿色图标,同时给另一半人展示红色图标,然后比较两组试验的表现 —— 这就是A/B测试的基本思想。这样一来,A/B测试不仅可以回答『哪种方案更好?』而且可以通过比较定量地分析『好多少?』
LEVEL2: 我的差异显著吗
现在通过试验,产品经理喜爱的绿色和工程师喜爱的红色页面拥有了不同的表现数据。譬如点击率(CTP)对比是10% vs. 11% —— 那么,这足以说明后者更受用户欢迎吗?
除了关心试验数据本身,我们还需要考虑A/B测试结果中产生的组间差异有多大可能来自于随机误差。试想,同样是10% vs. 11%,10/100 vs. 11/100的说服力与1000/10000 vs. 1100/10000的说服力一样吗?直觉告诉我们,样本高达10000时显示出的1%差异似乎更有说服力,而100样本量实验中的仅仅1个转化的差异似乎有更大的可能来自于随机误差。
换而言之,在产品决策者做出决定之前,不仅需要知道实验组与对照组对比表现有多大提升,同时也需要知道观察到的提升有多大可能是来源于试验中的随机误差。
统计学中的假设检验理论为我们提供了量化这种可能性的方法。暂时略去其背后的理论体系,从实用的角度看,现在任何成熟的A/B测试系统都会随着试验结果一并给出一个叫做p-value的统计量,它将告诉我们两组实验数据的差异来自于随机误差的概率。一般地,行业标准可以接受的p-value范围是 <=0.05,换而言之,我们至少有95%的信心推断实验数据的差异确实来源于产品改动而非随机误差 —— 这时我们称组间差异是统计显著的。
LEVEL3 计算关键指标
对于不专门从事数据工作的职位,理解LEVEL2 已经达到了了解A/B测试的基础目标。然而数据分析师仍需要知其所以然,掌握各个关键指标背后的统计计算逻辑,才能有理有据地对实验数据进行详细分析。
仍然以点击率(CTP)为例,假设我们已知实验组的样本总量和点击量分别为(Nt, Xt),对照组的样本总量和点击量分别为(Nc, Xc),如何评价本次试验的显著性?
首先,可以很直观地计算出两个组别在实验中的点击率
$$Pt = \frac {Nt}{Xt} \quad and \quad Pc = \frac {Nc}{Xc}$$
我们进行原假设为『实验组和对照组的点击率没有明显差别』的假设检验,即 $$H_0: Pt - Pc = 0$$
READ MORE
Some frequent needed utilities in Python data scripts —— good to have it by hand when facing puzzle.
ETL import matplotlib.pyplot as plt %matplotlib inline import numpy as np import pandas as pd import seaborn as sns Data Loading
import pandas as pd # From CSV df = pd.read_csv("path") # From Excel df = pd.read_excel('/path') # From database (sqlite) import sqlite3 conn = sqlite3.connect("foo.db") cur = conn.cursor() #Check how many tables are there in the database cur.
READ MORE
介绍 数据工程项目往往严格遵循着riro (rubbish in, rubbish out) 的原则,所以我们经常说数据预处理是数据工程师或者数据科学家80%的工作,它保证了数据原材料的质量。而特征工程又至少占据了数据预处理的半壁江山,在实际的数据工程工作中,无论是出于解释数据或是防止过拟合的目的,特征选择都是很常见的工作。如何从成百上千个特征中发现其中哪些对结果最具影响,进而利用它们构建可靠的机器学习算法是特征选择工作的中心内容。在多次反复的工作后,结合书本,kaggle等线上资源以及与其他数据工程师的讨论,我决定写一篇简明的总结梳理特征选择工作的常见方法以及python实现。
总的来说,特征选择可以走两条路:
特征过滤(Filter methods): 不需要结合特定的算法,简单快速,常用于预处理
包装筛选(Wrapper methods): 将特征选择包装在某个算法内,常用于学习阶段
在scikit-learn环境中,特征选择拥有独立的包sklearn.feature_selection, 包含了在预处理和学习阶段不同层级的特征选择算法。
A. 特征过滤(Filter methods) (1) 方差阈(Variance Treshhold)
最为简单的特征选择方式之一,去除掉所有方差小于设定值的特征。
在sklearn中实现:
from sklearn.feature_selection import VarianceThreshold VarianceThreshold is a simple baseline approach to feature selection. It removes all features whose variance doesn’t meet some threshold. By default, it removes all zero-variance features, i.e. features that have the same value in all samples.
READ MORE