天天看點

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

背景介紹

近年來,商業分析(Business Analytics,BA)軟體逐漸成為企業增強洞察力的利器。其中,IBM SPSS Statistics 是統計分析領域中久享盛名的應用軟體。企業在實際營運中,已根據不同的業務需求,開發或購買了滿足自身需求的商業資料整合方案,并期待與 Statistics 進行內建,以便更高效、準确的分析資料,提取資料中隐含的資訊。

Statistics 不僅為使用者提供了豐富的統計算法來幫助使用者分析資料,而且也提供了非常靈活的程式設計接口,供外部使用者将自定義的功能子產品與 Statistics 內建。使用者可以通過自定義子產品對 Statistics 進行功能擴充。借助 Statistics,使用者自定義子產品可以獲得更加完整、有意義的輸入資料。

Statistics 16.0(及以上)為使用者提供了的可程式設計插件(Programmability plug-ins)包括 Python plug-in、R plug-in 和 Microsoft .NET plug-in。其中,Python 文法簡潔而清晰、具有豐富強大的類庫,并且其能夠很輕松的與其他語言實作的子產品內建在一起。是以,本文将使用 Python 功能子產品作為示範。

Customer Dialog 簡介

Statistics 在程式設計插件的基礎上提供了 Extension Command 機制使使用者能夠以 Statistics 内部文法指令(syntax command) 的形式來包裝使用程式設計插件開發出來的功能子產品。Customer Dialog 為 Extension Command 提供了相應的使用者界面。

Customer Dialog 允許使用者建立符合 Statistics 界面風格的對話視窗,以及建立自定義的 Statistics 内置統計程式。對話視窗作為該統計程式的使用者界面,可接受并傳遞基于使用者輸入的參數,并調用相應的内置統計程式。通過 Customer Dialog Builder,使用者可以

建立自定義的對話過程,調用内置統計程式。

為一組擴充指令集建立使用者界面。擴充指令是指,使用者自定義的、由 Python 或 R 實作的 SPSS Statistics 指令。

儲存建立完成的 Customer Dialog,并将其安裝至 Statistics 中。

Statistics Syntax 和 Python plug-in 簡介

SPSS Statistics 具備強大的資料處理和分析功能,除了提供友好、靈活的 UI 操作界面外,Statistics 為其所有的功能設計了相應的指令,即 Statistics 的文法 Syntax。除此之外,Syntax 具有進階程式設計的功能,可以完成比 UI 所提供的功能更為複雜的資料分析工作。SPSS Statistics 核心是基于指令驅動的,Syntax 是其靈魂。使用者在 UI 界面的所有操作,均會被轉換成 Syntax 指令傳遞至核心執行。詳見下圖。

圖 1. Statistics 執行過程

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

Python plug-in 和 Statistics 産品的互動方式很靈活。使用者既可以在自定義的 Python 代碼中引入 SPSS 子產品,運用 Statistics 完成資料的讀取、處理、分析、輸出任務,也可以在 Syntax 中直接加入 Python 代碼塊(BEGIN PROGRAM PYTHON-END PROGRAM)來控制 Syntax 工作流。本文采用了後一種方式。如:

圖 2. Python Plug-in 程式段 1

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

使用 Python Plug-in 的好處是,可以動态的建立 string 字元串以及 Syntax 指令。

內建方法論述

由上節讨論可知,我們可以利用 Statistics 中的 Python Plug-in 對自定義 Python 子產品進行內建,包括:利用 Customer Dialog 設計滿足使用者習慣的 UI 互動界面;編寫内置統計程式;與 Statistics 進行內建。

本文設計的 Python 功能子產品實作了一種客戶分群方法。其依據大量的客戶屬性資料和消費資料,将客戶分組,屬于同一組的客戶具有極大的相似性,可以采用相同的商業政策;不同組的客戶具有極大的差異性,保證組與組之間的差别最大化,以便采取不同的商業政策,獲得最大的商業利潤。

UI 界面設計及參數傳遞

本節将讨論 UI 界面的布局以及 UI 參數傳遞。在設計 UI 界面前,我們首先應該明确,Python 功能子產品所需的輸入參數,這些參數将出現在 UI 界面上。同時,若子產品功能較為複雜,可以添加子對話過程實作特定的功能。該功能子產品的輸入包括:資料檔案、控制檔案以及最大分組數。輸出為客戶分群結果檔案,包括使用者的基本資訊以及所屬的群組号。子對話的功能為客戶分群結果上傳至資料庫。

運作 Utilities -> Customer Dialog Builder,出現 Customer Dialog 編輯界面。通過拖拽控件的方式,使用者可以快捷地對界面進行編輯,并且指定相應控件的屬性。

圖 3. Customer Dialog 1- 主對話框界面

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

圖中,該 dialog 有 5 個控件。Item 1 為該對話視窗的标題,将顯示在該視窗的标題欄中;Item 2、Item 3 以及 Item 4 用于使用者輸入 Python 功能子產品參數 , 分别為控制檔案路徑,資料檔案路徑以及最大分組數;Item 5 為該對話視窗的子對話視窗,用于實作特定子功能。本文中設計的子功能是将 Python 子產品的執行結果上傳至資料庫中。Item 5 的 UI 界面如下圖。

圖 4. Customer Dialog 2 – 子對話框界面

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

圖 4 中 Item 6 為子對話框的标題,Item 7、Item8 以及 Item9 用于輸入上傳資料庫所需參數,分别為 DSN 名稱、資料庫名稱,以及待建的資料表名。

以 Item 2 為例,我們示範如何傳遞參數。下圖為 Item 2 的屬性。

圖 5. Customer Dialog 3 – 控件屬性

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

其中,屬性 “Identifier” 用于傳遞參數,如圖中的 “control_file_path”。它記錄使用者的輸入值,在 Python 程式中,以 “%%” 标記對讀出該輸入值,傳遞給 Syntax 和 Python 程式。傳遞過程如下圖所示。

圖 6. Python Plug-in 程式段 2 – Python Plug-in 參數傳遞

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

編輯好 UI 界面後,将其儲存為 customer dialog package file(.spd) 檔案,本文中為 CustomerClustering.spd。使用 “Preview” 功能,對界面進行預覽。

圖 7. Customer Dialog 4 – Preview 1

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

圖 7 紅框部分是子對話視窗按鈕,使用者點選該按鈕将出現子對話框,如下圖所示。

圖 8. Customer Dialog 5 – Preview 2

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

在設計子對話視窗控件屬性時,我們為 “DSN” 以及 “Database Name” 設定了預設值 “TEST”。

內建 Python 功能子產品

本文涉及到的自定義 Python 子產品主要實作兩類功能。一類是客戶分群,是用嵌入了 Python 程式的 Syntax 實作 (CustomerClustering.sps) ;另一類是分群結果上傳至資料庫,是用 Python 腳本實作 (UploadtoDatabase.py)。我們利用 Customer Dialog 裡的 Syntax Template 将 UI 參數與 Python 程式進行關聯。

內建客戶分群功能

在內建該功能時,本文選擇了 Statistics 提供的 “INSERT” 指令。我們通過使用者從 UI 界面的輸入 control_file_path、input_file_path 獲得待操作的資料集,通過 max_clusters_ui 擷取到指令檔案運作所需參數,并将該參數指派給變量 max_clusters。max_clusters 為指令檔案中定義的全局變量 , 以實作參數傳遞。最後,我們利用 spss.Submit( ) 函數執行該指令。至此,内置統計程式在運作時,可以調用指定的指令檔案,并将運作時參數傳遞給該指令檔案。具體實作如下圖所示。

圖 9. 內建客戶分群功能

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

內建資料庫上傳功能

出于安全性考慮,我們将 UploadtoDatabase.py 檔案編輯為二進制的 UploadtoDatabase.pyc 檔案以避免暴露源代碼,是以圖中 “import UploadtoDatabase” 所引入的實際為 .pyc 檔案。這裡,在引入 .pyc 檔案時,需要指定所引入檔案的路徑,即 “sys.path.append(‘C:\Integration\PythonScript\’)” 所示。dsn,db_name 和 db_tablename 為使用者通過 UI 界面傳遞的資料庫資訊。調用方法如下。

圖 10. 內建資料庫上傳功能

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

圖中 UploadtoDatabase 中 run 函數的聲明和實作方式如下:

圖 11. Python Script 主函數定義

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

儲存 Python 功能子產品運作結果

我們可以将 Python 功能子產品的運作結果儲存為指定格式檔案,或上傳至資料庫。使用 Syntax “SAVE TRANSLATE OUTFILE”指令可将運作結果儲存為指定格式的檔案。其中,資料集 RESULT 為 Python 功能子產品的輸出資料集,output_result_file 為待儲存檔案的檔案名。我們首先設定操作的主資料集是 RESULT,然後使用 spss.Submit( ) 函數執行儲存輸出結果指令,就可以将 RESULT 資料集儲存為指定格式的檔案。具體指令如下。

圖 12. 檔案儲存程式段

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

本例中,我們将 RESULT 資料集分别儲存為 .csv 檔案以及 .sav 檔案。除此之外,我們還可以利用 ODBC 連接配接将輸出資料集 RESULT 上傳至資料庫,為此,我們需要在系統中設定 DSN(Data Source Name)。DSN 為 ODBC 指定了某一資料源和相對應的 ODBC 驅動程式。接着,使用 Syntax “SAVE TRANSLATE ”指令實作上傳資料庫功能,具體指令如下。

清單 1. 資料庫上傳程式段

begin program python.

import spss

import spssaux

DSN = r"%%DSN%%"

db_name=r"%%DBName%%"

table_name=r"%%TableName%%"

spss.Submit("dataset active RESULTS . \n")

spss.Submit("execute . \n")

varcount=spss.GetVariableCount()

data_str = spss.GetVariableName(0)

if spss.GetVariableType(0) > 0:

data_type_str=spss.GetVariableName(0)+' '+'varchar'

else:

data_type_str=spss.GetVariableName(0)+' '+ 'double'

for i in range(1,varcount):

data_str = data_str +', '+ spss.GetVariableName(i)

data_type_str = data_type_str +',

'+spss.GetVariableName(i)

if spss.GetVariableType(i) > 0:

data_type_str = ' '+data_type_str+' ' +'varchar'

else:

data_type_str = ' '+data_type_str+' ' + 'double'

print DSN,db_name,table_name

commands="""

SAVE TRANSLATE /TYPE=ODBC

/CONNECT='DSN="""+DSN+""";UID= ;PWD=,3;DBALIAS="""+db_name+

""";'

/ENCRYPTED

/MISSING=IGNORE

/SQL='CREATE TABLE """+table_name+"""

("""+data_type_str+""" )'

/REPLACE

/TABLE='SPSS_TEMP'

/KEEP=All

/SQL='INSERT INTO """+table_name+""" ("""+data_str+""")

SELECT """+data_str+""" FROM SPSS_TEMP'

/SQL='DROP TABLE SPSS_TEMP'."""

print commands

spss.Submit(commands)

end program.Show moreShow more icon

我們首先取得資料集 RESULT 中各資料值及其類型,根據這些資料資訊用 SQL 指令在資料庫中建立資料表,該表的表名是由使用者通過 UI 界面指定的。

與 Statistics 進行內建

在 Customer Dialog 中設計完 UI 界面,把 UI 界面與上述的 Python 程式進行關聯後,我們需要在 Statistics 中安裝該 Customer Dialog,便于使用者通過 UI 來使用我們自定義的 Python 功能子產品。安裝方式如圖。

圖 13. 安裝 Customer Dialog 1

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,在 Customer Dialog Builder 界面選擇 File -> Install,選擇儲存好的對話框檔案(CustomerClustering.spd)并指定安裝位置本例中我們把建立的名為 Customer Clustering 的功能安裝 至 Utilities 菜單下。安裝完成結果如下所示。

圖 14. 安裝 Customer Dialog 2

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,Statistics 的菜單欄 Utilities 下,出現了我們自定義的功能子產品 Customer Clustering。

自定義 Python 子產品運作示範及結果分析

本節分為兩部分,讨論如何利用 Statistics 對自定義 Python 功能子產品進行資料預處理以及對該功能子產品的執行結果進行分析。

資料預處理

在大多數資料分析中,原始資料不适合直接使用,而需要進行預處理才能滿足需求。比如,将多個小分類值組合為一個大分類值,或将一個連續變量轉換成分類變量,這可以使得分析結果更易了解。本文需要把連續型變量”銷售額”定義為一組分類變量,如:高、中、低,進而提高了資料的易用性。同時會使用 Statistics 的 Visual Binning 對功能子產品輸入資料進行預處理。

下面是處理過程。輸入資料檔案如下所示:

圖 15. 輸入檔案示範

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,我們需要對三類銷售額進行分類,分别為 “SALES_RETAIL”、“SALES_ONLINE” 以及 “SALES_TOTAL”。我們以 “SLAES_RETAIL” 為例,其餘兩個變量處理過程與其類似。

在 Statistics 工具欄中,選擇 Transform -> Visual Binning,出現 Visual Binning 對話框,選中 “SALES_RETAIL”,如下圖所示。

圖 16. Visual Binning 1

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

選擇 “Continue”,指定新變量名 B_SALES_RETAIL。在 “Grid” 欄設定分類點(bin cut point)。這裡,我們依據業務含義,選擇了 9 個分類點,并點選 Make Lable 按鈕,Statistics 會自動為分類變量生成标簽。

圖 17. Visual Binning 2

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,我們把原始的 “SALES_RETAIL” 變量分為了 10 類,由圖示可知,連續型變量 “SALES_RETAIL” 的值,将會分别落入分類類型 “B_SALES_RETAIL” 的 10 個分類值中。運作結果部分展示如下圖所示。

圖 18. Visual Binning 3

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

示例 Python 子產品內建結果示範

原始資料的經過預處理後,已經滿足了本文使用者自定義功能子產品的資料要求。現在,使用者可以直接進入 Utilities->Customer Clustering,來調用自定義的方法并獲得結果。

運作 Statistics 工具欄 Utilities -> Customer Clustering ,出現自定義對話框。

圖 19. 內建結果示範 1

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,輸入所需參數,紅框部分為我們資料預處理 Visual Binning 後的輸入檔案,使用者規定最大分組為 8,則共有 9 個客戶分群,分别為 0 至 8。點選 “OK” 運作,運作結果儲存為 .csv 檔案和 .sav 檔案。除此之外,我們還可以将執行結果上傳至資料庫。點選 “Upload to Database”,出現如下子對話框。

圖 20. 內建結果示範 2

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

如圖所示,輸入上傳資料庫所需參數,表 “CustomerClustering” 用于存儲客戶分群結果。

輸出結果檔案如下圖所示。

圖 21. 內建結果示範 3

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

其中,“CUSTOMER_CLUSTER” 為客戶的分組資訊,如 Customer ID 分别為 1 的客戶,屬于分組 5。資料庫上傳結果如下所示。

圖 22. 內建結果示範 4

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

由圖可知,我們在指定資料庫 TEST 中,建立了表 CUSTOMERCLUSTERING,紅框 3 中為 CUSTOMERCLUSTER 屬性,其包含了客戶所屬分組資訊。

示例 Python 子產品內建結果分析

為了更加清楚的了解客戶分群情況,我們可以利用 Statistics 中的 Frequencies 方法對其進行分析。分析結果如下。

表 1. 統計結果

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

由表 1 可知,輸出結果中,針對客戶分組”CUSTOMER_CLUSTER”共有 50000 條有效的客戶記錄,其中中位數為分組 4,說明大部分的客戶都集中在前半部分的分組當中(分組 1 至分組 4),分組 1 擁有最多的客戶。表 1 隻能提供給我們大概的統計結果,業務含義較少,詳細統計資訊如下。

表 2. 統計結果明細

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

由表 2 可知,分組 0 擁有最少的客戶數 427,分組 1 擁有最多的客戶數 6217,并且客戶較為均勻的分布在分組 1 至分組 8。客戶分布情況圖如下。

圖 23. 客戶分組圖示

python for spss statistics_IBM SPSS Statistics 與使用者自定義 Python 子產品的內建及分析

上圖是對客戶分群情況更為直覺的展示,分組 1 至分組 8 擁有較多的客戶,且分布較均勻。針對分組 0,由于其人數較少,業務優先級較低,我們可以對該組客戶采用一般的銷售政策。而對于分組 1 至分組 8,由于其人數較多,業務優先級較高,我們需要對該組客戶進行進一步的分析,以便采取更加準确的銷售政策,提升客戶的忠誠度,減少客戶流失。

結束語

本文介紹了使用者自定義 Python 功能子產品與 IBM SPSS Statistics 內建的方法,并對內建結果進行了示範與分析。通過本文,讀者可以了解,如何設計滿足使用者習慣的 UI 互動界面,如何編寫内置統計程式,以及如何與 Statistics 進行內建。

相關主題