“ 自从在官网学scipy,我又重新去看了pandas官网,有些知识点很多还蛮重要,我后期打算再把需要的学学。我突然想到excl,尽管我号称精通,但事实我会的也是常用的函数和透视,但已经秒杀70%的人了(哈哈,乱说的)不过肯定基本能覆盖我的工作内容了,excl其实很强大的,常用的也不过其中3或4,同理Python库如此之多,每个库的功能都挺繁杂,或许我们应该选择能覆盖工作的某些功能即可,全学会固然很好,毕竟精力和记忆还有练习时间有限,掌握基本通用即可,其它如果需要用到再升级。”


01
—
统计检验
1、夏皮罗维尔克检验法 (Shapiro-Wilk)小样本正态性检验
scipy.stats.shapiro(x)
x样本数据数组
return:statistic检验统计量 pvalueP值
x=stats.norm.rvs(size=20)xOut[5]:array([ 0.60092388, -0.35671157, 0.29553121, -0.1350738 , 0.80450288,-0.34456702, -0.35974578, 0.22295746, -0.03304878, 1.41436338,-1.79731486, -0.26340209, 0.70876276, -0.88942301, -0.64495342,-0.3082458 , 2.02883298, -0.05070303, 0.68227095, -0.75282314])stats.shapiro(x)Out[6]: ShapiroResult(statistic=0.9680454134941101, pvalue=0.7131816744804382)
2、科尔莫戈罗夫检验(Kolmogorov-Smirnov test)检验样本数据是否服从某一分布kstest,仅适用于连续分布的检验
scipy.stats.kstest(rvs, cdf, args=(), N=20, alternative='two_sided', mode='approx', **kwds)
rvs是待检验的一组一维数据;
cdf是给定的分布,例如'norm','expon','rayleigh','gamma';
args=()是分布的参数
N :如果rvs是字符串或调用的,N表示样本大小
alternative='two_sided' :H0 : G(x)=F(x) H1 : G(x)≠F(x),'less' :H0 : G(x)=F(x) H1 : G(x)≤F(x),'greater' :H0 : G(x)=F(x) H1 : G(x)≥F(x)
mode : 定义用于计算 p 值的分布。以下选项可用(默认为“auto”):'auto' :选择其他选项之一。'exact' :使用测试统计量的精确分布。'approx' : 以单边概率的两倍近似双边概率。'asymp':使用检验统计量的渐近分布
return:ks统计量和p值,如果p值大于显著性水平(比如5%),接受原假设H0,可以认为样本数据来自给定分布F(x)
x=stats.norm.rvs(size=100)stats.kstest(x,'norm')Out[8]: KstestResult(statistic=0.1190221486130757, pvalue=0.10833782801369352)
3、方差齐性检验levene,检验两组或多组数据与其均值偏离程度是否存在差异
levene(*args, center='median', proportiontocut=0.05)
center:'mean'推荐用于对称、中尾分布, 'median'默认推荐用于偏态(非正态)分布, 'trimmed'推荐用于重尾分布。
return:统计量和p值, p 值<0.05,表明总体方差不相等。
scipy.stats.levene(*args, center='median', proportiontocut=0.05)
a = [8.88, 9.12, 9.04, 8.98, 9.00, 9.08, 9.01, 8.85, 9.06, 8.99]b = [8.88, 8.95, 9.29, 9.44, 9.15, 9.58, 8.36, 9.18, 8.67, 9.05]c = [8.95, 9.12, 8.95, 8.85, 9.03, 8.84, 9.07, 8.98, 8.86, 8.98]stats.levene(a,b,c)Out[9]: LeveneResult(statistic=7.584952754501659, pvalue=0.002431505967249681)
4、单样本t检验ttest_1samp,用于检验数据是否来自一致均值的总体,T检验主要是以均值为核心的检验。注意以下几种T检验都是双侧T检验。scipy.stats.ttest_1samp(a, popmean, axis=0, nan_policy='propagate', alternative='two-sided')
popmean:float 或 array_like,原假设中的期望值。如果是array_like,则它必须与不包括轴维度的a具有相同的形状.
【这里是难点,费脑子!!和我们之前学的N维计算同理,顺便复习下好了,
1、单个期望值(浮点数),会根据轴计算0列,1行,None数组。2、同size期望一维数组,轴0时,第一列-数组1值,第二列-数组2值…,轴1时,a.T,第一行-数组1值,第二行=数组2值…,轴None时,数组a-期望数组1值和2值,3、二维数组,轴0时,第一列-数组1值和2值,第二列-数组1值和2值…,其它轴同理】
axis:默认0每列,1每行,None整个数组。
alternative:‘two-sided’默认,‘less’: one-sided,‘greater’: one-sided
return:统计量与两侧P值,P<0.05,差异显著,拒绝原假设,也就是不服从正态分布(栗子用了norm)
#均值=3时,不拒绝原假设,均值=0时,拒绝原假设x=stats.norm.rvs(loc=3,size=(50,2))stats.ttest_1samp(x,3.0)Out[17]: Ttest_1sampResult(statistic=array([-1.48234972, -0.56090362]), pvalue=array([0.14465051, 0.57741933]))stats.ttest_1samp(x,0.0)Out[18]: Ttest_1sampResult(statistic=array([19.63811218, 21.58884159]), pvalue=array([7.15767389e-25, 1.10753243e-26]))#1、单个期望值(浮点数),会根据轴计算0列,1行,None数组。x=stats.norm.rvs(loc=3,size=(25,2))stats.ttest_1samp(x,3.0)Out[36]: Ttest_1sampResult(statistic=array([-1.96960446, -0.95643968]), pvalue=array([0.06053063, 0.348386 ]))x=stats.norm.rvs(loc=3,size=(25,2))stats.ttest_1samp(x,3.0,axis=1)Out[37]:Ttest_1sampResult(statistic=array([ 6.02606640e-01, -1.15913613e+01, -3.54490104e-01, -4.89869139e-01,-3.06433042e+00, -1.45865469e-01, -1.04664872e-01, -4.45193019e-01,2.53372388e+00, -1.25947392e+02, -3.04189656e+00, -2.17940019e-01,4.10893522e+00, -2.21756737e+02, 1.20959434e+00, 2.41548204e+00,-1.34927759e-01, -8.10160137e-01, 7.40057951e-01, -4.52610570e-01,-8.08344426e-01, -3.34823315e+01, -3.29664273e+00, 9.32058376e+00,-1.81318881e-01]), pvalue=array([0.65473949, 0.05478627, 0.78312319, 0.71001325, 0.20081496,0.90778947, 0.93361 , 0.73335228, 0.23931066, 0.00505454,0.20219867, 0.86339122, 0.15198083, 0.00287078, 0.43979264,0.24988179, 0.91461797, 0.56652208, 0.59440459, 0.72942211,0.56722057, 0.01900795, 0.18749547, 0.06804228, 0.88580943]))x=stats.norm.rvs(loc=3,size=(25,2))stats.ttest_1samp(x,3.0,axis=None)Out[38]: Ttest_1sampResult(statistic=1.6049361040252983, pvalue=0.11493450330550206)#2、同size期望一维数组,轴0时,第一列-数组1值,第二列-数组2值…,轴1时,a.T,第一行-数组1值,第二行=数组2值…,轴None时,数组a-期望数组1值和2值stats.ttest_1samp(x.T,[3.0,0.0],axis=1)Out[51]: Ttest_1sampResult(statistic=array([ 0.41962514, 17.06609848]), pvalue=array([6.78491881e-01, 6.33556143e-15]))stats.ttest_1samp(x,[3.0,0.0],axis=None)Out[52]: Ttest_1sampResult(statistic=array([ 0.79626549, 24.10473043]), pvalue=array([4.29718775e-01, 7.88515806e-29]))np.random.seed(10)x=stats.norm.rvs(loc=3,size=(25,2))stats.ttest_1samp(x,[3.0,0.0])Out[53]: Ttest_1sampResult(statistic=array([ 0.41962514, 17.06609848]), pvalue=array([6.78491881e-01, 6.33556143e-15]))#3、二维数组,轴0时,第一列-数组1值和2值,第二列-数组1值和2值…,其它轴同理np.random.seed(10)x=stats.norm.rvs(loc=3,size=(25,2))stats.ttest_1samp(x,[[3.0],[0.0]])Out[55]:Ttest_1sampResult(statistic=array([[ 0.41962514, 0.69621341],[16.68794122, 17.06609848]]), pvalue=array([[6.78491881e-01, 4.92983194e-01],[1.04203353e-14, 6.33556143e-15]]))
5、独立样本t检验ttest_ind,比较两组数据是否来自于同一正态分布的总体
scipy.stats.ttest_ind(a, b, axis=0, equal_var=True, nan_policy='propagate', permutations=None, random_state=None, alternative='two-sided', trim=0)
equal_var:方差齐性True,False该检验不假定总体方差相等
return:统计量与两侧P值,P<0.05,差异显著,拒绝原假设
np.random.seed(10)a=stats.norm.rvs(loc=3,scale=10,size=25)b=stats.norm.rvs(loc=3,scale=10,size=25)stats.ttest_ind(a,b)Out[56]: Ttest_indResult(statistic=-0.04126042724127445, pvalue=0.967259431321202)np.random.seed(10)a=stats.norm.rvs(loc=3,scale=10,size=25)b=stats.norm.rvs(loc=3,scale=10,size=25)stats.ttest_ind(a,b,equal_var=False)Out[57]: Ttest_indResult(statistic=-0.04126042724127445, pvalue=0.9672839217241189)np.random.seed(10)a=stats.norm.rvs(loc=3,scale=10,size=25)b=stats.norm.rvs(loc=3,scale=20,size=25)stats.ttest_ind(a,b,equal_var=False)Out[58]: Ttest_indResult(statistic=-0.3280542001710502, pvalue=0.7444139033282802)
6、配对样本t检验ttest_rel
scipy.stats.ttest_rel(a, b, axis=0, nan_policy='propagate', alternative='two-sided')
数组必须具有相同的形状
return:统计量与两侧P值,P<0.05,差异显著,拒绝均值相等的原假设
np.random.seed(10)a=stats.norm.rvs(loc=3,scale=10,size=25)b=stats.norm.rvs(loc=3.1,scale=10,size=25)stats.ttest_rel(a,b)Out[59]: Ttest_relResult(statistic=-0.092096422105424, pvalue=0.9273858664551353)
7、检验样本是否不同于正态分布normaltest
scipy.stats.normaltest(a, axis=0, nan_policy='propagate')
np.random.seed(10)a=stats.norm.rvs(loc=1,scale=10,size=100)stats.normaltest(a)Out[60]: NormaltestResult(statistic=0.343083607335683, pvalue=0.8423650533350869)
8、单因素拟合度卡方检验chisquare,卡方检验检验分类数据具有给定频率的原假
scipy.stats.chisquare(f_obs, f_exp=None, ddof=0, axis=0)
f_obs:在每个类别中观察到的频率
f_exp :每个类别中的预期频率。默认情况下,假设类别的可能性相等,并由观察频率的平均值给出
ddof:“Delta 自由度”:调整 p 值的自由度。p 值是使用具有自由度的卡方分布计算的,其中k 是观察到的频率数。ddof的默认值为 0。k - 1 - ddof
建议样本总数大于 13,否则应使用精确检验(如 Barnard's Exact 检验)因为他们不会过度拒绝。
此外,观察频率和预期频率的总和必须相同才能使测试有效
stats.chisquare([3,3,3,3,5])Out[61]: Power_divergenceResult(statistic=0.9411764705882354, pvalue=0.9185804823533448)
9、秩和检验法 U检验(曼惠特尼)mannwhitneyu,零假设的非参数检验,即样本x的基础分布与样本y的分布相同。它通常用作分布之间位置差异的测试
scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative='two-sided', axis=0, method='auto')
use_continuity:是否应应用连续性校正 (1/2)。默认值为True时方法是'asymptotic'; 否则没有任何影响。
females = [20, 11, 17, 12]males = [19, 22, 16, 29, 24]stats.mannwhitneyu(males,females)Out[64]: MannwhitneyuResult(statistic=3.0, pvalue=0.055673443266570206)
10、威尔克松符号秩和或等级检验法wilcoxon,Wilcoxon 符号秩检验检验两个相关配对样本来自同一分布的原假设。特别是,它测试差值 x - y 的分布是否关于零对称。它是配对 T 检验的非参数版本
scipy.stats.wilcoxon(x, y=None, zero_method='wilcox', correction=False, alternative='two-sided', mode='auto')
x:要么是第一组测量值(在这种情况下y是第二组测量值),要么是两组测量值之间的差异(在这种情况下y不指定)。必须是一维的。
y:要么是第二组测量值(如果x是第一组测量值),要么未指定(如果x是两组测量值之间的差异)。必须是一维的。
zero_method:以下选项可用(默认为“wilcox”):“pratt”:在排名过程中包括零差,但会降低零的排名,参见[4],(更保守)。“wilcox”:丢弃所有零差异,默认值。“zsplit”:在排名过程中包含零差,并将零排名在正负之间进行拆分。
#两组样本的差值d = [6, 8, 14, 16, 23, 24, 28, 29, 41, -48, 49, 56, 60, -67, 75]stats.wilcoxon(d)Out[67]: WilcoxonResult(statistic=24.0, pvalue=0.041259765625)
11、克-瓦式H检验法kruskal,Kruskal-Wallis H 检验检验所有组的总体中位数相等的原假设。它是 ANOVA 的非参数版本。该测试适用于 2 个或更多独立样本,这些样本可能具有不同的大小。请注意,拒绝零假设并不表示哪个组不同。需要在组之间进行事后比较以确定哪些组不同。
scipy.stats.kruskal(*args, nan_policy='propagate')
样本必须是一维的
由于假设H具有卡方分布,每组的样本数一定不能太少。一个典型的规则是每个样本必须至少有 5 次测量。
a=[1,3,5,7,9]b=[2,4,6,8,10]stats.kruskal(a,b)Out[69]: KruskalResult(statistic=0.2727272727272734, pvalue=0.6015081344405895)
12、费里德曼等级方差分析friedmanchisquare,弗里德曼检验检验相同个体的重复测量具有相同分布的原假设。它通常用于测试以不同方式获得的测量值之间的一致性。例如,如果对同一组个体使用两种测量技术,则可以使用弗里德曼检验来确定这两种测量技术是否一致。
scipy.stats.friedmanchisquare(*args)
所有数组必须具有相同数量的元素。必须至少给出 3 组测量值
p 值仅对于 n > 10 和超过 6 次重复测量是可靠的
13、二项式检验执行成功概率为 p 的测试binomtest
scipy.stats.binom_test(k, n, p=0.5, alternative='two-sided')
k:成功次数
n:试验次数
p:成功的假设概率,即成功的预期比例。该值必须在区间内 。默认值为:0 <= p <= 1p = 0.5
return:P值
以下我的代码出不来,建议大家自行测试
croportion_estimate成功比例的估计
proportion_ci(confidence_level=0.95, method=’exact’) 计算置信区间
A=stats.binom_test(3,n=15,p=0.1)AOut[79]: 0.18406106910639114





