B/S(貸借対照表)をスプレッドシートとPythonでつくってみた

きっかけ

今回は、スプレッドシートとPythonを使ってB/S(貸借対照表)をグラフ化してみました。

きっかけは、ニュースでよく耳にする「B/S」がどんなものなのか知りたくなったことです。会計の知識がほとんどない私でも楽しく読めそうな本を探しに本屋へ行き、最終的に選んだのが 会計クイズを解くだけで財務3表がわかる 世界一楽しい決算書の読み方という本でした。

この本の内容をざっくり言うと、身近な企業(ブックオフやメルカリなど)のB/Sを名前を隠して並べ、どちらの企業かを当てるクイズ形式で学べる一冊です。登場人物が毎回「B/Sのどこに注目すればいいか」を話し合ってくれるので、まったく知識がなくても気軽に読み進められます!

実践

本を読み終えたあと、実際に自分でもB/Sを作ってみることにしました。  

まずはスプレッドシートで手作業、その後もっと簡単に作れるようにPythonで自動化してみました。

(基礎編)スプレッドシートでB/Sを作る

本書で紹介されていた方法を参考に、EDINETから「ブックオフ」と「メルカリ」の有価証券報告書を入手し、グラフを作成しました。

  • ブックオフ:第7期(2024/06/01-2025/05/31)  
  • メルカリ:第12期(2023/07/01-2024/06/30)

検索

  • Googleで「EDINET」と検索し、公式サイトにアクセス

  • ページをスクロールして「閲覧サイト」をクリック
  • 書類簡易検索に「ブックオフ」と入力して検索
  • 「有価証券報告書」を選択
  • 左側メニューをスクロールして「貸借対照表」をクリック
  • 貸借対照表が表示されました

表の作成

  • 新しいスプレッドシートを作り、項目を入力
    • 資産サイド:流動資産、固定資産
    • 負債・純資産サイド:流動負債、固定負債、純資産
  • 有価証券報告書から各数値を探して入力
  • 入力後のスプレッドシート

グラフの作成

  • 表全体を選択し「挿入」→「グラフ」をクリック
  • グラフエディタで「100%積み上げ縦棒グラフ」を選択
  • 完成!(金額ベースで比較したい場合は「積み上げ階段面グラフ」を選ぶと見やすいです)

比較対象の作成

同様の手順でメルカリのB/Sも作成し、スプレッドシートに入力 → グラフ化。最後にブックオフと並べて比較しました。資産構成を見比べると、メルカリは流動資産の割合が大きいことが一目でわかります。

(発展編)PythonでB/Sを作る

スプレッドシートで作れるようになると、次のような課題も出てきます。

  • 有価証券報告書から毎回数値を探すのは大変(もっと手軽にいろんな企業を見たい)
  • 参考にした書籍のグラフの色づかいや形式を再現したい

そこで、Pythonを使って自動でグラフを作成するプログラムを書きました。

有価証券報告書の取得

まずは、EDINETの書類簡易検索の結果から有価証券方向書をXBRL形式でダウンロード

ダウンロードしたファイルはZIP形式に圧縮されているので作業フォルダに展開し、以下の構成にしてください

作業フォルダ
|   main.ipynb
|
\---ダウンロードして解凍したフォルダ
    |   XbrlSearchDlInfo.csv
    |
    \---S100UEYZ
        \---XBRL
            +---AuditDoc
            |       jpaud-aai-cc-001_E34064-000_2024-06-30_01_2024-09-25.xbrl
            |       jpaud-aai-cc-001_E34064-000_2024-06-30_01_2024-09-25.xsd
            |       jpaud-aai-cc-001_E34064-000_2024-06-30_01_2024-09-25_def.xml
            |       jpaud-aai-cc-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
            |       jpaud-aai-cc-001_E34064-000_2024-06-30_01_2024-09-25_pre.xml
            |       jpaud-aar-cn-001_E34064-000_2024-06-30_01_2024-09-25.xbrl
            |       jpaud-aar-cn-001_E34064-000_2024-06-30_01_2024-09-25.xsd
            |       jpaud-aar-cn-001_E34064-000_2024-06-30_01_2024-09-25_def.xml
            |       jpaud-aar-cn-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
            |       jpaud-aar-cn-001_E34064-000_2024-06-30_01_2024-09-25_pre.xml
            |       manifest_AuditDoc.xml
            |
            \---PublicDoc
                   0000000_header_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0101010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0102010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0103010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0104010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0105010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0105020_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0106010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0107010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   0200010_honbun_jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_ixbrl.htm
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25.xbrl
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25.xsd
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_cal.xml
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_def.xml
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_lab-en.xml
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_lab.xml
                   jpcrp030000-asr-001_E34064-000_2024-06-30_01_2024-09-25_pre.xml
                   manifest_PublicDoc.xml

Pythonプログラムを書く

Jupyter Notebook(main.ipynb)上でXBRLを読み込んでグラフを生成します

from bs4 import XMLParsedAsHTMLWarning
import warnings

warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning)

from edinet_xbrl.edinet_xbrl_parser import EdinetXbrlParser
import plotly.graph_objects as go

#########################
# XBRLファイルの読み込み
parser = EdinetXbrlParser()

# このパスを変更すれば他のBSも表示できる
xbrl_path = r'\S100WJSD\XBRL\PublicDoc\jpcrp030000-asr-001_E34102-000_2025-05-31_01_2025-08-15.xbrl'

edinet_obj = parser.parse_file(xbrl_path)

######################
# 貸借対照表の構成定義
xbrl_structure = {
    "企業名": {
        "ix_nofraction": "jpcrp_cor:CompanyNameCoverPage",
        "contextref": "FilingDateInstant"
    },
    "流動資産": {
        "ix_nofraction": "jppfs_cor:CurrentAssets",
        "contextref": "CurrentYearInstant_NonConsolidatedMember"
    },
    "固定資産": {
        "ix_nofraction": "jppfs_cor:NoncurrentAssets",
        "contextref": "CurrentYearInstant_NonConsolidatedMember"
    },
    "流動負債": {
        "ix_nofraction": "jppfs_cor:CurrentLiabilities",
        "contextref": "CurrentYearInstant_NonConsolidatedMember"
    },
    "固定負債": {
        "ix_nofraction": "jppfs_cor:NoncurrentLiabilities",
        "contextref": "CurrentYearInstant_NonConsolidatedMember"
    },
    "純資産": {
        "ix_nofraction": "jppfs_cor:NetAssets",
        "contextref": "CurrentYearInstant_NonConsolidatedMember"
    }
}

###############################
# データ抽出(百万円単位に変換)
xbrl_data = {}
for item, info in xbrl_structure.items():
    key = info["ix_nofraction"]
    context_ref = info["contextref"]
    value_obj = edinet_obj.get_data_by_context_ref(key, context_ref)

    raw_value = value_obj.get_value() if value_obj else ""

    try:
        # 数値として解釈できる場合 → 百万円単位に変換
        value = int(float(raw_value)) // 1_000_000
    except (ValueError, TypeError):
        # 数値でない場合 → 文字列としてそのまま保持
        value = raw_value

    xbrl_data[item] = value

################
# Plotlyで可視化
asset_stack = ['固定資産', '流動資産']
liability_stack = ['純資産', '固定負債', '流動負債']
colors = {
    '流動資産': '#add8e6',
    '固定資産': '#87cefa',
    '流動負債': '#ffa07a',
    '固定負債': '#ff7f50',
    '純資産': '#7fff00'
}
x_asset = 0
x_liability = 0.5
bar_width = 0.5

fig = go.Figure()

#############
# 借方(資産)
bottom_asset = 0
for item in asset_stack:
    fig.add_trace(go.Bar(
        name=item,
        x=[x_asset],
        y=[xbrl_data[item]],
        offset=0,
        width=bar_width,
        marker_color=colors[item],
        text=f"{item}: {xbrl_data[item]:,} 百万円",
        hoverinfo="text",
        base=bottom_asset
    ))
    bottom_asset += xbrl_data[item]

#####################
# 貸方(負債+純資産)
bottom_liability = 0
for item in liability_stack:
    fig.add_trace(go.Bar(
        name=item,
        x=[x_liability],
        y=[xbrl_data[item]],
        offset=0,
        width=bar_width,
        marker_color=colors[item],
        text=f"{item}: {xbrl_data[item]:,} 百万円",
        hoverinfo="text",
        base=bottom_liability
    ))
    bottom_liability += xbrl_data[item]

#################
# レイアウト調整
fig.update_layout(
    title=f'貸借対照表({xbrl_data["企業名"]})',
    title_x=0.5,
    title_font=dict(size=15),
    yaxis_title='金額(百万円)',
    xaxis=dict(
        tickvals=[x_asset + bar_width / 2, x_liability + bar_width / 2],
        ticktext=['借方', '貸方'],
        range=[-0.1, x_liability + bar_width + 0.1]
    ),
    showlegend=False,
    template='plotly_white',
    height=500
)

fig.show()

実行すると、このような貸借対照表グラフが表示されます

おわりに

今回はスプレッドシートとPythonを使ってB/Sをグラフ化してみました。
数字だけだと難しく感じる財務諸表も、グラフにすると企業ごとの特徴や違いが一目でわかって面白いですね。
今回作ったPythonプログラムを使えば、他の企業のB/Sも簡単に可視化できるので、今後は他の企業を比較したり、P/LやC/Fといった他の財務諸表にもチャレンジしてみたいと思います。

会計やプログラミングの知識がなくても、まずはスプレッドシートから気軽に試せるので、興味がある方はぜひやってみてください!

コメント

タイトルとURLをコピーしました