數(shù)據(jù)分析 | 你知道超市哪個(gè)季節(jié)銷售額最高嗎?
作者 |?戀戀風(fēng)塵hhh
來源 |?數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)之美
目錄

1.明確需求和目的
- 對一家全球超市四年(2011-2014)的銷售數(shù)據(jù)進(jìn)行
人、貨、場分析,并給出提升銷量的針對性建議。 場:整體運(yùn)營情況分析,包括銷售額、銷量、利潤、客單價(jià)、市場布局等具體情況分析。貨:商品結(jié)構(gòu)、優(yōu)勢/爆款商品、劣勢/待優(yōu)化商品等情況分析。人:客戶數(shù)量、新老客戶、RFM模型、復(fù)購率、回購率等用戶行為分析。
2.數(shù)據(jù)收集
- 數(shù)據(jù)來源為
kaggle平臺,這是一份全球大型超市四年的零售數(shù)據(jù)集,數(shù)據(jù)詳盡。 - 數(shù)據(jù)集為
superstore_dataset2011-2015.csv,共有51290條數(shù)據(jù),共24個(gè)特征。 - 數(shù)據(jù)集鏈接:https://pan.baidu.com/s/1_znO0Nn-97k8jE42J0NBIw 提取碼:115h
3.數(shù)據(jù)預(yù)處理
3.1 數(shù)據(jù)整合
3.1.1 加載相關(guān)庫和數(shù)據(jù)集
- 使用的庫主要有:pandas、numpy、matplotlib、seaborn
- 使用的數(shù)據(jù)集:superstore_dataset2011-2015.csv
#?加載數(shù)據(jù)分析需要使用的庫
import?numpy?as?np
import?pandas?as?pd
import?matplotlib.pyplot?as?plt
import?seaborn?as?sns
import?warnings
plt.rcParams['font.sans-serif']?=?['SimHei']
warnings.filterwarnings('ignore')
#?加載零售數(shù)據(jù)集,使用'ISO-8859-1'編碼方式
df?=?pd.read_csv('superstore_dataset2011-2015.csv',encoding='ISO-8859-1')?
df.head()
結(jié)果如下:
3.1.2 數(shù)據(jù)概覽
首先看一下數(shù)據(jù)集大小(行列信息)。
df.shape
#?---------------
(51290,?24)
再查看一下數(shù)據(jù)的分布概況。
#?df.info()
df.describe()
結(jié)果如下:
3.2 數(shù)據(jù)清洗
3.2.1 列名重命名
觀察數(shù)據(jù)集可以發(fā)現(xiàn),列名存在著不符合Python標(biāo)準(zhǔn)的命名規(guī)范,因此對列名進(jìn)行一下重命名,采用下劃線命名法。
df.rename(columns?=?lambda?x:?x.replace('?',?'_').replace('-',?'_'),?inplace=True)
再次查看一下重命名后的列名。
df.columns
-----------------
Index(['Row_ID',?'Order_ID',?'Order_Date',?'Ship_Date',?'Ship_Mode',
???????'Customer_ID',?'Customer_Name',?'Segment',?'City',?'State',?'Country',
???????'Postal_Code',?'Market',?'Region',?'Product_ID',?'Category',
???????'Sub_Category',?'Product_Name',?'Sales',?'Quantity',?'Discount',
???????'Profit',?'Shipping_Cost',?'Order_Priority'],
??????dtype='object')
3.2.2 ?數(shù)據(jù)類型處理
查看一下每一列的數(shù)據(jù)類型。
df.dtypes
-----------------
Row_ID??????????????int64
Order_ID???????????object
Order_Date?????????object
Ship_Date??????????object
Ship_Mode??????????object
Customer_ID????????object
Customer_Name??????object
Segment????????????object
City???????????????object
State??????????????object
Country????????????object
Postal_Code???????float64
Market?????????????object
Region?????????????object
Product_ID?????????object
Category???????????object
Sub_Category???????object
Product_Name???????object
Sales?????????????float64
Quantity????????????int64
Discount??????????float64
Profit????????????float64
Shipping_Cost?????float64
Order_Priority?????object
dtype:?object
可以看到:大部分列是object類型,銷量、銷售額、利潤等列是數(shù)值型,這些列都不需要進(jìn)行數(shù)據(jù)類型處理。下單日期應(yīng)為datetime類型,我們需要對其進(jìn)行處理。
df["Order_Date"]?=?pd.to_datetime(df["Order_Date"])?
df["Order_Date"].sample(5)
----------------------------------
9319????2013-04-10
30390???2012-03-19
31025???2013-08-19
32210???2014-03-20
43430???2012-11-26
Name:?Order_Date,?dtype:?datetime64[ns]
為了便于分析每年和每月的銷售情況,新增加年份列和月份列。
df['year']?=?df["Order_Date"].dt.year
df['month']?=?df['Order_Date'].values.astype('datetime64[M]')
3.2.3 缺失值處理
我們再來查看一下各列的缺失值情況。
df.isnull().sum(axis=0)
----------------------------
Row_ID????????????????0
Order_ID??????????????0
Order_Date????????????0
Ship_Date?????????????0
Ship_Mode?????????????0
Customer_ID???????????0
Customer_Name?????????0
Segment???????????????0
City??????????????????0
State?????????????????0
Country???????????????0
Postal_Code???????41296
Market????????????????0
Region????????????????0
Product_ID????????????0
Category??????????????0
Sub_Category??????????0
Product_Name??????????0
Sales?????????????????0
Quantity??????????????0
Discount??????????????0
Profit????????????????0
Shipping_Cost?????????0
Order_Priority????????0
year??????????????????0
month?????????????????0
dtype:?int64
通過觀察發(fā)現(xiàn),有一列缺失值比較多,此列表示郵編信息,由于該列對我們的分析沒有太多作用,可直接刪除。
df.drop(["Postal_Code"],axis=1,?inplace=True)
3.2.4 異常值處理
查看數(shù)據(jù)是否存在異常值。
df.describe()
結(jié)果如下:
沒發(fā)現(xiàn)明顯的異常值,不需要進(jìn)行處理。
3.2.5 重復(fù)值處理
看一下每一行數(shù)據(jù)是否存在重復(fù)值。
df.duplicated().sum()
---------------------
0
也沒有重復(fù)值,不需要進(jìn)行處理。
4.數(shù)據(jù)分析
4.1 整體銷售情況分析
首先構(gòu)造整體銷售情況子數(shù)據(jù)集。
#?整體銷售情況子數(shù)據(jù)集,包含下單日期、銷售額、銷量、利潤、年份、月份信息
sales_data?=?df[['Order_Date','Sales','Quantity','Profit','year','month']]
sales_data.sample(5)??
------------------------------
??Order_Date?Sales?Quantity?Profit?year?month
45436?2014-11-27?38.040?2???12.1728?2014?2014-11-01
12625?2013-11-11?20.368?1???7.3834?2013?2013-11-01
24800?2011-11-15?40.320?7???14.0000?2011?2011-11-01
35508?2014-01-22?27.936?4???9.4284?2014?2014-01-01
39183?2013-06-24?179.880?6???61.0800?2013?2013-06-01
按照年份、月份對銷售子數(shù)據(jù)集進(jìn)行分組求和。
sales_year?=?sales_data.groupby(['year','month']).sum()
sales_year
結(jié)果如下:
對以上數(shù)據(jù)進(jìn)行拆分,每年為一個(gè)表。
#??slice(None),?是Python中的切片操作,這里用來選擇全部數(shù)據(jù)
year_2011?=?sales_year.loc[(2011,slice(None)),:].reset_index()
year_2012?=?sales_year.loc[(2012,slice(None)),:].reset_index()
year_2013?=?sales_year.loc[(2013,slice(None)),:].reset_index()
year_2014?=?sales_year.loc[(2014,slice(None)),:].reset_index()
year_2014????#?看一下2014年的數(shù)據(jù)
結(jié)果如下:
4.1.1 銷售額分析
構(gòu)建銷售表。
sales=pd.concat([year_2011['Sales'],year_2012['Sales'],
?????????????????year_2013['Sales'],year_2014['Sales']],axis=1)
#?對行名和列名進(jìn)行重命名
sales.columns=['Sales-2011','Sales-2012','Sales-2013','Sales-2014']
sales.index=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
#?顏色越深,銷售額越高
sales.style.background_gradient()
結(jié)果如下:
從上圖可以看出,基本上每一年都是下半年銷售額比上半年要高,而且隨著年份的增大,銷售額也有明顯的增加,說明銷售業(yè)績增長較快,發(fā)展還是比較好的。
肉眼可見的是每一年的銷售額都比前一年要好,來實(shí)際計(jì)算一下具體的增長率和每年的銷售總額。
#?計(jì)算年度銷售額并圖表展示
sales_sum=sales.sum()
sales_sum.plot(kind='bar',alpha=0.5)
plt.grid()
#?計(jì)算每年增長率
rise_12=sales_sum[1]/sales_sum[0]-1
rise_13=sales_sum[2]/sales_sum[1]-1
rise_14=sales_sum[3]/sales_sum[2]-1
rise_rate=[0,rise_12,rise_13,rise_14]
#?顯示增長率
sales_sum=pd.DataFrame({'sales_sum':sales_sum})
sales_sum['rise_rate']=rise_rate
sales_sum
------------------------------------------
????sales_sum?rise_rate
Sales-2011?2.259451e+06?0.000000
Sales-2012?2.677439e+06?0.184995
Sales-2013?3.405746e+06?0.272017
Sales-2014?4.299866e+06?0.262533
結(jié)果如下:
從上面可以看出,后兩年的銷售額增長率達(dá)到26%,2014年銷售額將近是2011的兩倍,發(fā)展勢頭良好,經(jīng)營在逐步穩(wěn)定。結(jié)合年度銷售額及增長率,再結(jié)合公司整體戰(zhàn)略規(guī)劃,可以預(yù)測或制定下一年度總銷售額業(yè)績指標(biāo)。
了解了超市整體銷售額后,再對每年每月的銷售額進(jìn)行分析,了解不同月份的銷售情況,找出是否有淡旺季之分,找出重點(diǎn)銷售月份,以便制定經(jīng)營策略與業(yè)績月度及季度指標(biāo)拆分。
看一下銷售額的面積堆疊圖。
#?面積堆疊圖
sales.plot.area(stacked=False)
結(jié)果如下:
從上圖可以大致看出,該超市的銷售季節(jié)性明顯,總體上半年是淡季,下半年是旺季。上半年中6月份銷售額比較高,下半年中7月份的銷售額偏低。
- 對于旺季的月份,運(yùn)營推廣等策略要繼續(xù)維持,還可以加大投入,提高整體銷售額。
- 對于淡季的月份,可以結(jié)合產(chǎn)品特點(diǎn)進(jìn)行新產(chǎn)品拓展,舉辦一些促銷活動等吸引客戶。
4.1.2 銷量分析
構(gòu)建銷量表。
quantity?=?pd.concat([year_2011['Quantity'],year_2012['Quantity'],
?????????????????year_2013['Quantity'],year_2014['Quantity']],axis=1)
#?對行名和列名進(jìn)行重命名
quantity.columns=['Quantity-2011','Quantity-2012','Quantity-2013','Quantity-2014']
quantity.index=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
#?顏色越深,銷量越高
quantity.style.background_gradient()
結(jié)果如下:
看一下銷量增長率和每年的銷量總和。
#?計(jì)算年度銷量并圖表展示
quantity_sum=quantity.sum()
quantity_sum.plot(kind='bar',alpha=0.5)
plt.grid()
#?計(jì)算每年增長率
rise_12=quantity_sum[1]/quantity_sum[0]-1
rise_13=quantity_sum[2]/quantity_sum[1]-1
rise_14=quantity_sum[3]/quantity_sum[2]-1
rise_rate=[0,rise_12,rise_13,rise_14]
#?顯示增長率
quantity_sum=pd.DataFrame({'quantity_sum':quantity_sum})
quantity_sum['rise_rate']=rise_rate
quantity_sum
------------------------------
???quantity_sum?rise_rate
Quantity-2011?31443?0.000000
Quantity-2012?38111?0.212066
Quantity-2013?48136?0.263047
Quantity-2014?60622?0.259390
結(jié)果如下:
從上面可以看出,2011-2014年銷量變化趨勢與銷售額是一樣的,下半年銷量整體高于上半年,同時(shí)銷量同比上一年均在提高。
4.1.3 利潤分析
構(gòu)建利潤表。
profit=pd.concat([year_2011['Profit'],year_2012['Profit'],
?????????????????year_2013['Profit'],year_2014['Profit']],axis=1)
profit.columns=['Profit-2011','Profit-2012','Profit-2013','Profit-2014']
profit.index=['Jau','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
profit.style.background_gradient()
結(jié)果如下:
計(jì)算每年總利潤和利潤率。
#?計(jì)算年度總利潤并圖表展示
profit_sum=profit.sum()
profit_sum.plot(kind='bar',alpha=0.5)
plt.grid()
profit_sum=pd.DataFrame({'profit_sum':profit_sum})
profit_sum["year"]?=??[2011,?2012,?2013,?2014]
sales_sum=pd.DataFrame({'sales_sum':sales.sum()})
sales_sum["year"]?=??[2011,?2012,?2013,?2014]
profit_sum?=?pd.merge(profit_sum,?sales_sum)
profit_sum["profit_rate"]?=?profit_sum["profit_sum"]?/?profit_sum["sales_sum"]
profit_sum
-----------------------------
??profit_sum?year?sales_sum?profit_rate
0?248940.81154?2011?2.259451e+06?0.110178
1?307415.27910?2012?2.677439e+06?0.114817
2?406935.23018?2013?3.405746e+06?0.119485
3?504165.97046?2014?4.299866e+06?0.117252
結(jié)果如下:
從上面的結(jié)果可以看出,每年的利潤和銷售額一樣,是在逐年增加的,說明企業(yè)經(jīng)營還是比較妥善的,但是利潤率總體平穩(wěn),穩(wěn)定在11%-12%之間,總體利潤率也還是不錯(cuò)的。
4.1.4 客單價(jià)分析
客單價(jià):是指商場(超市)每一個(gè)顧客平均購買商品的金額,客單價(jià)也即是平均交易金額。從某種程度上反映了企業(yè)的消費(fèi)群體的許多特點(diǎn)以及企業(yè)的銷售類目的盈利狀態(tài)是否健康。
總消費(fèi)次數(shù):同一天內(nèi),同一個(gè)人發(fā)生的所有消費(fèi)算作一次消費(fèi)。
客單價(jià)=總消費(fèi)金額 / 總消費(fèi)次數(shù)
#?2011-2014年客單價(jià)
for?i?in?range(2011,2015):
????data=df[df['year']==i]
????price=data[['Order_Date','Customer_ID','Sales']]
????#?計(jì)算總消費(fèi)次數(shù)
????price_dr=price.drop_duplicates(
????????subset=['Order_Date',?'Customer_ID'])
????#?總消費(fèi)次數(shù):有多少行
????total_num=price_dr.shape[0]
????print('{}年總消費(fèi)次數(shù)='.format(i),total_num)
????unit_price?=?price['Sales'].sum()/total_num
????print('{}年客單價(jià)='.format(i),?unit_price,'\n')
---------------------------------------------------
2011年總消費(fèi)次數(shù)=?4453
2011年客單價(jià)=?507.3997070604087?
2012年總消費(fèi)次數(shù)=?5392
2012年客單價(jià)=?496.55762136498515?
2013年總消費(fèi)次數(shù)=?6753
2013年客單價(jià)=?504.3308824788983?
2014年總消費(fèi)次數(shù)=?8696
2014年客單價(jià)=?494.4647965225392?
從上面結(jié)果來看,每年的消費(fèi)次數(shù)呈不斷上升趨勢,但是客單價(jià)總體浮動范圍不是很大 ,穩(wěn)定在500左右。
4.1.5 市場布局分析
因?yàn)檫@是一家全球超市,在不同地區(qū)都會有市場,所以看一下不同地區(qū)之間的銷售情況。
Market_Year_Sales?=?df.groupby(['Market',?'year']).agg({'Sales':'sum'}).reset_index().rename(columns={'Sales':'Sales_amounts'})
Market_Year_Sales.head()
--------------------------------
?Market?year?Sales_amounts
0?APAC?2011?6.392453e+05
1?APAC?2012?7.627193e+05
2?APAC?2013?9.745809e+05
3?APAC?2014?1.209199e+06
4?Africa?2011?1.271873e+05
用圖表顯示各個(gè)地區(qū)每年的銷售情況。
sns.barplot(x='Market',?y='Sales_amounts',?hue='year',?data?=?Market_Year_Sales)
plt.title('2011-2014?market?sales')
結(jié)果如下:
再看一下四年來各個(gè)地區(qū)銷售額占總銷售額的百分比。
Market_Sales?=?df.groupby(['Market']).agg({'Sales':'sum'})
Market_Sales["percent"]?=?Market_Sales["Sales"]?/?df["Sales"].sum()
Market_Sales.style.background_gradient()
結(jié)果如下:
從以上圖表可以看出,每個(gè)地區(qū)每年銷售額總體處于上升趨勢,其中APAC(亞太地區(qū))、EU(歐盟)、US(美國)、LATAM(拉丁美洲)的銷售額超過了總銷售額的85%,總體也與地區(qū)的經(jīng)濟(jì)發(fā)展相匹配。其中加拿大Canada的銷售額微乎其微,可以結(jié)合公司整體戰(zhàn)略布局進(jìn)行取舍。
4.2 商品情況分析
銷量前10名的商品。
productId_count?=?df.groupby('Product_ID').count()['Customer_ID'].sort_values(ascending=False)
print(productId_count.head(10))
--------------------------------------
Product_ID
OFF-AR-10003651????35
OFF-AR-10003829????31
OFF-BI-10002799????30
OFF-BI-10003708????30
FUR-CH-10003354????28
OFF-BI-10002570????27
OFF-BI-10004140????25
OFF-BI-10004195????24
OFF-BI-10001808????24
OFF-BI-10004632????24
Name:?Customer_ID,?dtype:?int64
銷售額前10名的商品。
productId_amount?=?df.groupby('Product_ID').sum()['Sales'].sort_values(ascending=False)
print(productId_amount.head(10))
-----------------------------------
Product_ID
TEC-CO-10004722????61599.8240
TEC-PH-10004664????30041.5482
OFF-BI-10003527????27453.3840
TEC-MA-10002412????22638.4800
TEC-PH-10004823????22262.1000
FUR-CH-10002024????21870.5760
FUR-CH-10000027????21329.7300
OFF-AP-10004512????21147.0840
FUR-TA-10001889????20730.7557
OFF-BI-10001359????19823.4790
Name:?Sales,?dtype:?float64
從上面可以看出,銷量最高的大部分是辦公用品,而銷售額最高的大部分是電子產(chǎn)品、家具這些單價(jià)較高的商品。
利潤前10的商品。
productId_Profit=?df.groupby('Product_ID').sum()['Profit'].sort_values(ascending=False)
print(productId_Profit.head(10))
------------------------------------
Product_ID
TEC-CO-10004722????25199.9280
OFF-AP-10004512????10345.5840
TEC-PH-10004823?????8121.4800
OFF-BI-10003527?????7753.0390
TEC-CO-10001449?????6983.8836
FUR-CH-10002250?????6123.2553
TEC-PH-10004664?????5455.9482
OFF-AP-10002330?????5452.4640
TEC-PH-10000303?????5356.8060
FUR-CH-10002203?????5003.1000
Name:?Profit,?dtype:?float64
利潤前10的商品有一半是電子產(chǎn)品,可以重點(diǎn)考慮提升這部分產(chǎn)品的銷量,來增加整體的利潤。
具體商品種類的銷售情況。
#?根據(jù)商品種類和子種類,重新重合成一個(gè)新的種類
df['Category_Sub_Category']?=?df[['Category','Sub_Category']].apply(lambda?x:str(x[0])+'_'+str(x[1]),axis=1)
#?按照新的種類進(jìn)行分組,統(tǒng)計(jì)銷售額和利潤
df_Category_Sub_Category=df.groupby("Category_Sub_Category").agg({"Profit":"sum","Sales":"sum"}).reset_index()
#?按照銷售額倒序排序
df_Category_Sub_Category.sort_values(by=["Sales"],ascending=False,?inplace=True)
#?每個(gè)種類商品的銷售額累計(jì)占比
df_Category_Sub_Category['cum_percent']?=?df_Category_Sub_Category['Sales'].cumsum()/df_Category_Sub_Category['Sales'].sum()
df_Category_Sub_Category
結(jié)果如下:
從圖表中可以很清晰的看到不同種類商品的銷售額貢獻(xiàn)對比,有將近一半的商品的總銷售占比達(dá)到84%,應(yīng)該是自家優(yōu)勢主營產(chǎn)品,后續(xù)經(jīng)營中應(yīng)繼續(xù)保持,可以結(jié)合整體戰(zhàn)略發(fā)展適當(dāng)加大投入,逐漸形成自己的品牌。
同時(shí),也可以發(fā)現(xiàn),末尾占比16%的產(chǎn)品中大部分是辦公用品中的小物件。可以考慮與其他主營產(chǎn)品結(jié)合,連帶銷售來提升銷量,或者考慮對這些商品進(jìn)行優(yōu)化。
但是值得關(guān)注的是,Tables(桌子)的利潤是負(fù),表明這個(gè)產(chǎn)品目前處于虧損狀態(tài),應(yīng)該是促銷讓利太多。通過檢查原數(shù)據(jù),發(fā)現(xiàn)Tabels大部分都在打折,打折的銷量高達(dá)76%。如果是在清庫存,這個(gè)效果還是不錯(cuò)的,但如果不是,說明這個(gè)產(chǎn)品在市場推廣上遇到了瓶頸,或者是遇到強(qiáng)競爭對手,需要結(jié)合實(shí)際業(yè)務(wù)進(jìn)行分析,適當(dāng)改善經(jīng)營策略。
4.3 用戶情況分析
4.3.1 不同類型的客戶占比
df["Segment"].value_counts().plot(kind='pie',?autopct='%.2f%%',?shadow=True,?figsize=(14,?6))
結(jié)果如下:
從上圖可以看出,這四年來,普通消費(fèi)者的客戶占比最多,達(dá)到51.7%。
再看一下每一年不同類型的客戶數(shù)量情況。
Segment_Year?=?df.groupby(["Segment",?'year']).agg({'Customer_ID':'count'}).reset_index()
sns.barplot(x='Segment',?y='Customer_ID',?hue='year',?data?=?Segment_Year)
plt.title('2011-2014?Segment?Customer')
結(jié)果如下:
從上面可以看出,每類客戶每年均在保持增長趨勢,客戶結(jié)構(gòu)還是非常不錯(cuò)的。
看一下不同類型的客戶每年貢獻(xiàn)的銷售額。
Segment_sales?=?df.groupby(["Segment",?'year']).agg({'Sales':'sum'}).reset_index()
sns.barplot(x='Segment',?y='Sales',?hue='year',?data?=?Segment_sales)
plt.title('2011-2014?Segment?Sales')
結(jié)果如下:
各個(gè)類型的客戶每年貢獻(xiàn)的銷售額都在穩(wěn)步提升,普通消費(fèi)者貢獻(xiàn)的銷售額最多,這和客戶占比也有一定關(guān)系。
4.3.2 客戶下單行為分析
首先截取Customer_ID, Order_Date, Quantity, Sales, month為新的子集,并對Order_Date進(jìn)行排序,方便后續(xù)分析 :
grouped_Customer?=?df[['Customer_ID','Order_Date',?
??????????'Quantity',?'Sales',?'month']].sort_values(['Order_Date']).groupby('Customer_ID')
grouped_Customer.head()
結(jié)果如下:
看一下用戶的第一次購買日期分布。
grouped_Customer.min().Order_Date.value_counts().plot()
結(jié)果如下:
再來看一下用戶的最后一次購買日期分布。
grouped_Customer.max().Order_Date.value_counts().plot()
結(jié)果如下:
從上面可以看出, 在13年初以后新用戶增長的趨勢緩慢,商家可以通過廣告等推廣策略吸收更多的新用戶;而通過觀察最近一次購買日期,可以發(fā)現(xiàn)用戶基本沒有流失,也驗(yàn)證了每年銷售額的增長趨勢。
總體來說新客戶數(shù)量是在逐年遞減的,說明該企業(yè)老客戶的維系不錯(cuò),但新客獲取率較低。如果能夠在新客戶獲取上能夠突破,會給企業(yè)帶來很大的增長空間。
再來看看只購買過一次的客戶數(shù)量 。
#?統(tǒng)計(jì)每個(gè)客戶第一次和最后一次購買記錄
Customer_life?=?grouped_Customer.Order_Date.agg(['min','max'])
#?查看只有一次購買記錄的顧客數(shù)量,第一次和最后一次是同一條記錄,則說明購買只有一次
(Customer_life['min']?==?Customer_life['max']).value_counts()
-----------------------------------------------------
False????1580
True???????10
dtype:?int64
從結(jié)果來看,只購買一次的用戶只有10個(gè),大部分用戶都會購買多次,說明回頭率很高,也驗(yàn)證了上面關(guān)于該企業(yè)老客戶的維系不錯(cuò)的結(jié)論。
4.3.3 RFM模型分析
RFM的含義:
- R(Recency):客戶最近一次交易時(shí)間的間隔。R值越大,表示客戶交易發(fā)生的日期越久,反之則表示客戶交易發(fā)生的日期越近。
- F(Frequency):客戶在最近一段時(shí)間內(nèi)交易的次數(shù)。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。
- M(Monetary):客戶在最近一段時(shí)間內(nèi)交易的金額。M值越大,表示客戶價(jià)值越高,反之則表示客戶價(jià)值越低。
RFM分析就是根據(jù)客戶活躍程度和交易金額的貢獻(xiàn),進(jìn)行客戶價(jià)值細(xì)分的一種方法。
首先構(gòu)建RFM表。
rfm?=?df.pivot_table(index='Customer_ID',
????????????????????values?=?["Quantity","Sales","Order_Date"],
??????????????aggfunc={"Quantity":"sum","Sales":"sum","Order_Date":"max"})
#?所有用戶最大的交易日期為標(biāo)準(zhǔn),求每筆交易的時(shí)間間隔即為R
rfm['R']?=?(rfm.Order_Date.max()?-?rfm.Order_Date)/np.timedelta64(1,'D')
#?每個(gè)客戶的總銷量即為F,總銷售額即為M
rfm.rename(columns={'Quantity':'F','Sales':'M'},inplace?=?True)
rfm.head()
結(jié)果如下:
接著對客戶價(jià)值進(jìn)行標(biāo)注,將客戶分為8個(gè)等級。
#?基于平均值做比較,超過均值為1,否則為0
rfm[['R','F','M']].apply(lambda?x:x-x.mean())
def?rfm_func(x):
????level?=x.apply(lambda?x:'1'if?x>0?else?'0')
????level?=level.R?+level.F?+level.M
????d?=?{
????????"111":"重要價(jià)值客戶",
????????"011":"重要保持客戶",
????????"101":"重要挽留客戶",
????????"001":"重要發(fā)展客戶",
????????"110":"一般價(jià)值客戶",
????????"010":"一般保持客戶",
????????"100":"一般挽留客戶",
????????"000":"一般發(fā)展客戶"
????}
????result?=?d[level]
????return?result
rfm['label']=?rfm[['R','F','M']].apply(lambda?x:x-x.mean()).apply(rfm_func,axis?=1)
rfm.head()
結(jié)果如下:
對重要價(jià)值客戶和非重要價(jià)值客戶進(jìn)行可視化展示。
rfm.loc[rfm.label=='重要價(jià)值客戶','color']='g'
rfm.loc[~(rfm.label=='重要價(jià)值客戶'),'color']='r'
rfm.plot.scatter('F','R',c=?rfm.color)
結(jié)果如下:
通過RFM識別不同的客戶群體,能夠衡量客戶價(jià)值和客戶利潤創(chuàng)收能力,可以指定個(gè)性化的溝通和營銷服務(wù),為更多的營銷決策提供有力支持,為企業(yè)創(chuàng)造更大的利益。
4.3.4 ?新用戶、活躍用戶、不活躍用戶和回歸用戶分析
設(shè)置Customer_ID為索引,month為列名,統(tǒng)計(jì)每個(gè)月的購買次數(shù)。
pivoted_counts?=?df.pivot_table(index=?'Customer_ID',
???????????????????????????????columns=?'month',
???????????????????????????????values=?'Order_Date',
???????????????????????????????aggfunc=?'count').fillna(0)
#?大于一次的全部設(shè)為1
df_purchase?=?pivoted_counts.applymap(lambda?x:1?if?x>0?else?0)
df_purchase.head()
結(jié)果如下:
定義狀態(tài)函數(shù)并進(jìn)行狀態(tài)標(biāo)記。
def?active_status(data):
????status?=?[]
????for?i?in?range(48):
????????if?data[i]?==?0:
????????????if?len(status)>0:
????????????????if?status[i-1]?==?"unreg":
?????????????????#?未注冊客戶
????????????????????status.append("unreg")
????????????????else:
?????????????????#?不活躍用戶
????????????????????status.append("unactive")
????????????else:
????????????????status.append("unreg")
????????????
????????#?若本月消費(fèi)了
????????else:
????????????if?len(status)?==?0:
?????????????#?新用戶
????????????????status.append("new")
????????????else:
????????????????if?status[i-1]?==?"unactive":
?????????????????#?回歸用戶
????????????????????status.append("return")
????????????????elif?status[i-1]?==?"unreg":
????????????????????status.append("new")
????????????????else:
????????????????????status.append("active")
????return?pd.Series(status)??
purchase_stats?=?df_purchase.apply(active_status,axis?=1)
purchase_stats.head()
結(jié)果如下:
用NaN替代 "unreg",并統(tǒng)計(jì)每月各狀態(tài)客戶數(shù)量。
purchase_stats_ct?=?purchase_stats.replace('unreg',np.NaN).apply(lambda?x:pd.value_counts(x))
#?用0填充NaN
purchase_stats_ct.fillna(0).T.plot.area()
結(jié)果如下:
從以上結(jié)果可以發(fā)現(xiàn)活躍客戶、新客戶和回歸客戶,每年呈一定的規(guī)律起伏,這可能和年終年末大促有關(guān),需要更多數(shù)據(jù)進(jìn)行佐證;同時(shí)可以發(fā)現(xiàn)新客數(shù)量每年均在減少,說明該商家新客獲取率較低,如果能在新客戶獲取上取得突破,會給商家?guī)砗艽蟮脑鲩L空間。
4.3.5 復(fù)購率和回購率分析
- 復(fù)購率計(jì)算指標(biāo):用戶在該月購買過一次以上算復(fù)購。
purchase_r?=?pivoted_counts.applymap(lambda?x?:1?if?x>1?else?np.NaN?if?x==0?else?0)
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))
結(jié)果如下:
- 回購率計(jì)算指標(biāo):在該月購買過,且在下月也購買時(shí)計(jì)入回購。
def?purchase_back(data):
????status=[]
????for?i?in?range(47):
????????if?data[i]?==1:
????????????if?data[i+1]?==?1:
????????????????status.append(1)
????????????if?data[i+1]?==?0:
????????????????status.append(0)
????????else:
????????????status.append(np.NaN)
????status.append(np.NaN)
????return?status
purchase_b?=?df_purchase.apply(purchase_back,axis?=1,result_type='expand')
(purchase_b.sum()/purchase_b.count()).plot(figsize=(10,4))
結(jié)果如下:
從上可以發(fā)現(xiàn)復(fù)購率基本大于0.525,且呈總體上升趨勢,說明客戶忠誠度高,回購率在年中年末呈峰形態(tài),可能與商家折扣活動或節(jié)日有關(guān)。
5.總結(jié)
以上就是數(shù)據(jù)分析的基本流程,通過 場、貨、人 三個(gè)不同的角度去分析一家全球超市的銷售、商品、用戶情況,并根據(jù)分析結(jié)果給出一些有利于拓展用戶、提升銷量的辦法。當(dāng)然,這份數(shù)據(jù)集包含信息很多,還可以進(jìn)行其它一些方面的分析,來給出更好的建議。

