【Python×OpenAI API】仕訳の異常検知を自動化|月次決算レビュー編

Python
この記事は約11分で読めます。

月次決算のたびに、数千行の仕訳データを目で追って確認していませんか。「金額が一桁多い」「休日に計上されている」「いつもと違う勘定科目が使われている」といった誤りは、件数が増えるほど見落としやすくなります。とはいえ、すべてを生成AIに丸投げするのは、精度と情報管理の両面で不安が残ります。

この記事では、Pythonで仕訳データの異常検知を行い、ルールで抽出した「怪しい仕訳」だけをOpenAI APIに渡して、確認ポイントのコメントを自動生成する仕組みを解説します。コピペで動くサンプルコードと、AIへの指示文(プロンプト)の例も載せています。

対象読者は、会計ソフトから仕訳CSVを出力できる経理担当者や、月次レビューを担う経理マネージャーです。Pythonの基本操作ができれば試せる内容です。

スポンサーリンク

Pythonで仕訳データの異常検知を行うメリット

仕訳チェックの自動化にPythonを使う利点は、大量データを毎月同じ手順で処理できる再現性にあります。

表データ処理ライブラリ「pandas(パンダス)」なら、数万行のCSVも短時間で集計できます。チェック条件をコードで残せるため、担当者が替わっても同じ基準でレビューできます。

ただし、ルールだけでは「何を確認すべきか」まではわかりません。そこで、確認事項の作成を生成AIに任せます。判定はルール、説明はAIという役割分担が、本記事の基本的な考え方です。

仕訳チェック自動化の全体像とルール設計

仕組みは大きく4つのステップで構成します。いきなりAIに全件を読ませず、まずPythonで候補を絞り込むのがポイントです。送信するデータ量が減るため、コストと情報漏えいリスクの両方を抑えられます。

  1. 会計ソフトから当月の仕訳CSVを出力する
  2. Python(pandas)でルールに当てはまる仕訳にフラグを付ける
  3. フラグ付きの仕訳だけをOpenAI APIに送り、確認コメントを生成する
  4. 結果をExcelに出力し、担当者が確認して対応を記録する

異常検知のルールは、自社の業務に合わせて決めます。最初は次のような、説明しやすいルールから始めるのがおすすめです。

ルール判定の考え方想定される誤り・不正
高額仕訳勘定科目ごとの過去平均+標準偏差×3を超える桁間違い、二重計上
休日計上計上日が土日日付の入力ミス、権限外の入力
端数なし金額10万円単位ちょうどの金額見積額のまま計上、仮払の精算漏れ
摘要の欠落摘要が空欄または極端に短い証憑との突合が困難
重複の疑い同日・同額・同取引先が複数二重計上

休日計上や端数なし金額は、業種により正常な取引も多く含みます。閾値(しきいち:判定の境目)は運用しながら調整してください。

pandasで仕訳データを読み込み異常フラグを付ける

ここからは実装です。想定するCSVの列は「伝票番号、日付、借方科目、金額、取引先、摘要」の6つです。会計ソフトによって列名は異なるため、最初に列名を対応づける処理を入れておくと使い回しが楽になります。

会計ソフトのCSVは文字コードがShift_JISの場合があるため、文字化けしたらencodingの指定を変えてください。

import pandas as pd

COLS = {'伝票番号': 'slip_no', '日付': 'date', '借方科目': 'account',
        '金額': 'amount', '取引先': 'partner', '摘要': 'memo'}

df = pd.read_csv('journal_2026_09.csv', encoding='cp932')
df = df.rename(columns=COLS)
df['date'] = pd.to_datetime(df['date'])
df['memo'] = df['memo'].fillna('')

# 過去12か月分から科目ごとの平均と標準偏差を作る
hist = pd.read_csv('journal_past12m.csv', encoding='cp932').rename(columns=COLS)
stats = hist.groupby('account')['amount'].agg(['mean', 'std']).fillna(0)
df = df.join(stats, on='account')

flags = []
for _, r in df.iterrows():
    f = []
    if r['amount'] > r['mean'] + 3 * r['std']:
        f.append('高額')
    if r['date'].weekday() >= 5:
        f.append('休日計上')
    if r['amount'] >= 100000 and r['amount'] % 100000 == 0:
        f.append('端数なし')
    if len(str(r['memo'])) < 4:
        f.append('摘要不足')
    flags.append('、'.join(f))
df['flags'] = flags

dup = df.duplicated(subset=['date', 'amount', 'partner'], keep=False)
df.loc[dup, 'flags'] = df.loc[dup, 'flags'] + '、重複疑い'
df['flags'] = df['flags'].str.strip('、')

suspects = df[df['flags'] != ''].copy()
print(f'抽出件数: {len(suspects)} / 全{len(df)}件')

過去データにない新しい科目は高額判定が働かないため、「初出科目」としてフラグにする処理を加えるとより実務的です。

OpenAI APIで異常仕訳に確認コメントを付ける

次に、抽出した仕訳をOpenAI APIに送ります。ここでは「Structured Outputs(構造化出力)」という機能を使います。AIの回答を、あらかじめ決めたJSON形式(項目名と値の組み合わせ)に沿って返させる仕組みです。

回答の形式が揃うため、Excelへの書き出しや集計がしやすくなります。執筆時点(2026年10月)の公式ドキュメントでは、Pythonの型定義ライブラリPydanticで形式を定義し、client.responses.parseで呼び出す例が紹介されています。

import os
from openai import OpenAI
from pydantic import BaseModel

client = OpenAI()  # APIキーは環境変数 OPENAI_API_KEY から読み込む
MODEL = os.environ['OPENAI_MODEL']  # 公式ドキュメントで推奨モデルを確認して設定

class Review(BaseModel):
    risk_level: str        # 高・中・低
    reason: str            # 異常と考えられる理由
    check_points: list[str]  # 担当者が確認すべき事項

SYSTEM = open('prompt_review.txt', encoding='utf-8').read()

def review(row):
    text = (f"科目:{row['account']} 金額:{int(row['amount'])} "
            f"日付:{row['date']:%Y-%m-%d} 摘要:{row['memo']} "
            f"科目平均:{int(row['mean'])} フラグ:{row['flags']}")
    res = client.responses.parse(
        model=MODEL,
        input=[{'role': 'system', 'content': SYSTEM},
               {'role': 'user', 'content': text}],
        text_format=Review,
    )
    return res.output_parsed

results = [review(r) for _, r in suspects.iterrows()]
suspects['リスク'] = [x.risk_level for x in results]
suspects['理由'] = [x.reason for x in results]
suspects['確認事項'] = ['/'.join(x.check_points) for x in results]
suspects.to_excel('review_2026_09.xlsx', index=False)

ポイントは送信項目を絞っている点です。取引先名は送らず、科目・金額・日付・摘要とフラグだけを渡しています。モデル名は環境変数で切り替えられるようにし、モデル更新時の修正を最小限にしています。

コピペで使えるレビュー用プロンプト例

上のコードで読み込むprompt_review.txtの例です。AIの役割、判断基準、禁止事項を明確に書くことで、回答のぶれを抑えられます。

あなたは日本の中小企業の経理レビュー担当者です。
入力された1件の仕訳と、ルールで付与されたフラグを読み、
次の方針で評価してください。

- risk_level は「高」「中」「低」のいずれかにする
- reason には、フラグと金額・摘要から考えられる理由を
  80字以内で書く
- check_points には、担当者が証憑や関係部署に確認すべき
  事項を2〜3個、具体的な行動の形で書く
- 入力にない事実(取引の実在、相手先の状況など)を推測で
  断定しない。不明な点は「確認が必要」と書く
- 税務上の最終判断は行わず、必要に応じて
  「税理士等への確認を推奨」と書く

月次決算レビューへの組み込み手順とチェックリスト

仕組みは月次決算の流れに組み込んで初めて効果が出ます。例えば、月末締めで翌月5営業日目に決算を確定する会社なら、次のような流れが考えられます(想定ケース)。

  1. 翌月2営業日目:仕訳入力が一段落した時点でCSVを出力する
  2. 同日:Pythonスクリプトを実行し、レビュー用Excelを作成する
  3. 3営業日目:担当者がリスク「高」から順に証憑を確認し、対応欄に結果を記入する
  4. 4営業日目:修正仕訳を入力し、マネージャーが対応欄を承認する
  5. 決算確定後:誤検知が多かったルールの閾値を見直し、次月に反映する

運用開始前には、次のチェックリストで準備状況を確認しておきましょう。

  • □ 仕訳CSVの列名と文字コードを確認し、読み込みテストを済ませた
  • □ 比較用の過去データ(12か月程度)を用意した
  • □ AIに送る項目を決め、取引先名や個人名を除外した
  • □ APIキーを環境変数で管理し、コードやExcelに書いていない
  • □ レビュー結果の「対応内容」「確認者」を記録する列を用意した
  • □ 誤検知・見逃しを月ごとに記録し、ルールを見直す担当を決めた

「どの条件で抽出し、誰がどう確認したか」が残るため、レビュー結果のExcelは監査対応の資料にも活用できます。

導入時の注意点・リスク(情報管理とAIの誤り)

経理データを外部APIに送る以上、社内ルールとの整合は欠かせません。導入前に次の点を確認してください。

  • データの取り扱い:OpenAIは、API経由のデータをデフォルトではモデルの学習に使わないと公式に案内しています。ただし保存期間などの条件は契約や設定により異なるため、最新の公式情報と自社の情報セキュリティ規程を確認してください。
  • 個人情報の除外:給与仕訳や立替経費の摘要には、従業員の氏名が含まれることがあります。送信前に該当科目を除外するか、氏名をマスキングする処理を入れましょう。
  • ハルシネーション(AIがもっともらしい誤りを出力すること):AIのコメントはあくまで確認のヒントです。最終判断は必ず人が証憑で行い、AIの出力を根拠に修正仕訳を入れないでください。
  • APIキーの管理:共有フォルダやスクリプト内に直接書かず、権限管理と利用上限の設定も検討しましょう。
  • ルールの網羅性:ルールに当てはまらない誤りは検出できません。この仕組みは目視レビューの「補助」であり、内部統制の代替ではない点を関係者で共有してください。

よくある質問(FAQ)

Pythonの経験がなくても導入できますか?

本記事のコードは、Pythonの基本操作(ライブラリのインストールとスクリプト実行)ができれば動かせる分量にしています。まったく経験がない場合は、まずpandasでCSVを読み込み、件数を表示するところまで試すのがおすすめです。エラー文を生成AIに貼って原因を聞くと、つまずきを減らせます。

APIの利用料金はどのくらいかかりますか?

料金はモデルと送受信する文字量(トークン数)によって決まり、改定されることもあるため、公式の料金ページで最新情報を確認してください。本記事の方法は、ルールで絞り込んだ仕訳だけを送るため、全件をAIに読ませる方法に比べて送信量を抑えられます。まずは1か月分で試し、管理画面で利用額を確認しましょう。

会計ソフトの標準チェック機能と何が違いますか?

会計ソフトの標準機能は、科目と税区分の組み合わせなど決まった観点のチェックが中心です。Pythonなら自社独自のルールや過去データとの比較を自由に追加できます。標準機能で基本的な誤りを防ぎ、本記事の仕組みで自社特有のリスクを補う、という併用が現実的です。

まとめ:まずは1か月分の仕訳で試してみよう

Pythonによる仕訳データの異常検知は、「ルールで候補を絞り、AIで確認事項を言語化する」という分担で、精度と情報管理を両立しやすくなります。pandasで高額・休日・重複などのフラグを付け、Structured Outputsで形式を揃えたコメントを生成すれば、レビュー結果をそのまま記録として残せます。

次のアクションとして、まずは前月分の仕訳CSVで抽出件数を確認し、誤検知の多いルールを調整してみてください。手応えを感じたら、AIコメントの生成と月次決算スケジュールへの組み込みに進みましょう。

関連記事

参考リンク

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