python數據分析實戰之超市零售分析

明確需求和目的

對一家全球超市四年(2011-2014)的銷售數據進行 「人、貨、場」分析,並給出提高銷量的針對性建議。python

場:總體運營狀況分析,包括銷售額、銷量、利潤、客單價、市場佈局等具體狀況分析。網絡

貨:商品結構、優點/爆款商品、劣勢/待優化商品等狀況分析。app

人:客戶數量、新老客戶、RFM模型、復購率、回購率等用戶行爲分析。框架

數據收集

數據來源爲kaggle平臺,這是一份全球大型超市四年的零售數據集,數據詳盡。機器學習

數據集爲 「superstore_dataset2011-2015.csv」,共有51290條數據,共24個特徵。函數

數據預處理

一、數據整合

1.1 加載相關庫和數據集佈局

使用的庫主要有:pandas、numpy、matplotlib、seaborn學習

使用的數據集:
superstore_dataset2011-2015.csv優化

# 加載數據分析須要使用的庫
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')


# 加載零售數據集,使用'ISO-8859-1'編碼方式
df = pd.read_csv('superstore_dataset2011-2015.csv',encoding='ISO-8859-1') 
df.head()

file

1.2 數據概覽編碼

首先看一下數據集大小(行列信息):

df.shape
---------------
(51290, 24)

看一下數據概況:

# df.info()
df.describe()

file

二、數據清洗

2.1 列名重命名

從上面發現列名不符合Python的命名規範,對列名進行一下重命名,採用下劃線命名法:

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')

2.2 數據類型處理

查看一下各個列的數據類型:

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類型,銷量、銷售額、利潤等爲數值型,不須要進行數據類型處理。下單日期應爲datetime類型,須要進行處理。

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]')

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

發現有一列缺失值比較多,此列表示郵編信息,對咱們的分析沒有太多做用,可直接刪除:

df.drop(["Postal_Code"],axis=1, inplace=True)

2.4 異常值處理

簡單查看一下是否有異常值:

df.describe()

file

沒發現明顯的異常值,不須要進行處理。

2.5 重複值處理

看一下是否有重複值:

df.duplicated().sum()
---------------------
0

也沒有重複值,不須要進行處理。

數據分析

一、總體銷售狀況分析

首先構造總體銷售狀況的數據集:

# 總體銷售狀況子數據集,包含下單日期、銷售額、銷量、利潤、年份、月份信息
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

按照年份、月份對銷售子數據集進行分組求和:

sales_year = sales_data.groupby(['year','month']).sum()
sales_year

file

對以上數據進行拆分,每一年爲一個表:

#  slice(None), 是Python中的切片操做,這裏用來選擇所有數據
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年的數據

file

1.1 銷售額分析

構建銷售表:

sales=pd.concat([year_2011['Sales'],year_2012['Sales'],
                 year_2013['Sales'],year_2014['Sales']],axis=1)

# 對行名和列名進行重命名
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()

file

從上圖能夠看出,基本上每年都是下半年銷售額比上半年要高,並且隨着年份的增大,銷售額也有明顯的增長,說明銷售業績增加較快,發展仍是比較好的。

肉眼可見的是每年的銷售額都比前一年要好,來實際計算一下具體的增加率和每一年的銷售總額:

# 計算年度銷售額並圖表展現
sales_sum=sales.sum()
sales_sum.plot(kind='bar',alpha=0.5)
plt.grid()

# 計算每一年增加率
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

file

從上面能夠看出,後兩年的銷售額增加率達到26%,2014年銷售額將近是2011的兩倍,發展勢頭良好,經營在逐步穩定。結合年度銷售額及增加率,再結合公司總體戰略規劃,能夠預測或制定下一年度總銷售額業績指標。

瞭解了超市總體銷售額後,再對每一年每個月的銷售額進行分析,瞭解不一樣月份的銷售狀況,找出是否有淡旺季之分,找出重點銷售月份,以便制定經營策略與業績月度及季度指標拆分。

看一下銷售額的面積堆疊圖:

# 面積堆疊圖
sales.plot.area(stacked=False)

file

從上圖能夠大體看出,該超市的銷售季節性明顯,整體上半年是淡季,下半年是旺季。上半年中6月份銷售額比較高,下半年中7月份的銷售額偏低。

對於旺季的月份,運營推廣等策略要繼續維持,還能夠加大投入,提升總體銷售額。
對於淡季的月份,能夠結合產品特色進行新產品拓展,舉辦一些促銷活動等吸引客戶。

1.2 銷量分析

構建銷量表:

quantity = pd.concat([year_2011['Quantity'],year_2012['Quantity'],
                 year_2013['Quantity'],year_2014['Quantity']],axis=1)

# 對行名和列名進行重命名
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()

file

看一下銷量增加率和每一年的銷量總和:

# 計算年度銷量並圖表展現
quantity_sum=quantity.sum()
quantity_sum.plot(kind='bar',alpha=0.5)
plt.grid()

# 計算每一年增加率
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

從上面能夠看出,2011-2014年銷量變化趨勢與銷售額是同樣的,下半年銷量總體高於上半年,同時銷量同比上一年均在提升。

1.3 利潤分析

構建利潤表:

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()

file

計算每一年總利潤和利潤率:

# 計算年度總利潤並圖表展現
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

file

從上面的結果能夠看出,每一年的利潤和銷售額同樣,是在逐年增長的,說明企業經營仍是比較妥善的,可是利潤率整體平穩,穩定在11%-12%之間,整體利潤率也仍是不錯的。

1.4 客單價分析

客單價是指商場(超市)每個顧客平均購買商品的金額,客單價也便是平均交易金額。從某種程度上反映了企業的消費羣體的許多特色以及企業的銷售類目的盈利狀態是否健康。

總消費次數:同一天內,同一我的發生的全部消費算做一次消費。

客單價=總消費金額 / 總消費次數

# 2011-2014年客單價
for i in range(2011,2015):
    data=df[df['year']==i]
    price=data[['Order_Date','Customer_ID','Sales']]

    # 計算總消費次數
    price_dr=price.drop_duplicates(
        subset=['Order_Date', 'Customer_ID'])

    # 總消費次數:有多少行
    total_num=price_dr.shape[0]
    print('{}年總消費次數='.format(i),total_num)

    unit_price = price['Sales'].sum()/total_num
    print('{}年客單價='.format(i), unit_price,'\n')
---------------------------------------------------
2011年總消費次數= 4453
2011年客單價= 507.3997070604087 

2012年總消費次數= 5392
2012年客單價= 496.55762136498515 

2013年總消費次數= 6753
2013年客單價= 504.3308824788983 

2014年總消費次數= 8696
2014年客單價= 494.4647965225392

從上面結果來看,每一年的消費次數呈不斷上升趨勢,可是客單價整體浮動範圍不是很大 ,穩定在500左右。

1.5 市場佈局分析

由於這是一家全球超市,在不一樣地區都會有市場,因此看一下不一樣地區之間的銷售狀況:

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

用圖表顯示各個地區每一年的銷售狀況:

sns.barplot(x='Market', y='Sales_amounts', hue='year', data = Market_Year_Sales)
plt.title('2011-2014 market sales')

file

再看一下四年來各個地區銷售額佔總銷售額的百分比:

Market_Sales = df.groupby(['Market']).agg({'Sales':'sum'})
Market_Sales["percent"] = Market_Sales["Sales"] / df["Sales"].sum()
Market_Sales.style.background_gradient()

file

從以上圖表能夠看出,每一個地區每一年銷售額整體處於上升趨勢,其中APAC(亞太地區)、EU(歐盟)、US(美國)、LATAM(拉丁美洲)的銷售額超過了總銷售額的85%,整體也與地區的經濟發展相匹配。其中加拿大Canada的銷售額微乎其微,能夠結合公司總體戰略佈局進行取捨。

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

從上面能夠看出,銷量最高的大部分是辦公用品,而銷售額最高的大部分是電子產品、傢俱這些單價較高的商品。

利潤前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的商品有一半是電子產品,能夠重點考慮提高這部分產品的銷量,來增長總體的利潤。

具體商品種類的銷售狀況:

# 根據商品種類和子種類,從新重合成一個新的種類
df['Category_Sub_Category'] = df[['Category','Sub_Category']].apply(lambda x:str(x[0])+'_'+str(x[1]),axis=1)
# 按照新的種類進行分組,統計銷售額和利潤
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)
# 每一個種類商品的銷售額累計佔比
df_Category_Sub_Category['cum_percent'] = df_Category_Sub_Category['Sales'].cumsum()/df_Category_Sub_Category['Sales'].sum()
df_Category_Sub_Category

file

從圖表中能夠很清晰的看到不一樣種類商品的銷售額貢獻對比,有將近一半的商品的總銷售佔比達到84%,應該是自家優點主營產品,後續經營中應繼續保持,能夠結合總體戰略發展適當加大投入,逐漸造成本身的品牌。

同時,也能夠發現,末尾佔比16%的產品中大部分是辦公用品中的小物件。能夠考慮與其餘主營產品結合,連帶銷售來提高銷量,或者考慮對這些商品進行優化。

可是值得關注的是,Tables(桌子)的利潤是負,代表這個產品目前處於虧損狀態,應該是促銷讓利太多。經過檢查原數據,發現Tabels大部分都在打折,打折的銷量高達76%。若是是在清庫存,這個效果仍是不錯的,但若是不是,說明這個產品在市場推廣上遇到了瓶頸,或者是遇到強競爭對手,須要結合實際業務進行分析,適當改善經營策略。

4.3 用戶狀況分析

3.1 不一樣類型的客戶佔比

df["Segment"].value_counts().plot(kind='pie', autopct='%.2f%%', shadow=True, figsize=(14, 6))

file

從上圖能夠看出,這四年來,普通消費者的客戶佔比最多,達到51.7%。

再看一下每年不一樣類型的客戶數量狀況:

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')

file

從上面能夠看出,每類客戶每一年均在保持增加趨勢,客戶結構仍是很是不錯的。

看一下不一樣類型的客戶每一年貢獻的銷售額:

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')

file

各個類型的客戶每一年貢獻的銷售額都在穩步提高,普通消費者貢獻的銷售額最多,這和客戶佔比也有必定關係。

3.2 客戶下單行爲分析

首先截取Customer_ID, Order_Date, Quantity, Sales, month爲新的子集,並對Order_Date進行排序,方便後續分析 :

grouped_Customer = df[['Customer_ID','Order_Date', 
          'Quantity', 'Sales', 'month']].sort_values(['Order_Date']).groupby('Customer_ID')
grouped_Customer.head()

file

看一下用戶的第一次購買日期分佈:

grouped_Customer.min().Order_Date.value_counts().plot()

Uploading file...

再來看一下用戶的最後一次購買日期分佈:

grouped_Customer.max().Order_Date.value_counts().plot()

file

從上面能夠看出, 在13年初之後新用戶增加的趨勢緩慢,商家能夠經過廣告等推廣策略吸取更多的新用戶;而經過觀察最近一次購買日期,能夠發現用戶基本沒有流失,也驗證了每一年銷售額的增加趨勢。

整體來講新客戶數量是在逐年遞減的,說明該企業老客戶的維繫不錯,但新客獲取率較低。若是可以在新客戶獲取上可以突破,會給企業帶來很大的增加空間。

再來看看只購買過一次的客戶數量 :

# 統計每一個客戶第一次和最後一次購買記錄
Customer_life = grouped_Customer.Order_Date.agg(['min','max'])
# 查看只有一次購買記錄的顧客數量,第一次和最後一次是同一條記錄,則說明購買只有一次
(Customer_life['min'] == Customer_life['max']).value_counts()
-----------------------------------------------------
False    1580
True       10
dtype: int64

從結果來看,只購買一次的用戶只有10個,大部分用戶都會購買屢次,說明回頭率很高,也驗證了上面關於該企業老客戶的維繫不錯的結論。

3.3 RFM模型分析

RFM的含義:

R(Recency):客戶最近一次交易時間的間隔。R值越大,表示客戶交易發生的日期越久,反之則表示客戶交易發生的日期越近。

F(Frequency):客戶在最近一段時間內交易的次數。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。

M(Monetary):客戶在最近一段時間內交易的金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。

RFM分析就是根據客戶活躍程度和交易金額的貢獻,進行客戶價值細分的一種方法。

首先構建RFM表:

rfm = df.pivot_table(index='Customer_ID',
                    values = ["Quantity","Sales","Order_Date"],
              aggfunc={"Quantity":"sum","Sales":"sum","Order_Date":"max"})

# 全部用戶最大的交易日期爲標準,求每筆交易的時間間隔即爲R
rfm['R'] = (rfm.Order_Date.max() - rfm.Order_Date)/np.timedelta64(1,'D')
# 每一個客戶的總銷量即爲F,總銷售額即爲M
rfm.rename(columns={'Quantity':'F','Sales':'M'},inplace = True)
rfm.head()

file

接着對客戶價值進行標註,將客戶分爲8個等級(2 x 2 x 2):

# 基於平均值作比較,超過均值爲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":"重要價值客戶",
        "011":"重要保持客戶",
        "101":"重要挽留客戶",
        "001":"重要發展客戶",
        "110":"通常價值客戶",
        "010":"通常保持客戶",
        "100":"通常挽留客戶",
        "000":"通常發展客戶"
    }
    result = d[level]
    return result

rfm['label']= rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis =1)
rfm.head()

file

對重要價值客戶和非重要價值客戶進行可視化展現:

rfm.loc[rfm.label=='重要價值客戶','color']='g'
rfm.loc[~(rfm.label=='重要價值客戶'),'color']='r'
rfm.plot.scatter('F','R',c= rfm.color)

file

經過RFM識別不一樣的客戶羣體,可以衡量客戶價值和客戶利潤創收能力,能夠指定個性化的溝通和營銷服務,爲更多的營銷決策提供有力支持,爲企業創造更大的利益。

3.4 新用戶、活躍用戶、不活躍用戶和迴歸用戶分析

設置Customer_ID爲索引,month爲列名,統計每月的購買次數:

pivoted_counts = df.pivot_table(index= 'Customer_ID',
                               columns= 'month',
                               values= 'Order_Date',
                               aggfunc= 'count').fillna(0)
# 大於一次的所有設爲1
df_purchase = pivoted_counts.applymap(lambda x:1 if x>0 else 0)
df_purchase.head()
python數據分析實戰之超市零售分析
定義狀態函數並進行狀態標記:

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")
            
        # 若本月消費了
        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()

file

用NaN替代 「unreg」,並統計每個月各狀態客戶數量:

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()

file

從以上結果能夠發現活躍客戶、新客戶和迴歸客戶,每一年呈必定的規律起伏,這可能和年長年末大促有關,須要更多數據進行佐證;同時能夠發現新客數量每一年均在減小,說明該商家新客獲取率較低,若是能在新客戶獲取上取得突破,會給商家帶來很大的增加空間。

3.5 復購率和回購率分析

復購率計算指標:用戶在該月購買過一次以上算復購。

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))

file

回購率計算指標:在該月購買過,且在下月也購買時計入回購。

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))

file

從上能夠發現復購率基本大於0.525,且呈整體上升趨勢,說明客戶忠誠度高,回購率在年中年底呈峯形態,可能與商家折扣活動或節日有關。

總結

本文分別經過「場、貨、人」三個不一樣的角度去分析一家全球超市的銷售、商品、用戶狀況,並根據分析結果給出一些有利於拓展用戶、提高銷量的辦法。

固然,這份數據集包含信息不少,還能夠進行其它一些方面的分析,來給出更好的建議。

文源網絡,僅供學習之用,若有侵權請聯繫刪除。

在學習Python的道路上確定會碰見困難,別慌,我這裏有一套學習資料,包含40+本電子書,800+個教學視頻,涉及Python基礎、爬蟲、框架、數據分析、機器學習等,不怕你學不會!
https://shimo.im/docs/JWCghr8... 《Python學習資料》

關注公衆號【Python圈子】,優質文章每日送達。

相關文章
相關標籤/搜索