做数学建模不得不会的数据特征分析---相关性分析

相关性分析是分析连续变量之间的线性相关程度的强弱,我们可以通过图来初步判断,当然了比较权威的是通过Pearson相关系数(皮尔逊相关系数) / Sperman秩相关系数(斯皮尔曼相关系数)来判断

引入相关模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
% matplotlib inline

(1)图示初判

我们生成三组数据,data1为0-100的随机数并从小到大排列,data2为0-50的随机数并从小到大排列,data3为0-500的随机数并从大到小排列

data1 = pd.Series(np.random.rand(50)*100).sort_values()
data2 = pd.Series(np.random.rand(50)*50).sort_values()
data3 = pd.Series(np.random.rand(50)*500).sort_values(ascending = False)
#

绘制散点图看一下data1与data2之间的关系

fig = plt.figure(figsize = (10,4))
ax1 = fig.add_subplot(1,2,1)
ax1.scatter(data1, data2)
plt.grid()

在这里插入图片描述
通过散点图我们可以看出,data1与data2基本是呈现线性正相关的
再来绘制散点图观察一下data1余data3之间的关系

ax2 = fig.add_subplot(1,2,2)
ax2.scatter(data1, data3)
plt.grid()

在这里插入图片描述
基本呈现线性负相关
还有一种比较常用的方法是通过散点图矩阵来初步判断多变量之间的关系

data = pd.DataFrame(np.random.randn(200,4)*100, columns = ['A','B','C','D'])
pd.scatter_matrix(data,figsize=(8,8),
                  c = 'k',
                 marker = '+',
                 diagonal='hist',
                 alpha = 0.8,
                 range_padding=0.1)
data.head()

数据展示:
在这里插入图片描述矩阵散点图:在这里插入图片描述
(2)计算Pearson相关系数
生成样本数据

data1 = pd.Series(np.random.rand(100)*100).sort_values()
data2 = pd.Series(np.random.rand(100)*50).sort_values()
data = pd.DataFrame({'value1':data1.values,
                     'value2':data2.values})
print(data.head())

样本数据展示:
在这里插入图片描述
正态性检验:

u1,u2 = data['value1'].mean(),data['value2'].mean()  # 计算均值
std1,std2 = data['value1'].std(),data['value2'].std()  # 计算标准差
print('value1正态性检验:\n',stats.kstest(data['value1'], 'norm', (u1, std1)))
print('value2正态性检验:\n',stats.kstest(data['value2'], 'norm', (u2, std2)))
print('------')

在这里插入图片描述
制作Pearson相关系数求值表

data['(x-u1)*(y-u2)'] = (data['value1'] - u1) * (data['value2'] - u2)
data['(x-u1)**2'] = (data['value1'] - u1)**2
data['(y-u2)**2'] = (data['value2'] - u2)**2
print(data.head())

在这里插入图片描述
求出Pearson相关系数

r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum()))
print('Pearson相关系数为:%.4f' % r)

|r| > 0.8 → 高度线性相关
在这里插入图片描述
当然了强大的Python提供了函数直接计算Pearson相关系数
生成样本数据:

data1 = pd.Series(np.random.rand(100)*100).sort_values()
data2 = pd.Series(np.random.rand(100)*50).sort_valdata:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMzU4cHgiIGhlaWdodD0iMzU2cHgiIHZpZXdCb3g9IjAgMCAzNTggMzU2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0OC4xICg0NzI1MCkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+TG9nby0yPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPGNpcmNsZSBpZD0icGF0aC0xIiBjeD0iMTc5IiBjeT0iMTc5IiByPSIxNzkiPjwvY2lyY2xlPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IlN5bWJvbHMiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJMb2dvLTIiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPG1hc2sgaWQ9Im1hc2stMiIgZmlsbD0id2hpdGUiPgogICAgICAgICAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3BhdGgtMSI+PC91c2U+CiAgICAgICAgICAgICAgICA8L21hc2s+CiAgICAgICAgICAgICAgICA8dXNlIGlkPSJPdmFsLTMiIGZpbGw9IiMxQTMwRDciIHhsaW5rOmhyZWY9IiNwYXRoLTEiPjwvdXNlPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIwMi41MTI0NDksNDMwLjcyNzYzNiBDMTkxLjQyMjQ2NywzODEuNjM5MjM1IDIxOC4xMDE0MTEsMzA1LjE4NTE3OSAyMzQuODM1NjEzLDI5NC43Mzk5MDkgQzI2My4yOTU3ODMsMjkxLjgyMDc3MSAzMDguMjczOTY3LDI0NC43MjU1NTkgMzA4LjI3Mzk2NywxOTYuNDk2NjEgQzMwOC4yNzM5NjcsMTEzLjE5MjMyNCAyNjYuMTU1MjUxLDYzLjI3MDQyMTQgMjQwLjQzNDQ5Myw0Ni42MjY4OTgyIEMyMzAuNjc4OTcsNDAuMzE0MjQzIDIxOS43OTM5MTEsODMuMzAwMDc1MSAyMjIuNTgwNDc5LDEwMi42NDQ1ODkgQzE1Ni43Nzk4OTcsOTQuMTcxNDU0NyAxMjcuMDU3MzgzLDEzMC4zMDI1IDExNS45NjIyODgsMTM2LjYwMjI4NSBDMTEwLjE4OTYwNCwxMzIuMDM0MTI3IDY1LjE5NzMwOTgsODIuMTQ0NDQyNCA1MS40MTMwNjcxLDk0LjYwNDUwNDQgQzQzLjY1NDExMjYsMTI2LjA3NjM5OCA1OC42NDIyOCwyMjUuMTc4ODA3IDg3Ljc4NDg5MiwyNTEuMTA5MzUgQzc5LjA0NTE5NTMsMjgxLjEyNjY1OCAxMy4zNDgzMzQ1LDMxMy4zMTAwMDYgNiwzMTcuNjkzNDY0IiBpZD0iUGF0aC0xMSIgZmlsbD0iI0ZGRkZGRiIgbWFzaz0idXJsKCNtYXNrLTIpIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjQzLjc1MDE5OSwxODAuMDkxNzgzIEMyNDguNTM1MTYsMTgwLjI0MjYxMyAyNTMuMDYzMjY2LDE3NS42NzA3IDI1My4wNjMyNjYsMTcwLjA3MjMxOSBDMjUzLjA2MzI2NiwxNjQuNDczOTM4IDI0OC42ODg2NSwxNTkuMjEzMzU5IDI0My4xNDIxNzEsMTU5LjA0MTk0MyBDMjM3LjU5NTY5MywxNTguODcwNTI3IDIzMy45NjM0NjIsMTY0Ljc5MDM5OSAyMzMuNzY5MzY3LDE2OS41MjQ2MDcgQzIzMy41NzUyNzEsMTc0LjI1ODgxNSAyMzguOTY1MjM4LDE3OS45NDA5NTIgMjQzLjc1MDE5OSwxODAuMDkxNzgzIFoiIGlkPSJPdmFsLTQiIGZpbGw9IiMxQTMwRDciIG1hc2s9InVybCgjbWFzay0yKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQzLjQxMzc3MCwgMTY5LjU2Njg1Nykgcm90YXRlKC0yNC4wMDAwMDApIHRyYW5zbGF0ZSgtMjQzLjQxMzc3MCwgLTE2OS41NjY4NTcpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE4OS41MzQxMzMsMjA4LjAzODExNyBDMTk1LjMzMzEyMywyMDguMDM4MTE3IDIwMC44ODI3MDgsMjAzLjkzNDk1OSAyMDAuODgyNzA4LDE5OC4xMzU5NjkgQzIwMC44ODI3MDgsMTkyLjMzNjk3OSAxOTQuODgxMTU2LDE4Ni43MDA0MTUgMTg5LjA4MjE2NiwxODYuNzAwNDE1IEMxODMuMjgzMTc2LDE4Ni43MDA0MTUgMTc4LjQ4NTk3OCwxOTEuNTQwNjg3IDE3OC40ODU5NzgsMTk3LjMzOTY3NyBDMTc4LjQ4NTk3OCwyMDMuMTM4NjY3IDE4My43MzUxNDQsMjA4LjAzODExNyAxODkuNTM0MTMzLDIwOC4wMzgxMTcgWiIgaWQ9Ik92YWwtNC1Db3B5IiBmaWxsPSIjMUEzMEQ3IiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE4OS42ODQzNDMsIDE5Ny4zNjkyNjYpIHJvdGF0ZSgxMy4wMDAwMDApIHRyYW5zbGF0ZSgtMTg5LjY4NDM0MywgLTE5Ny4zNjkyNjYpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzOS4wNjMxNTUsMjE3LjM1NDI5NSBDMjQzLjY5OTE0LDIxMy44NTc0OTcgMjQ0LjU4NDk4NCwyMDYuNDMwMzExIDI0Mi43NjU4MDgsMjAzLjk2Nzc4IEMyMzcuODU5NTE4LDIwMS45MjYxOCAyMjcuODU5MDkzLDIwNC45NTAxNDIgMjI2LjA4ODA3NiwyMTMuNDQxNzM1IEMyMjguNTc5NDg4LDIxNi4zOTU3MjMgMjMyLjgyODY5LDIxNy4yODk0MDkgMjM5LjA2MzE1NSwyMTcuMzU0Mjk1IFoiIGlkPSJPdmFsLTQtQ29weS0yIiBmaWxsPSIjMUEzMEQ3IiBtYXNrPSJ1cmwoI21hc2stMikiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzNC44Njc1NzcsIDIxMC4zNTQwOTkpIHJvdGF0ZSgtMy4wMDAwMDApIHRyYW5zbGF0ZSgtMjM0Ljg2NzU3NywgLTIxMC4zNTQwOTkpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTIzOCwyMTQgTDI0MSwyMjEiIGlkPSJQYXRoLTMiIHN0cm9rZT0iIzFBMzBENyIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIG1hc2s9InVybCgjbWFzay0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0xMSIgZmlsbD0iIzFBMzBENyIgb3BhY2l0eT0iMC4xMDE1MDU4ODgiIG1hc2s9InVybCgjbWFzay0yKSIgY3g9IjI1OCIgY3k9IjE5MCIgcj0iNiI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTExLUNvcHkiIGZpbGw9IiMxQTMwRDciIG9wYWNpdHk9IjAuMDc5OTM2NTk0MiIgbWFzaz0idXJsKCNtYXNrLTIpIiBjeD0iMjA4LjUiIGN5PSIyMjIuNSIgcj0iNi41Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMDUsMjEwLjk3MTEwMiBMMzE3LjU3NjQ1MiwyMDkiIGlkPSJQYXRoLTE2IiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMDQsMjE0IEwzMTMuODgwNjI4LDIxNS41NjQ5MzgiIGlkPSJQYXRoLTE2LUNvcHkiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIG1hc2s9InVybCgjbWFzay0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzNy44NzMwNDgsMTI5LjcxODQyNSBMMTI0LDExMiIgaWQ9IlBhdGgtMTciIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIG1hc2s9InVybCgjbWFzay0yKSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0Mi41OTc4NzYsMTMyLjQ3MzA1MyBMMTMyLjcxMTg1NSwxMTIuMjU3NDQ5IiBpZD0iUGF0aC0xNy1Db3B5IiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBtYXNrPSJ1cmwoI21hc2stMikiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+ues()
data = pd.DataFrame({'value1':data1.values,
                     'value2':data2.values})
print(data.head())

在这里插入图片描述
求出Pearson相关系数

data.corr()
# pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
# method默认pearson

在这里插入图片描述
(3)求Sperman秩相关系数
生成样本数据:

data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                    '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
print(data)

在这里插入图片描述
“智商”、“每周看电视小时数”重新按照从小到大排序,并设定秩次index

data.sort_values('智商', inplace=True)
data['range1'] = np.arange(1,len(data)+1)
data.sort_values('每周看电视小时数', inplace=True)
data['range2'] = np.arange(1,len(data)+1)
print(data)

在这里插入图片描述
求出di,di2

data['d'] = data['range1'] - data['range2']
data['d2'] = data['d']**2
print(data)

在这里插入图片描述
求出rs

n = len(data)
rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1))
print('Pearson相关系数为:%.4f' % rs)

在这里插入图片描述
上面真是太麻烦了,我们还是试着用Python中自带函数来实现吧

data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                    '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
print(data)
print('------')
# 创建样本数据
data.corr(method='spearman')
# pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
# method默认pearson

在这里插入图片描述

ok~

关注欢喜,一起进步~

  • 3
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值