有一个多月没有用Python了,有些生疏o(╥﹏╥)o。通过秦路老师的一道题目,分别使用sql和python求解,顺便复习下python点,重点关注【复购率】、【回购率】的解法

☞秦路老师视频讲解(使用SQL来求解)

已知信息:所需数据:order_info.csv、user_info.csv

【表userinfo】字段为:userid,sex,birth

【表order_info.csv】字段为:orderid,userid,ispaid,price,paidtime

数据连接,提取码:b4ca

求出以下:统计用户不同月份的回购率和复购率

统计不同月份的下单人数

统计不同性别的消费频次是否有差异

统计多次消费的用户,第一次和最后一次消费时间的间隔(按天计算间隔)

统计不同年龄段的用户人均消费频次(年龄段按[0,10),[10,20),[20,30),[30,40),[40,50),[50.60),[60,70),[70,80),[80,90)来划分,统计时间截止为2017年,保留两位小数)

统计消费的二八法则,消费金额的top20%用户,贡献了多少额度

从拿到数据到形成报告,无外乎以下步骤理解数据及背景

清洗数据(重复值、空值、异常值、数据一致化)

明确问题

分析问题(借助工具对数据进行分析)

解决问题

直接进入分析问题步骤:

【使用SQL进行求解】

1.统计用户不同月份的回购率和复购率【复购率】当月消费多次

【回购率】当月消费,次月仍消费【复购率】先求出每月每个用户的消费次数,再筛选出消费多次的用户。注意两位数百分数的求法concat(round(数值,2),'%')

SELECT t.`月份`,count(DISTINCT t.userid) 当月消费人数,

count(DISTINCT case when t.`消费次数`>1 then t.userid else null end) as 当月复购人数,

concat(round(count(DISTINCT case when t.`消费次数`>1 then t.userid else null end)/count(DISTINCT t.userid)*100,2),'%')as 复购率 FROM

(SELECT DATE_FORMAT(paidtime,'%Y-%m') as 月份,userid,

count(orderid) 消费次数

from 03order_info

where ispaid='已支付'

GROUP BY DATE_FORMAT(paidtime,'%Y-%m'),userid) t

GROUP BY t.`月份`

;【回购率】将order_info连接,求出diff,进而求解。类似留存率的计算

SELECT t.date1,count(DISTINCT t.userid)as 当月购买人数,

count(DISTINCT case when t.diff=1 then t.userid else null end)as 次月购买人数,

count(DISTINCT case when t.diff=1 then t.userid else null end)/count(DISTINCT t.userid) as 回购率

FROM

(SELECT t1.userid,

DATE_FORMAT(t1.paidtime,'%Y-%m') as date1,

DATE_FORMAT(t2.paidtime,'%Y-%m') as date2,

TIMESTAMPDIFF(month,DATE_FORMAT(t2.paidtime,'%Y-%m-01'),DATE_FORMAT(t1.paidtime,'%Y-%m-01')) as diff

from 03order_info t1

LEFT JOIN 03order_info t2

on t1.userid=t2.userid

where t1.ispaid='已支付' and t2.ispaid='已支付')t

GROUP BY t.date1

;

2.统计不同月份的下单人数

SELECT DATE_FORMAT(paidtime,'%Y-%m') as 月份,

COUNT(DISTINCT userid) as 下单人数 ,

count(userid) as 下单数 from 03order_info

where ispaid='已支付'

GROUP BY DATE_FORMAT(paidtime,'%Y-%m');

3.不同性别的消费频次

SELECT u.sex,

count(o.orderid)/count(DISTINCT o.userid) as 消费频次

from 03order_info o

LEFT JOIN 03user_info u

on o.userid=u.userid

where o.ispaid='已支付'

GROUP BY u.sex;

4.统计多次消费的用户,第一次和最后一次消费时间的间隔(按天计算间隔)

SELECT userid,

DATEDIFF(max(date(paidtime)),min(date(paidtime))) as 时间间隔

from 03order_info

where ispaid='已支付'

group by userid

having count(orderid)>1;

5.统计不同年龄段的用户人均消费频次

在剔除birth为空的数据后,按照birth升序排列,user_info表格顺序如下。需要剔除年龄极值,规定year(birth)>1900

#年龄段划分用【case when】函数

SELECT t.`年龄段`,COUNT(t.orderid) as 消费次数,

count(DISTINCT t.userid) as 消费人数,

round(COUNT(t.orderid)/count(DISTINCT t.userid),2) as 人均消费频次 from

(SELECT o.userid,o.orderid,

case

WHEN 2017-year(u.birth)<10 then '[0,10)'

WHEN 2017-year(u.birth)<20 then '[10,20)'

WHEN 2017-year(u.birth)<30 then '[20,30)'

WHEN 2017-year(u.birth)<40 then '[30,40)'

WHEN 2017-year(u.birth)<50 then '[40,50)'

WHEN 2017-year(u.birth)<60 then '[50,60)'

WHEN 2017-year(u.birth)<70 then '[60,70)'

WHEN 2017-year(u.birth)<80 then '[70,80)'

WHEN 2017-year(u.birth)<90 then '[80,90)'

else '90+'

end as 年龄段

from 03order_info o

LEFT JOIN 03user_info u

on o.userid=u.userid

where o.ispaid='已支付' and year(u.birth)>1900) t

GROUP BY t.`年龄段`

6.统计消费的二八法则,消费金额的top20%用户,贡献了多少额度求前百分比的数值时,利用窗口函数排序,然后让排序小于百分比与总数的乘积即可

SELECT sum(t.sum) FROM

(SELECT userid,round(sum(price),2) as 'sum',

row_number() over (order by sum(price) desc) as 'ranking'

from 03order_info

where ispaid='已支付'

GROUP BY userid) t

where t.ranking

where ispaid='已支付')

;

【使用python求解】

1.统计用户不同月份的回购率和复购率

复购率:

df=order.groupby(['month','userid']).count().reset_index()

s1=df.groupby('month')['userid'].count() #当月消费人数

s2=df[df['orderid']>1].groupby('month')['userid'].count() #当月多次消费人数

df_new= pd.concat([s1,s2],axis=1)

df_new.columns=['当月消费人数','当月多次消费人数']

df_new['复购率']=(df_new['当月多次消费人数']/df_new['当月消费人数']).apply(lambda x: format(x,'.2%')) #两位小数百分数

print(df_new)

回购率:

order['month']=order['paidtime'].dt.month

order1=order.groupby(['userid','month']).count().reset_index()[['userid','month']] #统计出各userid再各月消费情况

order2=pd.merge(order1,order1,on='userid',how='left') #两表连接

order2['diff']=order2['month_y']-order2['month_x']

order3=order2.groupby(['month_x','userid']).count().reset_index()['month_x'].value_counts() #当月消费人数

order4=order2[order2['diff']==1].groupby(['month_x','userid']).count().reset_index()['month_x'].value_counts() #次月消费人数

df=pd.concat([order3,order4],axis=1)

df.columns=['当月购买人数','次月回购人数']

df['回购率']=df['次月回购人数']/df['当月购买人数']

print(df)

2.统计不同月份的下单人数【知识点】①时间函数用法(见图,参考)②如何去重计数

order['month']=order['paidtime'].dt.strftime('%Y-%m')

order=order[order['ispaid']=='已支付']

df=order.groupby(['month','userid']).count().reset_index().groupby('month').agg({'userid':'count','orderid':'sum'})

df=df.rename(columns={'userid':'下单人数','orderid':'下单次数'})

print(df)

3.统计不同性别的消费频次表连接pd.merge(table1,table2,left_on,right_on,how)

df=pd.merge(order,user,left_on='userid',right_on='userId',how='left')

df=df.groupby(['sex','userId']).count().reset_index().groupby('sex').agg({'userId':'count','orderid':'sum'})

df=df.rename(columns={'userId':'消费人数','orderid':'消费次数'})

df['消费频次']=round(df['消费次数']/df['消费人数'],2)

print(df)

4.统计多次消费的用户,第一次和最后一次消费时间的间隔(按天计算间隔)

df=order.pivot_table(index='userid',values='paidtime',aggfunc=['min','max'])

df['diff']=df['max']-df['min']

print(df.head())

5.统计不同年龄段的用户人均消费频次(年龄段按[0,10),[10,20),[20,30),[30,40),[40,50),[50.60),[60,70),[70,80),[80,90)来划分,统计时间截止为2017年,保留两位小数)df['label']=pd.cut(列,bins,right,labels),数据类型为category,是无法使用groupby的,必须先使用.astype(str)将category转换类型

#提取年份,计算年龄

#使用pd.cut(data,bins,right,label)分组

user=user[user['birth']>datetime(1900,1,1)]

user['birth']=user['birth'].dt.year

user['age']=datetime(2017,1,1).year-user['birth']

user['label']=pd.cut(user['age'],bins=[0,10,20,30,40,50,60,70,80,90,100],right=False).astype(str)#要把category转换成str类型,才能groupby

#表连接

df=pd.merge(order,user,left_on='userid',right_on='userId',how='left').dropna() #删除缺失值所在行

#数据分组求解

df=df[['userid','orderid','label']]

df=df.groupby(['label','userid']).count().reset_index().groupby('label').agg({'userid':'count','orderid':'sum'})

df=df.rename(columns={'userid':'消费人数','orderid':'消费次数'})

df['消费频次']=df['消费次数']/df['消费人数']

print(df)

6.统计消费的二八法则,消费金额的top20%用户,贡献了多少额度

#计算每个用户的消费金额

df=order.groupby('userid')['price'].sum().reset_index()

#计算贡献排在前20%的分位数

data=df['price'].quantile(0.8,interpolation='nearest') #分位数为1314

#筛选出前20%贡献数据,并计算求和

df=df[df['price']>=data]

print(df['price'].sum())

结果:272222167.4584

(~ ̄▽ ̄)~

mysql求回购率_用户行为分析——回购率、复购率(SQL、Python求解)相关推荐

  1. java统计excel数据_数据分析实战——EXCEL实现复购率计算

    这是数据分析实战的第三篇(复购率计算篇),本文提供真实数据(脱敏),并梳理复购率计算思路和技巧,通过15分钟的阅读和实践,读者即可根据自己的订单数据灵活计算业务涉及到的复购率了.(实战数据在文末) 相 ...

  2. mysql求回购率_SQL-- 用户行为(复购率、回购率等)

    所需数据:ORDER_INFO_UTF.CSV.USER_INFO_UTF.CSV 提取码:yu63 我的数据库版本是Mysql 8.0 本文章参考 秦路老师七周成为数据分析师 的视频,和视频中讲解的 ...

  3. python 将多张大小不同的图依次放入较大的黑色背景_用户消费行为分析(Python)...

    一 分析背景及目的 通过历史数据,对用户的购买时间.购买数量.金额等字段,分析用户的复购率.回购率等指标,从中找出有商业价值的线索和规律,调查产品销售情况,根据分析结果做出不同的营销策略. 二 分析过 ...

  4. 如何用sql计算回购率、复购率指标

    这6道sql题都很好,建议都过一遍: 考察知识点: 回购率.复购率的理解 子查询 inner join 重点推荐第2题,第5题,第6题 理解需求.理解题意 (★★★★★) datediff ceil ...

  5. MySQL 留存率和复购率的场景分析

    实际工作中常见的业务场景是求次日留存率,还有一些会对次日留存率增加限制,例如求新用户的次日留存率或者求活跃用户留存率.另外,留存率和复购率看起来都是统计重复出现的概率,但实际求解方法是不一样的. [场 ...

  6. 哪个是更早的时间 date_淘宝用户行为分析(漏斗模型+pv,uv,pv/uv,复购率,用户活跃时间段)...

    数据来源https://tianchi.aliyun.com/dataset/dataDetail?dataId=46 用户行为表:用户ID,商品ID,用户行为.用户地点,商品大类ID,时间 需求:该 ...

  7. mysql复购率_Mysql与Pyhton实现复购率和回购率

    一.复购率 复购率:一段时间内,购买2次及以上客户人数,占该时间段内购买过的总人数的比重. 例如:一个月以内,购买该商品超过两次的人有50个人,一个月内买过该商品的人有100个人,该月内复购率就是50 ...

  8. mysql复购率_MySQL_复购回购率

    指标解释 如何计算复购率/回购率 计算方法一:复购的人 复购率 = 单位时间内购买次数大于1的人/所有购买的人 例如: 一段时间内,10个人中有3个人购买2次,这3个人中有一个人又购买了一次,累计复购 ...

  9. 基于MySQL的淘宝用户行为分析

    该文目录 一.分析背景 二.分析目的 三.理解数据 四.提出相关问题 1.相关问题 2.分析框架 五.数据清洗 1.选择子集 2.数据类型修改 3.重复值检查 4.缺失值处理 5.一致性处理 6.异常 ...

最新文章

  1. OpenCV(项目)车牌识别1 -- 车牌提取(形态学)
  2. 基于协同过滤算法实现选课推荐系统
  3. sql 只取一条记录_后端程序员必备:书写高质量SQL的30条建议
  4. 使用 RequireJS 优化 Web 应用前端
  5. feign 序列化_Spring Cloud Feign 配置 FastJson
  6. 数据可视化【十】绘制地图
  7. hadoop主节点切换_hadoop2.0 HA的主备自动切换
  8. linux下的僵尸进程 - Zombie
  9. 何凯明:Single Image Haze Removal Using Dark Channel Prior[CVPR 2009]
  10. MySQL 查询本月各周
  11. PAT考前准备篇:目标满分
  12. arduino中u8g2汉字显示总结
  13. SC、ST、FC、LC光纤接头区别
  14. 人生苦短,快学python(python可以做什么)
  15. Android App性能优化之内存优化
  16. 基于GPS的公交车站点播报调试第四天
  17. 双向可控硅的四象限触发方式
  18. Chart.js 中文文档(整理)
  19. 肖锰:浪潮GS开发平台学习札记(二)——服务器端安装补充及客户端下载安装配置
  20. 从零学习Jenkins部署SpringBoot项目

热门文章

  1. MCU简单控制DAC芯片应用(以DAC8550为例)
  2. 404报错:The origin server did not find a current representation for the target resource解决的两种办法
  3. 故事版xib --view上添加tableview
  4. chrome浏览器怎么模拟手机访问网页(已測OK)
  5. 十六进制RGB颜色名称对照表
  6. java 自旋锁实现
  7. 115道Java面试题及答案分享,java程序员赶紧收好
  8. 成都开发者看过来!百度资深研发工程师将出席超级账本成都见面会
  9. Detecting Causality in Complex Ecosystems(检测复杂生态系统中的因果关系附件)
  10. ARM Cortex-M3 学习笔记(3)