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