数据特征分析:4.正态分布与正态性体验
Posted shengyang17
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据特征分析:4.正态分布与正态性体验相关的知识,希望对你有一定的参考价值。
1.正态分布
期望值u(均值)决定位置,标准差决定它的分布幅度,可以验证分布曲线的高矮胖瘦,越胖代表它的离中趋势越明显,越高代表它集中的值越高。
2. 正太性检验
利用观测数据判断总体是否服从正态分布的检验称为正态性检验,它是统计判决中重要的一种特殊的拟合优度假设检验。
直方图初判 / QQ图判断 / K-S检验
2.1直方图初判
import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline
#直方图判断 s = pd.DataFrame(np.random.randn(1000)+10, columns = [‘value‘]) print(s.head()) #创建随机数据 fig = plt.figure(figsize = (10, 6)) ax1 = fig.add_subplot(2, 1, 1) # 创建子图1 ax1.scatter(s.index, s.values)
plt.grid() #绘制数据分布图
s = pd.DataFrame(np.random.rand(1000)+10, columns = [‘value‘])#这样子改下,其他不变,就是均匀分布了
ax2 = fig.add_subplot(2,1,2) # 创建子图2 s.hist(bins=30,alpha = 0.5,ax = ax2) s.plot(kind = ‘kde‘, secondary_y=True,ax = ax2) plt.grid() # 绘制直方图 # 呈现较明显的正太性
2.2 QQ图判断
QQ图通过把测试样本数据的分位数与已知分布相比较,从而来检验数据的分布情况
QQ图是一种散点图,对应于正态分布的QQ图,就是由标准正态分布的分位数为横坐标,样本值为纵坐标的散点图
参考直线:四分之一分位点和四分之三分位点这两点确定,看散点是否落在这条线的附近
绘制思路
① 在做好数据清洗后,对数据进行排序(次序统计量:x(1)<x(2)<....<x(n))
② 排序后,计算出每个数据对应的百分位p{ i } ,即第i个数据x(i)为p(i)分位数,其中p(i)=(i-0.5)/n (pi有多重算法,这里以最常用方法为主)
③ 绘制直方图 + qq图,直方图作为参考
绘制散点图,横坐标是它的分位,就是分布的位置,做下排序,看是否很多的点在某条直线上,这条直线一般是拿它的一分位和三分位做一下相减,
s = pd.DataFrame(np.random.randn(1000) + 10, columns = [‘value‘]) print(s.head()) #创建随机数据 mean = s[‘value‘].mean() std = s[‘value‘].std() print(‘均值为:%.2f,标准差为:%.2f‘ % (mean,std)) print(‘------‘) # 计算均值,标准差
s.sort_values(by = ‘value‘, inplace = True) #index值跟着改变了。 重新排序 s_r = s.reset_index(drop = False) #给index重新排序下,drop = False是是否保留原来的 s_r[‘p‘] = (s_r.index - 0.5) / len(s_r) s_r[‘q‘] = (s_r[‘value‘] - mean) / std #每个值标准化之后的结果 print(s_r.head()) print(‘------‘) #计算百分位数 p(i) # 计算q值
st = s[‘value‘].describe() x1 ,y1 = 0.25, st[‘25%‘] #1/4位点 x2 ,y2 = 0.75, st[‘75%‘] #3/4位点 print(‘四分之一位数为:%.2f,四分之三位数为:%.2f‘ % (y1,y2)) print(‘------‘) # 计算四分之一位数、四分之三位数
fig = plt.figure(figsize = (10,9)) ax1 = fig.add_subplot(3,1,1) # 创建子图1 ax1.scatter(s.index, s.values) plt.grid() # 绘制数据分布图 ax2 = fig.add_subplot(3,1,2) # 创建子图2 s.hist(bins=30,alpha = 0.5,ax = ax2) s.plot(kind = ‘kde‘, secondary_y=True,ax = ax2) plt.grid() # 绘制直方图 ax3 = fig.add_subplot(3,1,3) # 创建子图3 ax3.plot(s_r[‘p‘],s_r[‘value‘],‘k.‘,alpha = 0.1) #s_r[‘value‘]也可以用s_r[‘q‘],最后结果是一样的 ax3.plot([x1,x2],[y1,y2],‘-r‘) #这两个点做一个红线 plt.grid() # # 绘制QQ图,直线为四分之一位数、四分之三位数的连线,基本符合正态分布
2.3K - S检验
# 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() print("样本均值为:%.2f,样本标准差为:%.2f" % (u,std)) print(‘------‘) # 查看数据基本统计量 s = df[‘value‘].value_counts().sort_index() df_s = pd.DataFrame({‘血糖浓度‘:s.index,‘次数‘:s.values}) # 创建频率数据 df_s[‘累计次数‘] = df_s[‘次数‘].cumsum() df_s[‘累计频率‘] = df_s[‘累计次数‘] / len(data) df_s[‘标准化取值‘] = (df_s[‘血糖浓度‘] - u) / std df_s[‘理论分布‘] =[0.0244,0.0968,0.2148,0.2643,0.3228,0.3859,0.5160,0.5832,0.7611,0.8531,0.8888,0.9803] # 通过查阅正太分布表 df_s[‘D‘] = np.abs(df_s[‘累计频率‘] - df_s[‘理论分布‘]) dmax = df_s[‘D‘].max() print("实际观测D值为:%.4f" % dmax) # D值序列计算结果表格 df_s
把一个非标准正态分布变成一个标准正态分布----->把非标准正态分布的值变成X = (x-u) /方差----->可以找到理论值。;
拿这个标准化取值去跟正态分布表去对
标准化取值的值它本 身就符合正态分布;系统分布与标准分布相减,如果这个函数满足标准正态分布,它的值就应该满足这个表。比如说标准化取值2.064315,其对应的查正态分布表值为0.9803,它的理论分布值是0.9803; 标准化取值-1.9777,找的时候把它的负号去掉,查正态分布表为0.9756,正的是0.9756,负的就是1-0.9756=0.0244.可以看到与理论分布值是相对应的。 ----- >>>理论分布就相当于是g(x)就是F0(x),F(n)就是原来的F(n)累计频率。累计频率 - 理论分布 = D
df_s[‘累计频率‘].plot(style = ‘--k.‘) df_s[‘理论分布‘].plot(style = ‘--r.‘) plt.legend(loc = ‘upper left‘) plt.grid() # 密度图表示
实际观测D值为:0.1597 对应的0.1597放到显著性对照表,我们的样本数据一共35个,在50以内,按0.05的值去算的话,0.1587介于0.158和0.190之间,它所对应的P值是0.2和0.4,这个P值是大于
0.05的。 拿到这个D值去那个表里边查,如果大于0.05就说明满足正态分布,这是理论推导,实际工作中就更简单了。
# 直接用算法做KS检验 from scipy import stats # scipy包是一个高级的科学计算库,它和Numpy联系很密切,Scipy一般都是操控Numpy数组来进行科学计算 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)) #value值直接写样本就可以了,中间是norm默认是以正态分布去做判断,后边是均值和方差 # .kstest方法:KS检验,参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差 # 结果返回两个值:statistic → D值,pvalue → P值 # p值(pvalue)大于0.05,为正态分布
以上是关于数据特征分析:4.正态分布与正态性体验的主要内容,如果未能解决你的问题,请参考以下文章