前言 嗨喽!大家好呀,这里是魔王一、项目背景 通过扫描零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。二、数据来源 链接三、提出问题消费情况分析及用户购买模式分析RFM和CLV分析不同类别商品关联规则挖掘四、理解数据Date:购买日期CustomerID:用户IDTransactionID:交易IDSKUCategory:商品分类SKU编码SKU:商品唯一SKU编码Quantity:购买数量SalesAmount:购买金额五、数据清洗1。导入数据importnumpyasnpimportpandasaspdfrommatplotlibimportpyplotaspltimportseabornassnsmatplotlibinline更改设计风格plt。style。use(ggplot)plt。rcParams〔font。sansserif〕〔SimHei〕np。versionpd。versiondfpd。readcsv(scannerdata。csv)df。head()df。info()2。选择子集第一列为数据编号,已有索引故删除df。drop(columnsUnnamed:0,inplaceTrue)df。info()3。删除重复值godf。duplicated()。sum() 数据无重复值4。缺失值处理df。isnull()。sum() 数据无缺失值5。标准化处理df。dtypesDate为对象类型,需要标准化为日期类型格式df。Datepd。todatetime(df。Date,formatdmY)df。dtypes6。异常值处理df〔〔Quantity,SalesAmount〕〕。describe() 购买数量存在小于1是由于称重单位不足1所致,非异常值六、分析内容1。消费情况按月分析 (1)每月消费总金额趋势分析df〔Month〕df。Date。astype(datetime64〔M〕)df。head()groupedmonthdf。groupby(Month)groupedmonth。SalesAmount。sum()2018年1月数据可能统计不全,不纳入趋势分析groupedmonth。SalesAmount。sum()。head(12)。plot()由上图可知:消费金额波动较大,其中第一季度保持持续上升,后续波动较大,整体呈上升趋势 (2)每月交易次数趋势分析groupedmonth。TransactionID。nunique()。head(12)。plot()由上图可知:交易次数波动较大,前期呈上升趋势,五月之后交易次数开始下降,在八月降至最低值,后续开始波动回升,在十二月份重回峰值 (3)每月商品购买数量趋势分析groupedmonth。Quantity。sum()。head(12)。plot()由上图可知:商品购买数量波动较大,整体趋势同交易次数保持一致 (4)每月消费人数趋势分析groupedmonth。CustomerID。nunique()。head(12)。plot()由上图可知:每月购买人数可分简单为三个阶段,15月呈持续上升趋势,68呈持续下降趋势,912月呈波动上升趋势2。用户分布分析 (1)新用户分布groupedcustomerdf。groupby(CustomerID)groupedcustomer。Date。min()。valuecounts()。plot()由上图可知:新用户获取不稳定,波动较大,整体有略微下降趋势groupedcustomer。Month。min()。valuecounts()。plot()由上图可知:按月统计,每月新用户用户数有明显下降趋势。说明新用户获取呈大幅下降趋势,需要引起注意,适当增加营销活动提升新用户的获取 (2)一次消费及多次消费用户占比分析仅消费一次用户占比(groupedcustomer。TransactionID。nunique()1)。sum()df。CustomerID。nunique()由计算得:存在一半的用户只进行了一次消费groupedmonthcustomerdf。groupby(〔Month,CustomerID〕)每个用户每月的第一次购买时间datamonthmindategroupedmonthcustomer。Date。min()。resetindex()每个用户的第一次购买时间datamindategroupedcustomer。Date。min()。resetindex()通过CustomerID联立两表mergeddatepd。merge(datamonthmindate,datamindate,onCustomerID)mergeddate。head()Datex等于Datey则为每月新用户((mergeddate。query(DatexDatey))。groupby(Month)。CustomerID。count()mergeddate。groupby(Month)。CustomerID。count())。plot()由上图可知:每月新用户占比整体呈下降趋势,结合每月消费人数趋势可知,第四季度消费人数有上升趋势,故期间复购人数有所提升3。用户分层分析 (1)RFM分层分析pivotrfmdf。pivottable(indexCustomerID,values〔Date,TransactionID,SalesAmount〕,aggfunc{Date:max,TransactionID:nunique,SalesAmount:sum})pivotrfm〔R〕(pivotrfm。Date。max()pivotrfm。Date)np。timedelta64(1,D)pivotrfm。rename(columns{TransactionID:F,SalesAmount:M},inplaceTrue)deflabelfunc(data):labeldata。apply(lambdax:1ifx0else0)labellabel。Rlabel。Flabel。Mlabels{111:重要价值客户,011:重要保持客户,101:重要发展客户,001:重要挽留客户,110:一般价值客户,010:一般保持客户,100:一般发展客户,000:一般挽留客户}returnlabels〔label〕pivotrfm〔label〕pivotrfm〔〔R,F,M〕〕。apply(lambdax:xx。mean())。apply(labelfunc,axis1)pivotrfm。label。valuecounts()。plot。barh()pivotrfm。groupby(label)。M。sum()。plot。pie(figsize(6,6),autopct3。2f)pivotrfm。groupby(label)。agg(〔sum,count〕) 由上表及图可知:销售额主要来源重要保持客户,人数占比最高的为一般发展客户重要保持客户:销售额的主要来源,近期有消费,且消费高,消费频率不足,可以适当举行营销活动,提升此层客户的购买频率重要价值客户:销售额的第二来源,近期有消费,消费高,频率高,尽可能使该层客户保持现状重要发展客户:消费以及消费频次高,近期没有消费,可以使用适当策略召回用户,参与消费重要挽留客户:消费高,但频次低且近期未消费,处在流失的边缘,可以通过适当活动,使其参与到消费中来,防止流失一般价值客户:消费低,消费频率高且近期有消费,可以使用优惠券等形式活动刺激该层客户的消费,提升其消费额一般发展客户:人数占比最高,近期有消费,但消费额以及消费频次不高,考虑到人数占比高,可以适当举办活动提升消费频次和消费额一般保持客户:在成本与资源控制下,酌情考虑一般挽留客户:在成本与资源控制下,酌情考虑 (2)用户状态分层分析pivotedstatusdf。pivottable(indexCustomerID,columnsMonth,valuesDate,aggfunccount)。fillna(0)defactivestatus(data):status〔〕foriinrange(len(data)):若本月没有消费ifdata〔i〕0:iflen(status)0:ifstatus〔i1〕unreg:status。append(unreg)else:status。append(unactive)else:status。append(unreg)若本月有消费else:iflen(status)0:ifstatus〔i1〕unreg:status。append(new)elifstatus〔i1〕unactive:status。append(return)else:status。append(active)else:status。append(new)statuspd。Series(status,indexdata。index)returnstatusactivestatuspivotedstatus。apply(activestatus,axis1)activestatus。replace(unreg,np。nan)。apply(lambdax:x。valuecounts())。fillna(0)。T。apply(lambdax:xx。sum(),axis1)。plot。area() 由上图可知:新用户:新用户占比呈明显下降趋势,说明拉新运营不足活跃用户:在二月占比达到最高,后续呈缓慢下降趋势,说明消费运营正在下滑不活跃用户:不活跃用户呈明显上升趋势,客户流失较为明显回流客户:有缓慢上升趋势,说明召回运营不错4。用户生命周期分析 (1)用户生命周期分布构成用户生命周期研究的数据样本需要消费次数2次的用户clv(groupedcustomer〔〔SalesAmount〕〕。sum())〔groupedcustomer。TransactionID。nunique()1〕clv〔lifetime〕(groupedcustomer。Date。max()groupedcustomer。Date。min())np。timedelta64(1,D)clv。describe()由上表可知:消费一次以上的用户平均生命周期为116天,用户生命周期内平均消费金额为121。47元clv〔lifetime〕。plot。hist(bins50) 由上图可知:生命周期在090天内的用户较多,说明生命周期短的客户占比较高,90天内流失率较高,此部分用户可以作为运营重点,延长这些用户的生命周期;生命周期在90250之间的分布较为均匀,这也是大多数用户的生命周期,可以刺激这些用户的消费,使其在生命周期内提升消费金额;生命周期大于250天的人数极少,说明生命周期较长的忠诚客户占比不高。 (2)用户生命周期价值分布clv〔SalesAmount〕。plot。hist(bins50) 由上图可知:绝大部分用户生命周期内价值在500以内,且其中大部分在100以内,存在较大极值拉高均值,数据向右偏斜。 (3)用户生命周期及其价值相关关系plt。scatter(xlifetime,ySalesAmount,dataclv) 由上图可知:用户生命周期与其期间客户价值不存在线性关系,当生命周期在300天内,部分生命周期较长用户贡献的价值高于生命周期较短的用户;当生命周期大于300天,存在部分用户贡献价值较少,由于数据量不足等原因,结果仅供参考5。回购率与复购率分析 (1)复购率分析groupedmonthcustomercustomermonthagaingroupedmonthcustomer。nunique()customermonthagain每月消费次数大于1的用户数customermonthagaingroupedmonthcustomer。nunique()。query(TransactionID1)。resetindex()。groupby(Month)。count()。CustomerIDcustomermonthagain每月消费用户数customermonthgroupedmonth。CustomerID。nunique()每月复购率(customermonthagaincustomermonth)。plot()customermonth(customermonthagaincustomermonth)由上图可知:复购率在25上下浮动,说明每月有25的用户会进行多次消费;前三个月的复购率有所下降,后续有所回升,整体有上升趋势,应结合本身商务模式,决定进一步提升复购率还是注重新用户的获取。最后一月由于数据量不足,结果以真实数据为主。 (2)回购率分析1表示前90天消费且本月回购0表示前90天消费本月未回购nan表示前90天未消费defbuyback(data):status〔np。nan,np。nan,np。nan〕foriinrange(3,len(data)):本月购买ifdata〔i〕1:前90天购买if(data〔i1〕1ordata〔i2〕1ordata〔i3〕1):status。append(1)前90天未购买else:status。append(np。nan)本月未购买else:前90天购买if(data〔i1〕1ordata〔i2〕1ordata〔i3〕1):status。append(0)前90天未购买else:status。append(np。nan)statuspd。Series(status,indexdata。index)returnstatusbackstatuspivotedstatus。apply(buyback,axis1)backstatus。head()(backstatus。sum()backstatus。count())。plot()由上图可知:90天内回购率,即90天内重复购买率在10以下,说明目前商店处于用户获取模式,然而由前面分析可知,新用户获取呈下降趋势,目前商店并不健康,当前阶段应当将重心放在新用户获取上,6。商品关联规则挖掘 (1)分析热销商品取出销量排名前10的商品类型hotcategorydf。groupby(SKUCategory)。count()。SalesAmount。sortvalues(ascendingFalse)〔:10〕。resetindex()plt。barh(hotcategory。SKUCategory,hotcategory。SalesAmount)热销商品占比hotcategory〔percent〕hotcategory。SalesAmount。apply(lambdax:xhotcategory。SalesAmount。sum())plt。figure(figsize(6,6))plt。pie(hotcategory。percent,labelshotcategory。SKUCategory,autopct1。2f)plt。show()categorylistdf。groupby(TransactionID)。SKUCategory。apply(list)。values。tolist()fromapyoriimportaprioriminsupportvalue0。02minconfidencevalue0。3resultlist(apriori(transactionscategorylist,minsupportminsupportvalue,minconfidenceminconfidencevalue,minleft0))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尾语 好了,我的这篇文章写到这里就结束啦! 有更多建议或问题可以评论区或私信我哦!一起加油努力叭() 喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!