python对零售商店进行数据分析,看看用户消费回购率等数据
前言
嗨喽!大家好呀,这里是魔王~ 一、项目背景
通过"扫描"零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。 二、数据来源
<链接> 三、提出问题消费情况分析及用户购买模式分析 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.dtypes Date为对象类型,需要标准化为日期类型格式 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.M labels = { "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 status active_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_customer customer_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 status back_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 apriori min_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% 尾语
好了,我的这篇文章写到这里就结束啦!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!
华为双骁龙处理器手机,1099元当备用机太可惜实际上,在市场的这个阶段,还有许多值得一开始的备用机器。例如,我今天想介绍给您的那台仅售1,099元,但它具有非常豪华的配置,例如5000毫米。安的电池,7。12英寸的屏幕等,不仅
学生党怎么买手机?这三款价格不到2K,公认高配低价随着大多数学生聚会返回家园,对新一轮手机更换的需求再次上升。面对学生群体的预算有限,但手机的整体性能要求很高,其中手机是学生聚会,家长对此非常关注。以下三种型号均为价格低廉但总体性
游戏本行业开始变天,30系显卡产品已经上市2020年是命运多舛的一年,不仅整个世界都出现了混乱,笔记本电脑行业也产生了些许动荡。因为疫情的缘故,本来被称为夕阳产业的笔记本行业迎来了一次难得的回暖,再加上20系显卡和AMD锐
曾经的顶级旗舰,价格降至3000,每一款都值得入手小米10作为去年小米高端影响力的代表作,小米10系列的确给小米带来了极好的市场回馈。小米10拥有6。67英寸曲面挖孔屏设计,支持90hz屏幕刷新率和180hz采样率。具有良好的外观
适合通勤的真无线耳机,佩戴无压力,平价首选击音VC运动果这个打击风投是联想投资的高端视听品牌。作为新一代互联网耳机的品牌代表,专注于年轻人和文艺青年的聆听体验,在真正无线主动降噪蓝牙音频转换手势聆听体验等各个领域拥有领先的
总是会忍不住冲动得买买买前几天看公众号文章,看到里面推荐了一个可以煮粥烧水等还有很多作用的壶,于是趁着上面说的正在搞活动,就买了一个回来。这个壶放在房间里已经好几天了,今天打算拿出来用,看说明书,发现煮粥
点了一个新操作,淘宝评价按时间排序春日茶话会最近天天宅在家的时间很多,发现外面的车流声喇叭声声音很大,而且一直存在,响个不停,于是想买一个隔音耳罩。去淘宝上搜,点进了一个很多人付款的商品,发现是天猫榜单入选专业防护
好看不是第一位,方便才是第一位打卡美好生活有人给我说你画点妆好看,留长发好看。但这句话我只是听听,并不会像她说的这样做。对说话的这个人来说,她只需要动动嘴,轻轻松松这句话就出来了。可如果我按照这句话来做了,我就
决策参考马云位居福布斯内地第一富豪字节跳动招募电商服务商1鸥翎投资80亿美元要约收购58同城事件4月2日晚间,多家媒体报道称,58同城董事会宣布收到鸥翎投资发出的一份不具约束力的收购要约,以每股A类或B类普通股27。50美元现金,或55
决策参考罗永浩与抖音正式签约蚂蚁金服新成立信用评估公司1罗永浩与抖音正式签约事件36氪从多位消息人士处获悉,罗永浩已经确定和抖音直播独家签约,在抖音开启直播带货。在抖音搜索罗永浩,可以看到一个认证信息为交个朋友科技首席推荐官的罗永浩账
决策参考SpaceX首次载人飞行发射成功美团市值破千亿美元1SpaceX首次载人飞行发射成功飞往国际空间站事件5月31日,据国外媒体报道,特斯拉CEO埃隆马斯克旗下太空探索技术公司SpaceX今日首次发射载人龙飞船,成功地将两名美国宇航员