0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

細(xì)分模型探索性數(shù)據(jù)分析和預(yù)處理

數(shù)據(jù)分析與開發(fā) ? 來源:數(shù)據(jù)STUDIO ? 作者:云朵君 ? 2021-11-08 16:05 ? 次閱讀

導(dǎo)讀:今天給大家?guī)砹艘粋€Python業(yè)務(wù)分析實戰(zhàn)項目——客戶細(xì)分模型的應(yīng)用案例上篇,本文闡述比較詳細(xì),包括代碼演示、可視化圖形展示、以及文字詳細(xì)分析。分析較淺,希望能夠給大家?guī)硇┰S幫助,歡迎交流學(xué)習(xí)!文章較長,建議收藏~

客戶細(xì)分模型是將整體會員劃分為不同的細(xì)分群體或類別,然后基于細(xì)分群體做管理、營銷和關(guān)懷。客戶細(xì)分模型常用于整體會員的宏觀性分析以及探索性分析,通過細(xì)分建立初步認(rèn)知,為下一步的分析和應(yīng)用提供基本認(rèn)知。常用方法包括:基于屬性的方法、ABC分類法、聚類法

基于屬性方法

  • 客戶地域 -- 如北京、上海
  • 產(chǎn)品類別 -- 如家電、圖書
  • 客戶類別 -- 大客戶、普通客戶、VIP客戶
  • 客戶性別 -- 男、女
  • 會員消費(fèi)等級 -- 高、中、低價值會員

ABC分類法

Activity Based Classification 是根據(jù)事物的主要特征做分類排列,從而實現(xiàn)區(qū)別對待、區(qū)別管理的一種方法。ABC法則強(qiáng)調(diào)的是分清主次。具體做法,先將目標(biāo)數(shù)據(jù)列倒序排序,然后做累積百分比統(tǒng)計,最后將得到的累積百分比按照下面的比例劃分為A、B、C三類。

  • A類因素:主要影響,累積頻次為0%~80%
  • B類因素:次要影響,累積頻次為80%~90%
  • C類因素:一般影響,累積頻次為90%~100%

聚類法

常用的非監(jiān)督方法,無須任何的先驗知識,只需要指定要劃分的群體數(shù)量即可。這里可以參見總結(jié)的常用聚類模型kmeans聚類

本文客戶細(xì)分方法

將使用電子商務(wù)用戶購買商品數(shù)據(jù)集,并嘗試開發(fā)一個模型,主要目的是完成以下兩個部分。

  1. 對客戶進(jìn)行細(xì)分。
  2. 通過為新客戶分配適當(dāng)?shù)拇厝海A(yù)測下一年新客戶將進(jìn)行的購買行為。

本文主要內(nèi)容

本次實戰(zhàn)項目共分為上下兩部分,上篇(本篇)包括探索性數(shù)據(jù)分析,產(chǎn)品類別分析兩部分;下篇將包括客戶細(xì)分和客戶行為分析與預(yù)測。本篇主要結(jié)構(gòu)與內(nèi)容思維導(dǎo)圖如下圖所示。

探索性數(shù)據(jù)分析和預(yù)處理

數(shù)據(jù)準(zhǔn)備

df_initial=pd.read_csv('./data.csv')
print('Dataframe維度:',df_initial.shape)
df_initial['InvoiceDate']=pd.to_datetime(df_initial['InvoiceDate'])
df_initial.columns=['訂單編號','庫存代碼','描述','數(shù)量',
'訂單日期','單價','客戶ID','國家']
display(df_initial[:5])

Dataframe維度: (284709, 8)

c535b18c-4057-11ec-9195-dac502259ad0.png

缺失值分析

缺失值分析與處理是指對原始數(shù)據(jù)中缺失的數(shù)據(jù)項進(jìn)行預(yù)處理,以免影響模型精度和穩(wěn)定性。數(shù)據(jù)缺失值處理方法有不少,這里可以參見之前總結(jié)的缺失值處理,你真的會了嗎?

#提供有關(guān)列類型和空值數(shù)量的一些信息
tab_info=pd.DataFrame(df_initial.dtypes).T.rename(index={0:'字段類型'})
tab_info=tab_info.append(pd.DataFrame(
df_initial.isnull().sum()
).T.rename(index={0:'空值量(nb)'}))
tab_info=tab_info.append(pd.DataFrame(
df_initial.isnull().sum()/df_initial.shape[0]*100
).T.rename(index={0:'空值率(%)'}))
print('-'*10+"顯示有關(guān)列類型和空值數(shù)量的信息"+'-'*10)
display(tab_info)

------- 顯示有關(guān)列類型和空值數(shù)量的信息 -------

c5a71d9a-4057-11ec-9195-dac502259ad0.png

刪除缺失值

從上面缺失值分析結(jié)果看到,客戶ID約22%的數(shù)據(jù)記錄是空的,這意味著有約22%的數(shù)據(jù)記錄沒有分配給任何客戶。而我們不可能把這些記錄的值映射到任何客戶。所以這些對于目前是沒有用的,因此我們可以將其刪除。

df_initial.dropna(axis=0,
subset=['客戶ID'],
inplace=True)

刪除重復(fù)值

print('重復(fù)的數(shù)據(jù)條目:{}'.format(
df_initial.duplicated().sum()))
df_initial.drop_duplicates(inplace=True)

重復(fù)的數(shù)據(jù)條目: 3175

變量'國家'分析

temp=df_initial[['客戶ID','訂單編號','國家']].groupby(
['客戶ID','訂單編號','國家']).count()
temp=temp.reset_index(drop=False)
countries=temp['國家'].value_counts()

統(tǒng)計下來,共有32個國家。并根據(jù)每個國家的訂單量進(jìn)行計數(shù)求和,排序后繪制國家--國家訂單量柱狀圖,如下所示。

變量'客戶和產(chǎn)品'分析

本數(shù)據(jù)包含約200,000條記錄。這些記錄中的用戶和產(chǎn)品數(shù)量分別是多少呢?

pd.DataFrame([{'產(chǎn)品':len(df_initial['庫存代碼'].value_counts()),
'交易':len(df_initial['訂單編號'].value_counts()),
'客戶':len(df_initial['客戶ID'].value_counts()),
}],
columns=['產(chǎn)品','交易','客戶'],
index=['數(shù)量'])

		
產(chǎn)品 交易 客戶
數(shù)量 3182 11068 3341

可以看到,該數(shù)據(jù)集包含3341個用戶的記錄,這些用戶購買了3182種不同的商品。有約11000的交易被執(zhí)行?,F(xiàn)在我們需要了解每筆交易中購買的產(chǎn)品數(shù)量。

temp=df_initial.groupby(by=['客戶ID','訂單編號'],
as_index=False)['訂單日期'].count()
nb_products_per_basket=temp.rename(
columns={'訂單日期':'產(chǎn)品數(shù)量'})
nb_products_per_basket[:10].sort_values('客戶ID')
c6771dba-4057-11ec-9195-dac502259ad0.png

此處需注意的要點:

  • 有一些用戶在電子商務(wù)平臺上只購買了一次,或只購買了一件商品。這類用戶如客戶ID為12371。
  • 有一些用戶經(jīng)常在每個訂單中購買大量商品。這類用戶如客戶ID為12347。

如果你仔細(xì)觀察訂單編號數(shù)據(jù)特征,那么你很容易就能發(fā)現(xiàn)有些訂單編號有個前綴C。這個C表示該訂單已經(jīng)被取消。如下圖中C560735。下面就來具體分析下取消的訂單一些特征。

c6d7fec8-4057-11ec-9195-dac502259ad0.png

取消訂單分析

這里統(tǒng)計被取消訂單對應(yīng)的交易數(shù)量。

nb_products_per_basket['取消訂單量']=nb_products_per_basket['訂單編號'].apply(
lambdax:int('C'inx))
display(nb_products_per_basket.query("取消訂單量!=0")[:5])
#計算取消訂單量的比例
n1=nb_products_per_basket['取消訂單量'].sum()
n2=nb_products_per_basket.shape[0]
percentage=(n1/n2)*100
print('取消訂單數(shù)量:{}/{}({:.2f}%)'.format(n1,n2,percentage))
c722818c-4057-11ec-9195-dac502259ad0.png

取消訂單數(shù)量: 1686/11068 (15.23%)

得到結(jié)果已取消的交易數(shù)目相當(dāng)大(約占交易總數(shù)的15%)。這里,仔細(xì)觀察數(shù)據(jù)集,尤其是取消的訂單,可以想到,當(dāng)一個訂單被取消時,在數(shù)據(jù)集中可能會存在另一條對應(yīng)的記錄,該記錄除了數(shù)量訂單日期變量之外,其他變量內(nèi)容基本相同。下面檢查一下是否所有的記錄都是這樣的。具體做法是:

  • 先篩選出負(fù)數(shù)數(shù)量的記錄,并在所有數(shù)據(jù)中檢查是否有一個具有相同數(shù)量(但為正)的訂單,其它屬性都相同(客戶ID,描述單價)
  • 有些取消訂單中,描述列會標(biāo)注"Discount",因此將包含該特征的記錄篩除后尋找。
c7818a92-4057-11ec-9195-dac502259ad0.png
df_check=df_initial[(df_initial['數(shù)量']'描述']!='Discount')][
['客戶ID','數(shù)量','庫存代碼','描述','單價']]
forindex,colindf_check.iterrows():
ifdf_initial[(df_initial['客戶ID']==col[0]
)&(df_initial['數(shù)量']==-col[1])
&(df_initial['描述']==col[2])].shape[0]==0:
print(index,df_check.loc[index])
print(25*'-'+'>'+'假設(shè)不成立')
break

279 客戶ID 14808.0
數(shù)量 -1
庫存代碼 22655
描述 VINTAGE RED KITCHEN CABINET
單價 125.0
Name: 279, dtype: object
-----------------------------> 假設(shè)不成立

沒有得到理想的結(jié)果,說明取消訂單不一定與事先已下的訂單相對應(yīng)。此時,可以在數(shù)據(jù)表中創(chuàng)建一個新變量,用于指示是否取消了部分訂單。而對于其中沒有對應(yīng)購買訂單的取消訂單記錄,可能是由于購買訂單是在錄入數(shù)據(jù)庫之前執(zhí)行的。下面對取消的訂單進(jìn)行了一次普查,并檢查是否有對應(yīng)購買訂單存在。

df_cleaned=df_initial.copy(deep=True)
df_cleaned['取消訂單數(shù)量']=0

entry_to_remove=[];doubtfull_entry=[]

forindex,colindf_initial.iterrows():#全表掃描
if(col['數(shù)量']>0)orcol['描述']=='Discount':continue
df_test=df_initial[(df_initial['客戶ID']==col['客戶ID'])&
(df_initial['庫存代碼']==col['庫存代碼'])&
(df_initial['訂單日期']'訂單日期'])&
(df_initial['數(shù)量']>0)].copy()

#沒有對應(yīng)項的取消訂單
if(df_test.shape[0]==0):
doubtfull_entry.append(index)

#有對應(yīng)項的取消訂單
elif(df_test.shape[0]==1):
index_order=df_test.index[0]
df_cleaned.loc[index_order,'取消訂單數(shù)量']=-col['數(shù)量']
entry_to_remove.append(index)

#不同的對應(yīng)項是按順序存在的:我們刪除最后一個
elif(df_test.shape[0]>1):
df_test.sort_index(axis=0,ascending=False,inplace=True)
forind,valindf_test.iterrows():
ifval['數(shù)量']'數(shù)量']:continue
df_cleaned.loc[ind,'取消訂單數(shù)量']=-col['數(shù)量']
entry_to_remove.append(index)
break

沒有對應(yīng)購買記錄的取消訂單和有對應(yīng)購買記錄的取消訂單分別存儲在'doubtfull_entryentry_to_remove列表,他們的個數(shù)分別為1672和3435,而這部分?jǐn)?shù)據(jù)我們也需要將其刪除。

庫存代碼分析

從上面分析內(nèi)容中看到,庫存代碼變量的一些值表示一個特定的交易(D代表Discount)。下面通過正則表達(dá)式尋找只包含字母的代碼集,統(tǒng)計出這個變量都有哪些值。

list_special_codes=df_cleaned[df_cleaned['庫存代碼'
].str.contains('^[a-zA-Z]+',
regex=True)]['庫存代碼'].unique()
#并通過對應(yīng)"描述"變量來尋找每個代碼的具體解釋。
forcodeinlist_special_codes:
print("{:<15}?->{:<30}".format(
code,df_cleaned[df_cleaned['庫存代碼']==code]['描述'].unique()[0]))
M               -> Manual                   
POST            -> POSTAGE                  
C2              -> CARRIAGE                 
PADS            -> PADS TO MATCH ALL CUSHIONS
DOT             -> DOTCOM POSTAGE           
BANK CHARGES    -> Bank Charges

我們看到有幾種特殊的交易類型,如與港口費(fèi)或銀行費(fèi)有關(guān)。

購物車價格分析

接下來是衍生變量:每次購買的總價 = 單價 * (訂單數(shù)量 - 取消訂單數(shù)量)

df_cleaned['總價']=df_cleaned['單價']*
(df_cleaned['數(shù)量']-df_cleaned['取消訂單數(shù)量'])
df_cleaned.sort_values('客戶ID')[:5]
c7d77222-4057-11ec-9195-dac502259ad0.png

數(shù)據(jù)集中的每一條記錄都表示一種產(chǎn)品的價格。而一條訂單可以被分成幾條記錄。因此需要將一條訂單中所有價格匯總求和,得到每一個訂單總價。

  • 以客戶ID和訂單編號作為聚合對象,對總價進(jìn)行求和。
  • 訂單日期處理,現(xiàn)將訂單日期轉(zhuǎn)換為整數(shù)類型,聚合后求平均值,在轉(zhuǎn)換為日期型。
  • 最后篩選出購物車價格大于0的重要記錄。
#購物車訂單總價
temp=df_cleaned.groupby(by=['客戶ID','訂單編號'],
as_index=False)['總價'].sum()
basket_price=temp.rename(columns={'總價':'購物車價格'})

#處理訂單日期
df_cleaned['訂單日期_int']=df_cleaned['訂單日期'].astype('int64')
temp=df_cleaned.groupby(by=['客戶ID','訂單編號'],
as_index=False)['訂單日期_int'].mean()
df_cleaned.drop('訂單日期_int',axis=1,inplace=True)
basket_price.loc[:,'訂單日期']=pd.to_datetime(temp['訂單日期_int'])

#重要記錄選擇
basket_price=basket_price[basket_price['購物車價格']>0]
basket_price.sort_values('客戶ID')[:6]
c83456ea-4057-11ec-9195-dac502259ad0.png

接下來將購物車總價進(jìn)行離散化處理,并匯總可視化得到如下圖所示的結(jié)果。

可以看出,絕大多數(shù)訂單購買價格相對較大的,約有65%的采購超過了200英鎊的價格。

產(chǎn)品類別分析

在數(shù)據(jù)集中,產(chǎn)品是通過變量庫存代碼唯一標(biāo)識的。產(chǎn)品的簡短描述在變量描述中給出。在這里計劃使用后一個變量的內(nèi)容,即變量描述,以便將產(chǎn)品分組到不同的類別中。因此這里就涉及到自然語言處理,需要先將簡短描述分詞后再統(tǒng)計。由于數(shù)據(jù)集使用的是純英文數(shù)據(jù)集,因此這里選用nltk庫進(jìn)行處理。

產(chǎn)品描述

首先從描述變量中提取有用的信息。因此這里定義了一個函數(shù)。

keywords_inventory(dataframe,colonne='描述')

這個函數(shù)以dataframe作為輸入,分析描述列的內(nèi)容,執(zhí)行如下操作:

  • 提取產(chǎn)品描述中出現(xiàn)的名稱(適當(dāng)?shù)?,常見?
  • 對于每個名稱,提取單詞的根,并聚合與這個特定根相關(guān)的名稱集
  • 每個根出現(xiàn)在數(shù)據(jù)集中的次數(shù)計數(shù)
  • 當(dāng)幾個單詞被列出為同一個詞根時,我認(rèn)為與這個詞根相關(guān)的關(guān)鍵字是最短的名字(當(dāng)有單數(shù)/復(fù)數(shù)變體時,系統(tǒng)地選擇單數(shù))

這個函數(shù)的執(zhí)行返回四個變量:

  • ' keywords '
    提取的關(guān)鍵字列表
['lunch',
'bag',
'design',
'suki',]
  • ' keywords_roots '
    一個字典,其中鍵是關(guān)鍵字的根,值是與這些根相關(guān)聯(lián)的單詞列表
{'lunch':{'lunch'},
'bag':{'bag','bags'},
'design':{'design','designs'},
'suki':{'suki'},}
  • ' count_keywords '
    字典中列出每個單詞使用的次數(shù)
{'lunch':24,
'bag':136,
'design':116,
'suki':7,}
  • 'keywords_select'
    字典中列出每個單詞詞根<->關(guān)鍵字間的關(guān)聯(lián)關(guān)系
{'lunch':'lunch',
'bag':'bag',
'design':'design',
'suki':'suki',
'regenc':'regency'}

接下來先對所有產(chǎn)品描述進(jìn)行去重處理,再運(yùn)用上面定義的函數(shù)進(jìn)行詞根提取并統(tǒng)計.

df_produits=pd.DataFrame(df_initial['描述'].unique()
).rename(columns={0:'描述'})
keywords,keywords_roots,keywords_select,
count_keywords=keywords_inventory(df_produits)

從結(jié)果看,變量中關(guān)鍵字'描述'的數(shù)量共 1347個。此時,將其中一個結(jié)果' count_keywords '字典轉(zhuǎn)換為一個列表,根據(jù)關(guān)鍵詞的出現(xiàn)情況對它們進(jìn)行排序。

因為字體有點小,不過不影響我們理解實操邏輯。你也可以通過繪制橫向柱狀圖,調(diào)大軸標(biāo)簽大小,來自己探究每個詞根。大家可以自己嘗試。

定義產(chǎn)品類別

上面結(jié)果中,我們獲得的列表中包含1400多個關(guān)鍵詞,而最頻繁的關(guān)鍵詞出現(xiàn)在200多種產(chǎn)品中。然而,在仔細(xì)檢查列表中內(nèi)容時發(fā)現(xiàn),有很多名稱是無用的,不攜帶任何有用的信息,比如顏色、標(biāo)簽等。因此,接下來需要將這些詞從數(shù)據(jù)集中刪除。另外,為了更加便捷有效地分析數(shù)據(jù),我決定只考慮那些出現(xiàn)超過13次的詞。

list_products=[]
fork,vincount_keywords.items():
word=keywords_select[k]
ifwordin['pink','blue','tag','green','orange']:continue
iflen(word)continue
if('+'inword)or('/'inword):continue
list_products.append([word,v])

list_products.sort(key=lambdax:x[1],reverse=True)
print('保留詞:',len(list_products))

從結(jié)果看,共保留了164個關(guān)鍵詞。分完詞并處理后 ,還沒有結(jié)束,還需要將文字轉(zhuǎn)化為數(shù)字,這個過程就是數(shù)據(jù)編碼過程。

數(shù)據(jù)編碼

首先定義編碼規(guī)則,將使用上面得到的關(guān)鍵字創(chuàng)建產(chǎn)品組。將矩陣定義如下,其中,如果產(chǎn)品的描述包含單詞,則系數(shù)為1,否則為0。c94b6956-4057-11ec-9195-dac502259ad0.png

liste_produits=df_cleaned['描述'].unique()
X=pd.DataFrame()
forkey,occurenceinlist_products:
X.loc[:,key]=list(map(lambdax:int(key.upper()inx),liste_produits))
  • 矩陣表示產(chǎn)品描述中包含的單詞,使用獨(dú)熱編碼原則。
  • 這里使用的是逐條處理,還有pd.get_dummies()函數(shù)直接處理,這里就不做詳細(xì)介紹,有興趣的小伙伴可以研究研究。
  • 在實踐中發(fā)現(xiàn),若使用價格范圍來劃分分組,這會使每個組中元素更加均衡。

因此,在這個矩陣上增加6列以表示產(chǎn)品的價格范圍。

threshold=[0,1,2,3,5,10]
label_col=[]
#首先定義labels
foriinrange(len(threshold)):
ifi==len(threshold)-1:
col='.>{}'.format(threshold[i])
else:
col='{}<.<{}'.format(threshold[i],threshold[i+1])
label_col.append(col)
X.loc[:,col]=0#每個labels的初始值設(shè)為0

fori,prodinenumerate(liste_produits):
prix=df_cleaned[df_cleaned['描述']==prod]['單價'].mean()
j=0
whileprix>threshold[j]:
j+=1
ifj==len(threshold):break
X.loc[i,label_col[j-1]]=1

為了選擇合適的范圍,我檢查了不同組別的產(chǎn)品數(shù)量,如果組內(nèi)數(shù)量嚴(yán)重不均衡,則需要調(diào)整邊界點。下面是本次劃分的范圍,可見該邊界范圍還算均衡。

范圍       產(chǎn)品數(shù)量                 
--------------------
0<.<1       890                 
1<.<2       817                 
2<.<3       553                 
3<.<5       520                 
5<.<10      395                 
.>10        123

創(chuàng)建產(chǎn)品集群

將把產(chǎn)品分組到不同的類中。在二進(jìn)制編碼矩陣的情況下,計算距離最合適的度量是漢明度量。而我們本次使用的也是常用的sklearn的Kmeans方法使用的是歐幾里德距離,但在分類變量的情況下,它不是最佳選擇。其實可以使用kmodes包以使用漢明度量,小伙伴們可以自行研究。

matrix=X.values
forn_clustersinrange(3,10):
kmeans=KMeans(init='k-means++',n_clusters=n_clusters,n_init=30)
kmeans.fit(matrix)
clusters=kmeans.predict(matrix)
silhouette_avg=silhouette_score(matrix,clusters)
print("Forn_clusters=",n_clusters,"Theaveragesilhouette_scoreis:",silhouette_avg)
For n_clusters = 3 The average silhouette_score is : 0.11062930220266365
For n_clusters = 4 The average silhouette_score is : 0.13680035318514175
For n_clusters = 5 The average silhouette_score is : 0.15722360950670058
For n_clusters = 6 The average silhouette_score is : 0.1593958217011667
For n_clusters = 7 The average silhouette_score is : 0.15524717712994918
For n_clusters = 8 The average silhouette_score is : 0.16532400447658901
For n_clusters = 9 The average silhouette_score is : 0.16082298271895967

實際上,以上所得的分?jǐn)?shù)可視為相等,因為根據(jù)運(yùn)行情況,所有具有'n_clusters' 3的簇獲得的分?jǐn)?shù)約為(第一個簇的分?jǐn)?shù)略低)。另一方面,發(fā)現(xiàn)當(dāng)超過5個簇時,有些簇所包含的元素非常少。

因此,最終選擇將數(shù)據(jù)集劃分為5個簇。為了確保每次運(yùn)行notebook都能很好地進(jìn)行分類,我反復(fù)迭代,直到我們獲得可能的最佳輪廓系數(shù),在目前的情況下,輪廓系數(shù)約為0.15。

n_clusters=5
silhouette_avg=-1
whilesilhouette_avg'k-means++',n_clusters=n_clusters,n_init=30)
kmeans.fit(matrix)
clusters=kmeans.predict(matrix)
silhouette_avg=silhouette_score(matrix,clusters)
#使用kmodes模塊進(jìn)行聚類
#km=kmodes.KModes(n_clusters=n_clusters,init='Huang',n_init=2,verbose=0)
#clusters=km.fit_predict(matrix)
#silhouette_avg=silhouette_score(matrix,clusters)
print("Forn_clusters=",n_clusters,"Theaveragesilhouette_scoreis:",silhouette_avg)

For n_clusters = 5 The average silhouette_score is : 0.15722360950670058

描述集群的內(nèi)容

上面對所有訂單數(shù)據(jù)進(jìn)行了Kmeans聚類,并檢查每個類中的元素數(shù)量。

pd.Series(clusters).value_counts()
2    890
0    817
4    553
1    520
3    518
dtype: int64

輪廓系數(shù)看聚類效果

為了深入了解聚類的效果,常用輪廓系數(shù)評價聚類算法模型效果。通過下圖可視化地表現(xiàn)聚類效果,參考自sklearn documentation。

#定義輪廓系數(shù)得分
sample_silhouette_values=silhouette_samples(matrix,clusters)
#然后畫個圖
graph_component_silhouette(n_clusters,[-0.07,0.33],len(X),sample_silhouette_values,clusters)

解讀此圖,不同顏色代表不同的簇,每個簇橫坐標(biāo)表示簇內(nèi)樣本點的輪廓系數(shù),按照大小排序并繪制橫向條形圖,縱坐標(biāo)表示樣本量大小。

詞云圖看聚類結(jié)果

現(xiàn)在我們可以看看每個簇群代表的對象類型。為了獲得其內(nèi)容的全局視圖,用每個關(guān)鍵詞中最常見的關(guān)鍵詞繪制詞云圖。先統(tǒng)計關(guān)鍵詞出現(xiàn)的頻次。

liste=pd.DataFrame(liste_produits)
liste_words=[wordfor(word,occurence)inlist_products]

occurence=[dict()for_inrange(n_clusters)]
foriinrange(n_clusters):
liste_cluster=liste.loc[clusters==i]
forwordinliste_words:
#同之前的一樣,篩選掉顏色等無用的詞語
ifwordin['art','set','heart','pink','blue','tag']:continue
occurence[i][word]=sum(liste_cluster.loc[:,0].str.contains(word.upper()))

定義繪制詞云圖函數(shù),并繪制詞云圖。

fig=plt.figure(1,figsize=(14,14))
color=[0,160,130,95,280,40,330,110,25]
foriinrange(n_clusters):
list_cluster_occurences=occurence[i]

tone=color[i]#定義詞的顏色
liste=[]
forkey,valueinlist_cluster_occurences.items():
liste.append([key,value])
liste.sort(key=lambdax:x[1],reverse=True)
make_wordcloud(liste,i+1)

從這個詞云圖結(jié)果中我們可以看到,其中一個簇群中包含與禮物相關(guān)的對象(關(guān)鍵字:圣誕節(jié)Christmas、包裝packaging、卡片 card等)。

另一簇則傾向于包含奢侈品和珠寶(關(guān)鍵詞:項鏈necklace、手鐲bracelet、蕾絲lace、銀silver)。但也可以觀察到,許多詞出現(xiàn)在不同的簇群中,因此很難清楚地區(qū)分它們。

PCA主成分分析

為了使得聚類后的結(jié)果能夠真正做到有效區(qū)分,將含有大量變量的初始矩陣數(shù)據(jù),我準(zhǔn)備使用PCA主成分分析對其進(jìn)行處理。

pca=PCA()
pca.fit(matrix)
pca_samples=pca.transform(matrix)

我們看到解釋數(shù)據(jù)所需的維度數(shù)量是極其重要的:我們需要超過100個維度來解釋數(shù)據(jù)的90%的方差。在實踐中,我決定只保留有限數(shù)量的維度。我們以50個維度來做降維處理。

pca=PCA(n_components=50)
matrix_9D=pca.fit_transform(matrix)
mat=pd.DataFrame(matrix_9D)
mat['cluster']=pd.Series(clusters)
cbdd09cc-4057-11ec-9195-dac502259ad0.png

為了更加直觀地觀察PCA降維度后效果,下面用帶顏色的散點圖可視化的方法展示,橫縱軸分別代表不同的維度變量,顏色代表不同的簇,如下圖所示,這里只繪制其中的部分維度數(shù)據(jù)。

由圖可看出,第一主成分已經(jīng)較好地將幾個類別分開了,說明此次降維效果還算可以。

寫在最后

到目前為止,已經(jīng)將本次案例前半部分演示完畢,包括數(shù)據(jù)探索性數(shù)據(jù)分析,缺失值等處理。各個關(guān)鍵變量的分析。最后重要的是通過聚類方法,將產(chǎn)品進(jìn)行聚類分類,并通過詞云圖和主成分分析各個類別聚類分離效果。

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7103

    瀏覽量

    89287
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3279

    瀏覽量

    48974

原文標(biāo)題:一個企業(yè)級數(shù)據(jù)挖掘?qū)崙?zhàn)項目|客戶細(xì)分模型(上)

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    首個科學(xué)計算基座大模型BBT-Neutron開源,助力突破大科學(xué)裝置數(shù)據(jù)分析瓶頸

    大語言模型能否解決傳統(tǒng)大語言模型在大規(guī)模數(shù)值數(shù)據(jù)分析中的局限性問題,助力科學(xué)界大科學(xué)裝置設(shè)計、高能物理領(lǐng)域科學(xué)計算? 高能物理是探索宇宙基本組成與規(guī)律的前沿科學(xué)領(lǐng)域,研究粒子在極高能量
    的頭像 發(fā)表于 12-26 15:29 ?172次閱讀
    首個科學(xué)計算基座大<b class='flag-5'>模型</b>BBT-Neutron開源,助力突破大科學(xué)裝置<b class='flag-5'>數(shù)據(jù)分析</b>瓶頸

    Minitab 數(shù)據(jù)清理與預(yù)處理技巧

    Minitab是一款功能強(qiáng)大的統(tǒng)計分析和質(zhì)量管理軟件,在數(shù)據(jù)分析過程中,數(shù)據(jù)清理與預(yù)處理是至關(guān)重要的環(huán)節(jié)。以下是一些在Minitab中進(jìn)行數(shù)據(jù)
    的頭像 發(fā)表于 12-02 16:06 ?432次閱讀

    LLM在數(shù)據(jù)分析中的作用

    的游戲規(guī)則。 1. 數(shù)據(jù)預(yù)處理 數(shù)據(jù)預(yù)處理數(shù)據(jù)分析的第一步,也是至關(guān)重要的一步。LLM在這一階段可以發(fā)揮重要作用。 文本清洗 :LLM可以
    的頭像 發(fā)表于 11-19 15:35 ?361次閱讀

    eda分析中的數(shù)據(jù)清洗步驟

    數(shù)據(jù)分析的早期階段,探索性數(shù)據(jù)分析(EDA)是一種重要的方法,它幫助我們理解數(shù)據(jù)集的特征和結(jié)構(gòu)。然而,原始數(shù)據(jù)往往包含錯誤、缺失值、異常值
    的頭像 發(fā)表于 11-13 11:00 ?343次閱讀

    eda的常見誤區(qū)和解決方案

    探索性數(shù)據(jù)分析(EDA)是數(shù)據(jù)分析過程中的重要步驟,它涉及對數(shù)據(jù)的初步檢查和分析,以便更好地理解數(shù)據(jù)
    的頭像 發(fā)表于 11-13 10:59 ?408次閱讀

    eda中常用的數(shù)據(jù)處理方法

    探索性數(shù)據(jù)分析(EDA)是一種統(tǒng)計方法,用于使用統(tǒng)計圖表、圖形和計算來發(fā)現(xiàn)數(shù)據(jù)中的模式、趨勢和異常值。在進(jìn)行EDA時,數(shù)據(jù)處理是至關(guān)重要的,因為它可以幫助我們更好地理解
    的頭像 發(fā)表于 11-13 10:57 ?369次閱讀

    eda與傳統(tǒng)數(shù)據(jù)分析的區(qū)別

    EDA(Exploratory Data Analysis,探索性數(shù)據(jù)分析)與傳統(tǒng)數(shù)據(jù)分析之間存在顯著的差異。以下是兩者的主要區(qū)別: 一、分析目的和方法論 EDA 目的 :EDA的主要
    的頭像 發(fā)表于 11-13 10:52 ?377次閱讀

    如何進(jìn)行有效的eda分析

    進(jìn)行有效的EDA(Exploratory Data Analysis,探索性數(shù)據(jù)分析分析,是數(shù)據(jù)科學(xué)中的關(guān)鍵步驟,它能夠幫助分析人員深入了
    的頭像 發(fā)表于 11-13 10:48 ?326次閱讀

    為什么選擇eda進(jìn)行數(shù)據(jù)分析

    數(shù)據(jù)科學(xué)領(lǐng)域,數(shù)據(jù)分析是一個復(fù)雜且多步驟的過程,它涉及到數(shù)據(jù)的收集、清洗、探索、建模和解釋。在這些步驟中,探索性
    的頭像 發(fā)表于 11-13 10:41 ?273次閱讀

    云計算在大數(shù)據(jù)分析中的應(yīng)用

    云計算在大數(shù)據(jù)分析中的應(yīng)用廣泛且深入,它為用戶提供了存儲、計算、分析和預(yù)測的強(qiáng)大能力。以下是對云計算在大數(shù)據(jù)分析中應(yīng)用的介紹: 一、存儲和處理海量數(shù)
    的頭像 發(fā)表于 10-24 09:18 ?521次閱讀

    使用AI大模型進(jìn)行數(shù)據(jù)分析的技巧

    使用AI大模型進(jìn)行數(shù)據(jù)分析的技巧涉及多個方面,以下是一些關(guān)鍵的步驟和注意事項: 一、明確任務(wù)目標(biāo)和需求 在使用AI大模型之前,首先要明確數(shù)據(jù)分析的任務(wù)目標(biāo),這將直接影響
    的頭像 發(fā)表于 10-23 15:14 ?964次閱讀

    機(jī)器學(xué)習(xí)中的數(shù)據(jù)預(yù)處理與特征工程

    在機(jī)器學(xué)習(xí)的整個流程中,數(shù)據(jù)預(yù)處理與特征工程是兩個至關(guān)重要的步驟。它們直接決定了模型的輸入質(zhì)量,進(jìn)而影響模型的訓(xùn)練效果和泛化能力。本文將從數(shù)據(jù)
    的頭像 發(fā)表于 07-09 15:57 ?517次閱讀

    數(shù)據(jù)分析的工具有哪些

    數(shù)據(jù)分析是一個涉及收集、處理、分析和解釋數(shù)據(jù)以得出有意義見解的過程。在這個過程中,使用正確的工具至關(guān)重要。以下是一些主要的數(shù)據(jù)分析工具,以及
    的頭像 發(fā)表于 07-05 14:54 ?949次閱讀

    機(jī)器學(xué)習(xí)在數(shù)據(jù)分析中的應(yīng)用

    隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)量的爆炸性增長對數(shù)據(jù)分析提出了更高的要求。機(jī)器學(xué)習(xí)作為一種強(qiáng)大的工具,通過訓(xùn)練模型數(shù)據(jù)中學(xué)習(xí)規(guī)律,為企業(yè)和組織提
    的頭像 發(fā)表于 07-02 11:22 ?703次閱讀

    【大語言模型:原理與工程實踐】大語言模型的預(yù)訓(xùn)練

    對話以及內(nèi)容豐富的網(wǎng)頁數(shù)據(jù)等。來自不同領(lǐng)域的數(shù)據(jù)則蘊(yùn)含豐富的語義知識,如編程、科學(xué)、金融等,這有助于模型培養(yǎng)更全面的通用能力。常見來源如下: 大數(shù)據(jù)模型
    發(fā)表于 05-07 17:10