※この記事にはアフィリエイトリンクが含まれます(Amazon・楽天)。
マネーフォワードをエクスポートするたびに、「未分類」の行が必ず残る。先月どこで何に使ったのか集計しようとすると、「セブン-イレブン支払い」「クレジット 12月」「ご利用分」── 店名が分類されていない行が10件、20件と積み重なっていく。それを一つひとつ手で直して、Excelに貼って、合計を出すのに毎月15分かかっていた。
>
そのルーティンが、今月から3秒になった。 自分で育てた「店名の辞書」を持つスクリプト ── mf-categorizer ── が、一度覚えた店を次の月も自動で分類してくれる。設定は初回だけ。あとはルールが育っていく。
この記事は、AIワークフロー連作「自動化レシピ集」 の第4レシピです。第17記事ではブログ運営の書籍CTAを自動化し、第20記事ではテスラ株のニュースをLINEで自動受信する仕組みを作りました。今回は「家計版」── 毎月の支出把握をAIルールで自動化します。
ツールは GitHub で全公開しています: fukuokacolor-web/mf-categorizer
1. 発端 ── 毎月15分の「未分類つぶし」
副業ブログを始めた最初の月、月¥17,078のコストをすべて公開した記事を書きました。あのとき、自分の家計をきちんと把握しようと思い直して、マネーフォワードMEで毎月の支出を集計するようにしました。
ところが、続けてみると毎月同じ問題が起きる。
マネーフォワードのCSVをエクスポートすると、「大項目」「中項目」の列に「未分類」が並んでいる行が必ずある。コンビニで支払ったクイックペイ、クレジットカードの引き落とし明細、近所のスーパーの支払い ── マネーフォワードが自動で分類してくれる店もあるけれど、そうでない店はそのまま「未分類」のまま残る。
最初の月はしかたなく一件ずつ手で直した。「これは食費」「これは日用品」と打ち込んで、Excelに貼り付けて、SUM関数で合計を出す。15分かかった。
翌月も同じ。同じスーパーが、また「未分類」で出てくる。先月直したのに、CSVをエクスポートし直すとリセットされている。
マネーフォワード上での手動修正はCSVに引き継がれない、ということに気づくまでしばらくかかった。毎月15分、同じ作業を繰り返していた。
同じ作業を100回繰り返す前に、自動化する側に回った日 ── 第17記事でそう書いた。まさにこれが、家計版のその状況だった。
毎月エクスポートするたびに同じ店が「未分類」で出てくるなら、自分の手で「この店はこのカテゴリ」と一度覚えさせて、翌月以降は自動で分類させればいい。そう思って作ったのが、mf-categorizer です。
2. 設計 ── 自動化ルールを「辞書で育てる」という考え方
mf-categorizerの発想はシンプルです。
「一度覚えた店は、翌月も同じルールで仕分ける」
マネーフォワードのCSVを読み込んで、自分で用意した「店名 → カテゴリ」の辞書と照合し、分類し直す。辞書に載っていない店は「要確認」シートに出す。要確認を見て、また辞書に追記する。これを毎月繰り返すうちに、自動分類できる件数がどんどん増えていく。
辞書は rules.json というファイルに書きます。こんな形です:
{"match": "セブンイレブン", "category": "食費", "subcategory": "コンビニ"}
match は部分一致で動きます。「セブンイレブン」と書けば、「セブンイレブン 博多駅前店 福岡県 福岡市」のように長い店名でもすべてヒットします。Pythonのコードを書く必要はありません。店名とカテゴリ名を、メモ帳に書く感覚で追加するだけです。
同じ店でも金額帯で振り分けたい場合
少し凝ったルールも書けます。たとえばショッピングモール ── フードコートでランチを食べることもあれば、子ども服を買うこともある。店名は同じでも、金額によってカテゴリが違う。
そういうケースに使うのが「金額帯分岐」です:
{
"match": "ららぽーと",
"splits": [
{"max_amount": 1200, "category": "食費", "subcategory": "外食"},
{ "category": "衣服・美容", "subcategory": "子供服"}
]
}
「ららぽーとで1,200円以下なら外食(フードコート)、超えたら子ども服」と読みます。max_amount の設定がないものが最後のデフォルトになるので、上から順番に条件を並べれば多段階の振り分けもできます。
プライバシー設計:ルールは手元にしか残らない
rules.jsonには、自分がよく使う店名が並んでいきます。これは個人の行動パターンそのものなので、外に出てはいけない。GitHubで公開するとき、このファイルは .gitignore に入れて絶対にcommitしない設計にしました。
配布されるのは rules.example.json(全国チェーンのみの汎用サンプル)だけです。使う側は「これをコピーして自分用に育てる」という流れになります。取引データが入ったExcelファイルやCSVも同様に .gitignore で除外しています。
3. 実装 ── Pythonスクリプトの役割
mf-categorizerは1つのPythonスクリプト mf_categorize.py で動きます。処理の流れはこうです:
① MFのCSVを読み込む(cp932/Shift-JIS形式 = マネーフォワードのCSV標準形式)
② rules.jsonのルールと照合して各取引を再分類
③ Excelファイルを3シートで書き出す
- 取引明細 … MFの分類とAIの分類を並べて表示
- 月次サマリー … カテゴリ別の合計
- 要確認 … ルールにヒットしなかった取引
色分けの意味
取引明細シートは行ごとに色が変わります:
| 色 | 意味 |
|---|---|
| 黄色 | MFの分類とAIの分類が違う(=MFの自動分類を上書きした) |
| 赤 | ルールにヒットしなかった(=要確認、来月覚えさせる候補) |
| 灰 | 振替(クレジット引き落とし等、収支の集計対象外) |
| 白 | MFとAIの判定が一致(何も変えていない) |
黄色が多いほど「マネーフォワードの分類を自分好みに上書きできている」、赤が多いほど「まだ覚えさせていない店がある」という読み方です。初月は赤だらけでも、毎月要確認を1件ずつ rules.json に追記していけば、翌月の赤が減っていきます。
実装中に踏んだ罠:全角と半角の1文字違い
少し話がそれますが、開発中に1つハマりました。
マネーフォワードのCSVヘッダは「金額(円)」と全角括弧を使っています。Pythonで r.get("金額(円)", "0") と半角括弧で書いてしまうと、キーが一致せず全件0円として処理されてしまう。合計が0円のサマリーが出てきたときは「バグか?」と思いましたが、原因は括弧1文字の全角/半角の違いでした。
見た目では区別がつかないこの手の問題は、非エンジニアには特にわかりにくいと思います。デバッグの手順は「ヘッダを repr() で出力して実際の文字コードを確認する」。このひと手間で解決しました。記事の中に書いたのは、同じところで詰まる人の助けになるかもしれないからです。
4. 実録 ── 初回セットアップから「ゼロ達成」まで
実際にどう使うか、順を追って書きます。
Step 0: インストール
git clone https://github.com/fukuokacolor-web/mf-categorizer
cd mf-categorizer
pip install -r requirements.txt
必要なライブラリは openpyxl だけです。
Step 1: ルールファイルを作る
cp rules.example.json rules.json
rules.example.json には全国チェーンの基本ルールが入っています。これをコピーして、自分がよく行く店を追記していきます。書き方は:
{"match": "よく行くスーパーの名前", "category": "食費", "subcategory": "食料品"}
「category」に使えるのは自由です。自分がわかりやすい名前で作ればいい。「食費」「日用品」「交通費」「サブスク」「自動車」「教養・娯楽」「衣服・美容」あたりを最初に揃えておくと月次サマリーが見やすくなります。
Step 2: マネーフォワードからCSVをエクスポート
マネーフォワードME → 家計簿 → 対象月 → 「収入・支出詳細」→「ダウンロード」→ CSVを選択します。ファイル名は「収入・支出詳細_2026-05-01_2026-05-31.csv」のような形になります。
Step 3: スクリプトを実行
python mf_categorize.py ~/Downloads/収入・支出詳細_2026-05-01_2026-05-31.csv
数秒で output/ フォルダにExcelファイルが出てきます。
出力されたExcelを見てみる
実際の出力(サンプルデータによる出力例)がこちらです。

MFが「未分類」としていた「ENEOS ○○ SS」「スターバックス ○○店」「ダイソー ○○店」などが、AIの列では「自動車/ガソリン」「食費/カフェ」「日用品/日用品」に分類されています。「ららぽーと ○○ フードコート」(-1,100円)は金額帯ルールが効いて「食費/外食」に、「ららぽーと ○○ キッズ衣料」(-6,800円)は「衣服・美容/衣服」に自動振り分けされています。
月次サマリーはこうなります:

「食費 -10,540円 / 衣服・美容 -6,800円 / 自動車 -5,500円 / サブスク -3,890円 …」と、カテゴリ別の合計が一覧で出ます。件数も表示されるので、「食費が多いのは件数が多いから?それとも1件が高い?」という確認がすぐできます。
そして「要確認」シートがこちら:

Amazonと給与の2件が「要確認」に出ています。Amazonはルールに書いていないのでヒットせず、給与は収入なのでデフォルトで未分類扱い。「ヒント」列には「Gmail の注文確認メールと突合すれば品目わかる(Phase B)」と表示されています。これについては後述します。
学習サイクル:赤を1件ずつ潰していく
「要確認」に出た店を rules.json に追記すると、来月からその店は自動で分類されます。毎月このシートを見て、1〜3件追記するだけ。月を重ねるごとに赤が減り、初月に赤だらけだった取引明細が、半年後にはほぼ白と黄色だけになります。
5. 限界の正直開示 ── クイックペイ・Amazon・イオン問題
このツールが苦手なことを正直に書いておきます。
クイックペイ / Apple Pay は店名が落ちている
クイックペイやApple Payで支払うと、マネーフォワードには「クイックペイプラス決済」「iD決済」のような決済方法名しか来ません。どのお店で使ったかは記録されない。
rules.example.json には「クイックペイプラス」→「食費/コンビニ」というルールを入れてありますが、コンビニ以外でクイックペイを使うと分類がズレます。スーパーで使っても「食費/コンビニ」になる。
これはMFのAPI仕様の限界で、現時点では解決策がありません。クイックペイの件数が多い場合は、金額帯で「少額 = コンビニ系」「高額 = スーパー系」に振り分けるルールを書くと精度が上がります。
Amazon / 楽天は品目が不明
Amazon.co.jpの支払いはMFに金額と「Amazon.co.jp」の店名しか来ません。本を買ったのか、日用品を買ったのか、子ども服を買ったのかは分からない。
デフォルトでは「ショッピング/その他」に分類されますが、「実は食費と日用品が混ざっている」という状況はよく起きます。
将来的にはGmailの注文確認メールと突合することで品目を特定できるかもしれません。これがPhase Bです(後述)。
スーパー兼日用品店は「食費 vs 日用品」の比率が不明
イオンやイトーヨーカドーのようなスーパー兼日用品店は、レシートを見ないと「食費と日用品がどの割合か」分かりません。ルールでは「イオン → 食費/食料品」と割り切っていますが、日用品を買っていた月は実際より食費が多く出ます。
これはレシート連携がないかぎり解決できない問題です。「大まかに把握できればいい」という用途には支障ありませんが、「日用品費を正確に追いたい」という場合は手動修正が必要になります。
6. GitHub公開 ── プライバシー設計と配布判断
このツールを公開するにあたって、一番気になったのがプライバシーでした。rules.jsonには自分がよく行く店の名前が並ぶ。家計データのExcelには実際の支出金額が入っている。これをうっかりGitHubに上げてしまったら大変です。
そこで4つのファイルを .gitignore で除外しています:
| ファイル | 内容 | 対策 |
|---|---|---|
rules.json | 自分専用の店名辞書 | .gitignore で除外 |
output/*.xlsx | 再分類済みExcel | .gitignore で除外 |
*.csv | MFエクスポートの取引データ | .gitignore で除外 |
.env | 将来API連携時のキー | .gitignore で除外 |
GitHubリポジトリに上がるのは:
mf_categorize.py(メインスクリプト、個人情報なし)rules.example.json(全国チェーンのみのサンプル)README.md/LICENSE/requirements.txt
使う側は「rules.example.json をコピーして自分用に育てる」という流れです。自分でカスタマイズしたルールは、手元にしか存在しない。この設計なら、フォークして自分のリポジトリに置いても、個人の行動パターンが外に漏れることはありません。
まずは README だけ見てみるだけでもイメージが掴めます: fukuokacolor-web/mf-categorizer
rules.example.json を見てみれば、自分の行きつけの店名を追加するだけだと分かります: rules.example.json
7. 次のステップ ── 家計版AIワークフローの全体像
このツールを作って、月次の財務確認の流れがこうなりました。
まず試してみるなら、rules.example.json を開いて、自分がよく行くコンビニやスーパーの名前を1行追加するだけで始められます。GitHub から clone してすぐ動かせます: fukuokacolor-web/mf-categorizer
以前:
- マネーフォワードを開く → CSVエクスポート → 未分類を手で直す(15分) → Excelで集計
今:
- マネーフォワードを開く → CSVエクスポート → スクリプト実行(3秒) → Excelを確認
未分類をつぶす作業がなくなったので、月次確認の時間が大幅に短くなりました。
第20記事のテスラLINEレポートと組み合わせると、月次の財務確認がこうなります:
- 投資監視: 毎朝8時にLINEでテスラ株+原油+金利の状況を把握
- 支出把握: 月末にスクリプト1本でカテゴリ別の支出サマリーを確認
この2本が揃うと、「入ってくるお金(投資)」と「出ていくお金(支出)」を月10分以内で確認できる体制になります。
Phase B の予告
今のツールには正直な限界があります。「ならぽーと方式」で金額帯で振り分けても、Amazon/楽天の支出が何に使ったお金なのか、品目まではわかりません。月の食費が2万円なのか、子ども服が3万円なのか、家計の本当の内訳はAmazonとQuicPayの中に埋まっています。
Phase B では、GmailのAmazon注文確認メールを自動で読んで、mf-categorizerの出力と突き合わせる仕組みを作る予定です。これが実現すると、「Amazon ¥3,580」の行が「Amazon / 書籍 ¥2,100 + 日用品 ¥1,480」として品目ごとに分解できるようになります。
自動化レシピ集に随時追加していきます。
おわりに
マネーフォワードを入れても未分類が残る ── そのイライラは、「ツールが悪い」のではなく「自分用の辞書が育っていない」というだけでした。
一度覚えさせれば来月は自動。来月また覚えさせれば再来月も自動。ルールは月を重ねるごとに育っていく。半年後の自分は、今の自分が積み上げたルールに乗っかって、何もしなくても家計が整理されている状態になっています。
「未分類ゼロ」は目的ではなく、毎月の家計把握を普通の習慣にするための入口でした。
『AI 思考 技法』
今回のツール設計の発想も、ルールを「育てる」という考え方も、この本に背中を押された。AIを「相棒」として使うための56の技法が一冊に。1人で考えるのが苦手な方や、自分の思考の型を増やしたい方に。
続編記事
- 【実録】Claude Code導入とWordPress立ち上げ
- 【実録】WordPress 初期設定6項目+宿題
- 【実録】Claude Code に丸投げで固定ページ4本
- 【実録】ローカルMarkdown × Claude Code 連携
- 【実録】A8登録 → Xサーバー提携 → バナー設置
- 【実録】非エンジニアがGA4とSearch Consoleを導入した日
- 【実録】Claude DesignでデザインするとAIが会議を開いて自動修正した日
- 【実録】GA4の最初のデータを見たら、ドイツからアクセスがあった日
- 【実録】アクティブユーザー27人の正体を確かめに行った日
- 【実録】Amazon書籍リンクを過去5記事に貼った日
- 【実録】AdSense申請をAIに丸投げしたら〈ヘッド用〉と〈ヘッダー用〉を取り違えた日
- 【実録】副業ブログ初月のコスト、サーバー代じゃなかった
- 【実録】DMM生成AI CAMPの無料セミナーを予約する前に
- 【実録】自分を消した4日後、GA4を開いた日
- 【実録】14人の正体を追って、GA4の市区町村まで掘った日
- 【実録】「みんなの為になる記事を書きたい」とAIに相談したら、5方向から答えが返ってきた日
- 【実録】同じ作業を100回繰り返す前に、自動化する側に回った日
- 【実録】「AIで仕事の繰り返しを止める」固定ページを作った日
- 【実録】「毎朝のテスラ株のニュースをLINEに届けて」とAIに頼んだら、エリートアナリストの分析つきで届くようになった日
