K-means聚类分析案例---电信客户细分
相关精彩专题链接: 数据成就更好的你
一、整体概述
1.分析流程
明确分析目的-------获取数据------数据探索与处理------数据建模------输出分析报告
2.目的
对移动用户进行细分,了解不同用户群体的消费习惯;
可对不同的用户群体制定相应的营销策略,对其进行差异化营销;
3.分析方法
样本量较大,采用K-means聚类,其算法原理如下:
1 随机选取k个中心点;
2 遍历所有数据,将每个数据划分到最近的中心点中;
3 计算每个聚类的平均值,并作为新的中心点;
4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代。
二、数据提取
#导入对应的模块
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.描述统计
data.describe()
根据统计描述结果,该数据集总共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值的继续增大而趋于平缓,也就是说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() #统计各个类别的数目
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=["工作日上班时期电话时长","工作日下班时期电话时长","周末电话时长","国际电话时长","总通话时长","平均每次通话时长","人数统计"]
result_avg["人员占比"]=result_avg["人数统计"]/sum(result_avg["人数统计"])
根据类别对各项求平均,解读分类结果。结果如下图: image.png
本案例共3395条记录,6个特征,采用K-means方法对其进行聚类分析,其聚类结果共划分为5类,针对电信客户的划分结果,可以了解用户的特点,可制定对应的营销策略,对其进行差异化营销。电信用户划分结果如下:
第一类(target=0):低端客户,人员基数大,其余各项平均值都很低;
第二类(target=1):长聊客户,每次通话时间长;
第三类(target=2):高端商用客户,工作日上班时间通话、国际电话时长、总通话时长这三项指标都是最高的;
第四类(target=3):中端商用客户,总通话时间居中,工作日上班时间通话比例高;
第五类(target=4):中端日常用客户,总通话时间居中,工作日下班时间通话比例高;