嗨害大家好鸭!我是小熊猫❤

其实这是一个做了好久的外包

给大家来分享一下其中的思路

有什么python相关报错解答自己不会的、或者源码资料/模块安装/女装大佬精通技巧 都可以来这里:(https://jq.qq.com/?_wv=1027&k=2Q3YTfym)

一、项目背景

通过"扫描"零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。

二、数据来源

<链接>

三、提出问题

  • 消费情况分析及用户购买模式分析
  • RFM和CLV分析
  • 不同类别商品关联规则挖掘

四、理解数据

  • Date:购买日期
  • Customer_ID:用户ID
  • Transaction_ID:交易ID
  • SKU_Category:商品分类SKU编码
  • SKU:商品唯一SKU编码
  • Quantity:购买数量
  • Sales_Amount:购买金额

五、数据清洗

1.导入数据

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
%matplotlib inline
# 更改设计风格
plt.style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei']np.__version__pd.__version__df = pd.read_csv('scanner_data.csv')
df.head()df.info()

2.选择子集

第一列为数据编号,已有索引故删除df.drop(columns='Unnamed: 0', inplace=True)
df.info()### 3.删除重复值```go
df.duplicated().sum()

数据无重复值

### 4.缺失值处理df.isnull().sum()

数据无缺失值

### 5.标准化处理df.dtypesDate为对象类型,需要标准化为日期类型格式df.Date = pd.to_datetime(df.Date, format='%d/%m/%Y')
df.dtypes

6.异常值处理

df[['Quantity','Sales_Amount']].describe()

购买数量存在小于1是由于称重单位不足1所致,非异常值


六、分析内容

1.消费情况按月分析

(1)每月消费总金额趋势分析


df['Month'] = df.Date.astype('datetime64[M]')
df.head()grouped_month = df.groupby('Month')grouped_month.Sales_Amount.sum()2018年1月数据可能统计不全,不纳入趋势分析grouped_month.Sales_Amount.sum().head(12).plot()
  • 由上图可知:消费金额波动较大,其中第一季度保持持续上升,后续波动较大,整体呈上升趋势

(2)每月交易次数趋势分析

grouped_month.Transaction_ID.nunique().head(12).plot()

由上图可知:交易次数波动较大,前期呈上升趋势,五月之后交易次数开始下降,在八月降至最低值,后续开始波动回升,在十二月份重回峰值

(3)每月商品购买数量趋势分析

grouped_month.Quantity.sum().head(12).plot()
  • 由上图可知:商品购买数量波动较大,整体趋势同交易次数保持一致

(4)每月消费人数趋势分析

grouped_month.Customer_ID.nunique().head(12).plot()

由上图可知:每月购买人数可分简单为三个阶段,1-5月呈持续上升趋势,6—8呈持续下降趋势,9-12月呈波动上升趋势

2.用户分布分析

(1)新用户分布

grouped_customer = df.groupby('Customer_ID')
grouped_customer.Date.min().value_counts().plot()
  • 由上图可知:新用户获取不稳定,波动较大,整体有略微下降趋势
grouped_customer.Month.min().value_counts().plot()
  • 由上图可知:按月统计,每月新用户用户数有明显下降趋势。说明新用户获取呈大幅下降趋势,需要引起注意,适当增加营销活动提升新用户的获取

(2)一次消费及多次消费用户占比分析

#仅消费一次用户占比(grouped_customer.Transaction_ID.nunique() == 1).sum()/df.Customer_ID.nunique()
  • 由计算得:存在一半的用户只进行了一次消费
grouped_month_customer = df.groupby(['Month', 'Customer_ID'])#每个用户每月的第一次购买时间
data_month_min_date = grouped_month_customer.Date.min().reset_index()
#每个用户的第一次购买时间
data_min_date = grouped_customer.Date.min().reset_index()#通过Customer_ID联立两表
merged_date = pd.merge(data_month_min_date, data_min_date, on='Customer_ID')
merged_date.head()#Date_x等于Date_y则为每月新用户
((merged_date.query('Date_x == Date_y')).groupby('Month').Customer_ID.count() / merged_date.groupby('Month').Customer_ID.count()).plot()

由上图可知:每月新用户占比整体呈下降趋势,结合每月消费人数趋势可知,第四季度消费人数有上升趋势,故期间复购人数有所提升

3.用户分层分析

(1)RFM分层分析

pivot_rfm = df.pivot_table(index='Customer_ID',values=['Date', 'Transaction_ID', 'Sales_Amount'],aggfunc={'Date':'max', 'Transaction_ID':'nunique', 'Sales_Amount':'sum'})pivot_rfm['R'] = (pivot_rfm.Date.max() - pivot_rfm.Date)/np.timedelta64(1, 'D')
pivot_rfm.rename(columns={'Transaction_ID':'F', 'Sales_Amount':'M'}, inplace=True)def label_func(data):label = data.apply(lambda x:'1' if x > 0 else '0')label = label.R + label.F + label.Mlabels = {'111':'重要价值客户','011':'重要保持客户','101':'重要发展客户','001':'重要挽留客户','110':'一般价值客户','010':'一般保持客户','100':'一般发展客户','000':'一般挽留客户'}return labels[label]
pivot_rfm['label'] = pivot_rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(label_func, axis=1)pivot_rfm.label.value_counts().plot.barh()pivot_rfm.groupby('label').M.sum().plot.pie(figsize=(6,6), autopct='%3.2f%%')pivot_rfm.groupby('label').agg(['sum', 'count'])

由上表及图可知:

  • 销售额主要来源重要保持客户,人数占比最高的为一般发展客户
  • 重要保持客户:销售额的主要来源,近期有消费,且消费高,消费频率不足,可以适当举行营销活动,提升此层客户的购买频率
  • 重要价值客户:销售额的第二来源,近期有消费,消费高,频率高,尽可能使该层客户保持现状
  • 重要发展客户:消费以及消费频次高,近期没有消费,可以使用适当策略召回用户,参与消费
  • 重要挽留客户:消费高,但频次低且近期未消费,处在流失的边缘,可以通过适当活动,使其参与到消费中来,防止流失
  • 一般价值客户:消费低,消费频率高且近期有消费,可以使用优惠券等形式活动刺激该层客户的消费,提升其消费额
  • 一般发展客户:人数占比最高,近期有消费,但消费额以及消费频次不高,考虑到人数占比高,可以适当举办活动提升消费频次和消费额
  • 一般保持客户:在成本与资源控制下,酌情考虑
  • 一般挽留客户:在成本与资源控制下,酌情考虑

(2)用户状态分层分析

pivoted_status = df.pivot_table(index='Customer_ID', columns='Month', values='Date', aggfunc='count').fillna(0)def active_status(data):status = []for i in range(len(data)):     #若本月没有消费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:if status[i-1] == 'unreg':status.append('new')elif status[i-1] == 'unactive':status.append('return')else:status.append('active')else:status.append('new')status = pd.Series(status, index = data.index)return statusactive_status = pivoted_status.apply(active_status, axis=1)active_status.replace('unreg', np.nan).apply(lambda x:x.value_counts()).fillna(0).T.apply(lambda x: x/x.sum(),axis=1).plot.area()

由上图可知:

  • 新用户:新用户占比呈明显下降趋势,说明拉新运营不足
  • 活跃用户:在二月占比达到最高,后续呈缓慢下降趋势,说明消费运营正在下滑
  • 不活跃用户:不活跃用户呈明显上升趋势,客户流失较为明显
  • 回流客户:有缓慢上升趋势,说明召回运营不错

4.用户生命周期分析

(1)用户生命周期分布

#构成用户生命周期研究的数据样本需要消费次数>=2次的用户
clv = (grouped_customer[['Sales_Amount']].sum())[grouped_customer.Transaction_ID.nunique() > 1]clv['lifetime'] = (grouped_customer.Date.max() - grouped_customer.Date.min())/np.timedelta64(1,'D')clv.describe()- 由上表可知:消费一次以上的用户平均生命周期为116天,用户生命周期内平均消费金额为121.47元clv['lifetime'].plot.hist(bins = 50)

由上图可知:

  • 生命周期在0-90天内的用户较多,说明生命周期短的客户占比较高,90天内流失率较高,此部分用户可以作为运营重点,延长这些用户的生命周期;
  • 生命周期在90-250之间的分布较为均匀,这也是大多数用户的生命周期,可以刺激这些用户的消费,使其在生命周期内提升消费金额;
  • 生命周期大于250天的人数极少,说明生命周期较长的忠诚客户占比不高。

(2)用户生命周期价值分布

clv['Sales_Amount'].plot.hist(bins = 50)

由上图可知:

  • 绝大部分用户生命周期内价值在500以内,且其中大部分在100以内,存在较大极值拉高均值,数据向右偏斜。

(3)用户生命周期及其价值相关关系

plt.scatter(x='lifetime', y='Sales_Amount', data=clv)

由上图可知:

  • 用户生命周期与其期间客户价值不存在线性关系,当生命周期在300天内,部分生命周期较长用户贡献的价值高于生命周期较短的用户;
  • 当生命周期大于300天,存在部分用户贡献价值较少,由于数据量不足等原因,结果仅供参考

5.回购率与复购率分析

(1)复购率分析

grouped_month_customercustomer_month_again = grouped_month_customer.nunique()
customer_month_again#每月消费次数大于1的用户数
customer_month_again = grouped_month_customer.nunique().query('Transaction_ID > 1').reset_index().groupby('Month').count().Customer_ID
# customer_month_again
#每月消费用户数
customer_month = grouped_month.Customer_ID.nunique()
# #每月复购率
(customer_month_again/customer_month).plot()
customer_month
(customer_month_again/customer_month)
  • 由上图可知:复购率在25%上下浮动,说明每月有25%的用户会进行多次消费;前三个月的复购率有所下降,后续有所回升,整体有上升趋势,应结合本身商务模式,决定进一步提升复购率还是注重新用户的获取。最后一月由于数据量不足,结果以真实数据为主。

(2)回购率分析

#  1表示前90天消费且本月回购  0表示前90天消费本月未回购  nan表示前90天未消费
def buy_back(data):status = [np.nan,np.nan,np.nan]for i in range(3,len(data)):#本月购买if data[i] == 1:#前90天购买if (data[i-1] == 1 or data[i-2] ==1 or data[i-3] == 1):status.append(1)#前90天未购买else:status.append(np.nan)#本月未购买else:#前90天购买if (data[i-1] == 1 or data[i-2] ==1 or data[i-3] == 1):status.append(0)#前90天未购买else:status.append(np.nan)status = pd.Series(status, index = data.index)return statusback_status = pivoted_status.apply(buy_back, axis=1)
back_status.head()(back_status.sum()/back_status.count()).plot()

由上图可知:90天内回购率,即90天内重复购买率在10%以下,说明目前商店处于用户获取模式,然而由前面分析可知,新用户获取呈下降趋势,目前商店并不健康,当前阶段应当将重心放在新用户获取上,

6.商品关联规则挖掘

(1)分析热销商品

#取出销量排名前10的商品类型
hot_category = df.groupby('SKU_Category').count().Sales_Amount.sort_values(ascending=False)[:10].reset_index()
plt.barh(hot_category.SKU_Category, hot_category.Sales_Amount)#热销商品占比
hot_category['percent'] = hot_category.Sales_Amount.apply(lambda x:x/hot_category.Sales_Amount.sum())
plt.figure(figsize=(6,6))
plt.pie(hot_category.percent,labels=hot_category.SKU_Category,autopct='%1.2f%%')
plt.show()category_list = df.groupby('Transaction_ID').SKU_Category.apply(list).values.tolist()from apyori import apriorimin_support_value = 0.02
min_confidence_value = 0.3
result = list(apriori(transactions=category_list, min_support=min_support_value, min_confidence=min_confidence_value, min_left=0))result

由上结果可得:

  • ‘FU5’–>‘LPF’:支持度为约2.1%,置信度约为49.5%。说明同时购买这两类商品发生的可能性为约2.1%,先购买FU5类型产品后,同时购买LPF类型产品的概率为49.5%
  • ‘IEV’–>‘LPF’:支持度约为3.1%,置信度约为48.9%。说明同时购买这两类商品发生的可能性约为3.1%,先购买IEV类型产品后,同时购买LPF类型产品的概率约为48.9%
  • ‘LPF’–>‘IEV’:支持度约为3.1%,置信度约为43.3%。说明同时购买这两类商品发生的可能性约为3.1%,先购买LPF类型产品后,同时购买IEV类型产品的概率约为43.3%
  • ‘OXH’–>‘LPF’:支持度约为2.0%,置信度约为48.1%。说明同时购买这两类商品发生的可能性约为2.0%,先购买IEV类型产品后,同时购买LPF类型产品的概率约为48.1%

终于打完字了我天


今天的文章就是这样啦,希望对你们有所帮助~

我是小熊猫,咱下篇文章再见啦(✿◡‿◡)

python数据分析实战:超市零售商店相关推荐

  1. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  2. 《Python数据分析实战》day2: Pandas中取得某行或者是某列的一点思考

    今天看了<Python数据分析实战>这本书的第四章:Pandas的简介的部分,大概看了一半,在实践代码的时候发现了jupyter notebook提示warning,研究了一下有了一些自己 ...

  3. python数据分析实战 fabio nelli百度云_Python数据分析实战 内利(Fabio Nelli),杜春晓 9787115432209...

    商品描述: 基本信息 书名:Python数据分析实战 定**价:59.00元 作者: 内利(Fabio Nelli) 著,杜春晓 译 出版社:人民邮电出版社 出版日期:2016-08-01 ISBN: ...

  4. python电影数据分析报告_【python数据分析实战】电影票房数据分析(二)数据可视化...

    在上一部分<[python数据分析实战]电影票房数据分析(一)数据采集> 已经获取到了2011年至今的票房数据,并保存在了mysql中. 本文将在实操中讲解如何将mysql中的数据抽取出来 ...

  5. Python数据分析实战:上海二手房价分析

    1 数据搜集 使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型.面积.单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CS ...

  6. Python数据分析实战学习与分享(一)

    学习的书籍: Python Data Analytics Python数据分析实战(尚未出版电子书) 1.1数据分析 当今世界对信息技术的依赖程度日渐加深,每天都会产生和存储海量的数据.数据的来源多种 ...

  7. Python数据分析实战学习

    Python数据分析实战学习\displaystyle\boxed{Python数据分析实战学习}Python数据分析实战学习​ AprilJulyOctober2015AprilJulyOctobe ...

  8. Python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

  9. python数据分析实例-python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

  10. Python数据分析实战(3)Python实现数据可视化

    文章目录 一.数据可视化介绍 二.matplotlib和pandas画图 1.matplotlib简介和简单使用 2.matplotlib常见作图类型 3.使用pandas画图 4.pandas中绘图 ...

最新文章

  1. JavaScript 中 call、apply和bind的用法区别
  2. 30天敏捷结果(27):做些有重要意义的事
  3. socket穿透代理代码(C++版)
  4. spring学习(48):自动装配中定义的bean的作用域
  5. 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
  6. apache服务 功能错误_如何使用Apache OpenWhisk开发功能即服务
  7. android 内容提供其,Android内容提供者
  8. html5文章标题定格,HTML5最佳做法; 部分/标题/旁边/文章元素
  9. Linux从入门到精通——基础篇
  10. SpringBoot+RabbitMQ 实现 RPC 调用
  11. 下载并安装 J2SDK以及运行第一个java程序
  12. Jmeter 脚本中使用base64 加解密、MD5加密
  13. Vmware 8里运行冒险岛097——提取Vmware Tools源文件
  14. 使用GitLab CI/CD进行自动测试和部署
  15. Xmind怎么打开?在线转换成PNG,JPG图片格式,无需安装其他软件
  16. 小额支付管理平台的设计与实现
  17. 第一天:外企面试英语口语常用语
  18. Linux中如何启动redis服务
  19. (Note)Python 统计列表中各元素出现的次数
  20. 在Tomcat下部署Jenkins

热门文章

  1. yolov5检测代码解析
  2. 递归和迭代的区别——以DNS为例
  3. 乐高积木树屋_创建树屋青蛙动画
  4. 完美世界招聘笔试(子序列)
  5. [英语学习]表示将来时的几种常用法
  6. JS - setTimeout时间误差解决办法
  7. CSS文本样式(中划线下划线行高之类的还有color也是)
  8. Golang 读文件
  9. 项目--点击按钮显示资料,点击空白处隐藏资料
  10. 集齐三大麒麟5G芯片,荣耀30系列自研技术大放异彩