案例来源:《Python数据分析与挖掘实战》第7章
案例背景与挖掘目标
输入数据:
航空信息数据表(客户基本信息 + 乘机信息 + 积分信息)
挖掘目标:
- 借助航空公司客户数据,对客户进行分类。
- 对不同的客户类别进行特征分析,比较不同类客户的客户价值。
- 对不同价值的客户类别提供个性化服务,制定相应的营销策略。
分析方法与过程(选择的原则)
调用CRM中的客户价值模型
RFM模型的3个指标:
最近消费时间间隔(Recency)
消费频率(Frequency)消费金额(Monetary)
因应需求增加的指标:
客户关系长度(Long-Term)
飞行里程(Miles)
折扣系数的平均值(avg-disCount)
由于消费金额相同的情况下,选择短途+头等的客户,比选择长途+经济的客户价值要高,因此以 飞行里程 + 折扣系数平均值代替消费金额,作为判断客户价值的指标。
子任务规划
- 选择性抽取数据,新增数据抽取分别形成历史数据和增量数据
- 数据探索分析,数据预处理(分析缺失值与异常值,属性规约,清洗和变换)
- 客户价值分析(重要保持,重要发展,重要挽留,一般与低价值)
- 针对不同价值客户,采用不同的营销手段,提供定制化的服务
实验一
对L, R, F, M, C 五个指标进行z-score(标准差)标准化
实验二
应用K-Means算法对样本数据进行聚类分析
# 用read_excel() 读入数据 /data/zscoredata.xls
# 用mean() std(),获得LRFMC五个指标的平均值和标准差
# 使用z-score进行标准差标准化
import pandas as pd
from sklearn.cluster import KMeans
dpath = './demo/data/zscoredata.xls'
input_data = pd.read_excel(dpath)
input_data.describe()
# L R F M C
#count 62044.000000 62044.000000 62044.000000 62044.000000 62044.000000
#mean 49.673808 5.751064 11.971359 17321.694749 0.722319
#std 28.260073 6.050889 14.110619 21052.728111 0.184820
#min 12.230000 0.030000 2.000000 368.000000 0.140000
#25% 24.570000 0.970000 3.000000 4874.000000 0.610000
#50% 42.630000 3.500000 7.000000 10200.000000 0.710000
#75% 72.800000 8.670000 15.000000 21522.500000 0.810000
#max 114.630000 24.370000 213.000000 580717.000000 1.500000
input_data.mean()
#L 49.673808
#R 5.751064
#F 11.971359
#M 17321.694749
#C 0.722319
#dtype: float64
input_data.std()
#L 28.260073
#R 6.050889
#F 14.110619
#M 21052.728111
#C 0.184820
#dtype: float64
data = (input_data - input_data.mean(axis = 0)) / input_data.std(axis = 0)
# 截取最后五列作为KMeans的输入
# 调用KMeans,得到聚类标号和中心点
# 根据标号统计类别客户数,根据聚类中心点向量画出客户聚类中心向量图
ppdpath = './test/data/preprocesseddata.xls'
ppddata = pd.read_excel(ppdpath)
kinput = ppddata[ppddata.columns[-5:]]
k = 5
kmodel = KMeans(n_clusters= k, n_jobs= 4)
kmodel.fit(kinput)
kmodel.cluster_centers_ #聚类中心点
kmodel.labels_ #聚类标号
import numpy as np
unique, counts = np.unique(kmodel.labels_, return_counts=True) #统计类别会员数
GrpCounts = dict(zip(unique, counts))
print(GrpCounts)
import matplotlib.pyplot as plt
labels = kinput.columns
plot_data = kmodel.cluster_centers_
color = ['b','g','r','c','y']
angles = np.linspace(0,2*np.pi, k, endpoint=False)
plot_data = np.concatenate((plot_data, plot_data[:,[0]]), axis=1)
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
for i in range(len(plot_data)):
ax.plot(angles, plot_data[i], 'o-', color=color[i], label = u'Customers'+str(i), linewidth = 2)
ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties = "SimHei")
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties = "SimHei")
plt.legend(loc = 4)
plt.show()
# 用read_excel() 读入数据 /data/zscoredata.xls
# 用mean() std(),获得LRFMC五个指标的平均值和标准差
# 使用z-score进行标准差标准化
import pandas as pd
from sklearn.cluster import KMeans
dpath = './demo/data/zscoredata.xls'
input_data = pd.read_excel(dpath)
input_data.describe()
# L R F M C
#count 62044.000000 62044.000000 62044.000000 62044.000000 62044.000000
#mean 49.673808 5.751064 11.971359 17321.694749 0.722319
#std 28.260073 6.050889 14.110619 21052.728111 0.184820
#min 12.230000 0.030000 2.000000 368.000000 0.140000
#25% 24.570000 0.970000 3.000000 4874.000000 0.610000
#50% 42.630000 3.500000 7.000000 10200.000000 0.710000
#75% 72.800000 8.670000 15.000000 21522.500000 0.810000
#max 114.630000 24.370000 213.000000 580717.000000 1.500000
input_data.mean()
#L 49.673808
#R 5.751064
#F 11.971359
#M 17321.694749
#C 0.722319
#dtype: float64
input_data.std()
#L 28.260073
#R 6.050889
#F 14.110619
#M 21052.728111
#C 0.184820
#dtype: float64
data = (input_data - input_data.mean(axis = 0)) / input_data.std(axis = 0)
# 截取最后五列作为KMeans的输入
# 调用KMeans,得到聚类标号和中心点
# 根据标号统计类别客户数,根据聚类中心点向量画出客户聚类中心向量图
ppdpath = './test/data/preprocesseddata.xls'
ppddata = pd.read_excel(ppdpath)
kinput = ppddata[ppddata.columns[-5:]]
k = 5
kmodel = KMeans(n_clusters= k, n_jobs= 4)
kmodel.fit(kinput)
kmodel.cluster_centers_ #聚类中心点
kmodel.labels_ #聚类标号
import numpy as np
unique, counts = np.unique(kmodel.labels_, return_counts=True) #统计类别会员数
GrpCounts = dict(zip(unique, counts))
print(GrpCounts)
import matplotlib.pyplot as plt
labels = kinput.columns
plot_data = kmodel.cluster_centers_
color = ['b','g','r','c','y']
angles = np.linspace(0,2*np.pi, k, endpoint=False)
plot_data = np.concatenate((plot_data, plot_data[:,[0]]), axis=1)
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
for i in range(len(plot_data)):
ax.plot(angles, plot_data[i], 'o-', color=color[i], label = u'Customers'+str(i), linewidth = 2)
ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties = "SimHei")
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties = "SimHei")
plt.legend(loc = 4)
plt.show()