1.常见理解误区

(1)计算出变量A和变量B的皮尔逊相关系数为0,不代表A和B之间没有相关性,只能说明A和B之间不存在线性相关关系。

例:温度和冰淇淋销量之间的散点图像如下,可以发现大致成二次函数图像,随着温度升高,销量也会增加,达到峰值后,随着温度升高,销量反而下降。也就是说,销量和温度之间是有关系的。

不过,计算温度和销量之间的皮尔逊相关系数却为0。这只能说明温度和销量之间没有线性相关关系,而不能说二者不存在相关关系。

图片来自于网络博客

(2)皮尔逊相关系数并不稳定,会受到异常点的影响。

例:如果不考虑最右侧的异常点,x和y之间的相关系数应该为0,即无论y取何值,x都为固定值8。但是,考虑了异常点后,x和y的相关系数变为0.816。

这也说明,在进行数据分析之前,需要对数据进行清洗,去掉异常点、噪声数据,使得分析结果更为可靠。

(3)皮尔逊相关系数绝对值越大,二者相关性越强?

答案是不一定。除了相关系数的大小,我们更要关心相关系数的显著性。

2.皮尔逊相关系数正确使用步骤

第一步:绘制散点图,是否存在异常点。如果有异常点,删除异常点。然后再看观察变量x和变量y之间的关系是否近似为一条直线,如果是,则计算皮尔逊相关系数。相关系数为(0,1]的正数,表明x和y之间呈线性正相关;相关系数为0,表明二者不存在线性相关关系,但不排除存在其他非线性相关关系;相关系数为[-1,0)的负数,表明x和y之间存在线性负相关关系。

如果散点图并不类似于一条直线,而是其他类型图像,如二次函数图像、指数图像,即使计算出皮尔逊相关系数也没有意义。

3.python代码示例

python sklearn库中datasets模块中有一个boston房价数据集,可以使用load_boston()函数进行加载。

print(load_boston().DESCR)#查看boston数据集基本信息

#加载数据集并进行数据处理
from sklearn.datasets import load_boston
import pandas as pd
rawdata = load_boston()#加载数据
features = pd.DataFrame(rawdata.data,columns = rawdata.feature_names)#提取特征集
label = pd.DataFrame(rawdata.target,columns = ['target'])#提取标签列boston = pd.concat([features,label],axis =1)#合并特征集和标签列
print(boston)

#绘制散点矩阵图,由于boston矩阵共有14个属性,全部属性两两绘制散点图过于庞大,因此选择其中3个属性进行两两组合绘制散点图
import matplotlib.pyplot as plt
import seaborn as sb
sb.pairplot(data = boston,vars = ['CRIM','INDUS','target'])#'CRIM','INDUS','target'三个变量之间两两组合绘制散点图
plt.savefig('C:UsersCaraDesktopscatter fig.png')#绘图结果存到本地

绘图如下:

3个变量,两两组合绘制出6幅散点图,其中有3幅会是重复的,我们只需要看左下角3幅,或右上角3幅即可。

蓝色柱形图是变量的数值频率分布图。

从散点图可以看出,CRIM和INDUS并没有线性相关性。

CRIM和target(房价)大致成负相关性,图像接近指数函数(非线性函数),因此,计算出的相关系数可能并不可靠。

INDUS和target之间大致成负线性相关,同时右侧存在几个异常点,最终计算出的相关系数会受到异常点的影响。

直观的认识需要精确的相关系数作为检验:

注释:corr()方法默认的相关系数为皮尔逊,也可以设置method 参数为其他类型的相关系数,如 'kendall', 'spearman'。

由于宽度限制,中间列显示不完全,可以设置参数:

#更改显示设置,打印全部列
pd.set_option('display.max_columns',None)#若单行不够显示全部列,将会换行显示
print(boston.corr())

查看单个变量与其他变量间的皮尔逊相关系数:

由上可见,犯罪率确实与房价呈负相关。不过,没有显著性指标作为支持。

如果需要同时返回皮尔逊相关系数和显著性指标,则可以使用scipy库中stats模块中的stats模块下的pearsonr 函数。stats是一系列统计方法的集合,如峰度、t检验、相关性、F检验……

from scipy.stats import stats
help(stats.pearsonr)

#使用scipy中的函数计算相关系数及显著性
from scipy.stats import stats
r,p_value = stats.pearsonr(boston['CRIM'],boston['target'])#计算CRIM和target之间的相关系数和对应的显著性
print('相关系数为{:.3f},p值为{:.5f}'.format(r,p_value))#相关系数保留3位小数,p值保留5位小数

p值远小于0.01,表明CRIM和target 在1%的水平上存在显著的线性相关,对应的相关系数为-0.388。

不过,使用这种方法缺点很明显,不能一次性计算所有变量两两组合的相关性。

最后,绘制热力图,直观展示变量间的线性相关性:

#绘制相关系数的热力图
import seaborn as sb
r_pearson = boston.corr()
sb.heatmap(data = r_pearson)

换个色系:

sb.heatmap(data = r_pearson,cmap="YlGnBu")

全部代码如下:

from sklearn.datasets import load_boston
import pandas as pd
#查看Boston数据集的基本信息
print(load_boston().DESCR)rawdata = load_boston()#加载数据集
features = pd.DataFrame(rawdata.data,columns = rawdata.feature_names)#提取特征列
label = pd.DataFrame(rawdata.target,columns = ['target'])#提取房价列(target列)
boston = pd.concat([features,label],axis =1)#组合特征列和房价列#绘制散点图
import matplotlib.pyplot as plt
import seaborn as sb
sb.pairplot(data = boston,vars = ['CRIM','INDUS','target'])
plt.savefig('C:UsersCaraDesktopscatter fig.png')#计算全部变量的相关性矩阵
print(boston.corr())#查看目标变量‘房价’与其他变量间的相关性
print(boston.corr()['target'])#查看犯罪率CRIM与其他变量之间的关系
print(boston.corr()['CRIM'])#更改显示设置,打印全部列
pd.set_option('display.max_columns',None)
print(boston.corr())#使用scipy中的函数计算CRIM和target的相关系数及显著性
from scipy.stats import stats
r,p_value = stats.pearsonr(boston['CRIM'],boston['target'])
print('相关系数为{:.3f},p值为{:.5f}'.format(r,p_value))#绘制相关系数的热力图
import seaborn as sb
r_pearson = boston.corr()
sb.heatmap(data = r_pearson,cmap="YlGnBu")#cmap设置色系

参考:

【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

python画热力图(相关系数矩阵图)_henbile的博客-CSDN博客_python 相关性热力图​blog.csdn.net

python二维散点分布图_深入理解皮尔逊相关系数amp;python代码相关推荐

  1. python二维图颜色函数_通过python改变图片特定区域的颜色详解

    通过python改变图片特定区域的颜色详解 首先让我祭出一张数学王子高斯的照片,这位印在德国马克上的神人有多牛呢? 他是近代数学的奠基人之一,与牛顿, 阿基米德并称顶级三大数学家,随便找一个编程语言的 ...

  2. python二维向量运算模拟_【转载 Python】Numpy基础:数组和矢量运算

    Numpy基础:数组和矢量运算 目录: 尊重原创,转载出处:https://blog.csdn.net/sunyaowu315/article/details/82733249?utm_medium= ...

  3. python二维数据读取对齐_从投影的二维直方图绘制对齐的x,y一维直方图

    我需要生成一个类似于this example中所示的图像: 不同之处在于,我用numpy的histogram2d生成了一个二维直方图,并用imshow和gridspec绘制了二维直方图: 如何将二维直 ...

  4. python二维数组换行输出_关于用python绘制二维数组的问题

    我有一个关于用matplotlib绘制二维数组的问题.在我的代码中,我有一个2D数组,名为len(z)=20,z的值为: [[ 642.3774486 662.59980588 706.8014217 ...

  5. python二维数组切片规则_详解Python二维数组与三维数组切片的方法

    如果对象是二维数组,则切片应当是x[:]的形式,里面有一个冒号,冒号之前和之后分别表示对象的第0个维度和第1个维度: 如果对象是三维数组,则切片应当是x[::],里面有两个冒号,分割出三个间隔,三个间 ...

  6. python二维表转一维表_Excel、Power BI及Python系列:使用Power BI转化一维表与二维表...

    上篇文章,老海分享了如何使用Excel完成一维表与二维表之间的转化 本篇老家继续分享使用Power BI来完成一维表与二维表的转化操作. 可能很多小伙伴,不太了解Power BI Power BI是什 ...

  7. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换

    一.字符串(str) 字符串转换为列表 使用list()方法 str_1 = "1235" str_2 = 'zhangsan' str_3 = '''lisi''' tuple_ ...

  8. python二维随机游走_利用python进行时间序列分析——从随机游走到GARCH模型(二)...

    Autoregressive Models - AR(p) 当因变量能由它的多个滞后项表示就叫做自回归性.公式如下: 当我们描述模型的阶数,比如,AR模型的阶数为怕p,p代表在这个模型里用的滞后数量. ...

  9. python 二维图堆起来_干货满满:python实现二维图制作

    python全代码如下 import re import csv import matplotlib.pyplot as plt x=[] y=[] m=eval(input()) #输入折线条数 f ...

最新文章

  1. Python完全学习大师班
  2. DataTable 排序
  3. android 广播观察者,BroadcastReceiver和Activity之间的通信 – android
  4. [gic]-ARM gicv3/gicv2的总结和介绍-PPT
  5. 从Top500、天河一号和超级计算机引起的话题
  6. 显示unc路径服务器根目录,错误:“您必须输入带有盘符的完整路径,例如:C:\ APPor形式的UNC路径:\\服务器\共享”...
  7. 登录表单 参考新浪微博
  8. 带有API网关的AWS Lambda
  9. border-box
  10. 蓝桥杯 算法训练 Sticks
  11. 1043. 输出PATest(20)-PAT乙级真题
  12. spring---aop(10)---Spring AOP中AspectJ
  13. struts2_20140720
  14. H3C 帧中继地址映射
  15. 推荐一些学习SEO的优秀书籍附pdf电子书下载地址
  16. XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
  17. 按键精灵定位坐标循环_按键精灵的控制命令居然恐怖到了这种程度
  18. CI框架初识-视图渲染
  19. 整理NLPIR基本功能函数
  20. GIS算法:7_python拓扑套件shapely

热门文章

  1. 探讨float类型的数值,为什么两个float不能直接相等
  2. Struts2的Interceptor和Listener以及Plugin
  3. 《零基础看得懂的C++入门教程 》——(2)什么是数据类型、变量?一看便会
  4. 电信aep平台是什么意思_江苏天鼎证券:股票平台跳水是什么意思?股票为什么会跳水?...
  5. 导师都有哪些“秘密”没有告诉你?
  6. 两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略
  7. 掌握深度学习,为什么要用 PyTorch、TensorFlow 框架?
  8. 撤回的微信消息真的看不到?78行Python代码帮你看穿一切!
  9. 北斗三号b1c频点带宽_【导航论坛】北斗三号卫星导航信号及接收策略
  10. oracle归档日志的概念,浅谈Oracle归档日志