相關精彩專題鏈接: 數據成就更好的你
一、整體概述
1.分析流程
明確分析目的-------獲取數據------數據探索與處理------數據建模------輸出分析報告
2.目的
對移動用戶進行細分,了解不同用戶群體的消費習慣;
可對不同的用戶群體制定相應的營銷策略,對其進行差異化營銷;
3.分析方法
樣本量較大,采用K-means聚類,其算法原理如下:
1 隨機選取k個中心點;
2 遍歷所有數據,將每個數據劃分到最近的中心點中;
3 計算每個聚類的平均值,并作為新的中心點;
4 重復2-3,直到這k個中線點不再變化(收斂了),或執(zhí)行了足夠多的迭代。
二、數據提取
#導入對應的模塊
import numpy as np
import pandas as pd
import matplotlib
from matplotlib import pyplot as plt
import seaborn as sns
from sklearn import preprocessing
from sklearn.cluster import KMeans
matplotlib.rcParams['font.sans-serif'] = [u'SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#數據提取
data=pd.read_csv(r"data\tel.csv",index_col=0)
data.head(5)
image.png
三、數據探索與處理
1.描述統(tǒng)計
data.describe()
根據統(tǒng)計描述結果,該數據集總共3395條數據,該數據沒有缺失值,因此沒必要做缺失值處理,該數據的索引是客戶id編號,因此該數據也沒重復值出現。
image.png
2.變量相關性分析
#.相關性分析
corr=data_std.corr(method="spearman")
sns.heatmap(corr) #相關性熱力圖
image.png
image.png
相關性分析:Total_mins(總通話時長) 和 Peak_mins(工作日上班時期電話時長)的相關性比較高,相關系數為 0.923663,在做聚類分析時,將排除變量Total_mins,相關系數較高,會對聚類結果產生不利影響。
3.數據標準化
columns1=['Peak_mins', 'OffPeak_mins', 'Weekend_mins', 'International_mins', 'average_mins']
data_std=pd.DataFrame(preprocessing.scale(data[columns1]),
columns=columns1,
index=data.index)
data_std.head(5)
為了消除指標之間的量綱影響,需要進行數據標準化處理。標準化的輸出結果如下:image.png
四、數據建模
1.K-means算法中K值的確定
K值可以采用經驗值、手肘法、輪廓系數法等方法確定。本案例采用手肘法確定K值。
手肘法的核心思想是:
隨著聚類數k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和SSE自然會逐漸變小。并且,當k小于真實聚類數時,由于k的增大會大幅增加每個簇的聚合程度,故SSE的下降幅度會很大,而當k到達真實聚類數時,再增加k所得到的聚合程度回報會迅速變小,所以SSE的下降幅度會驟減,然后隨著k值的繼續(xù)增大而趨于平緩,也就是說SSE和k的關系圖是一個手肘的形狀,而這個肘部對應的k值就是數據的真實聚類數。
#手肘法確定K值
SSE=[] #存儲k值對應的簇內誤差平方和
for i in range(1,8): #k取值1~8,做kmeans聚類
km=KMeans(n_clusters=i)
km.fit(data_std)
SSE.append(km.inertia_) #inertia簇內誤差平方和
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(range(1, 8),SSE,'o-')
plt.grid(True)
plt.show()
2.觀察手肘法的輸出結果
image.png
3.模型建立
#參照手肘法的輸出結果,這里的K值等于5
km=KMeans(n_clusters=5,init='k-means++',max_iter=1000)
target=km.fit_predict(data_std)
target_count= pd.Series(km.labels_).value_counts() #統(tǒng)計各個類別的數目
centers = pd.DataFrame(km.cluster_centers_) #找出聚類中心
#建立存儲 聚類中心和類別數目信息表
data_centers= pd.concat([centers,target_count], axis = 1)
data_centers.columns = list(data_std.columns) + [u'類別數目'] #重命名表頭
該數據被劃分為5類,其聚類中心可以把它存儲起來,作為下次聚類的初始中心點。聚類中心和類目數量如下:image.png
五、聚類結果分析
#將聚類結果帶入原始數據
data["target"]=target
result_avg=data.groupby("target").mean()
result_avg=result_avg.join(data.target.value_counts())
result_avg.columns=["工作日上班時期電話時長","工作日下班時期電話時長","周末電話時長","國際電話時長","總通話時長","平均每次通話時長","人數統(tǒng)計"]
result_avg["人員占比"]=result_avg["人數統(tǒng)計"]/sum(result_avg["人數統(tǒng)計"])
根據類別對各項求平均,解讀分類結果。結果如下圖:image.png
本案例共3395條記錄,6個特征,采用K-means方法對其進行聚類分析,其聚類結果共劃分為5類,針對電信客戶的劃分結果,可以了解用戶的特點,可制定對應的營銷策略,對其進行差異化營銷。電信用戶劃分結果如下:
第一類(target=0):低端客戶,人員基數大,其余各項平均值都很低;
第二類(target=1):長聊客戶,每次通話時間長;
第三類(target=2):高端商用客戶,工作日上班時間通話、國際電話時長、總通話時長這三項指標都是最高的;
第四類(target=3):中端商用客戶,總通話時間居中,工作日上班時間通話比例高;
第五類(target=4):中端日常用客戶,總通話時間居中,工作日下班時間通話比例高;







