以案例分析的形式,实践大数据分析与处理的生命周期过程。完成从数据的获取、数据预处理、数据分析到数据可视化几个阶段的工作,运用聚类分析的方法对航空客户进行分类,注意其分析模型的建立和分析的步骤,并对数据分析结果给出解释。
航空公司经常会对客户进行分类,那么怎样对客户分群,才能区分价值客户、无价值客户等,并对不同的客户群体实施个性化的营销策略,以实现利润最大化。
餐饮企业也会经常碰到此类问题。如何通过对客户的消费行为来评价客户对企业的贡献度,从而提高对某些客户群体的关注度,以实现企业利润的最大化。如何通过客户对菜品的消费明细,来判断哪些菜是招牌菜(客户必点),哪些又是配菜(点了招牌菜或许会点的菜品),以此来提高餐饮的精准采购。
聚类分析是指在没有给定划分类别的情况下,根据数据的相似度进行分组的一种方法,分组的原则是组内距离最小化而组间距离最大化。
K-means算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的K类别,采用距离作为相似性的评级指标,即认为两个对象的距离越近,其相似度越大。
创建K个点作为初始的质心点(随机选择)
当任意一个点的簇分配结果发生改变时
?? 对数据集中的每一个数据点
???? 对每一个质心
?????? 计算质心与数据点的距离
?????? 将数据点分配到距离最近的簇
???? 对每一个簇,计算簇中所有点的均值,并将均值作为质心。
根据航空公司目前积累的大量客户会员信息及其乘坐的航班记录,可以得到包括姓名、乘机的间隔、乘机次数、消费金额等十几条属性信息。
本情景案例是想要获取客户价值,识别客户价值应用的最广泛模型是RFM模型,三个字母分别代表Recency(最近消费时间间隔)、Frequency(消费频率)、Monetary(消费金额)这三个指标。结合具体情景,最终选取客户消费时间间隔R、消费频率F、消费金额M这三个指标作为航空公司识别客户价值的指标。
为了方便说明操作步骤,本案例简单选择三个指标进行K-means聚类分析来识别出最优价值客户。航空公司在真实的判断客户类别时,选取的观测维度要大得多。
根据该图可知客户群4是重要保持客户,客户群3是重要发展客户,客户群2是重要挽留客户,客户群1是一般客户,客户群5是低价值客户。
warnings.filterwarnings('ignore')? # 忽略警告
plt.rcParams['font.sans-serif'] = ['SimHei']? # 解决中文显示
plt.rcParams['axes.unicode_minus'] = False? # 解决符号无法显示
# 删除票价为0、平均折扣率不为0、总飞行公里数大于0的数据
t1 = data['SUM_YR_1']==0
t2 = data['SUM_YR_2']==0
t3 = data['avg_discount']>0
t4 = data['SEG_KM_SUM']>0
tt = []
for f in range(len(t1)):
??? if t1[f] & t2[f] & t3[f] & t4[f]==True :
?????? tt.append(f)
data = data.drop(tt,axis=0)
data = data.reset_index(drop = True)
print(data.shape)
# 取出我们要分析的列数据
data1 = data[['LOAD_TIME','FFP_DATE','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
print(data1)
# 会员入会时间距观测窗口结束的月数 = 观测窗口的结束时间 - 入会时间
m = (pd.to_datetime(data1['LOAD_TIME'])-pd.to_datetime(data1['FFP_DATE']))//30
data1['L']=m.dt.days
# 再取出我们需要的列数据
data2 = data1[['L','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
# 更改列名
data2 = data2.rename(columns={'L': 'ZL', 'LAST_TO_END': 'ZR','FLIGHT_COUNT':'ZF','SEG_KM_SUM':'ZM','avg_discount':'ZC'})
print(data2)
# 标准化处理
std_scale = preprocessing.StandardScaler().fit(data2[["ZL","ZR","ZF","ZM","ZC"]])
df_std = std_scale.transform(data2[["ZL","ZR","ZF","ZM","ZC"]])
df_data=pd.DataFrame(df_std)
df_data.columns=list(data2.columns)
print(df_data)
# 聚类
model = KMeans(n_clusters=5) # 构造聚类器
model.fit(df_std) # 聚类
label_pred = model.labels_ # 获取聚类标签
r1 = pd.Series(model.labels_).value_counts() # 统计各类的个数
r2 = pd.DataFrame(model.cluster_centers_)? # 获取聚类中心
r = pd.concat([r2,r1],axis=1) # 合并
r.columns = list(data2.columns) + ['类别数目']? # 加上列名
print(r)
# 根据r2绘制雷达图
labels = np.array(['ZL', 'ZR', 'ZF', 'ZM', 'ZC'])
labels = np.concatenate((labels, [labels[0]]))
N = len(r2)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
data = pd.concat([r2, r2.loc[:, 0]], axis=1)
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, polar=True)? # 参数polar, 以极坐标的形式绘制图形
# 画线
j = 0
for i in range(0, 5):
??? j = i + 1
??? ax.plot(angles, data.loc[i, :], 'o-', label="客户群" + str(j))
# 添加属性标签
ax.set_thetagrids(angles * 180 / np.pi, labels)
plt.title(u'客户特征雷达图')
plt.legend(loc='lower right')
plt.show()
1. 数据预处理是非常重要的一步,包括删除无效数据、处理缺失值,以及对特征进行筛选和转换等。这一步对于后续的数据分析和建模有着至关重要的影响。
2. 在数据分析过程中,我们可以通过一些统计方法(如均值、方差等)来观察数据的分布和变化,这对于我们理解数据特性和发现数据规律非常有帮助。
3. 聚类分析是一种常用的数据分析方法,它可以帮助我们根据数据的相似性将数据划分为不同的类别。在这个案例中,我们通过K-means聚类方法将客户划分为了5个不同的群体,并通过雷达图直观地展示了这些群体的特性。
4. 数据可视化是数据分析不可或缺的一部分,它可以帮助我们更好地理解数据和结果。在这个案例中,我们通过雷达图直观地展示了各个客户群体的特性,这对于我们理解客户群体的特点和差异非常有帮助。
5. 最后,需要注意的是,数据分析不是一成不变的,我们需要根据实际问题和数据的特性灵活选择和调整分析方法,以获取更准确和有用的结果。