1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

生命と数理①:確率統計×ミトコンドリア・イブ×ピケティ

1
Last updated at Posted at 2026-04-27

1. はじめに

ちょっとした思考実験です。
1万人の参加者がメダルゲーム大会に挑戦します。

全員が最初にメダルを1枚だけ持っています。
ゲームを1回プレイすると、結果に応じて返ってくるメダルの枚数が変わります。

  • 外れ:0枚(その場で脱落)
  • 小当たり:2枚
  • 大当たり:5枚

返ってきたメダルの枚数だけ、次のラウンドで再びゲームができます。
つまり、

  • 運が良ければチャンスが増えてゲームが続く
  • 運が悪ければメダルが尽きて即終了
    というシンプルな仕組みです。

以下は、6人で大会を行った場合のイメージです。
脱落したラウンドに ❌ をつけています。
アルファベットが挑戦者、カッコ内の数字がメダルの枚数です。
メダルが尽きた人は、それ以降ゲームに参加できません。

このメダルゲーム大会を延々と続けたとき、最後まで残る人は 1人だけ になるでしょうか。
それとも、何人かが永遠に生き残り続けるのでしょうか。
直感では「何人か残りそう」に思えます。
ところが、このゲームで最後の一人になったラッキーガールが人類史上に存在します。
その人こそが、ミトコンドリア・イブです。

この記事では、このミトコンドリア・イブをテーマに数理モデルによるシミュレーションを行います。
そして最後に、この構造が“まったく別の領域”にも現れることを見ていきます。

2. ミトコンドリア・イブって?

私たちの細胞の中にはミトコンドリアという小さな器官があります。
生命活動に必要なエネルギーをつくる、いわば細胞の発電所です。
このミトコンドリアは、細胞核のDNAとは別に独自のDNA(mtDNA)を持っています。
そしてこの mtDNA は、母から子へ、ただ一方向にだけ受け継がれます。
たとえば、あなたを3代さかのぼると、
ひいおじいさん・ひいおばあさんは、合わせて8人います。
しかし、あなたがmtDNAを受け継いだのはそのうち母の母の母にあたるひいおばあさんただ一人です。

  • 父方のmtDNAは受け継がれない
  • 母の父方のmtDNAも受け継がれない
  • 母の母の母…と一本の線だけが続いていく

この「一本の母系の線」をずっとさかのぼっていくと、
現在生きているすべての人類の母系が、必ずどこかで一点に収束します。
その収束点にいる女性こそが、ミトコンドリア・イブと呼ばれる人物です。

2.1. ミトコンドリア・イブについての誤解

「ミトコンドリア・イブ」という名前を聞いたことがある方も多いと思います。
ただ、この言葉にはいくつかありがちな誤解があります。
❌ 人類最初の女性のこと
ミトコンドリア・イブは、旧約聖書的な“最初の女性”ではありません。
彼女が生きていたとされる約20万年前にも、数千〜数万の女性がいました。
彼女が特別なのは、「現在生きているすべての人類の母系をたどると、そこに行き着く」
という一点だけです。
“最初の人”ではなく、“母系が途切れずに残った人”。
❌ ルーシー(Lucy)のことだよね?
ルーシーはかつて「最古の人類」として有名になった化石の女性で、
約380万年前の人とされています。
しかし、700万年前の化石も見つかっており、
ルーシーが“最初の女性”というわけでもありません。
そしてもちろん、ミトコンドリア・イブ(約20万年前)とは全く別人です。

2.2. 4人の女性による母系モデル

ここで、母系がどのように続いたり途絶えたりするのか、
4 人の女性の例で見てみます。

  • Anna
    子どもを産むことなく世を去りました。
    → Anna の母系はここで途絶えます。
  • Bella
    2 人の女の子を生みました。
    その娘 Benny と Brittany は、それぞれ男の子と女の子をひとりずつ生みました。
  • Catherine
    3 人の女の子を生みました。
    その娘たちは次のように続きます:
    -- Crea:2 人の男の子
    -- Chloe:1 人の男の子
    → Catherine の母系は、この 2 人の娘の代で終わります。
  • Dianne
    2人の男の子を生みました。
    → Dianne の母系は 途絶えます。

図にすると一目瞭然ですが、
この 4 人の中で 母系が未来まで続く可能性があるのは Bella だけです。
Anna は娘がいない。
Catherine は娘がいるが、その娘が娘を産まない。
Dianne も同じく途中で途絶える。
唯一、Bella の系統だけが「娘 → 娘 → 娘…」と続く可能性を持っています。
このように、
母系が続くかどうかは “娘が生まれるかどうか” だけで決まります。
娘の系譜が途切れる ことは、
メダルゲームでメダルが尽きて脱落することに相当します。

3. シミュレーションのルール説明

ここまでの説明でミトコンドリアDNAのイメージが共有できたと思いますので、シミュレーションを考えます。
ミトコンドリア・イブの時代は数千から数万人の人類がいたということですので、女性を10,000人と設定します。男性と合わせて20,000人くらいでしょうか。
20万年経過しているので1世代20年換算で10,000世代の交換があるとします。

10,000 人の女性が 10,000 世代後に約 35 億人になるように、
1 世代あたりの人口増加率 ( r ) を逆算します。

r^{10000} = 3.5 \times 10^5

両辺の自然対数を取ると、

\ln r = \frac{\ln(3.5 \times 10^5)}{10000}

これを計算すると、

r = e^{0.001276\dots} \approx 1.00128

したがって、1 世代あたりの人口増加率は 約 1.00128 と設定できます。

前提の数字は大体こんなところで設定します。

これらの値を使い、10,000人の女性が各クランを形成し、個々のクラン人口がどのように増え、
あるいは絶滅していくのか?というシミュレーションを行います。

計算方法ですが、こういうときの数理モデルとして今回は Wright–Fisher モデルを使います。
Wright–Fisher モデルは遺伝的な情報の広がりをシミュレートするものです。

まず正攻法としては、各個体が「何人の娘を産むか」をポアソン分布で決めていく方法があります。

総人口が 20 人で、次世代の期待人口が 21 人なら、
1 人あたりの期待値は 1.05 人です。
クラン A が 3 人なら「期待値 1.05 のガチャを 3 回」、
クラン B が 10 人なら「同じガチャを 10 回」……という具合に、
全員に娘の数ガチャを引いてもらうイメージです。

これは数理的には正しいのですが、個体数が増えると
**「全員にガチャを引かせる」**処理が重くなります。

そこで使われるのが Wright–Fisher モデルです。

Wright–Fisher では、娘の人数そのものは「次世代の総人口」として先に決めてしまい、
その人数分だけ 娘にクランガチャを引かせるイメージで、
次世代のクラン構成をまとめて決めます。

たとえばクラン A が 3 人、B が 10 人、C が 2 人、D が 5 人なら、
人口比は A=15%、B=50%、C=10%、D=25% です。
次世代の人口が 21 人なら、21 回クランガチャを回すイメージで、
次世代のクラン配分が決まります。
ガチャのレートはこんな感じです。

clan_per.png

もちろん、実際にガチャを回しているわけではなく、
確率分布に従って 21 人分を一括でサンプリングしているだけです。
ここでは Wright–Fisher の動作を説明するために、
「クランガチャ」という比喩を使っています。

つまり、

  • ポアソン法:全員に「娘の数ガチャ」を引かせる(正攻法だが重い)
  • Wright–Fisher:娘の人数だけ決めて「クランガチャ」を回すイメージ(効率的)

という関係になっています。

4. Pythonによる実践:ミトコンドリア・イブ・ダービー開幕

それでは実際にクラン人口の動きを見てみましょう。
単純なグラフにしてもあまり面白くないので、ここではバーチャートレース方式で表現します。
バーチャートレース(Bar Chart Race)は、各国の GDP や時価総額ランキングの推移をアニメーションで見る、あの形式です。
縦軸がランキング、横軸が比較する値。ここではクラン人口です。

まず、シミュレーションに使う値を並べてみます。

パラメータ 値
初期人口 10000
世代数 10000
成長率 1.00128

実際にはアニメーションをリアルタイムで描くわけではなく、
10000 世代の計算がすべて終わってから結果をまとめて表示します。
つまり、最終的な勝利者はすでに分かっているわけです。

そこで、最終的なクラン人口のトップ 20 に名前を付けます。
Alice, Beatrice, Cindy, Deborah … Tara まで。
残りの 9980 人は C00021 のような連番にしておきます。

最終的な勝者を Alice と名付けるわけですが、
Alice がどのように浮上していくのか、その物語を楽しんでいただければと思います。

ミトコンドリア・イブ・ダービー(Wright–Fisher)Pythonコードを見る
import argparse
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from numpy.random import default_rng
from matplotlib.animation import FuncAnimation

rng = default_rng()

# 引数のパース
def parse_args():
    parser = argparse.ArgumentParser(description="Clan simulation with noise and growth rate.")

    parser.add_argument("--out_dir"     , type=str   , required=True   , help="出力ディレクトリ")
    parser.add_argument("--initial_pop" , type=int   , default=10000   , help="初期人口")
    parser.add_argument("--end_gen"     , type=int   , default=10001   , help="シミュレーション打ち切りの世代数")
    parser.add_argument("--noise_level" , type=float , default=0.0     , help="ノイズの強さ(0〜0.1あたりを想定)")
    parser.add_argument("--growth_rate" , type=float , default=1.00128 , help="1世代あたりの人口増加率")
    parser.add_argument("--interval"    , type=int   , default=100     , help="観測する世代間隔")

    return parser.parse_args()

# 人口の書式を変える(1000をK,100万をMみたいな。)
def population_format(x, pos):
    if x >= 1e9:
        return f"{x/1e9:.1f}G" if (x % 1e9) != 0 else f"{x/1e9:.0f}G"
    if x >= 1e6:
        return f"{x/1e6:.1f}M" if (x % 1e6) != 0 else f"{x/1e6:.0f}M"
    if x >= 1e3:
        return f"{x/1e3:.1f}K" if (x % 1e3) != 0 else f"{x/1e3:.0f}K"
    return str(int(x))

# Wright–Fisher 本体
def simulate_wf(
    initial_pop=10000,
    end_gen=10001,
    growth_rate=1.00128,
    noise_level=0.0,
):
    # 初期クラン
    clans = np.arange(initial_pop)
    counts = np.array([1] * initial_pop, dtype=np.int64)  # Python int

    records = []
    
    for t in range(end_gen):
        df_t = pd.DataFrame({
            "time": t,
            "clan": clans,
            "count": counts
        })
        records.append(df_t)

        total = int(sum(counts))
        if total <= 0:
            print(t, len(clans),counts.sum(), counts.min(),counts.max())
            break
        
        nextTotal = int(np.floor(growth_rate * total+0.5))

        # クランごとの次世代人口の期待値にノイズを加える
        noise = np.random.normal(0.0, noise_level, size=len(counts))
        weights = 1.0 + noise

        # ノイズを掛けた重みつき確率
        weighted = counts * weights
        probs = weighted / weighted.sum()

        new_counts = rng.multinomial(nextTotal, probs)
        # -------------------------------------------------
        # 生存クランのみ残す
        # -------------------------------------------------
        alive = new_counts > 0
        clans = clans[alive]
        counts = new_counts[alive]

    return pd.concat(records, ignore_index=True)

# 上位20だけに絞るための前処理
def get_top_k_at_time(t):
    df_t = data[data["time"] == t].copy()
    df_t = df_t.sort_values("count", ascending=False).head(30)
    df_t["name"] = df_t["clan"].map(name_map)

    return df_t

def update(frame, outDir):
    ax.clear()
    t = times[frame]
    df_t = get_top_k_at_time(t)
    df_t = df_t.sort_values("count")  # 横棒グラフ用に下から並べる

    ax.xaxis.set_major_formatter(ticker.FuncFormatter(population_format))
    ax.barh(df_t["name"], df_t["count"], color="skyblue")
    ax.set_xlabel("Number of daughters (current generation)")
    ax.set_title(f"Clan bar chart race (generation {t})")
    ax.set_xlim(0, max(data[data["time"]==t]["count"]) + 1)
    
    figPath = os.path.join(outDir, "{0:05d}.png".format(int(t/100)))
    plt.savefig(figPath)

args = parse_args()

data = simulate_wf(args.initial_pop, args.end_gen, args.growth_rate, args.noise_level)
data.to_csv(os.path.join(args.out_dir, "result.csv"), index=True)

name_map = {}

# 主要キャラの名前
base_names = ["Alice", "Beatrice", "Cindy", "Deborah", "Emma", "Fiona",
              "Grace", "Hannah", "Ivy", "Julia", "Kate", "Laura",
              "Mia", "Nina", "Olivia", "Paula", "Quinn", "Rachel",
              "Sara", "Tara"]

# 1. clan ごとの総 count を計算
total_counts = data.groupby("clan")["count"].sum().sort_values(ascending=False)

# 2. トップ20に Alice〜Tamara を付ける
for i, lin in enumerate(total_counts.index):
    if i < 20:
        name_map[lin] = base_names[i]
    else:
        name_map[lin] = f"C{lin:05d}"

times = sorted(data["time"].unique())

fig, ax = plt.subplots(figsize=(8, 6))

ani = FuncAnimation(fig, update, frames=range(0, len(times), 100), fargs=(args.out_dir,), interval=args.interval, repeat=False)

plt.show()

4.1. 第1回ダービー:静かな世界

(順位がほぼ固定化してしまう世界)

Wright–Fisher モデルそのままの実行例がこんな感じです。

cbcr_0_00.gif

悪くないような気もしますが、ある程度世代が進むと順位が固定化していきます。
上位層がはじめに固まり、あとは下位層がゆっくり決まっていくイメージです。
何となくバブルソートの後半戦を彷彿とさせますね。

10000 世代くらい進めても名無しクランが生き残っています。
最終的に 31 クランが生存しています(※バーチャートレースは30位までしか表示していません)。

n0_00_10000.png

このままでは、何回やっても 1 クランに収束することはないでしょう。

「順当に人口が増えていく」だけの、きれいすぎるダービーです。

4.2. 第2回ダービー:小さなゆらぎ

(わずかなノイズでも乱れる順位)

さて、第1回ダービーがあんなに静かだったのはなぜだったのでしょうか?
ひとつには全クランが同じ期待値で娘を授かるからだと予想しました。
普通に考えると、クランは大体同じところに固まって生きているはず。
となるとクラン単位で局所的に人口が急激に増えたり減ったりすることもあるはずです。

ということでノイズを加えてみます。
クランごとの期待値に標準偏差σのノイズを与えます。
ノイズは全クラン平等に与えます。
もちろん、人口数に応じてノイズの影響度は変わってしまいますがどこかのクランに有利な形には設定していません。
あくまでも、ノイズは不条理ではあっても理不尽であってはならないという考えから、このような形としました。

σ=0.02から。

cbcr_0_02.gif

最後のフレームはこういう形です。

n0_02_10000.png

最後に残ったのは21クラン。効果はあったようです。
ノイズ0のとき、グラフは比較的きれいな三角形を描いていましたが、少し乱れてきました。

4.3. 第3回ダービー:激化する競争

(中程度のノイズで順位が大きく入れ替わる)

少しノイズを高く設定します。σ=0.05です。

cbcr_0_05.gif

とても大きな影響が出ました。
最終的に4クランが残りました。Cindy と Deborah を見ると、Deborah の方が順位が上になっています。

n0_05_10000.png

ただ、これは正しい状況です。
ラスト数百世代の揺らぎで順位が逆転しただけで、長期的な総人口では Cindy の方が大きいためです。
Cindy は途中まで隆盛を極めていました。
9400世代目では8338万人まで行っています。最終的な Deborah の人口は5324万人。
トータルの人口では Cindy が勝っているわけです。

n0_05_09400.png

4.4. 第4回ダービー:ミトコンドリア・イブ決定!

(強いノイズで 1 クランに収束する)

またノイズを高く設定します。σ=0.1です。期待値が±10%変動するのでかなり大きなノイズです。

cbcr_0_10.gif

このノイズの大きさでは、最終的にクランが Alice のみになりました。
36億人が Alice の系譜に連なっています。
毎回クラン1になることもないですが、何度かやればクラン1になるくらいの確率です。

n0_10_10000.png

4.5. Aliceの人口動態

ダービー1から4までのAliceの動きはどうなっているかを比べてみます。
最終的な10000世代目の人口は36億人程度と決まっていますので、Aliceの人口を見ればシェアがどのくらい増えたかを知ることができます。
結果はこのようになりました。

Aliceの人口動態.png

当然ではありますが、ノイズが大きいほどAliceの人口が大きく伸びていますね。
ノイズ0であれば、最後の世代でも2.5億人程度しかいませんが、ノイズが大きいほどAliceのシェアが高くなっていき、最終的には0.1で36億人をすべて埋めてしまいました。

4.6. ノイズ0.1での4つ巴の戦い

もう一つの検証として、ノイズ0.1での順位変動を見ていきましょう。
ここでは上位4クランの人口動態を見ていきます。
値の差が大きすぎるので、ここは底10の対数表記で人口を表現しています。

ノイズ0.1での上位4クランの人口動態(対数表記).png

Aliceクランは8400あたりまでBeatriceよりも人口が少ないですが、その直後にBeatriceクランが勢いを落としてからは急速にそのパイを吸収しています。
CindyもDeborahも割と粘りを見せていますが、一度勢いを落とし始めると急速に絶滅に向かっています。
いつ勢いを落とすのかは予測がつかない部分があります。
勢いを落としたクランのパイを追い上げてきたクランが食べるというジャイアントキリングがしばしば発生しています。
ここまでで、ノイズの影響力がいかに大きいものかをうかがい知ることができました。


ノイズはジャイアントキリングを引き起こすが、順位が乱高下するだけで格差は増大する。
倒れた巨人のパイを食べるのは巨人だけ。


5. 人類史での巨大なノイズとは?

σ=0.1のノイズは、統計的に考えれば大きすぎるノイズです。
にもかかわらず、ミトコンドリア・イブが1人に収束するのはなぜでしょうか?

それは、もっと激烈なノイズがあったためです。
人類はこれまでに数々の危機を乗り越えてきました。細かいものも挙げるとキリがないので代表的なものをいくつか挙げてみます。

年代(おおよそ) 出来事 推定人口減少率 補足
約 74,000 年前 トバ火山噴火(Toba catastrophe) 50〜90% 減少 人類が数千人規模まで縮小した可能性。最も有名なボトルネック。
約 20万〜10万年前 最終氷期の開始(寒冷化) 地域により 30〜70% 減 アフリカ内で集団が分断され、局所絶滅が頻発。
約 12万年前 アフリカ乾燥化イベント 30〜60% 減少 サバンナ縮小により生息域が激減。
約 12,900 年前 ヤンガードリアス(急激な寒冷化) 20〜40% 減少 数年で気温が 10℃ 低下。狩猟採集民に大打撃。
約 5,000〜3,000 年前 新石器時代の疫病(初期パンデミック) 20〜50% 減少 農耕定住により感染症が爆発的に広がる。
14 世紀 ペスト(黒死病) 30〜60% 減少(欧州) 地域によっては 70〜80% の村落が消滅。
16 世紀 コロンブス交換後の新大陸パンデミック 80〜95% 減少(アメリカ大陸) 史上最大級の人口崩壊。母系もほぼ断絶。

何度か人口が半減するほどの、トバ火山の噴火に至っては9割減に至るほどの推計があります。
人類はσ=0.1が生易しく思えるほどのカタストロフを乗り越えてきたのです。
こうした歴史を経て、私たちは今ここにいます。

📝 コラム:ミトコンドリア・イブは更新されるのか?

ミトコンドリア・イブは「最初の女性」ではありませんし、
「永遠に固定された存在」でもありません。

イブとは、 “現在生きているすべての人の母系をさかのぼったとき、最後に残る一点” のことです。

論理上、イブの娘は2人以上の姉妹なはずです。一人娘ならその娘がイブになりますので。
そして、イブの娘たちの系譜が一人を除いて絶えたとき、その娘にイブの座が“戴冠”されます。

つまり、イブは歴史の中で何度も更新されてきた可能性がある。

ただし、現代では人口が非常に多く、母系が丸ごと消えるほどのボトルネックはほぼ起きません。
ハプログループ(イブの系譜が枝分かれした巨大クラン)が完全に消滅するような事態でもない限り、イブの戴冠が起こることは考えにくいでしょう。

6. 格差について考える

ここで、10000世代目の人口動態についてみてみます。
分かりやすさのために第1回と第2回を比較してみます。
第1回(σ=0.00)はこのような形。

n0_00_10000.png

第2回(σ=0.02)はこのような形です。
n0_02_10000.png

第1回の方が美しい三角形を描いていますが、第2回はかなり偏りがあります。
第1回はAliceクランが2億5千万人程度、第2回は13億人程度になっています。
**しかし、この差は誰かが有利だったわけでも、特別な力を持っていたわけでもありません。 **
ただ、この偏りを生じさせたのは何の意図もないただのノイズです。


格差の物語には超人も黒幕もいない。
ただ構造と、ほんの小さな揺らぎがあるだけ。


この歪さを比較してみます。
格差を測る指標と言えばジニ係数です。

6.1. ジニ係数の考え方

ジニ係数はトマ・ピケティ氏の21世紀の資本で脚光を浴びましたが、計算方法についておさらいです。
ジニ係数の求め方は比較的簡単です。
要素を昇順にソートします。富の話なら横軸が人、縦軸が資本の累積値です。
その累積グラフを描いて、左下と右上を直線で結びます。この直線が完全平等線です。
グラフで見た方が早いと思いますのでグラフで示します。

まずはノイズ0.0のローレンツ曲線です。
ローレンツ曲線(青)の下の面積が「実際の分配の累積」です。
完全平等線(オレンジ)の下の面積が「完全に平等な場合の累積」です。
この2つの差が大きいほど、格差が大きいことを意味します。
このローレンツ曲線は比較的緩やかです。

ノイズ0のローレンツ曲線.png

もう一方、ノイズ0.2のローレンツ曲線です。
オレンジ部分がかなり広がっています。
少数のクランが全体の人口を大きく占めると、
ローレンツ曲線は下側に大きく沈み込みます。
その結果、完全平等線との差が広がり、ジニ係数が大きくなります。
これはAliceクランやBeatriceクランが人口のかなりの割合を占めていることによります。

ノイズ0.02のローレンツ曲線.png

6.2. ジニ係数の数式による定義

ジニ係数は、ローレンツ曲線の下の面積を使って定義されます。
横軸を人口の累積比 (x)、縦軸を資本の累積比 (y) とすると、
ローレンツ曲線の下の面積を (A) として、ジニ係数 (G) は次の式で表されます。
これは一般的なジニ係数の式です。今回のクランと人口で言うならば、
横軸はクランの累積比、縦軸は人口の累積比となります。

G = 1 - 2A

離散データの場合、面積 (A) は台形公式を用いて次のように計算します。

A = \sum_{i=1}^{n} (x_i - x_{i-1}) \cdot \frac{y_i + y_{i-1}}{2}

ここで、ローレンツ曲線と完全平等線の値をそれぞれ 0〜1 に正規化して

x_i = \frac{\text{完全平等線の累積値}_i}{\text{完全平等線の最終値}}, \qquad
y_i = \frac{\text{ローレンツ曲線の累積値}_i}{\text{ローレンツ曲線の最終値}}

とします。

このように、完全平等線とローレンツ曲線の「面積の差」を測ることで、
分布の歪み(格差)を 0〜1 の値で表すことができます。

ノイズ0.00のジニ係数は0.3698、
ノイズ0.02のジニ係数は0.7681となりました。ほぼ倍増の格差です。

それではノイズごとのジニ係数の推移を見てみましょう。

ジニ係数算出のPythonコードを見る ミトコンドリア・イブ・ダービーで出力された「result.csv」をinputにして実行してください。
import argparse
import pandas as pd
import numpy as np

def gini(x: np.ndarray) -> float:
    """Compute Gini coefficient for a 1D numpy array."""
    if len(x) == 0:
        return np.nan
    x = np.sort(x)
    n = len(x)
    cumx = np.cumsum(x)
    return (n + 1 - 2 * np.sum(cumx) / cumx[-1]) / n

def main():
    parser = argparse.ArgumentParser(description="Compute Gini coefficients per time.")
    parser.add_argument("--input", required=True, help="Input CSV file path")
    parser.add_argument("--output", required=True, help="Output CSV file path")
    args = parser.parse_args()

    # Load CSV
    df = pd.read_csv(args.input)

    # Group by time
    results = []
    for t, g in df.groupby("time"):
        counts = g["count"].to_numpy(dtype=np.float64)
        total = counts.sum()
        gini_value = gini(counts)
        results.append((t, gini_value, total))

    # Save results
    out_df = pd.DataFrame(results, columns=["time", "gini", "total_count"])
    out_df.to_csv(args.output, index=False)

if __name__ == "__main__":
    main()

このような形となりました。

ノイズごとのジニ係数の推移.png

ノイズ0.00は0.37程度で安定しています。
ノイズ0.02は0.7くらい。8000世代目くらいでは0.8超えるところもありますので格差社会です。
意外なことに0.05や0.10は0.02よりも落ちているので格差が小さいように見えるかもしれませんが、そうでもありません。
これは生き残っているクランの中でのジニ係数です。
思い出していただきたいのですが、ノイズ0.00は31クラン、0.02は21クラン、0.05は4クラン、0.10は1クランです。
0.05や0.10は上澄みの中でしのぎを削っているだけです。9996クラン、9999クランがその足元にいると考えれば、超格差社会と言えます。

もうひとつ、興味深い部分はノイズ0.10の「クラン1に収束する」ケースです。
最後に1クランしか残っていないので、比較対象がなくなり、ローレンツ曲線は完全平等線と一致します。
ジニ係数は0、完全平等が成立する。

このシミュレーションは、最初は10,000クランが同じ人数でスタートするのでジニ係数0。
ジニ係数0に始まり、ジニ係数0に終わる。

ただし、その意味はまったく違います。
最初は「クラン最大数での平等」、最後は「クラン最小数での平等」。

これは、
“全員が同じクランに属している”という意味では完全平等だが、
“クラン間格差”という意味では最大の独占状態という逆説です。

このパラドックスは、格差を測る指標が“構造の変化”を必ずしも捉えきれないことを示しています。

7. 資本のジニ係数はどう動いてきたのか

それでは、資本のジニ係数の推移も見てみましょう。
ここでは、WID(World Inequality Database)が提供する 全国民ベースの課税前ジニ係数を比較します。
生産能力そのものの分布を見たいので、税や給付による再分配は含めていません。
対象は日本、アメリカ、中国、スウェーデンの4カ国です。

※ 厚労省が公表するジニ係数は 世帯単位、WID のジニ係数は 個人単位 で計算されているため、数値は直接比較できません。

データ出典:
https://wid.world/data/

ジニ係数推移_4か国.png

7.1. 歴史イベントとジニ係数の関係

長期推移を見ると、大きな歴史イベントがジニ係数に明確な影響を与えていることが分かります。

  • 1945年:終戦
  • 1991年:日本の不動産バブル崩壊
  • 1995–2005年:IT革命期
  • 2009年:リーマンショック

戦争やバブル崩壊の直後には、ジニ係数が一時的に低下しています。
これらのイベントは主に 富裕層(上位層)に強く作用し、所得や資産の集中を一時的に崩すためです。
今回のミトコンドリア・イブのシミュレーションには含めていませんが、現実の経済ではこうした“ショック”が格差を押し下げる方向に働きます。


7.2. 情報資産という現代最大のノイズ

1995〜2005年の IT革命期を境に、スウェーデンを除く3カ国では
ジニ係数が明確に上昇しています。

これは、情報資産という新しいタイプの資本が登場したためです。

情報資産は:

  • 地理的制約を受けない
  • 時間的制約もほぼない
  • 複製コストがほぼゼロ
  • 規模の経済が極端に働く
  • 価値の変動が予測しにくい(=ノイズが大きい)

といった特徴を持ち、
従来の土地・設備・労働とはまったく異なる性質を持つ“時空間を超えた資本”です。
これは、
従来の土地・設備・労働とはまったく異なる“ノイズの塊” です。

その結果、アメリカや中国ではジニ係数が急上昇し、
“勝者総取り” の構造が強まっています。
現在はさらにAIという巨大なノイズが格差を助長すると考えられます。


歴史的ショックは格差を一時的に縮めるが、
IT革命以降は情報資産という新しいノイズが格差を恒常的に押し上げている。


8. まとめ

ここまでのミトコンドリア・イブのシミュレーション、資産の格差の推移によってノイズ=予測不可能性の影響度を知ることができました。
現代人のmtDNAはイブの系譜に染まってしまいましたし、AI等の技術革新によって格差が広がる状況は想像に難くありません。
それは何か大いなる意志がそうさせているのではなく、構造とちょっとした揺らぎがそうさせているのです。

歴史の中で、格差を一時的に軽減した出来事はありますが、それらは多くの場合、破壊的なイベントになるので望むわけにはいきません。
何となくこういう言い方をすると八方ふさがりな感じがしてきますが、そんなこともないかと思います。

mtDNAの話もあくまで母系の話です。例に挙げた4人の系譜でも、男系をはさんだ Catherine や Dianne の系譜は別の形で未来に残っているかもしれません。
格差が広がるのは歓迎できませんが、人間はお金のためだけに生きているわけではありませんし、ホモ・サピエンス(賢い人)の名に恥じないよう、
解決策を考える知恵もあるはずです。

構造は変えられなくても、その中でどう生きるかは選べる。
だからこそ、自分の頭で問い続けることが武器になるのだと思います。

答えを出すのはすでにAIの方が得意なのかもしれませんが、何をしたいのか、どうありたいのか、問いを立てるところは、まだ人間の方が強いはずです。きっと。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?