本文阅读时间大概在8分钟。
相关性分析
我们常说的相关性分析是分析两个变量之间线性相关程度的方法,其相关性强度的度量即为相关性系数。现实中很多事物间都拥有或多或少的相关性,例如,房屋面积对价格的影响,节假日对销量变化的影响等等。
1、 目前相关性分析方法主要分为以下三类:
(1) Pearson(皮尔逊)相关系数
皮尔逊相关系数是一种衡量连续变量(销量,销售额等)相关性的指标,对数据进行假设的参数检验,检验效能高,其计算公式如下:
其中
和
分别为变量X,Y的均值(期望),
分别为变量X,Y的的标准差。其取值范围[-1,1],绝对值越大相关性越强。
> Pearson相关系数使用时有以下限制条件 :
> * 两变量方差服从正态分布,且变量间方差齐性;
> * 两变量之间存在线性关系;
> * 变量连续且变量之间有相同的观测值,且不应允许缺失值的存在。
(2) Spearman(斯皮尔曼)相关系数
斯皮尔曼相关系数是一种衡量分类变量(性别,区域等)相关性的指标,是对数据进行假设的非参数检验,适用范围更广一些,对于不符合正态分布的变量也可使用,其计算公式同Pearson相似如下:
其中
和
分别为变量X,Y的均值(期望),
,这里的
是分别对变量进行等级化后的运算。举个例子:
变量
变量
的排名
的排名
86
0
1
1
0
0
97
20
2
6
-4
16
99
28
3
8
-5
25
100
27
4
7
-3
9
101
50
5
10
-5
25
103
29
6
9
-3
9
106
7
7
3
4
16
110
17
8
5
3
9
112
6
9
2
7
49
113
12
10
4
6
36
根据计算结果
,由于Spearman相关系数将数据转化为"等级"的原因,因此较Pearson相关系数有较小的敏感性。
(3) Kendall(肯德尔)相关系数
肯德尔相关系数是一种衡量定序变量(年龄等)之间相关性程度的指标,对数据进行假设的非参数检验,其计算公式如下:
P为两变量属性排列一致的统计对象对数(1对、2对)。举个例子:
pearson
A
B
C
D
E
F
G
H
Height
1
2
3
4
5
6
7
8
Weight
3
4
1
2
5
7
8
6
上表Height和Weight的值是用户的排名,Height已升序排序,此时对应Height第一位的重量排名为3,在右方大于3的统计量还有其他5个元素(4,5,7,8,6),因此该元素对P的贡献为5,以此类推统计每个元素的贡献数,P=5 + 4 + 5 + 4 + 3 +1 + 0 + 0 = 22,代入公式得
。
2、 三种相关系数对数据的要求
(1) Pearson相关系数:要求数据具有连续性、正态分布性等特点,因此应对数据分布进行严格的验证,否则可能会出现相反的效果。
(2) Spearman相关系数 :对于不满足Pearson相关系数要求的连续型变量数据,可以使用Spearman相关系数,也可针对定序和定类变量的数据。
(3) Kendall相关系数 :Kendall相关系数数据条件与Spearman相同,常常使用定序数据相关性分析。
3、 相关系数假设检验步骤
提出原假设和备择假设
假设检验的目的是为了验证相关系数结果是否显著,即是否显著异于不相关
。
确定显著性水平(阈值
)
若低于阈值
,则表示需要拒绝原假设,在这里则表示变量之间不相关。
收集样本数据并计算检验统计量的值。
P值法
利用检验统计量计算出P-值 。
如果P-值
,则拒绝原假设
。
临界值法
利用显著性水平确定临界值以及拒绝法则。
根据检验统计量的值以及拒绝法则确定是否拒绝
。
为什么要做相关性分析?
筛选核心运营监控指标
在业务运营过程中我们往往会制定一个北极星指标,比如GMV、浏览用户数、NPS等,我们在根据业务模块对北极星指标进行拆解时,各个模块时会有各种指标来衡量其健康度,但冗杂的指标也会带来业务分析的繁杂性,因此我们可以根据相关性来对筛选更能反应业务健康度的指标,即选取与北极星指标关联程度比较高的指标。但这里我们要注意,相关性高只是代表两变量具有很高的共趋性,不代表有因果关系。
在下面的实战中,我将会使用Spearman相关系数对转化率、页面停留时长和商品满意度之间的重要性程度进行分析。
利用相关系数选择机器学习中的特征
我们在建立机器学习模型时,往往会通过特征工程来对特征进行构建,但维度增加并不意味着能带来更高的计算精度,甚至有可能降精度。而且由于维度的增加计算量呈指数倍增长,大幅降低了计算机运算速度,因此,我们我们可以通过相关性系数筛选出与因变量相关性高的变量作为特征。此外,如果存在特征之间相关性系数很高,我们应将其剔除来保证模型的稳定性。
Python实践
Pearson相关系数
由于Pearson相关系数在使用时要求数据服从正态分布,因此我们在计算统计量或者P-值前,需先检验数据是否服从正态分布。我们可以使用K-S检验来检验数据是否与正态分布服从相同分布。
K-S检验是以样本的累计频数分布与特定理论分布进行比较,如果两者差距较小,则表示样本分布与该理论分布服从一致。K-S检验也是使用了假设检验的方法进行验证,其原假设和备则假设为:
# 导入相关第三方包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scipy
# 修复图片中文显示乱码及刻度显示缺失问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
# 我们从社区住户收入中位数与房价中位数进行分析,研究社区住户的收入中位数与房价中位数
ls1 = [8.3252,8.3014,7.2574,5.6431,3.8462,4.0368,3.6591,3.12,2.0804,3.6912,3.2031,3.2705,3.075, 2.6736, 1.9167, 2.125,
2.775, 2.1202, 1.9911, 2.6033, 1.3578, 1.7135, 1.725, 2.1806, 2.6, 2.4038, 2.4597, 1.808, 1.6424, 1.6875]
ls2 = [452600, 358500, 352100, 341300, 342200, 269700, 299200, 241400, 226700, 261100, 281500, 241800, 213500, 191300, 159200,
140000, 152500, 155500, 158700, 162900, 147500, 159800, 113900, 99700, 132600, 107500, 93800, 105500, 108900,132000]
data = pd.DataFrame({'收入中位数':ls1,'房价中位数':ls2})
# 首先绘制出各属性关系图
sns.pairplot(data,kind='scatter',diag_kind='kde')
从上图中我们可以看出两点:
收入中位数与房价中位数大致服从正态分布
收入中位数和房价中位数有明显的相关性。
因此接下来我们将验证以上两个观点。
正态性检验
我们直接调用第三方包scipy进行验证,我们设置显著性为0.05。
for column in data.columns:
u = data[column].mean() # 计算均值
std = data[column].std() # 计算标准差
r,p = scipy.stats.kstest(data[column],'norm',(u,std))
if p>0.05:
print('拒绝原假设,显著性水平为{},变量{}服从正态分布'.format(p,column))
else:
print('接受原假设,显著性水平为{},变量{}不服从正态分布'.format(p,column))
拒绝原假设,显著性水平为0.11240126885002111,变量收入中位数服从正态分布
拒绝原假设,显著性水平为0.1179017959613895,变量房价中位数服从正态分布
相关性分析
r1,p1 = scipy.stats.pearsonr(data['收入中位数'],data['房价中位数'])
print('收入中位数与房价中位数的相关性系数为{0},显著性水平为{1}'.format(r1,p1))
收入中位数与房价中位数的相关性系数为0.7997775305895439,显著性水平为1.1426961967081732e-07
Spearman相关系数
我们在业务数据分析时,需要选取能够反映业务的核心运营指标,在面对大量指标时我们可以使用Spearman相关系数进行分析。接下来我们对商详转化率、页面停留时长以及商品满意度三个指标进行分析,其中北极星指标为商详转化率,我们看下用户页面停留时长和商品满意度与转化率之间的相关性。
# 商详转化率
y=[0.691, 0.719, 0.685, 0.695, 0.664, 0.634, 0.651, 0.672, 0.674, 0.66 , 0.627, 0.612]
# 页面停留时长
x1=[68. , 70.5, 67.8, 67.9, 64.3, 62.5, 63.6, 65.2, 65.3, 64.7, 61.6,58.7]
# 商品满意度
x2 = [0.776, 0.908, 0.827, 0.851, 0.638, 0.61 , 0.649, 0.692, 0.832, 0.762, 0.756, 0.676]
# 我们选取显著性水平为0.05。经分析商详转化率与页面停留时长的相关性更高,因此可重点关注页面停留时长
r1,p1 = scipy.stats.spearmanr(x1,y)
print('商详转化率与页面停留时长的相关性系数为{0},显著性水平为{1}'.format(r1,p1))
r2,p2 = scipy.stats.spearmanr(x2,y)
print('商详转化率与商品满意度的相关性系数为{0},显著性水平为{1}'.format(r2,p2))
商详转化率与页面停留时长的相关性系数为0.9860139860139862,显著性水平为4.1168959116543284e-09
商详转化率与商品满意度的相关性系数为0.7832167832167832,显著性水平为0.002586214833362591
Kendall相关系数
Kendall主要种衡量定序变量(年龄等)之间相关性程度的指标,我们以一组人的身高和体重的排名为例进行分析。
# 经分析身高排名与体重排名具有显著的相关关系。
weight = [1,2,3,4,5,6,7,8,9]
height = [2,3,1,4,6,5,8,7,9]
r,p = scipy.stats.kendalltau(weight,height)
print('身高排名与体重排名的相关性系数为{0},显著性水平为{1}'.format(r,p))
身高排名与体重排名的相关性系数为0.7777777777777778,显著性水平为0.0024250440917107582
Q&A
Q1:相关性系数真的能反应变量之间的相关性吗?
(1)如果变量之间为线性关系,则相关性系数的绝对值越大,变量之间相关性越强。
(2)如果变量之间存在非线性关系,其相关系数绝对值也可能很大也可能很小,此时不能用相关系数衡量。
(3)相关性系数很容易受到离群点(异常点)的影响,也可能造成相关系数错误的反应变量的相关性。
针对以上情况,最好先将数据画散点图大致看下数据的趋势。
Q2.相关和因果是一回事吗?
业务人员往往对两者关系的混淆,因果一定相关,相关不一定因果。相关关系是对称性的,而因果关系是非对称性的,相关关系表示变量间存在某种程度的关联性,在现实中,相关性往往更容易证明,而因果关系往往通过设计AB实验对指标影响原因进行分析。
Q3. 相关性系数与协方差的影响
相关性系数是标准化的,
由于协方差,协方差只能看出数据之间线性关系的方向,不能判别强度,因为它的取值没有固定范围,只能得到正线性相关或者负线性相关的结论。
Q4. 参数检验和非参数检验的区别和使用情况。
区别
参数检验:以已知分布(如正态分布)为假定条件,对总体参数进行估计或检验。
非参数检验:不依赖总体分布的具体形式和检验分布(如位置)是否相同。
各自优缺点
参数检验:优点是符合条件时,检验效率高;缺点是对资料要求严格,如等级数据、非确定数据不能使用参数检验,而且要求资料的分布型已知和总体方差齐性等。
非参数检验:优点是应用范围广、简便、易掌握;缺点是若对符合参数检验条件的资料用非参数检验,则检验效率低于参数检验。