書いて
いる人
資料作成

仕訳データから増減理由を数秒で出す|Pythonで作る科目の増減比較表

Pythonで作る科目の増減比較表
ゆずまる
ゆずまる

こんにちは!「税理士補助スタッフのしごと帖」を運営しているゆずまるです。

月次の報告で、顧問先から「この科目、なぜ増えたんですか?」と聞かれることがあります。

以前は、元帳を1つずつ開いて前月と見比べていたので、とても時間がかかっていました。そこで、仕訳一覧から科目の増減比較表を作るPythonのプログラムを用意したところ、数秒でできるようになりました。

この記事では、その仕組みの考え方と、ダミーデータですぐに試せるサンプルコードを紹介します。プログラミングに慣れていない方にも伝わるように、やっていることを順番に説明します。

この記事でわかること

  • 増減理由を探す作業を、どうやって仕組みにするか
  • コピーして試せるサンプルコード
  • 月次報告での使い方と、気をつけていること

月次チェック全体の流れは、こちらの記事にまとめています。

もくじ
  1. 増減理由を探す作業は、なぜ時間がかかるのか
  2. 仕組みはシンプルな3ステップ
  3. サンプルコード
  4. ダミーデータで動かした結果
  5. 月次報告でどう使っているか
  6. 気をつけていること
  7. まとめ

増減理由を探す作業は、なぜ時間がかかるのか

手作業の場合、科目ごとに次の3つを繰り返します。

  1. 前月と当月の合計を比べる
  2. 差が大きければ、元帳を開く
  3. 2か月分の取引を見比べて、差の原因を探す

1科目だけなら数分ですが、科目の数だけ繰り返すと、すぐに時間が過ぎてしまいます。しかも、やっていることは毎月同じです。毎月同じ手順を繰り返す作業は、プログラムに任せやすい作業です。

仕組みはシンプルな3ステップ

  1. 会計ソフトから、仕訳一覧をCSVで書き出す
  2. 科目ごと・月ごとに金額を集計して、増減を出す
  3. 増減の大きい科目について、摘要ごとの差を大きい順に並べる

ポイントは3つ目です。摘要ごとに前月と当月を比べると、差の原因は次の3つのどれかに分かれます。

  • 当月だけにある取引(新しい支払い、二重計上 など)
  • 前月だけにある取引(今月は発生していない、入力漏れ など)
  • どちらにもあるが、金額が変わった取引

ポイント

元帳を目で見比べるときにやっていることを、そのまま順番に並べただけです。難しい計算はしていません。

サンプルコード

考え方が伝わるように、短くまとめたサンプルコードです。Pythonが入っているパソコンなら、追加のインストールなしで動きます。

仕訳一覧のCSVは、次の6つの列がある想定です。列の名前は、お使いの会計ソフトに合わせて書き換えてください。

日付,借方科目,借方金額,貸方科目,貸方金額,摘要
2026/08/05,消耗品費,3300,現金,3300,文具 まるまる文具店
2026/08/10,地代家賃,110000,普通預金,110000,事務所家賃 8月分
2026/08/15,広告宣伝費,55000,普通預金,55000,Web広告

コードはこちらです。

import csv
import re
from collections import defaultdict

CSV_FILE = "shiwake.csv"   # 仕訳一覧(会計ソフトから書き出したCSV)
LAST_MONTH = "2026-08"     # 前月
THIS_MONTH = "2026-09"     # 当月
MIN_DIFF = 5000            # この金額以上動いた科目だけ、内訳を出す
TOP = 3                    # 内訳を何件まで出すか

# 貸方に出るとプラスになる科目(売上など)
CREDIT_ACCOUNTS = {"売上高", "雑収入"}
# 増減を見ない科目(現金や預金など、貸借対照表の科目)
SKIP_ACCOUNTS = {"現金", "普通預金", "売掛金", "買掛金", "未払金", "預り金"}

totals = defaultdict(lambda: defaultdict(int))                        # 科目 → 月 → 金額
details = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))  # 科目 → 摘要 → 月 → 金額


def to_int(text):
    return int(text.replace(",", "") or 0)


def clean(memo):
    # 「8月分」「9月分」のような月の表記を消して、同じ取引としてまとめる
    return re.sub(r"\s*\d+月分", "", memo).strip()


def add(account, month, memo, amount):
    if not account or account in SKIP_ACCOUNTS:
        return
    if account in CREDIT_ACCOUNTS:
        amount = -amount
    totals[account][month] += amount
    details[account][clean(memo)][month] += amount


# 文字化けするときは encoding="cp932" に変える
with open(CSV_FILE, encoding="utf-8-sig", newline="") as f:
    for row in csv.DictReader(f):
        month = row["日付"][:7].replace("/", "-")
        if month not in (LAST_MONTH, THIS_MONTH):
            continue
        add(row["借方科目"], month, row["摘要"], to_int(row["借方金額"]))
        add(row["貸方科目"], month, row["摘要"], -to_int(row["貸方金額"]))

rows = []
for account, by_month in totals.items():
    last, this = by_month[LAST_MONTH], by_month[THIS_MONTH]
    rows.append((account, last, this, this - last))
rows.sort(key=lambda r: abs(r[3]), reverse=True)

# 増減比較表をCSVに保存(Excelで開けます)
with open("zougen.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["科目", "前月", "当月", "増減"])
    writer.writerows(rows)

print(f"■ 科目の増減({LAST_MONTH} → {THIS_MONTH})")
for account, last, this, diff in rows:
    print(f"{account}:{last:,} → {this:,}({diff:+,})")

print("\n■ 増減の内訳")
for account, last, this, diff in rows:
    if abs(diff) < MIN_DIFF:
        continue
    print(f"\n【{account}】{diff:+,}円")
    items = []
    for memo, by_month in details[account].items():
        before, after = by_month[LAST_MONTH], by_month[THIS_MONTH]
        if before != after:
            items.append((memo, before, after))
    items.sort(key=lambda i: abs(i[2] - i[1]), reverse=True)
    for memo, before, after in items[:TOP]:
        if before == 0:
            note = "当月のみ"
        elif after == 0:
            note = "前月のみ"
        else:
            note = f"{before:,} → {after:,}"
        print(f"  {after - before:+,}円 {memo}({note})")

使い方

  1. 上のコードを zougen.py という名前で保存する
  2. 同じフォルダに、仕訳一覧のCSVを shiwake.csv という名前で置く
  3. コードの上のほうにある「前月」「当月」を、比べたい月に書き換える
  4. コマンドプロンプトでそのフォルダを開き、python zougen.py と入力して実行する(動かないときは py zougen.py)

ダミーデータで動かした結果

架空の会社のデータで動かすと、次のように表示されます。同じ内容の表が zougen.csv にも保存されるので、Excelで開けます。

■ 科目の増減(2026-08 → 2026-09)
給料手当:250,000 → 430,000(+180,000)
売上高:1,210,000 → 1,320,000(+110,000)
消耗品費:3,300 → 91,080(+87,780)
広告宣伝費:55,000 → 0(-55,000)
通信費:8,800 → 17,600(+8,800)
水道光熱費:12,400 → 13,100(+700)
地代家賃:110,000 → 110,000(+0)

■ 増減の内訳

【給料手当】+180,000円
  +180,000円 給与 新入社員(当月のみ)

【売上高】+110,000円
  +220,000円 売上 C設計(当月のみ)
  -110,000円 売上 A商事(880,000 → 770,000)

【消耗品費】+87,780円
  +87,780円 プリンター購入(当月のみ)

【広告宣伝費】-55,000円
  -55,000円 Web広告(前月のみ)

【通信費】+8,800円
  +8,800円 インターネット利用料(8,800 → 17,600)

この結果から、たとえば次のようなことがすぐに読み取れます。

  • 給料手当は、新入社員の給与が加わって増えた
  • 売上高は、C設計との取引が始まり、A商事は減った
  • 消耗品費は、プリンターの購入で増えた
  • 広告宣伝費は、前月だけ発生している(今月は止めたのか、入力漏れなのかを確認する)
  • 通信費は、同じ摘要で金額がちょうど2倍になっている(二重計上かもしれない)

元帳を開く前に、どこを確認すればよいかの当たりがつきます。

注意

文字化けやエラーになるときは、CSVの文字コードが原因のことが多いです。コードの中の utf-8-sig を cp932 に書き換えると、読めることがあります。

月次報告でどう使っているか

私は、月次報告書をお渡しするときに、「なぜこの科目が増減しているのか」をまとめたダイジェストを一緒にお渡ししています。顧問先からも「わかりやすい」と好評です。

数字の表だけだと、増えた・減ったはわかっても、理由までは伝わりません。理由が一言そえてあるだけで、報告がぐっと伝わりやすくなります。

気をつけていること

  • 最後は人の目で確認する:プログラムが教えてくれるのは「差が出ている取引」までです。それが正しい処理なのか、間違いなのかは、元帳や証憑を見て人が判断します。
  • 摘要の書き方をそろえる:摘要で取引をまとめているので、書き方がばらばらだと別の取引として扱われます。サンプルでは「8月分」のような表記を自動で取り除いています。
  • 顧問先のデータを外に出さない:このサンプルは、手元のパソコンの中だけで動きます。AIにコードを書いてもらうときも、実際のデータは渡さず、ダミーデータで作るのがおすすめです。

まとめ

この記事のまとめ

  • 増減理由を探す作業は、毎月同じ手順の繰り返しなので、プログラムに任せやすい
  • 仕訳一覧を科目ごと・月ごと・摘要ごとに集計すれば、差の原因が見えてくる
  • 出てきた結果は、最後に人の目で確認する

AIやプログラムで業務を楽にした全体の話は、こちらの記事に書いています。

ゆずまる

書いている人

ゆずまる

税理士事務所で働く補助スタッフです。
入社3年目で、法人20件ほどの担当先を持ちながら、月次業務、決算業務、確定申告、相続税申告の補助などに携わっています。

前職は銀行員。FP1級取得をきっかけに、会計・税務の分野へ転職しました。
このブログでは、税理士事務所のしごと、経理・会計、Excelを使った業務改善について発信しています。

プロフィールを見る

コメントを書く

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です