导入数据
观察数据,是csv格式
导入数据
# 导入数据
df = pd.read_csv('kelu.csv')
df.head()
分析数据:发现time列数据类型需要修改为datetime
df.info()
# 可以看出共有8k+条数据,time列数据类型需要转换为datetime,没有空数据
df.describe()
# 可以看出平均评分在92,大多数的用户给出了100分
# 数据是16年到19年之间的
# 门票价格都是110
# frequency代表消费次数,全为1,后续计数用
根据分析结果修改time列数据类型
# 分析数据
# 先转换time列数据类型
df['time'] = pd.to_datetime(df['time'],format='%Y/%m/%d')
df.info()
每日/每月/每个用户数据分析
a1.每日销量分析
# 1.每日销量分析
# time列本来就是精确到天的,所以直接按time分组就行,然后因为也没有空数据,所以随便取一列计数就行
df.groupby('time')['frequency'].count().plot(figsize=(12,4))
# 整体看来每日销量呈现上升趋势,但是18年5月份前后(2、3、4)出现一次较大波动,销量急剧下滑,猜测:台风、疫情,运营推广不利
# 16年9月-17年1月,销量非常低,平均每天2-3张,猜测:101观景台门票刚上线发售,观景台刚对游客开放
a2.每月销量分析
# 2.每月销量分析
# time列精确到天数,而我们只需要月份就行,跟上一个项目一样,新增一列精度为月份
df['month'] = df['time'].values.astype('datetime64[M]') # 保留精度为月份的日期
df.groupby('month')['rating'].count().plot(figsize=(12,4))
# 月份销量整体呈现上升趋势,但是18年2、3、4月销量下滑,跟每天销量有关
a3.每个用户的购买量和消费金额
先学习新函数merge,比较好理解,将两个表按照相同字段连接
# 新函数merge法,相当于SQL中的join
df1 = pd.DataFrame({
'name':['zhangsan','lisi'],
'group':['A','B']
})
df2 = pd.DataFrame({
'name':['lisi','wangwu'],
'group':['B','C'],
'score':[88,90]
})
pd.merge(left=df1,right=df2,on='name',how='inner',suffixes=['_1','_2'])
# left:左表名称 right:右表名称 on:关联字段 how:inner(默认,交集)/outer(并集)/left(只保留左侧)/right(只保留右侧)
# suffixes:如果两个表中有相同列,用suffixes给的值进行区分(默认值x、y)
这里可以不用这么麻烦,只是为了讲解这个函数
画散点图的时候,可以指定x、y
# 按照游客分组,统计每个游客购买次数
group_count_author = df.groupby('author')['frequency'].count().reset_index() # 这里的重置索引是为了加上frequency的列名
# 按照游客分组,统计每个游客的消费金额
group_sum_amount = df.groupby('author')['amount'].sum().reset_index()
user_purchase_retention = pd.merge(left=group_count_author,
right=group_sum_amount,
on='author',
how='inner')
user_purchase_retention.plot.scatter(x='frequency',y='amount')
plt.title('用户购买次数和消费金额关系')
plt.xlabel('购物次数')
plt.ylabel('消费金额')
# 结论:斜率是门票价格110,两者呈线性关系
用户购买数量和次数行为分析
b1.用户购买门票数量分析
这里我做的跟视频有点出入,因为我觉得frequency只是次数而已,不代表数量,展示的是我自己的做法
# 1.用户购买门票数量分析
# 这里视频教学是直接对frequency进行计数,但是我觉得frequency全为1表示消费次数,但是一次消费可能不只一张门票
df['quantity'] = df['amount']/110
df['totle_quantity'] = df['quantity']*df['frequency']
df.groupby('author')['totle_quantity'].count().plot(kind='hist',bins=50)
plt.xlim(1,17)
plt.xlabel('购买数量')
plt.ylabel('人数')
plt.title('用户购买门票数量直方图')
# 绝大多数用户买过1张门票,用户在7000人左右
# 少数人买过2-6张门票,推测:可能是台北周边用户