python结果批量导出excel(三)

之前用stata 16的putexcel将结果批量导出到excel,考虑到python在自动化办公上有明显优势,因此,试着用python将结果批量导出excel。

stata结果导入excel-方差分析

python结果批量导出excel(一):介绍了频率分析、交叉分析和多重响应结果批量导出excel;

python结果批量导出excel(二):介绍了卡方检验,描述统计结果批量导出excel;

本篇介绍组间差异比较(F检验、T检验和事后比较)结果批量导出excel。

一、分析内容

  1. F检验;
  2. T检验;
  3. 事后比较;

目标:只需要修改字段名,实现组间差异比较(F检验、T检验和事后比较)结果批量导出excel。

二、具体代码

1. 导入第三方库及修改

import pandas as pd
import numpy as np
import scipy.stats as stats
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
from statsmodels.stats.multicomp import pairwise_tukeyhsd
from  scipy.stats import ttest_ind, levene

# 修改值,文本转数值
def replace(df,colls):
    dfreplace=df[colls]
    dfreplace.replace('非常不符合',1 , inplace = True)
    dfreplace.replace('比较不符合',2 , inplace = True)
    dfreplace.replace('一般',3 , inplace = True)
    dfreplace.replace('比较符合',4 , inplace = True)
    dfreplace.replace('非常符合',5 , inplace = True)
    return dfreplace

2. 构造分组多个因变量均值结果函数

# 分组多个因变量的均值
def groupby_mean(df,row,colls):
    des=df.groupby(row).mean()[colls].reset_index()
    des[colls]=des[colls].applymap(lambda x:format(x,'.2f'))#结果保留2位小数
    # des=pd.DataFrame(des.values.T,index=des.columns,columns=des.index)
    return des

3. 构造方差检验函数

通过构造方差检验函数,返回结果F = ,p =,当然,结果呈现形式,可以根据需求自行构造。

#方差分析结果(F值,显著性),若想知道返回值,可以print(dir(model))
def anova_para(df,row,col):
    model=ols('df[col]~C(df[row])',data=df).fit()
    F=model.fvalue
    p=model.f_pvalue
    Fresult='F = '+format(F,'.2f')+' p = '+format(p,'.3f')
    return F,p,Fresult

4. 构造独立样本T检验函数

通过构造方差检验函数,返回结果t = ,p =,若方差不齐性,返回调整后的t值。结果呈现形式,可以根据需求自行构造。

# T检验结果(T值,显著性)
def T_indtest(df,row,col):
    groups=list(set(df[row]))
    x=df[df[row]==groups[0]][col].dropna()
    y=df[df[row]==groups[1]][col].dropna()
    lev_s,lev_p=levene(x,y)
    if lev_p>=0.05: #方差齐性
        T_s,T_p=ttest_ind(x, y,nan_policy='omit')
        Tresult='t = '+format(T_s,'.2f')+' p = '+format(T_p,'.3f')
    elif lev_p<0.05:#方差不齐性
        T_s,T_p=ttest_ind(x, y,nan_policy='omit',equal_var = False)
        Tresult='t = '+format(T_s,'.2f')+' p = '+format(T_p,'.3f')
    else:
        T_s,T_p,Tresult='NULL','Null','levene检验有误'
    return T_s,T_p,Tresult

5. 构造组间差异结果导出函数

将分组均值及相应检验结果导出,若组别大于2,导出F检验结果,若组别为2,导出T检验结果。

# 组间差异(F检验或T检验)在一个sheet
def anova_one_sheet(df,rowls,colls,sheetname,writer):
    start_row=0
    for r in rowls:
        gmean=groupby_mean(df,r,colls)
        gmean_colname=list(gmean.columns.values)
        if len(set(df[r]))>2:
            result_ls=['F检验']
            for c in colls:
                s,p,result=anova_para(df,r,c)
                result_ls.append(result)
        elif len(set(df[r]))==2:
            result_ls=['T检验']
            for c in colls:
                s,p,result=T_indtest(df,r,c)
                result_ls.append(result)
        Fresult=pd.DataFrame(result_ls)#结果转df
        Fresult=pd.DataFrame(Fresult.values.T)#转置
        Fresult.columns=gmean_colname #相同列名
        F_with_mean=pd.concat([gmean,Fresult],axis=0)
        F_with_mean=pd.DataFrame(F_with_mean.values.T,index=F_with_mean.columns,columns=F_with_mean.index) #转置
        F_with_mean.to_excel(writer,index=True, header = False,sheet_name=sheetname,startrow=start_row)
        start_row=start_row+F_with_mean.shape[0]+2
    writer.save()
    writer.close()

6. 构造事后检验函数

# 事后检验
def post_check(df,row,col):
    df=df.dropna()
    m_comp=pairwise_tukeyhsd(endog=df[col], groups=df[row], alpha=0.05)
    return m_comp

7. 构造事后检验导出函数

当F检验结果显著(p<0.05)时,将每个因变量的两两比较结果导出相应的sheet,sheetname为“两两比较_因变量字段前5个字符”

# 方差检验结果显著,将每个因变量的两两比较结果导出excel(因变量名字太长,截取5个字符作为sheetname)
def post_check_in_sheets(df,rowls,colls,writer):
    for r in rowls:
        if len(set(df[r]))>2:
            for c in colls:
                s,p,result=anova_para(df,r,c)
                if p<0.05:# 当F检验显著,导出两两比较至相应sheet
                    post_comp=post_check(df,r,c)
                    post_comp=pd.DataFrame(data=post_comp._results_table.data[1:], columns=post_comp._results_table.data[0])
                    post_comp.to_excel(writer,index=0,sheet_name='两两比较_'+c[:5])
                    writer.save()
                    writer.close()
        else:
            continue

8. 主函数并调用

其中,自变量为11个:因变量为:13个

def main():
    df=pd.read_excel('data.xlsx') # 数据源
    colnamels=list(df.columns.values) #打印出字段的索引和列名,方便检索
    # for i,c in enumerate(colnamels): 
    #     print(i,c)
        
    file_dir='result.xlsx' #输入excel文件
    writer=pd.ExcelWriter(file_dir) #用于追写excel
    
    dfreplace=replace(df,colls)#修改值,文本转数字
    newdf=pd.concat([df[colnamels[140:151]],dfreplace],axis=1) #多列拼接,形成新的df
    newdf_col_name=list(newdf.columns.values)
    newdf_rowls=newdf_col_name[0:11]
    newdf_colls=newdf_col_name[12:]
    anova_one_sheet(newdf,newdf_rowls,newdf_colls,sheetname='组间差异',writer=writer)
    post_check_in_sheets(newdf,newdf_rowls,newdf_colls,writer=writer)

main()
    

三、效果

将上述代码结合后,大约花费13s的时间将上述分析结果导出excel。

1. 组间差异

将分组均值、F检验、T检验结果导出

组间差异.gif

2. 事后两两比较

将每个因变量在不同组的F检验显著的两两比较结果导出相应sheet

事后两两比较.gif

python结果批量导出excel(一):频率分析、交叉分析和多重响应

python结果批量导出excel(二):卡方检验,描述统计

python结果批量导出excel(三):组间差异比较(F检验、T检验和事后比较)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容