【統計基礎】pythonで実装!ローレンツ曲線

python
Yamu
Yamu

今回はローレンツ曲線を
pythonで実装します

[PR]※本サイトには、プロモーションが含まれています

合わせて読みたい概要
【統計基礎】エクセルで学ぶ!ローレンツ曲線・ジニ係数の基礎理論エクセルを活用してローレンツ曲線とジニ係数を説明しています

ローレンツ曲線

ローレンツ曲線

所得や資産などの分布の不平等を視覚化

するために用いられます。

この曲線の縦軸は

縦軸に所得の累積値

横軸に人口の累積値

をプロットします

ローレンツ曲線は完全平等線から離れるほど不平等であることを示しているため
所得や資産の格差を視覚的に確認できる

今回利用するデータセット

日本、ドイツ、アメリカ、スウェーデン、中国の架空の所得データ

import pandas as pd
import numpy as np

# サンプルデータの作成
data = {
    'Japan': [300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
    'Germany': [320, 420, 520, 620, 720, 820, 920, 1020, 1120, 1220],
    'USA': [350, 450, 550, 650, 750, 850, 950, 1050, 1150, 1250],
    'Sweden': [310, 410, 510, 610, 710, 810, 910, 1010, 1110, 1210],
    'China': [280, 380, 480, 580, 680, 780, 880, 980, 1080, 1180]
}

df = pd.DataFrame(data)
print(df)

実行結果

   Japan  Germany   USA  Sweden  China
0    300      320   350     310    280
1    400      420   450     410    380
2    500      520   550     510    480
3    600      620   650     610    580
4    700      720   750     710    680
5    800      820   850     810    780
6    900      920   950     910    880
7   1000     1020  1050    1010    980
8   1100     1120  1150    1110   1080
9   1200     1220  1250    1210   1180
Yamu
Yamu

データが入りましたね!
早速ローレンツ曲線を実装します

ローレンツ曲線を実装する

import numpy as np
import matplotlib.pyplot as plt

def lorenz_curve(incomes):
    sorted_incomes = np.sort(incomes)
    cum_incomes = np.cumsum(sorted_incomes)
    lorenz_curve = np.insert(cum_incomes / cum_incomes[-1], 0, 0)
    x = np.linspace(0, 1, len(lorenz_curve))
    return x, lorenz_curve

# サンプルデータ
data = {
    'Japan': [300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
    'Germany': [320, 420, 520, 620, 720, 820, 920, 1020, 1120, 1220],
    'USA': [350, 450, 550, 650, 750, 850, 950, 1050, 1150, 1250],
    'Sweden': [310, 410, 510, 610, 710, 810, 910, 1010, 1110, 1210],
    'China': [280, 380, 480, 580, 680, 780, 880, 980, 1080, 1180]
}

plt.figure(figsize=(10, 6))

for country, income in data.items():
    x, lorenz = lorenz_curve(income)
    plt.plot(x, lorenz, label=country)

# 完全平等線
plt.plot([0, 1], [0, 1], color='black', linestyle='--')

plt.title('Lorenz Curve for Different Countries')
plt.xlabel('Cumulative Share of People')
plt.ylabel('Cumulative Share of Income')
plt.legend()
plt.grid(True)
plt.show()

実行結果

Yamu
Yamu

経済格差を表す
ローレンツ曲線が引けていますね

コードを説明します

ローレンツ曲線のプロットを作成する関数

ローレンツ曲線のプロットを作成する関数

def lorenz_curve(incomes):
    sorted_incomes = np.sort(incomes)
    cum_incomes = np.cumsum(sorted_incomes)
    lorenz_curve = np.insert(cum_incomes / cum_incomes[-1], 0, 0)
    x = np.linspace(0, 1, len(lorenz_curve))
    return x, lorenz_curve

1所得の低い順(昇順)にデータを並べる

sorted_incomes = np.sort(incomes)

sorted_incomesの中身

[ 300  400  500  600  700  800  900 1000 1100 1200]
[ 320  420  520  620  720  820  920 1020 1120 1220]
[ 350  450  550  650  750  850  950 1050 1150 1250]
[ 310  410  510  610  710  810  910 1010 1110 1210]
[ 280  380  480  580  680  780  880  980 1080 1180]

2.所得データを累積する

cum_incomes = np.cumsum(sorted_incomes)

cum_incomesの中身

[ 300  700 1200 1800 2500 3300 4200 5200 6300 7500]
[ 320  740 1260 1880 2600 3420 4340 5360 6480 7700]
[ 350  800 1350 2000 2750 3600 4550 5600 6750 8000]
[ 310  720 1230 1840 2550 3360 4270 5280 6390 7600]
[ 280  660 1140 1720 2400 3180 4060 5040 6120 7300]

3.累積データを全階級の総所得で割る

lorenz_curve = np.insert(cum_incomes / cum_incomes[-1], 0, 0)

cum_incomes[-1] は,cum_incomes

の最後の要素つまり総所得

np.insertは配列に値を挿入します

4.xプロットを作成する

x = np.linspace(0, 1, len(lorenz_curve))
return x, lorenz_curve

ローレンツ曲線に対応するxプロットをnp.linspaceで作成

xとlorenza_curveでyプロットを返しています

lorenz_curve関数で整理したデータからグラフを作成する

lorenz_curve関数で整理したデータからグラフを作成します

plt.figure(figsize=(10, 6))

for country, income in data.items():
    x, lorenz = lorenz_curve(income)
    plt.plot(x, lorenz, label=country)

# 完全平等線
plt.plot([0, 1], [0, 1], color='black', linestyle='--')

plt.title('Lorenz Curve for Different Countries')
plt.xlabel('Cumulative Share of People')
plt.ylabel('Cumulative Share of Income')
plt.legend()
plt.grid(True)
plt.show()

下記コードはループで

データを一つずつ取り出してlorenz_curve関数で

xプロットとyプロットを計算して

plt.plotでグラフを作成しています

for country, income in data.items():
    x, lorenz = lorenz_curve(income)
    plt.plot(x, lorenz, label=country)

最後に完全平等線を引いて

グラフタイトル, ラベル, x軸ラベル, y軸ラベル ,グリット線を

引いて完了です

# 完全平等線
plt.plot([0, 1], [0, 1], color='black', linestyle='--')

plt.title('Lorenz Curve for Different Countries')
plt.xlabel('Cumulative Share of People')
plt.ylabel('Cumulative Share of Income')
plt.legend()
plt.grid(True)
plt.show()
タイトルとURLをコピーしました