中博信息技術(shù)研究院有限公司 魏利明 陳文冬
R語言統(tǒng)計建模方法在滿意度預(yù)測中的應(yīng)用
中博信息技術(shù)研究院有限公司 魏利明 陳文冬
R語言是一套完整的用于統(tǒng)計分析和制圖的開源軟件環(huán)境,并逐漸成為統(tǒng)計建模的重要工具之一。闡述了統(tǒng)計建模的基本步驟,及其相應(yīng)的R語言處理方法與技巧,并以用戶滿意度預(yù)測為案例,探討R語言在統(tǒng)計建模上的具體應(yīng)用。
R語言;統(tǒng)計建模;用戶滿意度預(yù)測
R語言是一套完整的用于統(tǒng)計分析和制圖的開源軟件環(huán)境,由新西蘭奧克蘭大學統(tǒng)計系的Ross Ihaka和Robert Gentleman共同創(chuàng)立的S語言演變而來。R語言具備以下特點:
1)它是一種高效的應(yīng)用于數(shù)據(jù)處理與存儲的代碼語言;
2)它具備強大的數(shù)組運算功能;
3)它具備完整且連貫的統(tǒng)計分析函數(shù);
4)它具有出色的統(tǒng)計制圖功能;
5)基于開源的設(shè)計可以讓用戶自定義函數(shù)包,上傳網(wǎng)絡(luò)能夠讓全球用戶共享使用;
6)豐富詳實的幫助文檔和開源免費的升級迭代服務(wù)大大提升了數(shù)據(jù)分析的效率,從而大大降低了軟件升級的成本。
根據(jù)2014年IEEE Spectrum的最新調(diào)查,R語言在全球編程語言的綜合排名中位列第七,在統(tǒng)計語言中位列第一,遠遠領(lǐng)先于SAS(統(tǒng)計分析軟件)。R語言當前已覆蓋Windows、Unix 和MacOS平臺,成為全球最流行的統(tǒng)計分析語言之一。
一般而言,統(tǒng)計建模是以計算機統(tǒng)計分析軟件為工具,利用各種統(tǒng)計分析方法對批量數(shù)據(jù)建立統(tǒng)計模型和探索處理的過程,用于揭示數(shù)據(jù)背后的因素,詮釋社會經(jīng)濟現(xiàn)象,或?qū)?jīng)濟和社會發(fā)展做出預(yù)測或判斷[1]。概括來說,統(tǒng)計建模應(yīng)具備三個基本要素:數(shù)據(jù)、方法和工具。
R語言統(tǒng)計建模則是以R語言為分析工具,通過編寫統(tǒng)計分析代碼,對目標數(shù)據(jù)進行描述、解釋,并通過建立模型提煉數(shù)據(jù)規(guī)律和規(guī)則,進而對未來趨勢做出符合一定概率的預(yù)測或判斷。具體來說,有如下幾個步驟。
1)明確目標與確立假設(shè)。這是統(tǒng)計建模初期最基礎(chǔ)也是最重要的工作。統(tǒng)計建模往往要面對海量紛繁復雜的數(shù)據(jù),這意味著,在橫向上,分析者往往要面對多維有時甚至幾十維的觀測向量;在縱向上,樣本量的累積會大大增加數(shù)據(jù)的縱深。當觀測向量維度眾多、體量巨大時,整體數(shù)據(jù)集就會形成一個極為龐大的數(shù)據(jù)矩陣。此時就需要有明確的分析目標和分析需求,建立起必要的假設(shè),凸顯核心問題,才能有效指導下階段的統(tǒng)計建模工作。否則,必然會使分析工作喪失目的和方向,削弱模型的應(yīng)用價值,最終導致建模工作的結(jié)果南轅北轍。
2)數(shù)據(jù)獲取與清洗。數(shù)據(jù)獲取與清洗是統(tǒng)計建模的重要環(huán)節(jié),通常占到整個數(shù)據(jù)工作60%~80%的工作量。
數(shù)據(jù)獲取就是從一定的渠道按照假設(shè)體系的要求搜集建模所需要的數(shù)據(jù)信息,獲取的數(shù)據(jù)叫做原始數(shù)據(jù)。R語言提供了從多種渠道獲取數(shù)據(jù)的方法,例如:通常使用“download.file()”和“read.table()”函數(shù)用于獲取網(wǎng)絡(luò)數(shù)據(jù);利用“read.csv()”、“read.xlsx()”可以讀取csv和Excel數(shù)據(jù);此外,加載XML(可擴展標記語言)包可以編寫網(wǎng)絡(luò)爬蟲爬取網(wǎng)頁信息;加載jsonlite包可以爬取jason格式數(shù)據(jù);利用httr包并注冊指定的API(應(yīng)用程序接口)可以實現(xiàn)與API數(shù)據(jù)的對接;通過RMySQL(R語言程序包)可以與數(shù)據(jù)庫對接獲取數(shù)據(jù)。
數(shù)據(jù)清洗是指對原始數(shù)據(jù)進行異常值和缺失值的檢驗和處理,使得原始數(shù)據(jù)成為可用于統(tǒng)計建模的“結(jié)構(gòu)化數(shù)據(jù)”。異常值主要包括離群值、高杠桿值和強影響值,當觀測值大于三個標準差通常被定義為異常值。在R語言中,通過“outlierTest()”函數(shù)可以檢查模型的異常值,“influencePlot()”函數(shù)能夠返回異常值的交互圖形,便于識別異常值。對于缺失值的處理可通過多重插補進行替換,或?qū)⑷笔е祫h除。“sum(is.na())”函數(shù)以及“colSums(is.na())”函數(shù)是識別缺失值最常用的函數(shù),此外,可以借助“aggr()”或“matrixplot()”函數(shù)返回缺失值分布的圖形。
3)變量篩選與降維。如果說數(shù)據(jù)獲取與清洗使得數(shù)據(jù)“可用于”統(tǒng)計建模,那么變量篩選與降維就是使得數(shù)據(jù)“好用于”統(tǒng)計建模的重要環(huán)節(jié)。一個清洗后的結(jié)構(gòu)化數(shù)據(jù)往往還達不到直接建模的要求,或者說雖然可用于建模,但預(yù)測的效果往往并不理想,因為數(shù)據(jù)具有“維度災(zāi)難”(“curse of dimensionality”)的特性,即觀測維度過多,導致樣本在高維空間出現(xiàn)分布稀疏而難以確定判別的邊界,降低預(yù)測效果。因此在正式建模之前必須要進行變量的選取。在R語言中,可以借助caret包的“varImp()”函數(shù)對變量重要性進行計算,選取影響力強的變量用于建模;此外,在處理大矩陣數(shù)據(jù)集時,可以借助“fa.varimax()”或“fa.promax()”函數(shù)進行主成分分析,對數(shù)據(jù)進行適度降維,其中前者使用正交旋轉(zhuǎn)法,后者使用斜交旋轉(zhuǎn)法。
4)模型訓練、預(yù)測與測試。這是統(tǒng)計建模的核心環(huán)節(jié),將對預(yù)處理后的數(shù)據(jù)進行建模。首先,根據(jù)數(shù)據(jù)類型選取合適的算法,不同的算法對數(shù)據(jù)的要求各不相同,例如,經(jīng)典最小二乘回歸要求特征值和標記值均為數(shù)值型變量;二元logistic回歸要求標記值為二元分類變量;而隨機森林(random Forest)模型,變量類型既可以是連續(xù)的,也可以是離散的。數(shù)據(jù)類型與算法高度匹配,建模時需格外注意。其次,將數(shù)據(jù)切分為訓練集與測試集,通過構(gòu)建交叉驗證體系[2],依次進行模型訓練、預(yù)測和測試,重點觀察測試集的預(yù)測誤差,選取誤差最低的模型。在R中,不同的算法有各自的建模函數(shù),通常使用“predict()”命令擬合預(yù)測函數(shù),交叉驗證通過for()循環(huán)實現(xiàn)。
5)模型調(diào)試與優(yōu)化。對于同一數(shù)據(jù)集,不同的模型會體現(xiàn)出不同的預(yù)測效果,一個好的模型應(yīng)遵循“機理簡單、穩(wěn)健性好、適用性強、便于推廣”的準則[3],而根據(jù)“奧卡姆剃刀定律”(“Occam‘s razor”):“如無必要,勿增實體”,則是說在模型解釋力不變的情況下,首應(yīng)選取更簡潔的模型,而復雜的模型雖然具有較低的訓練誤差,但往往隨著模型復雜度的增加測試誤差逐漸上升,導致模型出現(xiàn)過度擬合,降低其泛華能力,削弱應(yīng)用價值。在R語言中,模型調(diào)試的方法極為靈活,不同的算法均有相對應(yīng)的調(diào)整參數(shù),通常第一步是模型間比較,即通過比較選取預(yù)測準確率最高的基本模型;第二部是模型內(nèi)調(diào)整,即在模型內(nèi)部進行參數(shù)調(diào)優(yōu),使準確率得到進一步提升。
6)模型應(yīng)用與部署。統(tǒng)計建模的目的不是創(chuàng)建一個好看的數(shù)學模型,而是要用于預(yù)測未來趨勢,指導業(yè)務(wù)開展。因此,廣義上的模型部署是指形成對未來趨勢預(yù)測的平臺和軟件,以及一攬子政策建議、營銷策略、工作標準等;狹義上的模型應(yīng)用僅指對未來的預(yù)測。R語言的優(yōu)勢在于利用靈活的計算函數(shù)建立離線模型,而在模型部署上,還需要協(xié)同相應(yīng)的產(chǎn)品經(jīng)理、運維人員、軟件開發(fā)和測試等部門的技術(shù)人員,以及掌握Linux,Java,Hadoop,Spark等技術(shù)。因此,鑒于模型部署較高的技術(shù)門檻,在企業(yè)內(nèi)部部署模型,需要多個部門多種人才的協(xié)同。
本文以某省運營商手機用戶數(shù)據(jù)和滿意度調(diào)研數(shù)據(jù)為數(shù)據(jù)源,借助R語言建立滿意度預(yù)測模型,探討R語言在統(tǒng)計建模上的具體應(yīng)用。具體實現(xiàn)步驟如下:
1)建模目標與假設(shè)。本案建模的目標是構(gòu)建手機用戶的滿意度預(yù)測模型,要求模型能夠預(yù)測識別“滿意用戶”(7~10分)、“一般不滿用戶”(4~6分)和“極端不滿用戶”(1~3分)。基本假設(shè)為:用戶的手機使用行為和人口屬性對其滿意度存在顯著性影響,以用戶客觀數(shù)據(jù)為特征值,滿意度為標記值構(gòu)建預(yù)測模型,預(yù)測提前量為3個月。
2)數(shù)據(jù)獲取與清洗。用戶滿意度由1~10分李克特量表回訪所得,樣本量5 000粒,按該省運營商手機用戶在各地市用戶規(guī)模的比例隨機抽樣。用戶客觀數(shù)據(jù)包括人口屬性和手機使用行為數(shù)據(jù),人口屬性為用戶性別和年齡,使用行為以3個月前的數(shù)值為統(tǒng)計時間點,包括:用戶累計入網(wǎng)月數(shù),是否更換套餐,當前套餐使用月數(shù),會員等級,月租費用,月ARPU(每用戶平均收入)值,月流量,月總通話時長,月短信數(shù)量,客觀數(shù)據(jù)由運營商數(shù)據(jù)庫提取。將滿意度數(shù)據(jù)與客觀數(shù)據(jù)進行一對一匹配,形成結(jié)構(gòu)化數(shù)據(jù)集,刪除缺失值,主要代碼如下(“#”后為代碼解釋):
df<-read.csv(file=“whole.province.csv”,header = T) # 讀取數(shù)據(jù)
colSums(is.na(df)) # 查看缺失值在變量中的分布
df2 <-df[complete.cases(df),] # 刪除缺失值
3)變量篩選與降維。對清洗后的數(shù)據(jù)集進行維度約減,保留強維度,去除弱維度,利用決策樹算法和caret包進行變量篩選,主要代碼如下:
fit.rpart<- rpart(滿意度~ ., data = df2, cp=0.001) # 決策樹初步建模
plotcp(fit.rpart) # 繪制CP(復雜性參數(shù))圖見圖1。

cptable$CP[which.min(cptable$xerror)] # 取誤差值達到最小時的CP值
fit.rpart2<-rpart(滿意度~.,data=df2,cp=0.002831503) # 決策樹二次建模
fit.Imp<-varImp(fit.rpart2,scale=T,surrogates=F,competes=T) #自變量重要性計算
ggplot(fit.Imp,aes(x=name,y=Overall))+geom_bar(aes(fill=name), stat=“identity”)+coord_flip() # 自變量重要性直方圖見圖2。

4)模型訓練、預(yù)測與測試。如前文所示,影響力較強的特征值依次是當前套餐使用月數(shù)、月短信、累計入網(wǎng)月數(shù)、月流量、年齡、月ARPU、均為數(shù)值型向量;標記值“滿意度”為3分類變量。重新整合數(shù)據(jù)集,建立五折交叉驗證,選取合適算法進行模型探索,以線性判別為例,經(jīng)計算其訓練集準確率為86.17%,測試集準確率為86.15%,主要代碼如下:

5)模型調(diào)試與優(yōu)化。本案適用的模型算法包括線性判別、隨機森林、樸素貝葉斯、神經(jīng)網(wǎng)絡(luò)、支持向量機和自助整合等等,通過多種算法建模,匯總模型探索結(jié)果,如圖3所示,在訓練集準確率上,隨機森林最高;在測試集準確率上,隨機森林、支持向量機、線性判別均有不錯的表現(xiàn)。具體模型效果表現(xiàn)見圖3。

綜合預(yù)測效果,選用隨機森林進行進一步調(diào)試優(yōu)化。引入建模參數(shù)importance計算自變量權(quán)重,引入proximity參數(shù)計算樣本間近似值,引入ntrees參數(shù)并設(shè)置隨機樹為1 000棵,再次擬合模型,測試集準確率達到86.19%,較此前有所提升。主要代碼如下:

6)模型應(yīng)用與部署。至此R語言建模的工作已完成,接下來需要對模型進行軟件開發(fā)和測試,嵌入運營商業(yè)務(wù)系統(tǒng)實施預(yù)測,實時了解用戶未來3個月的滿意度情況,以及不滿用戶的分布,并進行及時的關(guān)懷安撫工作。
統(tǒng)計建模是一套完整的對數(shù)據(jù)進行獲取、清洗、描述、解釋,探索規(guī)律并最終做出預(yù)測的過程,它有著嚴謹?shù)睦碚摬襟E,并依賴于專業(yè)的分析工具和方法。相對于其他統(tǒng)計分析工具,R語言在統(tǒng)計建模方面有著開源免費、處理靈活、函數(shù)功能健全等優(yōu)勢,但對編程和英語能力有較高的要求,同時在模型的部署上,技術(shù)門檻較高,需要協(xié)同多種技術(shù)背景和專業(yè)領(lǐng)域的人才共同參與實施。
[1] 米子川. 依數(shù)據(jù)進行統(tǒng)計建模的三個基本分析層次 [J]. 統(tǒng)計教育, 2010(10): 18-21.
[2] 吳喜之. 復雜數(shù)據(jù)統(tǒng)計方法——基于R的應(yīng)用[M].北京:中國人民大學出版社, 2013: 33.
[3] 宋海燕, 曾憲福; 張立欣. 統(tǒng)計建模的探討 [J]. 榆林學院學報, 2012(6): 29-31. ◆