• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

33wood

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

航空公司客户价值分析

 1  -*- coding: utf-8 -*-
 2 """
 3 Spyder Editor
 4 
 5 This is a temporary script file.
 6 """
 7 
 8 
 9 import pandas as pd
10 datafile = 'C:/Users/admin/Desktop/air_data.csv'
11 resultfile = 'C:/Users/admin/Desktop/explore.csv'
12 data = pd.read_csv(datafile,encoding = 'utf-8')
13 
14 explore = data.describe(percentiles = [],include = 'all').T
15 
16 explore['null'] = len(data)-explore['count']
17 
18 explore = explore[['null','max','min']]
19 explore.columns = [u'空数值',u'最大值',u'最小值']
20 explore.to_csv(resultfile)
21 
22 
23 import matplotlib.pyplot as plt
24 from datetime import datetime
25 ffp = data['FFP_DATE'].apply(lambda x:datetime.strptime(x,'%Y/%m/%d'))
26 ffp_year = ffp.map(lambda x:x.year)
27 fig = plt.figure(figsize = (8,5))
28 plt.rcParams['font.sans-serif'] = 'SimHei'
29 plt.rcParams['axes.unicode_minus'] = False
30 plt.hist(ffp_year,bins = 'auto',color = '#0504aa')
31 plt.xlabel('年份')
32 plt.ylabel('入会人数')
33 plt.title('各年份会员入会人数(学号202031014040)')
34 plt.show()
35 plt.close
36 
37 male = pd.value_counts(data['GENDER'])['男']
38 female = pd.value_counts(data['GENDER'])['女']
39 fig = plt.figure(figsize = (7,4))
40 plt.pie([male,female],labels = ['男','女'],colors = ['lightskyblue','lightcoral'],autopct = '%1.1f%%')
41 plt.title('会员性别比例(学号2020310143040)')
42 plt.show()
43 plt.close
44 
45 lv_four = pd.value_counts(data['FFP_TIER'])[4]
46 lv_five = pd.value_counts(data['FFP_TIER'])[5]
47 lv_six = pd.value_counts(data['FFP_TIER'])[6]
48 fig = plt.figure(figsize =(8,5))
49 plt.bar(x = range(3),height = [lv_four,lv_five,lv_six],width = 0.4,alpha = 0.8,color = 'skyblue')
50 plt.xticks([index for index in range(3)],['4','5','6'])
51 plt.xlabel('会员等级')
52 plt.ylabel('会员人数')
53 plt.title('会员各级别人数(学号2020310143040)')
54 plt.show()
55 plt.close
56 
57 age = data['AGE'].dropna()
58 age = age.astype('int64')
59 fig = plt.figure(figsize = (8,5))
60 plt.boxplot(age,patch_artist = True,labels = ['会员年龄'],boxprops = {'facecolor':'lightblue'})
61 plt.title('会员年龄分布箱型图(学号2020310143040)')
62 plt.grid(axis = 'y')
63 plt.show()
64 plt.close

 1 # 乘机信息类别
 2 lte = data['LAST_TO_END']
 3 fc = data['FLIGHT_COUNT']
 4 sks = data['SEG_KM_SUM']
 5 
 6 # 绘制最后乘机至结束时长箱线图
 7 fig = plt.figure(figsize = (5 ,8))
 8 plt.boxplot(lte, 
 9             patch_artist=True,
10             labels = ['时长'],  # 设置x轴标题
11             boxprops = {'facecolor':'gold'})  # 设置填充颜色
12 plt.title('会员最后乘机至结束时长分布箱线图(学号2020310143040)')
13 # 显示y坐标轴的底线
14 plt.grid(axis='y')
15 plt.show()
16 plt.close
17 # 绘制客户飞行次数箱线图
18 fig = plt.figure(figsize = (5 ,8))
19 plt.boxplot(fc, 
20             patch_artist=True,
21             labels = ['飞行次数'],  # 设置x轴标题
22             boxprops = {'facecolor':'gold'})  # 设置填充颜色
23 plt.title('会员飞行次数分布箱线图(学号2020310143040)')
24 # 显示y坐标轴的底线
25 plt.grid(axis='y')
26 plt.show()
27 plt.close
28 # 绘制客户总飞行公里数箱线图
29 fig = plt.figure(figsize = (5 ,10))
30 plt.boxplot(sks, 
31             patch_artist=True,
32             labels = ['总飞行公里数'],  # 设置x轴标题
33             boxprops = {'facecolor':'gold'})  # 设置填充颜色
34 plt.title('客户总飞行公里数箱线图(学号2020310143040)')
35 # 显示y坐标轴的底线
36 plt.grid(axis='y')
37 plt.show()
38 plt.close
39 # 积分信息类别
40 # 提取会员积分兑换次数
41 ec = data['EXCHANGE_COUNT']
42 # 绘制会员兑换积分次数直方图
43 fig = plt.figure(figsize = (8 ,5))  # 设置画布大小
44 plt.hist(ec, bins=5, color='#0504aa')
45 plt.xlabel('兑换次数')
46 plt.ylabel('会员人数')
47 plt.title('会员兑换积分次数分布直方图(学号2020310143040)')
48 plt.show()
49 plt.close
50 # 提取会员总累计积分
51 ps = data['Points_Sum']
52 # 绘制会员总累计积分箱线图
53 fig = plt.figure(figsize = (5 ,8))
54 plt.boxplot(ps, 
55             patch_artist=True,
56             labels = ['总累计积分'],  # 设置x轴标题
57             boxprops = {'facecolor':'gold'})  # 设置填充颜色
58 plt.title('客户总累计积分箱线图(学号2020310143040)')
59 # 显示y坐标轴的底线
60 plt.grid(axis='y')
61 plt.show()
62 plt.close

 

 

 

 

 

 

 1 # 提取属性并合并为新数据集
 2 data_corr = data[['FFP_TIER','FLIGHT_COUNT','LAST_TO_END',
 3                   'SEG_KM_SUM','EXCHANGE_COUNT','Points_Sum']]
 4 age1 = data['AGE'].fillna(0)
 5 data_corr['AGE'] = age1.astype('int64')
 6 data_corr['ffp_year'] = ffp_year
 7 
 8 # 计算相关性矩阵
 9 dt_corr = data_corr.corr(method = 'pearson')
10 print('相关性矩阵为(学号2020310143040):\n',dt_corr)
11 
12 # 绘制热力图
13 import seaborn as sns
14 plt.subplots(figsize=(10, 10)) # 设置画面大小 
15 sns.heatmap(dt_corr, annot=True, vmax=1, square=True, cmap='Blues') 
16 plt.title('热力图(学号2020310143040)')
17 plt.show()
18 plt.close

  1 import numpy as np
  2 import pandas as pd
  3 datafile='D:/anaconda/data/air_data.csv'
  4 cleanedfile='D:/anaconda/data/data_cleaned.csv'
  5 airline_data=pd.read_csv(datafile,encoding='utf-8')
  6 print('原始数据的形状为:',airline_data.shape)
  7 airline_notnull=airline_data.loc[airline_data['SUM_YR_1'].notnull()&airline_data['SUM_YR_2'].notnull(),:]
  8 print('删除缺失记录后数据的形状为:\n',airline_notnull.shape)
  9 
 10 index1=airline_notnull['SUM_YR_1'] != 0
 11 index2=airline_notnull['SUM_YR_2'] != 0
 12 index3=(airline_notnull['SEG_KM_SUM'] > 0)&(airline_notnull['avg_discount'] != 0)
 13 index4=airline_notnull['AGE'] >100
 14 airline=airline_notnull[(index1|index2)&index3&~index4]
 15 print('数据清清洗后数据形状为:',airline.shape)
 16 airline.to_csv(cleanedfile)
 17 
 18 import numpy as np
 19 import pandas as pd
 20 cleanedfile='D:/anaconda/data/data_cleaned.csv'
 21 airline_data=pd.read_csv(cleanedfile,encoding='utf-8')
 22 airline_selection=airline[['FFP_DATE','LOAD_TIME','LAST_TO_END','FLIGHT_COUNT','SEG_KM_SUM','avg_discount']]
 23 print('筛选的属性前5行为:\n',airline_selection.head())
 24 
 25 L=pd.to_datetime(airline_selection['LOAD_TIME'])-\
 26 pd.to_datetime(airline_selection['FFP_DATE'])
 27 L=L.astype('str').str.split().str[0]
 28 L=L.astype('int')/30
 29 
 30 airline_features=pd.concat([L,airline_selection.iloc[:,2:]],axis=1)
 31 print('构建的LRFMC属性前5行为:\n',airline_features.head())
 32 
 33 from sklearn.preprocessing import StandardScaler
 34 data=StandardScaler().fit_transform(airline_features)
 35 np.savez('D:/anaconda/data/airline_scale.npz',data)
 36 print('标准化后LRFMC5个属性为:\n',data[:5,:])
 37 
 38 import pandas as pd
 39 import numpy as np
 40 from sklearn.cluster import KMeans
 41 
 42 airline_scale=np.load('D:/anaconda/data/airline_scale.npz')['arr_0']
 43 k=5
 44 
 45 kmeans_model=KMeans(n_clusters=k,random_state=123)
 46 fit_kmeans=kmeans_model.fit(airline_scale)
 47 kmeans_cc=kmeans_model.cluster_centers_
 48 print('各类聚类中心为:\n',kmeans_cc)
 49 kmeans_labels=kmeans_model.labels_
 50 print('各类样本的类别标签为:\n',kmeans_labels)
 51 r1=pd.Series(kmeans_model.labels_).value_counts()
 52 print('最终每个类别的数目为:\n',r1)
 53 cluster_center=pd.DataFrame(kmeans_model.cluster_centers_,\
 54 columns=['ZL','ZR','ZF','ZM','ZC'])
 55 cluster_center.index=pd.DataFrame(kmeans_model.labels_).\
 56 drop_duplicates().iloc[:,0]
 57 print(cluster_center)
 58 
 59 import matplotlib.pyplot as plt
 60 labels=['ZL','ZR','ZF','ZM','ZC']
 61 legen=['客户群'+str(i+1) for i in cluster_center.index]
 62 lstype=['-','--',(0,(3,5,1,5,1,5)),':','-.']
 63 kinds=list(cluster_center.iloc[:,0])
 64 cluster_center=pd.concat([cluster_center,cluster_center[['ZL']]],axis=1)
 65 centers=np.array(cluster_center.iloc[:,0:])
 66 
 67 n=len(labels)
 68 angle=np.linspace(0,2*np.pi,n,endpoint=False)
 69 angle=np.concatenate((angle,[angle[0]]))
 70 
 71 fig=plt.figure(figsize=(8,6))
 72 ax=fig.add_subplot(111,polar=True)
 73 plt.rcParams['font.sans-serif']=['SimHei']
 74 plt.rcParams['axes.unicode_minus']=False
 75 for i in range(len(kinds)):
 76     ax.plot(angle,centers[i],linestyle=lstype[i],linewidth=2,label=kinds[i])
 77     ang=angle*180/np.pi
 78     ax.set_thetagrids(ang[:-1],labels)
 79 plt.title('客户特征分析雷达图学号2020310143040')
 80 plt.legend(legen)
 81 plt.show()
 82 plt.close
 83 
 84 #判断一个客户是,已流失,准流失,未流失的客户:
 85 
 86 import numpy as np
 87 import pandas as pd
 88 datafile='D:/anaconda/data/air_data.csv'
 89 cleanedfile='D:/anaconda/data/data_cleaned2.csv'
 90 airline_data=pd.read_csv(datafile,encoding='utf-8')
 91 print('原始数据的形状为:',airline_data.shape)
 92 airline_notnull=airline_data.loc[airline_data['SUM_YR_1'].notnull()&airline_data['SUM_YR_2'].notnull(),:]
 93 print('删除缺失记录后数据的形状为:\n',airline_notnull.shape)
 94 
 95 #选取特征
 96 airline_data['单位里程票价'] = (airline_data['SUM_YR_1'] + airline_data['SUM_YR_2'])/airline_data['SEG_KM_SUM']
 97 airline_data['单位里程积分'] = (airline_data['P1Y_BP_SUM'] + airline_data['L1Y_BP_SUM'])/airline_data['SEG_KM_SUM']
 98 airline_data['飞行次数比例'] = airline_data['L1Y_Flight_Count'] / airline_data['P1Y_Flight_Count'] #第二年飞行次数与第一年飞行次数的比例
 99 #筛选出老客户(飞行次数大于6次的为老客户)
100 airline_data = airline_data[airline_data['FLIGHT_COUNT'] > 6]
101 #选择特征
102 airline_data = airline_data[['FFP_TIER','飞行次数比例','AVG_INTERVAL',
103 'avg_discount','EXCHANGE_COUNT','Eli_Add_Point_Sum','单位里程票价','单位里程积分']]
104 #导出
105 airline_data.to_csv(cleanedfile,index=None)
106 
107 input_file = 'D:/anaconda/data/data_cleaned2.csv'
108 output_file = 'D:/anaconda/data/data_cleaned3.csv'
109 data = pd.read_csv(input_file,encoding='utf-8')
110 data['客户类型'] = None
111 for i in range(len(data)):
112 #第一、二年飞行次数比例小于50%的客户定义为已流失
113     if data['飞行次数比例'][i] < 0.5:
114         data['客户类型'][i] = 0 #0代表已流失
115 #第一、二年飞行次数比例在[0.5,0.9)之间的客户定义为准流失
116     if (data['飞行次数比例'][i] >= 0.5) & (data['飞行次数比例'][i] < 0.9) :
117         data['客户类型'][i] = 1 #1代表准流失
118 #第一、二年飞行次数比例大于等于90%的客户定义为未流失
119     if data['飞行次数比例'][i] >= 0.9:
120         data['客户类型'][i] = 2 #2代表未流失
121 #导出
122 data.to_csv(output_file,index=None)
123 print('筛选的属性前5行为:\n',data.head())

 

posted on 2023-03-08 13:50  33wood  阅读(33)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3