K-means聚類分析案例---電信客戶細分

相關精彩專題鏈接: 數據成就更好的你

一、整體概述

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):中端日常用客戶,總通話時間居中,工作日下班時間通話比例高;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容