K-means聚类分析案例---电信客户细分

作者: 南宫逸痕 | 来源:发表于2020-01-09 11:35 被阅读0次

    相关精彩专题链接: 数据成就更好的你

    一、整体概述

    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):中端日常用客户,总通话时间居中,工作日下班时间通话比例高;

    相关文章

      网友评论

        本文标题:K-means聚类分析案例---电信客户细分

        本文链接:https://www.haomeiwen.com/subject/cxlyactx.html