背景
最近 B 站的宣传片《后浪》又引起了大家对社会贫富差距加大对关注,所以想开发一个小程序来通过基尼系数来大致绘画出洛伦兹曲线来估计自己所在的财富位置。
算法
图片示例:
画洛伦兹曲线目前常被使用的方法主要有三种(引自百科):
几何计算法
即根据分组资料,按几何图形分块近似逼近计算的方法。
间接拟合法
即先拟合求出收入分配的概率密度函数,再根据概率密度函数导出洛伦兹曲线。
曲线拟合法
即选择适当的曲线直接拟合洛伦兹曲线,常用的曲线有二次曲线、指数曲线和幂函数曲线。
利用第一种方法不能得到洛伦兹曲线的表达式,只能用来计算基尼系数,但由于在计算分块面积时用直线近似地代替曲线,所估计的基尼系数要小于实际值,尤其在数据点较少时,误差较大。第二种方法由于计算收入分配的概率密度的复杂性,很难提出合适的概率函数。至于第三种方法,即直接用曲线方程去拟合洛伦兹曲线,应该不失为一种较好的方法,但目前主要的问题在于现有常用的曲线并不适用,曲线含义不明确,或拟合误差较大。
由于有效数据只有一个基尼系数,所以我选择曲线拟合法,曲线就用二次曲线,指数曲线,幂函数曲线都做一次吧。
考虑到函数曲线必经过(0,0)与(1,1)坐标点最终得到洛伦兹曲线公式为
二次曲线公式
1 | y = a * Math.pow(x, 2) - (a - 1) * x; |
指数曲线公式
1 | y = (Math.pow(a, x) - 1) / a; |
幂函数
1 | y = Math.pow(x, a); |
論文參考
在接近 0,1 时,感觉效果不理想。
想用简单采用直线与圆弧结合来画,但是這個算多段函數組合,不好計算,
最好參考了兩篇論文。
這篇是中科大的人 13 年寫的,他對我國基尼係數估計居然有 0.76 這麽高
Estimating Gini Coefficient Based on Hurun Report and
Poverty Line
對論文中的方程簡化后得
1 | y = x - x * Math.pow(1 - x, a); |
0-1 積分
其中 a>0 且 a<1
1 | y = -(1 / 2 - 1 - 1 / (a + 2) + 1 / (a + 1)); |
導函數
1 | y = 1 - Math.pow(1 - x, a) + (a * x) / Math.pow(1 - x, 1 - a); |
簡化原因是論文的兩個參數都接近于 1,設為 1 對模型影響不大,且只有一個可變參數比較容易計算。
第二篇是一個國外的金融統計教授 12 年寫的
論文中的方程為
1 | y = (Math.exp(a * x) - 1) / (Math.exp(a) - 1); |
0-1 積分
1 | y = (Math.exp(a) - 1) / (a * (Math.exp(a) - 1)); |
導函數
1 | y = (Math.exp(a * x) - 1) / (Math.exp(a) - 1); |
但这篇图像画出来后我觉得是不合理的。
最顶端的财富值与平均值的倍数应该远远大于平均值与最低端的倍数。因为无论多穷都需要有一个最低生存保障,而富人有多富一般人是想象不到的,同时
中国15年公布的5等分可支配收入也可以大致看出,高收入与中间收入比值是 2.30,中间收入与低收入比值的2.17,這兩個比值在比下為1.06。
中国19年公布的5等分可支配收入也可以大致看出,高收入与中间收入比值是 3.39,中间收入与低收入比值的3.05,這兩個比值在比下為1.11。
支持了财富值与平均值的倍数应该大于平均值与最低端的倍数,還可以判粗略斷出中國近幾年貧富分化還在加大。
所以为了更合理將这个的轉換后可得。
1 | y = 1 - Math.log((1-x) * (Math.exp(a) - 1) + 1)/a; |
暫時就用這兩個方程來模擬吧裏面的論文沒看太懂,還有就是很多論文要收費才可以看,或者看不懂。
开发
接下来就开始开发画二次曲线与幂函数曲线来拟合洛伦兹曲线的小程序。
开发框架选用 taro。
包含功能简介:
- 输入基尼系数画出洛伦兹曲线,
- 拖動坐標軸對應得到百分比的數值,和斜率。
- 對數據擬合得到模型,添加中國的五等分收入數據來擬合,可以推算收入水平在全國的百分比。
- 程序幫助説明。