kmeans算法示例--航空公司数据分析

航空公司的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()


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值