慢慢来建站公司无锡网站制作系统

当前位置: 首页 > news >正文

慢慢来建站公司,无锡网站制作系统,环球影城客户电话,中国建设部网站官网文章目录 数据分析之用户购买记录分析第一部分#xff1a;数据类型处理数据加载观察数据查看数据的数据类型数据中是否存储在缺失值将order_dt转换成时间类型查看数据的统计描述计算所有用户购买商品的平均数量计算所有用户购买商品的平均花费 在源数据中添加一列表示月份:ast… 文章目录 数据分析之用户购买记录分析第一部分数据类型处理数据加载观察数据查看数据的数据类型数据中是否存储在缺失值将order_dt转换成时间类型查看数据的统计描述计算所有用户购买商品的平均数量计算所有用户购买商品的平均花费 在源数据中添加一列表示月份:astype(datetime64[M]) 第二部分按月数据分析用户每月花费的总金额并绘制曲线图展示所有用户每月的产品购买量所有用户每月的消费总次数(原始数据中的一行数据表示一次消费记录)统计每月的消费人数 第三部分用户个体消费数据分析用户消费总金额和消费总次数的统计描述用户消费金额和消费产品数量的散点图各个用户消费总金额的直方分布图(消费金额在1000之内的分布)各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布) 第四部分用户消费行为分析用户第一次消费的月份分布和人数统计并绘制线型图用户最后一次消费的时间分布和人数统计并绘制线型图新老客户的占比用户分层分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm 第五部分用户的生命周期统计每个用户每个月的消费次数统计每个用户每个月是否消费消费记录为1否则记录为0将用户按照每一个月份分级每月【不同活跃】用户的计数 数据分析之用户购买记录分析 基础支撑(我的另外两篇博客) 数据分析三剑客之Pandas数据分析之Pandas高级操作 本期知识点补漏 v a l u e _ c o u n t s ( ) 函数的使用 \color{red}value_counts()函数的使用 value_counts()函数的使用,值变为索引而其值出现的次数变为值。 value_counts()的两种使用方式 series对象.value_counts() 返回seriespd.value_counts(series对象) 返回series a s t y p e ( ) 进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换 . \color{red}astype()进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换. astype()进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换. n u n i q u e ( ) 表示统计去重后的个数 \color{red}nunique()表示统计去重后的个数 nunique()表示统计去重后的个数 q u e r y 函数的使用 , 对 d f 进行过滤 \color{red}query函数的使用,对df进行过滤 query函数的使用,对df进行过滤 a g g 对分组后的结果进行多种指定聚合 \color{red}agg对分组后的结果进行多种指定聚合 agg对分组后的结果进行多种指定聚合 n p . t i m e d e l t a 64 ( 1 , ′ D ′ ) \color{red}np.timedelta64(1,D) np.timedelta64(1,′D′) 重点 d f . a p p l y ( f u n c ) : 可以对 d f 中的行或者列进行某种 f u n c 形式的运算没 a x i s 默认为列 \color{red}重点df.apply(func):可以对df中的行或者列进行某种func形式的运算没axis默认为列 重点df.apply(func):可以对df中的行或者列进行某种func形式的运算没axis默认为列 r f m . a p p l y ( l a m b d a x : x − x . m e a n ( ) ) , x 代表每一列对 d f 的每一列进行操作 \color{red}rfm.apply(lambda\quad x : x - x.mean()), x代表每一列对df的每一列进行操作 rfm.apply(lambdax:x−x.mean()),x代表每一列对df的每一列进行操作 a p p l y ( r f m _ f u n c , a x i s 1 ) , r f m _ f u n c ( x ) , x 代表每一行类型为 S e r i e s \color{red}apply(rfm_func,axis 1),rfm_func(x),x代表每一行类型为Series apply(rfm_func,axis1),rfm_func(x),x代表每一行类型为Series 首先准备好数据源文件名为CDNOW_master.txt,打开此文件样貌如下图 字段含义 user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额 数据如右
第一部分数据类型处理 数据加载 #数据的加载 注意源文件中有多个不同个数的空格作为分割 df pd.read_csv(../data/CDNOW_master.txt,headerNone,sep\s,names[user_id,order_dt,order_product,order_amount]) df输出如下
观察数据 查看数据的数据类型 df.info()out: class pandas.core.frame.DataFrame RangeIndex: 69659 entries, 0 to 69658 Data columns (total 4 columns):# Column Non-Null Count Dtype
— —— ————– —– 0 user_id 69659 non-null int64 1 order_dt 69659 non-null int64 2 order_product 69659 non-null int64 3 order_amount 69659 non-null float64 dtypes: float64(1), int64(3) memory usage: 2.1 MB数据中是否存储在缺失值 我们经过上方df.info()发现并无缺失值的因为总共69659条数据,而每一列都有65659条数据 将order_dt转换成时间类型 df[order_dt] pd.to_datetime(df[order_dt],format%Y%m%d)查看数据的统计描述 df.describe()out: user_id order_product order_amount count 69659.000000 69659.000000 69659.000000 mean 11470.854592 2.410040 35.893648 std 6819.904848 2.333924 36.281942 min 1.000000 1.000000 0.000000 25% 5506.000000 1.000000 14.490000 50% 11410.000000 2.000000 25.980000 75% 17273.000000 3.000000 43.700000 max 23570.000000 99.000000 1286.010000计算所有用户购买商品的平均数量 由上方df.describe()可知平均数量为2.410040 计算所有用户购买商品的平均花费 由上方df.describe()可知平均花费为35.893648 在源数据中添加一列表示月份:astype(‘datetime64[M]’) a s t y p e ( ) 进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换 . \color{red}astype()进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换. astype()进行类型转换的时候时常会遇见类型转换失败我们可以先转换成字符串类型再进行相应的类型转换. df[month] df[order_dt].astype(str).astype(datetime64[M]) df.head()out: user_id order_dt order_product order_amount month 0 1 1997-01-01 1 11.77 1997-01-01 1 2 1997-01-12 1 12.00 1997-01-01 2 2 1997-01-12 5 77.00 1997-01-01 3 3 1997-01-02 2 20.76 1997-01-01 4 3 1997-03-30 2 20.76 1997-03-01第二部分按月数据分析 用户每月花费的总金额并绘制曲线图展示 df.groupby(bymonth)[order_amount].sum()out: month 1997-01-01 299060.17 1997-02-01 379590.03 1997-03-01 393155.27 1997-04-01 142824.49 1997-05-01 107933.30 1997-06-01 108395.87 1997-07-01 122078.88 1997-08-01 88367.69 1997-09-01 81948.80 1997-10-01 89780.77 1997-11-01 115448.64 1997-12-01 95577.35 1998-01-01 76756.78 1998-02-01 77096.96 1998-03-01 108970.15 1998-04-01 66231.52 1998-05-01 70989.66 1998-06-01 76109.30 Name: order_amount, dtype: float64绘制曲线图 df.groupby(bymonth)[order_amount].sum().plot()out: 所有用户每月的产品购买量 df.groupby(bymonth)[order_product].sum()out: month 1997-01-01 19416 1997-02-01 24921 1997-03-01 26159 1997-04-01 9729 1997-05-01 7275 1997-06-01 7301 1997-07-01 8131 1997-08-01 5851 1997-09-01 5729 1997-10-01 6203 1997-11-01 7812 1997-12-01 6418 1998-01-01 5278 1998-02-01 5340 1998-03-01 7431 1998-04-01 4697 1998-05-01 4903 1998-06-01 5287 Name: order_product, dtype: int64所有用户每月的消费总次数(原始数据中的一行数据表示一次消费记录) df.groupby(bymonth)[user_id].count()out: month 1997-01-01 8928 1997-02-01 11272 1997-03-01 11598 1997-04-01 3781 1997-05-01 2895 1997-06-01 3054 1997-07-01 2942 1997-08-01 2320 1997-09-01 2296 1997-10-01 2562 1997-11-01 2750 1997-12-01 2504 1998-01-01 2032 1998-02-01 2026 1998-03-01 2793 1998-04-01 1878 1998-05-01 1985 1998-06-01 2043 Name: user_id, dtype: int64统计每月的消费人数 n u n i q u e ( ) 表示统计去重后的个数 \color{red}nunique()表示统计去重后的个数 nunique()表示统计去重后的个数 df.groupby(bymonth)[user_id].nunique()out: month 1997-01-01 7846 1997-02-01 9633 1997-03-01 9524 1997-04-01 2822 1997-05-01 2214 1997-06-01 2339 1997-07-01 2180 1997-08-01 1772 1997-09-01 1739 1997-10-01 1839 1997-11-01 2028 1997-12-01 1864 1998-01-01 1537 1998-02-01 1551 1998-03-01 2060 1998-04-01 1437 1998-05-01 1488 1998-06-01 1506 Name: user_id, dtype: int64第三部分用户个体消费数据分析 用户消费总金额和消费总次数的统计描述 用户消费总金额 df.groupby(byuser_id)[order_amount].sum() #每一个用户消费的总金额out: user_id 1 11.77 2 89.00 3 156.46 4 100.50 5 385.61…
23566 36.00 23567 20.97 23568 121.70 23569 25.74 23570 94.08 Name: order_amount, Length: 23570, dtype: float64消费总次数 #每一个用户消费的总次数 df.groupby(byuser_id)[order_dt].count() df.groupby(byuser_id).count()[order_dt]out: user_id 1 1 2 2 3 6 4 4 5 11.. 23566 1 23567 1 23568 3 23569 1 23570 2 Name: order_dt, Length: 23570, dtype: int64用户消费金额和消费产品数量的散点图 user_amount_sum df.groupby(byuser_id)[order_amount].sum() user_product_sum df.groupby(byuser_id)[order_product].sum() plt.scatter(user_product_sum,user_amount_sum)out: 各个用户消费总金额的直方分布图(消费金额在1000之内的分布) q u e r y 函数的使用 \color{red}query函数的使用 query函数的使用 df.groupby(byuser_id).sum().query(order_amount 1000)[order_amount]out: user_id 1 11.77 2 89.00 3 156.46 4 100.50 5 385.61…
23566 36.00 23567 20.97 23568 121.70 23569 25.74 23570 94.08 Name: order_amount, Length: 23370, dtype: float64直方图 df.groupby(byuser_id).sum().query(order_amount 1000)[order_amount].hist()out: 各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布) df.groupby(byuser_id).sum().query(order_product 100)[order_product].hist()out: 第四部分用户消费行为分析 用户第一次消费的月份分布和人数统计并绘制线型图 v a l u e _ c o u n t s ( ) 函数的使用 \color{red}value_counts()函数的使用 value_counts()函数的使用,值变为索引而其值出现的次数变为值。 df.groupby(byuser_id)[month].min()out: user_id 1 1997-01-01 2 1997-01-01 3 1997-01-01 4 1997-01-01 5 1997-01-01…
23566 1997-03-01 23567 1997-03-01 23568 1997-03-01 23569 1997-03-01 23570 1997-03-01 Name: month, Length: 23570, dtype: datetime64[ns]df.groupby(byuser_id)[month].min().value_counts() #人数的统计out: 1997-02-01 8476 1997-01-01 7846 1997-03-01 7248 Name: month, dtype: int64df.groupby(byuser_id)[month].min().value_counts().plot()out: 用户最后一次消费的时间分布和人数统计并绘制线型图 与上方类似,只不过min()改为max() df.groupby(byuser_id)[month].max().value_counts().plot()out: 新老客户的占比 消费一次为新用户消费多次为老用户 分析出每一个用户的第一个消费和最后一次消费的时间 agg([func1,func2]):对分组后的结果进行指定聚合 分析出新老客户的消费比例 a g g 对分组后的结果进行多种指定聚合 \color{red}agg对分组后的结果进行多种指定聚合 agg对分组后的结果进行多种指定聚合 new_old_user_df df.groupby(byuser_id)[order_dt].agg([min,max]) new_old_user_dfout: min max user_id 1 1997-01-01 1997-01-01 2 1997-01-12 1997-01-12 3 1997-01-02 1998-05-28 4 1997-01-01 1997-12-12 5 1997-01-01 1998-01-03 … … … 23566 1997-03-25 1997-03-25 23567 1997-03-25 1997-03-25 23568 1997-03-25 1997-04-22 23569 1997-03-25 1997-03-25 23570 1997-03-25 1997-03-26 23570 rows × 2 columns(new_old_user_df[min] new_old_user_df[max]).value_counts()out: True 12054 False 11516 dtype: int64由此观之 新用户为12054老用户为11516 用户分层 RFM模型设计 R表示客户最近一次交易时间的间隔。 /np.timedelta64(1,‘D’)去除days F表示客户购买商品的总数量,F值越大表示客户交易越频繁反之则表示客户交易不够活跃。M表示客户交易的金额。M值越大表示客户价值越高反之则表示客户价值越低。将RFM作用到rfm表中 根据价值分层将用户分为 重要价值客户重要保持客户重要挽留客户重要发展客户一般价值客户一般保持客户一般挽留客户一般发展客户 使用已有的分层模型即可rfm_func
分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm rfm df.pivot_table(indexuser_id,aggfunc{order_product:sum,order_amount:sum,order_dt:max}) rfmout: order_amount order_dt order_product user_id 1 11.77 1997-01-01 1 2 89.00 1997-01-12 6 3 156.46 1998-05-28 16 4 100.50 1997-12-12 7 5 385.61 1998-01-03 29 … … … … 23566 36.00 1997-03-25 2 23567 20.97 1997-03-25 1 23568 121.70 1997-04-22 6 23569 25.74 1997-03-25 2 23570 94.08 1997-03-26 5 23570 rows × 3 columnsR表示客户最近一次交易时间的间隔 我们将最后一次的消费记录时间作为今天日期 max_dt df[order_dt].max() #今天的日期用今天时间减去用户最后一次消费的时间就是时间间隔 rfm[R] -(df.groupby(byuser_id)[order_dt].max() - max_dt)/np.timedelta64(1,D) rfmout: n p . t i m e d e l t a 64 ( 1 , ′ D ′ ) \color{red}np.timedelta64(1,D) np.timedelta64(1,′D′)用于清除days不然R的数据都会有days order_amount order_dt order_product R user_id #/np.timedelta64(1,D)的效果就是去除了days,并且使其变成了float类型。 1 11.77 1997-01-01 1 545.0(days) 2 89.00 1997-01-12 6 534.0 3 156.46 1998-05-28 16 33.0 4 100.50 1997-12-12 7 200.0 5 385.61 1998-01-03 29 178.0 … … … … … 23566 36.00 1997-03-25 2 462.0 23567 20.97 1997-03-25 1 462.0 23568 121.70 1997-04-22 6 434.0 23569 25.74 1997-03-25 2 462.0 23570 94.08 1997-03-26 5 461.0 23570 rows × 4 columns此时我们将order_dt从rfm表中删除 rfm.drop(labelsorder_dt,axis1,inplaceTrue)剩下的三列数据就是M,F,R了 rfm.columns [M,F,R] rfm.head()out: M F R user_id 1 11.77 1 545.0 2 89.00 6 534.0 3 156.46 16 33.0 4 100.50 7 200.0 5 385.61 29 178.0根据R,F,M生成lable列 def rfm_func(x):#存储存储的是三个字符串形式的0或者1level x.map(lambda x :1 if x 0 else 0)label level.R level.F level.Md {111:重要价值客户,011:重要保持客户,101:重要挽留客户,001:重要发展客户,110:一般价值客户,010:一般保持客户,100:一般挽留客户,000:一般发展客户}result d[label]return result #df.apply(func):可以对df中的行或者列进行某种func形式的运算 rfm[label] rfm.apply(lambda x : x - x.mean()).apply(rfm_func,axis 1) rfm.head()out: M F R label user_id 1 11.77 1 545.0 一般挽留客户 2 89.00 6 534.0 一般挽留客户 3 156.46 16 33.0 重要保持客户 4 100.50 7 200.0 一般发展客户 5 385.61 29 178.0 重要保持客户重点 d f . a p p l y ( f u n c ) : 可以对 d f 中的行或者列进行某种 f u n c 形式的运算没 a x i s 默认为列 \color{red}重点df.apply(func):可以对df中的行或者列进行某种func形式的运算没axis默认为列 重点df.apply(func):可以对df中的行或者列进行某种func形式的运算没axis默认为列 r f m . a p p l y ( l a m b d a x : x − x . m e a n ( ) ) x 代表列对 d f 的每一列进行操作 \color{red}rfm.apply(lambda\quad x : x - x.mean()) x代表列对df的每一列进行操作 rfm.apply(lambdax:x−x.mean())x代表列对df的每一列进行操作 a p p l y ( r f m _ f u n c , a x i s 1 ) , r f m _ f u n c ( x ) , x 代表每一行类型为 S e r i e s \color{red}apply(rfm_func,axis 1),rfm_func(x),x代表每一行类型为Series apply(rfm_func,axis1),rfm_func(x),x代表每一行类型为Series 第五部分用户的生命周期 将用户划分为活跃用户和其他用户 统计每个用户每个月的消费次数 user_month_count_df df.pivot_table(indexuser_id,valuesorder_dt,aggfunccount,columnsmonth).fillna(0) user_month_count_df.head()out: 统计每个用户每个月是否消费消费记录为1否则记录为0 知识点DataFrame的apply和applymap的区别 applymap:返回df 将函数做用于DataFrame中的所有元素(elements) apply:返回Series apply()将一个函数作用于DataFrame中的每个行或者列 df_purchase user_month_count_df.applymap(lambda x:1 if x 1 else 0) df_purchase.head()out: 将用户按照每一个月份分级 unreg:观望用户前两月没买第三个月才第一次买,则用户前两个月为观望用户unactive:首月购买后后序月份没有购买则在没有购买的月份中该用户的为非活跃用户new:当前月就进行首次购买的用户在当前月为新用户active:连续月份购买的用户在这些月中为活跃用户return:购买之后间隔n月再次购买的第一个月份为该月份的回头客 #将df_purchase中的原始数据0和1修改为newunactive……,返回新的df叫做df_purchase_new #固定算法 def active_status(data):status []#某个用户每一个月的活跃度for i in range(18):#若本月没有消费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 statuspivoted_status df_purchase.apply(active_status,axis 1) pivoted_status.head()上方利用apply对行进行操作每行返回一个列表故out如下 user_id 1 [new, unactive, unactive, unactive, unactive, … 2 [new, unactive, unactive, unactive, unactive, … 3 [new, unactive, return, active, unactive, unac… 4 [new, unactive, unactive, unactive, unactive, … 5 [new, active, unactive, return, active, active… dtype: object利用上方列表创建一个新的dateframe即可 df_purchase_new DataFrame(datapivoted_status.values.tolist(),indexdf_purchase.index,columnsdf_purchase.columns) df_purchase_newout: 每月【不同活跃】用户的计数 purchase_status_ct df_purchase_new.apply(lambda x : pd.value_counts(x)).fillna(0) series对象.value_counts() 返回seriespd.value_counts(series对象) 返回series 转置进行最终结果的查看 首先对每列进行统计个数,apply函数一次对每列进行操作 purchase_status_ct df_purchase_new.apply(lambda x : pd.value_counts(x)).fillna(0) purchase_status_ctout: 转置 purchase_status_ct.Tout: