美文网首页
python kmeans聚类案例

python kmeans聚类案例

作者: 美琦miki视觉笔记 | 来源:发表于2020-04-04 19:21 被阅读0次

    关于聚类不错的一个代码和分析:

    https://blog.csdn.net/weixin_43060843/article/details/102802588?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-10&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-10

    KMeans算法项目实战:航空公司客户价值分析
    原创置顶 初一· 最后发布于2019-10-30 16:25:24 阅读数 149 收藏
    展开
    一、背景与目标
      通过对客户进行分类,区分无价值客户、高价值客户,企业针对不同价值的客户制定优化的个性化服务方案,采取不同营销策略,将有限营销资源集中于高价值用户,实现企业利润最大化目标。
      数据为某航空公司的用户档案信息与航班记录。

    字段名称 字段说明
    FFP_DATE 入会时间
    LOAD_TIME 观测窗口的结束时间
    FLIGHT_COUNT 观测窗口内的飞行次数
    avg_discount 平均折扣率
    SEG_KM_SUM 观测窗口内的总飞行公里数
    LAST_TO_END 最后一次成绩时间至观测窗口结束时长
    SUM_YR 观测窗口的票价收入
    二、分析方法与过程
      本案例的目标是客户价值识别,即通过航空公司客户数据识别不同价值的客户。识别客户价值应用最广泛的模型是通过3个指标(最近消费时间间隔(Recency)、消费频率(Frequency)和消费金额(Monetary))来进行客户细分,识别出高价值的客户,简称RFM模型。
      在RFM模型中,消费金额表示在一段时间内,客户购买该企业产品金额的总和。由于航空票价收到运输距离、舱位等级等多种因素影响,同样消费金额的不同旅客对航空公司的价值是不同的。因此,我们使用客户在一定时间内累计的飞行里程M和客户在一定时间内乘坐舱位所对应的的折扣系数的平均值C两个指标代替消费金额。此外,考虑航空公司会员入会时间的长短在一定程度上能够影响客户价值,所以在模型中增加客户关系长度L,作为区分客户的另一个指标。
      本案例将客户长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C五个指标作为航空公司识别客户价值指标,记为LRFMC指标。
      通过对航空公司客户价值的LRFMC模型的五个指标进行K-Means聚类,识别出最有价值客户。

    三、代码实现过程
    1.数据探索
    import numpy as np
    import pandas as pd

    数据读取

    data = pd.read_csv("air_data.csv")

    数据探索

    explore = data.describe(percentiles=[],include='all').T
    explore['null'] = len(data)-explore["count"]
    explore = explore[['null','max','min']]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    2.数据预处理
      通过数据探索分析,发现数据中存在缺失值与异常值。比如:票价最小值为0,折扣率最小值为0,总飞行公里数大于0的记录。由于原始数据量大,选择进行丢弃处理。

    ①.数据清洗

    数据清洗

    data = data[data['SUM_YR_1'].notnull()*data['SUM_YR_1'].notnull()]

    index1 = data['SUM_YR_1'] != 0
    index2 = data['SUM_YR_2'] != 0
    index3 = (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0)
    data = data[index1 | index2 | index3]
    1
    2
    3
    4
    5
    6
    7
    ②.属性规约
      挑选出LRFMC模型需要的字段,删除不相关的属性。

    data = data[['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','avg_discount','SEG_KM_SUM','LAST_TO_END']]
    1
    ③.数据变换
      原始数据中并没有直接给出LRFMC五个指标,需要通过原始数据进行计算这五个指标:

    L = LOAD_TIME - FFP_DATE   会员入会时间距观测窗口结束的月数【单位:月】
    R = LAST_TO_END  客户最近一次乘坐公司飞机距观测窗口结束的月数【单位:月】
    F = FLIGHT_COUNT  客户在观测窗口内乘坐公司飞机的次数【单位:次】
    M = SEG_KM_SUM  观测时间内累计飞行里程【单位:公里】
    C = AVG_DISCOUNT  观测时间内乘坐舱位对应的折扣系数的平均值【单位:无】

    data["L"]= round(pd.to_timedelta(pd.to_datetime(data["LOAD_TIME"]) - pd.to_datetime(data["FFP_DATE"])).dt.days/30,2)
    data["R"] = round((data['LAST_TO_END']/30).max(),2)
    data["F"] = data["FLIGHT_COUNT"]
    data["M"] = data["SEG_KM_SUM"]
    data["C"] = round(data["avg_discount"],2)
    clean_data = data[["L","R","F","M","C"]]
    1
    2
    3
    4
    5
    6
    ④.数据标准化
      指标数据提取后,发现5个指标的取值范围数据差异较大,为了消除数量级数据带来的影响,需要对数据进行标准化处理。

    zscore_data = (clean_data-clean_data.mean())/clean_data.std()
    zscore_data.columns = ["Z" + i for i in zscore_data.columns]
    zscore_data.head()
    1
    2
    3

    3.模型构建
    使用K-Means聚类算法对客户数据进行客户分群,娶成5类。

    from sklearn.cluster import KMeans # 导入K均值聚类算法
    k = 5 # 需要进行的聚类类别数
    kmodel = KMeans(n_clusters=k,n_jobs=4)
    kmodel.fit(zscore_data) # 训练模型

    kmodel.cluster_centers_ # 查看聚类中心
    r1 = pd.Series(kmodel.labels_).value_counts() # 统计分类情况
    r2 = pd.DataFrame(kmodel.cluster_centers_) # 聚类中心
    1
    2
    3
    4
    5
    6
    7
    8

    4.可视化
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    myfont = mpl.font_manager.FontProperties(fname='SimHei.ttf')

    r1 = pd.Series(kmodel.labels_).value_counts() # 统计各个类别的数目
    r2 = pd.DataFrame(kmodel.cluster_centers_)
    r = pd.concat([r2, r1], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别下的数目

    fig = plt.figure(figsize=(10,8))
    ax = fig.add_subplot(1,1,1,polar = True)
    for i,data in enumerate(r.iloc[:,:-1].values):
    angle = np.linspace(0, 2*np.pi, len(data), endpoint=False)
    angles = np.concatenate((angle, [angle[0]]))
    data = np.concatenate((data, [data[0]]))

    ax.set_thetagrids(angles*180/np.pi, label, fontproperties = myfont) #设置网格标签
    ax.plot(angles,data,"o-")
    ax.set_theta_zero_location('NW') #设置极坐标0°位置
    ax.set_rlim(-1,2.5) #设置显示的极径范围
    ax.fill(angles,data,facecolor='g', alpha=0.2) #填充颜色
    # ax1.set_rlabel_position('255') #设置极径标签位置
    ax.set_title("客户群特征分析图",fontproperties = myfont,fontsize=16,) #设置标题
    

    plt.show()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    三.客户价值分析
      由上述的特征分析的图说明每个客户群都有显著不同的表现特征,基于该特征描述,定义五个等级的客户类型:

    重要保持客户:这类客户的平均折扣率C较高,最近乘坐过本公司航班R低,乘坐的次数F或里程M较高。他们是航空公司的高价值客户,是最为理想的客户类型,对航空公司的贡献最大,所占比例却较小。航空公司应优先将资源投放到他们身上。
    重要发展客户:这类客户的平均折扣率C较高,最近乘坐过本公司航班R低,但乘坐次数F或乘坐里程M较低。这类客户入会时间L短,他们是航空公司的潜在客户。虽然这类客户的当前价值不是很高,但却有很大的发展潜力。
    重要挽留客户:这类客户过去所乘航班的平均折扣率C、乘坐次数F或者里程M较高,但是较长时间已经没有乘坐本公司的航班R或者乘坐频率变小。他们客户价值变化的不确定性很高。航空公司应该采取一定的营销手段,延长客户的生命周期。
    一般与低价值客户:这类客户所乘航班的平均折扣率较低,较长时间没有乘坐过本公司航班,乘坐的次数或里程较低,入会时间短。他们是航空公司的一般用户或者低价值用户。
    项目参考:《Python数据分析与挖掘实战》

    相关文章

      网友评论

          本文标题:python kmeans聚类案例

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