如何使用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
相关产品推荐
相关产品推荐

