文章目录
案例数据及notebook百度网盘链接—提取码:1234 或者可以从我上传的资源里面找,下载不需要积分
传送门:
- 数据挖掘实战—财政收入影响因素分析及预测
- 数据挖掘实战—航空公司客户价值分析
- 数据挖掘实战—商品零售购物篮分析
- 数据挖掘实战—基于水色图像的水质评价
- 数据挖掘实战—家用热水器用户行为分析与事件识别
- 数据挖掘实战—电商产品评论数据情感分析
引言
企业在面向客户制定运营策略与营销策略时,希望针对不同的客户推行不同的策略,实现精准化运营。通过客户分类,对客户群体进行细分,区分出低价值客户与高价值客户,对不同的客户群体开展不同的个性化服务,将有限的资源合理地分配给不同价值的客户,从而实现效益(利润)最大化。本文将使用航空公司客户数据,结合RFM
模型,采用K-Means
聚类算法,对客户进行分群,比较不同类别客户的价值,从而指定相应的营销策略。定义挖掘目标如下:
- 借助航空公司数据对客户进行分类
- 对不同的客户类别进行特征分析,比较不同类别客户的价值
- 针对不同价值的客户制定相应的营销策略,为其提供个性化服务
本文数据挖掘主要包括以下步骤:
- 抽取航空公司2012年4月1日至2014年3月31日的数据
- 对抽取的数据进行数据探索分析,数据预处理,包括数据缺失值与异常值的探索分析、数据清洗、特征构建、标准化等操作
- 基于RFM模型,使用K-means算法进行客户分群
- 针对模型结果得到不同价值的客户,采用不同的营销手段,提供定制化服务
一、数据探索分析(EDA)
航空公司数据属性说明如下:
%matplotlib inline
import pandas as pd
import numpy as np
import missingno as mg
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据
air_data = pd.read_csv('data/air_data.csv',header=0,index_col=0)
air_data.head(10)
1.数据质量分析
1.1 缺失值分析
缺失值可视化,图中的白线即为缺失值
# 缺失值可视化
mg.matrix(air_data)
利用柱状图进行缺失值可视化,柱状图的高度代表非缺失比例
定量展示每一列缺失值个数并排序
air_data.isnull().sum().sort_values(ascending=False)
展示每一列的缺失值个数与缺失率以及缺失值的属性
def missing_percentage(df):
dtypes = df.dtypes[df.isnull().sum() != 0]
total = df.isnull().sum().sort_values(ascending=False)[df.isnull().sum() != 0]
percentage = total*100 / len(df)
return pd.concat([total,percentage,dtypes],axis=1,keys=['Total','Percentage','Dtypes'])
missing_percentage(air_data)
1.2 异常值分析
用箱型图来识别异常值,箱型图识别异常值是以四分位数与四分位距为基础,同时结合业务逻辑,因为异常值并不代表是错误值,需要结合业务来考虑异常值在不在合理的范围内。
# 数据类别统计分析
air_data.dtypes.value_counts()
# 连续型变量
num_columns = air_data.loc[:,air_data.dtypes != object].columns
for var in num_columns:
fig,ax = plt.subplots(figsize=(5,5))
sns.boxplot(air_data[var],orient='v')
ax.set_xlabel(var)
以AGE为例,很明显看出该特征有异常值,而且这个异常值对于业务来说属于噪声,应当进行删除异常值或者将异常值取为空,然后在进行补充
对每个图进行分析,分析结果如下,这个是自身对业务的认知水平基础上的分析
FFP_TIER:会员卡级别中数据要么6要么5没有异常值
AGE:年龄中可以看到有些大于100岁,要对这些数据进行处理
FLIGHT_COUNT:观测窗口内的飞行次数没有小于0的值,其他不在箱子中的异常值是有价值
BP_SUM:总基本积分没有小于0的值,其他不在箱子里面的值是有价值
EP_SUM =EP_SUM_YR_1 +EP_SUM_YR_2 :总精英积分有1个值远高于其他值,这个我认为是有价值的异常值
SUM_YR = SUM_YR_1 + SUM_YR_2:观测窗口的票价收入,没有低于0的,有特别高的,我认为是有价值的异常值
SEG_KM_SUM :观测窗口的飞行里程数,没有小于0的值,有特别高,我认为是有价值的异常值
WEIGHTED_SEG_KM : 含义未知,跟里程数有关
AVG_FLIGHT_COUNT : 平均里程数 没有小于0的值,有特别高,我认为是有价值的异常值
AVG_BP_SUM:平均基本积分,没有小于0的,有特别高的,我认为是有价值的异常值
BEGIN_TO_FIRST:我猜测是第一次乘机时间至观测窗口结束时长,没有小于0的,有特别高的,我认为是有价值的异常值
LAST_TO_END:最后一次乘机时间至观测窗口结束时长,我猜测是时间间隔类数据,没有小于0的,有特别高的,我认为是有价值的异常值
AVG_INTERVAL : 平均乘机时间间隔,即(LAST_TO_END - BEGIN_TO_FIRST) / FLIGHT_COUNT,没有负值
MAX_INTERVAL : 最大乘机时间间隔,没有负值
EXCHANGE_COUNT : 积分兑换次数,没有负值
ADD_POINT_SUM : 具体含义未知,累积积分的一种,看着没有负值,之后统计分析的时候再看一下,这个值与ADD_POINT_SUM_YR_1和ADD_POINT_SUM_YR_2有关
Eli_Add_Point_Sum:具体含义未知,累积积分的一种,看着没有负值,之后统计分析的时候再看一下,
Ponits_Sum : 总累积积分,看着没有小于0的,有特别高的,我认为是有价值的异常值
Ponit_NotFlight:非乘机的积分变动次数,看着没有小于0的
总结:AGE有异常值
1.3 重复数据分析
2.数据特征分析
2.1 描述性统计分析
explore = air_data.describe().T
# count代表非空值个数
explore['null'] = len(air_data) - explore['count']
# 构建缺失值个数,最大值,最小值的表格
explore = explore[['null','min','max']]
explore.columns = ['空值个数','最小值','最大值']
# 按空值个数进行排序
explore.sort_values(by='空值个数',ascending= False,inplace=True)
从表中可以看出,有3个连续型数据列有缺失值,年龄最大值为110岁,年龄中存在异常值。在三个含缺失值列中有两个是票价(SUM_YR = SUM_YR_1 + SUM_YR_2),票价为空值的数据可能是客户不存在乘机记录造成的。票价列还存在票价为0,折扣率为0,但总飞行里程数大于0的记录。这种数据业务上可以这么理解:客户乘坐了0折机票或者机票是通过非购买的其他途径获得。
2.2 分布分析
从三个角度寻找客户信息的分布规律
2.2.1 客户基本信息分布分析
针对客户基本信息中的入会时间、性别、会员卡级别和年龄字段进行分析
- 入会时间—各年份入会人数变化图
from datetime