You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas Python包获取洛伦兹曲线与基尼系数?

用Pandas计算洛伦兹曲线与基尼系数

数据预处理

首先确保你的数据是有序的——洛伦兹曲线需要基于从小到大排序的数值(比如收入、财富)。假设你有一个包含目标列的DataFrame,先对该列排序:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 构造示例数据(替换成你的实际数据)
df = pd.DataFrame({'income': np.random.randint(1000, 10000, size=100)})

# 按数值从小到大排序
sorted_values = df['income'].sort_values().reset_index(drop=True)
n = len(sorted_values)
total = sorted_values.sum()

计算洛伦兹曲线

洛伦兹曲线的x轴是累积样本占比(从0到1),y轴是累积数值占比(从0到1)。用Pandas的cumsum()可以快速计算累积和:

# 计算累积数值占比
cumulative_share = sorted_values.cumsum() / total
# 计算累积样本占比(包含0和1两个端点)
cumulative_pop = np.linspace(0, 1, n+1)
# 洛伦兹曲线的y值需要在开头补0,和x轴对齐
lorenz_y = np.insert(cumulative_share.values, 0, 0)

计算基尼系数

基尼系数的核心是洛伦兹曲线与对角线(绝对公平线)之间的面积的2倍。可以通过两种方式计算:

方法1:基于公式直接计算

gini = (2 * sorted_values.mul(np.arange(1, n+1)).sum()) / (n * total) - (n + 1) / n

方法2:基于洛伦兹曲线的面积计算

# 用梯形法计算洛伦兹曲线下的面积
area_lorenz = np.trapz(lorenz_y, cumulative_pop)
# 绝对公平线(对角线)下的面积为0.5,基尼系数=1 - 2*area_lorenz
gini = 1 - 2 * area_lorenz

可视化洛伦兹曲线

用Matplotlib画出洛伦兹曲线和绝对公平线:

plt.figure(figsize=(8,6))
plt.plot(cumulative_pop, lorenz_y, label='洛伦兹曲线')
plt.plot([0,1], [0,1], linestyle='--', color='gray', label='绝对公平线')
plt.xlabel('累积样本占比')
plt.ylabel('累积数值占比')
plt.title(f'洛伦兹曲线(基尼系数:{gini:.4f})')
plt.legend()
plt.show()

扩展:分组计算

如果需要按分组(如地区、行业)分别计算,可结合groupby():

def calculate_gini(group):
    sorted_vals = group.sort_values().reset_index(drop=True)
    n = len(sorted_vals)
    total = sorted_vals.sum()
    return (2 * sorted_vals.mul(np.arange(1, n+1)).sum()) / (n * total) - (n + 1) / n

# 按'group'列分组计算基尼系数
group_gini = df.groupby('group')['income'].apply(calculate_gini)

内容的提问来源于stack exchange,提问作者mouwsy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:35:52