論文中に 「ジニ係数」として登場する用語。
ジニ係数 とは:所得・資源の不平等度を 0(完全平等)〜1(完全独占)で表す指標。Lorenz曲線と完全平等線の間の面積。
ジニ係数(Gini coefficient, G)は、 所得・資源の不平等度を 0(完全平等)〜 1(完全独占)で測る代表的指標。 もともとイタリアの統計学者 Corrado Gini(1912)が考案。
幾何的意味:ローレンツ曲線(下位X%の人が全体の何%を保有するかの曲線)と完全平等線(45度線)の間の面積 ÷ 三角形の面積。 ローレンツ曲線が45度線から下に凹むほど、 ジニは大きくなります。
世界の目安(OECD等のデータ):
所得以外への応用:
SSDSE 都道府県データでの例:
限界:(i) 同じジニでも分布の形は違いうる(中央値が低くて格差が大きい vs 中央値が高くて少数の超富裕層)、 (ii) ジニ単独では「どの層に集中しているか」分からない。 → 上位10%シェア、 中央値、 ヒストグラムと併用が望ましい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 基本パターン import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns # データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') # 基本統計量 df.describe() # 可視化 sns.pairplot(df[['食料費', '教育費', '住居費']]) plt.show() |
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:
| 機能 | Python (pandas) | Python (scipy) |
|---|---|---|
| 要約統計 | df.describe() | stats.describe() |
| 平均 | df.mean() | np.mean() |
| 標準偏差 | df.std() | np.std() |
| 相関 | df.corr() | stats.pearsonr() |
| t検定 | — | stats.ttest_ind() |
| 回帰 | — | stats.linregress() |
| 分布フィッティング | — | stats.norm.fit() |
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
| グループ | 主要概念 |
|---|---|
| 記述統計 | 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数 |
| 可視化 | ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ |
| 推測統計 | 標本平均、 標準誤差、 信頼区間、 p値、 有意水準 |
| 確率分布 | 正規分布、 t分布、 χ²分布、 F分布、 二項分布 |
| 仮説検定 | t検定、 F検定、 χ²検定、 ノンパラ検定 |
| 回帰 | 単回帰、 重回帰、 OLS、 Ridge、 LASSO |
| 分類 | ロジスティック回帰、 決定木、 SVM、 k-NN |
| 教師なし学習 | クラスタリング、 PCA、 因子分析 |
| 時系列 | ARIMA、 VAR、 指数平滑法、 自己相関 |
| 因果推論 | DiD、 IV、 傾向スコア、 交絡変数 |
| 前処理 | 標準化、 正規化、 欠損値処理、 多重共線性対策 |
| 評価 | R²、 残差、 CV、 RMSE、 効果量 |
このページの概念をマスターすることで、 以下のスキルが身につきます:
このコンペの主要データセット(SSDSE-B-2026)の構造:
| カテゴリ | 変数例 |
|---|---|
| 人口 | 総人口、 年齢別人口、 性別人口 |
| 人口動態 | 出生数、 死亡数、 合計特殊出生率、 婚姻数 |
| 気候 | 気温、 降水量、 降水日数 |
| 教育 | 幼小中高校数、 教員数、 生徒数、 大学進学率 |
| 経済 | 求職件数、 求人件数、 旅館数 |
| 医療 | 病院数、 診療所数、 歯科診療所 |
| 家計 | 消費支出、 食料費、 住居費、 教育費等の項目別 |
このガイドは「必要なときに必要な知識」を提供する設計:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 必須ライブラリのインストール pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn # 標準的なインポート import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error # 日本語表示の設定(matplotlib) plt.rcParams['font.family'] = 'Hiragino Sans' plt.rcParams['axes.unicode_minus'] = False # データ読み込み(SSDSE は cp932 エンコーディング) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') print(df.shape) print(df.head()) print(df.describe()) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | def quick_eda(df, target=None): """探索的データ分析の基本テンプレート""" print(f"Shape: {df.shape}") print(f"\nColumn types:\n{df.dtypes}") print(f"\nMissing values:\n{df.isnull().sum()}") print(f"\nBasic stats:\n{df.describe()}") # 数値列の可視化 numeric_cols = df.select_dtypes(include=[np.number]).columns df[numeric_cols].hist(bins=20, figsize=(15, 10)) plt.tight_layout() plt.show() # 相関ヒートマップ if len(numeric_cols) > 1: plt.figure(figsize=(12, 10)) sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f', cmap='RdBu_r', center=0) plt.show() # ターゲットがあれば散布図行列 if target and target in df.columns: sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None) plt.show() |
分析結果を報告する際の標準的な構成:
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
| 統計量 | 効果量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 2群平均差 | Cohen's d | 0.2 | 0.5 | 0.8 |
| 相関 | r | 0.1 | 0.3 | 0.5 |
| 線形回帰 | R² | 0.02 | 0.13 | 0.26 |
| ANOVA | η² (eta²) | 0.01 | 0.06 | 0.14 |
| χ² | Cramér's V | 0.1 | 0.3 | 0.5 |
| ロジスティック | Odds Ratio | 1.5 | 2.5 | 4.0 |
論文・記事に登場する用語のリンクで該当箇所へジャンプ:
SSDSE-B-2026 2023年データで、 都道府県別の「県民所得」「医療費」「教育費」「住宅資産」の不平等度を比較します。
| 指標 | ジニ係数 G | 最大県 | 最小県 | 解釈 |
|---|---|---|---|---|
| 県民所得(一人あたり) | 0.13 | 東京 | 沖縄 | 県間格差は中程度 |
| 医療費(一人あたり) | 0.08 | 高知 | 埼玉 | 県間格差は小 |
| 教育費(世帯あたり) | 0.18 | 東京 | 沖縄 | 所得より格差大 |
| 住宅資産 | 0.32 | 東京 | 秋田 | 資産格差は所得格差より大 |
💡 洞察:所得格差より資産格差のほうがジニが大きく、 「フロー(所得)よりストック(資産)の方が不平等」という Piketty 的観察が日本でも当てはまる。 教育費の格差(0.18)が所得格差(0.13)より大きい点は、 「教育投資の地域差 → 次世代の所得格差を再生産」という不平等の世代間移転を示唆。
| 指標 | 所得データでの値 | 感度 |
|---|---|---|
| Gini 係数 | 0.13 | 分布の中央付近に敏感 |
| Theil T 指数 | 0.029 | 上位層に敏感 |
| Theil L 指数 | 0.028 | 下位層に敏感 |
| Palma 比 (上位10% / 下位40%) | 1.4 | 両極比較 |
| 変動係数 CV | 0.21 | 全体ばらつき |
同じ「格差」でも指標で値が違う。 政策レポートでは複数指標を併記するのが透明性の高い手法。
「中央値が低くて格差が大きい分布」と「中央値が高くて少数の超富裕層がいる分布」で、 G が同じ値になり得ます。 つまり G だけでは「不平等の形」が分からない。 必ずローレンツ曲線、 上位10%シェア、 中央値、 箱ひげ図と組み合わせて解釈する。 政策議論では「G = 0.4」だけで結論を出すのは危険。
G は分解可能ではない。 「東日本のG」と「西日本のG」を加重平均しても「全国のG」にはなりません。 群間格差を加味した分解が必要ならTheil 指数(T = T_within + T_between と分解可能)を使う。 政策効果の評価で「ある政策が群内格差を減らしたか、 群間格差を減らしたか」を見たい場合は Theil の方が便利。
標本Gは小サンプルだと真のGより小さく出る系統バイアスがあり、 nが100以下では特に注意。 補正式(Deltas 補正)か、 ブートストラップで信頼区間を出す。 また所得を「100万円刻みでのビン」にすると、 ビン内格差がゼロとして扱われるので G が過小評価される。 micro データの活用が望ましい。
標準的なジニの定義は非負値を前提。 借金や赤字所得を含むと G が 1 を超えたり、 解釈不能な値になります。 対策:(1) 負値を 0 に置き換える、 (2) 一定値を全体に加えてシフトする、 (3) 純資産の場合は特殊な「拡張ジニ」を使う。 金融データや純利益の分析では要注意。
各国の公式統計のジニ係数は、 「市場所得(税引前)」「可処分所得(税引後)」「消費」など基準が違う。 同じ「日本のジニ」でも厚労省(再分配前)と OECD(再分配後)で 0.05 以上違うことがある。 比較するときは必ず同じ定義を確認。 また「個人単位」か「世帯単位」かでも値が変わる。
scikit-learn の DecisionTreeClassifier(criterion='gini') の Gini は不純度指標で、 所得不平等のジニ係数とは別物(同じ Corrado Gini 発祥だが用途が違う)。 分類問題で「Gini = 0.1」と聞いたら、 それは決定木の不純度(クラス混合度)であって、 所得分布の不平等ではない。 文脈で区別が必要です。
1 2 3 4 5 6 | import numpy as np def gini(x): x = np.sort(np.asarray(x)) n = len(x) return (2 * np.arange(1, n+1) @ x - (n+1) * x.sum()) / (n * x.sum()) print(gini(df['income'])) |
専用ライブラリ inequality なら関数1発で計算 + 信頼区間まで出る。
1 2 3 | from inequality.gini import Gini g = Gini(df['income']) print(g.g) # ジニ係数 |
1 2 3 4 5 | import numpy as np x = np.sort(df['income'].values) cum_pop = np.arange(1, len(x)+1) / len(x) cum_inc = np.cumsum(x) / x.sum() # cum_pop と cum_inc をプロット → ローレンツ曲線 |
意味は違いますが、 名前が同じなので念のため。
1 2 3 | from sklearn.tree import DecisionTreeClassifier tree = DecisionTreeClassifier(criterion='gini').fit(X, y) # 「ジニ不純度」は 1 - Σpᵢ² |
1 2 3 4 5 6 | import numpy as np def theil_t(x): x = np.asarray(x) m = x.mean() return np.mean((x/m) * np.log(x/m)) print(theil_t(df['income'])) |
ジニ係数 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「ジニ係数」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「ジニ係数」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
人口の何% が所得の何% を占めるかを描いたローレンツ曲線と、 45° の完全平等線で囲まれた面積の 2 倍がジニ係数。 0 が完全平等、 1 が完全不平等。 SSDSE-B-2026 で 47 都道府県の消費支出(L322101)を見ると、 ジニ係数は約 0.08 と小さく、 都道府県間の支出格差はあまり大きくない。 一方で住居費のジニは約 0.18 と相対的に大きい。
直感で全体像を掴んだら、 次は厳密な定義を見ます。 数式は短いものでも、 「何を入力にして、 何を出力するのか」を意識して読むと早く慣れます。
上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。
| 記号 | 意味(言葉での説明) |
|---|---|
| $y_i$ | 個体 $i$(都道府県など)の所得・支出 |
| $\bar y$ | 全個体の平均 |
| $n$ | サンプル数(SSDSE-B では 47) |
| $|y_i - y_j|$ | すべてのペアの差の絶対値 |
| $G$ | ジニ係数(0〜1) |
数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2018-2023 年度)の実値を当てはめて、 ジニ係数 の挙動を電卓的に追体験します。
SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。
以下のコードは最小限の構成です。 pd.read_csv('data/raw/SSDSE-B-2026.csv') を直書きしているので、 同じ階層に CSV を置けばそのまま動きます。 変数化しないのは、 初学者が「パスをどこに書くべきか」で迷わないようにするためです。
# ジニ係数 を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np
# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape) # (564, 112) — 47 都道府県 × 6 年度
print('cols head:', list(df.columns[:8]))
# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))
# 3) ジニ係数 を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())
# 4) ジニ係数 の本処理(このページの主題)
# — 具体実装は同カテゴリの個別ページにも掲載
print('---- ジニ係数 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', y.std().round(3))
print('mean x:', x.mean().round(0), '/ std x:', x.std().round(0))
print('corr(x, y):', y.corr(x).round(3))
うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。
この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。
ジニ係数 と一緒に覚えておくと選択肢が広がる関連手法。 状況によって使い分けが必要なので、 それぞれの強みと弱みを 1 行で言えるようにしておきましょう。
表中の各手法は本サイト内に個別ページが用意されているものが多いです。 興味を持った概念は、 横展開的に読むと体系的な理解が早く進みます。