之前用stata 16的putexcel
將結(jié)果批量導出到excel畅卓,考慮到python在自動化辦公上有明顯優(yōu)勢,因此蟋恬,試著用python將結(jié)果批量導出excel翁潘。
stata結(jié)果導入excel-描述統(tǒng)計
python結(jié)果批量導出excel(一)介紹了頻率分析、交叉分析和多重響應結(jié)果批量導出excel歼争。
本篇介紹卡方檢驗拜马,描述統(tǒng)計結(jié)果批量導出excel。
一沐绒、分析內(nèi)容
- 卡方檢驗俩莽;
- 描述統(tǒng)計結(jié)果;
目標:只需要修改字段名乔遮,實現(xiàn)卡方檢驗扮超,描述統(tǒng)計結(jié)果批量導出excel。
二蹋肮、具體代碼
1. 導入第三方庫
import pandas as pd
import numpy as np
import scipy.stats as stats
2. 構造頻率分析和交叉分析函數(shù)
此處頻率分析函數(shù)和交叉分析函數(shù)構造和python結(jié)果批量導出excel(一)相同出刷。
#單變量頻率分析結(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ù)') #計數(shù),由高到低
fre=fre[-fre[c].isin([''])] #刪除空值
fre.loc['總計']=['總計',sum(fre['頻數(shù)'])] #算總數(shù)
fre['百分比']=fre['頻數(shù)'].apply(lambda x:x/fre.loc['總計','頻數(shù)']) #算百分比
fre['百分比']=fre['百分比'].apply(lambda x:format(x,'.2%')) #百分比以%形式呈現(xiàn)
print(fre)
return fre
# 交叉分析結(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='合計') #生成交叉頻數(shù)表
per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計',normalize='index') #生成行百分比
# per=pd.crosstab(cross_row,cross_col,margins=True,margins_name='合計',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
3.構造卡方檢驗函數(shù)
通過構造卡方檢驗函數(shù)坯辩,返回結(jié)果X2= 馁龟,p=
,當然漆魔,結(jié)果呈現(xiàn)形式坷檩,可以根據(jù)需求自行構造却音。
# 卡方檢驗
def chi2sqaure_test(df,row,col):
cross_row=df[row]
cross_col=df[col]
crosstable=pd.crosstab(cross_row,cross_col)
chi2,p,dof,expected=stats.chi2_contingency(crosstable)
result='X2 = '+format(chi2,'.2f')+' p = '+format(p,'.3f')
return result
4. 構造交叉分析+卡方檢驗導出函數(shù)
#多個單變量+交叉分析結(jié)果+卡方檢驗結(jié)果在1個sheet中
def fre_cross_with_chi2test_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]+1
chi2_re=chi2sqaure_test(df,r,c)
chi2_result=pd.DataFrame(np.array(['卡方檢驗:',chi2_re]))
chi2_result.to_excel(writer,index=0,sheet_name=sheetname,startrow=start_row,header=False)
start_row=start_row+chi2_result.shape[0]+2
print(start_row)
writer.save()
writer.close()
5. 構造描述統(tǒng)計函數(shù)
# 修改值,文本轉(zhuǎn)數(shù)值
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
# 描述統(tǒng)計(樣本量淌喻,均值僧家,標準差,最小值裸删,中位數(shù)八拱,最大值)在1個sheet
def describe_one_sheet(df, colls,sheetname,writer):
numls=[]
meanls=[]
stdls=[]
minvaluels=[]
medianls=[]
maxvaluels=[]
for colname in colls:
col=df[colname]
num=col.count()
numls.append(num)
mean=col.mean()
meanls.append(mean)
std=col.std()
stdls.append(std)
minvalue=col.min()
minvaluels.append(minvalue)
median=col.median()
medianls.append(median)
maxvalue=col.max()
maxvaluels.append(maxvalue)
# meanls=[round(i,2) for i in meanls] #均值保留2位小數(shù)
# stdls=[round(i,3) for i in stdls]#標準差保留3位小數(shù)
describe={'題項':colls,
'樣本量':numls,
'均值':meanls,
'標準差':stdls,
'最小值':minvaluels,
'中位數(shù)':medianls,
'最大值':maxvaluels
}
stats=pd.DataFrame(describe,columns=['題項','樣本量','均值',
'標準差','最小值','中位數(shù)','最大值'])
stats['均值']=stats['均值'].apply(lambda x:format(x,'.2f')) #均值保留2位小數(shù)
stats['標準差']=stats['標準差'].apply(lambda x:format(x,'.3f'))#標準差保留3位小數(shù)
stats.to_excel(writer,index=0,sheet_name=sheetname,startrow=0)
writer.save()
writer.close()
6. 主函數(shù)并調(diào)用
其中,自變量為11個:因變量為:13個
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] #因變量
fre_cross_with_chi2test_one_sheet(df,rowls,colls,sheetname='交叉分析',colorder=order,writer=writer)
dfreplace=replace(df,colls)#修改值肌稻,文本轉(zhuǎn)數(shù)字
des_col_name=list(dfreplace.columns.values)
describe_one_sheet(dfreplace,des_col_name,sheetname='描述統(tǒng)計',writer=writer)
main()
三、效果
將上述代碼結(jié)合后匕荸,大約花費16s的時間將上述分析結(jié)果導出excel爹谭。
1. 含卡方檢驗的交叉分析
含卡方檢驗的交叉分析.gif
2. 描述統(tǒng)計
描述統(tǒng)計.png
python結(jié)果批量導出excel(一):頻率分析、交叉分析和多重響應
python結(jié)果批量導出excel(二):卡方檢驗榛搔,描述統(tǒng)計
python結(jié)果批量導出excel(三):組間差異比較(F檢驗诺凡、T檢驗和事后比較)