节选自《Python预测之美:数据分析与算法实战》。

相关关系是一种非确定的关系,就好像身高与体重的关系一样,它们之间不能用一个固定的函数关系来表示。而相关分析就是研究这种随机变量间相关关系的统计方法。此处,主要探讨不同特征对研究对象的相关性影响。常见进行相关分析的方法,主要有散点图和相关图。

1.散点图

散点图就是数据点在直角坐标系上的分布图,通常分为散点图矩阵和三维散点图。其中散点矩阵是由变量两两组合由数据点分布图构成的矩阵,而三维散点图就是从所有变量中选择三个变量进行绘制,进一步在三维空间里观察数据的形态。

(1)散点图矩阵

Pandas是Python数据分析非常重要的一个库,它自带了很多统计分析及绘图的功能,这其中就包含散点图矩阵的绘制方法,即在Pandas.plotting模块下的scatter_matrix函数。使用该函数可快速绘制散点图矩阵。这里,我们以iris数据集为例,分析鸢尾花的Sepal.Length、Sepal.Width、Petal.Length、Petal.Width这四个指标的相关关系。并用scatter_matrix绘制散点图矩阵,代码如下:

import pandas as pd

import matplotlib.pyplot as plt

iris = pd.read_csv('iris.csv')

# 参数说明

# figsize=(10,10) 设置画布大小为10x10

# alpha=1,设置透明度,此处设置为不透明

# hist_kwds={"bins":20} 设置对角线上直方图参数

# 可通过设置diagonal参数为kde将对角图像设置为密度图

pd.plotting.scatter_matrix(iris,figsize=(10,10),alpha=1,hist_kwds={"bins":20})

plt.show()

图3-1-3-1 使用pandas绘制散点图矩阵

如图,为所有变量的两两组合的散点图矩阵,每个散点图中呈现的是任意两变量的数据点,可通过数据点的分布,了解变量之间的相关性,对角线上为单变量的直方分布图。此图中Petal.Length与Petal.Width对应的散点图比较接近线性,说明这两个变量间的相关性较强。

此外,我们还可以使用seaborn库下面的pairplot函数来绘制散点图矩阵。针对鸢尾花的Sepal.Length、Sepal.Width、Petal.Length、Petal.Width这四个指标,使用pairplot函数绘制散点图,代码如下:

import seaborn as sns

sns.pairplot(iris,hue="Species")

plt.show()

图3-1-3-2 使用seaborn库绘制散点图矩阵

如代码所示,通过hue参数指定了分组的变量,这里使用鸢尾花的种类进行分组。如图3-1-3-2,对角线上的图形表示各个变量在不同鸢尾花类型下的分布情况;其他图形分别用不同颜色为数据点着色。根据该图可以更进一步地知道不同类型鸢尾花各变量的相关关系,以及线性及非线性变化规律。

然而,使用seaborn库来绘制散点图矩阵有个问题,就是不能同时用颜色和形状来表示分类。有数据分析中,我们经常会有这样的需求,即用颜色来表示真实的类别,用形状来表示预测的类别,那么通过一个图就可以直观地看到预测建模的效果。既然seaborn不能直接支持,那该如何实现呢?我们可以基于matplotlib库自己实现,自定义函数pair_plot,代码如下:

def pair_plot(df,plot_vars,colors,target_types,markers,color_col,marker_col,fig_size=(15,15)):

# 设置画布大小

plt.figure(figsize=fig_size)

plot_len = len(plot_vars)

index = 0

for p_col in range(plot_len):

col_index = 1

for p_row in range(plot_len):

index = index + 1

plt.subplot(plot_len, plot_len, index)

if p_row != p_col:

# 非对角位置,绘制散点图

df.apply(lambda row:plt.plot(row[plot_vars[p_row]],row[plot_vars[p_col]],

color=colors[int(row[color_col])],

marker=markers[int(row[marker_col])],linestyle=''),axis=1)

else:

# 对角位置,绘制密度图

for ci in range(len(colors)):

sns.kdeplot(df.iloc[np.where(df[color_col]==ci)[0],p_row],

shade=True, color=colors[ci],label=target_types[ci])

# 添加横纵坐标轴标签

if col_index == 1:

plt.ylabel(plot_vars[p_col])

col_index = col_index + 1

if p_col == plot_len - 1:

plt.xlabel(plot_vars[p_row])

plt.show()

如代码所示,该函数主要使用subplot机制来绘制子图,通过

(n为变量个数)个子图的布局来实现散点图矩阵。进一步,我们使用iris数据集,基于pair_plot函数来绘制散点图矩阵,代码如下:

# 重置变量名称

features = ['sepal_length','sepal_width','petal_length','petal_width']

iris_df=iris.drop(columns='Species')

iris_df.columns = features

# 此处,我们建立两个新变量,都存储花色分类值,其中type对应真实类别,cluster对应预测类别

iris_df['type'] = iris.Species

iris_df['cluster'] = iris.Species

# 将cluster变量转化为整数编码

iris_df.cluster = iris_df.cluster.astype('category')

iris_df.cluster = iris_df.cluster.cat.codes

# 将type变量转化为整数编码

iris_df.type = iris_df.type.astype('category')

iris_df.type = iris_df.type.cat.codes

# 获得花色类别列表

types = iris.Species.value_counts().index.tolist()

pair_plot(df=iris_df,

plot_vars=features,

colors=['#50B131','#F77189','#3BA3EC'], # 指定描述三种花对应的颜色

target_types = types,

markers= ['*','o','^'], # 指定预测类别cluster对应的形状

color_col='type', # 对应真实类别变量

marker_col='cluster') # 对应预测类别变量

图3-1-3-3 修正的散点图矩阵

如图3-1-3-3所示,散点图中使用到了颜色和形状来区别不同的样本,在真实的应用场景中,可以将颜色和形状对应不同的类别,比如真实分类与预测分类,然后巧妙地使用散点图矩阵,直观地分析预测效果。

(2)三维散点图

常用于绘制三维散点图的方法是使用mpl_toolkits库,该库下的mplot3d模块可以帮助我们绘制三维图形。主要使用到的是Axes3D类。这里,仍然使用iris数据集,通过使用Axes3D类对应实例中的函数绘制鸢尾花的Sepal.Length、Petal.Length、Petal.Width这三个指标在三维空间的散点图,代码如下:

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

dims = {'x':'Sepal.Length','y':'Petal.Length','z':'Petal.Width'}

types = iris.Species.value_counts().index.tolist()

# 绘制散点图

fig = plt.figure()

ax = Axes3D(fig)

for iris_type in types:

tmp_data = iris[iris.Species==iris_type]

x,y,z = tmp_data[dims['x']], tmp_data[dims['x']], tmp_data[dims['z']]

ax.scatter(x, y, z, label=iris_type)

# 绘制图例

ax.legend(loc='upper left')

# 添加坐标轴(顺序是Z, Y, X)

ax.set_zlabel(dims['z'])

ax.set_ylabel(dims['y'])

ax.set_xlabel(dims['x'])

plt.show()

图3-1-3-4 三维散点图

如图3-1-3-4,该函数为三维空间中的点拟合了线性平面,通过切换坐标轴可以更直观地观察数据的分布规律。

2.相关图

所谓相关图是基于变量间的相关关系大小,通过可视化方式反应不同变量组合间相关关系的差异的图形。可以把相关图分为相关矩阵图、相关层次图。

(1)相关矩阵图

Python中绘制相关矩阵图,可使用seaborn库的heatmap方法,但笔者觉得不太美观,于是想自己实现一个。在绘制相关矩阵图时,需要数据中两两变量相关系数矩阵的数据,该数据中可以看到对应不同变量间的相关系数大小。在Python中,可以使用pandas.corr函数来实现。这里,我们以iris数据集为例,说明获取相关系数矩阵的用法,代码如下:

df=iris.drop(columns='Species')

corr = df.corr()

corr

Sepal.Length

Sepal.Width

Petal.Length

Petal.WidthSepal.Length

1.000000

-0.117570

0.871754

0.817941

Sepal.Width

-0.117570

1.000000

-0.428440

-0.366126

Petal.Length

0.871754

-0.428440

1.000000

0.962865

Petal.Width

0.817941

-0.366126

0.962865

1.000000

如上表所示,对角线上的值都为1,表示变量与自己的相关系数为1。相关系数介于-1到1之间,绝对值越大,相关性越强,大于0时表示正相关,小于0时表示负相关,为0时,表示没有相关性。进一步,编写自定义函数corrplot来实现相关矩阵图的绘制功能,代码如下:

def corrplot(corr,cmap,s):

#使用x,y,z来存储变量对应矩阵中的位置信息,以及相关系数

x,y,z = [],[],[]

N = corr.shape[0]

for row in range(N):

for column in range(N):

x.append(row)

y.append(N - 1 - column)

z.append(round(corr.iloc[row,column],2))

# 使用scatter函数绘制圆圈矩阵

sc = plt.scatter(x, y, c=z, vmin=-1, vmax=1, s=s*np.abs(z), cmap=plt.cm.get_cmap(cmap))

# 添加颜色板

plt.colorbar(sc)

# 设置横纵坐标轴的区间范围

plt.xlim((-0.5,N-0.5))

plt.ylim((-0.5,N-0.5))

# 设置横纵坐标轴值标签

plt.xticks(range(N),corr.columns,rotation=90)

plt.yticks(range(N)[::-1],corr.columns)

# 去掉默认网格

plt.grid(False)

# 使用顶部的轴做为横轴

ax = plt.gca()

ax.xaxis.set_ticks_position('top')

# 重新绘制网格线

internal_space = [0.5 + k for k in range(4)]

[plt.plot([m,m],[-0.5,N-0.5],c='lightgray') for m in internal_space]

[plt.plot([-0.5,N-0.5],[m,m],c='lightgray') for m in internal_space]

# 显示图形

plt.show()

代码中,我们主要使用了plt.scatter函数来绘制圆圈,圆圈的大小表示相关性程度,圆圈的颜色表示相关性大小(有方向),通过横纵向等间距摆放这些圆圈的方式来展示相关矩阵图。然后,我们基于已经得到corr数据,绘制相关矩阵图,代码如下:

corrplot(corr,cmap="Spectral",s=2000)

图3-1-3-5 相关矩阵图

如图,左侧是由圆圈组成的相关矩阵,右侧是颜色板,可以直接地看到,Petal.Length与Petal.Width具有较强的正相关性,而Sepal.Length与Sepal.Width的相关性则较弱。

(2)相关层次图

相关层次图,是通过计算变量间的距离来判断各变量是否属于同一类的方法,体现的是变量之间的相关性。此处,通过将相关系数转化为距离度量,进行系统聚类,旨在分析各变量的相关关系及组合影响情况。通常有如下四种方法将相关系数转化为相异性度量:

, r为相关系数;②

;③

;④

。现选用第四种相异性度量,使用mtcars数据集,进行系统聚类,代码如下:

import pandas as pd

import numpy as np

mtcars = pd.read_csv("mtcars.csv")

mtcars.drop(columns="_",inplace=True)

# 计算第四种相异性度量

d=np.sqrt(1-mtcars.corr()*mtcars.corr())

from scipy.spatial.distance import pdist,squareform

from scipy.cluster.hierarchy import linkage

from scipy.cluster.hierarchy import dendrogram

row_clusters = linkage(pdist(d,metric='euclidean'),method='ward')

row_dendr = dendrogram(row_clusters,labels = d.index)

plt.tight_layout()

plt.ylabel('Euclidean distance')

plt.plot([0,2000],[1.5,1.5],c='gray',linestyle='--')

plt.show()

图3-1-3-6  相关层次图

如图3-1-3-6可知,变量drat、am、gear相关性较强,cyl、disp、mpg、wt相关性较强,并且hp、vs、qsec、carb具有较强的相关性。

参加送书活动

活动截止日期2020-07-13,微信扫码,关注 数海星辰 公众号,回复“0709”,即可参加送书活动。

数海星辰,作者官方公众号

本文地址:https://blog.csdn.net/u013524655/article/details/107238798

希望与广大网友互动??

点此进行留言吧!

python实现案例_基于Python实现相关分析案例相关推荐

  1. python 英语分词_基于Python NLTK库进行英文文本预处理

    文本预处理是要文本处理成计算机能识别的格式,是文本分类.文本可视化.文本分析等研究的重要步骤.具体流程包括文本分词.去除停用词.词干抽取(词形还原).文本向量表征.特征选择等步骤,以消除脏数据对挖掘分 ...

  2. python回归算法_基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归 回归方法就是寻找方差的最小值 y = kx + b xi, ...

  3. python编码尺寸_基于Python批量生成指定尺寸缩略图代码实例

    这篇文章主要介绍了基于Python批量生成指定尺寸缩略图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近我们商城上架的应用越来越丰富了. ...

  4. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  5. python词频作图_基于Python的词频分析与云图生成

    近期,学校对呼和浩特市第二中学学生特质进行了调查,具体题目为"用关键词描述一下二中学生的特质(尽量在20字以内)". 为了更好的展示调查结果,我们基于Python的jieba库和w ...

  6. 基于python爬虫数据处理_基于Python爬虫的校园数据获取

    苏艺航 徐海蛟 何佳蕾 杨振宇 王佳鹏 摘要:随着移动时代的到来,只适配了电脑网页.性能羸弱的校园教务系统,已经不能满足学生们的移动查询需求.为此,设计了一种基于网络爬虫的高实用性查询系統.它首先通过 ...

  7. 基于python的网站_基于Python的网站爬虫应用研究

    基于 Python 的网站爬虫应用研究 陈清 [期刊名称] <通讯世界> [年 ( 卷 ), 期] 2020(027)001 [摘要] 如何于海量的互联网网站中获取有用资源信息 , 对网站 ...

  8. python点名代码_基于python tkinter的点名小程序功能的实例代码

    基于python tkinter的点名小程序功能的实例代码,花名册,次数,窗口,未找到,初始化 基于python tkinter的点名小程序功能的实例代码 易采站长站,站长之家为您整理了基于pytho ...

  9. python traceback 丢失_基于python traceback实现异常的获取与处理

    这篇文章主要介绍了基于python traceback实现异常的获取与处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.traceback.p ...

  10. python 赋值方法_基于Python List的赋值方法

    Python中关于对象复制有三种类型的使用方式,赋值.浅拷贝与深拷贝.他们既有区别又有联系,刚好最近碰到这一类的问题,研究下. 一.赋值 在python中,对象的赋值就是简单的对象引用,这点和C++不 ...

最新文章

  1. POJ 2195 Going Home 二分图的最大权匹配
  2. TFLearn MNIST
  3. python路径怎么找windows_如何查看 windows 中 Python安装路径
  4. 【原】PSD图标素材的全自动切图方法,适用于IOS、安卓、web前端等领域
  5. 机械制图手册_机械制图基本知识大全!
  6. 执行计划之CONCATENATION
  7. unity3d之kinect 初识
  8. Apex英雄下载慢的解决方法|Apex英雄离线包分享
  9. Win10磁盘的分区与合并傻瓜教程
  10. 电信显示isp服务器连不上,电信拨号上网连接不上的原因是什么
  11. 【Keras】Keras中fit_generator的使用,及fit、fit_generator、和train_on_batch的区别
  12. 数据结构期末大题速成
  13. PS快速制作凹陷直线
  14. 2022年广电行业研究报告
  15. 阿里总部对外解密双11超级工程背后的数据库技术
  16. HTML5游戏出现新转机
  17. 火山视窗CEF浏览器用网页框架操作实现取本机IP、地址
  18. UWB定位技术融合定位革新物联发展
  19. C语言-三子棋游戏的实现
  20. linux分区概念理解,磁盘分区基础和LINUX上硬盘分区设备号解释

热门文章

  1. EF 5.0 帮助类 增删改查
  2. mysql优化Analyze Table
  3. gzip压缩後的javascript在ie下不加载
  4. DOS之BAT批处理文件语法3(转)
  5. 增加ActiveDirectory证书服务器有效期与续订步骤
  6. 二、Java面向对象(7)_封装思想——this关键字
  7. MySQL数据库查询中的特殊命令
  8. 蚂蚁金服安全应急响应中心上线 用户可提交漏洞
  9. 安卓之页面跳转与传值和按钮事件
  10. Visual Studio 2005 SQL Server 2005 are COMING!