在我们的工作中,会有一个这样的场景,有若干数据罗列在我们的面前,这组数据相互之间可能会存在一些联系,可能是此增彼涨,或者是负相关,也可能是没有关联,那么我们就需要一种能把这种关联性定量的工具来对数据进行分析,从而给我们的决策提供支持,本文即介绍如何使用 Python 进行数据相关性分析。
关键词 python 方差 协方差 相关系数 离散度 pandas numpy
接下来,我们将使用 Anaconda 的 ipython 来演示如何使用 Python 数据相关性分析,我所使用的 Python 版本为 3.6.2 。
首先,我们将会创建两个数组,数组内含有 20 个数据,均为 [0, 100] 区间内随机生成。
a = [random.randint(0, 100) for a in range(20)]b = [random.randint(0, 100) for a in range(20)]print(a)[35, 2, 75, 72, 55, 77, 69, 83, 3, 46, 31, 91, 72, 12, 15, 20, 39, 18, 57, 49]print(b)[25, 24, 72, 91, 27, 44, 85, 21, 0, 64, 44, 31, 6, 91, 1, 61, 5, 39, 24, 43
在进行相关性分析之前,我们需要先为最终的计算分析做好准备。我们在分析前,第一个准备的是计算数据的期望。对于期望的定义,离散变量和连续变量是不一样的,具体定义如下:
- 对于连续随机变量

-
在离散随机变量
在一般情况下,我们通过实验或者调查统计获取的数据很大一部分都属于离散随机变量,那么这里的期望我们也可以简单的理解为平均数,那么既然是平均数,那么我们就可以非常简单编写一个计算离散变量的期望的函数了。
def mean(x):return sum(x) / len(x)mean(a)46.05mean(b)39.9
方差和期望一样,对于连续和离散的随机变量有着不同的定义,具体定义如下:
对于连续随机变量
对于离散随机变量
# 计算每一项数据与均值的差def de_mean(x):x_bar = mean(x)return [x_i - x_bar for x_i in x]# 辅助计算函数 dot product 、sum_of_squaresdef dot(v, w):return sum(v_i * w_i for v_i, w_i in zip(v, w))def sum_of_squares(v):return dot(v, v)# 方差def variance(x):n = len(x)deviations = de_mean(x)return sum_of_squares(deviations) / (n - 1)# 标准差import mathdef standard_deviation(x):return math.sqrt(variance(x))variance(a)791.8394736842105varance(b)850.5157894736841
协方差
相关系数
# 协方差def covariance(x, y):n = len(x)return dot(de_mean(x), de_mean(y)) / (n -1)# 相关系数def correlation(x, y):stdev_x = standard_deviation(x)stdev_y = standard_deviation(y)if stdev_x > 0 and stdev_y > 0:return covariance(x, y) / stdev_x / stdev_yelse:return 0covariance(a, b)150.95263157894735correlation(a, b)0.18394200852440826
import numpy as np# 先构造一个矩阵ab = np.array([a, b])# 计算协方差矩阵np.cov(ab)>> array([[ 791.83947368, 150.95263158],[ 150.95263158, 850.51578947]])
np.corrcoef(ab)>> array([[ 1. , 0.18394201],[ 0.18394201, 1. ]])
import pandas as pd# 使用 DataFrame 作为数据结构,为方便计算,我们会将 ab 矩阵转置dfab = pd.DataFrame(ab.T, columns=['A', 'B'])# A B 协方差dfab.A.cov(dfab.B)150.95263157894738# A B 相关系数dfab.A.corr(dfab.B)0.18394200852440828dfabA B0 35 251 2 242 75 723 72 914 55 275 77 446 69 857 83 218 3 09 46 6410 31 4411 91 3112 72 613 12 9114 15 115 20 6116 39 517 18 3918 57 2419 49 43

