相关分析(《Python数据分析基础》学习笔记)

  • 一、函数关系与相关关系
    • 1.函数关系
    • 2.相关关系
      • (1)相关关系的定义
      • (2)相关关系的分类
  • 二、简单相关分析
    • 1.散点图
    • 2.相关系数
      • (1)numpy包计算简单相关系数
      • (2)pandas包的DataFrame计算简单相关系数
      • (3)scipy包计算简单相关系数
      • (4)scikit-learn包计算简单相关系数
  • 三、偏相关分析
  • 四、点二列相关分析
  • 五、非参数相关分析
    • (1)Spearman相关系数
    • (2)Kendall tau-b系数

一、函数关系与相关关系

1.函数关系

  当一个或几个变量取一定的值时,另一个变量有确定值与之具体严格相对应,则称这种关系为函数关系。

2.相关关系

(1)相关关系的定义

  变量之间的影响不能够用具体的函数来度量,但变量之间的关系确实存在数量上不是严格对应的相互依存关系,称之为相关关系。

(2)相关关系的分类

  相关关系根据其分析方法和处理对象不同,可以分为简单相关分析、偏相关分析和非参数相关分析等。
  相关分析根据相关关系表现形式不同,可以分为线性相关分析和非线性相关分析。

二、简单相关分析

  简单相关关系主要分析两个变量之间的相互依存的关系,可以通过主观观测和客观测度指标来衡量。
  主观观测指标之间的相关关系,主要是通过两个变量之间散点图的手段进行。
  客观测度主要是通过统计分析的方法,计算相关系数,利用相关关系数值的符号和大小来判定相关关系的方向和强弱。

1.散点图

import numpy as np
import pandas as pd
from scipy import stats
from sklearn.feature_selection import f_regression
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns# 导入数据
car_dict = {'brand_model':['Acura Legend V6','Audi 100','BMW 535i','Buick Century','Buick Riviera V6'],'weight':[3265,2935,3640,2880,3465],'circle':[42,39,39,41,41],'max_speed':[163,141,209,151,231],'horsepower': [160, 130, 208, 110, 165]}
car = pd.DataFrame(car_dict)
print(car)
# 画散点图矩阵
sns.pairplot(car)
plt.show()

结果为:
  car数据集

        brand_model  weight  circle  max_speed  horsepower
0   Acura Legend V6    3265      42        163         160
1          Audi 100    2935      39        141         130
2          BMW 535i    3640      39        209         208
3     Buick Century    2880      41        151         110
4  Buick Riviera V6    3465      41        231         165

  散点图矩阵

2.相关系数

相关系数(rrr,也称样本相关系数):描述线性相关程度和方向的统计量。
r=∑(x−xˉ)(y−yˉ)∑(x−xˉ)2×∑(y−yˉ)2r = \frac{\sum(x-\bar{x})(y-\bar{y})}{\sqrt{\sum(x-\bar{x})^2\times\sum(y-\bar{y})^2}}r=∑(x−xˉ)2×∑(y−yˉ​)2​∑(x−xˉ)(y−yˉ​)​
其中,r∈[−1,1]r\in[-1,1]r∈[−1,1]。

rrr的正负号表示相关关系的方向:
r=+1r = +1r=+1,完全正线性相关
r=−1r = -1r=−1,完全负线性相关
r&lt;0r &lt; 0r<0,负线性相关
r&gt;0r &gt; 0r>0,正线性相关
r=0r = 0r=0,不存在线性关系

(1)numpy包计算简单相关系数

# numpy包计算样本相关系数
print(np.corrcoef((car['weight'],car['circle'],car['max_speed'],car['horsepower'])))
print(car.corr())

结果:

[[ 1.         -0.0984517   0.87503571  0.96299045][-0.0984517   1.          0.         -0.26035305][ 0.87503571  0.          1.          0.72725538][ 0.96299045 -0.26035305  0.72725538  1.        ]]

(2)pandas包的DataFrame计算简单相关系数

print(car.corr())

结果:

              weight    circle  max_speed  horsepower
weight      1.000000 -0.098452   0.875036    0.962990
circle     -0.098452  1.000000   0.000000   -0.260353
max_speed   0.875036  0.000000   1.000000    0.727255
horsepower  0.962990 -0.260353   0.727255    1.000000

(3)scipy包计算简单相关系数

计算两个指标间的相关系数

# cripy包计算样本相关系数
print(stats.pearsonr(car['weight'],car['max_speed']))   #(样本相关系数, P值)

结果:

(0.8750357068360751, 0.052023540358421314)

同时计算多个变量间的相关系数

corralation = []
for i in car[['weight','circle','horsepower']].columns:corralation.append(stats.pearsonr(car['max_speed'],car[i]))
print(corralation)

结果:

[(0.8750357068360751, 0.052023540358421314),
(0.0, 1.0),
(0.727255378914049, 0.16381346667938196)]

(4)scikit-learn包计算简单相关系数

# scikit-learn提供f_regrssion计算F统计量与P值,无法输出样本相关系数
F,P_Value = f_regression(car[['weight','circle','horsepower']],car['max_speed'])
print(F),print(P_Value)

结果:

[9.8034136  0.         3.36807994]
[0.05202354 1.         0.16381347]

三、偏相关分析

  简单相关关系有时不能真实反映现象之间的关系。由于相关系数的不可传递性,在进行相关分析时,往往要控制对xxx、yyy同时产生作用的变量ppp的影响。剔除其他变量影响之后再进行相关分析的方法称之为偏相关分析(partial correlation analysis)。

rxy.p=rxy−rxp∗rxp(1−rxp2)(1−ryp2)r_{xy.p} = \frac{r_{xy}-r_{xp}*r_{xp}}{\sqrt{(1-r_{xp}^2)\sqrt{(1-r_{yp}^2)}}}rxy.p​=(1−rxp2​)(1−ryp2​)​​rxy​−rxp​∗rxp​​

  其中,rxyr_{xy}rxy​、rxpr_{xp}rxp​、rypr_{yp}ryp​分别表示xxx和yyy之间、xxx和ppp之间、yyy和ppp之间的简单相关系数。

  python中没有计算偏相关系数的模块,自定义函数如下:

# 偏相关系数
# python中无模块可计算偏相关系数,自定义一个偏相关系数函数
def partial_corr(x, y, partial = []):# x,y分别为考察相关关系的变量,partial为控制变量xy, xyp = stats.pearsonr(x, y)xp, xpp = stats.pearsonr(x, partial)yp, ypp = stats.pearsonr(y, partial)n = len(x)df = n - 3r = (xy - xp*yp)/(np.sqrt(1 - xp*xp)*np.sqrt(1 - yp*yp))if abs(r) == 1.0:prob = 0.0else:t = (r*np.sqrt(df))/np.sqrt(1 - r*r)prob = (1 - stats.t.cdf(abs(t),df))**2return r,probpcorrelation = []
for i in car[['weight','circle']].columns:pcorrelation.append(partial_corr(car[i],car['max_speed'],partial = car['horsepower']))
print(pcorrelation)

  结果:

[(0.9442998237624293, 0.0007756274082241067),(0.285716213402416, 0.12755033194904572)]

四、点二列相关分析

  点二列相关(point-biserial correlation)适用于两个变量中,一个是来自正态总体的定距或定比数据,另一变量是二分类数据。
  一般将后者编码为0、1,然后计算pearsonpearsonpearson相关系数:

r=x‾p−x‾qSxpqr = \frac {\overline{x}_p-\overline{x}_q}{S_x}\sqrt{pq}r=Sx​xp​−xq​​pq​

  其中,ppp表示二分类数据某类的占比,q=1−pq = 1 - pq=1−p表示另一类别的占比。x‾p\overline{x}_pxp​和x‾q\overline{x}_qxq​表示对应分类对应的另一个变量的平均数,SxS_xSx​为另一个变量的样本标准差。

  数据及点二列相关系数计算:

# 点二列相关分析
score_by_gender = pd.DataFrame({'score':[68,81,78,91,91],'gender':[1,1,0,0,1]})
print(stats.pointbiserialr(score_by_gender['gender'],score_by_gender['score']))

  结果:

PointbiserialrResult(correlation=-0.25462635064312505,
pvalue=0.6793377775792051)

五、非参数相关分析

  简单相关分析和偏相关分析广泛用于定量数据或连续型数据的研究。
  对于定性数据的相关分析,往往从数据值的次序入手,并借助非参数统计分析的思想。次序在数列中代表了某个具体变量值的位置、等级或秩,因此这类相关系数通常称为非参数相关分析、等级相关分析、秩相关分析,其计算的相关系数为非参数相关系数、等级相关系数、秩相关系数。

(1)Spearman相关系数

  Spearman相关系数主要测度顺序变量间的相关系数,在计算过程中只考虑变量值的顺序而不考虑变量值的大小。
  其计算过程为:首先把变量值转换成在样本所有变量值中的排列次序,再利用PearsonPearsonPearson方法求解转换后的两个变量对应的排列次序(rank,即“秩”或等级)的相关系数。

r=∑(Rxi−R‾x)(Ryi−R‾y)∑(Rxi−R‾x)2∑(Ryi−R‾y)2r = \frac{\sum(R_{x_{i}}-\overline{R}_x)(R_{y_{i}}-\overline{R}_y)}{\sqrt{\sum(R_{x_{i}}-\overline{R}_x)^2\sum(R_{y_{i}}-\overline{R}_y)^2}}r=∑(Rxi​​−Rx​)2∑(Ryi​​−Ry​)2​∑(Rxi​​−Rx​)(Ryi​​−Ry​)​

  其中,RxiR_{x_{i}}Rxi​​和RyiR_{y_{i}}Ryi​​分别表示第iii个xxx变量和yyy变量经过排序后的次序,R‾x\overline{R}_xRx​和R‾y\overline{R}_yRy​分别表示RxiR_{x_{i}}Rxi​​和RyiR_{y_{i}}Ryi​​的均值。

# ===================================Spearman相关系数=============================
# Spearman相关系数
graduate = pd.DataFrame({'interest':[2,2,4,1,3],'major':[2,2,3,1,3],'teaching': [2, 1, 4, 2, 3],'tutor': [2, 2, 4, 1, 3]})# spearmanr,kendalltau函数计算对应的非参数相关系数
rho, p = stats.spearmanr(graduate)
print(rho)
print(p)
# ===================================Spearman相关系数=============================

  结果:

[[1.         0.97332853 0.76315789 1.        ][0.97332853 1.         0.7299964  0.97332853][0.76315789 0.7299964  1.         0.76315789][1.         0.97332853 0.76315789 1.        ]]
[[0.         0.00520786 0.13333912 0.        ][0.00520786 0.         0.16142315 0.00520786][0.13333912 0.16142315 0.         0.13333912][0.         0.00520786 0.13333912 0.        ]]

(2)Kendall tau-b系数

kt = []
for i in graduate[['interest','major','teaching']]:kt.append(stats.kendalltau(graduate[i],graduate['tutor']))
print(kt)

  结果:

[KendalltauResult(correlation=1.0, pvalue=0.019176729141549054),
KendalltauResult(correlation=0.9428090415820632, pvalue=0.031686388539793796),KendalltauResult(correlation=0.6666666666666666, pvalue=0.11843292891667201)]

基于Python的相关分析(correlation)相关推荐

  1. python实现案例_基于Python实现相关分析案例

    节选自<Python预测之美:数据分析与算法实战>. 相关关系是一种非确定的关系,就好像身高与体重的关系一样,它们之间不能用一个固定的函数关系来表示.而相关分析就是研究这种随机变量间相关关 ...

  2. 基于Python实现相关分析案例

    节选自<Python预测之美:数据分析与算法实战>. 相关关系是一种非确定的关系,就好像身高与体重的关系一样,它们之间不能用一个固定的函数关系来表示.而相关分析就是研究这种随机变量间相关关 ...

  3. python中的corr函数_Python中的相关分析correlation analysis的实现

    相关分析(correlation analysis) 研究两个或两个以上随机变量之间相互依存关系的方向和密切程度的方法. 线性相关关系主要采用皮尔逊(Pearson)相关系数r来度量连续变量之间线性相 ...

  4. 基于Python的特征自动化选择:两行代码完成特征工程

    本文介绍一个特征选择神器:特征选择器是用于减少机器学习数据集的维数的工具,可以傻瓜式地进行特征选择,两行代码即可搞定!! 来源:Will Koehrsen 代码整理及注释翻译:黄海广 代码和数据下载地 ...

  5. 两行代码完成特征工程-基于Python的特征自动化选择代码(提供下载)

    本文介绍一个特征选择神器:特征选择器是用于减少机器学习数据集的维数的工具,可以傻瓜式地进行特征选择,两行代码即可搞定!! 来源:Will Koehrsen 代码整理及注释翻译:黄海广 代码和数据下载地 ...

  6. python 数据挖掘论文,Orange:一个基于 Python 的数据挖掘和机器学习平台

    Orange 简介 Orange 是一个开源的数据挖掘和机器学习软件.Orange 基于 Python 和 C/C++ 开发,提供了一系列的数据探索.可视化.预处理以及建模组件. Orange 拥有漂 ...

  7. Python数据分析初探项目 基于Python数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022年)

    Python 数据分析初探项目 基于 Python 数据可视化的网易云音乐歌单分析系统 大学编程作业(TUST 天津科技大学 2022 年) Python 数据分析初探项目 基于 Python 数据可 ...

  8. 基于Python的线性回归预测模型介绍及实践

    基于Python的线性回归预测模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 线性回归预测 ...

  9. python日本 老龄化分析_基于Python关于世界自杀率影响因素的分析以及机器学习预测...

    基于Python关于世界自杀率影响因素的分析以及机器学习 预测 文/刘子桦 马若炎 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)017 [总页数 ...

最新文章

  1. JavaScript判断浏览器类型及版本
  2. linux下eclipse的使用教程,linux下Eclipse的使用方法总结.doc
  3. Python基础教程(九):面向对象、正则表达式
  4. shanghai international trade center
  5. QPS、TPS、并发用户数、吞吐量的关系
  6. ci php做多图上传,CodeIgniter快速实现图片上传
  7. java 压缩二进制流_Java:自己动手写压缩软件,超详细解释(哈夫曼实现)
  8. 广义典型相关分析_数学建模/机器学习:广义加性模型(GAM)及其Python实现
  9. python unique函数_每30秒学会一个Python小技巧,GitHub星数4600+
  10. 8.确保0对于值类型是有效的
  11. 怎样使用U盘启动盘安装乌班图系统
  12. 卫星控制类操作系统VAX/VMS简介
  13. Python 处理人民币金额,大小写互转
  14. misc fiction 科幻小说中的五大鸡肋发明
  15. 小码哥学习感想第一天
  16. java 首字母检索_java实现首字母模糊查询的功能
  17. 构建maven时No archetypes currently available的解决方法
  18. win10能上网显示无法连接服务器,电脑不能联网怎么办 Win10无法连接网络解决方法...
  19. 微信小程序设置字体无效_微信小程序字体设置
  20. 【Opencv实战】识别水果的软件叫什么?一款超好用的识别软件分享,一秒鉴定(真是活~久~见~啊)

热门文章

  1. JavaScript:实现计算各种形状的体积算法 (附完整源码)
  2. 你还不知道中国有多少人口?
  3. Data Cloud Summit 2021 活动小记
  4. TFTLCD液晶显示数码管字体(电脑数码管字体的导入和PCtoLCD软件取模)
  5. JavaScript基础-ES6
  6. 中国mooc大学---Python语言程序设计 (嵩天/黄天羽/礼欣 )
  7. 废品回收微信小程序源码系统标准版开发简要说明
  8. 年度全球十大突破性技术公布;华为发布数字能源零碳网络解决方案 | 美通企业日报...
  9. Retrofit2封装之路(请求参数加密解密)(二)
  10. 多级介孔有机金属骨架材料ZIF-8负载乳酸氧化酶(LOD)/四氧化三铁(Fe304)/阿霉素DOX/胰岛素/cas9蛋白/甲硝唑/大黄素甲醚