CATE效应入门(系列之四)

背景 随着互联网的逐步普及和兴起,在线A/B实验获得了越来越广泛地应用。无论是营销策略,交互样式,机器学习模型,搜索算法都依赖在线A/B实验来进行试错和迭代。 实际上,A/B实验的思想最早起源于R.A.Fisher在20世纪20年代进行的针对农业的田间实验(Field Experimentation),之后经过近一个世纪现代统计学的蓬勃发展,逐步成熟应用到各行各业。 在最近50年,随着科技的进步,人类可获取数据量呈现指数级增长,统计学从此有了更多的研究空间,并进入了一个飞速发展的阶段,诞生了因果推断1等更深刻的思想。A/B实验不再仅限于分析平均实验效应(ATE, Average Treatment Effect),还进入到了有条件的平均实验效应(CATE, Conditional Average Treatment Effect),进一步深入挖掘数据内部的规律。 通俗来说,ATE只是对比不同实验版本之间指标的差异,而CATE对比的是不同维度条件下不同实验版本之间指标的差异。而这个思想以及相关的方法,能够进一步挖掘产品,模型,算法,策略的潜力,实现“物以类聚人以群分”的个性化方案,同时也能够更深入的理解实验背后的因果关系。 ATE和CATE 在介绍CATE的具体算法之前,我们先理解ATE的理论基础。这里我们采用Neyman-Rubin的潜在产出模型(potential outcome framework)的理论框架来描述ATE的基本原理。 设Wi表示个体i进入实验组与否,在实验组中取1,对照组取0 (多实验版本的可以做相应的推广);Yi 表示个体 i 的结果变量,就是我们所观察的实验指标。另外记 \({Y_i(1),Y_i(0)}\) 表示个体 i 接受处理或者对照的潜在结果 (potential outcome),那么 \( Y_i(1)−Y_i(0) \)表示个体 i 在实验组中的个体因果作用。不幸的是,每个个体要么接受处理,要么接受对照\({Y_i(1),Y_i(0)}\) 中必然缺失一半,个体的因果作用是不可识别的。观测的结果是: $$Y_i=W_iY_i(1)+(1–W_i)Y_i(0)$$ 但是,在 W 做随机化的前提下,我们可以识别总体的平均因果作用 (Average Treatment Effect; ATE): $$ATE = E\{Y_i(1) – Y_i(0)\}$$ 这是因为实验组是随机抽样,个体进入实验组与否和Y是独立不相关,即Wi和Yi正交,如下面推导所示: $$ ATE = E\{Y_i(1)\} -E\{Y_i(0)\} \\ = E\{Y_i(1) \mid W_i =1\} -E\{Y_i(0)\mid W_i=0\} \\ = E\{Y_i \mid W_i =1\} – E\{Y_i \mid W_i=0\} $$ 所以ATE是可以通过随机化,从由观测的数据估计出来。...

March 30, 2022 · Skyan

数据可视化指南(系列之三)

可视化 作为数据分析的一个重头戏,数据可视化被称为数据分析的半壁江山一点不为过,当然另外半壁就是统计学。 数据可视化将枯燥的并不直观的一维统计数字,直接通过二维甚至三维图形的方式展现给人们。图像的信息含量远大于数字,使得人们可以直接发现数据的趋势,找到异常点,甚至洞察更深层次的规律。 数据可视化并不是简单的用Excel画个线图或者柱状图就可以搞定,事实上,数据可视化属于一门严格的统计学方向「探索性数据分析」,这是由美国著名统计学家John. W. Tukey于1977年首创,借助图形对数据进行探索性分析的方法。美国统计学家Wilkinson于2005年给出了一个很好的数据可视化框架,它直接导致了R包ggplot2的发明,并影响了世界上最好的数据可视化软件之一Tableau。所有这一切历史其实想说明,数据的可视化并不是想当然地画图,而是需要对所要解决的问题和适合表达的图形有非常明确的认识和理解,才能真正发挥数据可视化的潜力,开发出统计图形的价值。 用于数据可视化的图形的种类其实有多种多样,我们需要首先了解每种分类,以及适合的分析场景。如下表所示: 变量(度量)个数 分析目标 图形名称 图形样例 使用场景 一个 不同类别下数据展示 条形图 在各类别之间比较数据,一个坐标轴是维度,另一个坐标轴是度量。表示在维度的不同维度值下,度量的大小情况。 条形图还可以叠加更多维度拆解,例如在每个类别下继续按照另一个维度类型拆解,查看更细粒度的指标情况 一个 数据的统计分布 直方图 展示连续数据分布最常用的工具,它本质上是对密度函数的一种估计。通过将连续度量的值分组为数据桶,来观察数据的分布规律 一个 数据分位点分布 箱线图 主要是从四分位数的角度出发 描述数据的分布,它通过最大值,上四分位数,中位数,下四分位数和最小值五处位置来获取一维数据的分布概况。通过每一段数据占据的长度,我们可以大致推断出数据的集中或离散趋势(长度越短,说明数据在该区间上越密集,反之则稀疏)。 一个 数据在不同类别下的占比 饼图 每一个扇形的角度与相应数据的数值大小成比例,但实际上通过饼图来查看不同类别占比的差别并不是很直观,有时还不如条形图直观 一个 数据在不同地理位置之间的分布 地图 展示和地理位置有关的数据分布关系时,最合适的工具 一个 数据随着时间的趋势变化 折线图 将视图中的各个数据点连接起来。折线图为直观显示一系列值提供了一种简单方法,适合显示数据随时间变化的趋势,或者预测未来的值。 一个 数据随着时间的趋势变化以及按维度拆解 面积图 和折线图类似,只是将折现下方的区域按照不同类别维度填色,展示各类别随时间变化的趋势 二个 两个变量之间的相关关系 散点图 散点图通常用来展示两个变量之间的关系,这种关系可能是线性或非线性的。图中每一个点的横纵坐标都分别对应两个变量各自的观测值,因此散点所反映出来的趋势也就是两个变量之间的关系。 二个 两个变量之间的相关关系 热图 热图用矩阵表示两个变量之间的相关关系,同时将单元格数值用颜色表达,如颜色深表示数值大。跟进一步,热图还可以表达聚类关系,即在颜色图的边界区域加上聚类的谱系图,这样可以同时观测数值分布和聚类的结果 二个 两个变量之间的相关关系 密度图 在散点图的基础上,通过颜色进一步突出相关关系,以及热点区域 三个 三个变量之间的关系 三维透视图 通过三维透视的形式,将三个变量变成三个维度,直接展示三者之间的关联。但三维图容易受到视角变化的影响,因此需要不断调整视角观测到真实的规律 三个 三个变量之间的关系 等高线图 将三维透视图的等高线展示在二维图像上,这样视角更广,不用担心视角的问题 多个(>=3) 三个甚至更多变量之间的关系 散点图矩阵 散点图的高维扩展,只是将多个变量的两两散点图以矩阵的形式排列起来,就构成了所谓的散点图矩阵。它从一定程度上克服了在平面上展示高维数据的困难,对于查看变量之间的两两关系非常有用。 在正式画图之前,我们还需要区分度量(变量)和维度的概念,这为我们能画出正确的图形奠定基础。 度量:也叫变量,是指我们需要分析,观察的对象。例如:展现次数,点击次数,点击率,时间,这些都是度量,都是我们需要观察的变量。变量可以是离散的,例如次数,个数,也可以是连续的,例如点击率,出价,时间等。度量可以是累加型的,例如点击次数,交易总量,也可以是非累加型的,例如去重用户数,点击率等。 维度:是指在变量值可以进一步拆解的类别。例如用户类型,设备型号,地域等,这些都是维度。维度是用来拆解度量的,一般是离散值。度量在维度的不同维度值下按照不同的聚合逻辑进行聚合。例如点击次数是相加,去重用户数是去重计数。 下面我们以常用的直方图和散点图为例,介绍统计意义的数据可视化是如何应用的。下面可视化软件用的Tableau,大家也可以用python的matplotlib库或者R语言的ggplot2库编程实现,MS Excel不推荐使用,主要是Excel对于复杂的图形难以满足要求。...

March 10, 2022 · Skyan

Numpy & Pandas入门(系列之二)

背景和环境搭建 Numpy和Pandas是目前最为流行的数据分析工具之二,基于Python语言开发。Numpy偏向数值计算,Pandas偏向数据分析,底层也是基于Numpy数据结构。两者结合可以完成一系列令人眼花缭乱的数据分析任务,并在机器学习,统计分析,因果推断等领域得到广泛应用。 作为入门,首先需要搭建开发环境。这里建议直接采用miniconda+VS Code的方式搭建,简单高效,步骤如下: 打开miniconda,找到适合自己操作系统的安装包,安装miniconda 国内环境推荐使用清华的conda和pip镜像,参考pypi镜像 和anaconda镜像 打开命令行,运行conda install pandas numpy 打开vscode官网,安装VS Code 打开VS Code,安装Python,Jupyter插件 在VS Code打开Command Palette (⇧⌘P) ,运行Jupyter: Create New Jupyter Notebook 命令 然后就能看到一个Jupyter Notebook,选择Python环境为刚才安装minicoda所在的位置 一个基本Python环境已经搭建好了, 之后就可以愉快的开发了,注意保存代码 在开发之前,需要先学习下narray,Series和Dataframe这几个基本的数据结构,搞懂这几个数据结构以及对应的计算模式,开发代码就会更加高效和方便。 所有的运算就基于这三个数据结构来做运算,计算过程类似矩阵或者集合的运算。编程的范式和传统的过程式编程有区别,不再是线性的执行顺序,而是集合和集合之间的关系运算。 例如,我们经常写foreach循环遍历数组中每一个元素进行运算,但用numpy就不需要,因为它直接提供了各种数组间运算的函数。再比如我们想将数据按照维度的聚合计算,对于pandas而言直接调用groupby函数即可。 下面分别介绍这三种基础数据结构。 narray narray是numpy的基础数据结构,它本质上是有一个多维数组,1维的就是一个数组array或者向量vector,2维是一个矩阵matrix,3维甚至更高维就是一个张量tensor。所以这个“n”代表维度,narray全称也就是“N-dimensional array”。 一个narray如下所示,一个维度称为一个axis。下面这个narray有两个axes,第一个axis长度为2,第二个axis长度为3。 >>> import numpy as np >>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>> a [[1, 2, 3, 4], [5, 6, 7, 8]] 需要时刻记住,narray对应的是一个多维数组,如下图所示: numpy提供了一系列方便创建narray的函数,如下所示: >>> np.zeros(2) array([0., 0.]) # 0数组 >>> np....

February 20, 2022 · Skyan

互联网数据分析入门(系列之一)

前言 随着互联网行业的不断发展,数据作为最基础的生产资料发挥了极其重要的作用。随着大数据平台的普及,针对各种数据的分析是一项非常重要的基础技能。通过数据分析,我们可以从用户数据中发现新的用户喜好,从业务数据中发现业务的优化方向,从性能数据中发现潜在的性能瓶颈,从线上日志中发现异常指标等等。熟练掌握数据分析的一些常用方法,还会让程序员的水平更上一个台阶。可以不夸张地说,数据分析是程序员除了编程以外最为重要的技能。 但很多时候,大家对数据分析产生一些误解,容易神秘化或者低估数据分析的能力。常见的误解列举如下: Q: 数据分析就是操作Excel,小学生才玩这个。 A: 实际上Excel的确是数据分析最为方便的工具,但数据分析不止于此,python,R,Matlab,Tableau甚至shell都是数据分析常用的开发语言。当然Excel如果用的好,也会产生让人叹为观止的效果。 Q: 数据分析只有做机器学习模型的程序员才需要学。 A: 严格意义上开发训练机器学习模型也是数据分析方法中的一种。数据分析不仅限于给机器学习模型使用,也可以应用到更为广泛的问题分析中,包括性能分析,线上问题排查定位等,基本涵盖了程序员的日常工作。 Q: 数据分析就是用awk,wc,sort等工具写几个脚本统计下数 A: 数据分析范围肯定不只是用工具做个统计,还有建模,实验,可视化等等都是数据分析的范围,近年来更流行的名词叫“数据科学”,很多公司也成立了数据科学团队专门做更广泛意义的数据分析。 既然数据分析这么有用,那我们怎么从哪里开始做数据分析呢?本文作为系列第一篇文章,先从数据分析的整体层次,基础方法和工具介绍开始,更深入的内容等系列后续文章。 整体来说,数据分析可以分为三个层次,分别是观察型分析,干涉型分析,以及反事实分析。篇幅所限,不再详述这三个层次是怎么回事。感兴趣的同学可以阅读参考书目1。 通常意义上所说的数据分析方法主要还是属于观察型分析,重点在于发现数据的规律,从噪声中找到有价值的信号,找到不同现象和数据之间的关联关系。这些分析方法,基本上可以满足大部分常见的数据分析需求。而更高级的“干涉型分析”和“反事实分析”,则需要更深入的工具和方法才能解决。 本文介绍5种基础的数据分析方法,包括指标,汇总,相关,检验,可视化,最后列举了常见的分析工具。 指标 为什么把“指标”作为数据分析方法的第一个方法呢?这是因为很多人在数据分析的过程中,逐渐迷失了自己分析的目标,陷入了为了分析而分析的怪圈。因此,在数据分析之前,我们必须要定义清楚我们这次分析的对象是什么。互联网产品将数据汇总后的结果定义为指标,因此一次分析本质上就是在研究这个指标的相关特性。如果指标没有定义清楚,那么分析就难以找到正确的方向。在数据分析中,需要分析的核心指标也叫“北极星”指标,因为这些指标就像北极星一样,永远固定在天球的极北点。 按照统计方法来分,互联网产品中常见的指标可以分为 计数型 统计型(加和,最大最小等函数) 比率类 聚合二级指标。 将计数型和其他统计型计算区分开的原因是,计数有一类是去重计数,它要求计数的时候做去重操作,这样就不是一个简单地统计函数可以计算的,因此需要将计数函数和其他计算函数区分开。除了一级和二级聚合计算以外,所有的指标都需要窗口范围。例如天级,周级,月级等,这里不再逻辑。指标的以及和二级计算方式分类如下表所示: 一级聚合 二级聚合 SQL样例 指标样例 计数,去重计数 SELECT COUNT(pv); SELECT COUNT(DISTINCT uid) PV(Page View) DAU(Daily Active Users) 统计类(加和,最大,最小,中位数,80分位等) SELECT SUM(dur); SELECT SUM(show); SELECT MEDIAN(time); SELECT PERCENTILE(time, 0.8) 总时长,总下发量,总展现量, 耗时中位数,80分位耗时 比率类 SELECT SUM(clicks)/SUM(shows); SELECT SUM(duration)/COUNT(pv); PV点击率,点展比,页均停留时长 计数,去重计数 平均 SELECT AVG(show) FROM (SELECT COUNT(DISTINCT sid) AS show GROUP BY uid) 人均展现次数,人均邀请人数 统计类(加和,最大,最小,中位数,80分位等) 平均 SELECT AVG(dur) FROM (SELECT SUM(dur) AS dur GROUP BY uid) ; SELECT AVG(dur) FROM (SELECT MEDIAN(dur) AS dur GROUP BY uid) ; 人均时长,人均最大停留时长,人均耗时中位数 比率类 平均 SELECT AVG(pvctr) FROM (SELECT SUM(clicks)/SUM(shows) AS pvctr GROUP BY uid) ; SELECT AVG(dur) FROM (SELECT SUM(dur)/COUNT(pages) AS dur GROUP BY uid) 人均PV点击率,人均页均停留时长 我们做任何数据分析之前,先定义清楚我们的分析目标是哪些指标。例如我们想分析展现量和哪些因素有关,那么我们可以需要先对齐展现量指标的定义公式,是人均展现量,还是总展现量,还是去重展现量。如果指标定义不清楚,那么分析很可能南辕北辙,并不是我们想要分析的方向。定义清楚问题之后,我们再开始后面的分析。...

January 30, 2022 · Skyan