数据分析项目 --SQL 的用户消费分析

本贴最后更新于 1951 天前,其中的信息可能已经时移世改

1、导入数据
方法 1 直接导入 CSV 数据,不用建表做关联,如下图
image.png
方法 2 建表做关联后导入数据
建表,订单表(订单编号,用户 ID,付款情况,价格,订单付款时间)

create table orderform( orderid varchar(20) null, userid varchar(10) null, paid varchar(10) null, price varchar(10) null, payment_time datetime null)

建表,客户信息表

create table userlist( userid varchar(10) null,gender varchar(5) null,birth datetime null)

1.1 需要更新下列名,更新列名的语句如下,不过还是表设计里面改起来最快
exec sp_rename 'order_info_utf.column1','order_info_utf.orderid'

2、用户消费行为分析相关
有关用户消费行为的统计指标,主要的分析内容主要是:
销量和消费金额分析、消费的时间节点、复购率回购率分析、用户分层、用户生命周期和消费周期等,具体可以看看

2.1 可以统计不同月份订单数、用户数、下单总金额

select convert(varchar(6),payment_time,112) as year_month, count(orderid) as order_num , count(distinct userid) as user_num,sum(price) as sum from order_info_utf where paid='已支付' group by convert(varchar(6),payment_time,112) order by year_month

image.png

2.2 统计用户复购率、回购率(这两个不一样的)
a. 复购率 当月消费一次以上(叫复购)人数的占比情况(消费次数 >1 的人数 ÷ 消费总人数)

这里遇到了一个难点,就是 SQL 转换成带 % 号的比率,折磨人,计算完毕的比率是 float 型,% 是字符型,所以拼接是要将 float 转换后再加 %,然后是 char 和 varchar 的区别导致的,也可以用 convert 转换

select t.*,concat(cast(round((cast(t.repeat_user as float)/t.user_num)*100,2)as varchar),'%') as repeat_rate from (select year_month,count(distinct userid)as user_num, sum(case when b.frequency>1 then 1 else 0 end) as repeat_user from (select convert(varchar(6),payment_time,112) as year_month , userid,count(userID) as frequency from order_info_utf where paid='已支付' group by convert(varchar(6),payment_time,112), userID) b group by year_month) t order by year_month

image.png

image.png

b.回购率,回购率一般以月为单位区分,上月购买过的人在本月又买了,先找出本月购买的

select a.year_month1 年月,a.购买人数,b.回购人数 from (select convert(varchar(6),payment_time,112) as year_month1,count( DISTINCT userid) 购买人数 from order_info_utf where paid='已支付' group by convert(varchar(6),payment_time,112))a left join (select convert(varchar(6),payment_time,112) year_month2,count (DISTINCT a.userid )回购人数 from order_info_utf a where a.paid='已支付' and a.userid in (select userid from order_info_utf B where paid='已支付' and convert(varchar(6),B.payment_time,112)=convert(varchar(6),a.payment_time,112)-1) group by convert(varchar(6),payment_time,112))b on a.year_month1=b.year_month2 order by a.year_month1

image.png

2.3.统计男女的消费频次是否有差异,一般用户分层可以从性别、年龄段来着手
a.从性别分层找差异

select u.gender,sum(b.frenquency) as sum_frequency,count(distinct u.userid), round(convert(float,sum(b.frenquency))/convert(float,count(distinct u.userid)),2) as avg_frequency from user_info_utf u left join (select userid,count(userid) as frenquency from order_info_utf where paid='已支付' group by userid) b on u.userid=b.userid where gender is not null group by gender

image.png

结论: 可见在性别方面,平均频次相差不大,那么可以顺便分析下不同性别的消费总额与平均额

select u.gender,sum(b.expenditure) as sum_expenditure,count(distinct u.userid), round(convert(float,sum(b.expenditure))/convert(float,count(distinct u.userid)),2) as avg_expenditure from user_info_utf u left join (select userid,sum(price) as expenditure from order_info_utf where paid='已支付' group by userid)b on u.userid=b.userid where u.gender is not null group by u.gender

image.png

b.年龄分层,从年龄段来分析,先将年龄分层,最小的 3 岁,最大的 1947,显然大于 119 的基本属于异常值,可以将其剔除

select c.age_leval,count(c.userid) as sum_frequency ,sum(a.expenditure) as sum_expenditure, round(sum(a.expenditure)/count(c.userid),4) as avg_expenditure from (select b.userid,age_leval=(case when age <=17 then '0-17岁' when age between 18 and 25 then '18-25岁'when age between 26 and 35 then '26-35岁' when age between 36 and 45 then '36-45岁' when age between 46 and 55 then '46-55岁' else '56岁以上' end) from (select userid,age=datediff(yy,convert(varchar(10),birth,23),GETDATE()) from user_info_utf where birth is not null and datediff(yy,convert(varchar(10),birth,23),GETDATE())<119) b )c left join (select userid,sum(price) as expenditure from order_info_utf where paid='success' group by userid) a on c.userid=a.userid group by c.age_leval

image.png
可以看出 26-35 和 36-45 年龄段的消费热刺和消费额都遥遥领先,但是在人均方面优势并不是十分明显,只有 36-45 年龄段的人均比较高,总消费额和总消费频次最多的 26-35 年龄段,人均消费和 56 岁以上年龄段的人均消费相差无几。

2.4.统计多次消费的用户,第一次和最后一次消费时间的间隔

select distinct userid,count(userid)as frequency, convert(varchar(10),min(payment_time),120) as first_payment_time, convert(varchar(10),max(payment_time),120) as last_payment_time, datediff(dd,min(payment_time),max(payment_time)) as time_lag from order_info_utf where paid='已支付' group by userid having count(userid)>=2 order by frequency desc

image.png

2.5.消费黄金法则,二八原则,订单数量最多的 20% 客户,创造了多少的消费额,占总消费额的比例
以及订单额最多的客户,占到 80% 的订单额的用户的数占比总用户数的比率

select count(userid),sum(user_price),c.sum_user,c.sum_price,round(sum(b.user_price)/c.sum_price,2) as rate from (select top 20 percent userid,count(userid) as user_frequency,sum(price) as user_price from order_info_utf where paid='success' group by userid order by count(userid) desc) b , (select count(distinct userid) as sum_user ,sum(price) as sum_price from order_info_utf where paid='success') c group by c.sum_price,c.sum_user

image.png

以上,符合二八法则,关键用户满足,如果比率小于 0.8,可以着重发展先大客户

  • SQL
    128 引用 • 390 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 644 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 415 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 544 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 613 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 643 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 434 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 32 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 652 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖 • 3 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖 • 1 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 20 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 134 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 353 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3195 引用 • 8215 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 344 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • OneDrive
    2 引用
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 541 回帖 • 1 关注