统计学第十一周:
一 问题:
- 1、人体体温的总体均值是否为98.6华氏度?
- 2、人体的温度是否服从正态分布?
- 3、人体体温中存在的异常数据是哪些?
- 4、男女体温是否存在明显差异?
- 5、体温与心率间的相关性(强?弱?中等?)
引申出来的点:你要怎么向运营或者产品的同事展示数据结果?
二 根据给出的数据进行验证(假设检验)
-
原 假 设 H 0 : 给 出 数 据 , 人 体 体 温 的 总 体 均 值 μ 0 = 98.6 , 备 择 假 设 H 1 : μ 0 ≠ 98.6 原假设H_0: 给出数据,人体体温的总体均值\mu _0 = 98.6 , 备择假设H_1:\mu_0\neq98.6 原假设H0:给出数据,人体体温的总体均值μ0=98.6,备择假设H1:μ0=98.6
经过统计计算:
df.describe() Temperature Gender HeartRate count 130.000000 130.000000 130.000000 mean 98.249231 1.500000 73.761538 std 0.733183 0.501934 7.062077 min 96.300000 1.000000 57.000000 25% 97.800000 1.000000 69.000000 50% 98.300000 1.500000 74.000000 75% 98.700000 2.000000 79.000000 max 100.800000 2.000000 89.000000
总体方差未知,但n未130属于大样本,温度的样本均值为98.248231 ,方差采用样本方差s替代,n=130
x ‾ ± z α / 2 σ n \overline{x}\pm z_{\alpha/2}\frac{\sigma}{\sqrt{n}} x±zα/2nσz = x ‾ − μ 0 s / n = 98.24923 − 98.6 0.733 / 130 = − 5.44837 z=\frac{\overline{x}-\mu_0}{s/\sqrt{n}}=\frac{98.24923-98.6}{0.733/\sqrt{130}}=-5.44837 z=s/nx−μ0=0.733/13098.24923−98.6=−5.44837
根据双侧检验,只要z落在置信区间即可以验证假设,显然不在(-1.96,1.96)所以拒绝。95.5%的置信区间范围在
(96.8122181854031, 99.68624335305843),此时看98.6在此区间范围内
#coding=utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sbn from scipy import stats plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示 #df = pd.read_excel('d:\\excel\\tj-week11_test.xlsx') df = pd.read_csv('d:\\excel\\tj-week11_test.csv') print(df.head()) print(df.describe()) temperature = df['Temperature'] def norm_conf(data,confidence=0.95): sample_mean = np.mean(data) sample_std = np.std(data,ddof = 1) sample_size = len(data) conf_interval = stats.norm.interval(confidence,loc=sample_mean,scale=sample_std) print(conf_interval) norm_conf(temperature)
这里因此有个疑问,那种方法错了?
-
2.人体的体温是否服从正态分布?
#验证是否服从正态分布#####
ks_test = stats.kstest(df['Temperature'],'norm')
shapiron_test = stats.shapiro(df['Temperature'])
normaltest_test = stats.normaltest(df['Temperature'],axis=0)
print('ks_test: ',ks_test)
print('shapiro_test: ',shapiron_test)
print('normaltest_test: ',normaltest_test)
ks_test: KstestResult(statistic=1.0, pvalue=0.0)
shapiro_test: (0.9865769743919373, 0.2331680953502655)
normaltest_test: NormaltestResult(statistic=2.703801433319236, pvalue=0.2587479863488212)
从根据检验pvalue>0.05,认为服从正态分布。
-
人体体温中存在的异常数据是哪些?
这个问题求解,可以从正在分布的
( μ − 3 σ , μ + 3 σ ) 范 围 内 , 判 断 , (\mu-3\sigma,\mu+3\sigma)范围内,判断, (μ−3σ,μ+3σ)范围内,判断,df.describe() Temperature Gender HeartRate count 130.000000 130.000000 130.000000 mean 98.249231 1.500000 73.761538 std 0.733183 0.501934 7.062077
由上面计算结果知道样本均值未98.249,标准差为0.73318,
所 以 3 σ 标 准 检 验 的 区 间 范 围 是 ( 98.249 − 0.73318 ∗ 3 , 98.249 + 0.733 ∗ 3 ) = 所以3\sigma标准检验的区间范围是(98.249-0.73318*3,98.249+0.733*3)= 所以3σ标准检验的区间范围是(98.249−0.73318∗3,98.249+0.733∗3)=
( 96.04946 , 100.448 ) (96.04946,100.448) (96.04946,100.448)
因此求出异常数据:
#求异常数据
print(df.loc[(df['Temperature']>100.448)])
#求异常数据
print(df.loc[(df['Temperature']<96.04946)])
Temperature Gender HeartRate
129 100.8 2 77
同时利用箱型图进一步检验
最高点处有一个异常为100.8,低点有96.3,96.4,但基本在上述区间范围内,可以认为100.8点位异常值。
#箱型图
df['Temperature'].plot(kind='box')
plt.show()
4.男女体温是否存在差异?
原
假
设
位
H
0
:
u
1
=
u
2
,
即
男
女
体
温
无
差
异
备
择
假
设
H
1
:
u
1
≠
u
2
,
男
女
体
温
有
差
异
原假设位H_0:u_1=u_2,即男女体温无差异 备择假设H_1:u_1\neq u_2,男女体温有差异
原假设位H0:u1=u2,即男女体温无差异备择假设H1:u1=u2,男女体温有差异
利用两个总体均值之差的检验进行假设验证,很明显,男女总体分布未知,且方差未知,但都是大约30的数量,可以认为是大样本,经过统计数量各是65,且分别统计各自样本均值和样本方差:,满足z统计的条件,利用z统计
#按照男女分组统计
#定义聚合函数
def get_stats(group):
return {'Gender': group.count()}
#分组统计
groupd = df['Temperature'].groupby([df['Gender']])
temperature_amount = groupd.apply(get_stats).unstack()
print(temperature_amount)
#===============================
Gender
1 65
2 65
#定义聚合函数,求均值
def get_stats2(group):
return {'Gender': group.mean()}
#分组统计
groupd = df['Temperature'].groupby([df['Gender']])
temperature_mean = groupd.apply(get_stats2).unstack()
print(temperature_mean)
Gender
1 98.104615
2 98.393846
#定义聚合函数,求样本方差
def get_stats2(group):
return {'Gender': group.std()}
#分组统计
groupd = df['Temperature'].groupby([df['Gender']])
temperature_std = groupd.apply(get_stats2).unstack()
print(temperature_std)
Gender
1 0.698756
2 0.743488
利 用 z 检 验 统 计 量 的 计 算 公 式 z = x 1 ‾ − x 2 ‾ − ( μ 1 − μ 2 ) σ 1 2 n 1 + σ 2 2 n 2 利用z检验统计量的计算公式z=\frac{\overline{x_1}-\overline{x_2}-(\mu_1-\mu_2)}{\sqrt{\frac{\sigma_1^2}{n_1}+\frac{\sigma_2^2}{n_2}}} 利用z检验统计量的计算公式z=n1σ12+n2σ22x1−x2−(μ1−μ2)
按 照 假 设 u 1 − u 2 = 0 , x 1 ‾ = 98.1046 , x 2 ‾ = 98.3938 , n 1 = n 2 = 65 , σ 1 = 0.698756 , σ 2 = 0.743488 按照假设u_1-u_2=0,\overline{x_1}=98.1046,\overline{x_2}=98.3938,n_1=n_2=65,\sigma_1=0.698756,\sigma_2=0.743488 按照假设u1−u2=0,x1=98.1046,x2=98.3938,n1=n2=65,σ1=0.698756,σ2=0.743488
计 算 z = − 0.2892 σ x 1 − x 2 计算z=\frac{-0.2892}{\sigma_{x_1-x_2}} 计算z=σx1−x2−0.2892
σ x 1 − x 2 = 0.00751169 + 0.0085042 = 0.126554 \sigma_{x_1-x_2}=\sqrt{0.00751169+0.0085042}=0.126554 σx1−x2=0.00751169+0.0085042=0.126554
经 计 算 z = − 2.285 , 当 α = 0.05 时 , z α / 2 = 1.96 , 因 此 拒 绝 H 0 , 认 为 两 者 具 有 显 著 差 异 。 经计算z=-2.285,当\alpha=0.05时,z_{\alpha/2}=1.96,因此拒绝H_0,认为两者具有显著差异。 经计算z=−2.285,当α=0.05时,zα/2=1.96,因此拒绝H0,认为两者具有显著差异。
5.体温与心率间的相关性(强?弱?中等?)
假
设
体
温
与
心
率
间
的
关
系
假设体温与心率间的关系
假设体温与心率间的关系
#相关系数
print(df.corr()) #pearson相关系数
print(df.corr('kendall')) #kendall tau相关系数
print(df.corr('spearman')) #spearman秩相关
#显著性检验
print(stats.pearsonr(df['Temperature'],df['HeartRate']))
Temperature Gender HeartRate
Temperature 1.000000 0.198006 0.253656
Gender 0.198006 1.000000 0.055766
HeartRate 0.253656 0.055766 1.000000
Temperature Gender HeartRate
Temperature 1.000000 0.163190 0.186489
Gender 0.163190 1.000000 0.063322
HeartRate 0.186489 0.063322 1.000000
Temperature Gender HeartRate
Temperature 1.000000 0.195231 0.280919
Gender 0.195231 1.000000 0.075927
HeartRate 0.280919 0.075927 1.000000
(0.25365640272076423, 0.003591489250708233)
根据spearman秩相关,即pvalue=0.00359<0.05,可以认为体温与心率间弱相关。