航空公司的excel表中的各个数据对应的含义如下
航空价值分析步骤如下
航空数据分析雷达图如下
解决方案 步骤如下
了解航空数据的含义,观察窗口就是时间段
丢弃票价为空的数据
保留票价大于0,折扣不为0,飞行里程大于0的数据,---花钱坐飞机筛选特征时,筛选出与LRFMC五特征相关的数据
构建特征的时候需要构建LRFMC五特征模型进行异常值处理 3sigma
标准化数据
数据就位
km聚类,聚成五类
结果展示--雷达图,常规的散点图不适合这类结果
分析-给出建议
代码如下
import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler #标准差标准化 from sklearn.cluster import KMeans import matplotlib.pyplot as plt air_data = pd.read_csv('./air_data.csv',encoding='ansi') # print(air_data) #异常值处理 def box_analysis(data): ''' 进行箱线图分析,剔除异常值 :param data: :return: ''' qu = data.quantile(0.75) ql = data.quantile(0.25) iqr = qu - ql #上限与下限 1.5可以微调 up = qu+1.5*iqr low = ql-1.5*iqr #进行比较运算 bool_id_1 = data<=up bool_id_2 = data>=low bool_num = bool_id_1 & bool_id_2 return bool_num def getdata(air_data): ''' 数据处理和构建LRFMC特征 :param air_data: 未经处理的航空公司数据 :return: 处理完成之后的航空公司数据 ''' #丢弃票价为空的数据 # print(air_data.columns) bool_id_1 = air_data.loc[:,'SUM_YR_1'].notnull() bool_id_2 = air_data.loc[:,'SUM_YR_2'].notnull() bool_id = bool_id_1 & bool_id_2 #丢弃票价为空的数据 air_data = air_data.loc[bool_id,:] bool_num_1 = air_data.loc[:,'SUM_YR_1'] > 0 bool_num_2 = air_data.loc[:,'SUM_YR_2'] > 0 bool_num_3 = air_data.loc[:,'avg_discount'] > 0 bool_num_4 = air_data.loc[:,'SEG_KM_SUM'] > 0 bool_num = (bool_num_1 | bool_num_2) & bool_num_3 & bool_num_4 # print(bool_num) air_data = air_data.loc[bool_num,:] # print(air_data) #筛选特征 air_data = air_data.loc[:,['FFP_DATE','LOAD_TIME','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']] # print('筛选出有效特征之后的结果:',air_data) #构建LRFMC特征 #构建L air_data.loc[:,'LOAD_TIME'] = pd.to_datetime(air_data.loc[:,'LOAD_TIME']) air_data.loc[:,'FFP_DATE'] = pd.to_datetime(air_data.loc[:,'FFP_DATE']) air_data.loc[:,'L_days'] = air_data.loc[:,'LOAD_TIME'] - air_data.loc[:,'FFP_DATE'] air_data.loc[:,'L_days'] = [i.days for i in air_data.loc[:,'L_days']] air_data.loc[:,'L'] = air_data.loc[:,'L_days']/30 # print(air_data.loc[:,'L']) #构建R air_data.loc[:,'R'] = air_data.loc[:,'LAST_TO_END']/30 # print(air_data.loc[:,'R']) #构建F air_data.loc[:,'F'] = air_data.loc[:,'FLIGHT_COUNT'] #构建M air_data.loc[:,'M'] = air_data.loc[:,'SEG_KM_SUM'] #构建C air_data.loc[:,'C'] = air_data.loc[:,'avg_discount'] #生成需要的特征值数据 data = air_data.iloc[:,-5:] #异常值处理 for i in range(len(data.columns)): bool_index_1 = box_analysis(data.iloc[:,i]) data = data.loc[bool_index_1,:] # print(data.shape) return data #绘图三部曲 def radarmap(): plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] = False plt.figure() #创建子图,1行1列第一个图,polar开启极坐标 plt.subplot(111,polar=True) #绘图 #设计角度 datalength = 5 #起始值,结束值,将圆分成几份,endpoint=False不然的会最后一个和第一个会重合 angle = np.linspace(0,2*np.pi,num=datalength,endpoint=False) #0到2pi分成5份 print(angle) #闭合角度 angle = np.concatenate((angle,[angle[0]]),axis=0) print(angle) #循环闭合数据,并进行绘图 for i in range(k): #循环闭合数据 data = np.concatenate((center[i,:],[center[i,0]])) #没闭合一次数据就会进行一次绘制 plt.plot(angle,data) #设置刻度 labels = ['L','R','F','M','C'] plt.xticks(angle,labels) plt.legend(['用户群体1','用户群体2','用户群体3','用户群体4','用户群体5']) plt.title('航空用户聚类分析') plt.show() if __name__ == '__main__': data = getdata(air_data) # 标准差标准化处理 stand = StandardScaler() # 创建标准差示例 x = stand.fit_transform(data) # 进行标准化,返回标准化之后的数据 # print(x) #进行聚类 k = 5 km = KMeans(n_clusters=k) # 传入聚类类别 km.fit(x) # 训练数据 y_predict = km.predict(x) # 预测标签值 center = km.cluster_centers_ # 聚类中心值 #绘图 radarmap()