- Published on
经济学的基尼系数与机器学习的基尼指数一样吗?
- Authors
- Name
- Jason Huang
- @zesenhhh
Table of Contents
最近在进行推荐系统头部效应的分析评估,调查后想采用基尼指数作为评估指标,脑海里有印象这是经济学/社会学中的概念,但也有印象在机器学习的决策树中也有这个概念,一时有些困惑,这两个是一样的吗?
先说结论,这两个都基于相同的数学原理——测量集合内部的不均匀性或不平等性。虽然应用领域与公式不同,但核心思想是相通的。
基尼系数(Gini Coefficient)在经济学中也称为基尼指数(Gini Index),中文似乎前者说得多一点,而机器学习中的基尼指数称作可能称作基尼不纯度更好,但在网上的好多文章与书籍中经常被称作基尼指数。
经济学中的基尼系数
基尼系数(Gini Coefficient)由意大利统计学家科拉多·基尼(Corrado Gini)在 1912 年提出的,用来衡量一个国家或地区收入分配的不平等程度,判断收入分配公平程度的指标,此系数是一种比值,在 0 和 1 之间。
基尼系数的计算原理是基于洛伦兹曲线(Lorenz Curve)。
想象一下,把一个社会中所有人按照收入从低到高排序,然后画一个图表:横轴表示人口的累计百分比,纵轴表示收入的累计百分比。
如果收入完全平等,每个人的收入都一样,那么这条曲线就是一条 45 度的直线。但在现实中,收入分配往往是不平等的,所以会形成一条弧线(洛伦兹曲线)。基尼系数就是洛伦兹曲线与 45 度线之间的面积占整个三角形面积的比例,也就是:G = A / (A+B)。
- A 是 Lorenz Curve 与完全平等线(对角线)之间的面积;
- B 是 Lorenz Curve 与坐标轴之间的面积。
它的取值范围在 0 到 1 之间:
- 当基尼系数为0时,表示收入完全平等;
- 当基尼系数为1时,表示收入完全不平等(一个人占有全部收入)。
一般认为,基尼系数超过 0.4 就表明收入差距较大。
Python 中基于 G = A / (A+B) 的实现代码如下:
def gini_coefficient(data):
"""
计算基尼系数的标准积分∫方法
参数:
data: 包含数值的数组/列表
返回:
float: 基尼系数,范围在[0,1]之间
"""
# 1. 确保数据是numpy数组并排序
data = np.array(data)
sorted_data = np.sort(data)
n = len(data)
# 2. 计算洛伦兹曲线的坐标
# cumsum给出累积总和,再归一化
cumulative_proportion = np.cumsum(sorted_data) / np.sum(sorted_data)
# population_proportion代表人口比例,均匀分布
population_proportion = np.arange(1, n + 1) / n
# 3. 计算基尼系数
# 基尼系数 = 1 - 2 * 洛伦兹曲线下的面积
# 使用梯形法则对给定的 y 值进行积分。它的主要作用是对离散数据点进行积分,通常用于近似计算曲线下面积。
area = np.trapz(cumulative_proportion, population_proportion)
gini = 1 - 2 * area
return gini
在实际应用中,很多国家和国际组织会定期发布基尼系数数据。比如联合国开发计划署(UNDP)就经常使用基尼系数来比较不同国家的收入分配状况。不过值得注意的是,由于各国统计口径可能存在差异,在进行国际比较时需要谨慎。
NOTE
基尼系数主要用于经济学中评估收入或财富分配的不平等程度,也可以应用与推荐系统的评估,可以用于衡量推荐结果的多样性或公平性。
例如,当一个推荐系统倾向于将流量集中在少数热门物品上时,基尼系数会较高,反映出推荐结果的不平衡;而当推荐结果能够较为均匀地覆盖多个物品时,基尼系数会较低,表明推荐的多样性更高。
这种应用可以帮助评估系统是否存在”马太效应”,并指导模型优化以更好地平衡用户体验与推荐效率。
经济学中的基尼系数除了常用的基于洛伦兹曲线下面积占整个三角形面积的比例这个计算方法外,还有多种代数计算方法。这些代数方法在实际应用中具有计算简便、适用于离散数据等优点,比如基于累积分布的代数公式:
其中:
- xi 表示第 i 个个体的收入,且 x1 ≤ x2 ≤⋯≤ xn。
- n 是总个体数。
该公式通过对个体收入进行排序,并考虑每个个体在总收入中的相对位置,计算基尼系数。它利用了累积分布的特性,将基尼系数转化为收入排序后的加权和与总收入的比值,从而简化了计算过程。
# Function to calculate Gini coefficient
def gini_coefficient(data):
"""
计算基尼系数的一种代数方法(实现上述公式)
参数:
data: 包含数值的数组/列表
返回:
float: 基尼系数,范围在[0,1]之间
"""
# 1. 对数据进行排序
sorted_data = np.sort(data)
n = len(data)
# 2. 计算累积和
cumulative_data = np.cumsum(sorted_data)
# 3. 计算基尼系数
# numerator: 排序后的位置(1到n)与对应数值的乘积之和
numerator = np.sum((np.arange(1, n+1)) * sorted_data)
# denominator: 数据总和乘以数据长度
denominator = cumulative_data[-1] * n
# 使用基尼系数计算公式
gini = (2 * numerator) / denominator - (n + 1) / n
return gini
为什么采用这种方法?
- 计算简便:对于离散数据,这种方法只需要对数据进行排序并进行简单的加权求和,适合手工计算或编程实现。
- 适用于离散数据:相比于连续的洛伦兹曲线,这种方法更适合处理实际数据集中存在的离散个体收入。
机器学习中的基尼指数
基尼指数通常用于机器学习中的决策树算法。在构建决策树时,用于选择最佳分裂特征,以提高模型的分类性能和泛化能力。基尼指数代表了数据的不纯度,基尼系数越小,不纯度越低,特征越好。
决策树节点分裂选择过程:
- 在构建决策树时,基尼指数用于衡量当前节点的纯度。
- 算法会选择使基尼指数降低最多的特征作为分裂点。
- 目标是通过分裂,使子节点尽可能“纯”(即每个子节点中样本的类别尽量单一)。
总结
虽然基尼指数和基尼系数都是以 Corrado Gini 命名,并且都涉及到不平等或不纯度的概念,但它们的应用领域和具体计算方法有所不同,这两个指标的主要区别在于:
- 应用领域不同:决策树的基尼指数主要用于特征选择和树的生长过程,帮助算法在每个节点选择最优的分割特征;而经济学的基尼系数则用于评估社会财富分配状况。
- 计算方法不同:基尼指数关注的是类别的分布情况,而基尼系数则需要考虑收入的累计分布,通过洛伦兹曲线来计算。
- 含义解释不同:基尼指数越小表示数据越"纯",这在机器学习中是我们想要的结果;而基尼系数越小表示收入分配越平等,这在经济学中通常被认为是较为理想的状态。
参考

