Skip to the content.

← 目次← 前: 13次: 15 →

14. 産業組織論の指標

テーマ: 市場集中度(HHI・CRk)と合併審査、クールノー競争との関係

学習点: 辞書操作, ソート, 関数の分割, シミュレーション

依存: 標準ライブラリのみ / 難易度: 中級

実行方法

uv run 14_market_concentration.py

スクリプト冒頭の PEP 723 メタデータ(# /// script)により、必要なライブラリは uv が自動的に仮想環境へ導入します。事前の pip install は不要です。

解説

何をするプログラムか

企業の合併・買収は、当事者にとっては規模の経済を狙う戦略ですが、市場の競争を弱めるおそれがあるため、公正取引委員会や米国司法省(DOJ)・連邦取引委員会(FTC)といった競争当局の審査を受けます。その審査で中心的な役割を果たすのが市場集中度の指標、HHI(ハーフィンダール・ハーシュマン指数)と上位 k 社集中度 CRk です。

このスクリプトは、7 社からなる架空の市場について HHI・CR3・CR5・等価企業数を計算し、3 通りの合併シナリオ(中堅同士、上位 2 社、下位 2 社)ごとに HHI の上昇幅を求めて審査上の扱いを判定します。最後に、集中度がクールノー競争モデルを通じて企業のマークアップ(値付けの余裕)とどう結びつくかを示します。

コードの読みどころ

理論的背景

HHI は全企業のシェア(%)の 2 乗和で、完全独占なら 100² = 10,000、同規模 n 社なら 10000/n になります。この逆数関係を使ったのが「等価企業数 = 10000/HHI」で、実行結果の 4.80 社は「この市場は同規模 4.8 社の市場と同じ集中度」と読めます。米国 DOJ/FTC の水平合併ガイドライン(2010 年版)は、HHI 1500 未満を非集中、1500〜2500 を中程度の集中、2500 超を高集中とし、合併後に高集中かつ ΔHHI が 200 超なら反競争的と推定します。シェア s_a、s_b の 2 社が合併すると HHI は (s_a+s_b)² − s_a² − s_b² = 2·s_a·s_b だけ増えるため、審査ではこの値がまず注目されます。

さらに、同質財のクールノー(数量)競争では、各社のラーナー指数(マークアップ率)のシェア加重平均が HHI/(10000·ε)(ε は需要の価格弾力性)に等しいことが導かれます。HHI が単なる記述統計ではなく、価格支配力という経済理論と接続した指標であることが、この関係式の意味です。

実行結果の見方

合併前の市場は HHI = 2,084 で「中程度に集中した市場」、CR3 = 71.0% です。3 つのシナリオを比べると、C社(15%)と D社(12%)の合併は ΔHHI = +360 で「精査が必要」、A社(32%)と B社(24%)の合併は ΔHHI = +1,536・合併後 HHI 3,620 で「反競争的と推定される」、F社と G社の小規模合併は ΔHHI = +30 で「問題視されにくい」となり、どの企業同士が組むかで審査の扱いが大きく変わることが分かります。いずれも ΔHHI が理論値 2·s_a·s_b と一致しています。

最後のクールノー均衡の表は、同じ HHI でも需要が非弾力的(ε = 0.8)なら加重平均マークアップは 26.1%、弾力的(ε = 3.0)なら 6.9% と、集中度と需要条件の両方が価格支配力を決めることを示しています。

ソースコード

# /// script
# requires-python = ">=3.11"
# dependencies = []
# ///
"""14: 産業組織論の指標 ---------------------------------------------------
テーマ: 市場集中度(HHI・CRk)と合併審査、クールノー競争との関係
学習点: 辞書操作, ソート, 関数の分割, シミュレーション
根拠: HHI = Σ s_i^2(s_i はシェア%)。米国司法省/FTCの水平合併ガイドライン
      (2010年版) では HHI 1500未満=非集中, 1500-2500=中程度, 2500超=高集中。
      合併による HHI 上昇が 200 ポイント超かつ高集中なら反競争的と推定される。
      クールノー競争ではラーナー指数の加重平均 = HHI/ε という関係が成り立つ。
"""
from typing import Mapping


def shares(sales: Mapping[str, float]) -> dict[str, float]:
    total = sum(sales.values())
    return {k: v / total * 100 for k, v in sales.items()}


def hhi(sales: Mapping[str, float]) -> float:
    return sum(s ** 2 for s in shares(sales).values())


def crk(sales: Mapping[str, float], k: int) -> float:
    return sum(sorted(shares(sales).values(), reverse=True)[:k])


def num_equiv(h: float) -> float:
    """等価企業数 = 10000/HHI。同規模企業が何社ある market と等価か。"""
    return 10000 / h


def classify(h: float) -> str:
    if h < 1500:
        return "非集中市場"
    if h < 2500:
        return "中程度に集中した市場"
    return "高度に集中した市場"


def report(name: str, sales: Mapping[str, float]) -> float:
    h = hhi(sales)
    print(f"\n{name}")
    for k, s in sorted(shares(sales).items(), key=lambda kv: -kv[1]):
        print(f"    {k:<10}{s:>6.2f}% {'█' * int(s / 2)}")
    print(f"    HHI = {h:,.0f} ({classify(h)}) / CR3 = {crk(sales,3):.1f}% / "
          f"CR5 = {crk(sales,5):.1f}% / 等価企業数 = {num_equiv(h):.2f}社")
    return h


def merge(sales: Mapping[str, float], a: str, b: str) -> dict[str, float]:
    d = dict(sales)
    d[f"{a}+{b}"] = d.pop(a) + d.pop(b)
    return d


def main() -> None:
    market = {"A社": 3200, "B社": 2400, "C社": 1500, "D社": 1200,
              "E社": 900, "F社": 500, "G社": 300}
    h0 = report("合併前の市場", market)

    for a, b in [("C社", "D社"), ("A社", "B社"), ("F社", "G社")]:
        h1 = hhi(merge(market, a, b))
        delta = h1 - h0
        # 2社合併による HHI 増分は理論上 2*s_a*s_b に等しい
        s = shares(market)
        print(f"\n  {a}{b} の合併: HHI {h0:,.0f} -> {h1:,.0f} "
              f"(ΔHHI = {delta:+,.0f}, 理論値 2·s_a·s_b = {2*s[a]*s[b]:,.0f})")
        flag = ("反競争的と推定される" if h1 >= 2500 and delta > 200
                else "精査が必要" if h1 >= 1500 and delta > 100
                else "問題視されにくい")
        print(f"    -> {classify(h1)} / 審査上の扱い: {flag}")

    print("\n[クールノー均衡との対応]")
    print("  同質財・限界費用一定のクールノー競争では、加重平均マークアップ率は")
    print("  Σ s_i·(p-c_i)/p = HHI/(10000·ε)  (ε は需要の価格弾力性の絶対値)")
    for eps in [0.8, 1.5, 3.0]:
        print(f"    ε = {eps}: 予測される加重平均マークアップ率 "
              f"= {h0 / 10000 / eps:.1%}")
    print("  ※ 集中度が高いほど、また需要が非弾力的なほどマークアップは大きくなる。")


if __name__ == "__main__":
    main()

実行結果


■ 合併前の市場
    A社         32.00% ████████████████
    B社         24.00% ████████████
    C社         15.00% ███████
    D社         12.00% ██████
    E社          9.00% ████
    F社          5.00% ██
    G社          3.00% █
    HHI = 2,084 (中程度に集中した市場) / CR3 = 71.0% / CR5 = 92.0% / 等価企業数 = 4.80社

  C社 と D社 の合併: HHI 2,084 -> 2,444 (ΔHHI = +360, 理論値 2·s_a·s_b = 360)
    -> 中程度に集中した市場 / 審査上の扱い: 精査が必要

  A社 と B社 の合併: HHI 2,084 -> 3,620 (ΔHHI = +1,536, 理論値 2·s_a·s_b = 1,536)
    -> 高度に集中した市場 / 審査上の扱い: 反競争的と推定される

  F社 と G社 の合併: HHI 2,084 -> 2,114 (ΔHHI = +30, 理論値 2·s_a·s_b = 30)
    -> 中程度に集中した市場 / 審査上の扱い: 問題視されにくい

[クールノー均衡との対応]
  同質財・限界費用一定のクールノー競争では、加重平均マークアップ率は
  Σ s_i·(p-c_i)/p = HHI/(10000·ε)  (ε は需要の価格弾力性の絶対値)
    ε = 0.8: 予測される加重平均マークアップ率 = 26.1%
    ε = 1.5: 予測される加重平均マークアップ率 = 13.9%
    ε = 3.0: 予測される加重平均マークアップ率 = 6.9%
  ※ 集中度が高いほど、また需要が非弾力的なほどマークアップは大きくなる。

← 目次← 前: 13次: 15 →