数据特征分析(三)

2018-11-13  本文已影响0人  熊定坤

6 相关性分析

6.1 定义

分析连续变量之间线性相关程度的强弱,并用适当的统计指标标识出来的过程

6.2 直接绘制散点图

判断两个变量是否具有线性相关最直接的方法

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为0-100的随机数并从小到大排列,
#data2为0-50的随机数并从小到大排列,data3为0-500的随机数并从大到小排列

fig = plt.figure(figsize = (10,4))
ax1 = fig.add_subplot(1,2,1)
ax1.scatter(data1, data2)
plt.grid()
plt.title('正线性相关')
# 正线性相关

ax2 = fig.add_subplot(1,2,2)
ax2.scatter(data1, data3)
plt.grid()
plt.title('负线性相关')
# 负线性相关
image.png
6.3 绘制散点图矩阵

散点图矩阵初判多变量间关系,进行多元线性回归时尤为重要

data = pd.DataFrame(np.random.randn(200,4)*100, columns = ['A','B','C','D'])
sns.set()
sns.pairplot(data)

scatterplot 绘制散点图矩阵注意:多变量作图数据中不能有空值,否则出错

散点矩阵图
6.3 计算相关系数

二元变量的相关分析过程中比较常用有Pearson相关系数和Sperman秩相关系数

6.3.1 Pearson相关系数

用于分析两个连续性变量直接的线性关系,要求联系变量的取值服从正太分布(二项分布近似正太分布)

data = pd.read_excel(r'C:\Users\Administrator\Desktop\chapter3 data\catering_sale_all.xls')
print(data.head())
data.corr() #method='pearson' ,默认为*Pearson*相关系数
菜品相关系数

相关系数r的取值范围-11之间,|r|存在不同程度的线性相关
r>0 正相关,r<0负相关
|r|≤0.3 不存在线性相关
0.3<|r|≤0.5 为低度线性相关
0.5<|r|≤0.8 为显著线性相关
|r|>0.8 为高度线性相关

plt.figure(figsize=(12,9))
sns.set(font_scale=1.25,font='STSong')#解决seaborn不能显示中文的问题
# 使用热地图(heat map)更直观地展示系数矩阵情况
# vmax设定热地图色块的最大区分值
# square设定图片为正方形与否
# annot设定是否显示每个色块的系数值
sns.heatmap(data.corr(),vmax=1,square=True,annot=True)
热力图

分析这些菜品销售量之间的相关性可以得到不同菜品之间的关系,比如替补菜品,互补菜品或者没有关系,为原材料采购提供参考
从上面结果得出,客户点了”百合酱蒸凤爪“与点了’‘乐膳真味鸡‘’和‘生炒菜心’,‘原汁原味菜心’相关性比较高

6.3.2 Sperman秩相关系数

对于不服从正太分布的变量,分类或者等级变量之间的关联性可采取Sperman秩相关系数,也称等级相关系数

data.corr(method='spearman')[['百合酱蒸凤爪','翡翠蒸香茜饺']]

Sperman秩相关系数

两个变量具有严格单调的函数关系,那么它们就是完全Sperman秩相关,在正太分布的假定下,Sperman秩相关系数与Pearson相关系数在效率上是等价的

7 正态性检验

7.1 定义

利用观测数据判断总体是否服从正态分布的检验称为正态性检验,它是统计判决中重要的一种特殊的拟合优度假设检验。常用判断方法直方图初判 / QQ图判断 / K-S检验

7.2 直方图初判
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline
import seaborn as sns
from scipy import stats
# scipy包是一个高级的科学计算库,它和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算
from scipy.stats import norm,skew
s = pd.DataFrame(np.random.randn(1000)+10,columns = ['value'])
# 创建随机数据
sns.set()
sns.distplot(s,fit = norm) #displot集合了直方图和拟合曲线
(mu, sigma) = norm.fit(s) #求出正太分布的均值和标准差
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],loc='best') 
直方图初判
样本均值为9.97,样本标准差为0.98
样本呈明显正太分布
7.3 QQ图判断

QQ图通过把测试样本数据的分位数与已知分布相比较,从而来检验数据的分布情况
QQ图是一种散点图,对应于正态分布的QQ图,就是由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图
参考直线:如果数据严格意义上服从正太分布,点将形成一条直线,该正太分布的均值是直线在Y轴上的截距,标准差是该直线的斜率

fig = plt.figure()
res = stats.probplot(s['value'],plot=plt)  #样本为Series,默认dist='norm' 拟合直线为正太分布

将样本数据绘制的点形成的图案与直线比较,其拟合程度较高,符合正太分布

样本数据点绘制的点会形成其他一些常见的变形图案
具体可以参考:https://wenku.baidu.com/view/03c56baddd3383c4bb4cd2ae.html

短尾分布:如果尾部比正常的短,则点所形成的图形左边朝直线上方弯曲,右边朝直线下,如果倾斜向右看,图形呈S型。表明数据比标准正态分布时候更加集中靠近均值
长尾分布:如果尾部比正常的长,则点所形成的图形左边朝直线下方弯曲,右边朝直线下,如果倾斜向右看,图形倒S型。表明数据比标准正态分布时候有更多偏离的数据
右偏态分布:在图型的两端,分布的点在直线的上方。因此,点所形成的图形与直线相比向上弯曲,或者说呈U型。
左偏态分布:在图型的两端,分布的点在直线的下方。因此,点所形成的图形与直线相比向下弯曲

7.4 KS检验
data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
       76,80,81,75,77,72,81,72,84,86,80,68,77,87,
       76,77,78,92,75,80,78]
# 样本数据,35位健康男性在未进食之前的血糖浓度

df = pd.DataFrame(data, columns =['value'])
u = df['value'].mean()  # 计算均值
std = df['value'].std()  # 计算标准差
stats.kstest(df['value'], 'norm', (u, std))
# .kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
# 结果返回两个值:statistic → D值,pvalue → P值
# p值大于0.05,为正态分布

KstestResult(statistic=0.15901807048240979, pvalue=0.30662972583580261)
该样本p值大于0.05,符合正太分布

上一篇下一篇

猜你喜欢

热点阅读