製品ごとのクレーム・問い合わせの件数を毎日見て、いつもより増えている製品と現象を見つけ、品質管理に初動の調査を依頼する
お客様相談室に届いた問い合わせ・クレームの記録を毎朝集計し、型式と現象の組み合わせごとに「いつもより多いか」を判定します。 多いと出たものは、記録の要点を添えた初動の調査の依頼文にして品質管理へ渡します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- EC/医療/小売/製造
- 対象部門
- カスタマーサポート/品質管理
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- データ分析に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 判定
- 主な効果
- 判断支援/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎朝、問い合わせ管理システムから前日分の不具合に関わる記録を書き出す
- 1件ずつ内容の文を読み、型式と現象(電源が入らない、異音、水漏れ、異臭、表示の誤り など)を付け直す
- 表計算の集計表に、型式×現象の件数を書き足す
- 先週・先月の同じ組み合わせの件数と見比べ、多いと感じたものに印を付ける
- 印を付けた組み合わせについて、該当する記録の製造番号・購入時期・使用状況を拾い出す
- 課長に報告し、課長が設計・製造の部署へ調査の依頼をメールで書く
- 金曜日に1週間分をまとめて見直し、見落としがなかったかを確かめる
- 自動毎朝6時に、問い合わせ管理システムの前日分の書き出しを Python が読み込む
- 自動Claude API が内容の文を読み、決めておいた現象の区分表から現象を1つ選ぶ
- 自動型式×現象ごとに日別の件数を作り、出荷実績で普段の水準を補正する
- 自動直近の件数が普段の水準から見てどれくらい起きにくいかを、ポアソン分布で確率にする
- 自動全部の組み合わせの確率をまとめて補正し、偽の警報が増えすぎないようにする
- 自動安全に関わる現象(発煙・発火・異臭・けが)は、件数にかかわらず1件で警報にする
- 自動警報の組み合わせについて、Claude API が該当する記録を読み、同じ現象の集まりか、製造番号や購入時期に共通点があるかをまとめ、依頼文の下書きを作る
- 人市場品質課の担当が警報の一覧を開き、記録の原文を見て、調査を依頼するかを決める
- 人依頼すると決めたものは、下書きを直して設計・製造の部署へ送る
- 人現象の区分の付け間違いを見つけたら直し、直した記録を残す
各工程の詳しい説明を読む
- 毎朝、問い合わせ管理システムから前日分の不具合に関わる記録を書き出す
- 1件ずつ内容の文を読み、型式と現象(電源が入らない、異音、水漏れ、異臭、表示の誤り など)を付け直す
- 表計算の集計表に、型式×現象の件数を書き足す
- 先週・先月の同じ組み合わせの件数と見比べ、多いと感じたものに印を付ける
- 印を付けた組み合わせについて、該当する記録の製造番号・購入時期・使用状況を拾い出す
- 課長に報告し、課長が設計・製造の部署へ調査の依頼をメールで書く
- 金曜日に1週間分をまとめて見直し、見落としがなかったかを確かめる
(a)気づくのが遅れる。 4番目は目で見比べるので、3日続けて2件ずつ増えたような緩やかな増え方は、1日ずつ見ると目立ちません。 週末の見直しで初めて気づき、そのころには同じ製造時期の製品がさらに出荷されています。
(b)気づく早さが担当者によって違う。 ベテランの担当者は「この型式でこの現象が2件続くのはおかしい」と分かりますが、異動してきたばかりの担当者には分かりません。その判断の根拠は、担当者の記憶の中にある「普段の件数」です。 担当者が休むと、その型式は誰も見ていない状態になります。
(c)よく売れている型式ほど多く見える。 出荷の多い型式は、不具合の割合が同じでも件数が多くなります。件数だけを見ていると、売れ筋の型式ばかりを調べ、出荷の少ない型式で起きている本当の増え方を見落とします。
(d)現象の付け直しで時間が消える。 2番目に1件あたりの時間の半分がかかっています。数えることより、数える前に区分をそろえることのほうが重い作業です。
- 【自動】 毎朝6時に、問い合わせ管理システムの前日分の書き出しを Python が読み込む
- 【自動】 Claude API が内容の文を読み、決めておいた現象の区分表から現象を1つ選ぶ
- 【自動】 型式×現象ごとに日別の件数を作り、出荷実績で普段の水準を補正する
- 【自動】 直近の件数が普段の水準から見てどれくらい起きにくいかを、ポアソン分布で確率にする
- 【自動】 全部の組み合わせの確率をまとめて補正し、偽の警報が増えすぎないようにする
- 【自動】 安全に関わる現象(発煙・発火・異臭・けが)は、件数にかかわらず1件で警報にする
- 【自動】 警報の組み合わせについて、Claude API が該当する記録を読み、同じ現象の集まりか、製造番号や購入時期に共通点があるかをまとめ、依頼文の下書きを作る
- 【人】 市場品質課の担当が警報の一覧を開き、記録の原文を見て、調査を依頼するかを決める
- 【人】 依頼すると決めたものは、下書きを直して設計・製造の部署へ送る
- 【人】 現象の区分の付け間違いを見つけたら直し、直した記録を残す
8番目が、この設計の分かれ目です。人が見るのは警報の出た組み合わせだけです。 900件を毎朝読み直す形にすると、60.0時間はほとんど減りません。警報が出ない日は、一覧の件数を確かめるだけで終わります。
6番目を統計の外に置いているのも、意図してのことです。 発煙や発火は、普段の件数と比べて多いかどうかを待つ現象ではありません。1件目で人に回すものは、規則で先に決めておきます。
02今回想定するシステム構成
問い合わせ管理システム(前日分の不具合に関わる記録) │ 受付日・型式・製造番号・購入時期・内容の文 ▼【トリガー】毎朝6時の定時実行 Python(pandas で読み込み・型式の名寄せ) │ ├──▶ Claude API ── 内容の文から現象の区分を1つ選ぶ ▼ Python(pandas で型式×現象×日の件数、出荷実績で補正) ▼ Python(SciPy の poisson.sf で確率、false_discovery_control で補正) │ +安全に関わる現象は1件で警報(規則) ▼ 警報の組み合わせ ├──▶ Claude API ── 同じ現象の集まりかの確認、共通点、依頼文の下書き ▼ 【市場品質課の担当が確認し、調査を依頼するかを決める】 ▼ 設計・製造の部署へ依頼(人が送る)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・SciPy の poisson と false_discovery_control) | R、statsmodels |
| 生成AI | Claude API(現象の区分と、警報の記録の確認・依頼文の下書き) | OpenAI API、Gemini API |
| データの取得元 | 問い合わせ管理システムの書き出し | 問い合わせ管理システムのAPI(提供がある場合) |
| 通知 | 市場品質課のチャットとメール | ― |
| 保存 | 社内のデータベース | ファイルサーバー |
問い合わせ管理システムには書き込みません。 相談室が付けた区分も、この構成で付けた現象の区分も、元の記録は書き換えず、別の表に持ちます。 相談室の業務の流れを変えずに始められます。
多いかどうかの判定に、ポアソン分布を使う理由は1つです。 1日に届く件数は「ある率でぽつぽつ起きる出来事の数」で、普段の率が分かれば、ある件数以上が届く確率を計算できます。SciPy の poisson は、確率質量関数を exp(-μ) × μ^k / k! とし、生存関数 sf を「1 − cdf」と定義したうえで、sf のほうが正確なことがあるとしています。「この件数以上が届く確率」は sf で取ります。
全部の組み合わせを毎朝見るので、偶然の警報を抑える補正が要ります。 型式150×現象20で3,000の組み合わせを毎日見れば、5%の基準でも偶然だけで毎日100を超える警報が出ます。SciPy の false_discovery_control は、偽発見率(棄却した帰無仮説のうち実際には正しいものの割合の期待値)を抑えるように p値を補正し、'bh'(Benjamini-Hochberg)と、より保守的な 'by'(Benjamini-Yekutieli)を選べます。
03どうやって実装するのか
処理の起点を決める
毎朝6時の定時実行を起点にします。 市場品質課が始業した時点で、前日までの件数で判定した警報の一覧がそろっているようにします。判定に使うのは「前日までに受け付けた記録」で、当日の途中の件数は入れません。 途中の件数を入れると、午前と午後で同じ組み合わせの判定が変わり、どの時点の結果で依頼したかが分からなくなります。
安全に関わる現象だけは、別に1時間ごとに見ます。 発煙・発火・異臭・けがの語を含む記録が入ったら、統計の判定を待たずに市場品質課へ知らせます。朝6時まで待ってよい現象と、待ってはいけない現象を、トリガーの段で分けます。 月曜日の朝に読む土日の記録は、日別に分けたまま数えます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 問い合わせの記録 | 受付番号、受付日時、型式、製造番号、購入時期、内容の文、相談室の区分 | 問い合わせ管理システム |
| 過去の記録 | 上記の過去2年分と、それぞれに付けた現象の区分 | この構成の保存先 |
| 現象の区分表 | 現象のコード、名前、含める例・含めない例、安全に関わるかの印 | 市場品質課が作る表 |
| 型式の一覧 | 型式、正式名、旧型式・派生型式との対応、発売日、販売終了日 | 商品の一覧 |
| 出荷実績 | 型式ごとの月別の出荷台数 | 出荷実績の表 |
質を決めるのは、3行目の現象の区分表です。 区分が粗すぎると、違う現象が1つにまとまって増え方が薄まります。細かすぎると、同じ現象が2つに割れて、どちらも「多い」に届きません。最初は20前後の区分で始め、含める例・含めない例を1つずつ書きます。 「電源が入らない」と「途中で電源が切れる」を分けるか、といった線引きを、ここで決めます。
4行目の対応表で、「ABC-100」「ABC100」「ABC-100W(色違い)」のような派生型式を1つにまとめます。 まとめないと、件数が割れて増え方が見えません。
5行目の出荷実績で、売れ筋ほど多く見える問題(第3章の(c))を補正します。 発売直後の型式は、使われている台数が月ごとに増えるので、不具合の割合が同じでも件数が増えます。その増え方を警報にしないために、普段の水準を出荷の累計に合わせて伸ばします。
データの取得方法を決める
問い合わせ管理システムから、前日に受け付けた記録をCSVで書き出し、Python の pandas で読み込みます。書き出しは問い合わせ管理システムの定時出力の機能か、API の提供があればそれを使います。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前日の記録 | 毎朝の書き出し | 現象の区分を付け、件数に足す |
| 過去2年の記録と区分 | この構成の保存先 | 普段の水準を出す |
| 型式の一覧 | 商品の一覧の表 | 名寄せ |
| 出荷実績 | 月初に更新される表 | 普段の水準の補正 |
普段の水準は、直近の件数を含めずに出します。 pandas の rolling は closed='left' で窓の最後の点を除けますが、除きたいのは3日分なので、shift(3) でずらしてから窓を取ります。 判定する3日間を窓に入れると、増えた件数が普段の水準を押し上げ、増え方が自分で自分を打ち消します。
AIへ渡す前に整形する
- 型式の名寄せ … 表記の揺れ(ハイフン、全角半角、色違いの記号)を型式の一覧で正規の型式にそろえます。一覧に無い型式は「型式不明」として残し、件数には入れません
- 重複の除外 … 同じお客様の同じ製品について、1件目の受付から再度の連絡が入ったものは、1件として数えます。 製造番号と電話番号の組み合わせ(ハッシュ化したもの)で結び付けます
- 不具合以外の除外 … 使い方の質問、在庫の問い合わせ、配送の苦情は外します。ここは相談室の区分ではなく、次の現象の区分で決めます
- 現象の区分 … Claude API が内容の文を読み、区分表から1つ選びます(次の小見出し)
- 日別の件数 … 型式×現象×受付日で数えます。件数0の日も行として作ります。 0の日が無いと、普段の水準が高く出ます
- 普段の水準 … 直近3日を除いた過去56日の1日あたりの平均を出し、出荷の累計の伸びで補正します
- 新しい型式の扱い … 発売から56日に満たない型式は、普段の水準を同じ系列の旧型式の値から借ります。借りる先が無いものは、最小の水準(1日0.1件)を置きます
5番目を省くと、判定のすべてがずれます。 pandas で型式×現象×日を数えると、件数のあった日しか行ができません。全部の日付を並べた表に0で埋めてから平均を取ります。 7番目の0.1件は本記事のモデル条件で、実際は過去の記録から決めます。
AIに処理させる
この構成の「AI」は、3つの部品に分かれます。 多いかどうかを確率で決めるのは SciPy の計算、偶然の警報を抑えるのも SciPy の補正、文を読むのが生成AIです。生成AIは件数も確率も扱いません。
| 部品 | させること | させないこと |
|---|---|---|
| 現象の区分(Claude API) | 内容の文から、区分表の現象を1つ選び、根拠の文を写す | 区分表に無い現象を作る |
| poisson.sf(SciPy) | 直近3日の件数が、普段の水準から見て起きる確率 | 警報を出すかの最終の決定 |
| false_discovery_control(SciPy) | 全部の組み合わせの確率をまとめて補正 | 安全に関わる現象の判定 |
| 規則(Python) | 補正後の確率・件数・倍率の3条件で警報を決める。安全に関わる現象は1件で警報 | ― |
| 警報の確認(Claude API) | 警報の記録が同じ現象の集まりか、共通点は何かをまとめ、依頼文を下書きする | 原因の推定、リコールの要否 |
判定の条件は3つを重ねます。 補正後の確率(q値)が0.05未満、直近3日の件数が3件以上、普段の水準の2倍以上。3つ目と2つ目を足すのは、件数の多い組み合わせで「わずかに多いだけ」が統計的に有意になるのを防ぐためです。 1日100件届く型式で105件になっても、品質管理が動く理由にはなりません。
補正は 'bh' で始め、警報が多すぎれば 'by' と比べます。 同じ型式の違う現象どうしは売れ方の影響を一緒に受け、独立ではないからです。
生成AIの2つ目の仕事は、統計では分からないところです。 「異音」が増えていても、中身が「ファンの音」と「扉の音」に分かれていれば1つの不具合ではありません。同じ現象の集まりかを same_phenomenon に返させます。
| 生成AIにさせないこと | 理由 |
|---|---|
| 原因の推定 | 原因は調査で確かめるもの。推定が依頼文に入ると調査の向きが決まってしまう |
| 件数や確率の言い換え | 数は Python の結果をそのまま依頼文に差し込む |
| リコール・出荷停止の要否 | 会社として決める判断 |
| お客様の氏名・連絡先の扱い | 渡さない。依頼文に要るのは受付番号だけ |
指示内容を固定する
判定の計算は次のとおりです。 毎朝、全部の組み合わせについて回します。
import pandas as pd
from scipy.stats import poisson, false_discovery_control
# daily: 型式×現象×日の件数(件数0の日も行がある)
daily = daily.sort_values("date")
g = daily.groupby(["model", "phenomenon"])["count"]
# 直近3日を除いた過去56日の平均(shift(3) で判定する3日を窓から外す)
daily["base"] = g.transform(lambda s: s.shift(3).rolling(56, min_periods=28).mean())
daily["base"] = (daily["base"] * daily["shipment_factor"]).clip(lower=0.1)
daily["recent3"] = g.transform(lambda s: s.rolling(3).sum())
today = daily[daily["date"] == target_date].copy()
mu = today["base"] * 3 # 3日分の期待件数
today["p"] = poisson.sf(today["recent3"] - 1, mu) # 直近3日の件数以上が届く確率
today["q"] = false_discovery_control(today["p"], method="bh")
today["alert"] = (today["q"] < 0.05) & (today["recent3"] >= 3) \
& (today["recent3"] >= 2 * mu)
sf(k - 1) にしているのは、「k件以上」の確率が欲しいからです。 sf は「その値より大きい」確率なので、k件ちょうどを含めるには1つ下げて渡します。ここを sf(k) にすると、すべての確率が一段小さく出て、警報が出にくくなります。
現象の区分は、Claude API に次の指示で付けさせます。
あなたは家電メーカーの品質保証部で、お客様相談室の記録に不具合の現象を付ける立場です。
渡された記録の内容の文だけを読み、現象の区分表から1つを選んでください。
【現象の区分表】{phenomenon_table}
(コード、名前、含める例、含めない例、安全に関わるかの印)
【選び方】
- お客様が述べた症状を選んでください。担当者の推測やお客様の推測ではありません。
- 症状が2つ書かれている場合は、最初に起きた症状を選び、もう1つを secondary に書いてください。
- 不具合ではない記録(使い方の質問、在庫、配送、価格)は NOT_DEFECT を選んでください。
- どれにも当てはまらない、または文から読み取れない場合は UNKNOWN を選んでください。
近いものを無理に選ばないでください。
- 発煙、発火、焦げたにおい、異臭、感電、けがのいずれかが書かれていれば、
他の症状より優先して、その区分を選んでください。
【厳守事項】
- 区分表に無いコードを作らないでください。
- 原因(部品の故障、使い方の誤り など)を書かないでください。
- evidence には、選んだ根拠の文を記録から1文そのまま写してください。
- お客様の氏名・住所・電話番号が文に含まれていても、出力に写さないでください。
【記録】{record_text}
【型式】{model}
「近いものを無理に選ばない」を明記しないと、新しい現象が既存の区分に薄く散らばります。 UNKNOWN の増加は新しい現象の手がかりなので、型式ごとに数えて判定にかけます。
警報の確認と依頼文は、別の指示で作らせます。
あなたは品質保証部で、件数が増えた製品と現象について、設計・製造の部署に初動の調査を
依頼する文の下書きを書く立場です。
【渡す情報】
- 型式、現象の区分、直近3日の件数、普段の水準、補正後の確率(Python が計算した値)
- 該当する記録(受付番号、受付日、製造番号、購入時期、内容の文)
【させること】
1. 記録が同じ現象の集まりかを same_phenomenon に yes / no / mixed で答えてください。
mixed の場合は、どう分かれるかを groups に書いてください。
2. 製造番号の範囲、購入時期、使用年数、使用状況に共通点があれば common_points に
書いてください。記録に書かれていることだけを使ってください。
3. 依頼文の下書きを書いてください。件数と確率は渡された値をそのまま書いてください。
【厳守事項】
- 原因を推定しないでください。「〜の故障と思われる」と書かないでください。
- 共通点が見つからなければ「記録からは共通点を確認できない」と書いてください。
- リコール、出荷停止、お客様への告知の要否を書かないでください。
- 受付番号以外の、お客様を特定できる情報を書かないでください。
「原因を推定しない」は、依頼文の受け手のためです。 「ファンモーターの不良と思われる」と書かれていれば、設計の部署はそこから調べ始めます。
出力形式を固定する
次の形のJSONを、警報1件ごとに作ります。 件数と確率は Python が埋め、same_phenomenon 以下を Claude API の構造化出力(output_config.format に type: "json_schema")で受け取ります。
{
"alert_id": "A-20261007-004",
"model": "ABC-100",
"phenomenon": "P07 途中で電源が切れる",
"recent3": 6,
"expected3": 1.2,
"q_value": 0.012,
"rule": "statistical",
"record_ids": ["Q-1006-0213", "Q-1006-0388"],
"same_phenomenon": "yes",
"groups": [],
"common_points": "製造番号が 2608 から始まる範囲に5件。購入から2か月以内が5件。",
"request_draft": "",
"status": "open"
}
1つ目の理由は、計算の値と生成AIの文を別の欄に置けることです。 recent3 expected3 q_value は計算の値で、依頼文にもこの値を差し込みます。生成AIが件数を言い換えて書く余地を残しません。
2つ目は、rule で警報の出どころを分けられることです。 statistical は確率の判定、safety は安全に関わる現象の1件警報です。後から警報の当たり外れを見直すとき、2つは別に数えます。 安全の警報は外れても出すべきもので、確率の警報と同じ基準で評価しません。
構造化出力のスキーマでは minimum maximum などの制約が使えないので、選択肢は enum で縛り、範囲の確認は受け取った後に Python で行います。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 問い合わせ管理システム | 定時の書き出し(読み取りのみ) | 前日の記録を受け取る |
| 商品の一覧・出荷実績 | 表の読み取り | 名寄せと普段の水準の補正 |
| Claude API | API呼び出し | 現象の区分、警報の確認と依頼文の下書き |
| 市場品質課のチャット | 投稿 | 毎朝の警報の一覧と、安全に関わる現象の即時の知らせ |
| 社内のデータベース | 書き込み | 区分・件数・判定・人の決定の記録 |
設計・製造の部署へは、この構成から直接送りません。 依頼するかどうかを決めるのは市場品質課の担当で、送るのも担当です。 警報が外れていたときに、他部署の手を止めることになるからです。
毎朝の一覧は、警報が0件の日も「警報なし、記録は何件」と投稿し、処理の停止と見分けます。
人が確認する
人が開くのは、警報の出た組み合わせだけです。 警報が出ない記録は、現象の区分の一覧を流し見るだけにします。
- 安全の警報を先に見る …
ruleがsafetyのものは、記録の原文を読み、すぐに課長へ上げるかを決めます - 確率の警報の記録を読む …
same_phenomenonとcommon_pointsを参考に、原文で同じ現象かを確かめます - 依頼するかを決める … 依頼するものは下書きを直して送ります。見送るものも、理由を一言残します
- 区分の付け間違いを直す … 直した記録は、区分表の「含める例・含めない例」の見直しに使います
3番目の「見送りの理由」がたまると、判定の条件のどこを直せば外れが減るかが分かります。
目標は、900件をならして1件1分です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 書き出しのファイルが届かない | 判定を回さず、「書き出しが無い」とチャットに投稿する。0件として処理しない |
| 型式が一覧に無い | 「型式不明」に入れ、件数には足さない。毎週、一覧の追加漏れとして商品の担当へ回す |
| 現象が UNKNOWN になる | 型式ごとに数え、3日で3件以上なら「新しい現象の疑い」として人へ回す |
| 生成AIの応答が区分表に無いコード | 受け取らず、UNKNOWN に置き換えて記録する |
| Claude API が応答しない | 区分を付けずに保留にし、次の回でやり直す。保留が残ったまま判定しない |
| 出荷実績が更新されていない | 前月の値で補正し、一覧に「出荷実績が古い」と表示する |
| 同じ警報が毎日続く | 調査中の印を付けた組み合わせは、新たな記録だけを依頼済みの案件に足す |
| 相談室の大量の受付(報道・SNSの後) | 型式ごとの件数が急に跳ねる。原因が報道か不具合かは人が見る |
1行目と5行目は、件数0として判定すると「何も増えていない」という誤った安心が出るので止めます。最後の行は統計では区別できないので、警報は止めずに人が判断します。
記録を残す
- 毎朝の書き出しのファイルと、読み込んだ件数
- 記録ごとの現象の区分、
evidence、区分を付けた日時と区分表の版 - 型式×現象×日の件数、普段の水準、出荷の補正の値
- 警報ごとの確率・補正後の確率・判定の条件と、そのときの補正の方法(
bhかbyか) - 人の決定(依頼した/見送った)と理由、依頼を送った日時
- 人が区分を直した記録 … どの記録を、どの区分からどの区分へ
区分表の版を残すのは、区分を変えると過去の件数の意味が変わるためです。 「異音」を2つに分けたら、分けた日以前の記録を新しい区分表で付け直します。
04実装レベルの3段階
最小構成は毎日は回せません。 区分を手で貼り付けるので、900件を毎月こなす形にはなりません。確かめるための段階です。 半自動化で、1件4分が2分程度になります。 区分と集計は自動になりますが、警報の記録を拾い出して依頼文を書く作業と、売れ筋の型式の見かけの増え方を人が見分ける作業が残ります。本格構成で1分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、偶然の警報がどれくらい出るか、どの型式で区分が割れるかが分かります。そこを直してから偽の警報の補正を足すほうが、条件の決め方に納得がいきます。
05工数削減シミュレーション
導入後 900件 × 1分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 家電・住宅設備・日用品・医療機器など、型式が数十〜数百あり、お客様相談室やコールセンターに毎月数百件以上の問い合わせ・クレームが届くメーカー。品質管理の担当が問い合わせの記録を読み、表計算で数えて「最近この型式が多い」と気づく形になっていて、気づく早さが担当者によって違う場合。問い合わせの記録に、受付日・型式・内容の文が残っている場合。
- 問い合わせが月に数十件で、担当者が全件を読んで把握できる場合。問い合わせの記録に型式が残っておらず、どの製品の話かを後から特定できない場合。なお、リコールや行政への報告の要否、出荷を止めるかどうかの判断は、この構成では代替できません。
07最小構成で試す方法
- 過去に調査を依頼した不具合を3つ選び、それぞれの依頼の前後8週間の問い合わせの記録を書き出す
- 手元のAIサービスに、現象の区分表と記録を100件ずつ貼り、現象を1つずつ選ばせる
- 選ばせた区分を表計算で型式×現象×日に数え、過去56日の平均と直近3日の件数を並べる
- 表計算の
POISSON.DIST関数で、直近3日の件数以上が届く確率を出す - 実際に依頼した日と、確率が小さくなった日を並べる
確かめたいのは、「計算なら何日早く気づけたか」です。 ワークフローを組む前に、過去の不具合で、警報が依頼より前に出ていたかを見ます。
| 出てきた内容 | 判断 |
|---|---|
| 依頼より数日早く確率が小さくなった | 自動の判定に進む |
| 区分がばらついて件数がそろわない | 区分表の含める例・含めない例を足す。構成は有効 |
| 依頼の後になっても確率が小さくならない | 件数が少なすぎるか、区分が粗すぎる。型式のまとめ方を見直す |
2行目が出ることは珍しくありません。 失敗ではなく、担当者が頭の中で付けていた区分が、まだ表になっていなかったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 件数0の日が無く、普段の水準が高く出る | 全部の日付を並べて0で埋めてから平均を取る |
| 直近の件数が普段の水準に混ざる | shift でずらし、判定の期間を窓から外す |
| 毎朝何十件も警報が出る | false_discovery_control で補正し、件数と倍率の条件を重ねる |
| 売れ筋の型式ばかり警報が出る | 出荷の累計で普段の水準を補正する |
sf(k) で確率が一段小さく出る | 「k件以上」は sf(k - 1) |
| 区分が担当者ごとにばらつく | 区分表に含める例・含めない例を書く |
| 新しい現象が既存の区分に散らばる | UNKNOWN を許し、UNKNOWN も型式ごとに数える |
| 色違いの型式で件数が割れる | 型式の対応表で1つにまとめる |
| 区分表を変えて過去とつながらない | 区分表の版を残し、変えた日以前を付け直す |
| 書き出しが無い日を0件と扱う | 判定を止めて、欠けていると知らせる |
| 依頼文に原因の推定が入る | 指示で禁じ、件数と記録の事実だけにする |
| 安全に関わる現象が統計の判定を待つ | 件数にかかわらず1件で人へ回す規則を先に置く |
上の2行が、この構成の失敗のほとんどです。 どちらも普段の水準の作り方の誤りで、エラーも出ずに、警報が出るべき日に出なくなります。 過去の不具合で警報が依頼より前に出るかを、最初に必ず確かめてください。
最後の行は、設計の最初に決めます。 統計の判定は「多いかどうか」しか見ません。1件でも重い現象を統計に任せると、2件目が届くまで誰も見ない状態になります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 型式、製造番号、購入時期、問い合わせの内容の文。内容の文には、お客様の氏名・住所・電話番号や、けがの状況が書かれていることがあります。
- 生成AIへ渡す前に、氏名・住所・電話番号を伏せる … 区分を付けるのに要るのは症状の文だけです。伏せる処理を Python の側で行い、受付番号で結び付けます
- 依頼文に、お客様を特定できる情報を入れない … 設計・製造の部署に要るのは受付番号と事実です
- この構成は、リコールや行政への報告の判断を代替しません … 警報は「調べる価値がある」という知らせで、事故の重大さや報告の要否は、品質保証の責任者と法務が決めることです
- 警報の条件を、部署の都合で緩めない … 警報が多くて手が回らないときに条件を緩めると、見落としの責任がどこにあったかが分からなくなります。 緩めるときは、決めた人と理由を記録します
- 区分の付け間違いを直した記録を残す … 生成AIの区分は、型式や現象によって当たり外れが偏ることがあります。直した件数を区分ごとに数え、偏りが出ていないかを毎月見ます
- 問い合わせ管理システムに書き込まない … 相談室の記録は、お客様との約束の記録でもあります
誤りが起きた場合のリスクは、増えている現象を見落とすことと、偶然の増え方で他部署を動かしてしまうことの2つです。 前者は普段の水準の作り方の誤りで起き、後者は補正と件数の条件の不足で起きます。どちらも、過去の不具合で試してから始めることで防ぎます。
10まず何から始めるか
1週目:現象の区分表と型式の対応表を作る
市場品質課の担当が頭の中で付けている現象を書き出し、20前後の区分にして、それぞれに含める例・含めない例を1つずつ書きます。 安全に関わる区分に印を付けます。あわせて、色違い・販路違いの型式を正規の型式にまとめる対応表を作ります。
2週目:過去の不具合3つで試す
過去に調査を依頼した不具合を3つ選び、前後8週間の記録に区分を付けて、表計算でポアソン分布の確率を出します。依頼した日より前に確率が小さくなっていたかを見ます。
3週目:判定の条件を決める
補正後の確率、件数、倍率の3つの条件と、安全に関わる現象の扱いを、品質保証の責任者と決めます。 決めた条件と、決めた人を記録します。
4週目:毎朝の一覧を出す
Python で書き出しを読み、区分と件数と確率の一覧を毎朝チャットに投稿するところまで作ります。この時点では依頼文の下書きを出さず、警報の一覧だけを見ます。
2か月目: 出荷実績の補正と偽の警報の補正を足し、警報の当たり外れを毎週数えます。3か月目以降: 記録の確認と依頼文の下書きを足し、1件4分が何分になったかを実測します。見送りの理由と区分の付け直しの記録から、判定の条件と区分表を見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
poisson の確率質量関数が exp(-μ) × μ^k / k! であること。sf が生存関数で「1 − cdf」と定義され、sf のほうが正確なことがあるとされること | SciPy: scipy.stats.poisson | 2026-10-07 |
false_discovery_control が偽発見率を抑えるように p値を補正すること。'bh' が独立か正の依存のある検定でよく働き、'by' がより保守的で独立でない検定でも偽発見率を抑えること | SciPy: scipy.stats.false_discovery_control | 2026-10-07 |
rolling の closed で窓の端を選べ、'left' が最後の点を除くこと。時間で窓を切る場合は日付の索引か on= が要ること。min_periods で最小の観測数を指定できること | pandas: DataFrame.rolling | 2026-10-07 |
構造化出力で output_config.format に type: "json_schema" を指定できること。minimum maximum や minLength maxLength が使えず、enum が使えること | Claude Docs: Structured outputs | 2026-10-07 |
判定の条件(補正後の確率0.05、3日で3件、普段の2倍)と、普段の水準の窓(56日)は本記事のモデル条件です。 実際の値は、過去の不具合で試して決めてください。リコールや行政への報告の要否は、品質保証の責任者と法務で決めてください。問い合わせ管理システムからの書き出しの方法は製品ごとに違い、本記事では確かめていません。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0642)についてのご相談はこちらから。
