Bootstrap

【小白学机器学习40】用各种方法去验证总体的数据

目录

1 先生成一个符合正态分布的总体

2 用各种方法去验证总体的数据

2.1 这个总体合适吗?是个正态分布吗?

2.2  用图形验证

2.3 用假设检验验证是否符合正态分布

2.3.1 使用.kstest来进行K-S检验

2.3.2  如何确定h0假设?

2.4 用正态分布的pdf图,去和总体的hist频度图叠加对比

2.4.1 叠加2个图

2.4.2 可见pdf和hist 拟合的很好 

3 下面是全部的代码


1 先生成一个符合正态分布的总体

  • 先用np.random.normal() 生成一个符合正态分布的数组array
  • 但是这个数组,是否符合正态分布呢?
array1=np.random.normal(loc=0, scale=1, size=1000)

2 用各种方法去验证总体的数据

2.1 这个总体合适吗?是个正态分布吗?

  • 理论上是符合的,因为我们就是用np.random.normal() 生成的
  • 但是因为2个原因
  1. 因为我们是随机取的,有可能随机性比较大,取得有点偏
  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 符合正态分布。
# 假设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(是正态,就一种确定的分布,而且这种分布只需要知道均值和方差) 更好验证。
  • 因此,这种有关数学和分布的假设检验,
  1. h0假设:往往是那个好计算的假设,比如符合正态分布,两数相等等这种作为h0假设

  2. h1假设,往往是那些不好计算的,比如,不是XX分布但是什么分布呢?

为什么不是看弃真错误是否更严重呢

  • 因为第1类错误=弃真错误=第1类错误,也就是我们设置的显著度α=弃真概率
  • 因为我们是从 设置显著度α 为出发点,那么我们肯定认为 弃真错误概率要越小越好,只是因为第1类错误和2类错误有此消彼长关系,所以也不能追求 弃真概率α无限小,在一个可接受的范围内如5%,1%这以下就可以了。
  • 弃真错误也就是h0 是对的但是我们错误的判断h0是假的,为什么会这样呢?
  • 因为我们本次(假设h0为真时,往下推导)检验出来的概率很小,是个小概率事件,不太可能发生,小于显著度α,因为我们顶着α的弃真错误的可能性,认为h0为假。
  • 所以理论上即使我们这次检验出来的概率小于α,可以拒绝h0, 还是有α的理论上的可能性,我们犯了弃真错误。
  • 所以,包含社会价值的假设检验里h0 往往是那个 弃真错误需要尽量低的作为h0
  1. h0 假设是假币,
  2. h0 假设新药无效,
  3. 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)

;