航空公司客戶聚類結果的T sne視覺化

2022-07-09 11:00:13 字數 3586 閱讀 4691

本文主要承接上文,以tsne的方式,側面驗證聚類的效果。流程大致為:1.用sklearn對資料進行tsne降維; 2.用matplotlib進行資料視覺化和資料探索。

上次寫到航空公司客戶的rfm價值分析,即抽取航空公司2023年4月1日至2023年3月31日的資料,構建出客戶關係長度l、消費時間間隔r、消費頻率f、飛行里程m、折扣係數的平均值c共5個維度的特徵,再對特徵進行標準化後,用k-means聚類,對62044位會員進行聚類,並聚成5個客戶群。

儘管對比聚類中心,我們可以對航空公式當前的客群有乙個大體的learning,但仍然有必要在盡可能保持資料資訊的完整程度的情況下,去判斷當前對每個客戶的聚類結果是否符合我們的預期。由於每位客戶擁有5個維度的特徵,我們沒有辦法去視覺化聚類效果,因此需要對資料進行降維處理。可以考慮的方法有二個:一、主成分分析,在盡可能保持資訊完整度的情況下,把資料轉為不相關的主成分,實現降維;二、t-sne,將高緯度的資料分布對映到低維度的資料,盡可能減少,二種分布的差異。本文嘗試用tsne來實現高維度資料的視覺化分析。

t-sne 演算法概念

t-sne 演算法對每個資料點近鄰的分布進行建模,其中近鄰是指相互靠近資料點的集合。在原始高維空間中,我們將高維空間建模為高斯分布,而在二維輸出空間中,我們可以將其建模為 t 分布。該過程的目標是找到將高維空間對映到二維空間的變換,並且最小化所有點在這兩個分布之間的差距。與高斯分布相比 t 分布有較長的尾部,這有助於資料點在二維空間中更均勻地分布。

控制擬合的主要引數為困惑度(perplexity)。困惑度大致等價於在匹配每個點的原始和擬合分布時考慮的最近鄰數,較低的困惑度意味著我們在匹配原分布並擬合每乙個資料點到目標分布時只考慮最近的幾個最近鄰,而較高的困惑度意味著擁有較大的「全域性觀」。

因為分布是基於距離的,所以所有的資料必須是數值型。我們應該將類別變數通過二值編碼或相似的方法轉化為數值型變數,並且歸一化資料也是也十分有效,因為歸一化資料後就不會出現變數的取值範圍相差過大。

當前的資料結構為標準化後的客戶關係長度l、消費時間間隔r、消費頻率f、飛行里程m、折扣係數的平均值c,資料結構如下:

我們把客戶聚成5類客戶群,其中

客戶群1,數量最少,所乘航班折扣率較高(一般所乘航班的等級較高),屬於重要發展客戶

客戶群2,數量較多,乘坐次數很少,累計總飛行公里數較少,很久沒有乘坐飛機,屬於低價值客戶

客戶群3,累計總飛行公里數較大,飛行次數較多,最近乘坐過飛機,屬於重要保持客戶

客戶群4,數量較多,所乘航班折扣率較低,加入會員時間短,這類客戶一般在打折時才會乘坐航班,屬於一般客戶.

客戶群5,數量較多,加入會員時間長,但是最近乘坐頻率變小,屬於重要挽留客戶

我們先把所有的樣本和樣本的聚類結果先拼接在一起:

data = pd.concat([data_features,pd.series(kmodel.predict(data_features),index =data_features.index,name ="

cluster

") ],axis=1)

#選500個樣本

x = data[data.columns[:-1]].sample(n=500,axis = "

index

",random_state=1234)

labels = data[data.columns[-1]].sample(n=500,axis = "

index

",random_state=1234)

為了把聚類中心,也畫上去,我們也需要對聚類中心進行t-sne演算法的對映:

呼叫sklearn中的工具,對當前的資料集進行t-sne的對映:

from sklearn.manifold import

tsne

y = tsne(learning_rate=100,random_state=1234).fit_transform(x ,labels )

通過matplotlib,對轉換後的資料進行視覺化:

import

numpy as np

np.random.seed(19680801)

import

matplotlib.pyplot as plt

fig, ax =plt.subplots()

for label in

labels.unique():

ax.scatter(y[:,0][labels.index == "

客戶群" + str(label+1)],y[:,1][labels.index == "

客戶群" + str(label +1)],s=100,marker = "

*",edgecolors = "b"

) ax.text(y[:,0][labels.index == "

客戶群" + str(label+1)],y[:,1][labels.index == "

客戶群" + str(label +1)],f"

客戶群"

) ax.scatter(y[:,0][labels == label], y[:,1][labels == label], s=20, label="

客戶群" + str(label+ 1),)

ax.legend()

ax.set_xlim([-25,40])

plt.show()

得到的結果如下圖:

和咱們之前的learning相比,t-sne的視覺化結果可以發現:

展示的結果基本符合了我們對不同客群的預期了解。

pease&love

誒,又乙個雙十一了,j可以揮霍的時間又少了一年噢。

額,最近小夥伴們似乎發現了j最近的變化。畢竟不可能一直走可愛路線吧,這不也想試試看能不能成精緻的豬豬男孩麼。借各位吉言,j重回單身了。每一段感情後呀,多少都會有些思考和感悟啦。安靜的時候還是會想東西,跟別人說話的時候也會多乙份暖意。開始留意下巴有沒剃乾淨的鬍渣,也明白不是所有人都喜歡替自己擦去臉頰汗珠的感覺。哦,下班路過專櫃時,也會開始留意些什麼。(錢包,危。。)

emm,其實我以為可以很快振作重新開始啦,但是沒想到健忘的人呀,要放下也沒那麼容易啦。不過難受的時候呀,想想被刪掉的**呀,想想昏昏沉沉回到上海的那天,直到過了12點還是收到其他人的問候的時候呀,我也就釋然了吧。

也許呀,等到放晴的那天,也許我會比較好一點。

對了,我的結他還像要練成了噢。

航空公司VIP客戶查詢

5 12 航空公司vip客戶查詢 25分 不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。輸入首先給出兩個正整數n n le 10 5 1...

航空公司VIP客戶查詢

think 用stl水的,開乙個map string,int 來儲存,輸入的時候判斷里程len是否大於給定的k值,輸出時判斷是否為0。不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實...

航空公司VIP客戶查詢

航空公司vip客戶查詢 不少航空公司都會提供優惠的會員服務,當某顧客飛行里程累積達到一定數量後,可以使用里程積分直接兌換獎勵機票或獎勵公升艙等服務。現給定某航空公司全體會員的飛行記錄,要求實現根據身份證號碼快速查詢會員里程積分的功能。輸入首先給出兩個正整數n 10 5 和k 500 其中k是最低里程...