python常用的检验方法

一:Z检验

#数据: price_earnings_ratio 利率
import pandas as pd
import numpy as np
import statsmodels.stats.weightstats as sw

z_mean = data['price_earnings_ratio'].fillna(0).mean() 
print('均值:',z_mean)
z_std = data['price_earnings_ratio'].fillna(0).std()
print('标准差:',z_std)

# H0 : 基金费率均值=16
# H1 : 基金费率均值!=16
# α = 0.05

z_result = sw.ztest(data['price_earnings_ratio'].fillna(0),value=15,alternative='two-sided')

if z_result[1]>= 0.05:
    print(z_result[1],'接受H0')
else:
    print(z_result[1],'接受H1')

二:t 检验

#数据: price_book_ratio 账面利率  
# 配对样本t检验
import pandas as pd
import numpy as np
import scipy.stats as st

data2 = data['price_book_ratio'].dropna()
data3 = data['price_book_ratio'].dropna()*(np.random.rand())

#单样本t检验
st.ttest_1samp(data2, 2.45) # Ttest_1sampResult(statistic=0.12596854892827364, pvalue=0.8997743929641389)

#配对样本t检验
st.ttest_rel(data2, data3) # Ttest_relResult(statistic=52.36003973539448, pvalue=0.0)

#独立样本t检验
#1.方差一致
st.ttest_ind(data2, data3, equal_var = True) # Ttest_indResult(statistic=35.35777469093179, pvalue=8.654411469975374e-228)

#2.方差不一致
st.ttest_ind(data2, data3, equal_var =False) # Ttest_indResult(statistic=14.976225089014182, pvalue=1.2857174411427583e-48)

三:F检验

简要流程是,先用pandas库的DataFrame数据结构来构造输入数据格式。
然后用statsmodels库中的ols函数得到最小二乘线性回归模型。
最后用statsmodels库中的anova_lm函数进行方差分析。
数据前提: 需要独立的数据 / 方差齐性检验

3.1 方差齐性检验


#方差齐性检验
from scipy.stats import levene
 
x = [-4,-3,-2,-1,0,1,2,3,4]
y = [-10,-5,-2,-3,0,3,2,5,10]
f_val, p = levene(x, y)
print(f_val)
print(p)

3.2 F检验

import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

data5 = data[['investment_type','size_type','price_earnings_ratio']].dropna() # 投资类型 , 投资规模 , 利率
data5.rename(columns={'investment_type':'A','size_type':'B','price_earnings_ratio':'value'},inplace=True )
# 因素A的水平对结果的影响 'value ~ C(A)'
# 因素A和因素B的水平对结果的影响 'value ~ C(A) + C(B)'
# 因素A和因素B以及A和B的交互作用的水平对结果的影响 'value ~ C(A) + C(B) + C(A)*C(B)'
# 多因素无重复试验,不计算交互作用的影响
model = ols('value~C(A) + C(B) +  C(A)*C(B)', data=data5[['A', 'B', 'value']]).fit()
anovat = anova_lm(model)
print(anovat)
# Residual表示误差,df表示自由度,sum_sq表示离差平方和,mean_sq表示均方离差,F表示F值,PR(>F)表示F值所对应的显著水平α

四:卡方检验

使用案例:
单样本:拟合优度检验,即判断分类变量的水平是否符合随机或者指定概率
两个独立样本: 交叉表列联表,即判断两个分类变量之间的相关性
两组配对样本: 配对卡方

4.1 单样本

import pandas as pd 
import numpy as np 
from scipy import stats


#1.单样本
#矩阵数据集
# H0:变量出现的概率一样
#数据准备
data_test1 = pd.DataFrame(
    data={'实际频率':[15,20,11,35,22],'期望频率':[20,20,20,20,20]},
    index=list('ABCDE')
)
print(data_test1)
#计算卡方值
data_test1['差值'] = (data_test1['实际频率']-data_test1['期望频率'])
print(data_test1)
data_test1['差值的平方'] = data_test1['差值']**2
print(data_test1)
kf_value = (data_test1['差值的平方']/data_test1['期望频率']).sum()
print(kf_value)

#方法一,直接使用两列数据,不需要手动计算卡方值
stats.chisquare(f_obs=data_test1['实际频率'], #Array of obversed counts
                f_exp=data_test1['期望频率']) #Array of expected counts 
#结果: Power_divergenceResult(statistic=16.75, pvalue=0.0021614987586791395)

#方法二
crit = stats.chi2.ppf(q=0.95,df=4)  #95置信水平 df = 自由度
print(crit) #临界值,拒绝域的边界 当卡方值大于临界值,则原假设不成立,备择假设成立
P_value = 1-stats.chi2.cdf(x=kf_value,df=4)
print('P_value')
print(P_value)  
#结果: 0.0021614987586791035

4.2 交叉列联表

#2.交叉列联表
# 用于两个分类变量的相关性分析
#H0:性别和专业没有显著性相关
import pandas as pd 
import numpy as np 
from scipy import stats

data_test2 = pd.DataFrame(
    data={'性别':['男','女'],'java':[56,32],'python':[50,42],'php':[55,20]}
)
print(data_test2)
d = data_test2[['java','python','php']]
stats.chi2_contingency(d)

#第一个值为卡方值,第二个值为P值,第三个值为自由度,第四个为与原数据数组同维度的对应理论值
# 结果:
#3.8010055722224365,
#0.14949343710006313, 这个是p值,说明性别和专业没有相关性
#2,
#array([[54.23673469, 56.70204082, 40.06122449],
#       [33.76326531, 35.29795918, 24.93877551]]))

你可能感兴趣的:(统计学,检验方法)