日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python客户价值分析_[Python数据挖掘]第7章、航空公司客户价值分析

發(fā)布時(shí)間:2024/9/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python客户价值分析_[Python数据挖掘]第7章、航空公司客户价值分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景和挖掘目標(biāo)

二、分析方法與過程

客戶價(jià)值識(shí)別最常用的是RFM模型(最近消費(fèi)時(shí)間間隔Recency,消費(fèi)頻率Frequency,消費(fèi)金額Monetary)

1、EDA(探索性數(shù)據(jù)分析)

#對(duì)數(shù)據(jù)進(jìn)行基本的探索

importpandas as pd

data= pd.read_csv('data/air_data.csv', encoding = 'utf-8') #讀取原始數(shù)據(jù),指定UTF-8編碼(需要用文本編輯器將數(shù)據(jù)裝換為UTF-8編碼)

explore= data.describe(percentiles = [], include = 'all').T #包括對(duì)數(shù)據(jù)的基本描述,percentiles參數(shù)是指定計(jì)算多少的分位數(shù)表(如1/4分位數(shù)、中位數(shù)等);T是轉(zhuǎn)置,轉(zhuǎn)置后更方便查閱

explore['null'] = len(data)-explore['count'] #describe()函數(shù)自動(dòng)計(jì)算非空值數(shù),需要手動(dòng)計(jì)算空值數(shù)

explore= explore[['null', 'max', 'min']]

explore.columns= [u'空值數(shù)', u'最大值', u'最小值'] #表頭重命名

'''這里只選取部分探索結(jié)果。

describe()函數(shù)自動(dòng)計(jì)算的字段有count(非空值數(shù))、unique(唯一值數(shù))、top(頻數(shù)最高者)、freq(最高頻數(shù))、mean(平均值)、std(方差)、min(最小值)、50%(中位數(shù))、max(最大值)'''explore.to_excel('tmp/explore.xls') #導(dǎo)出結(jié)果

2、數(shù)據(jù)預(yù)處理

1.數(shù)據(jù)清洗

data = data[data['SUM_YR_1'].notnull()&data['SUM_YR_2'].notnull()] #票價(jià)非空值才保留

#只保留票價(jià)非零的,或者平均折扣率與總飛行公里數(shù)同時(shí)為0的記錄。

index1 = data['SUM_YR_1'] !=0

index2= data['SUM_YR_2'] !=0

index3= (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) #該規(guī)則是“與”

data = data[index1 | index2 | index3] #該規(guī)則是“或”

票價(jià)為空表示該值缺失,票價(jià)為0表示飛這一趟沒花錢,二者概念不同

2.屬性規(guī)約

原始數(shù)據(jù)屬性太多,根據(jù)之前提出的LRFMC模型,只保留6個(gè)與之相關(guān)的屬性

3.數(shù)據(jù)變換

方法1:EXCEL手動(dòng)操作(方便簡(jiǎn)單)

data_select.to_excel('tmp/data_select.xls', index = False) #數(shù)據(jù)寫入

方法2:代碼操作(方便新增信息的抽取)

from datetime importdatetime#使用匿名函數(shù)將LOAD_TIME數(shù)據(jù)轉(zhuǎn)換成datetime格式,然后才能進(jìn)行日期加減(匿名函數(shù)比for循環(huán)效率高)

data_select['LOAD_TIME_convert'] = data_select['LOAD_TIME'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d'))

data_select['FFP_DATE_convert'] = data_select['FFP_DATE'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d'))#構(gòu)造一個(gè)Series序列接收 (LOAD_TIME-FFP_DATE)

data_select['L']=pd.Series()#(LOAD_TIME-FFP_DATE)得到兩個(gè)日期之間的天數(shù)間隔,然后除以30得到月份間隔 這一步相當(dāng)費(fèi)時(shí)

for i inrange(len(data_select)):

data_select['L'][i] =(data_select['LOAD_TIME_convert'][i]-data_select['FFP_DATE_convert'][i]).days/30data_select= data_select.rename(columns = {'LAST_TO_END': 'R','FLIGHT_COUNT':'F','SEG_KM_SUM':'M','avg_discount':'C'})

data_selected=data_select[['L','R','F','M','C']]

data_selected

接下來進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化

#標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化

importpandas as pd

data= pd.read_excel('data/zscoredata.xls', index =False)

data= (data - data.mean(axis = 0))/(data.std(axis = 0)) #簡(jiǎn)潔的語句實(shí)現(xiàn)了標(biāo)準(zhǔn)化變換,類似地可以實(shí)現(xiàn)任何想要的變換。

data.columns=['Z'+i for i in data.columns] #表頭重命名。

data.to_excel('tmp/zscoreddata.xls', index = False) #數(shù)據(jù)寫入

3、模型構(gòu)建

1.客戶聚類

#K-Means聚類算法

importpandas as pdfrom sklearn.cluster import KMeans #導(dǎo)入K均值聚類算法

k= 5 #需要進(jìn)行的聚類類別數(shù)

#讀取數(shù)據(jù)并進(jìn)行聚類分析

data = pd.read_excel('data/zscoreddata.xls')#調(diào)用k-means算法,進(jìn)行聚類分析

kmodel = KMeans(n_clusters = k, n_jobs = 4) #n_jobs是并行數(shù),一般等于CPU數(shù)較好

kmodel.fit(data) #訓(xùn)練模型

#kmodel.cluster_centers_ #查看聚類中心#kmodel.labels_ #查看各樣本對(duì)應(yīng)的類別

#簡(jiǎn)單打印結(jié)果

s = pd.Series(['客戶群1','客戶群2','客戶群3','客戶群4','客戶群5'], index=[0,1,2,3,4]) #創(chuàng)建一個(gè)序列s

r1 = pd.Series(kmodel.labels_).value_counts() #統(tǒng)計(jì)各個(gè)類別的數(shù)目

r2 = pd.DataFrame(kmodel.cluster_centers_) #找出聚類中心

r = pd.concat([s,r1,r2], axis = 1) #橫向連接(0是縱向),得到聚類中心對(duì)應(yīng)的類別下的數(shù)目

r.columns =[u'聚類名稱'] +[u'聚類個(gè)數(shù)'] + list(data.columns) #重命名表頭

print(r)

2.客戶價(jià)值分析

#雷達(dá)圖代碼摘自 https://blog.csdn.net/Just_youHG/article/details/83904618

defplot_radar(data):'''the first column of the data is the cluster name;

the second column is the number of each cluster;

the last are those to describe the center of each cluster.'''kinds=data.iloc[:, 0]

labels= data.iloc[:, 2:].columns

centers= pd.concat([data.iloc[:, 2:], data.iloc[:,2]], axis=1)

centers=np.array(centers)

n=len(labels)

angles= np.linspace(0, 2*np.pi, n, endpoint=False)

angles=np.concatenate((angles, [angles[0]]))

fig=plt.figure()

ax= fig.add_subplot(111, polar=True) #設(shè)置坐標(biāo)為極坐標(biāo)

#畫若干個(gè)五邊形

floor = np.floor(centers.min()) #大于最小值的最大整數(shù)

ceil = np.ceil(centers.max()) #小于最大值的最小整數(shù)

for i in np.arange(floor, ceil + 0.5, 0.5):

ax.plot(angles, [i]* (n + 1), '--', lw=0.5 , color='black')#畫不同客戶群的分割線

for i inrange(n):

ax.plot([angles[i], angles[i]], [floor, ceil],'--', lw=0.5, color='black')#畫不同的客戶群所占的大小

for i inrange(len(kinds)):

ax.plot(angles, centers[i], lw=2, label=kinds[i])#ax.fill(angles, centers[i])

ax.set_thetagrids(angles* 180 / np.pi, labels) #設(shè)置顯示的角度,將弧度轉(zhuǎn)換為角度

plt.legend(loc='lower right', bbox_to_anchor=(1.5, 0.0)) #設(shè)置圖例的位置,在畫布外

ax.set_theta_zero_location('N') #設(shè)置極坐標(biāo)的起點(diǎn)(即0°)在正北方向,即相當(dāng)于坐標(biāo)軸逆時(shí)針旋轉(zhuǎn)90°

ax.spines['polar'].set_visible(False) #不顯示極坐標(biāo)最外圈的圓

ax.grid(False) #不顯示默認(rèn)的分割線

ax.set_yticks([]) #不顯示坐標(biāo)間隔

plt.show()

plot_radar(r)#調(diào)用雷達(dá)圖作圖函數(shù)

4、決策支持

三、【拓展思考】客戶流失分析

1、目標(biāo)

2、數(shù)據(jù)預(yù)處理

參考自https://blog.csdn.net/zhouchen1998/article/details/85113535

importpandas as pdfrom datetime importdatetimedefclean(data):'''數(shù)據(jù)清洗,去除空記錄'''data= data[data['SUM_YR_1'].notnull() & data['SUM_YR_2'].notnull()] #票價(jià)非空值才保留

#只保留票價(jià)非零的,或者平均折扣率與總飛行公里數(shù)同時(shí)為0的記錄。

index1 = data['SUM_YR_1'] !=0

index2= data['SUM_YR_2'] !=0

index3= (data['SEG_KM_SUM'] == 0) & (data['avg_discount'] == 0) #該規(guī)則是“與”

data = data[index1 | index2 | index3] #該規(guī)則是“或”

#取出需要的屬性列

data = data[['LOAD_TIME', 'FFP_DATE', 'LAST_TO_END', 'FLIGHT_COUNT', 'avg_discount', 'SEG_KM_SUM', 'LAST_TO_END','P1Y_Flight_Count', 'L1Y_Flight_Count']]returndatadefLRFMCK(data):'''經(jīng)過計(jì)算得到我的指標(biāo)數(shù)據(jù)'''

#其中K為標(biāo)簽標(biāo)示用戶類型

data2 = pd.DataFrame(columns=['L', 'R', 'F', 'M', 'C', 'K'])

time_list=[]for i in range(len(data['LOAD_TIME'])):

str1= data['LOAD_TIME'][i].split('/')

str2= data['FFP_DATE'][i].split('/')

temp= datetime(int(str1[0]), int(str1[1]), int(str1[2])) - datetime(int(str2[0]), int(str2[1]), int(str2[2]))

time_list.append(temp.days)

data2['L'] =pd.Series(time_list)

data2['R'] = data['LAST_TO_END']

data2['F'] = data['FLIGHT_COUNT']

data2['M'] = data['SEG_KM_SUM']

data2['C'] = data['avg_discount']

temp= data['L1Y_Flight_Count'] / data['P1Y_Flight_Count']for i inrange(len(temp)):if temp[i] >=0.9:#未流失客戶

temp[i] = 'A'

elif 0.5 < temp[i] < 0.9:#準(zhǔn)流失客戶

temp[i] = 'B'

else:

temp[i]= 'C'data2['K'] =temp

data2.to_csv('data/data_changed.csv', encoding='utf-8')defstandard():'''標(biāo)準(zhǔn)差標(biāo)準(zhǔn)化'''data= pd.read_csv('data/data_changed.csv', encoding='utf-8').iloc[:, 1:6]#簡(jiǎn)潔的語句實(shí)現(xiàn)了標(biāo)準(zhǔn)化變換,類似地可以實(shí)現(xiàn)任何想要的變換

data = (data - data.mean(axis=0)) / (data.std(axis=0))

data.columns= ['Z' + i for i indata.columns]

data2= pd.read_csv('data/data_changed.csv', encoding='utf-8')

data['K'] = data2['K']

data.to_csv('data/data_standard.csv', index=False)if __name__ == '__main__':

data= pd.read_csv('data/air.csv', encoding='utf-8', engine='python')

data=clean(data)

data.to_csv('data/data_filter.csv', index = False, encoding='utf-8')

data= pd.read_csv('data/data_filter.csv', encoding='utf-8') #不重新讀取的話,調(diào)用LRFMCK會(huì)報(bào)錯(cuò),我也不知道為什么

LRFMCK(data)

standard()

不知道為什么,總是要反復(fù)寫入文件和讀取文件,不然會(huì)莫名其妙的報(bào)錯(cuò)。猜測(cè)可能是csv文件與xls文件不同導(dǎo)致

3、模型構(gòu)建

importpandas as pdfrom sklearn importtreefrom sklearn.model_selection importtrain_test_splitfrom sklearn.metrics import confusion_matrix #導(dǎo)入混淆矩陣函數(shù)

importpydotplus#讀取數(shù)據(jù)

defgetDataSet(fileName):

data=pd.read_csv(fileName)

dataSet=[]for item indata.values:

dataSet.append(list(item[:5]))

label= list(data['K'])returndataSet, label#作圖評(píng)估

defcm_plot(y, yp):

cm= confusion_matrix(y, yp) #混淆矩陣

plt.matshow(cm, cmap=plt.cm.Greens) #畫混淆矩陣圖,配色風(fēng)格使用cm.Greens,更多風(fēng)格請(qǐng)參考官網(wǎng)。

plt.colorbar() #顏色標(biāo)簽

for x in range(len(cm)): #數(shù)據(jù)標(biāo)簽

for y inrange(len(cm)):

plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')

plt.ylabel('True label') #坐標(biāo)軸標(biāo)簽

plt.xlabel('Predicted label') #坐標(biāo)軸標(biāo)簽

returnplt

data, label= getDataSet('data/data_standard.csv')

train_data, test_data, train_label, test_label= train_test_split(data, label, test_size=0.2)#使用決策樹

clf = tree.DecisionTreeClassifier(max_depth=5)

clf=clf.fit(train_data, train_label)#可視化

dataLabels = ['ZL', 'ZR', 'ZF', 'ZM', 'ZC', ]

data_list=[]

data_dict={}for each_label indataLabels:for each indata:

data_list.append(each[dataLabels.index(each_label)])

data_dict[each_label]=data_list

data_list=[]

lenses_pd=pd.DataFrame(data_dict)#print(lenses_pd.keys())

#畫決策樹的決策流程

dot_data =StringIO()

tree.export_graphviz(clf, out_file=dot_data, feature_names=lenses_pd.keys(),

class_names=clf.classes_, filled=True, rounded=True, special_characters=True)

graph=pydotplus.graph_from_dot_data(dot_data.getvalue())

graph.write_pdf("tree.pdf")

cm_plot(test_label, clf.predict(test_data)).show()

總結(jié)

以上是生活随笔為你收集整理的python客户价值分析_[Python数据挖掘]第7章、航空公司客户价值分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。