数据集
数据集来源:http://jse.amstat.org/v4n2/datasets.shoemaker.html ,我们取其中的体温测试是否满足正态分布。
验证
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import matplotlib as mpl
#读取数据
df = pd.read_csv('http://jse.amstat.org/datasets/normtemp.dat.txt', header = None,sep = '\s+' ,names=['体温','性别','心率'])
#查看数据概览
df.head()
结果数据:
# 查看数据描述
df['体温'].describe()
输出:
# 计算偏态系数
stats.skew(df['体温'])
# out:-0.004367976879198404
# 偏态系数小于0且接近0,曲线呈微左偏,大致呈对称分布
# 峰态系数
stats.kurtosis(df['体温'])
# 峰态系数0.7049597854114715
# 峰态系数大于0且接近0,说明曲线微高耸
我们知道正态分布时堆对称的,偏度为0,峰度为0,从以上两个系数可以判断,体温的分布近似正态分布,那到底是不是满足分布的正态性呢,需要使用真正的统计检验方法,而不是简单地检查峰度或偏度。
这里使用 scipy.stats 提供的 shapiro 函数,对体温分布进行 Shapiro-Wilk 检验。该函数有两个返回值,一个是检验的t统计量,另一个是p值。我们只需要知道如何使用p值判断数据的正态性:如果p值小于等于0.05,就拒绝正态性假设,得出数据非正态分布的结论。
# 检验是否满足正态分布
stats.shapiro(df['体温'])
# out:(0.9865769743919373, 0.2331680953502655)
# 输出结果中第一个为统计数,第二个为P值
# p值小于0.05,所以体温满足正态分布
呈现
体温满足正态分布,我们将绘制正态分布曲线
import matplotlib.pyplot as plt
import matplotlib as mpl
#解决乱码
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
#绘制正态分布图形
t = df['体温'].sort_values()
#计算合适的位置和比例
loc,scale = stats.norm.fit(t)
plt.plot(t, stats.norm.pdf(t,loc,scale),'b-',label = 'norm')
plt.title(u'体温正态分布图')
plt.show()
输出: