1. 程式人生 > >推薦一個利用 python 生成 pptx 分析報告的工具包:reportgen

推薦一個利用 python 生成 pptx 分析報告的工具包:reportgen

reportgen v0.1.8 更新介紹

這段時間,我對 reportgen 進行了大工程量的修改和更新。將之前在各個文章中出現的函式進行了封裝,同時也對現有工具包的一些邏輯進行了調整。

1、reportgen 簡介

reportgen 的底層是 pptx 檔案生成介面,它能非常方便的將DataFrame等資料匯出為pptx上的圖表。你可以自定義圖表的型別(條形圖、餅圖、折線圖等),也可以全部交給工具包來自動化。另外不排除後期會增加其他檔案形式(如可互動的 html 等)介面的可能性,但短期內估計比較難。

在這些介面上是一些輔助函式,包括特徵型別的判斷、sklearn中缺少的預處理函式、一些特殊的度量函式、模型評估報告函式、關聯分析函式等。工具包的願景是對資料的自動分析,自動出報告,這期間缺乏的函式我都可能加進去。這次更新,主要就是完善了這一層。

工具包的最外層就是各類資料的分析報告生成。目前已經完成的是問卷型資料和通用性資料。其中問卷型資料已經很完善,基本只需要修bug了,單獨作為一個子包放在 reportgen中,大家可以 import reportgen.questionnaire as ques 來使用。至於通用性資料,目前已經完成了第一步,即描述統計型的分析報告,大家可以用rpt.AnalysisReport 來實現。第二步準備實現給定目標變數後的分析,包含交叉分析、各特徵的重要性、監督學習模型等。

另外,這次我放了一些案例在github上,用於大家下載後的測試和學習用,網址是 https://github.com/gasongjian/reportgen/tree/master/example

2、通用資料的分析

在這個分析報告中,我會對DataFrame資料的每一個欄位進行分析,判斷它們的型別,然後畫出合適的圖表。對於因子變數,自動繪製柱狀圖或條形圖;對於數值型變數,自動繪製出擬合的分佈圖;對於一般的文字,自動繪製詞雲。同時也會給出一個統計表格,內含各個變數的場景統計資料,如最大值、最小值、均值、標準差、唯一數個數、缺失率等。下面是一個例子,程式碼和資料可在我的github中尋找。

import pandas as pd
import reportgen as rpt
# 資料匯入
# 資料的網址:https://github.com/gasongjian/reportgen/tree/master/example/datasets/LendingClub_Sample.xlsx
data=pd.read_excel('.\\datasets\\LendingClub_Sample.xlsx')
# 資料預覽
rpt.AnalysisReport(data.copy(),filename='LendingClub 資料預覽');

它會生成如下 pptx 檔案

另外這裡有一些過程函式也推薦給大家

特徵統計分析

# 返回各個特徵的資料型別
var_type=rpt.type_of_var(data)
#返回一個統計表格,內含資料各個特徵的一些統計值
summary=rpt.describe(data)

資料預處理

# 只作工具包測試,所以不區分訓練集和測試集
y=data['target']
X=data.drop(['target'],axis=1)
categorical_var=list(set(X.columns[X.apply(pd.Series.nunique)<30])|set(X.select_dtypes(include=['O']).columns))
continuous_var=list(set(X.columns)-set(categorical_var))

# ===========【WOE 編碼】=============
woe=rpt.preprocessing.WeightOfEvidence(categorical_features=categorical_var,encoder_na=False)
X=woe.fit_transform(X,y)

# ===========【離散:卡方分箱】=============
dis=rpt.preprocessing.Discretization(continous_features=continuous_var)
X2=dis.fit_transform(X,y)

資訊理論相關度量函式

# 離散因子變數的熵
rpt.metrics.entropy.entropy(p)
# 連續數值變數的熵(基於k近鄰演算法的近似估計)
rpt.metrics.entropyc.kl_div(p,q)

機器學習模型輔助建模函式

clfs={'LogisticRegression':LogisticRegressionCV(),\
'RandomForest':RandomForestClassifier(),'GradientBoosting':GradientBoostingClassifier()}
y_preds,y_probas={},{}
for clf in clfs:
    clfs[clf].fit(X, y)
    y_preds[clf] =clfs[clf].predict(X)
    y_probas[clf] = clfs[clf].predict_proba(X)[:,1]

# 函式會輸出一個或多個二分類模型的效能評估結果,包含ROC曲線、PR曲線、密度函式、auc等統計指標、混淆矩陣等
models_report,conf_matrix=rpt.ClassifierReport(y,y_preds,y_probas)
print(models_report)

3、問卷型資料分析

問卷資料涉及到各種題型,包括單選題、多選題、填空題、矩陣多選題、排序題等等。不管是
頻數統計還是交叉分析,單選題都很好處理, 但其他題目就相對複雜的多,比如單選題和多選題
之間的交叉統計,多選題和多選題之間的交叉統計等。

為了能使用統一的函式進行常規分析,本工具包使用專門針對問卷設計的資料型別(或者說編碼方式)。在這種型別中,每一份問卷都有兩個檔案,data 和 code ,它們的含義如下:

1). data:按選項序號編碼的資料(csv、xlsx等都可以)。具體的示例如下:

Q1 Q2 Q3_A1 Q3_A2 Q3_A3 Q3_A4
1 1 1 0 1 0
1 2 0 0 1 0
1 1 1 0 0 1
2 3 0 1 1 0
1 2 1 0 1 0
1 4 0 1 0 1
2 2 1 0 1 0
1 1 0 1 0 1
2 2 1 0 1 0

其中 Q1、Q2是單選題,在Q1中,1代表男,2代表女。Q3是多選題,一共有四個選項,分別代表 Q3_A1:'旅遊',Q3_A2:'健身',Q3_A3:'藝術',Q3_A4:'養生'. 多選題常用這種01矩陣儲存。

2). code:編碼檔案( json格式,就是 python中的字典型別), 給定每道題的題號、選項編碼等資訊。

每一個題目都有如下欄位:

  • content: 題目內容
  • code: 題目對應的編碼
  • code_r: 題目對應的編碼(矩陣單選題專有)
  • qtype: 題目型別,單選題、多選題、矩陣單選題、排序題、填空題等
  • qlist: 該題的索引,如多選題的 ['Q1_A1','Q1_A2',..]
  • code_order: 非必須,題目類別的順序,用於PPT報告的生成[一般後期新增]
  • name: 非必須,特殊題型的標註
  • weight: 非必須,dict,每個選項的權重,用於如月收入等的平均數統計

具體示例如下:

code={'Q1':{
      'content':'性別',
      'code':{
          1:'男',
          2:'女'
      }
      'qtype':'單選題',
      'qlist':['Q1']
  },
  'Q2':{
      'content':'年齡',
      'code':{
          1:'17歲以下',
          2:'18-25歲',
          3:'26-35歲',
          4:'36-46歲'
      },
      'qtype':'單選題',
      'qlist':['Q2']
  },
  'Q3':{
      'content':'愛好',
      'code':{
          'Q3_A1':'旅遊',
          'Q3_A2':'健身',
          'Q3_A3':'藝術',
          'Q3_A4':'養生'
      },
      'qtype':'多選題',
      'qlist':['Q3_A1','Q3_A2','Q3_A3','Q3_A4']
  }
  }

該工具包包含如下函式:

檔案 IO

  • read_code, 從本地讀取code資料,支援excel檔案和json檔案
  • save_code, 將code 儲存為 xlsx 或json資料
  • load_data, 支援開啟檔案視窗來選擇問卷資料
  • read_data, 讀取本地的資料,自適應xlsx、csv等
  • save_data, 將問卷資料(data和code)儲存到本地
  • wenjuanwang, 編碼問卷網平臺的問卷資料,輸入為問卷網上下載的三個檔案
  • wenjuanxing, 編碼問卷星平臺的問卷資料,輸入為問卷星網站上下載的兩個xls檔案(按選項序號和按選項文字)

資料處理

  • spec_rcode: 對問卷中的一些特殊題型進行處理,如將城市題分類成省份、城市、城市級別等
  • dataText_to_code:
  • dataCode_to_text:
  • var_combine: 見data_merge
  • data_merge: 合併兩份問卷資料,常見於多個推動渠道的問卷合併
  • clean_ftime: 根據使用者填寫時間來篩選問卷,會根據填問卷累計時間曲線的拐點來給出剔除的時間點
  • data_auto_code:
  • qdata_flatten: 將問卷資料展平,便於將多份問卷資料儲存在同一個資料庫中

統計檢驗等

  • sample_size_cal: 樣本量計算公式
  • confidence_interval: 置信區間計算公式
  • gof_test: 擬合優度檢驗
  • chi2_test: 卡方檢驗
  • fisher_exact: 卡方檢驗,適用於觀察頻數過少的情形
  • anova: 方差分析

資料分析

  • mca: 對應分析,目前只支援兩個變數
  • cluster: 態度題的聚類分析,會根據輪廓係數自動選擇最佳類別數
  • association_rules: 關聯分析,用於多選題的進一步分析

統計

  • contingency: 列聯表分析,統一給出列聯表的各種資料,包含fo、fop、TGI等
  • qtable: 單個題目的統計分析和兩個題目的交叉分析,給出頻數表和頻率表

視覺化

  • summary_chart: 整體統計報告,針對每一道題,選擇合適的圖表進行展示,並輸出為pptx檔案
  • cross_chart: 交叉分析報告,如能將年齡與每一道題目進行交叉分析,並輸出為pptx檔案
  • onekey_gen: 綜合上兩個,一鍵生成
  • scorpion: 生成一個表格,內含每個題目的相關統計資訊
  • scatter: 散點圖繪製,不同於matplotlib的是,其能給每個點加文字標籤
  • sankey: 桑基圖繪製,不畫圖,只提供 R 需要的資料

python實踐

import reportgen.questionnaire as ques
# 匯入問卷星資料
datapath=['.\\datasets\\[問卷星資料]800_800_0.xls','.\\datasets\\[問卷星資料]800_800_2.xls']
data,code=ques.wenjuanxing(datapath)

# 匯出
ques.save_data(data,filename='data.xlsx')
ques.save_data(data,filename='data.xlsx',code=code)# 會將選項編碼替換成文字
ques.save_code(code,filename='code.xlsx')

# 對單變數進行統計分析
result=ques.qtable(data,code,'Q1')
print(result['fo'])

# 兩個變數的交叉分析
result=ques.qtable(data,code,'Q1','Q2')
print(result['fop'])

# 聚類分析,會在原資料上新增一列,類別題
#ques.cluster(data,code,'態度題')

# 在.\\out\\下 生成 pptx檔案
ques.summary_chart(data,code,filename='整體統計報告');
ques.cross_chart(data,code,cross_class='Q4',filename='交叉分析報告_年齡');
ques.scorpion(data,code,filename='詳細分析資料')
ques.onekey_gen(data,code,filename='reportgen 自動生成報告');

4、pptx 檔案生成介面 Report

在 reportgen 中,一個分析報告被拆解成四個部分:title、summary、footnote和body data,

  • title: slide 的標題
  • summary: slide的副標題或一些簡要結論
  • data: slide的視覺化資料
  • footnote: slide的腳註,如資料來源、樣本量等說明

它們的位置見下圖。其中body data 可以是一個或多個chart/表格/文字框/圖片的組合。拋棄latex和pptx自帶那種精細的排版,Report 只需你提供這四個部分的資料,剩下的排版你就不用管啦,函式會幫你來完成。

分析報告的組成

Report 是一個類,可以開啟 pptx檔案從中獲取資訊並新建 slide.

首先是初始化,

import reportgen as rpt
# 匯入分析報告
prs=rpt.Report()
#prs = rpt.Report(filename='分析報告.pptx')

函式預設會開啟reportgen自帶的模板檔案(路徑是 ~\reportgen\template\template.pptx), 大家也可以自己指定其他檔案。

對於存在內容的 pptx,Report能輕鬆實現獲取所有的文字和圖片

#獲取分析報告中所有的文字
prs.get_texts()
#獲取分析報告中所有的圖片
prs.get_images()

同時你也能很簡單的建立一頁新的 slide

data=pd.DataFrame(np.random.randint(100,1000,size=(3,4)),index=['品牌A','品牌B','品牌C'],columns=['Q1','Q2','Q3','Q4'])
slide_data={'data':data,'slide_type':'chart','type':'COLUMN_CLUSTERED'}
prs.add_slide(data=slide_data,title='品牌銷量',summary='品牌銷量',footnote='')

在上面的指令碼中,我們添加了一張各品牌的銷量分佈圖,圖表型別是柱狀圖。

slide_type 目前支援的型別有四種:

  • chart: office 軟體自帶的圖表,詳細的型別由 type 指定
  • table: 表格,表格資料由 data 給定
  • picture: 圖片,圖片的路徑由 data 給定
  • textbox: 文字框,文字內容由 data 給定

slide_type是非 table 型別時,函式引數也可以直接給定 data ,如

prs.add_slide(data=data,title='品牌銷量',summary='品牌銷量')

另外,如前文所介紹,一張slide可以新增多個圖表:

slide_data1={'data':data,'slide_type':'chart','type':'COLUMN_CLUSTERED'}
slide_data2={'data':data,'slide_type':'table'}
slide_data3={'data':'測試\n測試','slide_type':'textbox'}
prs.add_slide(data=[slide_data1,slide_data2,slide_data3],title='品牌銷量',summary='品牌銷量')

當所有slide都建好了後,用 prs.save(filename='text.pptx') 儲存就可以

另外Report還提供了兩個有用的函式:

  • prs.add_cover(): 利用三角剖分演算法提供了一種很極客的封面版式,詳細可參見上面第二節的圖片
  • prs.add_slides(): 根據一組資料,給分析報告快速新增一系列的slides.

最後說下reportgen的安裝方法,很簡單,工具包已經上傳到pypi上了,直接 pip install reportgen 即可,當然也可以到作者的github官網上下載使用 https://github.com/gasongjian/reportgen