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

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

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

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

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

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

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

基于屬性方法

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

ABC分類法

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

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

聚類法

常用的非監(jiān)督方法,無須任何的先驗(yàn)知識(shí),只需要指定要?jiǎng)澐值娜后w數(shù)量即可。這里可以參見總結(jié)的常用聚類模型kmeans聚類

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

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

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

本文主要內(nèi)容

本次實(shí)戰(zhàn)項(xiàng)目共分為上下兩部分,上篇(本篇)包括探索性數(shù)據(jù)分析,產(chǎn)品類別分析兩部分;下篇將包括客戶細(xì)分和客戶行為分析與預(yù)測(cè)。本篇主要結(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=['訂單編號(hào)','庫(kù)存代碼','描述','數(shù)量',
'訂單日期','單價(jià)','客戶ID','國(guó)家']
display(df_initial[:5])

Dataframe維度: (284709, 8)

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

缺失值分析

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

#提供有關(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ù)記錄沒有分配給任何客戶。而我們不可能把這些記錄的值映射到任何客戶。所以這些對(duì)于目前是沒有用的,因此我們可以將其刪除。

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

變量'國(guó)家'分析

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

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

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

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

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

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

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

temp=df_initial.groupby(by=['客戶ID','訂單編號(hào)'],
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

此處需注意的要點(diǎn):

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

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

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

取消訂單分析

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

nb_products_per_basket['取消訂單量']=nb_products_per_basket['訂單編號(hào)'].apply(
lambdax:int('C'inx))
display(nb_products_per_basket.query("取消訂單量!=0")[:5])
#計(jì)算取消訂單量的比例
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)一個(gè)訂單被取消時(shí),在數(shù)據(jù)集中可能會(huì)存在另一條對(duì)應(yīng)的記錄,該記錄除了數(shù)量訂單日期變量之外,其他變量?jī)?nèi)容基本相同。下面檢查一下是否所有的記錄都是這樣的。具體做法是:

  • 先篩選出負(fù)數(shù)數(shù)量的記錄,并在所有數(shù)據(jù)中檢查是否有一個(gè)具有相同數(shù)量(但為正)的訂單,其它屬性都相同(客戶ID,描述單價(jià))
  • 有些取消訂單中,描述列會(huì)標(biāo)注"Discount",因此將包含該特征的記錄篩除后尋找。
c7818a92-4057-11ec-9195-dac502259ad0.png
df_check=df_initial[(df_initial['數(shù)量']'描述']!='Discount')][
['客戶ID','數(shù)量','庫(kù)存代碼','描述','單價(jià)']]
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
庫(kù)存代碼 22655
描述 VINTAGE RED KITCHEN CABINET
單價(jià) 125.0
Name: 279, dtype: object
-----------------------------> 假設(shè)不成立

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

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['庫(kù)存代碼']==col['庫(kù)存代碼'])&
(df_initial['訂單日期']'訂單日期'])&
(df_initial['數(shù)量']>0)].copy()

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

#有對(duì)應(yīng)項(xià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)

#不同的對(duì)應(yīng)項(xiàng)是按順序存在的:我們刪除最后一個(gè)
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

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

庫(kù)存代碼分析

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

list_special_codes=df_cleaned[df_cleaned['庫(kù)存代碼'
].str.contains('^[a-zA-Z]+',
regex=True)]['庫(kù)存代碼'].unique()
#并通過對(duì)應(yīng)"描述"變量來尋找每個(gè)代碼的具體解釋。
forcodeinlist_special_codes:
print("{:<15}?->{:<30}".format(
code,df_cleaned[df_cleaned['庫(kù)存代碼']==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)。

購(gòu)物車價(jià)格分析

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

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

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

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

#處理訂單日期
df_cleaned['訂單日期_int']=df_cleaned['訂單日期'].astype('int64')
temp=df_cleaned.groupby(by=['客戶ID','訂單編號(hào)'],
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['購(gòu)物車價(jià)格']>0]
basket_price.sort_values('客戶ID')[:6]
c83456ea-4057-11ec-9195-dac502259ad0.png

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

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

產(chǎn)品類別分析

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

產(chǎn)品描述

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

keywords_inventory(dataframe,colonne='描述')

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

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

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

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

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

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個(gè)。此時(shí),將其中一個(gè)結(jié)果' count_keywords '字典轉(zhuǎn)換為一個(gè)列表,根據(jù)關(guān)鍵詞的出現(xiàn)情況對(duì)它們進(jìn)行排序。

因?yàn)樽煮w有點(diǎn)小,不過不影響我們理解實(shí)操邏輯。你也可以通過繪制橫向柱狀圖,調(diào)大軸標(biāo)簽大小,來自己探究每個(gè)詞根。大家可以自己嘗試。

定義產(chǎn)品類別

上面結(jié)果中,我們獲得的列表中包含1400多個(gè)關(guān)鍵詞,而最頻繁的關(guān)鍵詞出現(xiàn)在200多種產(chǎn)品中。然而,在仔細(xì)檢查列表中內(nèi)容時(shí)發(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個(gè)關(guān)鍵詞。分完詞并處理后 ,還沒有結(jié)束,還需要將文字轉(zhuǎn)化為數(shù)字,這個(gè)過程就是數(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ì)介紹,有興趣的小伙伴可以研究研究。
  • 在實(shí)踐中發(fā)現(xiàn),若使用價(jià)格范圍來劃分分組,這會(huì)使每個(gè)組中元素更加均衡。

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

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#每個(gè)labels的初始值設(shè)為0

fori,prodinenumerate(liste_produits):
prix=df_cleaned[df_cleaned['描述']==prod]['單價(jià)'].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)整邊界點(diǎn)。下面是本次劃分的范圍,可見該邊界范圍還算均衡。

范圍       產(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)制編碼矩陣的情況下,計(jì)算距離最合適的度量是漢明度量。而我們本次使用的也是常用的sklearn的Kmeans方法使用的是歐幾里德距離,但在分類變量的情況下,它不是最佳選擇。其實(shí)可以使用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

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

因此,最終選擇將數(shù)據(jù)集劃分為5個(gè)簇。為了確保每次運(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)容

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

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

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

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

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

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

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

現(xiàn)在我們可以看看每個(gè)簇群代表的對(duì)象類型。為了獲得其內(nèi)容的全局視圖,用每個(gè)關(guān)鍵詞中最常見的關(guān)鍵詞繪制詞云圖。先統(tǒng)計(jì)關(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)

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

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

PCA主成分分析

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

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

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

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降維度后效果,下面用帶顏色的散點(diǎn)圖可視化的方法展示,橫縱軸分別代表不同的維度變量,顏色代表不同的簇,如下圖所示,這里只繪制其中的部分維度數(shù)據(jù)。

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

寫在最后

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

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

    關(guān)注

    8

    文章

    6762

    瀏覽量

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

    關(guān)注

    1

    文章

    3065

    瀏覽量

    48577

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

    數(shù)據(jù)分析有哪些分析方法

    數(shù)據(jù)分析是一種重要的技能,它可以幫助我們從大量的數(shù)據(jù)中提取有價(jià)值的信息,從而做出更明智的決策。在這篇文章中,我們將介紹數(shù)據(jù)分析的各種方法,包括描述性分析、診斷性
    的頭像 發(fā)表于 07-05 14:51 ?416次閱讀

    nlp自然語言處理模型怎么做

    的進(jìn)展。本文將詳細(xì)介紹NLP模型的構(gòu)建過程,包括數(shù)據(jù)預(yù)處理、模型選擇、訓(xùn)練與優(yōu)化等方面。 數(shù)據(jù)預(yù)處理
    的頭像 發(fā)表于 07-05 09:59 ?442次閱讀

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

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

    信號(hào)的預(yù)處理包括哪些環(huán)節(jié)

    信號(hào)預(yù)處理是信號(hào)處理的一個(gè)重要環(huán)節(jié),它對(duì)信號(hào)進(jìn)行一系列的操作,以便于后續(xù)的分析處理。信號(hào)預(yù)處理的目的是提高信號(hào)的質(zhì)量,減少噪聲,保留有用的
    的頭像 發(fā)表于 06-03 10:35 ?1915次閱讀

    求助,關(guān)于AD采集到的數(shù)據(jù)分析問題

    問題描述:使用AD采集一個(gè)10Hz到2MHz的脈沖,脈沖底部可能大于零,由采集到的數(shù)據(jù)分析出該脈沖的上升時(shí)間,幅值和占空比。 備注:在分析的時(shí)候已經(jīng)知道脈沖的頻率,精度為2X10^-5. 在分析
    發(fā)表于 05-09 07:40

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

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

    【大語言模型:原理與工程實(shí)踐】探索《大語言模型原理與工程實(shí)踐》2.0

    《大語言模型“原理與工程實(shí)踐”》是關(guān)于大語言模型內(nèi)在機(jī)理和應(yīng)用實(shí)踐的一次深入探索。作者不僅深入討論了理論,還提供了豐富的實(shí)踐案例,幫助讀者理解如何將理論知識(shí)應(yīng)用于解決實(shí)際問題。書中的案例分析
    發(fā)表于 05-07 10:30

    基于振弦采集儀的工程監(jiān)測(cè)數(shù)據(jù)分析方法研究

    基于振弦采集儀的工程監(jiān)測(cè)數(shù)據(jù)分析方法研究 基于振弦采集儀的工程監(jiān)測(cè)數(shù)據(jù)分析方法研究主要涉及以下幾個(gè)方面: 基于振弦采集儀的工程監(jiān)測(cè)數(shù)據(jù)分析方法研究 1. 數(shù)據(jù)采集:使用振弦采集儀對(duì)工程
    的頭像 發(fā)表于 01-02 15:12 ?341次閱讀
    基于振弦采集儀的工程監(jiān)測(cè)<b class='flag-5'>數(shù)據(jù)分析</b>方法研究

    Get職場(chǎng)新知識(shí):做分析,用大數(shù)據(jù)分析工具

    為什么企業(yè)每天累積那么多的數(shù)據(jù),也做數(shù)據(jù)分析,但最后決策還是靠經(jīng)驗(yàn)?很大程度上是因?yàn)檫@些數(shù)據(jù)都被以不同的指標(biāo)和存儲(chǔ)方式放在各自的系統(tǒng)中,這就導(dǎo)致了數(shù)據(jù)
    發(fā)表于 12-05 09:36

    Sweetviz: 讓你三行代碼實(shí)現(xiàn)探索性數(shù)據(jù)分析

    Sweetviz是一個(gè)開源Python庫(kù),它只需三行代碼就可以生成漂亮的高精度可視化效果來啟動(dòng)EDA(探索性數(shù)據(jù)分析)。輸出一個(gè)HTML。 它不僅能根據(jù)性別、年齡等不同欄目縱向分析數(shù)據(jù)
    的頭像 發(fā)表于 10-31 10:28 ?861次閱讀
    Sweetviz: 讓你三行代碼實(shí)現(xiàn)<b class='flag-5'>探索性</b><b class='flag-5'>數(shù)據(jù)分析</b>

    盤點(diǎn)66個(gè)Pandas函數(shù)合集

    任務(wù)而創(chuàng)建的。它提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。 數(shù)據(jù)預(yù)覽 對(duì)于探索性數(shù)據(jù)分析來說,做
    的頭像 發(fā)表于 10-30 09:58 ?1334次閱讀
    盤點(diǎn)66個(gè)Pandas函數(shù)合集