慢慢来建站公司无锡网站制作系统
- 作者: 五速梦信息网
- 时间: 2026年04月20日 10:27
当前位置: 首页 > 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:
相关文章
-
慢查询 wordpress自助建站网站seo公司
慢查询 wordpress自助建站网站seo公司
- 技术栈
- 2026年04月20日
-
漫画网站开发源码株洲sem优化哪家好
漫画网站开发源码株洲sem优化哪家好
- 技术栈
- 2026年04月20日
-
满亦工作室 网站建设深圳做网站哪里最好
满亦工作室 网站建设深圳做网站哪里最好
- 技术栈
- 2026年04月20日
-
锚文本外链查询网站一套完整的app 开发流程
锚文本外链查询网站一套完整的app 开发流程
- 技术栈
- 2026年04月20日
-
锚文本外链网站wordpress如何添加友链
锚文本外链网站wordpress如何添加友链
- 技术栈
- 2026年04月20日
-
茂名h5网站建设电商网站推广怎么做
茂名h5网站建设电商网站推广怎么做
- 技术栈
- 2026年04月20日
