民航数据分析_案例

import pandas as pd
import numpy as np
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans,AgglomerativeClustering
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import datetime
plt.rcParams['font.sans-serif']=['SimHei']  #中文正常显示
plt.rcParams['axes.unicode_minus']=False   #让负号正常显示

# 数据集路径:

# 格式:url/dataSet/systemLib/c3b5c0f37fe24797808613bc713d5585.rar,url参见实验窗口右侧菜单“实验资源下载”。例如:https://staticfile.eec-cn.com/dataSet/systemLib/c3b5c0f37fe24797808613bc713d5585.rar。压缩包中的数据为csv数据,解压并将该数据移动到C:/ 数据分析/data目录中。

# 读取和查看数据
air_data=pd.read_csv('air_data.csv',encoding='ANSI')
print(air_data.head())


print(air_data.info())

exp1 = air_data['SUM_YR_1'].notnull()   # 第一年票价不为空记录的索引
exp2 = air_data['SUM_YR_2'].notnull()   # 第二年票价不为空记录的索引
air_data = air_data.loc[exp1 & exp2, :]   # 票价不为空的记录
print(air_data.shape)
# 可以看到,数据减少近700个样本

# 去除掉第一年、第二年票价均为0,同时平均折扣系数大于零和飞行里程大于零的数据

index1 = air_data['SUM_YR_1'] == 0       # 第一年票价为零
index2 = air_data['SUM_YR_2'] == 0       # 第二年票价为零
index3 = air_data['avg_discount'] > 0    # 平均折扣系数大于零
index4 = air_data['SEG_KM_SUM'] > 0      # 飞行里程大于零
airline = air_data.loc[-(index1&index2&index3&index4), :]  # 剔除不合理的记录
print(air_data.shape)
# 取出LRFMC模型数据
new_data=air_data[['LOAD_TIME','FFP_DATE','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
print(new_data.info())

# 计算入会时长(天数)
L = pd.to_datetime(new_data['LOAD_TIME'])-pd.to_datetime(new_data['FFP_DATE'])
L = np.int64(L.astype(str).str.split().str[0])  # 会员入会天数          
L=pd.DataFrame(L,columns=['Days'])
air_features = pd.concat([L, new_data.iloc[:, 2:]], axis=1)   # 横向拼接
print(air_features.head())



#更改列名,描述性统计
air_features.columns=['L(客户时长)','R(消费时间间隔)','F(消费频率)','M(总飞行里程)','C(平均折扣率)']
print(air_features.describe().T)

# 可以看到,不同属性的取值范围差异很大,例如 L∈[365,3437]、C∈[0.136017,1.5]等。 
# 这种情况会导致模型在学习的时候可能会对不同属性有着错误的重要性衡量。
#  因此要对这个情况进行处理,让不同属性的取值范围一致,即数据的标准化。
#  标准化方法有极大极小标准化、Zscore标准化等方法,
#  此处采用Zscore标准化的方法对数据进行处理。

#去除缺失值

air_features=air_features.dropna()
#重置索引
air_features=air_features.reset_index(drop=True)
print(air_features.info())


#数据标准化
data_scale=StandardScaler().fit_transform(air_features)
data_scale=pd.DataFrame(data_scale,columns=air_features.columns)
print(data_scale.head())
# 寻找最佳聚类个数
# 绘制拐点图

sse=[]
for i in range(2,10):
    result=KMeans(i,random_state=100).fit(data_scale)
    sse.append(result.inertia_)
plt.figure()
plt.plot(range(2,10),sse,marker='o')
plt.xlabel('k')
plt.ylabel('sse')
plt.show()


# 可以看出k=3或4类时,下降最为剧烈

# 绘制轮廓系数图

# 备注:绘制图形时可能要等几分钟

sil=[]
for i in range(2,8):
    result=KMeans(i,random_state=100).fit(data_scale)
    sil.append(silhouette_score(air_features,result.labels_))
plt.figure()
plt.plot(range(2,8),sil,marker='o')
plt.xlabel('k')
plt.ylabel('sil')
plt.show()
# 从轮廓系数图中看到k=2和3类轮廓系数较高

# 综合拐点图和轮廓图,因此取k=3为最佳聚类个数

# 建立聚类模型
# #kmeans聚类
result=KMeans(3,random_state=100).fit(data_scale)
print(pd.Series(result.labels_).value_counts())
#绘制聚类图

pca_2=PCA(n_components=2)
data_pca_2=pd.DataFrame(pca_2.fit_transform(data_scale))
plt.figure()
plt.scatter(data_pca_2[0],data_pca_2[1],c=result.labels_)
plt.show()


#结果分析

# 合并数据,加入分类
air_features['cluster']=result.labels_
print(air_features.head())

# 聚合各类,对各特征计算平均值
data_pivot=pd.pivot_table(air_features,index=['cluster'],aggfunc='mean')
print(data_pivot)


# 可以看到:

# 1这类客户平均折扣率最高,消费频率最高,客户时长最长,总飞行里程数最长,消费间隔时间最短,属于最重要客户。

# 0这类客户平均折扣率不高,消费频率较高,客户时长较长,总飞行里程数较长,消费间隔时间较短,属于重要发展客户。

# 2这类客户平均折扣率较低,消费频率最低,客户时长最短,总飞行里程数最短,消费间隔时间最长,属于一般客户。



# 加入客户分类

def customer_type(cluser):
    if cluser==0:
        return '重要发展客户'
    elif cluser==1:
        return '最重要客户'
    else:
        return '一般客户'

air_features['客户类型']=air_features['cluster'].apply(customer_type)
print(air_features.head())

print(air_features['客户类型'].value_counts())



# 绘图







customer_count=air_features['客户类型'].value_counts()
plt.figure()
plt.subplot(1,2,1)
plt.bar(customer_count.index,customer_count.values)
#添加文本
for a,b in zip(customer_count.index,customer_count.values):
    plt.text(a,b,b,ha='center',va='bottom',color='b')
plt.subplot(1,2,2)
plt.pie(customer_count.values,labels=list(customer_count.index),autopct='%.1f%%', textprops={
    
    'color':'r'},shadow=True)
plt.legend(loc=1)
plt.show()










猜你喜欢

转载自blog.csdn.net/X131644/article/details/129821060
今日推荐