目录
[1 先生成一个符合正态分布的总体](#1 先生成一个符合正态分布的总体)
[2 用各种方法去验证总体的数据](#2 用各种方法去验证总体的数据)
[2.1 这个总体合适吗?是个正态分布吗?](#2.1 这个总体合适吗?是个正态分布吗?)
[2.2 用图形验证](#2.2 用图形验证)
[2.3 用假设检验验证是否符合正态分布](#2.3 用假设检验验证是否符合正态分布)
[2.3.1 使用.kstest来进行K-S检验](#2.3.1 使用.kstest来进行K-S检验)
[2.3.2 如何确定h0假设?](#2.3.2 如何确定h0假设?)
[2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比](#2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比)
[2.4.1 叠加2个图](#2.4.1 叠加2个图)
[2.4.2 可见pdf和hist 拟合的很好](#2.4.2 可见pdf和hist 拟合的很好)
[3 下面是全部的代码](#3 下面是全部的代码)
1 先生成一个符合正态分布的总体
-
先用np.random.normal() 生成一个符合正态分布的数组array
-
但是这个数组,是否符合正态分布呢?
array1=np.random.normal(loc=0, scale=1, size=1000)
2 用各种方法去验证总体的数据
2.1 这个总体合适吗?是个正态分布吗?
- 理论上是符合的,因为我们就是用np.random.normal() 生成的
- 但是因为2个原因
- 因为我们是随机取的,有可能随机性比较大,取得有点偏
- 因为我们取得10个数据模拟正态数据,数据量也会比较少
array1=np.random.normal(loc=0, scale=1, size=1000)
2.2 用图形验证
- 如果用 plt.plot() 看是否正态分布不那么直观,如果在均值附近波动则是
- 如果用 plt.hist() 频度图更适合看出是否正态分布
- 因为取了1000个数据,所以, plt.plot() plt.hist() 看起来都能看出来比较像正态分布
2.3 用假设检验验证是否符合正态分布
2.3.1 使用.kstest来进行K-S检验
- 下面的代码中
- array1=np.random.normal()
- 可以使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
- sp.stats.kstest(data, 'norm') 会返回2个结果:ks_statistic, p_value
- 尤其是 p_value 就是检验的概率,需要和显著度进行α比较
判断标准
- h0假设,这个数组符合正态分布
- 如果p_value() 小于α,就认为是小概率事件,就拒绝h0假设,认为data 不符合正态分布。
- 如果p_value() 大于α,就不是小概率事件,就接受h0假设,认为data 符合正态分布。
python
# 假设data是你需要验证的数组
data =array1
# 使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
ks_statistic, p_value = sp.stats.kstest(data, 'norm')
# 设定显著性水平α,一般取0.05
alpha = 0.05
# 根据p值判断是否接受原假设(数据来自正态分布)
if p_value < alpha:
print("数据不符合正态分布")
else:
print("数据符合正态分布")
array2=np.random.choice(array1,size=5,replace=False)
print(array2)
print()
2.3.2 如何确定h0假设?
sp.stats.kstest(data, 'norm')
关于分布的假设检验,H0的假设一定是服从这个分布,h1假设一定是不符合。
为什么呢?
- 我感觉是因为h0假设属于这个分布才好往下推导和计算,
- 因为假设检验本身就是h1不好验证(h1=不是正态,有可能是各种分布,更复杂)
- 其否命题h0(是正态,就一种确定的分布,而且这种分布只需要知道均值和方差) 更好验证。
- 因此,这种有关数学和分布的假设检验,
h0假设:往往是那个好计算的假设,比如符合正态分布,两数相等等这种作为h0假设
h1假设,往往是那些不好计算的,比如,不是XX分布但是什么分布呢?
为什么不是看弃真错误是否更严重呢
- 因为第1类错误=弃真错误=第1类错误,也就是我们设置的显著度α=弃真概率
- 因为我们是从 设置显著度α 为出发点,那么我们肯定认为 弃真错误概率要越小越好,只是因为第1类错误和2类错误有此消彼长关系,所以也不能追求 弃真概率α无限小,在一个可接受的范围内如5%,1%这以下就可以了。
- 弃真错误也就是h0 是对的但是我们错误的判断h0是假的,为什么会这样呢?
- 因为我们本次(假设h0为真时,往下推导)检验出来的概率很小,是个小概率事件,不太可能发生,小于显著度α,因为我们顶着α的弃真错误的可能性,认为h0为假。
- 所以理论上即使我们这次检验出来的概率小于α,可以拒绝h0, 还是有α的理论上的可能性,我们犯了弃真错误。
- 所以,包含社会价值的假设检验里h0 往往是那个 弃真错误需要尽量低的作为h0
- h0 假设是假币,
- h0 假设新药无效,
- h0 假设传染口罩是阳性
2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比
2.4.1 叠加2个图
- 用一个正态分布的pdf图,去和总体的hist频度图去,叠加对比
- 注意:sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)
- pdf曲线的参数,x就是横轴范围,loc是均值,scale是标准差std
画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差
array6=np.arange(start=-5,stop=5,step=0.1)
array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)
我们直接用sp.stats.norm.pdf,生成一个正态分布的pdf曲线
但是这个概率曲线,特点是均值,方差=总体的均值,方差
然后,我们看看,这个pdf和总体的hist是否比较拟合
#重新开启一个画布
fig2=plt.figure(num=2,figsize=(5, 5))
#plt.subplot(2,3,3)
# 画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差
array6=np.arange(start=-5,stop=5,step=0.1)
array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)
#显示正态分布的pdf曲线
plt.plot(array6,array7)
#显示这个population整体的hist,叠一起看
#plt.hist(array1)
sns.distplot(array1,kde=False,norm_hist=True)
#sns.histplot(array1,kde=False)
2.4.2 可见pdf和hist 拟合的很好
3 下面是全部的代码
import numpy as np
import pandas as pd
import scipy as sp
from matplotlib import pyplot as plt
import seaborn as sns
%precision 3
np.random.seed(100) #设置确定的随机种子,保证每次随机的结果都相同
# 先生成一个正态分布的随机数组
#fig1=plt.figure(num=1,figsize=(3,3))
plt.subplot(1,2,1)
array1=np.random.normal(loc=0, scale=1, size=1000)
plt.plot(array1)
#fig3=plt.figure(num=3,figsize=(3,3))
plt.subplot(1,2,2)
plt.hist(array1)
##
# 假设data是你需要验证的数组
data =array1
# 使用scipy.stats.kstest来进行K-S检验,对data进行正态分布的验证
ks_statistic, p_value = sp.stats.kstest(data, 'norm')
print(f"这次的检查的p值= {p_value}")
# 设定显著性水平α,一般取0.05
alpha = 0.05
# 根据p值判断是否接受原假设(数据来自正态分布)
if p_value < alpha:
print("数据不符合正态分布")
else:
print("数据符合正态分布")
#重新开启一个画布
fig2=plt.figure(num=2,figsize=(5, 5))
#plt.subplot(2,3,3)
# 画出一个特殊的正态分布的pdf曲线,其均值,方差=总体的均值,方差
array6=np.arange(start=-5,stop=5,step=0.1)
array7=sp.stats.norm.pdf(x=array6,loc=pop_mean1,scale=pop_std1)
#显示正态分布的pdf曲线
plt.plot(array6,array7)
#显示这个population整体的hist,叠一起看
#plt.hist(array1)
sns.distplot(array1,kde=False,norm_hist=True)
#sns.histplot(array1,kde=False)