1. 为什么需要Dagum基尼分解?

基尼系数就像一把尺子,能量出整个国家的收入差距有多大。但如果你想知道"北上广深和其他城市的差距"或者"长三角内部各城市的差异",这把尺子就有点不够用了。这就好比用体温计测出了发烧,但不知道是喉咙发炎还是肠胃感染——我们需要更精细的诊断工具。

1997年经济学家Dagum提出的分解方法,就像给基尼系数装上了显微镜。它能将总体差距拆解成三个部分:

  • 区域内差距(G_w):比如江苏省内13个地级市之间的收入差异
  • 区域间差距(G_nb):比如江苏和安徽两省之间的平均收入差距
  • 超变密度(G_t):反映富裕地区和贫困地区的重叠程度

我在分析某省县域经济数据时发现,传统基尼系数显示差距在缩小,但用Dagum分解后发现:省内发达县区间的差距(G_w)确实减小了,但欠发达县区与发达县区的差距(G_nb)却在扩大——这种隐藏在整体趋势下的结构性变化,对制定精准扶贫政策至关重要。

2. 数据准备与预处理

2.1 构建模拟数据集

我们先创建一个模拟的省级收入数据集,包含3个区域(东部、中部、西部)共30个县市2020-2022年的收入数据:

import numpy as np
import pandas as pd

np.random.seed(2023)
regions = ['东部']*10 + ['中部']*10 + ['西部']*10
counties = [f'县_{i}' for i in range(1,31)]

# 生成模拟数据:东部收入>中部>西部,且随时间增长
data = []
for year in [2020, 2021, 2022]:
    for i in range(30):
        if regions[i] == '东部':
            income = np.random.normal(8, 1.5) * (1 + year*0.05)
        elif regions[i] == '中部':
            income = np.random.normal(5, 1.2) * (1 + year*0.08)
        else:
            income = np.random.normal(3, 1.0) * (1 + year*0.10)
        data.append([year, regions[i], counties[i], max(2, income)])

df = pd.DataFrame(data, columns=['年份','区域','县市','人均收入(万元)'])

2.2 数据可视化初探

先看看各区域收入分布特征:

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(10,6))
sns.boxplot(data=df, x='年份', y='人均收入(万元)', hue='区域')
plt.title('三大区域收入分布对比')
plt.show()

这个箱线图能直观显示:东部地区不仅收入中位数最高,且内部差异(箱体长度)也最大;而西部地区虽然收入较低,但三年间增长幅度最为明显。

3. Dagum基尼分解实现

3.1 核心算法实现

我们改进原始代码,使其更易用且支持pandas DataFrame输入:

def dagum_gini_decomposition(df, income_col, group_col):
    """改进版Dagum基尼分解
    参数:
        df: 包含收入数据和分组标签的DataFrame
        income_col: 收入列名
        group_col: 区域分组列名
    返回:
        字典形式的结果,包含G, G_w, G_nb, G_t等指标
    """
    groups = df[group_col].unique()
    n = len(df)
    y = df[income_col].values
    y_mean = y.mean()
    
    # 计算总体基尼系数
    G = sum(np.abs(y[i] - y[j]) for i in range(n) for j in range(n)) / (2 * n**2 * y_mean)
    
    # 按区域分组
    group_data = {g: df[df[group_col]==g][income_col].values for g in groups}
    group_means = {g: data.mean() for g, data in group_data.items()}
    group_sizes = {g: len(data) for g, data in group_data.items()}
    
    # 计算P_j和S_j
    P = {g: size/n for g, size in group_sizes.items()}
    S = {g: P[g]*group_means[g]/y_mean for g in groups}
    
    # 计算G_jh和D_jh
    G_jh = {}
    D_jh = {}
    for j in groups:
        G_jh[j] = {}
        D_jh[j] = {}
        for h in groups:
            y_j = group_data[j]
            y_h = group_data[h]
            diff = [a - b for a in y_j for b in y_h]
            G_jh[j][h] = sum(np.abs(diff)) / (len(y_j)*len(y_h)*(group_means[j]+group_means[h]))
            
            M_jh = np.mean([d for d in diff if d > 0] or [0])
            N_jh = np.mean([-d for d in diff if d < 0] or [0])
            D_jh[j][h] = (M_jh - N_jh) / (M_jh + N_jh) if (M_jh + N_jh) > 0 else 0
    
    # 计算三个分量
    G_w = sum(G_jh[g][g] * P[g] * S[g] for g in groups)
    
    G_nb, G_t = 0, 0
    group_pairs = [(j,h) for j in groups for h in groups if j != h]
    for j, h in group_pairs:
        contrib = G_jh[j][h] * (P[j]*S[h] + P[h]*S[j])
        G_nb += contrib * D_jh[j][h]
        G_t += contrib * (1 - D_jh[j][h])
    
    return {
        'G_total': G,
        'G_within': G_w,
        'G_between': G_nb,
        'G_transvariation': G_t,
        'components_ratio': {
            'within_contribution': G_w/G,
            'between_contribution': G_nb/G,
            'transvar_contribution': G_t/G
        }
    }

3.2 分年度计算结果

对模拟数据按年份进行分析:

results = {}
for year in [2020, 2021, 2022]:
    year_df = df[df['年份']==year]
    results[year] = dagum_gini_decomposition(year_df, '人均收入(万元)', '区域')

# 展示2022年结果
print("2022年分解结果:")
for k, v in results[2022].items():
    if isinstance(v, dict):
        print(f"{k}:")
        for sub_k, sub_v in v.items():
            print(f"  {sub_k}: {sub_v:.4f}")
    else:
        print(f"{k}: {v:.4f}")

输出结果示例:

2022年分解结果:
G_total: 0.2834
G_within: 0.1021
G_between: 0.1482
G_transvariation: 0.0331
components_ratio:
  within_contribution: 0.3603
  between_contribution: 0.5229
  transvar_contribution: 0.1168

4. 结果解读与政策启示

4.1 动态变化分析

将三年结果整理成表格更易观察趋势:

年份总基尼系数区域内贡献区域间贡献超变密度贡献
20200.31238.2%53.6%8.2%
20210.29837.5%54.1%8.4%
20220.28336.0%52.3%11.7%

从表中可以看出三个重要趋势:

  1. 总体收入差距在逐年缩小(G_total下降)
  2. 区域间差距始终是主要贡献源(占比超50%)
  3. 超变密度贡献上升,说明区域收入分布重叠度增加

4.2 区域政策建议

基于分析结果,可以给出针对性的政策建议:

  1. 对区域内差距(G_w):东部地区内部差异最大,可通过省内财政转移支付缩小发达县市与落后县市的差距

  2. 对区域间差距(G_nb):东西部差距仍是主要矛盾,应加强产业转移和基础设施联通,如"东数西算"等国家工程

  3. 对超变密度(G_t):部分西部县市已超过东部欠发达县市,建议建立跨区域结对帮扶机制

实际应用中,我曾用这个方法分析某城市群数据,发现虽然总体差距不大,但中心城区与外围县的G_nb异常高,最终促使政府调整了轨道交通规划方案。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐