ドラッグストア在庫ロスをAI需要予測で年間280万円削減した地方チェーンの実践記

ドラッグストア在庫ロスをAI需要予測で年間280万円削減した地方チェーンの実践記
「文系の私にPythonなんて絶対無理だと思っていました。でも今は、毎朝コーヒーを飲みながらツールを動かすのが日課になっています」
そう話すのは、北陸地方で10店舗を展開するドラッグストアチェーン「サンドラッグ越前」(仮名・従業員数約120名)の店舗運営部長、田中誠二さん(48歳)。大学は文学部出身。Excelのマクロすら「難しそう」と敬遠してきた人物が、2024年秋から独学でPythonを学び始め、わずか8ヶ月でAI需要予測ツールを完成させた。
結果は数字が証明している。廃棄ロス率は3.2%から1.1%へ。年間換算で約280万円のコスト削減。10店舗の発注業務にかかる時間は週あたり合計18時間から6時間に短縮された。
この記事では、田中さんの「失敗だらけの奮闘記」を追いながら、同じような課題を抱える小売業の実務担当者が明日から参考にできる手順を具体的に解説する。難しいコードの暗記は不要。必要なのは「AIに聞き続ける根気」だけだ。
第1章:廃棄ロス3.2%という「見えない出血」に気づいた日
問題は数字を並べた瞬間に見えてきた
田中さんが在庫ロス問題を「本気で解決しなければ」と感じたのは、2024年8月の決算報告がきっかけだった。10店舗合計の廃棄ロス額が年間で約420万円。売上高対比で3.2%という数字は、業界平均(1.5%前後)の2倍以上だった。
「数字を見て頭が真っ白になりました。毎月35万円、毎日1万円以上を文字通りゴミ箱に捨てている計算です。しかもその大半が、発注担当者の『なんとなく多めに頼んでおこう』という判断から生まれていた」
ドラッグストアの在庫管理は一見シンプルに見えて、実は複雑な要因が絡み合う。医薬品・化粧品・日用品・食品と品目が多岐にわたり、季節変動・天候・近隣の競合出店・インフルエンザの流行など、需要に影響する変数が無数にある。田中さんの会社では発注判断を各店の店長に任せており、10人いれば10通りの「経験と勘」が存在していた。
既製品のシステム導入を断念した理由
最初に検討したのは、市販の需要予測システムの導入だ。複数のベンダーに問い合わせたところ、見積もりは初期費用150万〜300万円、月額保守費用5〜15万円というレンジが多かった。
既製システムvs自社開発ツールの比較(検討当初) | ||
項目 | 既製需要予測システム | 自社Pythonツール(目標) |
|---|---|---|
初期費用 | 150万〜300万円 | 0円(Google Colab無料枠) |
月額費用 | 5万〜15万円 | 0〜数千円 |
カスタマイズ性 | 低〜中(ベンダー依存) | 高(自社で自由に変更可) |
導入期間 | 3〜6ヶ月 | 8ヶ月(田中さんの場合) |
社内ナレッジ蓄積 | なし | あり |
必要スキル | 不要 | Python基礎(独学可) |
「3年間の総コストを計算すると、安い既製品でも500万円を超える。それなら自分で作れないか、と思い始めたんです。ちょうどChatGPTが話題になっていた時期で、『AIに聞けばコードを書いてくれる』という記事をよく見かけていました」
YouTubeとChatGPTを「先生」にした独学スタート
2024年9月、田中さんはまず「Python 初心者 入門」でYouTubeを検索することから始めた。毎朝出勤前の30分と、昼休みの15分を学習時間に充てた。最初の1ヶ月は「変数って何?」「リストとは?」という基礎中の基礎。コードを書くより、概念を理解することに時間を使った。
田中さんの独学ルーティン(平日)
・朝7:00〜7:30:YouTubeで動画視聴(「キノコード」「Pythonプログラミング入門」など)
・昼12:00〜12:15:前日の内容をChatGPTに質問して理解を確認
・夜21:00〜22:00:Google Colabで手を動かす(週3〜4回)
ここで田中さんが発見した「最強の使い方」が、ChatGPTへの質問の仕方だ。最初は「Pythonでデータ分析する方法を教えて」という漠然とした質問をしていたが、全く実務に使えない抽象的な回答が返ってきた。転機になったのは、具体的な状況を丸ごと伝える方法に切り替えたことだ。
【田中さんが実際に使ったプロンプト①:状況説明型】
私は北陸地方でドラッグストアを10店舗運営している会社の運営部長です。
Python初心者(文系出身、プログラミング経験ゼロ)です。
現在の課題:
- 各店舗の販売データがExcelファイルで存在する(1店舗1ファイル)
- 商品ごとの廃棄ロスが多く、需要予測ができていない
- 発注は各店長の経験と勘に頼っている
やりたいこと:
- 過去の販売データから翌週の需要を予測したい
- Google Colabで動かしたい
- できるだけシンプルなコードにしてほしい
まず最初に何をすればいいか、ステップ1から教えてください。
専門用語は必ず説明してください。「この質問の仕方に変えた途端、回答の質が劇的に上がりました。『あなたの場合はまずExcelデータを読み込むところから始めましょう』と、自分の状況に合わせた答えが返ってくるようになったんです」
第2章:Excelデータの「汚さ」との格闘——前処理が8割
最初の失敗:データがバラバラすぎて読み込めない
Pythonの基礎を1ヶ月学んだ田中さんは、いよいよ実際のデータを使った分析に挑戦した。ここで最初の大きな壁にぶつかる。
10店舗のExcelファイルを集めてみると、フォーマットが店舗ごとにバラバラだったのだ。ある店は「販売日」という列名、別の店は「売上日付」、また別の店は「日付」。商品コードも、半角数字の店と全角数字の店が混在。さらに、欠損値(データが入っていないセル)が至る所に散らばっていた。
「Pythonのコードは書けても、データが汚すぎてエラーしか出ない。1週間、ひたすらエラーメッセージと格闘しました。あの時期は本当に挫折しそうでした」
この問題をChatGPTに相談したところ、「データクレンジング(前処理)」という概念を教えてもらった。分析の精度は、データの品質で8割が決まる——これが田中さんの最初の学びだった。
【田中さんが実際に使ったプロンプト②:エラー解決型】
以下のPythonコードを実行したところ、エラーが出ました。
原因と修正方法を教えてください。初心者向けに説明してください。
【エラーメッセージ】
KeyError: '販売日'
【私のコード】
import pandas as pd
df = pd.read_excel('store_data.xlsx')
df['販売日'] = pd.to_datetime(df['販売日'])
【状況】
Excelファイルの列名は「売上日付」でした。
他の店舗ファイルは「販売日」という列名です。
10店舗分のファイルを統一して処理したいです。前処理コードの完成:ChatGPTと2週間かけて作り上げた
エラーと格闘しながら、田中さんはChatGPTとの対話を繰り返し、最終的に「どんな形式のExcelでも読み込める前処理コード」を完成させた。このプロセスで重要だったのは、エラーが出るたびに「なぜこのエラーが出るのか」を必ず理解してから次に進んだことだ。
【田中さんが実際に使ったプロンプト③:コード生成型】
以下の条件でPythonのデータ前処理コードを書いてください。
Google Colabで動かします。初心者でも理解できるよう、
各行にコメント(#で始まる説明文)を入れてください。
【条件】
1. 10店舗分のExcelファイル(shop1.xlsx〜shop10.xlsx)を読み込む
2. 列名が店舗によって異なる場合に対応する
- 日付列:「販売日」「売上日付」「日付」のいずれか
- 商品コード列:「商品CD」「商品コード」「SKU」のいずれか
- 販売数量列:「数量」「販売数」「売上数量」のいずれか
3. 全角数字を半角に統一する
4. 欠損値(空白セル)がある行を除外する
5. 最終的に1つのデータフレームにまとめる
6. 処理結果として「何件のデータを読み込んだか」を表示する
使用ライブラリ:pandas、os
わからない用語は説明してください。失敗談①:「きれいなデータ」を信じすぎた
前処理コードが動くようになったとき、田中さんは安心して次のステップに進んだ。しかし2週間後、予測結果がおかしいことに気づく。ある商品の需要予測が「マイナス15個」と出たのだ。
原因を調べると、Excelに「返品数量」がマイナス値で入力されており、それが販売数量の合計を狂わせていた。前処理の段階でマイナス値を除外するか、返品と販売を分けて集計する処理が必要だったのだ。
「データを信じすぎてはいけない、ということを痛感しました。前処理のチェックリストを作って、毎回確認するようにしました」と田中さんは振り返る。この経験から、前処理の最後に「データの基本統計(最大値・最小値・平均値)を必ず確認する」ステップを追加した。
田中さんが作成した前処理チェックリスト | ||
チェック項目 | 確認方法 | よくある問題 |
|---|---|---|
列名の統一 | df.columns で確認 | 全角・半角混在、表記ゆれ |
欠損値の確認 | df.isnull().sum() で確認 | 空白セル、NULL値 |
数値の範囲確認 | df.describe() で確認 | マイナス値、異常に大きい値 |
日付形式の確認 | df['日付'].dtype で確認 | 文字列として読み込まれている |
重複データの確認 | df.duplicated().sum() で確認 | 同じ行が複数回入力されている |
第3章:需要予測モデルの構築——「難しいAI」より「使えるシンプル」を選んだ
最初に試した「高度なAI」が使えなかった理由
データの前処理が完成した田中さんは、いよいよ需要予測モデルの構築に取りかかった。YouTubeで「機械学習 需要予測」と検索すると、「LightGBM」「LSTM(深層学習)」「Prophet」といった手法が次々と出てきた。
最初に試したのはFacebookが開発した「Prophet」という時系列予測ライブラリだ。インストールは簡単で、コードも短い。しかし実際に動かしてみると、予測精度が期待以下だった。田中さんの店舗データは10店舗×約500商品で、商品ごとのデータ量が少ない(1商品あたり平均1.5年分=約78週)ものが多く、複雑なモデルを学習させるには不十分だったのだ。
「高度なAIを使えば使うほど良い、という思い込みがありました。でもChatGPTに相談したら、『データ量が少ない場合はシンプルなモデルの方が精度が高いことが多い』と教えてもらって、目から鱗でした」
選んだのは「移動平均+季節調整」のシンプルな組み合わせ
最終的に田中さんが採用したのは、以下の3つの要素を組み合わせたシンプルなモデルだ。
- 移動平均(4週間):直近4週間の販売数の平均を基準値にする
- 季節調整係数:過去2年の同週のデータから季節変動を補正する
- イベント補正:インフルエンザシーズン・花粉シーズン・お盆・年末年始の係数を手動で設定
「難しい数学は一切使っていません。でも実際の予測精度は、Prophetより高かった。自分のデータの特性を理解した上でモデルを選ぶことが大事だと学びました」
【田中さんが実際に使ったプロンプト④:モデル選択相談型】
私のデータの特性を説明するので、最適な需要予測の手法を教えてください。
【データの特性】
- 10店舗×約500商品のExcel販売データ
- 期間:2022年1月〜2024年8月(約2.5年)
- 商品によってはデータが少ない(半年分しかないものも)
- 明確な季節性がある(風邪薬は冬に急増、日焼け止めは夏に急増)
- 週次での予測が必要(翌週の発注数を決めたい)
【私の制約】
- Pythonの中級者レベル(pandasは使える、機械学習は初心者)
- Google Colabで動かす
- 予測結果をExcelに出力したい
- 複雑すぎるモデルは保守できないのでシンプルなものが良い
ProphetとLightGBMと移動平均法を比較して、
私のケースに最適な手法を推薦してください。
それぞれのメリット・デメリットも教えてください。失敗談②:精度検証を後回しにして現場に迷惑をかけた
モデルが完成した2025年2月、田中さんは意気揚々と3店舗でテスト運用を開始した。しかし1ヶ月後、ある店長から「予測通りに発注したら、特売品が足りなくなった」というクレームが来た。
原因は、チラシ特売のデータをモデルに組み込んでいなかったことだ。特売日は通常の2〜3倍の販売数になるが、その情報が予測に反映されていなかった。
「現場に迷惑をかけてしまったのは本当に申し訳なかった。でもこの失敗があったから、『特売フラグ』という列をデータに追加する改善ができました。現場の声を拾う仕組みを作ることの大切さを学びました」
この経験から田中さんは、毎月1回「予測vs実績の乖離レポート」を作成し、予測が大きく外れた商品を自動でリストアップする機能を追加した。現場の店長が「この商品の予測がいつも外れる」と感じたらすぐに報告できる仕組みも整えた。
モデル改善の変遷 | |||
バージョン | 時期 | 主な変更点 | 廃棄ロス率 |
|---|---|---|---|
v1.0(初期) | 2025年2月 | 移動平均のみ | 2.8% |
v1.5 | 2025年3月 | 季節調整係数を追加 | 2.1% |
v2.0 | 2025年4月 | 特売フラグ・イベント補正を追加 | 1.5% |
v2.5(現行) | 2025年5月〜 | 予測乖離の自動検出機能を追加 | 1.1% |
第4章:全店展開と運用定着——「使われないツール」にしないための工夫
最大の壁は「技術」ではなく「人」だった
2025年5月、田中さんはツールを10店舗全店に展開した。しかしここで予想外の壁にぶつかる。店長たちがツールの予測結果を「参考にしない」のだ。
「10年以上の経験を持つ店長にとって、パソコンが出した数字より自分の勘の方が信頼できる、という気持ちはよくわかります。でもそれでは意味がない」
田中さんが取った対策は2つだ。1つ目は「予測結果の根拠を見える化」すること。単に「来週の風邪薬の予測は150個」と出すだけでなく、「昨年同週の実績は145個、直近4週平均は130個、インフルエンザ流行係数×1.15で算出」という計算根拠を一緒に表示するようにした。
2つ目は「予測が当たった実績を毎月共有」すること。月次の店長会議で「先月の予測精度レポート」を配布し、「予測通りに発注した店舗A:廃棄ロス1.0%」「独自判断で発注した店舗B:廃棄ロス2.3%」という形で数字を比較した。
「数字で見せると、みんな納得してくれました。3ヶ月後には全店長が自主的にツールを使うようになっていました」
Google Colabからの出力を「誰でも使える形」に整えた
もう一つの工夫が、出力形式の改善だ。最初のバージョンは、予測結果がPythonのコンソール上に数字で表示されるだけだった。これでは店長が使いにくい。
【田中さんが実際に使ったプロンプト⑤:出力改善型】
以下のPythonコードの出力結果を、
店長が毎朝確認しやすいExcelファイルに出力する機能を追加してください。
【出力Excelの要件】
1. シート名:「発注推奨リスト_〇〇店_YYYYMMDD」
2. 列構成:商品コード、商品名、現在庫数、予測需要数(翌週)、
推奨発注数(予測需要数-現在庫数)、安全在庫数、
発注優先度(高・中・低)
3. 推奨発注数がマイナスの場合は0と表示する
4. 発注優先度の判定基準:
- 高:現在庫が安全在庫の50%以下
- 中:現在庫が安全在庫の50〜100%
- 低:現在庫が安全在庫の100%以上
5. 発注優先度「高」の行を赤色でハイライトする
6. ファイルを自動的にGoogle Driveの指定フォルダに保存する
使用ライブラリ:pandas、openpyxl、google.colab
コメントを各行に入れてください。このExcel出力機能の追加により、店長は毎朝Google DriveにアクセスするだけでAIが作成した「発注推奨リスト」を確認できるようになった。発注業務の時間は1店舗あたり週平均1.8時間から0.6時間に短縮。10店舗合計で週12時間の削減だ。
ツールの保守・更新を「一人に依存しない」体制を作った
田中さんが最後に取り組んだのが「属人化の防止」だ。自分が作ったツールを自分しか直せない状態では、会社の資産にならない。
対策として、コードの全行にコメントを入れ直し、「操作マニュアル(図解入り・A4で8ページ)」を作成した。さらに、IT担当の若手社員(26歳・理系出身)に3ヶ月かけてツールの仕組みを引き継いだ。
「私が作ったコードを若手に説明しようとしたら、自分でも理解できていない部分があることに気づきました(笑)。人に説明することで、自分の理解も深まりました」
現在の運用体制と成果まとめ
導入前後の比較(10店舗合計) | |||
指標 | 導入前(2024年8月) | 現在(2025年5月) | 改善幅 |
|---|---|---|---|
廃棄ロス率 | 3.2% | 1.1% | ▲2.1ポイント |
廃棄ロス額(年間換算) |