版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电商app⽤户⾏为分析(含全过程python代码)⼀、分析背景对于很多互联⽹公司来说,流量和⽤户价值都是核⼼问题。根据产品⽣命周期理论,在产品发布初期,更多的关注点应该放在拉新上,只有⾜够的⽤户量级才能为公司提供发展的不竭动⼒,初期对流量和市场份额的竞争,很⼤程度上决定了后期的⾏业格局。所以回顾滴滴和优步、美团和饿了么的烧钱⼤战,正是对“流量为王”这⼀理论的践⾏。但是流量进来之后呢?⼀个较为成熟的产品(如淘宝、滴滴、美团等)应该思考的更多,产品经理⼈和数据分析师⼀定要好奇⽤户进来之后⼲了什么,产⽣了什么价值。基于此,才能对产品进⾏优化,使其更加符合⽤户的⾏为习惯。所以,⽤户⾏为分析就⼗分必要。在这⾥以来⾃天池的淘宝⽤户⾏为数据为基础进⾏数据分析⼯作,。⼆、明确需求进⾏数据分析的第⼀步就是明确需求,知道为什么要分析,或者说要解决什么问题/疑惑。在提出分析⽬标之前可以先了解⼀下数据,脱离数据提需求是空中楼阁,脱离需求分析数据是⽆头苍蝇。可以从数据介绍中看到,(1)数据有5个字段,分别是⽤户ID,商品ID,商品类⽬ID,⾏为类型,时间戳。(2)⾏为类型有4种,浏览、购买、加购物车、收藏。(3)时间跨度是9天。根据数据的介绍我们可以提出以下分析⽬标:1.数据总体情况,pv,uv,付费⽤户数,复购率等2.变化趋势:流量随天、时间的变化趋势,以及在⼀周之内的变化趋势3.⽤户⾏为的转化漏⽃4.基于⽤户、商品细分的转化率需要注意的是这⾥只是根据已知的数据结构提出的⽬标和需求,能不能得出有价值、有启发意义的结论,还需要根据分析结果来确定。三、数据处理(⼀)遇到的坑拿到数据之后,笔者⾼⾼兴兴的⽤Anaconda的Spyder打开导⼊数据,想先简单看看数据,再进⾏清洗和分析。数据导⼊倒是没有遇到太⼤的问题:importpandasaspdimportdatetimestart_time=datetime.datetime.now()user_data=pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\UserBehavior.csv',header=None)end_time=datetime.datetime.now()print(f'导⼊数据耗时:{end_time-start_time}s')笔者明显能感觉到导⼊数据耗时过长,⼼⾥着实有点奇怪,特地查看了以下导⼊数据花费的时间,输出结果显⽰---->导⼊数据耗时:0:01:20.114552s。花了1分20秒才读完数据,我当时就有点郁闷,区区百万级别的数据怎么会这么慢?⼿动挠头。但是我也没多想,继续往下搞吧!浏览前⼏⾏user_data.head(10)先给数据加列名,⽅便后续处理:user_data.columns=['user_id','item_id','category_id','behavior','time_stamp']user_data.head(5)基本的处理之后,可以考虑开始进⾏数据清洗了,其实本数据都是来源于淘宝后台的数据,并⾮由⼈为填写的,所以遇到数据还是⾮常⼲净的,谨慎起见,可以对空值检查⼀下,笔者习惯使⽤:user_()或许是由于数据量较⼤,所以都没有显⽰每个字段的⾮空记录有多少⾏。(汗,笔者到现在都还以为只有百万⾏数据,眼⾓膜可以捐了……)由于没有得到⾮空数值分布情况,所以笔者只能选择下⾯的⽅法:user_data['user_id'].notnull().value_counts()user_data['tiem_id'].notnull().value_counts()user_data['category_id'].notnull().value_counts()user_data['behavior'].notnull().value_counts()user_data['time_stamp'].notnull().value_counts()从结果发现,没有空值,数据⾮常⼲净。由于要进⾏⽇期、时间的分析,所以⾃然要把时间戳格式转化为正常的⽇期时间格式。简单科普⼀下,时间戳:格林威治时间⾃1970年1⽉1⽇(00:00:00)⾄当前时间的总秒数,也就是北京时间1970年1⽉1⽇(08:00:00)⾄当前时间的总秒数。可以⽤**time.localtime()**⽅法转化为对应的东⼋区北京时间,但是由于time.localtime()括号⾥⾯必须加⼀个具体的时间戳,如1585385176(笔者写到此处的时间戳):mporttimetime.localtime(1585385176)由于笔者是要把user_data[‘time_stamp’]这⼀整列转化,所以不能简单使⽤time.localtime()这个⽅法,需要⼩⼩变形:user_data['date_time']=user_data['time_stamp'].apply(lambdax:time.localtime(x))结果⼀运⾏,电脑在嗡嗡响了⼀阵后,程序直接报错:笔者不死⼼连续运⾏好⼏次,最后电脑直接当场退役,领盒饭了(⿊屏了),我只能⼿动重启。为了解惑我只能询问度娘,“好⼼⼈”告诉我是因为数据量太⼤,电脑内存不⾜,所以产⽣这个问题。为了解决这个问题,我尝试了各种⽅法,“好⼼⼈”地址:。我先修改虚拟内存,但是没有解决,然后想到了分块读取数据的⽅法,我灵机⼀动,分块读取既然专门⽤来解决⼤数据问题,那我可不可以先转化每⼀块数据的时间戳,最后完成合并呢?⾛投⽆路就撞出条路!正常的分块读取数据:start_time=datetime.datetime.now()user_data=pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\UserBehavior.csv',header=None,iterator=True)loop=Truechunksize=1000000chunks=[]whileloop:try:chunk=user_data.get_chunk(chunksize)chunks.append(chunk)exceptStopIteration:loop=Falseprint('iterationisstopped.')print('开始合并')user_data=pd.concat(chunks,ignore_index=True)print('合并完成')end_time=datetime.datetime.now()print(f'分块导⼊数据耗时:{end_time-start_time}s')结果显⽰耗时:1分29秒,⽐⼀次性读⼊耗时略多,但是内存使⽤明显下降,之前内存使⽤超过了90%,分块读⼊数据只有不到70%。分块读完数据依旧⽤之前的⽅法转化时间戳,**结果依旧不成功,内存还是不⾜!**说实话我真的挺崩溃,信⼼满满要分析,结果被个时间戳绊死,我不要⾯⼦的吗?也是病急乱投医,我想要不要在分块读取数据的时候就把每⼀块的时间戳转换,然后合并到⼀起,这样会不会成功?马上动⼿尝试,修改了⼀下循环:user_data=pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\UserBehavior.csv',header=None,iterator=True)#分块写⼊数据chunksize=1000000chunks=[]loop=Trueimporttime,datetimewhileloop:try:chunk=user_data.get_chunk(chunksize)chunk.columns=['user_id','item_id','category_id','behavior','time_stamp']chunk['date_time']=chunk['time_stamp'].apply(lambdax:time.localtime(x))delchunk['time_stamp']#利⽤完就删除,尽可能节省空间#localtime⽅法转换完的再转换成年-⽉-⽇时:分:秒格式把chunk['date_time']=chunk['date_time'].apply(lambdax:time.strftime('%Y-%m-%d%H:%M:%S',x))#再转换成可以提取的datetime格式chunk['date_time']=pd.to_datetime(chunk['date_time'])#提取⽇期、时间以及对应的星期chunk['date']=chunk['date_time'].dt.datechunk['time']=chunk['date_time'].dt.hourchunk['weekday']=chunk['date_time'].dt.weekday_namedelchunk['date_time']chunks.append(chunk)exceptStopIteration:loop=Falseprint('Iterationisstopped.')print('===========================================')print('开始合并')user_data=pd.concat(chunks,ignore_index=True)print('合并完成')结果依旧不成功………………,到了这⼀步我明⽩了,当排除所有的可能之后,那最后只有⼀个可能了:我的电脑不⾏!这是命,得认啊!这个时候的我百般郁闷,我的电脑好⽍也是堂堂8G内存,竟然给区区百万数据跪了?好奇⽽⽆聊的我⼜去看数据,咦,这是多少⾏,这串数怎么这么长呢?像极了我的银⾏余额。靠!竟然是100150807⾏数据,1亿+⾏数据,回想⼀下,之前我看数据介绍是淘宝百万⽤户的脱敏数据,竟然把数据当成了百万⾏,每个⽤户可以有多个⾏为,这是1亿⾏的数据。好吧,我原谅你了!有感⽽发:在数据分析过程中真是会遇到各种各样的问题,有些是意料之中的,有些是意料之外的,不管怎么样,数据分析师要⼭开路,遇⽔叠桥,有仇报仇,有怨报怨!还要学会认怂,亿级的电脑处理不了,我就处理千万级的吧,从中随机抽取10万的⽤户⾏为数据,最后得到新的数据:part_data.csv。当然,电脑配置较⾼的朋友完全可以直接处理亿级数据,pandas完全没有压⼒。错估数据量这个坑让我耽误了将近⼀天的时间,但是也让我绞尽脑汁寻找各种解决⽅法,期间get了分块读取数据,也算是有所收获了!(⼆)⽇期、时间、星期提取初步预览数据可知,数据有⼀列是时间戳数据,所以下⾯要先对时间戳数据进⾏转化,并提取出⽇期(年⽉⽇)、时间、星期作为新的3列。⾸先,读取数据,并添加列名。user_data=pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\part_data.csv',header=None)user_data.columns=['user_id','item_id','category_id','behavior','time_stamp']第⼆步,转化时间戳。#to_datetime⽅法⽐time.localtime感觉更⽅便,可以不⽤再转换⼀次格式。user_data['time_stamp']=pd.to_datetime(user_data['time_stamp'],unit='s')#转化完之后是格林威治时间,⽽北京时间需要8加⼩时user_data['time_stamp']=user_data['time_stamp']+datetime.timedelta(hours=8)第三步,分别提取⽇期、时间和星期。user_data['date']=user_data['time_stamp'].dt.dateuser_data['time']=user_data['time_stamp'].dt.houruser_data['time_stamp']=user_data['time_stamp'].dt.weekday_name#没有添加新列,⽽是在原列上修改,是为了节省内存空间。这就需要把列名修改⼀下。user_data.rename(columns={'time_stamp':'weekday'},inplace=True)user_data.head(5)⾄此,数据处理环节完成,可以根据我们的分析需求进⾏后续分析。四、数据分析(⼀)数据总体情况总浏览量pv:9079927。user_data.groupby('behavior').count()⽤户数(独⽴访客uv):99399。user_data.drop_duplicates('user_id').count()付费⽤户数:67469,付费⽐例为67.9%。buy_data=user_data[user_data['behavior']=='buy']buy_data.drop_duplicates('user_id').count()复购⽤户数:44309,复购率为65.7%。double_user=buy_data.groupby(buy_data['user_id']).count()double_user[double_user['behavior']>=2].count()(⼆)流量的⽇期、时间、星期变化1.流量的⽇期、星期变化使⽤pandas的分组统计功能对pv、fav、cart、buy的次数按照⽇期分组进⾏统计:user_data['behavior'].groupby(by=user_data['date']).value_counts()得到结果如下的数据统计结果:俗话说“⽂不如表、表不如图”,接下来进⾏可视化展⽰。python的数据可视化功能也很强⼤,但我习惯使⽤PowerBI的数据可视化,美观度更⾼,更漂亮。将数据导⼊PowerBI,进⾏了⼀些处理,过程省略。从图中可以看出,在11-25到12-3的统计周期内,流量波动明显,尤其是进⼊12⽉,⽇活激增。购买、收藏、加购物车⾏为波动与⽇活波动趋势⼀致。从⽇活波动常见原因来看,(1)周末效应。空闲时间多,活跃⽤户多。(2)营销活动。在本案例的时间段内,营销活动是导致⽇活波动的主要原因。因为我们可以看到11-25,11-26也是周末,但流量增幅并不离谱,⽽12-1以后,流量激增。所以可能与淘宝的双⼗⼆活动有关系。同样,购买、收藏、加购物车⾏为的波动原因类似。2.流量的时间变化对‘behavior’字段以‘time’字段为分组依据进⾏分组统计,然后依旧导⼊到powerBI进⾏绘图:user_data['behavior'].groupby(by=user_data['time']).value_counts()pd.set_option('display.max_rows',100)#统计结果较长,这样显⽰全⽅⾯导出从图中可以看出,pv、buy等4中⾏为均随时间变化明显,1-6点为低⾕;6点以后使⽤⼈次逐渐攀升,在10点钟达到⼩⾼峰;10-18点使⽤⼈次⼩范围波动;18点以后使⽤⼈次快速上升,21、22点左右达到⼀天中的峰值,22点以后则逐渐回落。变化趋势与⼈⼀天中的作息、⼯作规律密切相关。所以淘宝以及⼀些店铺进⾏营销活动可以根据图中的时间趋势合理安排。(三)⽤户⾏为转化漏⽃1.总体转化率及各环节转化率漏⽃分析就是预先假设⽤户⾏为的发⽣路径,然后计算每⼀个环节到下⼀个环节的发⽣概率,由于整个过程会不断有⽤户被刷掉,就如同⼀个漏⽃,所以称为漏⽃分析。可以根据不同环节的转化率发现问题并优化产品。⽤户从浏览商品到最终下单购买,中间还有收藏和加⼊购物车(不分先后),所以转化路径就是“pv---->cart/fav---->buy”。user_data['behavior'].value_counts()将数据导⼊powerBI,产出漏⽃图。从浏览到最终购买,转化率为2.2%,⽽从收藏/加购物车到购买转化率为23.3%,从浏览到收藏或加购物车的转化率为9.5%。所以,关键环节是如何让⽤户在浏览后迅速喜欢上商品并产⽣购买意向,应该思考的是个性化推荐是否真的符合⽤户的购买需求。2.销售量前⼗的商品转化率先对商品进⾏pv、cart/fav、buy的统计,并计算各环节的转化率:#item_data包含各商品的pv次数s1=user_data['item_id'].value_counts()item_data=pd.DataFrame({'item_id':s1.index,'pv':s1.values})item_data.head(5)#item_data2包含各商品的cartfav和次数user_data2=user_data[user_data['behavior'].isin(['cart','fav'])]s2=user_data2['item_id'].value_counts()item_data2=pd.DataFrame({'item_id':s2.index,'cart/fav':s2.values})#先合并item_data和item_data2item_data3=pd.merge(item_data,item_data2,how='left',on='item_id')item_data3#item_data4包含各商品的buy次数user_data3=user_data[user_data['behavior']=='buy']s3=user_data3['item_id'].value_counts()item_data4=pd.DataFrame({'item_id':s3.index,'buy':s3.values})#合并item_data4item_data3作为item_data和item_data=pd.merge(item_data3,item_data4,on='item_id',how='left')item_data.fillna(0,inplace=True)item_data['cart/fav']=item_data['cart/fav'].astype('int')item_data['buy']=item_data['buy'].astype('int')item_data.head(5)#计算每个商品的转化率item_data['transform1']=item_data['cart/fav']/item_data['pv']item_data['transform2']=item_data['buy']/item_data['cart/fav']item_data['transform_total']=item_data['buy']/item_data['pv']item_data.head(5)#⼩数显⽰转化为百分数显⽰item_data['transform1']=item_data['transform1'].apply(lambdax:format(x,'.2%'))item_data['transform2']=item_data['transform2'].apply(lambdax:format(x,'.2%'))item_data['transform_total']=item_data['transform_total'].apply(lambdax:format(x,'.2%'))#排序,展⽰购买次数前⼗的商品信息item_data.sort_values('buy',ascending=False).head(10)item_data.sort_values('pv',ascending=False).head(10)从统计表中可以看出,除了id为‘3031354’的商品外,其他销量前⼗的商品浏览量均没有在top10,说明⼀些曝光量⾮常⾼的商品没有很好的转化为销量。直接观察浏览次数top10商品发现,转化率并不理想,其中9款商品的转化率低于2.2%(总转化率)。如果想找出其中的原因和优化点就需要结合具体商品情况进⾏分析了,笔者猜测可能原因如下:⼀是商家的营销活动、折扣活动等不能很好抓住消费者的⼼理;⼆是商品本⾝可能属于⼤件耐⽤品,这样成交量显然不会太⼤。3.头部⽤户购买和转化率按照⽤户对pv,cart/fav,buy进⾏统计:#统计每个⽤户的pvuser_data.head(5)user_data=user_data.rename(columns={'time_stamp':'weekday'})pv_data=user_data[user_data['behavior']=='pv'].groupby('user_id').count()pv_data=pv_data.reset_index()pv_data.head(4)delpv_data['item_id'],pv_data['category_id'],pv_data['weekday'],pv_data['date'],pv_data['time']pv_data.rename(columns={'behavior':'pv'},inplace=True)#统计每个⽤户的cart+favcart_data=user_data[user_data['behavior'].isin(['cart','fav'])].groupby('user_id').count()cart_data=cart_data.reset_index()cart_data.head(5)cart_data.rename(columns={'behavior':'cart/fav'},inplace=True)delcart_data['item_id'],cart_data['category_id'],cart_data['weekday'],cart_data['date'],cart_data['time']#统计每个⽤户的buypay_data=user_data[user_data['behavior']=='buy'].groupby('user_id').count()pay_data.reset_index(inplace=True)pay_data.rename(columns={'behavior':'buy'},inplace=True)delpay_data['item_id'],pay_data['category_id'],pay_data['weekday'],pay_data['date'],pay_data['time']pay_data.head(5)#将三个DataFrame进⾏连接user1=pd.merge(pv_data,cart_data,how='left')user1.head(5)user_behavior=pd.merge(user1,pay_data,how='left')user_behavior.fillna(0,inplace=True)user_behavior.head(5)user_behavior['cart/fav']=user_behavior['cart/fav'].astype('int')user_behavior['buy']=user_behavior['buy'].astype('int')user_behavior['transform1']=user_behavior['cart/fav']/user
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版公司承包合同参考范本
- 2025别墅装修工程现场清理与劳务分包合同3篇
- 2025年度文化旅游综合体承包设计工程合同4篇
- 2025年度书房软装承接合同样本12篇
- 非计划性拔管相关知识考核试题
- 2024版特许经营协议:快餐连锁品牌授权
- 2025年农业大棚租赁与农业产业园区建设合同4篇
- 2025年度新型城镇化代付工程款三方协议4篇
- 2025年度合同封面定制与知识产权战略布局合同3篇
- 2025年度水库鱼塘渔业养殖与市场拓展承包合同3篇
- CT设备维保服务售后服务方案
- 重症血液净化血管通路的建立与应用中国专家共识(2023版)
- 儿科课件:急性细菌性脑膜炎
- 柜类家具结构设计课件
- 陶瓷瓷砖企业(陶瓷厂)全套安全生产操作规程
- 煤炭运输安全保障措施提升运输安全保障措施
- JTGT-3833-2018-公路工程机械台班费用定额
- 保安巡逻线路图
- (完整版)聚乙烯课件
- 建筑垃圾资源化综合利用项目可行性实施方案
- 大华基线解码器解码上墙的操作
评论
0/150
提交评论