航空公司客户价值聚类分析

航空公司客户价值聚类分析

  • 特征工程
  • K-means聚类
  • RFM模型
  • DBSCAN算法
描述

信息时代的来临使得企业营销焦点从产品中心转变成客户中心。具体地,对不同的客户进行分类管理,给予不同类型的客户制定优化的个性化服务方案,采取不同的营销策略。将有限的营销资源集中于高价值的客户,实现企业利润最大化

  1. 借助航空公司数据,对客户进行分类
  2. 对不同类别的客户进行特征分析,比较不同类别客户的价值
  3. 对不同价值的客户类别进行个性化服务,制定相应的营销策略
思路

image.png

数据
数据集中字段含义

image.pngimage.png

数据预处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import sklearn.preprocessing
import sklearn.cluster
air_data_path = "./dataset/air_data.csv"
air_data = pd.read_csv(air_data_path)
air_data.shape
(62988, 44)
air_data.head()
MEMBER_NOFFP_DATEFIRST_FLIGHT_DATEGENDERFFP_TIERWORK_CITYWORK_PROVINCEWORK_COUNTRYAGELOAD_TIME...ADD_Point_SUMEli_Add_Point_SumL1Y_ELi_Add_PointsPoints_SumL1Y_Points_SumRation_L1Y_Flight_CountRation_P1Y_Flight_CountRation_P1Y_BPSRation_L1Y_BPSPoint_NotFlight
0549932006/11/022008/12/246.北京CN31.02014/03/31...399921144521111006197603702110.5095240.4904760.4872210.51277750
1280652007/02/192007/08/036NaN北京CN42.02014/03/31...1200053288532884157682384100.5142860.4857140.4892890.51070833
2551062007/02/012007/08/306.北京CN40.02014/03/31...1549155202517114063612337980.5185190.4814810.4814670.51853026
3211892008/08/222008/08/235Los AngelesCAUS64.02014/03/31...034890348903722041861000.4347830.5652170.5517220.44827512
4395462009/04/102009/04/156贵阳贵州CN48.02014/03/31...2270464969649693388132103650.5328950.4671050.4690540.53094339

5 rows × 44 columns

air_data.dtypes
MEMBER_NO                    int64
FFP_DATE                    object
FIRST_FLIGHT_DATE           object
GENDER                      object
FFP_TIER                     int64
WORK_CITY                   object
WORK_PROVINCE               object
WORK_COUNTRY                object
AGE                        float64
LOAD_TIME                   object
FLIGHT_COUNT                 int64
BP_SUM                       int64
EP_SUM_YR_1                  int64
EP_SUM_YR_2                  int64
SUM_YR_1                   float64
SUM_YR_2                   float64
SEG_KM_SUM                   int64
WEIGHTED_SEG_KM            float64
LAST_FLIGHT_DATE            object
AVG_FLIGHT_COUNT           float64
AVG_BP_SUM                 float64
BEGIN_TO_FIRST               int64
LAST_TO_END                  int64
AVG_INTERVAL               float64
MAX_INTERVAL                 int64
ADD_POINTS_SUM_YR_1          int64
ADD_POINTS_SUM_YR_2          int64
EXCHANGE_COUNT               int64
avg_discount               float64
P1Y_Flight_Count             int64
L1Y_Flight_Count             int64
P1Y_BP_SUM                   int64
L1Y_BP_SUM                   int64
EP_SUM                       int64
ADD_Point_SUM                int64
Eli_Add_Point_Sum            int64
L1Y_ELi_Add_Points           int64
Points_Sum                   int64
L1Y_Points_Sum               int64
Ration_L1Y_Flight_Count    float64
Ration_P1Y_Flight_Count    float64
Ration_P1Y_BPS             float64
Ration_L1Y_BPS             float64
Point_NotFlight              int64
dtype: object
air_data.describe().T
countmeanstdmin25%50%75%max
MEMBER_NO62988.031494.50000018183.2137151.0015747.75000031494.50000047241.25000062988.000000
FFP_TIER62988.04.1021620.3738564.004.0000004.0000004.0000006.000000
AGE62568.042.4763469.8859156.0035.00000041.00000048.000000110.000000
FLIGHT_COUNT62988.011.83941414.0494712.003.0000007.00000015.000000213.000000
BP_SUM62988.010925.08125416339.4861510.002518.0000005700.00000012831.000000505308.000000
EP_SUM_YR_162988.00.0000000.0000000.000.0000000.0000000.0000000.000000
EP_SUM_YR_262988.0265.6896231645.7028540.000.0000000.0000000.00000074460.000000
SUM_YR_162437.05355.3760648109.4501470.001003.0000002800.0000006574.000000239560.000000
SUM_YR_262850.05604.0260148703.3642470.00780.0000002773.0000006845.750000234188.000000
SEG_KM_SUM62988.017123.87869120960.844623368.004747.0000009994.00000021271.250000580717.000000
WEIGHTED_SEG_KM62988.012777.15243917578.5866950.003219.0450006978.25500015299.632500558440.140000
AVG_FLIGHT_COUNT62988.01.5421541.7869960.250.4285710.8750001.87500026.625000
AVG_BP_SUM62988.01421.4402492083.1213240.00336.000000752.3750001690.27083363163.500000
BEGIN_TO_FIRST62988.0120.145488159.5728670.009.00000050.000000166.000000729.000000
LAST_TO_END62988.0176.120102183.8222231.0029.000000108.000000268.000000731.000000
AVG_INTERVAL62988.067.74978877.5178660.0023.37037044.66666782.000000728.000000
MAX_INTERVAL62988.0166.033895123.3971800.0079.000000143.000000228.000000728.000000
ADD_POINTS_SUM_YR_162988.0540.3169653956.0834550.000.0000000.0000000.000000600000.000000
ADD_POINTS_SUM_YR_262988.0814.6892585121.7969290.000.0000000.0000000.000000728282.000000
EXCHANGE_COUNT62988.00.3197751.1360040.000.0000000.0000000.00000046.000000
avg_discount62988.00.7215580.1854270.000.6119970.7118560.8094761.500000
P1Y_Flight_Count62988.05.7662577.2109220.002.0000003.0000007.000000118.000000
L1Y_Flight_Count62988.06.0731578.1751270.001.0000003.0000008.000000111.000000
P1Y_BP_SUM62988.05366.7205508537.7730210.00946.0000002692.0000006485.250000246197.000000
L1Y_BP_SUM62988.05558.3607049351.9569520.00545.0000002547.0000006619.250000259111.000000
EP_SUM62988.0265.6896231645.7028540.000.0000000.0000000.00000074460.000000
ADD_Point_SUM62988.01355.0062237868.4770000.000.0000000.0000000.000000984938.000000
Eli_Add_Point_Sum62988.01620.6958478294.3989550.000.0000000.000000345.000000984938.000000
L1Y_ELi_Add_Points62988.01080.3788825639.8572540.000.0000000.0000000.000000728282.000000
Points_Sum62988.012545.77710020507.8167000.002775.0000006328.50000014302.500000985572.000000
L1Y_Points_Sum62988.06638.73958512601.8198630.00700.0000002860.5000007500.000000728282.000000
Ration_L1Y_Flight_Count62988.00.4864190.3191050.000.2500000.5000000.7111111.000000
Ration_P1Y_Flight_Count62988.00.5135810.3191050.000.2888890.5000000.7500001.000000
Ration_P1Y_BPS62988.00.5222930.3396320.000.2581500.5142520.8150910.999989
Ration_L1Y_BPS62988.00.4684220.3389560.000.1679540.4767470.7283750.999993
Point_NotFlight62988.02.7281557.3641640.000.0000000.0000001.000000140.000000
##### 判断重复值:是否有重复的会员ID
air_data['MEMBER_NO'].duplicated()
0        False
1        False
2        False
3        False
4        False
         ...  
62983    False
62984    False
62985    False
62986    False
62987    False
Name: MEMBER_NO, Length: 62988, dtype: bool
air_data[air_data['MEMBER_NO'].duplicated()]
MEMBER_NOFFP_DATEFIRST_FLIGHT_DATEGENDERFFP_TIERWORK_CITYWORK_PROVINCEWORK_COUNTRYAGELOAD_TIME...ADD_Point_SUMEli_Add_Point_SumL1Y_ELi_Add_PointsPoints_SumL1Y_Points_SumRation_L1Y_Flight_CountRation_P1Y_Flight_CountRation_P1Y_BPSRation_L1Y_BPSPoint_NotFlight

0 rows × 44 columns

air_data.isna().any()
MEMBER_NO                  False
FFP_DATE                   False
FIRST_FLIGHT_DATE          False
GENDER                      True
FFP_TIER                   False
WORK_CITY                   True
WORK_PROVINCE               True
WORK_COUNTRY                True
AGE                         True
LOAD_TIME                  False
FLIGHT_COUNT               False
BP_SUM                     False
EP_SUM_YR_1                False
EP_SUM_YR_2                False
SUM_YR_1                    True
SUM_YR_2                    True
SEG_KM_SUM                 False
WEIGHTED_SEG_KM            False
LAST_FLIGHT_DATE           False
AVG_FLIGHT_COUNT           False
AVG_BP_SUM                 False
BEGIN_TO_FIRST             False
LAST_TO_END                False
AVG_INTERVAL               False
MAX_INTERVAL               False
ADD_POINTS_SUM_YR_1        False
ADD_POINTS_SUM_YR_2        False
EXCHANGE_COUNT             False
avg_discount               False
P1Y_Flight_Count           False
L1Y_Flight_Count           False
P1Y_BP_SUM                 False
L1Y_BP_SUM                 False
EP_SUM                     False
ADD_Point_SUM              False
Eli_Add_Point_Sum          False
L1Y_ELi_Add_Points         False
Points_Sum                 False
L1Y_Points_Sum             False
Ration_L1Y_Flight_Count    False
Ration_P1Y_Flight_Count    False
Ration_P1Y_BPS             False
Ration_L1Y_BPS             False
Point_NotFlight            False
dtype: bool
air_data.isnull().any()
MEMBER_NO                  False
FFP_DATE                   False
FIRST_FLIGHT_DATE          False
GENDER                      True
FFP_TIER                   False
WORK_CITY                   True
WORK_PROVINCE               True
WORK_COUNTRY                True
AGE                         True
LOAD_TIME                  False
FLIGHT_COUNT               False
BP_SUM                     False
EP_SUM_YR_1                False
EP_SUM_YR_2                False
SUM_YR_1                    True
SUM_YR_2                    True
SEG_KM_SUM                 False
WEIGHTED_SEG_KM            False
LAST_FLIGHT_DATE           False
AVG_FLIGHT_COUNT           False
AVG_BP_SUM                 False
BEGIN_TO_FIRST             False
LAST_TO_END                False
AVG_INTERVAL               False
MAX_INTERVAL               False
ADD_POINTS_SUM_YR_1        False
ADD_POINTS_SUM_YR_2        False
EXCHANGE_COUNT             False
avg_discount               False
P1Y_Flight_Count           False
L1Y_Flight_Count           False
P1Y_BP_SUM                 False
L1Y_BP_SUM                 False
EP_SUM                     False
ADD_Point_SUM              False
Eli_Add_Point_Sum          False
L1Y_ELi_Add_Points         False
Points_Sum                 False
L1Y_Points_Sum             False
Ration_L1Y_Flight_Count    False
Ration_P1Y_Flight_Count    False
Ration_P1Y_BPS             False
Ration_L1Y_BPS             False
Point_NotFlight            False
dtype: bool
boolean_filter = air_data['SUM_YR_1'].notnull() & air_data['SUM_YR_2'].notnull()
boolean_filter
0         True1         True2         True3         True4         True         ...  62983     True62984     True62985     True62986     True62987    FalseLength: 62988, dtype: bool
air_data = air_data[boolean_filter]
filter1 = air_data['SUM_YR_1'] != 0filter2 = air_data['SUM_YR_2'] != 0
air_data = air_data[filter1 | filter2]
air_data.shape
(62044, 44)
特征工程
RFM模型

对于客户价值分析的一个经典模型是 RFM 模型。

  • Recency: 最近消费时间间隔。
  • Frequency: 客户消费频率。
  • Monetary Value: 客户总消费金额。
变体 - LRFMC 模型
  • Length of Relationship: 客户关系时长,反映可能的活跃时长。
  • Recency: 最近消费时间间隔,反映当前的活跃状态。
  • Frequency: 客户消费频率,反映客户的忠诚度。
  • Mileage: 客户总飞行里程,反映客户对乘机的依赖性。
  • Coefficient of Discount: 客户所享受的平均折扣率,侧面反映客户价值高低。
load_time = datetime.datetime.strptime('2014/03/31','%Y/%m/%d')
load_time
datetime.datetime(2014, 3, 31, 0, 0)
ffp_dates = [datetime.datetime.strptime(ffp_date,'%Y/%m/%d') for ffp_date in air_data['FFP_DATE']]
length_of_relationship  = [(load_time-ffp_date).days for ffp_date in ffp_dates]
air_data['LEN_REL'] = length_of_relationship
移除非重要列, 只保留LRFMC模型所需的属性
features = ['LEN_REL','FLIGHT_COUNT','avg_discount','SEG_KM_SUM','LAST_TO_END']
data = air_data[features]

features = ['L','F','C','M','R']
data.columns = features
data.shape
(62044, 5)
data.head()
LFCMR
027062100.9616395807171
125971401.2523142936787
226151351.25467628371211
32047231.09087028133697
418161520.9706583099285
data.describe().T
countmeanstdmin25%50%75%max
L62044.01488.691090847.880920365.000000735.0000001278.0000002182.0000003437.0
F62044.011.97135914.1106192.0000003.0000007.00000015.000000213.0
C62044.00.7221800.1848330.1360170.6130850.7121620.8092931.5
M62044.017321.69474921052.728111368.0000004874.00000010200.00000021522.500000580717.0
R62044.0172.532703181.5261641.00000029.000000105.000000260.000000731.0

标准化

让不同属性的取值范围一致,即数据的标准化。标准化方法有极大极小标准化、标准差标准化等方法。

  • 对特征标准化,使得各特征的均值为0、方差为1
((data -data.mean(axis=0)) /data.std(axis=0)).describe().T
countmeanstdmin25%50%75%max
L62044.01.117739e-161.0-1.325294-0.888911-0.2484910.8176962.297857
F62044.03.664717e-171.0-0.706656-0.635788-0.3523130.21463614.246621
C62044.04.251071e-161.0-3.171310-0.590233-0.0541990.4713044.208225
M62044.0-5.863547e-171.0-0.805297-0.591263-0.3382790.19953726.761154
R62044.01.465887e-161.0-0.944948-0.790700-0.3720270.4818443.076511
ss = sklearn.preprocessing.StandardScaler(with_mean=True,with_std=True)
data = ss.fit_transform(data)
data
array([[ 1.43571897, 14.03412875,  1.29555058, 26.76136996, -0.94495516],       [ 1.30716214,  9.07328567,  2.86819902, 13.1269701 , -0.9119018 ],       [ 1.32839171,  8.71893974,  2.88097321, 12.65358345, -0.88986623],       ...,       [-0.14942206, -0.70666211, -2.68990622, -0.77233818, -0.73561725],       [-1.20618274, -0.70666211, -2.55464809, -0.77984321,  1.6056619 ],       [-0.47965977, -0.70666211, -2.39233833, -0.78668323,  0.60304353]])
data = pd.DataFrame(data,columns=features)
data.head()
LFCMR
01.43571914.0341291.29555126.761370-0.944955
11.3071629.0732862.86819913.126970-0.911902
21.3283928.7189402.88097312.653583-0.889866
30.6584810.7815911.99473012.540723-0.416102
40.3860359.9237161.34434613.898848-0.922920
```python data_db = data.copy() ```
data_db.describe().T
countmeanstdmin25%50%75%max
L62044.01.246004e-161.000008-1.325304-0.888919-0.2484930.8177032.297875
F62044.05.863547e-171.000008-0.706662-0.635793-0.3523160.21463714.246736
C62044.03.957894e-161.000008-3.171335-0.590238-0.0542000.4713084.208258
M62044.0-1.026121e-161.000008-0.805303-0.591268-0.3382820.19953926.761370
R62044.04.397660e-171.000008-0.944955-0.790706-0.3720300.4818483.076536

模型训练与 数据的预测

将客户群体细分为重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户五类

K-means聚类算法
  • 目标是把 \(n\) 个观测样本划分成 \(k\) 个群体(cluster),每个群体都有一个中心(mean)。
  • 每个样本仅属于其中一个群体,即与这个样本距离最近的中心的群体。
  • 符号: \(S_{i}\) 是一个群体, \(m_{i}\) 是群体 \(S_{i}\) 里的样本的中心, \(x_{i}\) 是一个样本点。
  • Assignment step (expectation step): 把每个样本分配给距离最近的中心的群体
  • Update step (maximization step): 根据当前的样本及其所属群体,重新计算各群体的中心
num_clusters = 5  # 设置类别为5
km = sklearn.cluster.KMeans(n_clusters=num_clusters, n_jobs=4)  #模型加载
km.fit(data) # 模型训练
/Users/gaozhiyong/Documents/pyenv/pyenv3.6/lib/python3.6/site-packages/sklearn/cluster/_kmeans.py:793: FutureWarning: 'n_jobs' was deprecated in version 0.23 and will be removed in 1.0 (renaming of 0.25).
  " removed in 1.0 (renaming of 0.25).", FutureWarning)

KMeans(n_clusters=5, n_jobs=4)
# 查看模型学习出来的5个群体的中心, 以及5哥群体所包含的样本个数
r1 = pd.Series(km.labels_).value_counts()
r2 = pd.DataFrame(km.cluster_centers_)
r = pd.concat([r2,r1],axis=1)
r.columns = list(data.columns) + ['counts']
r
LFCMRcounts
00.4820042.4787160.2986302.420403-0.7989595338
11.155203-0.091881-0.150515-0.099938-0.37378115858
20.110721-0.1896172.353276-0.185116-0.0151673684
3-0.700396-0.164828-0.234397-0.165888-0.41084224970
4-0.315083-0.574115-0.162570-0.5371851.68457912194
# 查看模型对每个样本预测的群体标签
km.labels_
array([0, 0, 0, ..., 3, 4, 4], dtype=int32)
尝试使用RFM模型
data_rfm = data[['R','F','M']]
data_rfm.head()
RFM
0-0.94495514.03412926.761370
1-0.9119029.07328613.126970
2-0.8898668.71894012.653583
3-0.4161020.78159112.540723
4-0.9229209.92371613.898848
km.fit(data_rfm) # 模型对 只包含rfm数据集训练
/Users/gaozhiyong/Documents/pyenv/pyenv3.6/lib/python3.6/site-packages/sklearn/cluster/_kmeans.py:793: FutureWarning: 'n_jobs' was deprecated in version 0.23 and will be removed in 1.0 (renaming of 0.25).
  " removed in 1.0 (renaming of 0.25).", FutureWarning)

KMeans(n_clusters=5, n_jobs=4)
km.labels_
array([3, 3, 3, ..., 2, 1, 2], dtype=int32)
r1 = pd.Series(km.labels_).value_counts()
r2 = pd.DataFrame(km.cluster_centers_)

rr = pd.concat([r2,r1],axis=1)
rr = pd.DataFrame(ss.fit_transform(rr))
rr.columns = list(data_rfm.columns) + ['counts']
rr
RFMcounts
0-0.475915-0.389200-0.3956680.146242
11.958565-0.918959-0.8934380.118661
2-0.129480-0.846644-0.8419951.712033
3-0.7277171.7722551.795436-1.187639
4-0.6254530.3825480.335664-0.789296
分析与决策

使用雷达图对模型学习出的5个群体特征进行可视化分析

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle,RegularPolygon
from matplotlib.path import Path
from matplotlib.projections.polar import PolarAxes
from matplotlib.projections import register_projection
from matplotlib.spines import Spine
from matplotlib.transforms import Affine2D
def radar_factory(num_vars,frame='circle'):
    # 计算得到 evenly-spaced axis angles
    theta = np.linspace(0,2*np.pi, num_vars, endpoint=False)
    
    class RadarAxes(PolarAxes):
        name= 'radar'
        # 使用1条线段连接指定点
        RESOLUTION = 1
        
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            # 旋转绘图,使第一个轴位于顶部
            self.set_theta_zero_location('N')
            
        def fill(self, *args, closed=True, **kwargs):
            """覆盖填充,以便默认情况下关闭该行"""
            return super().fill(closed=closed, *args, **kwargs)

        def plot(self, *args, **kwargs):
            """覆盖填充,以便默认情况下关闭该行"""
            lines = super().plot(*args, **kwargs)
            for line in lines:
                self._close_line(line)
                
        def _close_line(self, line):
            x, y = line.get_data()
            # FIXME: x[0], y[0] 处的标记加倍
            if x[0] != x[-1]:
                x = np.concatenate((x, [x[0]]))
                y = np.concatenate((y, [y[0]]))
                line.set_data(x, y)

        def set_varlabels(self, labels):
            self.set_thetagrids(np.degrees(theta), labels)

        def _gen_axes_patch(self):
            # 轴必须以(0.5,0.5)为中心并且半径为0.5
            # 在轴坐标中。
            if frame == 'circle':
                return Circle((0.5, 0.5), 0.5)
            elif frame == 'polygon':
                return RegularPolygon((0.5, 0.5), num_vars,
                                      radius=.5, edgecolor="k")
            else:
                raise ValueError("unknown value for 'frame': %s" % frame)
        
        def _gen_axes_spines(self):
            if frame == 'circle':
                return super()._gen_axes_spines()
            elif frame == 'polygon':
                # spine_type 必须是'left'/'right'/'top'/'bottom'/'circle'.
                spine = Spine(axes=self,
                              spine_type='circle',
                              path=Path.unit_regular_polygon(num_vars))
                # unit_regular_polygon 给出以1为中心的半径为1的多边形
                #(0,0),但我们希望以(0.5,
                #   0.5)的坐标轴。
                spine.set_transform(Affine2D().scale(.5).translate(.5, .5)
                                    + self.transAxes)
                return {'polar': spine}
            else:
                raise ValueError("unknown value for 'frame': %s" % frame)
    register_projection(RadarAxes)
    return theta
LCRFM模型作图
N = num_clusters
theta = radar_factory(N, frame='polygon')

data = r.to_numpy()
fig,ax = plt.subplots(figsize=(5,5), nrows = 1, ncols=1, subplot_kw=dict(projection='radar'))

fig.subplots_adjust(wspace=0.25,hspace=0.20,top=0.85,bottom=0.05)

# 去掉最后一列
case_data = data[:,:-1]
# 设置纵坐标不可见
ax.get_yaxis().set_visible(False)

# 图片标题
title = "Radar Chart for Different Means"
ax.set_title(title, weight='bold', size='medium', position=(0.5, 1.1),
             horizontalalignment='center', verticalalignment='center')
for d in case_data:
    # 画边
    ax.plot(theta, d)
    # 填充颜色
    ax.fill(theta, d, alpha=0.05)
# 设置纵坐标名称
ax.set_varlabels(features)

# 添加图例
labels = ["CustomerCluster_" + str(i) for i in range(1,6)]
legend = ax.legend(labels, loc=(0.9, .75), labelspacing=0.1)

plt.show()

png

RFM模型作图
theta = radar_factory(3, frame='polygon')

data = rr.to_numpy()

fig, ax = plt.subplots(figsize=(5, 5), nrows=1, ncols=1,
                         subplot_kw=dict(projection='radar'))
fig.subplots_adjust(wspace=0.25, hspace=0.20, top=0.85, bottom=0.05)

# 去掉最后一列
case_data = data[:, :-1]
# 设置纵坐标不可见
ax.get_yaxis().set_visible(False)
# 图片标题
title = "Radar Chart for Different Means"
ax.set_title(title, weight='bold', size='medium', position=(0.5, 1.1),
             horizontalalignment='center', verticalalignment='center')
for d in case_data:
    # 画边
    ax.plot(theta, d)
    # 填充颜色
    ax.fill(theta, d, alpha=0.05)
# 设置纵坐标名称
ax.set_varlabels(['R','F','M'])

# 添加图例
labels = ["CustomerCluster_" + str(i) for i in range(1,6)]
legend = ax.legend(labels, loc=(0.9, .75), labelspacing=0.1)

plt.show()

png

DBSCAN模型对LCRFM特征进行计算
from sklearn.cluster import DBSCAN

# Kagging debug
db = DBSCAN(eps=10,min_samples=2).fit(data_db.sample(10000))

DBSCAN_labels = db.labels_
DBSCAN_labels
array([0, 0, 0, ..., 0, 0, 0])
根据LCRFM结果进行分析

应实际业务对聚类结果进行分值离散转化,对应1-5分,其中属性值越大,分数越高:image.png

  1. 重要保持客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数高(F↑)或里程高(M↑):
这类客户机票票价高,不在意机票折扣,经常乘机,是最理想的客户类型。
公司应优先将资源投放到他们身上,维持这类客户的忠诚度。

  1. 重要发展客户

平均折扣率高(C↑),最近有乘机记录(R↓),乘机次数低(F↓)或里程低(M↓):
这类客户机票票价高,不在意机票折扣,最近有乘机记录,但总里程低,具有很大的发展潜力。
公司应加强这类客户的满意度,使他们逐渐成为忠诚客户。

  1. 重要挽留客户

平均折扣率高(C↑),乘机次数高(F↑)或里程高(M↑),最近无乘机记录(R↑):
这类客户总里程高,但较长时间没有乘机,可能处于流失状态。
公司应加强与这类客户的互动,召回用户,延长客户的生命周期。

  1. 一般客户

平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数高(F↓)或里程高(M↓),入会时间短(L↓):
这类客户机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度。
公司需要在资源支持的情况下强化对这类客户的联系。

  1. 低价值客户

平均折扣率低(C↓),最近无乘机记录(R↑),乘机次数高(F↓)或里程高(M↓),入会时间短(L↓):
这类客户与一般客户类似,机票票价低,经常买折扣机票,最近无乘机记录,可能是趁着折扣而选择购买,对品牌无忠诚度。

结果分析
  • 群体1的L属性最大

  • 群体2的L、C属性最小

  • 群体3的C属性上最大

  • 群体4的M、F属性属性最大,R属性最小

  • 群体5的R属性最大,F、M属性最小

  • 其中每项指标的实际业务意义为:

    • L:加入会员的时长。越大代表会员资历越久
    • R:最近一次乘机时间。越大代表越久没乘机
    • F:乘机次数。越大代表乘机次数越多
    • M:飞行总里程。越大代表总里程越多
    • C:平均折扣率。越大代表折扣越弱,0表示0折免费机票,10代表无折机票

重要保持客户:客户群4

重要发展客户:客户群3

重要挽留客户:客户群1

一般客户:客户群2

低价值客户:客户群5

决策
  • 重要发展客户、重要保持客户、重要挽留客户这三类客户其实也对应着客户生命周期中的发展期、稳定器、衰退期三个时期。
  • 从客户生命周期的角度讲,也应重点投入资源召回衰退期的客户。
  • 一般而言,数据分析最终的目的是针对分析结果提出并开展一系列的运营/营销策略,以期帮助企业发展。在本实例中,运营策略有三个方向:
    • 提高活跃度:提高一般客户、低价值客户的活跃度。将其转化为优质客户
    • 提高留存率:与重要挽留客户互动,提高这部分用户的留存率
    • 提高付费率:维系重要保持客户、重要发展客户的忠诚度,保持企业良好收入
    • 每个方向对应不同的策略,如会员升级、积分兑换、交叉销售、发放折扣券等手段
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanEyes.GZY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值