当前位置: 首页 > 科技观察

用Python进行数据关联分析

时间:2023-03-21 16:47:19 科技观察

在进行数据分析的时候,我们使用的数据往往不是一维的,分析这些数据的难度就增加了很多,因为我们需要考虑维度之间的关系。这些维度关系的分析需要一些方法来衡量,关联分析就是其中之一。本文使用python讲解数据的关联分析。在进行相关分析之前,需要引入几个概念,一是维度,二是协方差,三是相关系数。我们先来看看维度。以图1为例。这是一张员工信息统计表。这里有n个员工,分别是员工1,员工2,...,员工n,每个员工有5个属性,分别为身高、体重、年龄、工龄和教育背景。每个员工的信息是一个观察值,也叫样本,本文统称为观察值,每个员工的一个属性称为指标,也称为变量、维度或属性,统称为在本文中称为维度。所以这个图中有n个观察值和5个维度。图1.员工信息表及协方差的定义为E{[X-E(X)][Y-E(Y)]},记为Cov(X,Y),即两个维度的关系以及各自的期望差积的期望通常是离散数据中的均值。例如,在图1中,身高代表X,体重代表Y。E(X)是身高的平均值,E(Y)是体重的平均值。使用两者分别求出E(X)和E(Y)之差的协方差。相关系数为Cov(X,Y)/[σ(X)σ(Y)],记为ρXY,其中σ(X)和σ(Y)分别表示X和Y的标准差,因此相关系数是两个变量的协方差除以其标准差的乘积。同理,如果一个观测有p维,计算每个维与所有维之间的协方差,就会形成一个pxp矩阵。矩阵的每个数是其对应维度之间的协方差。这个矩阵叫做协方差矩阵,协方差矩阵可以按照上面的方法进一步计算得到相关矩阵。下面用python代码来解释关联分析。首先是数据集。本文所用数据来自绘图库seaborn自带的数据。这是非常有名的鸢尾花的数据。获取方法很简单,执行下面代码即可。这里有一个问题要提醒一下。有些人在loading_dataset的时候会出错,读不到数据,因为iris数据集不存在。这可能是因为seaborn版本。如果遇到这种情况,可以上seaborn。GitHub数据网站自行下载数据。URL是https://github.com/mwaskom/seaborn-data。将下载的数据解压到seaborn-data文件夹中。这个文件夹一般在seaborn安装目录或者当前工作目录下。importseabornassnsdata=sns.load_dataset('iris')df=data.iloc[:,:4]#获取前四列数据本次使用的数据集有150行5列,我们只使用前四列数据数据。图2中显示了一个示例数据集。图2.示例数据集接下来,让我们进行相关性分析。首先我们做一个比较简单的分析,就是分析这个数据集中第一列和第三列的相关性,也就是sepal_length和petal_length这两列的关系。这里我们可以使用numpy、scipy和pandas三种方法。第一个是麻木的。importnumpyasnpX=df['sepal_length']Y=df['petal_length']result1=np.corrcoef(X,Y)得到的result1是一个二维矩阵,如图3所示。图3.result1的计算结果.矩阵主对角线上的值都是1(主对角线是从左上角到右下角的对角线),因为主对角线的值是每个之间的相关性观测值与自身为1,毕竟X=1X,Y=1Y,每次观测值等于1乘以自身。图3中,其他不为1的数都是相关值,一共有两个,这两个值是相等的,因为这两个值分别代表ρXY和ρYX,它们的值是相等的。同理,我们可以找到df中四个维度之间的相关性。代码如下,其中rowvar表示列为维度。result2=np.corrcoef(df,rowvar=False)结果如图4所示。图4.result2计算结果图4是一个4x4的矩阵,共有16个数据,代表每个维度与其他维度(包括每个维度和它自己),主对角线为1,其他数关于主是对角对称的,是对称矩阵。接下来我们使用scipy进行分析。代码如下所示。importscipy.statsasssresult3=ss.pearsonr(X,Y)的结果为(0.8717537758865831,1.0386674194498099e-47),返回两个数,第一个数为X和Y的相关值,其值与前面的numpy计算结果是一样的,其次是两者不相关的概率,也就是我们在统计学中常说的p值,但这个值指的是不相关的概率,也就是越小价值,它越相关。这里我们的值很小,说明两者之间的线性相关程度比较大。当然,如果相关值为1,则p值为0。scipy中没有计算相关矩阵的方法。最后是熊猫方法。因为前面的df本身就是pandas的DataFrame格式,我们可以直接使用。代码如下所示。result4=X.corr(Y)result5=df.corr()result4的结果为0.8717537758865833,result5的结果如图5所示,这两个结果和前面的一样。图5.result5的计算结果后面画图。对于相关性的分析,一般有两种常见的图形,一种是散点图,一种是热图。在散点图中可以清楚地看到每个坐标点的分布和趋势。对于数据分析师来说,可以更直观的了解各个维度数据之间的关系,但是这种方法也有缺点,就是不适合大数据量,因为数据量太大,生成速度图片会很慢,图片太多不利于观察;而热力图更多的是从数值或者颜色来准确描述各个维度之间的关系,传递的信息较少,但是更适合大数据量的情况。先介绍一下散点图。您可以使用seaborn或pandas生成散点图。seaborn的代码如下。sns.pairplot(df)sns.pairplot(df,hue='sepal_width');第一行代码的结果如图6所示,是一张大图,里面包含16张子图,每张子图是每个维度和其他维度的相关图,其中主对角线上的图是每个维度的数据分布直方图。第二行代码是绘制同样的图形,但是以sepal_width的数据为标准对每个数据点进行着色,结果如图7所示。从图中可以看出sepal_width列有23个不同的值,并且每个值都有一个颜色,因此生成的图像是彩色的。图6.seaborn绘制的普通关联图图7.seaborn绘制的基于某列数据的关联图另一种绘制方法是使用pandas,代码如下。importpandasaspdpd.plotting.scatter_matrix(df,figsize=(12,12),range_padding=0.5);结果如图8所示,可以看出用pandas绘制的图和seaborn的一般结果是一样的,但是图片的自定义程度和seaborn是一样的。精细度还是略差,所以一般推荐使用seaborn。图8.pandas生成的相关图最终就是热力图。它的代码如下。importmatplotlib.pyplotaspltfigure,ax=plt.subplots(figsize=(12,12))sns.heatmap(df.corr(),square=True,annot=True,axax=ax)在我第一次写这段代码的时候也出现了一个小问题,如图9所示。在图9中,只显示了subplot首行和末行的一部分,而其他subplot全部显示。这是matplotlib的一个bug,因为seaborn是一个基于matplotlib的库,所以升级matplotlib就可以了。刚刚开始作者的matplotlib版本是3.1.1,现在已经升级到3.2.2,修复了这个bug。正常图如图10所示,第二行代码中square=True表示每个子图是否显示为正方形,这里设置为True,annot=True表示是否显示每个子图的值在该图,此处也设置为True。图9.旧版matplotlib生成的热图。图10.新版matplotlib生成的热图。从数据计算到可视化,本文介绍了使用python寻找多维数据之间相关性的各种方法。我们可以根据自己的需要。选择相应的方法。作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望与业内朋友一起学习交流。