电商app⽤户⾏为分析(含全过程python代码)
⼀、分析背景
对于很多互联⽹公司来说,流量和⽤户价值都是核⼼问题。根据产品⽣命周期理论,在产品发布初期,更多的关注点应该放在拉新上,只有⾜够的⽤户量级才能为公司提供发展的不竭动⼒,初期对流量和市场份额的竞争,很⼤程度上决定了后期的⾏业格局。所以回顾滴滴和优步、美团和饿了么的烧钱⼤战,正是对“流量为王”这⼀理论的践⾏。但是流量进来之后呢?⼀个较为成熟的产品(如淘宝、滴滴、美团等)应该思考的更多,产品经理⼈和数据分析师⼀定要好奇⽤户进来之后⼲了什么,产⽣了什么价值。基于此,才能对产品进⾏优化,使其更加符合⽤户的⾏为习惯。所以,⽤户⾏为分析就⼗分必要。在这⾥以来⾃天池的淘宝⽤户⾏为数据为基础进⾏数据分析⼯作,。
⼆、明确需求
进⾏数据分析的第⼀步就是明确需求,知道为什么要分析,或者说要解决什么问题/疑惑。在提出分析⽬标之前可以先了解⼀下数据,脱离数据提需求是空中楼阁,脱离需求分析数据是⽆头苍蝇。
可以从数据介绍中看到,(1)数据有5个字段,分别是⽤户ID,商品ID,商品类⽬ID,⾏为类型,时间戳。(2)⾏为类型有4种,浏览、购买、加购物车、收藏。(3)时间跨度是9天。根据数据的介绍我们可以提出以下分析⽬标:
1. 数据总体情况,pv,uv,付费⽤户数,复购率等
2. 变化趋势:流量随天、时间的变化趋势,以及在⼀周之内的变化趋势
3. ⽤户⾏为的转化漏⽃
4. 基于⽤户、商品细分的转化率
需要注意的是这⾥只是根据已知的数据结构提出的⽬标和需求,能不能得出有价值、有启发意义的结论,还需要根据分析结果来确定。
三、数据处理
(⼀)遇到的坑
拿到数据之后,笔者⾼⾼兴兴的⽤Anaconda的Spyder打开导⼊数据,想先简单看看数据,再进⾏清洗和分析。数据导⼊倒是没有遇到太⼤的问题:
import pandas as pd
python怎么读csv数据import datetime
start_time = w()
user_data = pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\UserBehavior.csv',header = None)
end_time = w()
print(f'导⼊数据耗时:{end_time-start_time}s')
笔者明显能感觉到导⼊数据耗时过长,⼼⾥着实有点奇怪,特地查看了以下导⼊数据花费的时间,输出结果显⽰---->导⼊数据耗时:0:01:20.114552s。花了1分20秒才读完数据,我当时就有点郁闷,区区百万级别的数据怎么会这么慢?⼿动挠头。但是我也没多想,继续往下搞吧!
浏览前⼏⾏
user_data.head(10)
先给数据加列名,⽅便后续处理:
lumns =['user_id','item_id','category_id','behavior','time_stamp']
user_data.head(5)
基本的处理之后,可以考虑开始进⾏数据清洗了,其实本数据都是来源于淘宝后台的数据,并⾮由⼈为填写的,所以遇到数据还是⾮常⼲净的,谨慎起见,可以对空值检查⼀下,笔者习惯使⽤:
user_data.info()
或许是由于数据量较⼤,所以都没有显⽰每个字段的⾮空记录有多少⾏。(汗,笔者到现在都还以为只有百万⾏数据,眼⾓膜可以捐了……)
由于没有得到⾮空数值分布情况,所以笔者只能选择下⾯的⽅法:
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.loc
altime()**⽅法转化为对应的东⼋区北京时间,但是由于time.localtime()括号⾥⾯必须加⼀个具体的时间戳,如1585385176(笔者写到此处的时间戳):
mport time
time.localtime(1585385176)
由于笔者是要把user_data[‘time_stamp’]这⼀整列转化,所以不能简单使⽤time.localtime()这个⽅法,需要⼩⼩变形:
user_data['date_time']= user_data['time_stamp'].apply(lambda x: time.localtime(x))
结果⼀运⾏,电脑在嗡嗡响了⼀阵后,程序直接报错:
笔者不死⼼连续运⾏好⼏次,最后电脑直接当场退役,领盒饭了(⿊屏了),我只能⼿动重启。为了解惑我只能询问度娘,“好⼼⼈”告诉我是因为数据量太⼤,电脑内存不⾜,所以产⽣这个问题。为了解决这个问题,我尝试了各种⽅法,“好⼼⼈”地址:。
我先修改虚拟内存,但是没有解决,然后想到了分块读取数据的⽅法,我灵机⼀动,分块读取既然专门⽤来解决⼤数据问题,那我可不可以先转化每⼀块数据的时间戳,最后完成合并呢?⾛投⽆路就撞出条路!
正常的分块读取数据:
start_time = w()
user_data = pd.read_csv(r'F:\数据分析项⽬\淘宝⽤户⾏为分析\UserBehavior.csv',
header =None, iterator =True)
loop =True
chunksize =1000000
chunks =[]
while loop:
try:
chunk = _chunk(chunksize)
chunks.append(chunk)
except StopIteration:
loop =False
print('iteration is stopped.')
print('开始合并')
user_data = pd.concat(chunks,ignore_index =True)
print('合并完成')
end_time = w()
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 =1000000
chunks =[]
loop =True
import time,datetime
while loop:
try:
chunk = _chunk(chunksize)
chunk['date_time']= chunk['time_stamp'].apply(lambda x: time.localtime(x))
del chunk['time_stamp']# 利⽤完就删除,尽可能节省空间
# 把localtime⽅法转换完的再转换成年-⽉-⽇时:分:秒格式
chunk['date_time']= chunk['date_time'].apply(lambda x: 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.date
chunk['time']= chunk['date_time'].dt.hour
chunk['weekday']= chunk['date_time'].dt.weekday_name
del chunk['date_time']
chunks.append(chunk)
except StopIteration:
loop =False
print('Iteration is stopped. ')
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)
lumns =['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.date
user_data['time']= user_data['time_stamp'].dt.hour
user_data['time_stamp']= user_data['time_stamp'].dt.weekday_name
# 没有添加新列,⽽是在原列上修改,是为了节省内存空间。这就需要把列名修改⼀下。
ame(columns ={'time_stamp':'weekday'},inplace =True)
user_data.head(5)
⾄此,数据处理环节完成,可以根据我们的分析需求进⾏后续分析。
四、数据分析
(⼀)数据总体情况
总浏览量pv:9079927。
upby('behavior').count()
⽤户数(独⽴访客uv):99399。
user_data.drop_duplicates('user_id').count()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论