
一.項(xiàng)目背景
為了建立客戶信息資源管理及運(yùn)營(yíng)模式,某公司希望通過(guò)客戶的基本消費(fèi)信息進(jìn)行分析,
衡量客戶價(jià)值和客戶創(chuàng)利能力,優(yōu)化客戶資源,提高營(yíng)銷效率,避免不必要的資源
二.實(shí)現(xiàn)步驟
1.導(dǎo)包讀入數(shù)據(jù),篩選所需數(shù)據(jù)
# 導(dǎo)入所需庫(kù)
import numpy as np
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import time
import matplotlib.gridspec as gridspec
#import pyecharts
# 解決 matplotlib 顯示中文、負(fù)號(hào)問(wèn)題
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
#獲取數(shù)據(jù)
def get_data(file_path):
#讀取數(shù)據(jù)
df1= pd.read_excel(file_path)
# 提取 RFM 模型所需特征列:'訂單編號(hào)','買家會(huì)員名','買家實(shí)際支付貨款','訂單付款時(shí)間','寶貝總數(shù)量'
df2 = df1[['訂單編號(hào)','買家會(huì)員名','買家實(shí)際支付金額','訂單付款時(shí)間','寶貝總數(shù)量']]
#返回?cái)?shù)據(jù)
return df2
2.數(shù)據(jù)重復(fù)值缺失值處理
#處理數(shù)據(jù)
def process_data(df):
#判斷有沒(méi)有重復(fù)值
if df.duplicated().sum()==0:
print('無(wú)重復(fù)數(shù)據(jù)')
else:
#刪除重復(fù)值
df=df.drop_duplicates(inplace=True)
#判斷有沒(méi)有缺失值
if df.isnull().any().sum()==0:
print('無(wú)缺失值')
else:
#刪除缺失值
df=df.dropna(inplace=True)
#返回?cái)?shù)據(jù)
return df
3.獲取RFMP各項(xiàng)值
#獲取R值
def get_R(df):
# 計(jì)算時(shí)間差
time_minus = datetime.datetime.now()- df['訂單付款時(shí)間']
# 將時(shí)間差轉(zhuǎn)換成數(shù)字格式
df['prior_R'] = time_minus.astype(str).str.findall('d+.*d*').map(lambda x: int(x[0]) + (int(x[1]) / 24) +
(int(x[2]) / (24 * 60)) + (float(x[3]) / (24 * 3600)))
# 按會(huì)員進(jìn)行分組,確定每個(gè)會(huì)員最近一次購(gòu)買離現(xiàn)在的時(shí)間間隔
R = df.groupby('買家會(huì)員名')['prior_R'].min()
return R
#獲取FMP值,P值表示買家購(gòu)買數(shù)量
def get_F_M_P(df):
# 按會(huì)員進(jìn)行分組,確定每個(gè)會(huì)員的訂單數(shù)量
F = df.groupby('買家會(huì)員名')['訂單編號(hào)'].count()
# 按會(huì)員進(jìn)行分組,確定每個(gè)會(huì)員的實(shí)際支付金額
M = df.groupby('買家會(huì)員名')['買家實(shí)際支付金額'].sum()
# 按會(huì)員進(jìn)行分組,確定每個(gè)會(huì)員的寶貝總數(shù)量
P = df.groupby('買家會(huì)員名')['寶貝總數(shù)量'].sum()
return (F,M,P)
#將RFMP數(shù)據(jù)合成DataFrame
def get_data(R,F,M,P):
#列名稱
col_list = list('RFMP')
#創(chuàng)建DataFrame
model_data = pd.DataFrame([], index=R.index)
#添加數(shù)據(jù)
for col_names, values in zip(col_list, [R, F, M, P]):
model_data[col_names] = values
#類型轉(zhuǎn)換
model_data = model_data.astype(float)
#返回?cái)?shù)據(jù)
return model_data
4.利用Kmeans算法進(jìn)行分類
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler, MinMaxScaler
#獲取數(shù)據(jù)
df0 = model_data.iloc[:, 0:4]
#標(biāo)準(zhǔn)化數(shù)據(jù)
res_std = StandardScaler().fit_transform(df0)
#分類簇?cái)?shù)
n_clusters = range(2, 7)
#評(píng)分標(biāo)準(zhǔn)
scores = []
#遍歷每種分類
for i in range(len(n_clusters)):
#訓(xùn)練模型
clf = KMeans(n_clusters = n_clusters[i], random_state = 20).fit(res_std)
#獲取評(píng)分
scores.append(silhouette_score(res_std, clf.labels_))
#獲取最大評(píng)分索引
maxindex = scores.index(max(scores))
#初始畫(huà)布
plt.figure(figsize = (8, 6), dpi = 100)
#繪制圖形
plt.plot(n_clusters, scores, linestyle = '-.', c = 'b', alpha = 0.6, marker = 'o')
#編輯最佳簇?cái)?shù)
plt.axvline(x = n_clusters[maxindex], linestyle = '--', c = 'r', alpha = 0.5)
#設(shè)置標(biāo)題
plt.title('RFMP的聚類輪廓系數(shù)圖')
#設(shè)置y軸標(biāo)簽
plt.ylabel('silhouette_score')
#設(shè)置x軸標(biāo)簽
plt.xlabel('n_clusters')
#存儲(chǔ)圖形
plt.savefig('./RFMP聚類輪廓系數(shù)圖.png')

#獲取最佳分簇?cái)?shù)模型
clf = KMeans(n_clusters = 2, random_state = 20).fit(res_std)
#添加label
df0['labels'] = clf.labels_
df0

# 統(tǒng)計(jì)一下兩類用戶之間的差異,發(fā)現(xiàn)兩類客戶之間數(shù)量相差過(guò)大
print(f"類別0所占比例為:{df0['labels'].value_counts().values[0] / df0.shape[0]} t 類別1所占的比例為:{df0['labels'].value_counts().values[1] / df0.shape[0]}")
df0['labels'].value_counts()

#用均值來(lái)評(píng)估兩類樣本之間的LRFMP
R_avg = df0.groupby('labels').agg({'R': np.mean}).reset_index()
F_avg = df0.groupby('labels').agg({'F': np.mean}).reset_index()
M_avg = df0.groupby('labels').agg({'M': np.mean}).reset_index()
P_avg = df0.groupby('labels').agg({'P': np.mean}).reset_index()
# 繪制相關(guān)的條形圖
def plot_bar(df_list, nrow, ncol):
#初始畫(huà)布
fig, axs = plt.subplots(nrow, ncol, figsize = (2 * (ncol + 2), 2.5), dpi = 100)
#遍歷每個(gè)坐標(biāo)系
for i in range(len(axs)):
#獲取坐標(biāo)系
ax = axs[i]
#獲取數(shù)據(jù)
df = df_list[i]
#畫(huà)柱狀圖
ax.bar(df.iloc[:, 0], df.iloc[:, 1], color = 'm', alpha = 0.4, width = 0.5)
#獲取RFMP標(biāo)簽對(duì)應(yīng)數(shù)值
for x, y in enumerate(df.iloc[:, 1].tolist()):
#標(biāo)注數(shù)據(jù)
ax.text(x, y / 2, '%.0f' % y, va = 'bottom', ha = 'center', fontsize = 12)
#設(shè)置x軸刻度
ax.set_xticks([0, 1])
#設(shè)置y軸刻度
ax.set_yticks(())
#設(shè)置小標(biāo)題
ax.set_title(f'{df.columns[1]}')
#設(shè)置大標(biāo)題
plt.suptitle('兩類客戶的RFMP均值差異', y = 1.1, fontsize = 14)
#存儲(chǔ)圖片
plt.savefig('./兩類客戶LRFMP均值差異.png')
#獲取數(shù)據(jù)
df_list = [ R_avg, F_avg, M_avg, P_avg]
#繪制圖形
plot_bar(df_list, 1, 4)
總結(jié):分為兩類用戶效果確實(shí)很明顯,但是分析還是有點(diǎn)一刀切,我們發(fā)現(xiàn)圖中四類效果也
不是很差,后期感興趣讀者可以進(jìn)行四類用戶分類,在這里主要還是給大家一個(gè)思維拓展.

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
分析
+關(guān)注
關(guān)注
2文章
134瀏覽量
33634 -
模式
+關(guān)注
關(guān)注
0文章
65瀏覽量
13606 -
信息資源
+關(guān)注
關(guān)注
0文章
3瀏覽量
5989
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
基于多通道分類合成的SAR圖像分類研究
。目前,SAR圖像分類多是基于單通道圖像數(shù)據(jù)。多通道SAR數(shù)據(jù)極大地豐富了地物目標(biāo)信息量,利用多通道數(shù)據(jù)進(jìn)行分類,是SAR圖像分類的重要發(fā)展方向。本文提出基于多通道
發(fā)表于 04-23 11:52
選項(xiàng)卡跳轉(zhuǎn),實(shí)現(xiàn)用戶登錄后跳轉(zhuǎn)到計(jì)時(shí)選項(xiàng)卡
選項(xiàng)卡跳轉(zhuǎn),實(shí)現(xiàn)用戶登錄后跳轉(zhuǎn)到計(jì)時(shí)選項(xiàng)卡
發(fā)表于 12-13 16:48
利用labSQL做一個(gè)用戶管理 如何實(shí)現(xiàn)
和pc機(jī)連接是沒(méi)問(wèn)題的 我現(xiàn)在可以實(shí)現(xiàn)利用labSQL的添加刪除查詢等簡(jiǎn)單實(shí)現(xiàn)現(xiàn)在我想實(shí)現(xiàn)用戶管理的功能,包括查找?guī)炖锸欠翊嬖谠?b class='flag-5'>用戶刪除選定
發(fā)表于 09-28 15:44
labview巧用配置文件實(shí)現(xiàn)用戶登錄系統(tǒng)
;gt;在利用labview虛擬儀器時(shí),需要制作一個(gè)登陸系統(tǒng)。這里總結(jié)了3種方法:1、利用固定常量數(shù)組制作登錄系統(tǒng)該方法實(shí)現(xiàn)簡(jiǎn)單,但用戶名和密碼不能修改。這里不做詳細(xì)介紹。2、
發(fā)表于 11-27 15:49
自定義Kmeans函數(shù)對(duì)多個(gè)坐標(biāo)點(diǎn)進(jìn)行自動(dòng)分類的實(shí)現(xiàn)
ML之Kmeans:利用自定義Kmeans函數(shù)實(shí)現(xiàn)對(duì)多個(gè)坐標(biāo)點(diǎn)(自定義四個(gè)點(diǎn))進(jìn)行自動(dòng)(最多迭代10次)分類
發(fā)表于 12-25 10:51
請(qǐng)問(wèn)一下怎么實(shí)現(xiàn)用戶自定制LED驅(qū)動(dòng)器的設(shè)計(jì)?
請(qǐng)問(wèn)一下怎么實(shí)現(xiàn)用戶自定制LED驅(qū)動(dòng)器的設(shè)計(jì)?
發(fā)表于 06-08 06:32
利用KNN算法實(shí)現(xiàn)基于系統(tǒng)調(diào)用的入侵檢測(cè)技術(shù)
該算法來(lái)自一種文本分類算法-KNN 算法,文中給出了用該算法實(shí)現(xiàn)的入侵檢測(cè)系統(tǒng)模型.
發(fā)表于 06-13 11:01
?18次下載
流分類算法的分類及比較
流分類算法的分類及比較
流分類算法可以根據(jù)不同的原則進(jìn)行分類,本文根據(jù)對(duì)多個(gè)區(qū)域查找之間的關(guān)系
發(fā)表于 03-04 11:26
?2138次閱讀
基于用戶身份特征的多標(biāo)簽分類算法
目前對(duì)于智慧校園中的家校溝通,缺乏一種衡量和參考的方法。針對(duì)智慧校園中特有的聊天特點(diǎn)即存在明顯的身份特征,提出了一種基于用戶身份特征的多標(biāo)簽分類算法-Adaboost. ML。首先,新增加了啟發(fā)式
發(fā)表于 12-01 16:22
?0次下載
如何使用直方圖條件熵實(shí)現(xiàn)水聲數(shù)據(jù)分類的算法
,對(duì)水聲數(shù)據(jù)直方圖進(jìn)行分段,使用條件熵判別式分別計(jì)算出每一個(gè)分段直方圖的最佳特征閾值,賦予其相應(yīng)的不透明度傳遞函數(shù),以實(shí)現(xiàn)對(duì)水聲數(shù)據(jù)的分類。實(shí)驗(yàn)結(jié)果表明,該算法能夠較好地實(shí)現(xiàn)水聲數(shù)據(jù)的
發(fā)表于 01-20 10:18
?22次下載

愛(ài)立信性能優(yōu)化器實(shí)現(xiàn)用戶體驗(yàn)最優(yōu)化
作為愛(ài)立信認(rèn)知軟件產(chǎn)品組合的一部分,“愛(ài)立信性能優(yōu)化器(Ericsson Performance Optimizers)”采用了數(shù)字孿生技術(shù),以及深度強(qiáng)化學(xué)習(xí)等先進(jìn)AI技術(shù),充分利用網(wǎng)絡(luò)優(yōu)化技術(shù)的自動(dòng)化、可擴(kuò)展性、速度、精度和一致性,同時(shí)實(shí)現(xiàn)用戶體驗(yàn)最優(yōu)化與運(yùn)營(yíng)商效益最大
在洗碗機(jī)中設(shè)計(jì)和實(shí)現(xiàn)用戶界面的新方法
在洗碗機(jī)中設(shè)計(jì)和實(shí)現(xiàn)用戶界面的新方法
發(fā)表于 10-31 08:23
?3次下載

EtherCAT運(yùn)動(dòng)控制器PT/PVT實(shí)現(xiàn)用戶自定義軌跡規(guī)劃
EtherCAT運(yùn)動(dòng)控制器PT/PVT實(shí)現(xiàn)用戶自定義軌跡規(guī)劃。

評(píng)論