在分析连续变量的数据时,我们常常需要分析数据的各种指标,如离散程度、中位数、平均值、方差,甚至有时候需要对数据进行标准化后才能知道数据反映的结果。假设想要分析数据的分布以及研究数据中的特殊部分(如人群中最穷的人或最富的占比),可以尝试用基尼系数去判断。
基尼系数的好处在于,先对数据进行排序后,按照累次占比基于其权重,由于是分批累次加入数据所看到的影响,所以可以从变量曲线的斜率能够看到数据在人群里哪一部分是能造成较大影响的。
以下是一个例子:
library(ineq) # 包含计算基尼系数的函数
library(ggplot2)
set.seed(123) # 设置随机种子保证结果可重复
# 生成三个不同分布的收入数据
income_equal <- rep(50000, 1000) # 完全平等分布
income_normal <- rnorm(1000, 50000, 10000) # 正态分布
income_unequal <- c(rnorm(800, 30000, 5000), rnorm(200, 100000, 20000)) # 高度不平等分布
# 创建数据框
income_data <- data.frame(
ID = 1:1000,
Equal = income_equal,
Normal = income_normal,
Unequal = income_unequal
)
# 查看前几行数据
head(income_data)
# 计算三种收入分布的基尼系数
gini_equal <- Gini(income_data$Equal)
gini_normal <- Gini(income_data$Normal)
gini_unequal <- Gini(income_data$Unequal)
# 输出结果
cat("完全平等分布的基尼系数:", round(gini_equal, 3), "\n")
cat("正态分布的基尼系数:", round(gini_normal, 3), "\n")
cat("高度不平等分布的基尼系数:", round(gini_unequal, 3), "\n")
# 绘制三种分布的洛伦兹曲线
par(mfrow = c(1, 3)) # 设置1行3列的图形布局
plot(Lc(income_data$Equal), main = "完全平等分布", col = "blue")
plot(Lc(income_data$Normal), main = "正态分布", col = "green")
plot(Lc(income_data$Unequal), main = "高度不平等分布", col = "red")
par(mfrow = c(1, 1)) # 恢复默认图形布局
# 将数据转换为长格式以便绘图
library(tidyr)
income_long <- pivot_longer(income_data, cols = -ID,
names_to = "Distribution",
values_to = "Income")
# 绘制直方图
ggplot(income_long, aes(x = Income, fill = Distribution)) +
geom_histogram(bins = 30, alpha = 0.6, position = "identity") +
facet_wrap(~Distribution, scales = "free") +
labs(title = "不同收入分布的直方图比较",
x = "收入", y = "频数") +
theme_minimal()
输出:
完全平等分布的基尼系数: 0
正态分布的基尼系数: 0.111
高度不平等分布的基尼系数: 0.308
从输出可以更直观地看到,所画出的洛伦兹曲线(横轴是由小到大的数据组数量,纵轴是其所占有的收入)越接近对角线,说明数据的分配越平等,即越接近线性,从而可以在不受具体数值的影响下看到数据的分布特点。