第7章 某移動公司客戶價值分析_第1頁
第7章 某移動公司客戶價值分析_第2頁
第7章 某移動公司客戶價值分析_第3頁
第7章 某移動公司客戶價值分析_第4頁
第7章 某移動公司客戶價值分析_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

乘風破浪,世界就在眼前第7章移動公司客戶價值分析并行計算與大數(shù)據(jù)研究所目錄

情景問題提出及分析7.1K-Means聚類算法簡介7.2

客戶價值分析過程7.37.1情景問題提出及分析TEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhereTEXTaddhere傳統(tǒng)移動通信業(yè)對客戶的管理以往是基于經(jīng)驗統(tǒng)計劃分,無法細分有意義的高價值貢獻客戶,差異化服務(wù)得不到預(yù)想的效果。因此,建立靈活、精確的客戶價值評估體系來辨別高價值客戶,提供差異化營銷服務(wù)成為了當前通信業(yè)發(fā)展的關(guān)鍵。本章中將以移動公司客戶價值為研究對象,根據(jù)通信企業(yè)客戶的特征及業(yè)務(wù)特點,利用Python來對客戶信息進行分析,對客戶群體進行分類,分析預(yù)測客戶的潛在消費行為,對客戶進行價值評估,在自己的客戶群體中挖掘出特有的潛在客戶。在分析的過程中,會使用到的技術(shù)有Numpy和Pandas,對數(shù)據(jù)進行清洗和預(yù)處理,以及存儲數(shù)據(jù);機器學習庫Scikit-learn,對客戶價值進行K-Means聚類算法分析,將客戶群體進行劃分;繪圖庫Matplotlib,將聚類結(jié)果可視化,直觀地展現(xiàn)結(jié)果。上述幾點是分析的大致步驟,也是讀者需要掌握的幾個Python相關(guān)技術(shù)。經(jīng)過本案例分析后得出的結(jié)果和可視化圖表,能有利于決策者可以快速得出結(jié)論,有針對性的制定業(yè)務(wù)方針和策略。7.2K-Means聚類算法簡介K-Means算法思想思想聚類k值的選擇肘部法K-Means算法原理原理K-Means算法流程流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere機器學習中依據(jù)有無監(jiān)督將學習算法分為兩大類問題,一個是分類,一個是聚類。分類是有監(jiān)督學習算法,其原始數(shù)據(jù)要有“標簽”,可以根據(jù)原始數(shù)據(jù)建立模型,確定新來的數(shù)據(jù)屬于哪一類,分類的目標都是事先已知的。聚類是無監(jiān)督學習算法,數(shù)據(jù)事先沒有“標簽”,不知道目標變量是什么,類別沒有像分類那樣被預(yù)先定義出來,其主要用于將相似的樣本自動歸到一個類別中,對于不同的相似度計算方法,會得到不同的聚類結(jié)果。K-Means聚類算法中,K表示將數(shù)據(jù)聚類成K個簇,Means表示每個聚類中數(shù)據(jù)的均值作為該簇的中心,也稱為質(zhì)心。K-Means聚類試圖將相似的對象歸為同一個簇,將不相似的對象歸為不同簇,這里需要一種對數(shù)據(jù)衡量相似度的計算方法,K-Means算法是典型的基于距離的聚類算法,采用距離作為相似度的評價指標,默認以歐式距離作為相似度測度,即兩個對象的距離越近,其相似度就越大。1.K-Means算法原理7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere首先需要確定常數(shù)k,常數(shù)k意味著最終的聚類類別數(shù),在確定了k值后,隨機選定k個初始點為質(zhì)心,并通過計算每一個樣本點與質(zhì)心之間的相似度(這里為歐式距離),根據(jù)點到質(zhì)心歐氏距離大小,可以確定每個樣本點應(yīng)該和哪一個質(zhì)心歸為同一類數(shù)據(jù),接著,根據(jù)這一輪的聚類結(jié)果重新計算每個類別的質(zhì)心(即類中心),再對每一個點重新歸類,重復(fù)以上分類過程,直到質(zhì)心不再改變,就最終確定了每個樣本所屬的類別以及每個類的質(zhì)心。由于每次都要計算所有的樣本與每一個質(zhì)心之間的相似度,故在大規(guī)模的數(shù)據(jù)集上K-Means算法的收斂速度比較慢。2.K-Means算法思想7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere數(shù)據(jù)初始狀態(tài)如下圖所示。3.K-Means算法流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere(1)選擇聚類的個數(shù)k,此時會生成k個類的初始中心,例如:k=3,生成k個聚類中心點,如下圖所示。3.K-Means算法流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere(2)計算所有樣本點到聚類中心點的距離,根據(jù)遠近進行聚類,將樣本歸到距離最短的中心所在的類之中,如下圖所示。3.K-Means算法流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere(3)更新每個聚類的質(zhì)心,迭代進行聚類,如下圖所示。3.K-Means算法流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere(4)重復(fù)第2、3步直到滿足收斂要求,如下圖所示。通常就是k個中心點不再改變即可,否則繼續(xù)迭代。3.K-Means算法流程7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere一般k值可以根據(jù)業(yè)務(wù)的內(nèi)容來確定,但當業(yè)務(wù)沒有分為幾類的要求時,也可以根據(jù)肘部法來確定。如下圖所示,用函數(shù)圖像展示了兩種聚類平均畸變程度的變化,橫軸表示k值的選擇,值從1開始向右遞增,縱軸表示對應(yīng)的k值下所有聚類的平均畸變程度。4.聚類k值的選擇7.2

K-Means聚類算法簡介TEXTaddhereTEXTaddhereTEXTaddhere每個類的畸變程度是該類別的樣本到質(zhì)心位置距離的平方和。類內(nèi)部成員越是緊湊,那么該類的畸變程度就越低,類內(nèi)部的相似性就越大,但同時類與類之間的差異性也要越大,這樣聚類效果才越好。對于類與類間的差異性則要考察畸變程度的變化幅度,也就是圖像斜率的變化,當畸變程度的變化幅度突然快速減小,此時的點就是類與類間差異最大的k值。綜上,從k=1開始觀察可以發(fā)現(xiàn),最佳的點就是在類似于函數(shù)拐點的地方,也就是k=3的點。在k=3之后,隨著k值的增大,類的平均畸變程度變化的幅度開始越來越小,且k=3也是相對畸變程度較小的點,這就說明k=3是一個比較好的k值。4.聚類k值的選擇7.3客戶價值分析過程標準化處理將與處理后需要的特征數(shù)據(jù)標準化處理數(shù)據(jù)可視化及分析Matplotlib繪圖可視化數(shù)據(jù)預(yù)處理數(shù)據(jù)清洗、規(guī)約等操作K-Means聚類分析用sklearn建模分析7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhere在Excel中打開數(shù)據(jù)集后的客戶信息樣本展示如下圖所示。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhereRFM模型是衡量客戶價值和客戶創(chuàng)利能力的重要工具和手段。該模型通過客戶活躍程度和交易金額的貢獻,進行客戶價值細分。RFM模型主要根據(jù)以下三個指標來分析客戶價值:①R(Recency):最近一次交易時間間隔。基于最近一次交易日期計算的一個值,距離當前日期越近,價值越高。②F(Frequency):客戶在最近一段時間內(nèi)交易次數(shù)?;诮灰最l率計算的一個值,交易頻率越高,價值越高。③M(Monetary):客戶最近一段時間內(nèi)交易金額?;诮灰捉痤~計算的一個值,交易金額越高,價值越高。在本案例中,將根據(jù)R、F、M三個指標來進行K-Means聚類分析,將客戶劃分為相應(yīng)的幾大群體,這三個指標在本案例中的含義分別設(shè)定為R(最后一次消費距提數(shù)日時間)、F(月均消費次數(shù))、M(月均消費金額)。接著對聚類后RFM每個維度上取平均值(也就是聚類中心),再根據(jù)RFM三個指標組成的元組判斷每個群體分別屬于哪種價值類別的客戶。(1)了解RFM分析模型7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhere首先,創(chuàng)建一個用于本章代碼運行的工作目錄,將準備好的數(shù)據(jù)集拷貝到此工作目錄下,數(shù)據(jù)文件名命名為“RFM聚類分析.xlsx”,然后在JupyterNotebook中將數(shù)據(jù)讀入以進行后續(xù)分析預(yù)處理。(2)數(shù)據(jù)準備(3)讀入數(shù)據(jù)采用讀入Excel文件數(shù)據(jù)的方法讀入數(shù)據(jù),并且導(dǎo)入本次數(shù)據(jù)分析中所需要的庫。如果目標文件格式為csv的話將read_excel()函數(shù)改為read_csv()函數(shù)即可,兩個函數(shù)都返回一個DataFrame型數(shù)據(jù)對象。這里因為數(shù)據(jù)集已在當前工作目錄,所以只需給read_excel()函數(shù)傳遞文件名參數(shù)即可,Python會在當前工作目錄中查找指定文件,如果不在當前工作目錄,則需要提供相對文件路徑或絕對文件路徑。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhere(3)讀入數(shù)據(jù)importpandasaspdimportmatplotlib.pyplotaspltfromsklearn.clusterimportKmeans

#導(dǎo)入數(shù)據(jù)datafile="RFM聚類分析.xlsx"data=pd.read_excel(datafile)(4)數(shù)據(jù)探索這一步的目的主要是觀察當前的數(shù)據(jù)集,根據(jù)觀察到的結(jié)果來探索規(guī)律與問題,進而對數(shù)據(jù)集進一步的清洗和預(yù)處理。首先,展示當前數(shù)據(jù)的前10行進行初步觀察。data.head(10)7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhere(4)數(shù)據(jù)探索在JupyterNotebook中可以看到以下信息,如圖7-8所示。在前10行中可以看到有多條數(shù)據(jù)包含0值,暫時沒有缺失值的存在。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理TEXTaddhereTEXTaddhereTEXTaddhere(4)數(shù)據(jù)探索其次,統(tǒng)計數(shù)據(jù)的行數(shù)和列數(shù),可以看到一共是301行數(shù)據(jù),12列屬性。#查看行列數(shù)統(tǒng)計print(data.shape)接著,觀察當前DataFrame的整體描述信息以及各列數(shù)據(jù)的匯總統(tǒng)計集合,輸出結(jié)果分別如下兩圖所示。#查看整體描述信息print(())7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(4)數(shù)據(jù)探索在左圖中可以看到當前DataFrame的各種信息概覽,例如各列名稱、行數(shù)、數(shù)據(jù)類型、列索引、列非空值個數(shù),以及所有數(shù)據(jù)所占內(nèi)存大小。從這些信息中可以發(fā)現(xiàn),各列的數(shù)據(jù)類型已符合要求,不用再進行數(shù)據(jù)類型轉(zhuǎn)換,且每列數(shù)據(jù)不存在空值,暫不需要對缺失值進行處理。在右圖中可以看到當前數(shù)據(jù)各列的快速綜合統(tǒng)計結(jié)果,例如計數(shù),均值,標準差,最小值,四分位數(shù),最大值這些信息,后續(xù)的工作中也許可以用到。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(5)數(shù)據(jù)缺失值處理在上一步的數(shù)據(jù)探索中,通過()函數(shù)已經(jīng)知道當前數(shù)據(jù)集中沒有空值,也就是沒有缺失值的存在。但如果想單獨的對數(shù)據(jù)的缺失值進行統(tǒng)計,可以用isnull()函數(shù)和sum()函數(shù)結(jié)合一起來統(tǒng)計每列缺失值數(shù)量,結(jié)果如下圖所示。#統(tǒng)計數(shù)據(jù)缺失值data.isnull().sum()7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值首先需要檢測有哪些列存在0值,以便觀察出哪些列的0值會造成行數(shù)據(jù)的無效統(tǒng)計,統(tǒng)計結(jié)果如右圖所示。#統(tǒng)計有0值的數(shù)據(jù)列(data==0).any()接著觀察結(jié)果可以看到,除了user_id(用戶id),last_pay_time(最后一次消費時間),online_time(網(wǎng)絡(luò)在線時間)三列外,其他的列均存在0值。為了進一步觀察數(shù)據(jù),需要對每一列0值個數(shù)進行統(tǒng)計。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值通過對每列的各行數(shù)據(jù)進行遍歷判斷,可以統(tǒng)計出每列0值個數(shù),結(jié)果如右圖所示。#統(tǒng)計每一列0值數(shù)據(jù)的個數(shù)#遍歷data的每一列forcolindata.columns:

#count從0開始累加count=0

#如果值為0,count累加count=[count+1forxindata[col]ifx==0]

#輸出該列的0值個數(shù)

print(col+''+str(sum(count)))7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值在存在0值的列中,可以發(fā)現(xiàn)gender(性別),pay_num(消費金額),pay_times(消費次數(shù)),age(年齡)這四列的0值數(shù)很少,其他列的0值數(shù)很多,可以初步猜測這四列的0值可能是不正常的統(tǒng)計數(shù)值,而且根據(jù)每列的數(shù)據(jù)類別可以推斷,其他列的內(nèi)容出現(xiàn)0值是合理的,而這四列出現(xiàn)0值明顯是不合理的,因為性別和年齡不存在0值(性別在前面的觀察中可以看到存在0、1、2三個值,而0值數(shù)量極少,所以為異常值),消費次數(shù)和消費金額可以同時為0,但不能有一方為0,而另一方不為0。為了驗證猜想,可以把這四列中存在0值的行調(diào)出來觀察。首先,對于年齡和性別為0的行,兩者數(shù)量幾乎一樣,由此可猜測性別為0的數(shù)據(jù)行中年齡也同時為0,所以先將兩者都為0的行數(shù)調(diào)出。#調(diào)出gender與age兩列都為0值的行index1=(data["gender"]==0)&(data["age"]==0)data[index1]7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值結(jié)果如下圖所示。通過上面的結(jié)果可以看到,性別和年齡都為0的行一共有9行,占到了圖中統(tǒng)計結(jié)果中性別和年齡兩項的大多數(shù),同時這9行數(shù)據(jù)中除了性別和年齡兩列,其他列也基本為0,所以可以初步認為這9行數(shù)據(jù)是無效的臟數(shù)據(jù),可以刪除這些行。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值其次,對于消費次數(shù)和消費金額兩項,將至少有一方為0的數(shù)據(jù)行全部調(diào)出觀察。#將pay_num與pay_times有一方為0值的行調(diào)出index2=(data["pay_num"]==0)|(data["pay_times"]==0)data[index2]結(jié)果如右圖所示。根據(jù)該圖可以認為這8行為無效臟數(shù)據(jù),可以刪除這些行。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值最后,將以上兩種情況結(jié)合在一起,將這些無效數(shù)據(jù)行調(diào)出統(tǒng)計。結(jié)果如右圖所示。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(6)檢測和過濾異常值使用下面代碼刪除13條記錄后再次統(tǒng)計data的行列數(shù),輸出結(jié)果為(288,12),只剩下288行數(shù)據(jù),說明刪除數(shù)據(jù)成功。#刪除13條記錄data=data.drop(data[index3].index)data.shape7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(7)重復(fù)值處理使用下面代碼統(tǒng)計重復(fù)值。輸出結(jié)果為0,說明沒有重復(fù)的數(shù)據(jù)行。#統(tǒng)計重復(fù)值data.duplicated().sum()雖然整體沒有重復(fù)的數(shù)據(jù)行,但單獨對于user_id這列每一行數(shù)據(jù)內(nèi)容都是不能重復(fù)的,而其它行則沒有這個限制。使用下面代碼檢測出有兩行用戶id是重復(fù)的。

#統(tǒng)計user_id這一列的重復(fù)值data.duplicated(['user_id']).sum()7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(7)重復(fù)值處理使用drop()函數(shù)對這兩行予以刪除,并且統(tǒng)計data的行列數(shù),輸出結(jié)果為(286,12),只剩下286行說明刪除成功。#刪除重復(fù)值data=data.drop_duplicates(['user_id'])data.shape現(xiàn)在,data中已經(jīng)不存在不合理的數(shù)據(jù),我們將性別和年齡的人數(shù)統(tǒng)計后保存在gender和age兩個變量中,在后面數(shù)據(jù)可視化的內(nèi)容中可以用來觀察客戶年齡和性別上的人數(shù)的分布情況。#統(tǒng)計不同性別和不同年齡的人數(shù)gender=pd.value_counts(data['gender'])age=pd.value_counts(data['age'])7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(8)屬性規(guī)約經(jīng)過以上工作,數(shù)據(jù)中的缺失值,異常值和重復(fù)值均已排除,但現(xiàn)在的數(shù)據(jù)中屬性太多,接下來需要篩選出后面需要統(tǒng)計計算的列,單獨構(gòu)建一個DataFrame對象。根據(jù)RFM分析模型和K-Means算法,需要的屬性列分別為“pay_num”,“pay_times”,“l(fā)ast_pay_time”,“user_id”。#篩選屬性列data_select=data[['user_id','pay_num','pay_times','last_pay_time']]data_select.head()可以看到,選取后的結(jié)果如右圖所示,選取操作成功。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(8)屬性規(guī)約選取好的data_select是后續(xù)工作所直接需要的數(shù)據(jù)對象,需要對其列名做出調(diào)整,設(shè)置為中文,使后續(xù)的操作中對數(shù)據(jù)的觀察和使用變得更直觀。#重命名列名data_select.columns=['用戶id','消費金額','消費次數(shù)','最后一次消費,'時間']data_select.head()輸出結(jié)果前五行,如圖下圖所示,可以看到調(diào)整后的結(jié)果。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M首先,R、F、M三個結(jié)果都依賴于日期的計算,需要導(dǎo)入datetime模塊中的datetime類,并且生成本案例數(shù)據(jù)集統(tǒng)計的起始日期和提數(shù)日日期。fromdatetimeimportdatetime

#生成起始日期和提數(shù)日日期exdata_date=datetime(2016,7,20)start_date=datetime(2016,6,1)

#輸出兩個日期print(exdata_date)print(start_date)7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M輸出后可以看到生成的兩個日期為2016-07-2000:00:00和2016-06-0100:00:00,都為日期類數(shù)據(jù)。其次,開始計算R(最后一次消費距提數(shù)日時間),用7月20日減去最后一次消費時間即可。#轉(zhuǎn)化為可計算的日期類型數(shù)據(jù)data_select['最后一次消費時間']=pd.to_datetime(data_select['最后一次消費時間'])

#計算R(最后一次消費距提數(shù)日時間)data_select['R(最后一次消費距提數(shù)日時間)']=exdata_date-data_select['最后一次消費時間']7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M然后,計算F(月均消費次數(shù))。對于這一結(jié)果的計算,需要先計算出最后一次消費時間和數(shù)據(jù)統(tǒng)計的起始日期6月1日的天數(shù)差period_day,再將天數(shù)差按月?lián)Q算向上取整得出消費月數(shù)period_month,最后用期間的消費次數(shù)除以消費月數(shù)即可得出F的值。frommathimportceil#計算最后一次消費時間和起始日期的天數(shù)差period_day=data_select['最后一次消費時間']-start_date#創(chuàng)建空列表統(tǒng)計月數(shù)period_month=[]

#遍歷天數(shù),向上取整生成月數(shù)foriinperiod_day:period_month.append(ceil(i.days/30))7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M#第一次輸出月數(shù)統(tǒng)計print(period_month)?

#分割線print("#"*110)

#遍歷清除0值foriinrange(0,len(period_month)):#如果有月份值為0,令其為1ifperiod_month[i]==0:period_month[i]=1

#第二次輸出月數(shù)統(tǒng)計print(period_month)?7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M要使用向上取整的ceil()函數(shù),需要導(dǎo)入math模塊。建立一個空列表period_month來記錄period_day中每個元素換算為月后的結(jié)果。period_day中的元素不能直接用來計算,需要將其中的天數(shù)以代碼中i.days的形式作為數(shù)字提取出來計算。在?處輸出結(jié)果中,發(fā)現(xiàn)有0值的存在,這顯然是不行的,因為在計算月均消費次數(shù)中月數(shù)需要作為除數(shù),不能為0,采取循環(huán)遍歷將全部為0的值賦值為1即可,在?處輸出后發(fā)現(xiàn)沒有0值存在。兩次輸出結(jié)果如下圖所示。7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M最后,可用消費次數(shù)來除以period_month計算出F的值,同時用消費金額除以period_month也能直接計算出M(月均消費金額),最后輸出data_select查看計算結(jié)果,結(jié)果如下圖所示。#計算F(月均消費次數(shù))data_select['F(月均消費次數(shù))']=data_select['消費次數(shù)']/period_month

#計算M(月均消費金額)data_select['M(月均消費金額)']=data_select['消費金額']/period_monthdata_select7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(9)計算R、F、M7.3.1讀入數(shù)據(jù)并進行數(shù)據(jù)預(yù)處理(10)保存預(yù)處理完成數(shù)據(jù)至此,數(shù)據(jù)預(yù)處理基本完成。在去掉每個列標簽字符串前后的空格后,將數(shù)據(jù)保存為excel格式,并設(shè)置文件名為“移動公司客戶信息預(yù)處理.xlsx”。7.3.2標準化處理數(shù)據(jù)分析之前,通常需要先將預(yù)處理好的數(shù)據(jù)標準化(normalization),利用標準化后的數(shù)據(jù)進行數(shù)據(jù)分析。而之所以要進行數(shù)據(jù)標準化是因為在多指標評價體系中,由于各評價指標的性質(zhì)不同,通常具有不同的量綱和數(shù)量級。當各指標間的水平相差很大時,如果直接用原始指標值進行分析,就會突出數(shù)值較高的指標在綜合分析中的作用,相對削弱數(shù)值水平較低指標的作用。因此,為了保證結(jié)果的可靠性,需要指標數(shù)據(jù)進行標準化處理。我們采用Z-score標準化(zero-meannormalization)的方法進行標準化處理,這是最常使用的一種標準化方法。該方法基于預(yù)處理好數(shù)據(jù)的均值(mean)和標準差(standarddeviation)來對數(shù)據(jù)進行標準化。使用的計算公式為:標準化數(shù)據(jù)=(原數(shù)據(jù)-均值)/標準差7.3.2標準化處理讀入數(shù)據(jù)后展示數(shù)據(jù)的前十行,結(jié)果如下圖所示。#讀入預(yù)處理好的數(shù)據(jù)datafile="移動公司客戶信息預(yù)處理.xlsx"data=pd.read_excel(datafile,encoding="utf-8")data.head(10)(1)讀入數(shù)據(jù)7.3.2標準化處理聚類分析主要是對RFM三個指標進行聚類,所以標準化只用對這三列進行。將這三列提取出來,并且把索引設(shè)置為用戶id,使后續(xù)結(jié)果能與用戶id一一對應(yīng),方便定位具體用戶。結(jié)果如下圖所示。#提取三列cdata=data[['R(最后一次消費距提數(shù)日時間)','F(月均消費次數(shù))','M(月均消費金額)']]#修改索引cdata.index=data['用戶id’]cdata.head()(2)提取指標列并更改索引7.3.2標準化處理使用cdata.mean()函數(shù)可以計算每一列的均值,cadta.std()可以計算每一列的標準差,結(jié)合這兩個函數(shù)可以用標準化公式來對數(shù)據(jù)進行標準化處理。標準化處理代碼如下,結(jié)果如圖7-23所示。#標準化處理z_cdata=(cdata-cdata.mean())/cdata.std()#重命名列名z_cdata.columns=['R(標準化)','F(標準化)','M(標準化)']z_cdata.head()(3)標準化7.3.3使用K-Means算法對客戶進行聚類分析在使用K-Means算法進行聚類分析前,首先需要確定聚類的類別數(shù),也就是k的值。在7.2節(jié)中,對K-Means聚類算法介紹中已經(jīng)了解到,k值在沒有預(yù)先決定分為幾類的情況下,可以使用肘部法來確定可能的k值。肘部法模型構(gòu)造代碼如下。#SSE用來記錄每次聚類后樣本到中心的歐式距離SSE=[]

#分別聚類為1-9個類別forkinrange(1,9):estimator=KMeans(n_clusters=k)estimator.fit(z_cdata)#樣本到最近聚類中心的距離平方之和SSE.append(estimator.inertia_)(1)確定k值7.3.3使用K-Means算法對客戶進行聚類分析#設(shè)置x軸數(shù)據(jù)X=range(1,9)#設(shè)置字體格式plt.rcParams['font.sans-serif']=['MicrosoftYaHei']#開始繪圖plt.plot(X,SSE,'o-')plt.xlabel('k')plt.ylabel('SSE')plt.title("肘部圖")plt.show()繪制結(jié)果如右圖示。(1)確定k值7.3.3使用K-Means算法對客戶進行聚類分析想要進行聚類分析,需要導(dǎo)入機器學習庫sklearn中cluster模塊的KMeans類。#聚類分析kmodel=KMeans(n_clusters=4,n_jobs=4,max_iter=100,random_state=0)kmodel.fit(z_cdata)結(jié)果如下圖所示。(2)K-Means聚類分析7.3.3使用K-Means算法對客戶進行聚類分析#查看每條數(shù)據(jù)所屬的聚類類別kmodel.labels_結(jié)果如右圖所示。(3)提取整合結(jié)果#查看聚類中心kmodel.cluster_centers_結(jié)果如右圖所示。7.3.3使用K-Means算法對客戶進行聚類分析有了數(shù)據(jù)所屬類別label_和聚類中心坐標cluster_centers_后,可以整合構(gòu)建一個簡單的聚類結(jié)果。#統(tǒng)計所屬各個類別的數(shù)據(jù)個數(shù)r1=pd.Series(kmodel.labels_).value_counts()#找出聚類中心r2=pd.DataFrame(kmodel.cluster_centers_)

#連接后得到聚類中心對應(yīng)類別下的數(shù)目result=pd.concat([r2,r1],axis=1)

#重命名表頭result.columns=['R','F','M']+['各類別人數(shù)']result(3)提取整合結(jié)果7.3.3使用K-Means算法對客戶進行聚類分析結(jié)果如下圖所示。(3)提取整合結(jié)果7.3.3使用K-Means算法對客戶進行聚類分析根據(jù)k=4和k=3兩種情況的聚類結(jié)果,對比分析,選出聚類效果更好的k值。(4)分析兩種k值結(jié)果(5)將類別與客戶數(shù)據(jù)對應(yīng)在選定并整理好聚類結(jié)果后,需要將類別標簽與聚類時使用的標準化數(shù)據(jù)z_cdata和之前預(yù)處理好的數(shù)據(jù)data對應(yīng),做一個結(jié)果與原數(shù)據(jù)的整合,因為最終需要的是每個客戶所屬的類別信息,從而根據(jù)不同客戶采取不同的營銷手段。7.3.3使用K-Means算法對客戶進行聚類分析(5)將類別與客戶數(shù)據(jù)對應(yīng)#連接labels_與z_cdataKM_data=pd.concat([z_cdata,pd.Series(kmodel.labels_,index=z_cdata.index)],axis=1)data1=pd.concat([data,pd.Series(kmodel.labels_,index=data.index)],axis=1)#重命名列名data1.columns=list(data.columns)+['類別']KM_data.columns=['R','F','M']+['類別']

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論