政策議論はもうちょっと普通に定量的にやろう!

Published: Nov. 5, 2024, 9:29 a.m. (UTC) / Updated: Nov. 6, 2024, 12:54 a.m. (UTC) 🔖 0 Bookmarks
👍 0 👎 0
English

政策の議論を定量的にしない民

政治家やYoutuberさん達は自分のビジネスのためにXしているから、歪んだポジショントークであることは大前提なのですが、例えば次のような完全に議論がちぐはぐなやり取りを見て、多くの人々が水掛け論をし合っているのを見ると、気分が暗くなりますね。

  • 米山氏は「減税しても国家の運営財源なくなるだけだよ」と言っていて
  • ひろゆき氏は持論の「103万円の壁を無くせば税収が増えるよ」と言っている

お互い関係なさそうな話をしている訳ですが、どうしてこんなことになったかというと、国民民主党の玉木代表が打ち出した政策に対してTBSが「国民民主党が主張する178万円に引き上げた場合、政府は国と地方で7兆6000億円程度の減収になると試算するなど問題があることも指摘されています。」というソース不明の一言を報じたことが切っ掛けでした(少なくともFeloではソースは出てきませんでした)。


それで米山氏がこの「上限引き上げなんてしたら、7.6兆円の税収減になるが、そんなことをしたら国家予算が足りなくなって大変だ」と騒いだら、ひろゆき氏が、「逆に経済が良くなるから税収もあがるでしょう」と言って水掛け論に発展したという訳です。


ひろゆき氏は自由に放言することが仕事なので良いのですが、米山氏は「衆議院議員・元新潟県知事。立憲民主党。予算委員会、法務委員会次席理事、災害対策特別委員会。」とXのプロフィールに書いてあるので、プロでなければなりません。ひろゆき氏のまぜ返しに対してど正論で定量的に返せない時点でアウトです。


そもそも、米山氏はこの7.6兆円の根拠を説明も出来ないのではないでしょうか。


経済施策のインパクトをもっと簡単に皆が確認出来るようして欲しい・・・

無いなら作ってみるか ~ 経済政策影響分析モデル

本来であれば、日銀の資金循環統計をベースにモデリングしたいところですが、あまりにも面倒なので、軽く政府による支出の増減が企業業績や雇用にどう影響を与えて、それがGDPと税収にどう影響を与えるのかを簡単に確認するツールを作りました。精緻化する余地は沢山あると思いますが、冒頭のお二人の議論位はカバー出来ているかと思います。当方は経済学者ではないので、ざっくり常識感で試算しています。

大きな間違えがあればご指摘頂ければ修正しますが、ご自身で計算してみるとより理解が進むのでお勧めです。

1. モデルの概要

このモデルは、以下の2つの政策変更による経済への影響を総合的に分析します:

  1. 政府支出の7.6兆円削減
  2. いわゆる「103万円の壁」の撤廃

これらの政策変更が、GDP、税収、雇用に与える影響を、複数の経路を通じて定量的に評価します。

2. 主要な影響経路

2.1 政府支出削減の影響経路

  1. 直接的GDP影響

    • 政府支出の削減(-7.6兆円)
    • 財政支出乗数(1.3)を通じた波及効果
  2. 企業収益への影響

    • 政府支出の95%が企業の売上に直結
    • 売上減少→利益減少(利益率5.4%)
    • 法人税収入への影響(実効税率29.9%)
  3. 雇用への影響

    • 売上減少の30%が人件費削減に
    • 雇用調整率70%で人員削減
    • 平均給与400万円をベースに雇用者数変動を算出
    • 所得税収入への影響

2.2 103万円の壁撤廃の影響経路

  1. 労働供給への影響

    • 対象者数:88万人
    • 収入増加:103万円→150万円
  2. 消費への影響

    • 所得増加分の72.4%が消費に
    • 消費税収入への影響(10%)
    • 乗数効果による波及
  3. 企業収益への影響

    • 消費増加→売上増加
    • 利益率5.4%で企業収益増加
    • 法人税収入への影響
  4. 雇用創出効果

    • 売上増加の30%が人件費に
    • 新規雇用の創出
    • 所得税収入への影響

3. モデルの主要パラメータ

3.1 マクロ経済パラメータ

  • 財政支出乗数:1.3
  • 消費性向:72.4%
  • 名目GDP:574.3兆円(2023年)

3.2 企業関連パラメータ

  • 企業利益率:5.4%
  • 政府支出→売上転換率:95%
  • 売上高人件費比率:30%
  • 労働分配率:50%

3.3 税制関連パラメータ

  • 法人税実効税率:29.9%
  • 消費税率:10%
  • 所得税率:5%~45%(7段階累進)

3.4 労働市場パラメータ

  • 平均給与:400万円
  • 雇用調整率:70%
  • 103万円の壁影響人数:88万円

4. 分析の特徴

4.1 多面的影響の考慮

  • GDP影響
  • 税収影響(所得税、法人税、消費税)
  • 雇用影響(失業と創出)

4.2 時系列分析

  • 5年間の影響を追跡
  • 累積効果の把握
  • 年次推移の可視化

4.3 構成要素分解

  • GDP影響の要素分解
  • 税収影響の要素分解
  • 雇用影響の正負分解

5. モデルの限界と留意点

5.1 モデルの前提

  • 経済環境の安定性を仮定
  • パラメータの固定性を仮定
  • 線形の関係性を仮定

5.2 考慮していない要素

  • 金融政策との相互作用
  • 為替レートへの影響
  • 産業間の相互依存関係
  • 地域間の経済格差

5.3 不確実性要因

  • パラメータ推計値の精度
  • 行動変化の予測困難性
  • 外部環境の変化

6. 分析結果の解釈方法

6.1 GDP影響

  • 政府支出削減の直接効果
  • 消費増加による相殺効果
  • 純効果の評価

6.2 税収影響

  • 税目別の増減要因
  • 相殺効果の規模
  • 純影響の評価

6.3 雇用影響

  • 失業と雇用創出の規模
  • 純雇用効果
  • 産業別・地域別の示唆

103万円の上限を撤廃する効果の試算

103万円の上限規制のみを撤廃するとどうなるか、という試算です。いきなり結論の図を見ましょう。


  • GDPへの影響
    GDPの押し上げ効果としては4000億円程度でしょうか。103万円の壁で仕事をしなくなっていた層が、仮に平均150万円まで働くようになった場合を想定して、その分の収入増加による消費の増加が3000億円程度、そこからくる波及効果が残り1000億円程度となります。GDPに関する計算としては無視できる程度の小さな話となりました。

  • 税収への影響
    それでは税収への影響はどうでしょう。GDPへの影響が小さいのだから、税収への影響はそれに税率が掛かる分、もっと小さくなります。ところで、非課税の上限を103万円から178万円に引き上げた場合、配偶者特別控除の枠も同時に178万円まで引き上げられると想定します。つまり政府は現在103万円までは配偶者特別控除として38万円までは「主たる納税者」の課税所得から控除することが出来ますが、これを178万円まで38万円の控除を認めるという大盤振る舞いをした場合を想定します。
    以下の効果が毎年積みあがることになります。

    1. 上限の壁を引き上げたことによ現在150万円まで働いている人から取れたであろう税収が取れなくなる分の減収total_tax_impact_wall: -146.08 億円
    2. 「主たる納税者」の配偶者特別控除の上限が上がったことによる減収spousal_deduction_tax_effect:-668.8 億円
    3. 消費増加による消費税の増加consumption_tax_impact: 299.4 億円
    4. 消費増加による企業売り上げ増に伴う法人税増加corporate_tax_impact_consumption:48.3 億円
    5. 雇用増加による所得税収増income_tax_impact_new_jobs:37.8 億円
    6. 正味の所得税の増減total_income_tax_impact: -777.0 億円
    7. 正味の税収の増減total_tax_impact: -429.2 億円

この結果、当初の雇用創出効果は2万2千人程度あったものの、財政はじり貧になって政府支出が年々減らざるを得ないという結論になります。

モデルの結論

  • 税収、財政の観点では、じり貧になるのでやらない方がいい
  • 雇用押し上げ効果は限定的でかつ、長続きしないのでやらない方がいい
  • 消費押し上げによる経済波及効果はあるものの、上記を解決するほど多くない可能性がある

元の話のまとめ: 政策議論はもうちょっと普通に定量的にやろう!

  • TBSの「国民民主党が主張する178万円に引き上げた場合、政府は国と地方で7兆6000億円程度の減収になると試算するなど問題があることも指摘されています。」という報道はデマである
  • TBSのデマを信じで嚙みついた立憲民主党の米山氏はstatesmanとしての見識が疑われる。7.6兆円などという金額の規模感が全くおかしいことに気が付かないのは普段から自分で考えていない証拠と捉えられても仕方ない。
  • ひろゆき氏の「103万円の上限を撤廃すれば、色々といいことがあるだろう」という希望的観測も残念ながらサポート出来ない。多分、上手く行かない可能性が高い。

という訳で、関係者全員がグダグダで無駄の議論を繰り替えしていたことが分かりました。
こういう無駄な議論をしないために、政策の議論は、定量的な議論をしっかりするようにしたいものです。

Appendix: ソースコード

下記のコードについて、仮定を十分に説明しきれていない部分もあります。
また誤りもあるかも知れないので、その点はご指摘頂ければ幸いです。気が向いたら修正します。

"""
class TaxRevenueModel:
	def __init__(self):
            # 基本パラメータ(既存のまま)
    	    self.consumption_rate = 0.724
            self.corporate_tax_rate = 0.299
            self.consumption_tax_rate = 0.10
            self.multiplier = 1.3
            self.wall_affected_workers = 880_000  # 88万人
            self.avg_current_income = 1_030_000   # 103万円
            self.potential_income = 1_500_000     # 150万円
            self.corporate_profit_margin = 0.054
            self.nominal_gdp = 574.3
            self.govt_spending_to_revenue_ratio = 0.95
            self.revenue_to_employment_ratio = 0.3
            self.avg_salary = 4_000_000
            self.employment_adjustment_rate = 0.7
            self.labor_share = 0.5
            # 税制関連パラメータ
            self.income_tax_brackets = {
                1_950_000: 0.05,
                3_300_000: 0.10,
                6_950_000: 0.20,
                9_000_000: 0.23,
                18_000_000: 0.33,
                40_000_000: 0.40,
                float('inf'): 0.45
            }

      # 配偶者控除関連
      self.old_income_threshold = 1_030_000  # 旧制度の壁
      self.new_income_threshold = 1_500_000  # 新制度の壁

      # 主たる納税者の想定年収と適用税率
      self.primary_earner_income = 6_000_000  # 主たる納税者の年収想定
      self.primary_earner_tax_rate = 0.20     # 主たる納税者の限界税率

    def calculate_current_tax(self, income):
        """
        現行制度での税額計算(103万円までは非課税)
        """
        if income <= self.old_income_threshold:
            return 0

        # 給与所得控除の計算
        if income <= 1_800_000:
            deduction = min(income * 0.4, 550_000)
        elif income <= 3_600_000:
            deduction = income * 0.3 + 180_000
        elif income <= 6_600_000:
            deduction = income * 0.2 + 540_000
        elif income <= 8_500_000:
            deduction = income * 0.1 + 1_200_000
        else:
            deduction = 1_950_000

        # 課税所得の計算
        taxable_income = max(0, income - deduction)

        # 所得税額の計算
        tax = 0
        previous_bracket = 0

        for bracket, rate in self.income_tax_brackets.items():
            if taxable_income > previous_bracket:
                taxable_amount = min(taxable_income - previous_bracket, bracket - previous_bracket)
                tax += taxable_amount * rate
            previous_bracket = bracket
            if taxable_income <= bracket:
                break

        return tax

    def calculate_new_tax(self, income):
        """
        新制度での税額計算(150万円までは非課税)
        """
        if income <= self.new_income_threshold:
            return 0

        # 以降は現行制度と同じ計算方法
        return self.calculate_current_tax(income)

    def calculate_tax_revenue_impact(self, old_income, new_income):
        """
        税収影響を計算(新制度と現行制度の差分)
        """
        current_tax = self.calculate_current_tax(old_income)
        new_tax = self.calculate_new_tax(new_income)

        return new_tax - current_tax

    def calculate_income_tax(self, income):
        """
        所得税額を計算(給与所得控除後の課税所得に対する税額)
        """
        # 給与所得控除の簡易計算(令和2年以降)
        if income <= 1_800_000:
            deduction = min(income * 0.4, 550_000)
        elif income <= 3_600_000:
            deduction = income * 0.3 + 180_000
        elif income <= 6_600_000:
            deduction = income * 0.2 + 540_000
        elif income <= 8_500_000:
            deduction = income * 0.1 + 1_200_000
        else:
            deduction = 1_950_000

        # 課税所得の計算
        taxable_income = max(0, income - deduction)

        # 所得税額の計算
        tax = 0
        previous_bracket = 0

        for bracket, rate in self.income_tax_brackets.items():
            if taxable_income > previous_bracket:
                taxable_amount = min(taxable_income - previous_bracket, bracket - previous_bracket)
                tax += taxable_amount * rate
            else:
                break
            previous_bracket = bracket

        return tax


    def calculate_spousal_deduction(self, income):
        """
        配偶者の所得に応じた配偶者控除額を計算
        """
        if income <= 1_030_000:
            return 380_000
        elif income >= self.potential_income:
            return 0
        else:
            # 1,030,000円から1,500,000円までの間は直線的に減少
            reduction_rate = (380_000) / (self.potential_income - 1_030_000)
            return max(0, 380_000 - (income - 1_030_000) * reduction_rate)

    def calculate_spousal_deduction_tax_effect(self, old_income, new_income):
        """
        配偶者控除の変更による主たる納税者の税負担変化を計算
        """
        old_deduction = self.calculate_spousal_deduction(old_income)
        new_deduction = self.calculate_spousal_deduction(new_income)
        deduction_change = old_deduction - new_deduction

        # 控除減少による主たる納税者の税負担増加
        tax_increase = deduction_change * self.primary_earner_tax_rate

        return tax_increase

    def calculate_comprehensive_impact(self, govt_spending_reduction: float = 0, simulation_years: int = 5):
        """
        GDP影響と税収影響を総合的に計算
        """
        results = []
        cumulative_govt_impact = 0

        for year in range(simulation_years):
            # 1. 政府支出削減の影響
            year_govt_impact = -govt_spending_reduction
            cumulative_govt_impact += year_govt_impact

            revenue_reduction = cumulative_govt_impact * self.govt_spending_to_revenue_ratio * 1e12
            profit_reduction = revenue_reduction * self.corporate_profit_margin
            corporate_tax_impact_govt = profit_reduction * self.corporate_tax_rate
            print("corporate_tax_impact_govt", corporate_tax_impact_govt/100000000, "億円" )

            # 2. 雇用への影響
            employment_cost_reduction = revenue_reduction * self.revenue_to_employment_ratio * self.employment_adjustment_rate
            jobs_lost = -employment_cost_reduction / self.avg_salary
            income_tax_impact_jobs = -self.calculate_current_tax(self.avg_salary) * jobs_lost
            print(f"income_tax_impact_jobs{income_tax_impact_jobs/100000000:.2f} 億円")

            # 3. 103万円→150万円の壁変更による影響
            # 所得増加による消費増加
            income_increase = self.potential_income - self.avg_current_income
            total_income_increase = self.wall_affected_workers * income_increase
            print("total_income_increase", total_income_increase/100000000, "億円" )

            # 配偶者控除の増加による税収減少(主たる納税者)
            spousal_deduction_tax_effect = -self.calculate_spousal_deduction_tax_effect(
                self.avg_current_income,
                self.potential_income
             ) * self.wall_affected_workers
            print("spousal_deduction_tax_effect", spousal_deduction_tax_effect/100000000, "億円" )


            # 所得税影響(103万円超150万円以下が非課税になる効果)
            old_tax = self.calculate_income_tax(self.avg_current_income) * self.wall_affected_workers
            new_tax = self.calculate_income_tax(self.potential_income) * self.wall_affected_workers
            total_tax_impact_wall = -(new_tax - old_tax) # 上限を上げた分税収減
            print("total_tax_impact_wall", total_tax_impact_wall/100000000, "億円" )

            # 4. 消費増加による影響
            additional_consumption = total_income_increase * self.consumption_rate
            consumption_tax_impact = additional_consumption * self.consumption_tax_rate
            print("consumption_tax_impact", consumption_tax_impact/100000000, "億円" )

            additional_revenue = additional_consumption
            additional_profit = additional_revenue * self.corporate_profit_margin
            corporate_tax_impact_consumption = additional_profit * self.corporate_tax_rate
            print("corporate_tax_impact_consumption", corporate_tax_impact_consumption/100000000, "億円" )

            # 5. 消費増加による雇用への影響
            additional_employment_cost = additional_revenue * self.revenue_to_employment_ratio
            jobs_created = additional_employment_cost / self.avg_salary
            income_tax_impact_new_jobs = self.calculate_current_tax(self.avg_salary) * jobs_created
            print("income_tax_impact_new_jobs", income_tax_impact_new_jobs/100000000, "億円" )

            # 6. GDP影響の計算
            consumption_spillover = additional_consumption * (self.multiplier - 1)
            investment_effect = additional_consumption * 0.10

            total_gdp_impact = (cumulative_govt_impact + 
                              additional_consumption / 1e12 +
                              consumption_spillover / 1e12 +
                              investment_effect / 1e12)

            # 7. 総合的な税収影響
            total_income_tax_impact = (total_tax_impact_wall + 
                                     income_tax_impact_jobs +
                                     income_tax_impact_new_jobs +
                                     spousal_deduction_tax_effect)
            print("total_income_tax_impact", total_income_tax_impact/100000000, "億円" )
            total_tax_impact = (total_income_tax_impact + 
                              consumption_tax_impact + 
                              corporate_tax_impact_govt +
                              corporate_tax_impact_consumption)
            print("total_tax_impact", total_tax_impact/100000000, "億円" )

            govt_spending_reduction = -total_tax_impact/1_000_000_000_000 #

            results.append({
                'Year': year + 1,
                # GDP関連指標
                'Government Spending Impact': round(cumulative_govt_impact, 2),
                'Additional Consumption': round(additional_consumption / 1e12, 2),
                'Consumption Spillover': round(consumption_spillover / 1e12, 2),
                'Investment Effect': round(investment_effect / 1e12, 2),
                'Total GDP Impact': round(total_gdp_impact, 2),
                'GDP Impact Rate (%)': round(total_gdp_impact / self.nominal_gdp * 100, 2),

                # 税収影響(壁の変更による影響を含む)
                'Income Tax Impact (Wall)': round(total_tax_impact_wall / 1e9, 2),
                'Income Tax Impact (Jobs)': round((income_tax_impact_jobs + income_tax_impact_new_jobs) / 1e9, 2),
                'Spousal Deduction Tax Effect': round(spousal_deduction_tax_effect / 1e9, 2),
                'Consumption Tax Impact': round(consumption_tax_impact / 1e9, 2),
                'Corporate Tax Impact (Govt)': round(corporate_tax_impact_govt / 1e9, 2),
                'Corporate Tax Impact (Consumption)': round(corporate_tax_impact_consumption / 1e9, 2),
                'Total Tax Impact': round(total_tax_impact / 1e9, 2),

                # 雇用影響
                'Jobs Lost': round(jobs_lost),
                'Jobs Created': round(jobs_created),
                'Net Job Impact': round(jobs_created - jobs_lost)
            })

        return pd.DataFrame(results)


    def plot_comprehensive_impact2(self, results):
        """
        総合的な影響を視覚化(値のラベル付き)
        """
        fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 15))

        # 1. GDP影響の推移
        gdp_components = ['Government Spending Impact', 'Additional Consumption',
                         'Consumption Spillover', 'Investment Effect']
        bottom = np.zeros(len(results))
        bars1 = []  # バーのオブジェクトを保存するリスト

        for component in gdp_components:
            bars = ax1.bar(results['Year'], results[component], bottom=bottom, label=component)
            bars1.append(bars)
            # 値のラベルを追加
            for i, bar in enumerate(bars):
                height = bar.get_height()
                if abs(height) > 0.01:  # 値が0.01より大きい場合のみ表示
                    ax1.text(bar.get_x() + bar.get_width()/2., bottom[i] + height/2.,
                            f'{height:.1f}',
                            ha='center', va='center', rotation=0)
            bottom += results[component]

        ax1.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
        line1 = ax1.plot(results['Year'], results['Total GDP Impact'], 'r-', label='Total Impact')[0]
        # 総合影響の値を表示
        for i, value in enumerate(results['Total GDP Impact']):
            ax1.text(i+1, value, f'{value:.1f}', ha='center', va='bottom', color='red')

        ax1.set_title('GDP Impact Components')
        ax1.set_ylabel('Trillion JPY')
        ax1.legend()
        ax1.grid(True, alpha=0.3)

        # 2. 税収影響の推移
        tax_components = ['Income Tax Impact (Wall)', 'Income Tax Impact (Jobs)',
                         "Spousal Deduction Tax Effect", 
                         'Consumption Tax Impact', 'Corporate Tax Impact (Govt)',
                         'Corporate Tax Impact (Consumption)']
        bottom = np.zeros(len(results))
        bars2 = []

        for component in tax_components:
            bars = ax2.bar(results['Year'], results[component], bottom=bottom, label=component)
            bars2.append(bars)
            # 値のラベルを追加
            for i, bar in enumerate(bars):
                height = bar.get_height()
                if abs(height) > 1:  # 値が1億円より大きい場合のみ表示
                    ax2.text(bar.get_x() + bar.get_width()/2., bottom[i] + height/2.,
                            f'{height:.0f}',
                            ha='center', va='center', rotation=0)
            bottom += results[component]

        ax2.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
        line2 = ax2.plot(results['Year'], results['Total Tax Impact'], 'r-', label='Total Impact')[0]
        # 総合影響の値を表示
        for i, value in enumerate(results['Total Tax Impact']):
            ax2.text(i+1, value, f'{value:.0f}', ha='center', va='bottom', color='red')

        ax2.set_title('Tax Revenue Impact Components')
        ax2.set_ylabel('Billion JPY')
        ax2.legend()
        ax2.grid(True, alpha=0.3)

        # 3. 雇用影響の推移
        lost = ax3.bar(results['Year'], results['Jobs Lost'], 
                       label='Jobs Lost', color='red', alpha=0.6)
        created = ax3.bar(results['Year'], results['Jobs Created'], 
                          label='Jobs Created', color='green', alpha=0.6)
        line3 = ax3.plot(results['Year'], results['Net Job Impact'], 
                         'k-', label='Net Impact')[0]

        # 雇用影響の値を表示
        for i, (lost_val, created_val, net_val) in enumerate(zip(results['Jobs Lost'], 
                                                                results['Jobs Created'],
                                                                results['Net Job Impact'])):
            # 失われた雇用の値
            ax3.text(i+1, lost_val/2, f'{lost_val:,.0f}', 
                    ha='center', va='center', color='white')
            # 創出された雇用の値
            ax3.text(i+1, created_val/2, f'{created_val:,.0f}', 
                    ha='center', va='center', color='black')
            # 純影響の値
            ax3.text(i+1, net_val, f'{net_val:,.0f}', 
                    ha='center', va='bottom', color='black')

        ax3.set_title('Employment Impact')
        ax3.set_ylabel('Number of Jobs')
        ax3.legend()
        ax3.grid(True, alpha=0.3)

        plt.tight_layout()
        plt.show()

  # モデルの実行
  model = TaxRevenueModel()
  results = model.calculate_comprehensive_impact()
  model.plot_comprehensive_impact2(results)

"""

Comments