实验目的:
借助航空公司客户数据,对客户进行聚类。
对不同的客户类别进行特征分析,比较不同类别客户的客户价值。
对不同价值的客户类别提供个性化服务,制定相应的营销策略。
读取数据,指定编码为gb18030
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
airline_data=pd.read_csv('../data/air_data.csv',
encoding='gb18030')
airline_data.head()
数据描述性分析
airline_data.info()
数据预处理
1. 去除票价为空的数据
exp1=airline_data['SUM_YR_1'].notnull()
exp2=airline_data['SUM_YR_2'].notnull()
exp=exp1&exp2
airline_notnull=airline_data.loc[exp,:]
airline_notnull.shape
2.只保留票价不为0,平均折扣率不为0,总飞行公里数大于0的记录。
index1=airline_notnull['SUM_YR_1']!=0
index2=airline_notnull['SUM_YR_2']!=0
index3=(airline_notnull['avg_discount']!=0)&(airline_notnull['SEG_KM_SUM']>0)
airline=airline_notnull[(index1|index2)&index3]
airline.shape
构建特征
L: LOAD_TIME 观测窗口的结束时间----FFP_DATE 入会时间
R: LAST_TO_END 最后一次乘机时间至观测窗口结束时长
F: FLIGHT_COUNT 观测窗口内的飞行次数
M: SEG_KM_SUM 观测窗口的总飞行公里数
C: avg_discount 平均折扣率
# 构建特征 按照顺序将需要的列选择出来
# airline_selection
airline_selection=airline[['LOAD_TIME',
'FFP_DATE',
'LAST_TO_END',
'FLIGHT_COUNT',
'SEG_KM_SUM',
'avg_discount']]
airline_selection.head()
airline_selection.info()
# 修改数据类型 日期 pd.to_datetime
airline_selection['LOAD_TIME']=pd.to_datetime(airline_selection['LOAD_TIME'])
airline_selection['FFP_DATE']=pd.to_datetime(airline_selection['FFP_DATE'])
airline_selection.info()
# 创建L特征 观测窗口的结束时间-入会时间
L=airline_selection['LOAD_TIME']-airline_selection['FFP_DATE']
L
# series数据进行切割
L=L.astype('str').str.split().str[0]
L=L.astype('int')/30
L=np.round(L,2)
L
# l特征和原有特征合并
airline_features=pd.concat(objs=[L,airline_selection.iloc[:,2:]]
,axis=1)
airline_features.head()
airline_features=airline_features.rename(columns={0:'L'})
airline_features
airline_features.describe()
数据标准化处理
airline_features_scaled=(airline_features-airline_features.mean())/airline_features.std()
airline_features_scaled.head()
使用k均值构建模型
from sklearn.cluster import KMeans
# 确定聚类中心数
k=5
kmeans_model=KMeans(n_clusters=k,random_state=123).fit(airline_features_scaled)
kmeans_model
# 得到聚类标签 label
# 每一个样本都有一个标签、
# 相同标签的是属于同一个类别
kmeans_model.labels_
# 得到聚类中心
# 5行 五个类别 分别是01234的聚类中心
# 5列 5个特征 分别是LRFMC
# 聚类中心的意义:代表当前类别平均情况
kmeans_model.cluster_centers_
# 分析不同类别的特点 定义客户价值标签
df=pd.DataFrame(data=kmeans_model.cluster_centers_)
df
df.to_excel('df.xlsx')
# 统计不同类别的数量
s1=pd.Series(kmeans_model.labels_)
s1.value_counts()
airline
airline_features['label']=kmeans_model.labels_
airline_features['id']=airline['MEMBER_NO']
airline_features
# airline_features[airline_features['label']==0]
# 把不同标签的数据放在不同的sheet里面
# 找到不同标签的数据 airline_01234
airline_0=airline_features[airline_features['label']==0]
airline_1=airline_features[airline_features['label']==1]
airline_2=airline_features[airline_features['label']==2]
airline_3=airline_features[airline_features['label']==3]
airline_4=airline_features[airline_features['label']==4]
# 打开一个excel文件, airline.xlsx
# 把不同客户群体放在不同的sheet里面,命名
writer=pd.ExcelWriter('airline.xlsx')
airline_0.to_excel(writer,'重点发展客户')
airline_1.to_excel(writer,'VIP客户')
airline_2.to_excel(writer,'一般客户&流失倾向')
airline_3.to_excel(writer,'重要挽留客户')
airline_4.to_excel(writer,'一般保持客户')
writer.save()
# 对于聚类模型的评价
# k的选择 CH指数
# 类间距/类内距 数字越大越好
from sklearn.metrics import calinski_harabasz_score
for i in range(5,10):
kmeans=KMeans(n_clusters=i,
random_state=123).fit(airline_features_scaled)
score=calinski_harabasz_score(airline_features_scaled,kmeans.labels_)
print(score)