关于超市零售数据的Python数据分析实战

关于超市零售数据的Python数据分析实战_第1张图片

一、明确需求和目的

  • 对一家全球超市的四年(2011-2014)销售数据进行“人、货、场”分析,并给出提升销量的针对性建议。
  • 场:整体运营情况分析,包括销售额、销量、利润、客单价、市场布局等具体情况分析。
  • 货:商品结构、优势/爆款商品、劣势/待优化商品等情况分析。
  • 人:客户数量、新老客户、RFM模型、复购率、回购率等用户行为分析。

二、数据介绍

  • 数据来源于Kaggle平台,这是一份全球大型超市五年的零售数据集,数据详尽。
  • 数据集为superstore_dataset2011-2015.csv,共有51290条数据,每条数据共24个特征。

三、数据预处理

3.1 加载相关库和数据集

# 加载数据分析需要的库
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']  # 替换sans-serif字体
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负数的负号显示问题
warnings.filterwarnings('ignore')  # 抑制第三方警告

# 使用"unicode-escape"编码方式加载数据集
df = pd.read_csv('./superstore_dataset2011-2015.csv', encoding='unicode-escape')
df.head()

关于超市零售数据的Python数据分析实战_第2张图片
首先看一下数据集的大小:

df.shape
> (51290, 24)

再看一下数据的分布概况:

df.describe()

关于超市零售数据的Python数据分析实战_第3张图片

3.2 列名重命名
从上面展示的数据可以发现其列名不符合Python的命名规范,因此采用下划线命名法对列名进行重命名:

df.rename(columns=lambda x: x.replace(' ', '_').replace('-', '_'), inplace=True)
df.columns

关于超市零售数据的Python数据分析实战_第4张图片

3.3 数据类型处理
首先查看各列的数据类型:

df.dtypes

关于超市零售数据的Python数据分析实战_第5张图片
可以看到大部分列的数据类型是object,其中销量(Quantity)、销售额(Sales)、利润(Profit)等为数值型,不需要进行数据类型转换。另外,订单日期(Order_Date)的类型应为datetime,因此需要对其进行转换。

df['Order_Date'] = pd.to_datetime(df['Order_Date'])
df['Order_Date'].sample(5)

关于超市零售数据的Python数据分析实战_第6张图片
为了便于分析每年和每月的销售情况,增加“Year”列和“Month”列:

df['Year'] = df['Order_Date'].dt.year
df['Month'] = df['Order_Date'].values.astype('datetime64[M]')
df[['Year', 'Month']].sample(5)

关于超市零售数据的Python数据分析实战_第7张图片

3.4 缺失值处理
先查看一下数据的缺失情况:

df.isnull().sum(axis=0)

关于超市零售数据的Python数据分析实战_第8张图片
发现“Postal_Code”列的缺失值非常多,该列表示的是邮编信息,显然对我们的分析没有太大作用,因此可直接删除该列。

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

3.5 异常值处理

df.describe()

关于超市零售数据的Python数据分析实战_第9张图片
从上面展示的结果可以确定没有明显的异常值,因此不需要进行处理。

3.6 重复值处理
先查看一下是否有重复值:

df.duplicated().sum()
> 0

说明没有重复值,因此不需要进行处理。

四、数据分析

4.1 整体销售情况分析
首先构造整体销售情况的子数据集:

# 包含:订单日期、年份、月份、销售额、销量、利润
sales_data = df[['Order_Date', 'Year', 'Month', 'Sales', 'Quantity', 'Profit']]
sales_data.sample(5)

关于超市零售数据的Python数据分析实战_第10张图片
然后按照年份、月份对销售子数据集进行分组求和:

sales_year = sales_data.groupby(['Year', 'Month']).sum()
sales_year

关于超市零售数据的Python数据分析实战_第11张图片
接着对以上进行分组求和后的数据进行拆分,将每一年的数据作为独立的表:

year_2011 = sales_year.loc[2011:2011,:].reset_index()
year_2012 = sales_year.loc[2012:2012,:].reset_index()
year_2013 = sales_year.loc[2013:2013,:].reset_index()
year_2014 = sales_year.loc[2014:2014,:].reset_index()
year_2014

关于超市零售数据的Python数据分析实战_第12张图片

4.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 = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']

# 添加颜色:颜色越深表示销售额越高
sales.style.background_gradient()

关于超市零售数据的Python数据分析实战_第13张图片

  • 从上图可以看出基本上每一年下半年的销售额都比上半年要高,而且随着年份的增大,销售额也在逐年的增加,可以说明其销售业绩增长较快,发展还是比较好的。

肉眼看到的是每一年的销售额都比前一年要好,那么现在来实际计算一下每年的销售总额和具体的增长率:

# 计算每年销售额
sales_sum = sales.sum()

# 计算销售额增长率
rise_12 = (sales_sum[1]-sales_sum[0]) / sales_sum[0]
rise_23 = (sales_sum[2]-sales_sum[1]) / sales_sum[1]
rise_34 = (sales_sum[3]-sales_sum[2]) / sales_sum[2]
rise_rate = [0, rise_12, rise_23, rise_34]

sales_sum = pd.DataFrame({'sales_sum': sales_sum})
sales_sum['rise_rate'] = rise_rate
sales_sum

关于超市零售数据的Python数据分析实战_第14张图片

# 展示每年销售额
sales_sum['sales_sum'].plot(kind='bar', alpha=0.5, figsize=(8,6))
plt.grid()
plt.title('2011-2014每年销售额')
plt.show()

关于超市零售数据的Python数据分析实战_第15张图片

# 展示增长率
sales_sum['rise_rate'].plot(color='red', figsize=(8,6))
plt.title('2011-2014每年销售额增长率变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第16张图片

  • 从上面可以看出,后两年的销售额增长率达到26%,2014年的销售额将近是2011年的两倍,发展势头良好,经营在逐步稳定。结合年度销售额及其增长率进行战略规划,可以规划或制定下一年度总销售额业绩指标。

了解超市整体销售额后,再对每年每月的销售额进行分析。了解不同月份的销售情况,找出是否有淡旺季之分,找出重点销售月份,以便制定经营策略与业绩月度及季度指标拆分。
首先看一下每年每月销售额的面积堆积图:

sales.plot.area(stacked=False, figsize=(8,6))
plt.title('每年每月销售额变化')
plt.show()

关于超市零售数据的Python数据分析实战_第17张图片

  • 从堆积图可以大致看出该超市的销售季节性明显,总体情况是上半年为淡季,下半年为旺季。其中上半年中6月份的销售额比较高,下半年中7月份的销售额偏低。对此可采取的措施有:

    1. 对于旺季的月份,运营推广等策略要继续维持,还可以加大投入,提高整体销售额。
    2. 对于淡季的月份,可以结合产品特点进行新产品扩展,举办一些促销活动等来吸引用户。

4.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 = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']

# 添加颜色:颜色越深表示销量越高
quantity.style.background_gradient()

关于超市零售数据的Python数据分析实战_第18张图片
计算一下每年销量和销量增长率:

# 计算每年销量
quantity_sum = quantity.sum()

# 计算销量增长率
rise_12 = (quantity_sum[1]-quantity_sum[0]) / quantity_sum[0]
rise_23 = (quantity_sum[2]-quantity_sum[1]) / quantity_sum[1]
rise_34 = (quantity_sum[3]-quantity_sum[2]) / quantity_sum[2]
rise_rate = [0, rise_12, rise_23, rise_34]

quantity_sum = pd.DataFrame({'quantity_sum': quantity_sum})
quantity_sum['rise_rate'] = rise_rate
quantity_sum

关于超市零售数据的Python数据分析实战_第19张图片

# 展示每年销量
quantity_sum['quantity_sum'].plot(kind='bar',alpha=0.5, figsize=(8,6))
plt.grid()
plt.title('2011-2014每年销量')
plt.show()

关于超市零售数据的Python数据分析实战_第20张图片

# 展示销量增长率
quantity_sum['rise_rate'].plot(color='red', figsize=(8,6))
plt.title('2011-2014每年销量增长率变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第21张图片

quantity.plot.area(stacked=False, figsize=(8,6))
plt.title('每年每月销量变化')
plt.show()

关于超市零售数据的Python数据分析实战_第22张图片

  • 可以明显看出2011-2014年销量的变化趋势与销售额是一样的,下半年销量整体高于上半年,同时销量同比上一年均在提高。

4.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 = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']

# 添加颜色:颜色越深表示利润越高
profit.style.background_gradient()

关于超市零售数据的Python数据分析实战_第23张图片

# 计算每年总利润
profit_sum = profit.sum()
profit_sum=pd.DataFrame({'profit_sum':profit_sum})
profit_sum['sales_sum'] = sales.sum().values

# 计算利润率
profit_sum['profit_rate'] = profit_sum['profit_sum'] / profit_sum['sales_sum']

profit_sum

关于超市零售数据的Python数据分析实战_第24张图片

# 展示每年总利润
profit_sum['profit_sum'].plot(kind='bar',alpha=0.5, figsize=(8,6))
plt.grid()
plt.title('2011-2014每年总利润')
plt.show()

关于超市零售数据的Python数据分析实战_第25张图片

# 展示利润率
profit_sum['profit_rate'].plot( color='green', figsize=(8,6))
plt.ylim(0.08,0.15)
plt.title('2011-2014每年利润率变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第26张图片

  • 从上面的结果可以看出,每年总利润变化趋势和销售额一样,都是在逐年增加的,说明企业经营还是比较妥善的。但是利润率总体平稳,稳定在11%-12%之间,总体也还是不错的。

4.1.4 客单价分析
客单价是指超市每一个顾客平均购买商品的金额,即平均交易金额。从某种程度上反映了企业的消费群体的许多特点以及企业的销售类目的盈利状态是否健康。其中,需要注意的有:(1)计算总消费次数要明白同一天内同一个客户发生的所有消费算作一次消费;(2)客单价等于总消费金额除以总消费次数。

# 2011-2014年客单价
total_num_list = []
unit_price_list = []
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'])
    
    # 总消费次数list
    total_num_list.append(price_dr.shape[0])
    # 客单价list
    unit_price_list.append(price['Sales'].sum()/price_dr.shape[0])
    
unit_price = pd.DataFrame({'total_num': total_num_list, 'unit_price': unit_price_list})
unit_price.index = [str(i) for i in range(2011,2015)]
unit_price

关于超市零售数据的Python数据分析实战_第27张图片

# 展示每年消费次数
# 展示每年消费次数
unit_price['total_num'].plot(kind='bar',alpha=0.5, figsize=(8,6))
plt.grid()
plt.title('2011-2014每年消费次数')
plt.show()

关于超市零售数据的Python数据分析实战_第28张图片

# 展示每年客单价
unit_price['unit_price'].plot(color='green', figsize=(8,6))
plt.ylim(450,550)
plt.grid()
plt.title('2011-2014每年客单价变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第29张图片

  • 从以上图表来看,每年消费次数呈不断上升趋势,但是客单价总体浮动范围不是很大,基本稳定在500左右。

4.1.5 市场布局分析
因为这是一家全球超市,在不同地区都会有市场,因此来看一下不同地区之间的销售情况:

Market_Year_Sales = df.groupby(['Market','Year']).agg({'Sales':'sum'}).reset_index().rename(columns={'Sales':'Sales_amounts'})
Market_Year_Sales.head(10)

关于超市零售数据的Python数据分析实战_第30张图片

plt.figure(figsize=(8,6))
sns.barplot(data=Market_Year_Sales, x='Market', y='Sales_amounts', hue='Year')
plt.title('2011-2014每年各地区销售情况')
plt.show()

关于超市零售数据的Python数据分析实战_第31张图片
再来看一下这四年各地区销售额占总销售额的百分比:

Market_Sales = df.groupby(['Market']).agg({'Sales':'sum'})
Market_Sales['percent'] = Market_Sales['Sales'] / df['Sales'].sum()
Market_Sales.sort_values('percent',inplace=True,ascending=False)
Market_Sales.style.background_gradient()

关于超市零售数据的Python数据分析实战_第32张图片

Market_Sales['percent'].plot.pie(autopct='%.2f%%', figsize=(8,8))
plt.title('四年各地区销售额占总销售额的百分比')
plt.show()

关于超市零售数据的Python数据分析实战_第33张图片

  • 从以上图表可以看出,每个地区每年销售额总体处于上升趋势,其中APAC(亚太地区)、EU(欧盟)、US(美国)、LATAM(拉丁美洲)的销售额超过了总销售额的85%,总体也与地区的经济发展相匹配。但是Canada(加拿大)的销售额微乎其微,可以结合公司整体战略布局进行取舍。

4.2 商品情况分析
首先统计销量前10的商品:

productID_count = df.groupby('Product_ID').count()['Customer_ID'].sort_values(ascending=False)
productID_count.head(10)

关于超市零售数据的Python数据分析实战_第34张图片
统计销售额前10的商品:

productID_amount = df.groupby('Product_ID').sum()['Sales'].sort_values(ascending=False)
productID_amount.head(10)

关于超市零售数据的Python数据分析实战_第35张图片
统计利润前10的商品:

productID_profit= df.groupby('Product_ID').sum()['Profit'].sort_values(ascending=False)
productID_profit.head(10)

关于超市零售数据的Python数据分析实战_第36张图片

  • 从以上结果可以看出,销量靠前的大部分是办公用品;销售额靠前的大部分是电子产品以及家具这些单价较高的商品;利润前10的商品中有一半是电子产品,可以重点考虑提升这部分产品的销量,来增加整体的利润。

接着看一下具体商品种类的销售情况:

# 按照种类和子种类进行分组,统计销售额和利润
df_Category_Sub_Category = df.groupby(['Category','Sub_Category']).sum()[['Sales','Profit']]
# 按照销售额倒序排序
df_Category_Sub_Category.sort_values('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.reset_index()

关于超市零售数据的Python数据分析实战_第37张图片

  • 从以上图表可以清晰的看到不同种类商品的销售额贡献对比,有将近一半种类的商品的总销售额占比达到84%,这部分商品应该是自家优势主营产品,后续经营过程中应继续保持,可结合整体战略发展适当加大投入,逐渐形成自己的品牌。
  • 同时也发现,末尾销售额累计占比16%的产品中大部分是办公用品中的小物件。可以考虑与其他主营产品结合,连带销售来提升销量,或者考虑对这些商品进行优化。
  • 最值得关注的是,Tables(桌子)的利润是负数,表明这个产品目前处于亏损状态,其原因可能是促销让利太多。通过检查原数据,发现Tabels大部分都在打折,打折的销量高达76%。如果是在清库存,这个效果还是不错的,但如果不是,说明这个产品在市场推广上遇到了瓶颈,或者是遇到强竞争对手,需要结合实际业务进行分析,适当改善经营策略。

4.3 用户情况分析
4.3.1 不同类型的客户占比
首先统计四年所有不同类型的客户占比:

df['Segment'].value_counts().plot(kind='pie', autopct='%.2f%%', figsize=(8,8))
plt.title('四年所有不同类型客户占比')
plt.show()

关于超市零售数据的Python数据分析实战_第38张图片

  • 从上面饼图可以看出,这四年来,普通消费者的客户占比最多,达到51.7%。

接着看一下每一年不同类别的客户数情况:

Segment_Year = df.groupby(['Segment','Year']).agg({'Customer_ID':'count'}).reset_index()
plt.figure(figsize=(8,6))
sns.barplot(x='Segment', y='Customer_ID', hue='Year', data=Segment_Year)
plt.title('2011-2014年不同类别的客户数量')
plt.show()

关于超市零售数据的Python数据分析实战_第39张图片

  • 从柱形图可以看出每一类客户每年均保持增长趋势,说明客户结构非常不错。

再来看一下每一年不同类别客户贡献的销售额:

Segment_sales = df.groupby(['Segment', 'Year']).agg({'Sales':'sum'}).reset_index()
plt.figure(figsize=(8,6))
sns.barplot(x='Segment', y='Sales', hue='Year', data=Segment_sales)
plt.title('2011-2014年不同类型客户贡献的销售额')
plt.show()

关于超市零售数据的Python数据分析实战_第40张图片

  • 各个类型的客户每年贡献的销售额都在稳步提升,普通消费者贡献的销售额最多,当然这和客户占比是有一定关系的。

4.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.min()['Order_Date'].value_counts().plot(figsize=(8,6))
plt.title('用户第一次购买日期分布')
plt.show()

关于超市零售数据的Python数据分析实战_第41张图片

grouped_Customer.max().Order_Date.value_counts().plot(figsize=(8,6))
plt.title('用户第最后一次购买日期分布')
plt.show()

关于超市零售数据的Python数据分析实战_第42张图片

  • 从上面可以看出,在13年初以后新用户增长的趋势缓慢,商家可以通过广告等推广策略吸收更多的新用户。通过观察最近一次购买日期分布,可以发现用户基本没有流失,也验证了每年销售额的增长趋势。
  • 总体来说新客户数量是在逐年递减的,说明该企业对老客户的维系不错,但新客获取率较低。如果能够在新客户获取上得到突破,将会给企业带来很大的增长空间。

接着来看一下只购买过一次的客户数量:

# 统计每一个客户第一次购买和最后一次购买日期
Customer_life = grouped_Customer['Order_Date'].agg(['min','max'])
# 查看只有一次购买记录的顾客数量,第一次和最后一次购买日期相同的话则说明购买只有一次
(Customer_life['min']==Customer_life['max']).value_counts()

image.png

  • 从结果来看,只购买一次的用户只有10个,大部分用户都会购买多次,说明复购率很高,也验证了上面关于该企业对老客户的维系不错的结论。

4.3.3 RFM模型分析
RFM的含义:

  • R(Recency):客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。
  • F(Frequency):客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
  • M(Monetary):客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。

RFM模型分析就是根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种方法。

首先构建RFM表:

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

# 以所有用户中最大的交易日期为标准,求每笔交易的时间间隔即为R
rfm['R'] = (rfm.Order_Date.max()-rfm.Order_Date) / np.timedelta64(1,'D')

# 每个客户的订单数即为F,总销售额即为M
rfm.rename(columns={'Order_ID':'F','Sales':'M'},inplace = True)
rfm = rfm[['R','F','M']]
rfm.head()

关于超市零售数据的Python数据分析实战_第43张图片
现在对客户价值进行标注,将客户分为8个等级(2x2x2):

# 基于平均值作比较,超过均值则为1,反之为0
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": "一般发展客户"}
    return d[level]

rfm['Label'] = rfm.apply(lambda x: x-x.mean()).apply(rfm_func, axis=1)
rfm.head()

关于超市零售数据的Python数据分析实战_第44张图片
接着对重要价值客户和非重要价值客户进行可视化展示:

rfm.loc[rfm.Label=='重要价值客户','Color']='g'
rfm.loc[rfm.Label!='重要价值客户','Color']='r'
rfm.plot.scatter('F', 'R',c=rfm.Color, figsize=(8,6))
plt.title('重要价值与非重要价值客户的分布')
plt.show()

关于超市零售数据的Python数据分析实战_第45张图片

  • 通过RFM识别不同的客户群体,能够衡量客户价值和客户利润创收能力,可以制定个性化的沟通和营销服务,为更多的营销决策提供有力支持,为企业创造更大的利益。

4.3.4 新用户、活跃用户、不活跃用户和回归用户分析
设置Customer_ID为索引,Month为列名,统计每个用户每个月的购买次数:

pivoted_counts = df.pivot_table(index='Customer_ID', 
                               columns='Month', 
                               values='Order_Date', 
                               aggfunc='count').fillna(0)

# 将大于1次的全部设为1,反之设为0
df_purchase = pivoted_counts.applymap(lambda x: 1 if x>0 else 0)
df_purchase.head()

关于超市零售数据的Python数据分析实战_第46张图片
定义状态函数并进行状态标记:

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_status = df_purchase.apply(active_status, axis=1)
purchase_status.head()

关于超市零售数据的Python数据分析实战_第47张图片
用NaN替代 “unreg”,并统计每月各状态的客户数量:

purchase_status_ct = purchase_status.replace('unreg',np.NaN).apply(lambda x: pd.value_counts(x))
# 用0填充NaN
purchase_status_ct.fillna(0).T.plot.area(figsize=(8,6))
plt.title('每月各状态的用户数量')
plt.show()

关于超市零售数据的Python数据分析实战_第48张图片

  • 从以上结果可以发现活跃客户、新客户和回归客户,每年呈一定的规律起伏,这可能和年终年末大促有关,需要更多数据进行佐证。同时可以发现新客数量每年均在减少,说明该商家新客获取率较低,如果能在新客户获取上取得突破,会给商家带来很大的增长空间。

4.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,6))
plt.title('每月复购率变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第49张图片
回购率计算指标:在本月购买过,且在下月也购买时计入回购

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,6))
plt.title('每月回购率变化趋势')
plt.show()

关于超市零售数据的Python数据分析实战_第50张图片

  • 从上可以发现复购率基本大于52.5%,且总体呈上升趋势,说明客户忠诚度高,回购率在年中年末呈峰形态,可能与商家折扣活动或节日有关。

五、总结

本项目通过“场、货、人”三个不同的角度去分析一家全球超市的销售、商品、用户情况,并根据分析结果给出一些有利于拓展用户、提升销量的办法。当然,这份数据集包含信息很多,还可以进行其它一些方面的分析,来给出更好的建议和业务决策支持。

你可能感兴趣的:(python,数据分析)