相关分析(《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

  散点图矩阵

相关系数的python代码 python相关系数分析_ci

2.相关系数

相关系数(相关系数的python代码 python相关系数分析_Python_02,也称样本相关系数):描述线性相关程度和方向的统计量。
相关系数的python代码 python相关系数分析_ci_03
其中,相关系数的python代码 python相关系数分析_相关系数的python代码_04

相关系数的python代码 python相关系数分析_Python_02的正负号表示相关关系的方向:
相关系数的python代码 python相关系数分析_相关分析_06,完全正线性相关
相关系数的python代码 python相关系数分析_相关分析_07,完全负线性相关
相关系数的python代码 python相关系数分析_相关系数的python代码_08,负线性相关
相关系数的python代码 python相关系数分析_相关分析_09,正线性相关
相关系数的python代码 python相关系数分析_Python_10,不存在线性关系

(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]

三、偏相关分析

相关系数的python代码 python相关系数分析_ci_11相关系数的python代码 python相关系数分析_Python_12同时产生作用的变量相关系数的python代码 python相关系数分析_传递性_13的影响。剔除其他变量影响之后再进行相关分析的方法称之为偏相关分析(partial correlation analysis)。

相关系数的python代码 python相关系数分析_相关系数的python代码_14

相关系数的python代码 python相关系数分析_ci_15相关系数的python代码 python相关系数分析_传递性_16相关系数的python代码 python相关系数分析_Python_17分别表示相关系数的python代码 python相关系数分析_ci_11相关系数的python代码 python相关系数分析_Python_12之间、相关系数的python代码 python相关系数分析_ci_11相关系数的python代码 python相关系数分析_传递性_13之间、相关系数的python代码 python相关系数分析_Python_12相关系数的python代码 python相关系数分析_传递性_13之间的简单相关系数。

  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 - 3
    r = (xy - xp*yp)/(np.sqrt(1 - xp*xp)*np.sqrt(1 - yp*yp))
    if abs(r) == 1.0:
        prob = 0.0
    else:
        t = (r*np.sqrt(df))/np.sqrt(1 - r*r)
        prob = (1 - stats.t.cdf(abs(t),df))**2
    return r,prob
  
pcorrelation = []
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,然后计算相关系数的python代码 python相关系数分析_相关系数的python代码_24相关系数:

相关系数的python代码 python相关系数分析_Python_25

相关系数的python代码 python相关系数分析_传递性_13表示二分类数据某类的占比,相关系数的python代码 python相关系数分析_ci_27表示另一类别的占比。相关系数的python代码 python相关系数分析_传递性_28相关系数的python代码 python相关系数分析_Python_29表示对应分类对应的另一个变量的平均数,相关系数的python代码 python相关系数分析_相关系数的python代码_30为另一个变量的样本标准差。

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

# 点二列相关分析
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相关系数主要测度顺序变量间的相关系数,在计算过程中只考虑变量值的顺序而不考虑变量值的大小。
  其计算过程为:首先把变量值转换成在样本所有变量值中的排列次序,再利用相关系数的python代码 python相关系数分析_相关分析_31方法求解转换后的两个变量对应的排列次序(rank,即“秩”或等级)的相关系数。

相关系数的python代码 python相关系数分析_Python_32

相关系数的python代码 python相关系数分析_Python_33相关系数的python代码 python相关系数分析_传递性_34分别表示第相关系数的python代码 python相关系数分析_ci_35相关系数的python代码 python相关系数分析_ci_11变量和相关系数的python代码 python相关系数分析_Python_12变量经过排序后的次序,相关系数的python代码 python相关系数分析_ci_38相关系数的python代码 python相关系数分析_Python_39分别表示相关系数的python代码 python相关系数分析_Python_33相关系数的python代码 python相关系数分析_传递性_34的均值。

# ===================================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)]