python从入门到入土教程(7)——用python实现SPSS
2020-01-16 本文已影响0人
孙小灰灰
话不多说 开干~
一、单样本T检验
## 先把数据搞一搞
import pandas as pd
##首先是原始数据和检验的值
data = pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])
mean = 20
#这里短短的两行代码,就是一个T检验了
#是不是很简单呢
from scipy import stats
t,p = stats.ttest_1samp(data,mean)
def ptest(x):
if x < 0.05:
if mean > data.mean():
a = "20显著性高于原数据"
else:
a = "20显著性低于原数据"
else:
a = "统计没有显著性差异"
return a
ptest(p)
二、独立样本T检验
group data
1 34
1 37
1 28
1 36
1 30
2 43
2 45
2 47
2 49
2 39
# 首先依旧是原始数据
#数据如上
dat = pd.read_excel("/home/kesci/input/demo3784/demo.xlsx")
#看一下数据长啥样
dat
##这里只是用这个数据集做一个demo
#所以数据很少
##导入T检验
from scipy.stats import ttest_ind
## 把数据分成两组
group1 = dat[dat.group == 1]["data"]
group2 = dat[dat.group == 2]["data"]
tt,pp = ttest_ind(group1, group2)
def ptesttwo(x):
if x < 0.05:
if group1.mean() > group2.mean():
a = "G1显著性高于G2"
else:
a = "G2显著性高于G1"
else:
a = "G1和G2没有显著性差异"
return a
ptesttwo(pp)
三、相关样本T检验
现在 假装这个样本是不独立的 是相关的
##导入T检验
from scipy.stats import ttest_rel
## 把数据分成两组
group1 = dat[dat.group == 1]["data"]
group2 = dat[dat.group == 2]["data"]
ttt,ppp = ttest_rel(group1, group2)
def ptestthree(x):
if x < 0.05:
if group1.mean() > group2.mean():
a = "G1显著性高于G2"
else:
a = "G2显著性高于G1"
else:
a = "G1和G2没有显著性差异"
return a
ptestthree(ppp)
四、单因素方差分析
##还是用那个数据吧
#首先对数据进行一个方差齐性检验,判断方差是否齐性
w,p = stats.levene(group1, group2)
if p < 0.05:
print("方差不齐")
else:
print("方差齐性")
f,p = stats.f_oneway(group1, group2)
if p < 0.05:
print("有显著性差异")
else:
print("没有显著性差异")
五、多因素方差分析
变量1 变量2 结果
a1 b1 20
a1 b2 22
a1 b3 24
a1 b4 16
a1 b5 26
数据如上
anova = pd.read_excel(r"/home/kesci/work/anova.xlsx")
anova.head()
##导入所需要的模块
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
#对变量1和变量2进行方差分析
formula = '结果~ 变量1 + 变量2 '
anova_results = anova_lm(ols(formula,anova).fit())
print(anova_results)
#变量1有显著性差异
#变量1有五个维度,哪两个之间才是有显著性差异的呢
#用这个包来试一试
from statsmodels.stats.multicomp import pairwise_tukeyhsd
print(pairwise_tukeyhsd(anova['结果'], anova['变量1']))
六、数据的标准化
当数据的范围跨度比较大的时候,用标准化的方法把数据映射到一个正态分布(0,1)上,即均值为0,方差为1的一个正太分布上。
这样更加方便后期的计算以及判断不同数据之间的关系。
from sklearn.preprocessing import StandardScaler
# reshape(-1,1) 将anova["结果"]变成只有一列,行数不限定的np.array
#这样接下来才能做一个正态分布的映射
anova["结果"] = StandardScaler().fit_transform(anova["结果"].values.reshape(-1,1))