之前用stata 16的putexcel將結(jié)果批量導(dǎo)出到excel,考慮到python在自動(dòng)化辦公上有明顯優(yōu)勢(shì),因此,試著用python將結(jié)果批量導(dǎo)出excel。
stata結(jié)果導(dǎo)入excel-頻率分析
stata結(jié)果導(dǎo)入excel-交叉分析
stata結(jié)果導(dǎo)入excel-多重響應(yīng)
一、分析內(nèi)容
- 頻率分析;
- 交叉分析;
- 多重響應(yīng);
目標(biāo):只需要修改字段名,實(shí)現(xiàn)頻率分析、交叉分析和多重響應(yīng)結(jié)果批量導(dǎo)出excel。
二、具體代碼
1. 導(dǎo)入第三方庫(kù)
import pandas as pd
import numpy as np
2. 構(gòu)造頻率分析函數(shù)
#單變量頻率分析結(jié)果
def fre(df,c):
if type(df[c])=='str':
df[c]=df[c].apply(lambda x:x.strip()) #去除空格
fre=df.groupby(c)[c].count().sort_values(ascending=False).reset_index(name='頻數(shù)') #計(jì)數(shù),由高到低
fre=fre[-fre[c].isin([''])] #刪除空值
fre.loc['總計(jì)']=['總計(jì)',sum(fre['頻數(shù)'])] #算總數(shù)
fre['百分比']=fre['頻數(shù)'].apply(lambda x:x/fre.loc['總計(jì)','頻數(shù)']) #算百分比
fre['百分比']=fre['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
return fre
# 多個(gè)單變量頻率分析結(jié)果在1個(gè)sheet中
def fre_one_sheet(df,ls,sheetname):
start_row=0
for c in ls:
f=fre(df,c)
f.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
start_row=start_row+len(f['百分比'])+2
writer.save()
writer.close()
3. 構(gòu)造交叉分析函數(shù)
# 交叉分析結(jié)果
def cross(df,row,col,colorder=0):
cross_row=df[row]
cross_col=df[col]
total=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計(jì)') #生成交叉頻數(shù)表
per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計(jì)',normalize='index') #生成行百分比
# per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計(jì)',normalize='columns') #生成列百分比
if colorder:
total=total[colorder] #修改列的順序
per=per[colorder] #修改列的順序
per=per.applymap(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
summary=pd.merge(total,per,on=row)
print(summary)
return summary
#多個(gè)單變量+交叉分析結(jié)果在1個(gè)sheet中
def fre_cross_one_sheet(df,rowls,colls,sheetname,writer,colorder=0):
start_row=0
for c in colls:
f=fre(df,c)
f.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
start_row=start_row+len(f['百分比'])+2
for r in rowls:
crosstable=cross(df,r,c,colorder)
crosstable.to_excel(writer,index=1,sheet_name=sheetname,startrow=start_row)
start_row=start_row+crosstable.shape[0]+2
writer.save()
writer.close()
4. 構(gòu)造多重響應(yīng)函數(shù)
# 計(jì)數(shù)
def col_count(df,colname):
dic={}
for d in df[colname]:
dic[d]=dic.get(d,0)+1
print(dic)
return dic
# 多重響應(yīng)
def multi(df,mulls,selecttag):
muldic={}
for m in mulls:
muldic[m]=col_count(df,m)[selecttag]
data={}
data['選項(xiàng)']=list(muldic.keys())
data['頻數(shù)']=list(muldic.values())
mul=pd.DataFrame(data) #得到頻數(shù)
mul['百分比']=mul['頻數(shù)'].apply(lambda x:x/sum(mul['頻數(shù)'])) #算百分比
mul['百分比']=mul['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
mul=mul.sort_values('頻數(shù)',ascending=False) #降序排序
print(mul)
return mul
# 多個(gè)多重響應(yīng)在1個(gè)sheet
def multi_one_sheet(df,varls,sheetname,selecttag,writer):
start_row=0
for v in varls:
mulresp=multi(df,v,selecttag)
mulresp.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row)
start_row=start_row+mulresp.shape[0]+2
writer.save()
writer.close()
5. 主函數(shù)并調(diào)用
其中,自變量為11個(gè):因變量為:13個(gè);多選題:3道
def main():
df=pd.read_excel('data.xlsx') # 數(shù)據(jù)源
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
order=['非常不符合','比較不符合','一般','比較符合','非常符合'] #交叉列的排序
rowls=colnamels[140:151] #自變量
colls=colnamels[11:24] #因變量
varls=[colnamels[87:98],colnamels[100:114],colnamels[129:134]] #多選題def main():
df=pd.read_excel('data.xlsx') # 數(shù)據(jù)源
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
order=['非常不符合','比較不符合','一般','比較符合','非常符合'] #交叉列的排序
rowls=colnamels[140:151] #自變量
colls=colnamels[11:24] #因變量
varls=[colnamels[87:98],colnamels[100:114],colnamels[129:134]] #多選題
fre_one_sheet(df,rowls,sheetname='頻率分析',writer=writer)
fre_cross_one_sheet(df,rowls,colls,sheetname='交叉分析',colorder=order,writer=writer)
multi_one_sheet(df=df,varls=varls,selecttag='勾選',sheetname='多重響應(yīng)',writer=writer)
main()
三、效果
將上述代碼結(jié)合后,大約花費(fèi)16s的時(shí)間將上述分析結(jié)果導(dǎo)出excel。
1. 頻率分析

頻率分析.gif
2. 交叉分析

交叉分析.gif
3. 多重響應(yīng)

多重響應(yīng).png
python結(jié)果批量導(dǎo)出excel(一):頻率分析、交叉分析和多重響應(yīng)
python結(jié)果批量導(dǎo)出excel(二):卡方檢驗(yàn),描述統(tǒng)計(jì)
python結(jié)果批量導(dǎo)出excel(三):組間差異比較(F檢驗(yàn)、T檢驗(yàn)和事后比較)