sql实现均衡度计算(洛伦兹曲线,基尼系数)

这篇具有很好参考价值的文章主要介绍了sql实现均衡度计算(洛伦兹曲线,基尼系数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.基本介绍

均衡度:使用洛伦兹曲线计算基尼系数,基尼系数代表均衡度,系数值越大证明越不均衡度,值约小证明越均衡。【例:拿贫富差距人口收入举例,将累计人口百分比作X轴,累计收入百分比作Y轴,绘制贫富差距洛伦兹曲线如下图,使用面积法计算:基尼系数=A面积/(A面积+B面积)】(这里基尼系数不会大于1,也不会小于零)。

sql实现均衡度计算(洛伦兹曲线,基尼系数),sql,数据库

2.使用场景

(一)职权履行均衡度

假设某执法单位有职权2000项,按照职权触发次数由低到高排序,等分10份,及每200个职权分一个挡位,计算X轴(累计职权数百分比)、Y轴(累计职权触发次数百分比)如下表:

职权分档排序 每档职权触发次数 X轴(职权累计百分比) y轴(职权累计触发次数百分比)
1-200 0 10% 0
201-400 200 20% 0.7%
401-600 300 30% 1.8%
601-800 500 40% 3.6%
801-1000 550 50% 5.6%
1001-1200 999 60% 9.3%
1201-1400 1111 70% 14%
1401-1600 1765 80% 20%
1600-1800 1800 90% 26%
1800-2000 20000 100% 100%

绘制洛伦兹曲线如下图:

sql实现均衡度计算(洛伦兹曲线,基尼系数),sql,数据库

如图计算A、B区域面积得基尼系数为0.8,可得此单位处罚职权履行不均衡。

(二)案件月度分布均衡度

将某一执法单位每月案件量按照由小到大顺序排序,计算X轴(累计月份百分比)、Y轴(累计月案件量百分比)如下表:

月份 月检查量(万) X轴(累计月份百分比) Y轴(累计月检查量百分比)
6月 1 8% 2%
11月 1 16% 3%
12月 1 25% 5%
1月 2 33% 8.3%
4月 4 42% 15%
2月 5 50% 23.3%
8月 5 58% 31.6%
3月 6 67% 42%
7月 8 75% 55%
5月 9 83% 70%
9月 9 92% 85%
10月 9 100% 100%

绘制洛伦兹曲线如下图:

sql实现均衡度计算(洛伦兹曲线,基尼系数),sql,数据库

如图计算A、B区域面积得基尼系数为0.36,可得此单位检查月度分布较为均衡。文章来源地址https://www.toymoban.com/news/detail-821269.html

3.sql实现(函数)

计算均衡度(基尼系数)自定义函数(十等份计算,参数为查询到数据的sql语句的字符形式)
​
-- 根据批量数据进行分值切割从而计算均衡度
CREATE OR REPLACE FUNCTION JHD_JN(TABLENAME VARCHAR2) RETURN NUMBER 
AS
T_COUNT NUMBER;
QUERY_SQL VARCHAR2(20000);
BEGIN
QUERY_SQL:='
-- 先计算得到各维度不同职权code的被触发数量
WITH POWER_ALL AS (' || TABLENAME || '
),
-- 对上方进行10等分切割得到每段的长度以及需要在第一段补充(0,0)的长度
-- eg: aa:73 bb:2   (每段73个但是第一段73-2个)
POWER_SUM AS (
SELECT 
    CASE 
        WHEN MOD((SELECT COUNT(1) FROM POWER_ALL), 10) > 0 
            THEN TRUNC(ROUND((SELECT COUNT(1) FROM POWER_ALL)/10, 1))+1 
        ELSE ROUND((SELECT COUNT(1) FROM POWER_ALL)/10) 
    END aa,
    CASE 
        WHEN MOD((SELECT COUNT(1) FROM POWER_ALL), 10) > 0 THEN
            10-MOD((SELECT COUNT(1) FROM POWER_ALL),10)
        ELSE 0
    END bb
FROM dual
),
-- 如果当前列数不满足等份便在开头增加上一步的余数个0,0
POWER_ALL_DATA AS (
    SELECT tb1.*,ROWNUM SORT FROM (
        SELECT 
            ''0'' NAME,
            CASE 
                WHEN (SELECT bb-aa FROM POWER_SUM) > 0 THEN 0
                ELSE NULL
            END ALL_COUNT 
        FROM (SELECT 1 FROM dual CONNECT BY LEVEL <= (SELECT bb FROM POWER_SUM))
    
        UNION ALL
        
        SELECT NAME,ALL_COUNT FROM POWER_ALL
    ) tb1 WHERE tb1.ALL_COUNT IS NOT NULL
),
-- 先根据上方的aa对数据进行分割,假如有余数的话便先加上这个余数进行分割
POWER_LB1 AS (
SELECT tb1.ll-((SELECT aa FROM POWER_SUM)-1) s,tb1.ll e 
FROM (
    SELECT LEVEL ll FROM dual CONNECT BY LEVEL < (SELECT COUNT(1) FROM POWER_ALL_DATA) + 1 + CASE WHEN (SELECT aa-bb FROM POWER_SUM) > 0 AND (SELECT bb FROM POWER_SUM) > 0 THEN (SELECT bb FROM POWER_SUM) ELSE 0 END
) tb1 WHERE MOD(tb1.ll, (SELECT aa FROM POWER_SUM)) = 0
),
-- 如果有余数的话再次进行处理,从而实现如果有余数的话将第一段减少
POWER_LB AS (
SELECT 
    CASE 
        WHEN (SELECT aa-bb FROM POWER_SUM) > 0 AND (SELECT bb FROM POWER_SUM) > 0 AND s != 1 THEN s - (SELECT bb FROM POWER_SUM)
        ELSE s
    END s,
    CASE 
        WHEN (SELECT aa-bb FROM POWER_SUM) > 0 AND (SELECT bb FROM POWER_SUM) > 0 THEN e - (SELECT bb FROM POWER_SUM)
        ELSE e
    END e,
    ROWNUM*10 r
FROM POWER_LB1
),
-- 获取x和y轴数据(包含原点一共11个)
POWER_RESULT AS (
SELECT tb1.*,ROWNUM so FROM (
    SELECT 0 bfb,0 r FROM dual
​
    UNION
​
    SELECT  
        CASE 
            WHEN (SELECT SUM(ALL_COUNT) FROM POWER_ALL_DATA) = 0 THEN 0
            ELSE ROUND((SELECT SUM(ALL_COUNT)*100 FROM POWER_ALL_DATA WHERE SORT <= tb1.e)/(SELECT SUM(ALL_COUNT) FROM POWER_ALL_DATA),5)
        END bfb,
        r
    FROM POWER_LB tb1
) tb1 ORDER BY r
),
-- 计算面积一个三角形,九个梯形的和
POWER_DOWN_AREA AS (
SELECT SUM(jhd) DOWN_AREA FROM (
    SELECT 
        CASE 
            -- 三角形面积
            WHEN tb1.r < 1 THEN (SELECT ROUND(bfb*r/2 , 2)FROM POWER_RESULT WHERE so = 2)
            WHEN tb1.r = 11 THEN 0
            -- 九个梯形面积
            ELSE ROUND((tb1.bfb+(SELECT bfb FROM POWER_RESULT WHERE so = tb1.so + 1))*((SELECT r FROM POWER_RESULT WHERE so = tb1.so + 1) - tb1.r)/2,2)
        END jhd,
        tb1.*
    FROM POWER_RESULT tb1
))
​
-- 基尼系数(如果参数查询无数据则返回1,基尼系数最大为1。如果总面积为0则设置基尼系统为1)
-- 返回结果为百分数 eg:0.3 返回30
SELECT 
    CASE 
        WHEN ROUND(bfb*r/2, 2) = 0 THEN 100
        ELSE
            --NVL(ROUND(bfb*r/2, 2) - (SELECT * FROM POWER_DOWN_AREA),100)
            --ROUND(bfb*r/2, 2)
            NVL(ROUND((ROUND(bfb*r/2, 2) - (SELECT * FROM POWER_DOWN_AREA))/ROUND(bfb*r/2, 2),2),1)*100
    END AREA 
FROM (SELECT * FROM POWER_RESULT ORDER BY SO DESC) WHERE ROWNUM < 2';
EXECUTE IMMEDIATE QUERY_SQL  INTO T_COUNT;
RETURN  T_COUNT;   
END JHD_JN;
​
​
​
-- 直接根据X,Y数组进行均衡度计算
CREATE OR REPLACE FUNCTION JHD_JN1(TABLENAME VARCHAR2) RETURN NUMBER 
AS
T_COUNT NUMBER;
QUERY_SQL VARCHAR2(20000);
BEGIN
QUERY_SQL:='
WITH POWER_RESULT AS (
' || TABLENAME || '
),
POWER_DOWN_AREA AS (
SELECT SUM(jhd) DOWN_AREA FROM (
    SELECT 
        CASE 
            -- 三角形面积
            WHEN tb1.X < 1 THEN (SELECT ROUND(Y*X/2 , 2)FROM POWER_RESULT WHERE so = 2)
            WHEN tb1.X = (SELECT COUNT(1) FROM POWER_RESULT) THEN 0
            -- 多个梯形面积
            ELSE ROUND((tb1.Y+(SELECT Y FROM POWER_RESULT WHERE so = tb1.so + 1))*((SELECT X FROM POWER_RESULT WHERE so = tb1.so + 1) - tb1.X)/2,2)
        END jhd,
        tb1.*
    FROM POWER_RESULT tb1
))
​
-- 基尼系数(如果参数查询无数据则返回1,基尼系数最大为1。如果总面积为0则设置基尼系统为1)
-- 返回结果为百分数 eg:0.3 返回30
SELECT 
    CASE 
        WHEN ROUND(Y*X/2, 2) = 0 THEN 100
        ELSE
            NVL(ROUND((ROUND(Y*X/2, 2) - (SELECT * FROM POWER_DOWN_AREA))/ROUND(Y*X/2, 2),2),1)*100
    END AREA 
FROM (SELECT * FROM POWER_RESULT ORDER BY SO DESC) WHERE ROWNUM < 2';
EXECUTE IMMEDIATE QUERY_SQL  INTO T_COUNT;
RETURN  T_COUNT;   
END JHD_JN1;

到了这里,关于sql实现均衡度计算(洛伦兹曲线,基尼系数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一、实现方案        贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条

    2024年02月11日
    浏览(52)
  • 【数值计算方法】曲线拟合与插值:Lagrange插值、Newton插值及其python/C实现

    目录 一、近似表达方式 插值(Interpolation) 拟合(Fitting) 投影(Projection) 二、插值 1. Lagrange插值 Lagrange插值公式 线性插值(n=1) 抛物插值(n=2) python实现 C语言实现 2. Newton插值 python实现 C语言实现         插值、拟合和投影都是常用的近似表达方式,用于对数据或函数进

    2024年02月02日
    浏览(44)
  • 通过参数化可变形曲线直接从 X 射线投影数据计算分割研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 第一部分  2.2 第2部分 2.3 第3部分 

    2024年02月10日
    浏览(35)
  • 云计算:从基础架构原理到最佳实践之四:云计算环境中负载均衡的实现方法

    作者:禅与计算机程序设计艺术 云计算(Cloud Computing)作为一种新的经济发展方式,颠覆了传统IT部门所承担的物理服务器、存储设备等基础设施的运营管理工作。借助网络的快速发展,云计算不断吸纳新型应用软件、数据服务等资源,迅速扩充服务器资源。同时,也催生了

    2024年02月08日
    浏览(37)
  • python计算相关系数R

    方法一: 方法二 参考:https://mp.weixin.qq.com/s/nABJf4WBR4Y4oEZiYKPK4Q

    2024年02月13日
    浏览(38)
  • js计算皮尔逊相关系数

    代码如下; 调用:  效果:

    2024年01月25日
    浏览(41)
  • 信度系数的计算公式你了解吗?

    信度分析用于测量样本回答结果是否可靠,即样本有没有真实作答量表类题项。 重要提示: 信度分析仅仅是针对 量表数据,非量表数据一般不进行信度分析。 1.SPSSAU操作如下图: SPSSAU仪表盘 2.案例背景 此案例分析心理学中研究运动员意志品质的调查问卷数据,共对312人进行

    2024年02月05日
    浏览(42)
  • 众智科学:计算聚集系数和邻里重叠度

    实验内容: 输入:任意的 有向图 输出: 1)每个节点的聚集系数 2)每个节点对的邻里重叠度 相关定义介绍: 聚集系数:节点A的聚集系数 = A的任意两个朋友之间也是朋友的概率(即邻居间朋友对的个数除以总对数) 邻里重叠度:与A、B均为邻居的节点数/ 与节点A、B中至少

    2024年02月16日
    浏览(38)
  • R2决定系数(R2 得分)详细计算

    定义       R2决定系数是对线性模型评估的一种评价指标,其值最大为1,最小为0,当值越接近于1,则说明模型越好;值越接近于0,则模型越差。 计算过程 使用 y i {text{y}}_i y i ​ 表示真实的观测值,使用 y _ overset{_}{mathop y} y _ ​ 表示真实观测值的平均值,使用 y i ^

    2024年02月04日
    浏览(42)
  • Pandas实战100例 | 案例 25: 计算相关系数

    案例 25: 计算相关系数 知识点讲解 在统计分析中,了解变量之间的关系是非常重要的。相关系数是衡量变量之间线性相关程度的一种方法。Pandas 提供了 corr 方法来计算列之间的相关系数。 相关系数 : 相关系数的值范围在 -1 到 1 之间。接近 1 表示正相关,接近 -1 表示负相关

    2024年01月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包