相关分析
相关要解决的问题
1) 变量是否存在关系?
2) 如果存在关系,那是存在的什么关系???
3) 有关系的话,它的关系强度是多少???
4) 是否可以用样本反映的变量上关系来代表总体上变量的关系???
- 首先绘制散点图判断变量之间的关系形态
- 如果是线性关系,则可以利用相关系数来测度两个变量的关系强度
- 然后对相关系数进行显著性检验,判断样本所反映的关系是否可以代表两个变量总体上的关系。
画散点图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
sns.set(style='darkgrid')
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
warnings.filterwarnings('ignore')
# 用searborn画特征与特征之间的散点图
sns.pairplot(data[['AQI', 'PopulationDensity', 'GreenCoverageRate']])
计算相关系数
相关系数的计算公式是pearson相关系数
image.png
# 我们可以手写,其中data是我的pandas DataFrame数据,比如我想知道AQI空气质量指数与降雨的相关系数'Precipitation
x = data['AQI']
y = data['Precipitation']
# 计算AQI与Precipitation的协方差
a = (x - x.mean())*(y - y.mean())
cov = np.sum(a)/(len(a)-1)
print('协方差:', cov)
# 计算AQI与Precipitation的相关系数
corr = cov / np.sqrt(x.var()*y.var())
print('相关系数:',corr)
# 也可以直接一步用numpy里函数算出
print('covarience:', x.cov(y))
print('corrlation:', x.corr(y))
# 甚至可以直接使用dataframe里的corr函数
data.corr()
#为了直观我们可以用热力图看相关性的强度
plt.figure(figsize=(15,10))
ax = sns.heatmap(data.corr(), cmap=plt.cm.RdYlGn, annot=True, fmt='.2f')
可以根据经验将相关程度分为几种情况:
这里我用abs(r)代表相关系数的绝对值
相关度r | 相关程度 |
---|---|
abs(r)>=0.8 | 高度相关 |
0.5<=abs(r)<0.8 | 中度相关 |
0.3<=abs(r)<0.5 | 低度相关 |
abs(r)<0.3 | 相关性超级弱可视为不相关 |
相关系数的显著性检验
对r的正态性假设是具有很大风险的,因此通常不采用正态检验,而采用t检验,这个可以用于小样本也可以大样本。
检验步骤
- 提出假设 H0:ρ = 0; H1:ρ不为0
scipy.stats.pearsonr(x, y)
scipy.stats.spearmanr(x, y)
scipy.stats.kendalltau(x, y)
网友评论