基于python分析航空公司客户价值《数据挖掘》 课程实验报告

一、实验目的

1)了解K-Means 聚类算法在客户价值分析实例中的应用。
2)利用pandas快速实现数据z-score(标准差)标准化以及用scikit-learn 的聚类库实现K-Means聚类。

二、实验环境

python

三、实验内容

本上机实验的内容包括以下两个方面:
依据航空公司客户价值分析的 LRFMC模型提取客户信息的 LRF"MC指标。对其进行标准差标准化并保存后,采用K-Means算法完成客户的聚类,分析每类客户的特征,从而获得每类客户的价值。
1)利用pandas库读入 LRFMC 指物文件,分别计算各个指标的均值与其标准差,使用标准差标准化公式完成LRFMC 指标的标准化,并将标准化后的数据进行保存。
2)编写 Python程序,完成客户的K-Means聚类,获得聚类中心与类标号。输出聚类中心的特征图,并统计每个类别的客户数。

四、方案设计

4.1总体设计和实现的思路:
将客户关系长度L、消费时间间隔R、消费频率F、飞行里程M和折扣系数的平均值C五个指标作为航空公司识别客户价值指标,记为LRFMC模型。通过LRFMC模型的五个指标进行KMeans聚类,识别出最有价值客户。
航空公司客户数据挖掘主要包括以下步骤:
(1)从航空公司的数据源中进行选择性抽取与新增数据抽取分别形成历史数据和增量数据。
(2)对步骤(1)中形成的两个数据集进行数据探索性分析与预处理,包括数据缺失值与异常值的探索分析,数据的属性规约、清洗和变换。
(3)利用步骤(2)中形成的已完成数据预处理的建模数据,基于旅客价值LRFMC模型进行客户分群,对各个客户群进行特征分析,识别出有价值的客户。
(4)针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化的服务。
(5)对客户进行流失分析,对流失客户和准流失客户进行用户画像。

4.2实验步骤:

数据探索分析

对数据进行缺失值与异常值分析,分析出数据的规律以及异常值。查找出每列属性观测值中的空值个数、最大值、平均值、最小值。

import pandas as pd

datafile = 'C:/Users/86199/Desktop/air_data.csv'   #  把air_data.csv 文件拖到桌面就行
resultfile = 'C:/Users/86199/Desktop/explore.csv'   #   什么都不用做,会在桌面生成报告,下面会用到
data = pd.read_csv(datafile, encoding='utf-8')
explore = data.describe().T
explore = explore[[ 'mean', 'std']]
explore.columns = [ '平均值', '方差']

explore.to_csv(resultfile)
explore.sort_values('方差', ascending=False)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第1张图片

数据清洗

通过数据探索分析,发现数据中存在缺失值,票价最小值为0的记录。由于原始数据量大,这类数据所占的比例较小,对于问题影响不大,因此对其进行丢弃处理。具体处理方法如下:
(1)丢弃票价为空的记录;
(2)丢弃票价为0的记录。

datafile = 'C:/Users/86199/Desktop/air_data.csv'
cleanedfile = 'C:/Users/86199/Desktop/data_cleaned.csv' # 生成清理后的数据

# 去掉票价为空的数据
data = data[(data['SUM_YR_1'].notnull()) & (data['SUM_YR_2'].notnull())]

# 保留票价非0、平均折扣率与总飞行公里数同时为0的记录
criteria1 = data['SUM_YR_1'] != 0
criteria2 = data['SUM_YR_2'] != 0

data = data[criteria1 | criteria2]

data.to_csv(cleanedfile, index=False)

属性规约

原始数据中属性太多,根据航空公司价值LRFMC模型,选择与LRFMC指标相关的6个属性:FFP_DATE、LOAD_TIME、FLIGHT_COUNT、AVG_DISCOUNT、SEG_KM_SUM、LAST_TO_END,删除与其不相关的属性。

datafile = 'C:/Users/86199/Desktop/data_cleaned.csv'
data = pd.read_csv(datafile, encoding='utf-8')

data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'SEG_KM_SUM', 'avg_discount']]
data.head(10)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第2张图片

数据变换

原始数据中并没有直接给出LRFMC五个指标,需要通过原始数据提取这五个指标

data.insert(
    loc = data.columns.get_loc('FFP_DATE') + 1,
    column = 'L',
    value = (pd.to_datetime(data['LOAD_TIME']) - pd.to_datetime(data['FFP_DATE'])).dt.days
)

data = data.loc[:,'L':]
data.columns = ['L', 'R', 'F', 'M', 'C']
data.head(10)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第3张图片

由于5个指标的取值范围数据差异较大,为了消除数量级带来的影响,需要对数据进行标准化处理。

zscoredfile = 'C:/Users/86199/Desktop/zscoreddata.csv'

data = (data - data.mean()) / (data.std())
data.columns = ['Z'+i for i in data.columns]
data.to_csv(zscoredfile, index=False)
data.head(10)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第4张图片

手肘法确认k值

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

distortions = []
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数

plt.figure(figsize=(8,6))
for i in range(1,16,1): #这里列出群个数为1到16时的K值与质心距离
    clf = KMeans(n_clusters=i)
    s = clf.fit(data)
    distortions.append(clf.inertia_)
k = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
plt.scatter(k, distortions)
plt.plot(k, distortions)
plt.xlabel("k")
plt.xticks([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])  # 指定x轴刻度的数目与取值
plt.ylabel("distance")
plt.show()

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第5张图片

由上图可看出,K取4或5或6时比较合适
但是聚类的个数需要结合具体业务来确定,在本实验中由于指标个数,将客户聚成5类,所以k=5。

客户聚类(k=5)

采用KMeans聚类算法对客户数据进行客户分群,聚成5类。

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
datafile = 'C:/Users/86199/Desktop/zscoreddata.csv'
k = 5

data = pd.read_csv(datafile)

kmodel = KMeans(n_clusters=k, n_jobs=4)
kmodel.fit(data)
def get_cluster(data):
    labels = pd.Series(kmodel.labels_)
    nums = labels.value_counts().sort_index()
    types = pd.Series(['客户群'+str(i) for i in range(1, 6)])
    centers = pd.DataFrame(kmodel.cluster_centers_, columns=data.columns)
    new_data = pd.concat([types, nums, centers], axis='columns')
    new_data.columns = ['cluster_names', 'cluster_num', 'ZL', 'ZR', 'ZF', 'ZM', 'ZC']
    
    return new_data

data = get_cluster(data)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第6张图片

Weka检验

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第7张图片

客户价值分析

from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False   

def plot_radar(data):
    colors = ['tomato', 'darkorange', 'limegreen', 'darkcyan', 'royalblue']
    names = data['cluster_names'].tolist()
    labels = data.columns.tolist()[2:]
    centers = pd.concat([data.iloc[:, 2:], data.iloc[:, 2]], axis=1)
    centers = np.array(centers)
    n = len(labels)
    angles = np.linspace(0, 2*np.pi, n, endpoint=False)
    angles = np.concatenate((angles, [angles[0]]))
    
    fig = plt.figure(figsize=(6, 6), dpi=100)
    ax = fig.add_subplot(111, polar=True)
    
    floor = np.floor(centers.min())
    ceil = np.ceil(centers.max())
    
    for i in range(n):
        ax.plot([angles[i], angles[i]], [floor, ceil], lw=0.5, color='grey')
    
    for i in range(len(names)):
        ax.plot(angles, centers[i], colors[i], label=names[i])
        plt.fill(angles, centers[i], facecolor=colors[i], alpha=0.2)
    
    ax.set_thetagrids(angles * 180 / np.pi, labels)
    plt.legend(loc='lower right', bbox_to_anchor=(1.5, 0.0))
    
    ax.set_theta_zero_location('N')
    ax.spines['polar'].set_visible(False)
    
    plt.show()

plot_radar(data)

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第8张图片

五、总结

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第9张图片
对于LRMFC模型,其L\M\F\C指标越大越好,R指标越小越好,我们根据聚类中心结果来对各个客户群进行特征划分。依此找出每个特征对应的最大值、最小值、次大值、次小值。

基于python分析航空公司客户价值《数据挖掘》 课程实验报告_第10张图片
由上述的特征分析图表说明每个客户群都有显著不同的表现特征,基于该特征描述,我们将案例中客户定义五个等级的客户类别:重要保持客户、重要发展客户、重要挽留客户、一般客户、低价值客户。其中每种客户类别的具体特征如下:

重要保持客户:这类客户的平均折扣率C较高,一般所乘坐的舱位等级较高,最近乘坐过本公司航班R低、乘坐的次数F或里程M较高。这些客户对于航空公司来说是高价值客户,相对来说所占的比例也偏小。航空公司应该优先将资源投放到他们呢身上,对他们进行差异化管理和一对一影响,提供这类用户的忠诚度与满意度,延长这类客户的高水平消费。

重要发展客户:这类客户的平均折扣率C较高,最近乘坐过本公司航班R低,但乘坐次数F或乘坐里程M较低。这类客户入会时间L短,他们是航空公司的潜在 价值客户。虽然这类客户目前的价值不是很高,但有很大的发展潜力。航空公司应努力促使这类客户增加在本公司的乘机消费和合作伙伴处的消费,增加客户的钱包份额。通过客户价值的提升,加强这类客户的满意度,提高他们转向竞争对手的转移成本,使他们逐渐称为公司的忠诚客户。

重要挽留客户:这类客户过去所乘航班的平均折扣率C、乘坐次数F或者里程数M较高,但已经较长时间没有乘坐本公司的航班R高或者使乘坐频率变小。他们的客户价值变化的不确定性很高。由于这些客户衰退的原因各不相同,所以掌握客户的最新信息、维持与客户的互动就显得尤为重要。航空公司应该根据这些客户的最近消费时间、消费次数的变化情况、推测客户消费的异动状况,并列出客户名单。对其采取一定的营销手段,延长客户的生命周期。

一般与低价值客户:这类客户所乘航班的平均折扣率C很低,较长时间没有乘坐过本公司航班R高,乘坐次数F或者里程M较低,入会时间L短。这些客户的价值较低,可能是在航空公司机票打折促销时,才会乘坐本公司航班。

根据特征定义我们可以将客户群分类:
客户群1,R为最大值,FM为最小值。可见这类客户最近乘机次数少,里程也较小。故为一般客户。
客户群2,C值最大,R次大,FM为次小值。可见这类客户最近乘机次数少,但其折扣率较大,成绩次数和里程也偏小。故为重要发展客户。
客户群3,F,M为最大值,R为最小值。完全符合重要保持客户。
客户群4,L,C为最小值,即入会时间短,且折扣率小。应归属到低价值客户。
客户群5,L为最大值,F,M为次大值。这类客户入会时间长,乘机次数和总里程偏大,最近乘机时间并未表现明显增加。故为重要挽留客户。

对客户进行特征划分后,针对不同类型的客户群提供不同的产品和服务,提升重要发展客户的价值、稳定和延长重要保持客户的高水平消费、防范重要挽留客户的流失并积极进行关系恢复。

你可能感兴趣的:(Python,数据分析项目,数据挖掘,python,聚类)