一次相続と二次相続の最適化をPython で考察してみた

### 前書き
家族の長である父親が没したとき、その配偶者と子供達が父親の遺産を相続します。世間ではこれを一次相続と呼び、さらに父の配偶者が没した際には配偶者の遺産を子供達が相続し、それは二次相続と呼ばれています。さて、一次相続時に配偶者には大きな控除枠があり、1億6千万円又は法定相続分のいずれか多い金額まで非課税となります。そこで、その枠を目一杯利用して一次相続を節税すると、二次相続時に痛い目に合いますよと、あちこちで説明されています。例えば、YouTubeではプロの税理士さんが、一次相続と二次相続の注意点を説明している動画がたくさんあります。
さて、では実際に計算してみようと最初はスプレッドシートで作成し、それが言わばプロトタイプという感じになり、それをPython で表現したらどうなるだろうか？　という興味からトライしたのが、この記事になります。
なお、私自身は、税理士ではありませんし、相続税をすみからすみまできちんと勉強しているわけでもありません。国税庁その他、税理士事務所のWEBサイトで開示されている情報や数式をそのまま適用して、ホビーとしてプログラミングを楽しんでいるアマチュアです。実際にご利用されての損害その他には一切お付き合いできません。免責とさせていただきます。参考とさせていただいたWEBサイトのURLは開示いたします。

### 初期条件の入力
設定ファイル(input.txt)を用意した場合と、設定ファイルを用意せず、手入力で始める場合と、どちらでも対応可能としてみました。

### 計算結果
計算結果をテキストファイル(output.txt)に残すのみならず、グラフ化して、視覚化しました。

## 苦労しちゃったこと
変数の命名ですね。これなんだったけな？と思い出す苦労を避けるためには、どーしても長い変数名になってしまうのですが、命名の一貫性とか必ずしも守られなくてもOKとなっています。

### 初期設定ファイル(input.txt)
```python:input.txt
2
20000
0

上から
子供の人数：単位は「人」 --> n_ks
遺産総額：単位は万円 --> y_isan
一次相続から二次相続の期間中に配偶者が消費する金額で単位は万円、配偶者自身の別の遺産がある場合は、マイナスで入力すると対応できる---> y_consume

``` 
最初は対話式で作り始めたのですが、テストの度に入力するのが煩わしく、設定ファイルから読み込む方式としましたが、出来上がってみると、対話式入力でも、いいんじゃね。と思いなおし、ならば両方できるようにしておこうと考えました。

### pythonスクリプト

```python:souzoku.py
# 遺産相続に関し、一次相続(夫の死亡)、二次相続(配偶者の死亡)合計の相続税最適化を検討するスクリプト

# 設定ファイル定義
# input.txt は、以下の初期条件が記載してあり、それを読み込んで試算します。
# 子供の人数(n_ks)、遺産総額(y_isan)、一次相続と二次相続の間の期間中に配偶者が相続した遺産を消費する、その金額(y_consume)
# 配偶者が一次相続時の夫遺産を使い切らずにが亡くなってしまうことを想定できるので、y_consume を設定できるようにしました。
# 円の単位は、万円です。
# 設定ファイルが存在しない場合は、対話式入力になります。

# 相続税の計算式、税率や控除額は国税庁ホームページの情報による。単位は万円
# https://www.nta.go.jp/taxes/shiraberu/taxanswer/sozoku/4155.htm


def Tax(isan):
    if  isan <= 1000:
        tx = isan*0.1
    elif isan <= 3000:
        tx = isan*0.15-50
    elif isan <= 5000:
        tx = isan*0.20-200
    elif isan <= 10000:
        tx = isan*0.30-700
    elif isan <= 20000:
        tx = isan*0.40-1700
    elif isan <= 30000:
        tx = isan*0.45-2700
    elif isan <= 60000:
        tx = isan*0.50-4200
    else:
        tx = isan*0.55-7200
    return tx

# 配偶者控除
# https://www.nta.go.jp/taxes/shiraberu/taxanswer/sozoku/4158.htm
# https://www.zeirisi.co.jp/souzokuzei_haigushakoujyo/keisan/

# SPK as Spause Kuojo
# TLT as 法定相続税の合計、TOTAL Legal Tax
# SPT as TLTのうちのSpause法定相続額、Spause Partial Tax
# SAI as 配偶者の実際の相続額、Spause Actual Isan
# IA as 遺産総額、Isan All

def Sp_Koujo(TLT,SPT,SAI,IA):
    SPK = TLT*min(max(SPT, 16000), SAI)/IA
    return SPK

# 初期設定ファイル(input.txt)がある場合は、それを読み込む。ない場合は入力を促す。

import os

while (os.path.exists('input.txt')):
    # input.txt の読み込み。子供の数、遺産総額、配偶者による一次相続から二次相続までの消費
    with open("input.txt") as f:
        n_ks = int(f.readline())
        y_isan = int(f.readline())
        y_consume = int(f.readline())

        print("子供の数",n_ks,"人")
        print("遺産総額",y_isan,"万円")
        print("配偶者による一次相続から二次相続までの消費",y_consume,"万円")
        break
else:

    # 対話式入力
        n_ks_str=input("子供は何人いますか？　人数を入力して下さい  ")
        n_ks = int(n_ks_str)
        print (n_ks,'人')
    
        y_isan_str=input("遺産総額はいくらですか？金額を、万円の単位で入力して下さい。")
        y_isan = int(y_isan_str)      
        print ('遺産総額は',y_isan,'万円')

        y_consume_str=input("一次相続から二次相続までの間に配偶者が消費する金額はいくらにしますか？金額を、万円の単位で入力して下さい。")
        y_consume = int(y_consume_str)
        print ('配偶者が消費する金額は',y_consume,'万円')
        
# 対話式入力あるいは設定ファイル読み込みが正常終了した場合の処理 
# データの確認

print("相続人の人数は", n_ks + 1, "人")
y_kisokoujo=3000+600*(n_ks+1)
print("基礎控除額は", y_kisokoujo,"万円")
y_isan_koujogo = y_isan-y_kisokoujo
if y_isan_koujogo < 0:
     y_isan_koujogo=0
     print("課税遺産額は、", y_isan_koujogo,"万円")
else:    
     print("課税遺産額は、",y_isan_koujogo ,"万円")

# 一次相続時の相続税の計算
r_sp = 0.5
r_ks = 0.5

y_sp_legal_isan = r_sp * y_isan_koujogo
print('配偶者の法定相続額は',y_sp_legal_isan,'万円')

y_ks_legal_isan = r_ks * y_isan_koujogo / n_ks
print('子供一人あたりの法定相続額は',y_ks_legal_isan,'万円')

TXs=Tax(int(y_sp_legal_isan))
print('配偶者法定相続税(配偶者控除前)は、',TXs, " 万円")

TXk=Tax(int(y_ks_legal_isan))
print("子供一人あたりの法定相続税は、",TXk," 万円")

y_total_legal_tax=TXs +TXk * n_ks
print('法定相続納税の合計',y_total_legal_tax,'万円')
print('==========')

## 配偶者の取り分を配偶者の一次相続から二次相続までの消費を開始金額として、
## プラス100万円ずつ増加させ、総遺産満額まで取り分を変化させた場合の
## 納税額を計算する。

# 出力用のファイルを設定する。

with open("output.txt", "w") as f:

    print ('配偶者の相続額',',','子供の相続額',',','一次納税額合計',',','二次相続税額',',','一次二次の納税合計額',file=f)
    # それぞれの相続額と相続税(配偶者控除後)の列挙と一次納税額の合計

    for y_sp in range(y_consume, y_isan + 100, 100): # 100万円ステップで刻む
        y_ks = ( y_isan - y_sp ) / n_ks # 子供ひとりあたりの遺産額を計算する
        tx_sp = (y_sp / y_isan * y_total_legal_tax)
        tx_ks = (y_ks / y_isan * y_total_legal_tax)

    # 配偶者控除を計算する
        tx_sp_koujo = Sp_Koujo(y_total_legal_tax,tx_sp,y_sp,y_isan)
        tx_sp_koujogo = tx_sp - tx_sp_koujo
        tx_1st_total = tx_sp_koujogo + tx_ks * n_ks

     
# 二次相続を計算する。
# 二次相続時の相続額は、y_sp - tx_sp_koujogo - y_consume となる。
#　法定相続人の人数は、n_ks
# 子供一人あたりの相続税を tx_ks2
        if y_sp - tx_sp_koujogo - y_consume - (3000 +600*n_ks) < 0:
            tx_ks2 = 0
        else:
            tx_ks2 = Tax((y_sp - tx_sp_koujogo - y_consume - (3000 +600*n_ks))/n_ks)

        print (y_sp,',',y_ks * n_ks,',',tx_1st_total,',',(tx_ks2 * n_ks),',',tx_1st_total+(tx_ks2 * n_ks),file=f)
        # 配偶者の相続額、子供全員の一次相続額、一次相続後の相続税計、二次相続時の相続税、一次と二次相続税の合計

# 結果の図示

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

output_csv = pd.read_csv('output.txt',encoding = 'UTF8')

first_column_data = output_csv[output_csv.keys()[0]]
second_column_data = output_csv[output_csv.keys()[4]]

plt.xlabel(output_csv.keys()[0])
plt.ylabel(output_csv.keys()[4])

plt.plot(first_column_data, second_column_data, linestyle='solid', marker='')
plt.show()

```

以上です。

一次相続時の遺産が1億円(基礎控除前)を妻と子供2人で分割して相続し、その際の配偶者の相続金額をX軸にとってあります。その後、妻が遺産を使わずに亡くなってしまった場合、一次＋二次相続税の金額は、Y軸になりますが、下図のようになりました。二次相続まで考えることが必要ですね。また配偶者が自身の実家からの遺産を配偶者名義で所有していることもあり、それどう扱おうかなと思いましたが、y_consume にマイナス値を入力すればOKなので「運用」で対応可能でしょう。

![Results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561584/57f5b810-5e3c-606a-f524-5b0cd5cb917f.png)