前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何进行帕累托分析?

如何进行帕累托分析?

作者头像
猴子数据分析
发布2022-04-08 08:22:10
8760
发布2022-04-08 08:22:10
举报
文章被收录于专栏:猴子数据分析

【面试题】有一张“学生成绩表”,包含3个字段:学号、课程、成绩。

问题:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类

【解题思路】

什么是二八定律?

二八定律是说在任何一组东西中,最重要的只占一小部分,约20%。比如家店铺,卖的最多的商品数只占20%

什么是ABC分类法?

ABC分类方法是二八定律衍生出来的一种分类方法,由于它把对象分成A、B、C三类,所以叫做ABC分类法,也叫帕累托分析

ABC分类法计算步骤:

1)将分析对象由大到小排序

2)计算每一个对象及排在该对象之前的累计占比

3)将累计占比为0~60%的记为A类,60%~85%记为B类,85%以上记为C类

1. 解题思路

题目要求:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类;

所以,核心问题就是计算累计占比。

那么,什么是累计占比呢?

课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩

“课程总成绩”很好理解,也就是每门课程的所有学生的成绩总和。

“课程累计成绩”的定义是:

1)每门课程的学生成绩由大到小排序;

2)计算每一个学生及排在该学生之前的课程累计成绩。

举个例子,下表数学课程里按成绩从大到小排序是96、65、55。学号(S002)的数学课程累计成绩是96,学号(S001)的数学课程累计成绩是96+65=161,依此类推。

2. 课程累计成绩

累计问题要想到《跟猴子从零学会SQL》里讲过的用窗口函数来解决。

代码语言:javascript
复制
select *,
       sum(成绩) over (partition by 课程 
                       order by 成绩 desc 
                       rows between unbounded preceding and current row) as 课程累计成绩
from 学生成绩表;

查询结果:

把这个SQL查询查询结果命名为子查询t1。

这里使用了窗口函数的rows between … and …用法。含义是对“起始行”至“终止行”的字段1求和。

代码语言:javascript
复制
sum(字段1) over (partition by 字段2 
                 order by 字段3 
                 rows between 起始行and 终止行)

对于这道题要求得“每一个学生及排在该学生之前的课程累计成绩”,所以,“起始行”就是每个窗口的第一行(unbounded preceding),“终止行”是当前行(current row)。

3. 课程总成绩

根据指标定义:课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩。

前面得到分子:每个课程的累计成绩。

还需要得到分母:每个课程的课程总成绩。

每个课程的课程总成绩,涉及到“每个”要想到用“汇总分析”,按课程分组(group by),汇总(求职成绩和sum)

代码语言:javascript
复制
select 课程,sum(成绩) as 课程总成绩
from 学生成绩表
group by 课程;

查询结果:

把这个SQL查询查询结果命名为子查询t2。

3.累计占比

根据指标定义:课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩。

为了方便计算,需要将上面两步得到结果汇总到一个表里。

将第1步得到的每个课程的累计成绩查询结果记为表t1,第2步得到的每个课程的总成绩查询结果记为表t2,进行多表联结。

代码语言:javascript
复制
select t1.学号,
       t1.课程,
       t1.成绩,
       t1.课程累计成绩,
       t2.课程总成绩,
       t1.课程累计成绩/2.课程总成绩 as 累计成绩占比
from  t1
left join t2 
on t1.课程 = t2.课程;

把第1、2步的子查询t1、t2代入上面的SQL语句,就得到了:

代码语言:javascript
复制
select t1.学号,
       t1.课程,
       t1.成绩,
       t1.课程累计成绩,
       t2.课程总成绩,
       t1.课程累计成绩/t2.课程总成绩 as 累计成绩占比
from (
select *,
       sum(成绩) over (partition by 课程 
                       order by 成绩 DESC 
                       rows between unbounded preceding and current row) as 课程累计成绩
from 学生成绩表
) as t1
left join (
select 课程,sum(成绩) as 课程总成绩
from 学生成绩表
group by 课程
) as t2 
on t1.课程 = t2.课程;

查询结果

把这个SQL查询查询结果命名为子查询t3

4.分类

题目要求的是:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类

代码语言:javascript
复制
select t3.学号,
       t1.课程,
       t1.成绩,
       case when t3.累计成绩占比 > 0 and t3.累计成绩占比 <= 0.6 then 'A'
                 t3.累计成绩占比 > 0.6 and t3.累计成绩占比 <= 0.85 then 'B'
                 end as 类别
from t3
where t3.累计成绩占比 <= 0.85;

把第3步的子查询t3代入上面的SQL语句,就得到了:

代码语言:javascript
复制
select t3.学号,
       t3.课程,
       t3.成绩,
       case when t3.累计成绩占比 > 0 and t3.累计成绩占比 <= 0.6 then 'A'
            when t3.累计成绩占比 > 0.6 and t3.累计成绩占比 <= 0.85 then 'B'
            end as 类别
from (
select t1.学号,
       t1.课程,
       t1.成绩,
       t1.课程累计成绩,
       t2.课程总成绩,
       t1.课程累计成绩/t2.课程总成绩 as 累计成绩占比
from (
select *,
       sum(成绩) over (partition by 课程 
                       order by 成绩 DESC 
                       rows between unbounded preceding and current row) as 课程累计成绩
from 学生成绩表
) as t1
left join (
select 课程,sum(成绩) as 课程总成绩
from 学生成绩表
group by 课程
) as t2 
on t1.课程 = t2.课程
) as t3
where t3.累计成绩占比 <= 0.85;

【本题考点】

1.考查对帕累托分析思路的理解;

2.考查对窗口函数的了解,以及灵活使用来解决业务问题;

3.考查对多表联结的了解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猴子数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档