微信公众号直接链接网站怎么做,展示型网站 营销型网站,59网站一起做网店普宁,seo兼职平台文章目录 1、简介1.1 假设检验的定义1.2 假设检验的类型1.3 假设检验的基本步骤 2、测试数据2.1 sklearn2.2 seaborn 3、正态分布检验3.1 直方图判断3.2 KS检验#xff08;scipy.stats.kstest#xff09;3.3 Shapiro-Wilk test#xff08;scipy.stats.shapiro#xff09;3.… 文章目录 1、简介1.1 假设检验的定义1.2 假设检验的类型1.3 假设检验的基本步骤 2、测试数据2.1 sklearn2.2 seaborn 3、正态分布检验3.1 直方图判断3.2 KS检验scipy.stats.kstest3.3 Shapiro-Wilk testscipy.stats.shapiro3.4 Anderson-Darling testscipy.stats.anderson3.5 D’Agostino and Pearson’s test (scipy.stats.normaltest) 4、假设检验4.1 z 检验4.2 t 检验 5、置信区间结语 1、简介
1.1 假设检验的定义 什么是假设检验 统计学有两个推断统计方法一个是参数估计另一个是假设检验。 参数估计用样本统计量来推断总体参数的方法 假设检验是基于某一假设的前提下同样利用样本统计量去检验这个假设是否成立。
1.2 假设检验的类型 假设检验的3种类型 1、单样本检验单个样本的平均值是否等于目标值。 2、相关样本检验的缺点残留效应。第二次测量结果会受到第一次处理措施的影响。 3、独立双样本检验没有残留效应因为可以对一个组实施一种处理措施并对另一组实施另一种措施。但是需要更多的实验数据因为我们需要随机的选择两组实验数据来接受两种处理措施。 1.3 假设检验的基本步骤
假设检验是一种统计推断方法用于判断一个统计样本中的观察结果是否与预期的理论分布相符。下面是假设检验的基本步骤 1建立原假设H0和备择假设H1原假设H0是我们想要进行假设检验的观察结果的预期结果。 备择假设H1是与原假设相反的假设即观察结果与预期结果不符。 2选择合适的统计检验方法根据问题的性质和数据类型选择适当的统计检验方法。例如t检验适用于比较样本均值卡方检验适用于比较分类变量等。 3收集和整理数据收集和整理与问题相关的样本数据确保数据的质量和完整性。 4计算统计量使用所选择的统计检验方法计算适当的统计量。例如t检验中的t值卡方检验中的卡方值等。 5获取p值根据计算的统计量和观察样本数据计算得到一个p值或显著性水平。p值表示给定观察结果出现的概率如果p值小于预设的显著性水平通常为0.05则拒绝原假设。 6进行假设判断根据得到的p值和预设显著性水平做出假设判断 如果p值小于显著性水平拒绝原假设接受备择假设认为观察结果与预期结果不一致。 如果p值大于或等于显著性水平接受原假设认为观察结果与预期结果一致。 7解释结果 根据假设判断的结果解释分析的结果得出结论。 假设检验的步骤 1、问题是什么零假设备选假设 2、证据是什么零假设成立时得到样本平均值的概率p 3、判断标准是什么显著水平alpha 4、做出结论palpha 零假设不太可能发生拒绝零假设得到。 2、测试数据
Toy datasets load_iris(*[, return_X_y, as_frame]): Load and return the iris dataset (classification).load_diabetes(*[, return_X_y, as_frame, scaled]): Load and return the diabetes dataset (regression).load_digits(*[, n_class, return_X_y, as_frame]): Load and return the digits dataset (classification).load_linnerud(*[, return_X_y, as_frame]): Load and return the physical exercise Linnerud dataset.load_wine(*[, return_X_y, as_frame])Load and return the wine dataset (classification).load_breast_cancer(*[, return_X_y, as_frame])Load and return the breast cancer wisconsin dataset (classification). Real world datasetsGenerated datasetsLoading other datasets
2.1 sklearn
鸢尾花Iris plants dataset
https://scikit-learn.org/stable/datasets/toy_dataset.html#iris-dataset
Iris数据集在模式识别研究领域应该是最知名的数据集了有很多文章都用到这个数据集。这个数据集里一共包括150行记录其中前四列为花萼长度花萼宽度花瓣长度花瓣宽度等4个用于识别鸢尾花的属性第5列为鸢尾花的类别包括SetosaVersicolourVirginica三类。也即通过判定花萼长度花萼宽度花瓣长度花瓣宽度的尺寸大小来识别鸢尾花的类别。
# pip install scikit-learn
from sklearn.datasets import load_irisiris load_iris()
data iris.data
target iris.target
print(data)
print(target)这里data为训练所需的数据集target为数据集对应的分类标签属于监督学习。 from sklearn.datasets import load_irisiris load_iris()
data iris.data
target iris.target
# print(data)
# print(target)
# print(DESCR: , iris[DESCR])
print(data_module: , iris[data_module])
print(filename: , iris[filename])
print(frame: , iris[frame])
print(feature_names: , iris[feature_names])
print(target_names: , iris[target_names])
print(target: , iris[target])data数据集中的数据一共有4个属性分别为
sepal length (cm),
sepal width (cm),
petal length (cm),
petal width (cm)pandas.DataFrame.describe() 对数值型数据进行描述包括个数、均值、标准差、最小值、分分位数和最大值。
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
# print(iris.data)df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])
# print(df_iris[sepal_width])
print(df_iris.describe())极差
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
# print(iris.data)df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])print(df_iris[sepal_length].max() - df_iris[sepal_length].min())
# or
print( np.ptp(df_iris[sepal_length]) )均值
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])result df_iris[sepal_length].mean()
print(result)result df_iris.mean(axis0) # 默认axis0统计列的数据axis1是行
print(result)中位数
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])result df_iris.median() # 默认描述所有数值型字段也可以指定字段
print(result)分位数
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])ret df_iris.quantile(q0.75) # q参数用于指定分位位置0q1)
print(ret)方差、标准差
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])print(var: , df_iris[sepal_length].var())
print(std: , df_iris[sepal_length].std())2.2 seaborn
安装seaborn
pip install seaborn -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com下载数据文件 https://gitcode.net/mirrors/mwaskom/seaborn-data?utm_sourcecsdn_github_accelerator https://labfile.oss.aliyuncs.com/courses/2616/seaborn-data.zip
import seaborn as sns
df sns.load_dataset(flights)这样直接执行的话会报错。无法联网下载数据集。从国内镜像网站下载 seaborn 数据集到本地后解压。 从本地加载数据执行如下代码
import seaborn as snsdf sns.load_dataset(flights, data_homeC:/Users/tomcat/Desktop/seaborn-data-master)
print(df.head())绘制图形
import seaborn as snsdf sns.load_dataset(penguins, data_homeC:/Users/tomcat/Desktop/seaborn-data-master)
sns.pairplot(df, huespecies)
import matplotlib.pyplot as plt
plt.show()import seaborn as snssns.set(styleticks, color_codesTrue)
df_iris sns.load_dataset(iris, data_homeC:/Users/tomcat/Desktop/seaborn-data-master)
g sns.pairplot(df_iris)import matplotlib.pyplot as plt
plt.show()3、正态分布检验
通过样本数据来判断总体是否服从正态分布的检验称为正态性检验。正态分布是很多连续型数据比较分析的大前提比如t检验、方差分析、相关分析以及线性回归等均要求数据服从正态分布或近似正态分布。
在统计学中正态检验主要用于检验一个数据集是否服从正态分布。常用的t检验、方差分析等参数检验都有一个共同的前提条件样本数据必须服从正态分布即样本数据必须来源于一个正态分布的总体若样本数据不服从正态分布就不能用以上参数检验对数据进行分析而应该使用非参数检验如卡方检验、置换检验等。因此在对数据进行统计分析之前第一步就需要对数据进行正态性检验以检验该数据来自正态分布总体的概率有多大再选择对应的参数或非参数检验方法进行分析。
https://jse.amstat.org/v4n2/datasets.shoemaker.html
3.1 直方图判断
通过直方图初步判断样本数据是否符合正态分布。
# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris# 导入IRIS数据集
iris load_iris()
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])fig plt.figure(figsize (10,6))
ax2 fig.add_subplot(1,1,1)
iris_data.hist(bins50,ax ax2)
iris_data.plot(kind kde, secondary_yTrue,ax ax2)
plt.grid()
plt.show()3.2 KS检验scipy.stats.kstest Kolmogorov–Smirnov test (K-S test) 是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。以样本数据的累计频数分布与特定的理论分布比较比如正态分布如果两者之间差距小则推论样本分布取自某特定分布。 kstest 是一个很强大的检验模块除了正态性检验还能检验 scipy.stats 中的其他数据分布类型仅适用于连续分布的检验 原假设数据符合正态分布 方法scipy.stats.kstest (rvs, cdf, args ( ), N 20, alternative ‘two-sided’, mode ‘approx’) 参数rvs - 待检验数据可以是字符串、数组cdf - 需要设置的检验这里设置为 norm也就是正态性检验alternative - 设置单双尾检验默认为 two-sided 返回W - 统计数p-value - p值
# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats# 导入IRIS数据集
iris load_iris()
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])# data pd.read_table(rD:\normal_test\data.txt, encodingutf-8,names [Temperature])
# df pd.DataFrame(data, columns [Temperature])u iris_data[sepal_length].mean() # 计算均值
std iris_data[sepal_length].std() # 计算标准差
# 当p值大于0.05说明待检验的数据符合为正态分布
result stats.kstest(iris_data[sepal_length], norm, (u, std))
print(result)KstestResult(statistic0.08865361377316228, pvalue0.17813737848592026, statistic_location5.1, statistic_sign1)
从输出结果来看pvalue为0.17813737848592026大于0.05因此可以接受体温符合正态分布的假设。
3.3 Shapiro-Wilk testscipy.stats.shapiro
W检验
方法scipy.stats.shapiro(x)
参数x - 待检验数据
返回W - 统计数p-value - p值# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats# 导入IRIS数据集
iris load_iris()
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])res stats.shapiro(iris_data[sepal_length])
print(res)
res stats.shapiro(iris_data[sepal_width])
print(res)
res stats.shapiro(iris_data[petal_legth])
print(res)
res stats.shapiro(iris_data[petal_width])
print(res)3.4 Anderson-Darling testscipy.stats.anderson 该方法是由 scipy.stats.kstest 改进而来的可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 norm即正态性检验。 # pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats# 导入IRIS数据集
iris load_iris()
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])res stats.anderson(iris_data[sepal_length], distnorm)
print(res)
res stats.anderson(iris_data[sepal_width], distnorm)
print(res)
res stats.anderson(iris_data[petal_legth], distnorm)
print(res)
res stats.anderson(iris_data[petal_width], distnorm)
print(res)3.5 D’Agostino and Pearson’s test (scipy.stats.normaltest) 方法scipy.stats.normaltest (a, axis0) normaltest 也是专门做正态性检验的模块原理是基于数据的skewness和kurtosis scipy.stats.normaltest(a, axis0, nan_policy‘propagate’)
a待检验的数据
axis默认为0表示在0轴上检验即对数据的每一行做正态性检验我们可以设置为 axisNone 来对整个数据做检验
nan_policy当输入的数据中有空值时的处理办法。默认为 ‘propagate’返回空值设置为 ‘raise’ 时抛出错误设置为 ‘omit’ 时在计算中忽略空值。
# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats# 导入IRIS数据集
iris load_iris()
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])res stats.normaltest(iris_data[sepal_length])
print(res)
res stats.normaltest(iris_data[sepal_width])
print(res)
res stats.normaltest(iris_data[petal_legth])
print(res)
res stats.normaltest(iris_data[petal_width])
print(res)注p值大于显著性水平0.05认为样本数据符合正态分布
4、假设检验
Python 中的假设检验一般用到 scipy 或 statsmodels 包。
4.1 z 检验
对于大样本数据样本量 ≥ \geq≥ 30或者即使是小样本但是知道其服从正态分布并且知道总体分布的方差时需要用 z 检验。在 python 中由于 scipy 包没有 z 检验我们只能用 statsmodels 包中的 ztest 函数。
# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
# print(iris.data)
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])
print(iris_data[sepal_width])result sw.ztest(iris_data[sepal_width], value1)
print(1: , result)
result sw.ztest(iris_data[sepal_width], value2)
print(2: , result)
result sw.ztest(iris_data[sepal_width], value3)
print(3: , result)
result sw.ztest(iris_data[sepal_width], value4)
print(4: , result)
result sw.ztest(iris_data[sepal_width], value5)
print(5: , result)条件设为该样本的均值3时从 ztest 的运行结果可以看出统计量值为 1.6110148544749883而 p 值是 0.10717648482938881在置信度 α 0.05 时由于 p 值大于 α接受原假设认为该样本的均值是 3。
# 若要检测该样本均值是否大于 3即原假设 H0μ ≥ 3备选假设为μ 3则我们需要在代码中增加一个参数 alternativesmaller”
sw.ztest(arr, value3, alternativesmaller)# 检测两个样本的均值是否相等因为两个样本都是大样本使用 z 检验
sw.ztest(arr, arr2, value0)4.2 t 检验
小样本样本量小于30个一般用 t 检验。对于 t 检验可以根据样本特点用 scipy 包中的 ttest_1sample单样本 t检验函数ttest_ind两个独立样本的 t 检验ttest_rel 两个匹配样本的 t 检验。但这些函数得到都是双侧 t 检验的 p 值。如果是单侧检验我们还要进行一些换算得到单侧检验的 p 值。
# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
# print(iris.data)
iris_datapd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])
print(iris_data[sepal_width])result stats.ttest_1samp(iris_data[sepal_width], 1)
print(1: , result)
result stats.ttest_1samp(iris_data[sepal_width], 2)
print(2: , result)
result stats.ttest_1samp(iris_data[sepal_width], 3)
print(3: , result)
result stats.ttest_1samp(iris_data[sepal_width], 4)
print(4: , result)
result stats.ttest_1samp(iris_data[sepal_width], 5)
print(5: , result)从结果可以看出双侧检验的 p 值为 0.10929285667458065 大于置信度 0.05因此接受原假设认为样本的均值是3。若是单侧检验中的左侧检验则 p 值为 0.10929285667458065 / 2 0.054646428337290325若是右侧检验则 p 值为 1 − 0.10929285667458065 / 2 0.9453535716627097。
# 假设两个样本的方差不同则独立双样本的 t 检验
st.ttest_ind(a, b, equal_var False)# 若两个样本是匹配样本使用函数 ttest_rel
st.ttest_rel(a, b)# 结果显示p 值小于置信度 0.05拒绝原假设认为这两个匹配样本的均值不同。5、置信区间
误差不可避免在科学试验数据分析中通常会在测量结果上加一个误差范围。 置信区间一定的误差范围。如果想知道样本能在多大程度上代表总体其实这个问题的本质是用样本估计出总体它的误差范围是多少。如果我们没有办法知道总体平均值的真实数值我们需要给出一个误差范围来描述估计的准确程度。点估计和区间估计就是解决这个问题的。 置信水平置信区间包含总体平均值的概率是多大。如95%的置信水平表示在构造的置信区间内有95%的可能性会选到一个包含总体的平均值。 import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])# 用scipy计算出的是双尾检验
# 单1samp样本t检验ttest_1samphttps://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html
# 相关related样本t检验ttest_relhttps://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html
# 双独立independent样本t检验ttest_indhttps://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.htmlalpha0.05 #判断标准显著水平使用alpha5%
pop_mean3 #总体平均值
ttest_1samp单独样本t检验
返回的第1个值t是假设检验计算出的t值
第2个值p是双尾检验的p值t,p_two stats.ttest_1samp(df_iris[sepal_width],pop_mean)print(t值,t)
print(双尾检验的p值,p_two)#我们这里是左尾检验。根据对称性双尾的p值是对应单尾p值的2倍
#单尾检验的p值
p_onep_two/2
print(单尾检验的p值,p_one)
左尾判断条件t 0 and p_one 判断标准显著水平alpha
右尾判断条件t 0 and p_one 判断标准显著水平alpha#做出结论
if(t0 and p_one alpha): #左尾判断条件print(拒绝零假设有统计显著)
else: print(接受零假设没有统计显著)stats.t.interval
计算置信区间首先要有一组数组数据比如要计算模型准确度置信区间通过交叉验证得到模型准确度数组然后对数组使用以下函数 函数参数stats.t.interval(置信度自由度均值标准误) 置信度0.95或0.97之类的常用的置信度自己设置。 自由度数组的长度-1。 均值数据的均值。 标准误通过数据的标准差计算得到。 import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw# 导入IRIS数据集
iris load_iris()
df_irispd.DataFrame(iris.data,columns[sepal_length,sepal_width,petal_legth,petal_width])datadf_iris[sepal_width]ret stats.t.interval(confidence0.95, dflen(data) - 1, locnp.mean(data), scalestats.sem(data))
print(ret)结语
如果您觉得该方法或代码有一点点用处可以给作者点个赞或打赏杯咖啡╮(▽)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//就在评论处留言作者继续改进o_O??? 如果您需要相关功能的代码定制化开发可以留言私信作者(✿◡‿◡) 感谢各位大佬童鞋们的支持( ´ ▽´ ) ( ´ ▽´)っ