アパレルECの予約販売の注文から、Pythonでサイズ違いの返品を「小さい・大きい」の向きまで予測し、発送前にサイズ変更を案内する候補を選ぶ
予約販売の注文ごとに、サイズ違いで返品されるおそれを「小さい」「大きい」の向き付きで見込みます。おそれの高い注文を選び、発送前に「ひとつ上のサイズも選べます」といった向きのある案内を送る候補にします。
- 連携・自動化
- Python
- 対象業界
- EC/小売
- 対象部門
- カスタマーサポート
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 人手が足りない/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が、前日までの予約の注文から、対象の品目で、購入の履歴がある会員のものを一覧にする
- 1件ずつ会員の画面を開き、過去に買った同じ品目のサイズと、返品したかどうかを見る
- 商品のマスタで、今回の商品の選ばれたサイズの実寸を開く
- 過去に返品しなかった服の実寸と見比べ、合わなそうかを考える
- 合わなそうなら、サイズの確認のメールの定型文を選び、会員の名前を入れて送る
- 会員から変更の返信が来たら、注文のサイズを付け替える
- 自動毎朝6時、前日までの予約の注文と、会員の過去の購入と返品を書き出す
- 自動Python が、注文の行ごとに、選ばれたサイズの実寸と、会員が同じ品目で過去に残した服の実寸との差を計算する
- 自動モデルが、注文の行ごとに「小さくて返品」「大きくて返品」「その他の返品」「返品なし」の4つの確率を出す
- 自動確率を過去の実績に合わせて補正し、サイズ違いの確率が線を超えた注文を候補にする
- 自動候補ごとに、向き(ひとつ上・ひとつ下)と、案内の定型文の番号と、根拠の実寸の差を一覧に書き出す
- 人担当者が一覧を見て、案内を送る注文を決め、送付を承認する
- 自動承認された注文に、向きのある案内を送る
- 自動週に1回、商品ごと・サイズごとの「小さい」「大きい」の見込みの合計を、商品の企画の担当へ渡す
- 自動発送と返品の受付が終わったら、見込みと実際の返品の理由を突き合わせて記録する
各工程の詳しい説明を読む
- 担当者が、前日までの予約の注文から、対象の品目で、購入の履歴がある会員のものを一覧にする
- 1件ずつ会員の画面を開き、過去に買った同じ品目のサイズと、返品したかどうかを見る
- 商品のマスタで、今回の商品の選ばれたサイズの実寸を開く
- 過去に返品しなかった服の実寸と見比べ、合わなそうかを考える
- 合わなそうなら、サイズの確認のメールの定型文を選び、会員の名前を入れて送る
- 会員から変更の返信が来たら、注文のサイズを付け替える
(a)見比べる材料が画面に散らばっている。 2番目と3番目で、会員の画面と商品のマスタを行き来します。過去の服の実寸は、その服の商品ページまで戻らないと分かりません。 1件に5分かかるのは、この往復のためです。
(b)線の引き方が担当者ごとに違う。 「身幅が3センチ違ったら送る」という人もいれば、「前に同じブランドのMを残していればMで大丈夫」という人もいます。送るか送らないかの記録はあっても、なぜそう決めたかの記録はありません。 送った案内が当たったのかどうかも、後から確かめていません。
(c)向きを書けない。 定型文は「サイズをご確認ください」の1種類だけです。小さそうなのか大きそうなのかを書けないので、会員は何を確かめればよいか分かりません。 返信の多くが「どちらにすればいいですか」という質問になり、そのやり取りでまた時間を使います。
(d)全件は見られない。 予約の注文3,000件のうち、見られているのは720件です。受注の期間の最後の数日に注文が集まると、720件も見切れずに締切を迎えることがあります。
- 【自動】 毎朝6時、前日までの予約の注文と、会員の過去の購入と返品を書き出す
- 【自動】 Python が、注文の行ごとに、選ばれたサイズの実寸と、会員が同じ品目で過去に残した服の実寸との差を計算する
- 【自動】 モデルが、注文の行ごとに「小さくて返品」「大きくて返品」「その他の返品」「返品なし」の4つの確率を出す
- 【自動】 確率を過去の実績に合わせて補正し、サイズ違いの確率が線を超えた注文を候補にする
- 【自動】 候補ごとに、向き(ひとつ上・ひとつ下)と、案内の定型文の番号と、根拠の実寸の差を一覧に書き出す
- 【人】 担当者が一覧を見て、案内を送る注文を決め、送付を承認する
- 【自動】 承認された注文に、向きのある案内を送る
- 【自動】 週に1回、商品ごと・サイズごとの「小さい」「大きい」の見込みの合計を、商品の企画の担当へ渡す
- 【自動】 発送と返品の受付が終わったら、見込みと実際の返品の理由を突き合わせて記録する
6番目が、この設計の分かれ目です。 案内を送るかどうかは担当者が決めます。会員によっては、ゆったり着るためにわざと大きいサイズを選んでいることがあり、それは記録だけでは分かりません。担当者が一覧の根拠を見て、送らないと決められるようにします。
8番目は、注文の案内とは別の使い道です。 予約のある商品で「小さい」の見込みが多いサイズは、商品ページの実寸の書き方か、型そのものに理由があるおそれがあります。1件ずつ案内を送るより、ページに「やや小さめの作りです」と書き足すほうが効くことがあります。
02今回想定するシステム構成
ECのカートシステム(予約の注文・会員)/返品の受付の表(理由の区分)/商品のマスタ(サイズごとの実寸) │ 毎朝6時に前日までを書き出し ▼【トリガー】定時実行 Python(pandas) ├──▶ 会員ごとに「残した服」の実寸を品目別にまとめる ├──▶ 注文の行ごとに、選んだサイズとの実寸の差を計算 ▼ scikit-learn(HistGradientBoostingClassifier:4つの区分の確率) ▼ scikit-learn(CalibratedClassifierCV:method="temperature" で確率を補正) ▼ Python ── 線による候補の選び出し/向きと定型文の番号/根拠の実寸の差 ▼ 案内の候補の一覧(担当者が確認・承認) ├──▶ メールの配信の仕組み(承認された注文だけに送る) └──▶ 商品ごと・サイズごとの偏りの表(商品の企画の担当へ)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn の HistGradientBoostingClassifier、CalibratedClassifierCV) | R、BigQuery ML、LightGBM |
| データの取得元 | カートシステム・返品の受付の表・商品のマスタの書き出し | カートシステムのAPI(提供されている場合) |
| 一覧の出力先 | 共有フォルダの一覧(担当者が承認の列を埋める) | 社内のダッシュボード |
| 配信 | 既存のメールの配信の仕組み | カートシステムのメールの機能 |
| 定時実行 | 社内のジョブ管理の仕組み | OSのタスクスケジューラ |
生成AIは使いません。 案内の文面は、向きごとに用意した定型文から選びます。会員の購入の履歴を外部の生成AIに渡す場面を、最初から作りません。 文面を会員ごとに書き分ける必要は無く、伝えたいのは「ひとつ上のサイズも選べます」という1行です。
カートシステムの注文には書き込みません。 サイズの付け替えは、会員から変更の申し出があったときに、担当者がいまと同じ手順で行います。
モデルに HistGradientBoostingClassifier を選ぶのは、4つの区分をそのまま1つのモデルで扱えるからです。 公式の説明では、多クラスの分類では log_loss が多クラスの交差エントロピーにあたり、区分ごとに木を作ってソフトマックスで確率に直すとされています。predict_proba は注文の行ごとに4つの確率を返します。
欠けた値をそのまま入れられることも効きます。 会員が同じ品目を一度も残していなければ、実寸の差は計算できません。公式の説明では、学ばせるときに欠けた値を分かれ目の左右どちらへ送るかを学ぶとされています。0で埋めると「差が無い」という意味になってしまうので、欠けたまま渡します。
03どうやって実装するのか
処理の起点を決める
毎朝6時の定時実行を起点にします。 担当者が9時に一覧を開いたときに、前日までの注文がそろっている時刻です。注文が入るたびに動かす形にはしません。 予約の注文は発送まで数週間あり、急ぐ理由がありません。1日1回にまとめれば、同じ会員が同じ日に複数の注文をしたときに、まとめて1通の案内にできます。
案内を出すのは、サイズの変更を無料で受け付ける期間の終わりの7日前までです。 それより後は候補を出しても一覧に「期限が近い」と印を付けるだけにし、送るかどうかは担当者に任せます。変更の期限を過ぎてから届く案内は、会員を困らせるだけです。
モデルの学び直しはシーズンごとに1回、受注を始める前の週に行います。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 予約の注文 | 注文番号、行番号、会員ID、商品の型番、品目、色、選ばれたサイズ、注文日、同じ型の複数のサイズを同時に注文したか | カートシステム |
| 商品のマスタ | 型番、品目、サイズごとの実寸(着丈・身幅・肩幅・袖丈・ウエスト・ヒップ・股下)、素材の伸縮の区分、シルエットの区分 | 商品のマスタ |
| 会員の過去の購入 | 会員ID、型番、サイズ、購入日、返品したか、返品の理由の区分 | カートシステムと返品の受付の表 |
| 返品の理由の区分 | 小さい、大きい、丈が合わない、イメージと違う、色が違う、不良、届いた商品の誤り | 返品の受付の表 |
| 店舗での購入 | 会員IDで結び付いた店舗の購入(試着してから買ったもの) | 店舗のレジの記録(結び付けている場合) |
質を決めるのは、商品のマスタのサイズごとの実寸です。 実寸が無い商品は、会員の残した服と比べる材料がありません。書き始める前に、予約の商品のうち何割に実寸が入っているかを数えてください。 実寸の項目が品目ごとに違うので、パンツはウエスト・ヒップ・股下、ジャケットは身幅・肩幅・袖丈・着丈、のように品目ごとに比べる項目を決めた表を作ります。
データの取得方法を決める
3つの仕組みから、決めた列だけを書き出します。 列の名前と数は毎朝の処理の最初に照らし、違えば止めます。理由の区分の並びが変わっただけで、「小さい」と「大きい」が入れ替わるからです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 前日までの予約の注文 | カートシステム | 見込む対象 |
| 選ばれたサイズの実寸 | 商品のマスタ | 実寸の差の片側 |
| 会員が過去に買って残した服 | カートシステムと返品の受付の表 | 実寸の差のもう片側 |
| 過去の返品の理由 | 返品の受付の表 | 学ばせるときの答え |
| 変更の受付の期限 | 予約の商品の設定 | 案内を出せるかの判断 |
「残した服」の決め方を固定します。 購入から返品の受付の期限を過ぎても返品されなかった服を「残した」と数えます。交換して受け取った服は、交換後のサイズを残したと数えます。 期限の内側にある最近の購入は、まだ返品されるかもしれないので「残した」に数えません。
学ばせるときの答えは、過去のシーズンの予約の注文の行ごとに、4つの区分のどれかにします。 返品の理由が「小さい」は small、「大きい」は large、「丈が合わない」は丈の実寸の差の符号で small か large に振り分け、それ以外の理由の返品は other、返品が無ければ kept です。交換も返品と同じに数えます。 交換は、サイズが合わなかったという意味では返品と同じだからです。
AIへ渡す前に整形する
- 品目ごとの比べる項目の表を引く … パンツならウエスト・ヒップ・股下、ジャケットなら身幅・肩幅・袖丈・着丈、のように品目ごとに決めた項目だけを使います
- 会員の基準の実寸を作る … 会員が同じ品目で残した服の実寸を、項目ごとに中央の値でまとめます。残した服が1着なら、その1着の実寸をそのまま使います
- 実寸の差を計算する … 選ばれたサイズの実寸から、会員の基準の実寸を引きます。正なら大きめ、負なら小さめです
- 素材とシルエットで差を読み替える … 伸縮のある素材と無い素材では、同じ2センチの差の意味が違います。素材の伸縮の区分とシルエットの区分を、カテゴリの型の列として渡します
- 同じ型の複数サイズの注文に印を付ける … 同じ型をMとLで同時に注文している行は、どちらかを返品するつもりの注文です。印を付け、サイズの案内の対象からは外します
- 欠けた値は欠けたままにする … 会員が同じ品目を一度も残していなければ、実寸の差の列は空のまま渡します
学ばせる記録の1行は、次のような形にします。1行が「ある予約の注文の、ある商品の1行」です。
{
"order_line_id": "PO-2026A-004213-02",
"season": "2026AW",
"member_id_hash": "m_8f31c0",
"category": "pants",
"silhouette": "tapered",
"stretch": "none",
"size_label": "M",
"diff_waist_cm": -2.5,
"diff_hip_cm": -1.0,
"diff_inseam_cm": 1.5,
"kept_count_same_category": 4,
"past_small_returns": 1,
"past_large_returns": 0,
"store_purchase_flag": true,
"multi_size_flag": false,
"label": "small"
}
label は学ばせるときだけの列で、見込むときにはありません。 member_id_hash は会員IDを置き換えた値で、モデルには入れません。 同じ会員の行がどれかを、学ばせる記録の分け方に使うだけです。
2番目で中央の値を使うのは、わざとゆったり着た服が1着混ざっても、基準が引っ張られないようにするためです。
AIに処理させる
させるのは、予約の注文の行ごとに、4つの区分の確率を出すことだけです。 候補を選ぶ線、向きの決め方、定型文の選び方は、確率を受け取った後の Python の側で決まった規則で行います。
| 見るもの | 扱い方 | 判断できないときの扱い |
|---|---|---|
| 実寸の差 | 品目ごとに決めた項目の差(センチ) | 残した服が無ければ欠けた値 |
| 品目・シルエット・素材の伸縮 | カテゴリの型 | マスタに無ければ「不明」の区分 |
| 会員の過去の返品の向き | 「小さい」「大きい」の返品の回数 | 履歴が無ければ0 |
| 残した服の数 | 同じ品目で残した数 | 0なら実寸の差は欠けた値 |
| 店舗での購入 | 店舗で同じ品目を買ったか | 結び付いていなければ欠けた値 |
確率は、出たままでは使いません。 0.3と出た注文が本当に10件に3件返品される注文だとは限らず、線の意味がずれます。そこで CalibratedClassifierCV で補正します。
補正の方法には method="temperature" を選びます。 公式の説明では、sigmoid と isotonic はもともと2クラスのための方法で、多クラスには1対他の形で広げて後から合計を1に直すとされ、温度による補正は多クラスにそのまま対応するとされています(バージョン1.8で追加)。4つの確率の合計が1のまま、全体の自信の強さだけを直せます。
候補の選び方は、決まった式で行います。
p_size = p_small + p_large (補正後の確率)
候補 = p_size ≥ 線(シーズンの始めに決める。最初は 0.30)
かつ 複数サイズの注文の印が無い
かつ 変更の受付の期限まで7日以上ある
向き = p_small > p_large × 1.5 なら「ひとつ上」
p_large > p_small × 1.5 なら「ひとつ下」
どちらでもなければ「向きなし」(実寸の表を見てもらう案内)
向きに1.5倍の開きを求めるのは、迷う注文に向きを書かないためです。 確率が近い注文は、丈は長いが身幅は狭い、といった項目ごとに向きが逆の注文であることが多いからです。
| させないこと | 理由 |
|---|---|
| 案内を送るかどうかの最終の判断 | わざと大きめを選ぶ会員がいる。担当者が根拠を見て決める |
| 会員の体の寸法の推し量り | 体型を推し量る用途にしない。比べるのは服の実寸どうし |
| 返品の多い会員の選り分け | 見込みは注文の行のもの。会員の扱いを変える材料にしない |
| サイズの付け替え | 会員の申し出があってから担当者が行う |
2行目が大事です。 残した服の実寸から「この会員のウエストは何センチ」と言い換えると、体の寸法という、会員が渡していない情報を作り出すことになります。 一覧に出すのも、「過去に残したパンツよりウエストが2.5センチ小さい」という服どうしの差だけにします。
確率の当たり方は brier_score_loss で見ます。 公式の説明では、予測した確率と実際の結果の差の二乗の平均で、小さいほど良く、多クラスにも対応し、既定では範囲が0から2になるとされています。補正の前後で、この値が下がったかを毎シーズン確かめます。
指示内容を固定する
この構成は生成AIを使わないため、プロンプトはありません。 代わりに、学ばせ方・補正・候補の線・案内の定型文の選び方を、ひとつの設定ファイルにまとめます。
【見込む先】
label: small(小さくて返品・交換)/large(大きくて返品・交換)/other(サイズ以外の返品)/kept(返品なし)
「丈が合わない」: 丈の実寸の差が負なら small、正なら large
単位: 予約の注文の1行
学習期間: 直近4シーズンの予約の注文 検証: シーズン単位で、前のシーズンで学ばせて次のシーズンで確かめる
【モデル】
HistGradientBoostingClassifier(loss="log_loss", categorical_features="from_dtype")
補正: CalibratedClassifierCV(method="temperature")
入れ替えの条件: 検証のシーズンで、前のモデルより brier_score_loss が小さいこと
【品目ごとの比べる項目】
pants: waist, hip, inseam
jacket: chest_width, shoulder, sleeve, length
coat: chest_width, shoulder, sleeve, length
skirt: waist, hip, length
【候補の線】
p_size の線: 0.30(シーズンの始めに見直す)
向き: 一方が他方の1.5倍を超えたときだけ書く
除外: 複数サイズの注文/変更の受付の期限まで7日未満/前回の案内に返信が無い会員への2通目
【案内の定型文】
up: 「ご注文のサイズは、これまでお選びいただいた同じ品目よりやや小さい作りです。ひとつ上のサイズにも、発送前でしたら無料で変更いただけます」
down: 「ご注文のサイズは、これまでお選びいただいた同じ品目よりやや大きい作りです。ひとつ下のサイズにも、発送前でしたら無料で変更いただけます」
none: 「発送前でしたら、サイズを無料で変更いただけます。商品ページの実寸の表もあわせてご覧ください」
共通: 変更の期限の日付、変更の手続きのページ、変更しない場合は返信不要であること
定型文に「返品が多い」「体型」の言葉を入れないのが大事です。 案内を受け取った会員が、自分の購入の履歴を見張られていると感じる書き方は避けます。 伝えるのは、この商品の作りが、会員がこれまで選んできたものと比べてどうか、ということだけです。
「変更しない場合は返信不要」を必ず入れます。 これが無いと、変更しない会員からも「このままで大丈夫です」という返信が届き、その返信を読む時間が新しい工数になります。
出力形式を固定する
一覧は表で出し、同じ内容を JSON でも残します。 表は担当者が読んで承認の列を埋めるため、JSON はシーズンが終わった後の突き合わせのためです。
{
"run_at": "2026-10-15T06:00:00+09:00",
"season": "2027SS",
"candidates": [
{
"order_line_id": "",
"member_id_hash": "",
"style_no": "",
"category": "pants",
"size_label": "M",
"p_small": 0.0, "p_large": 0.0, "p_other": 0.0, "p_kept": 0.0,
"p_size": 0.0,
"direction": "up | down | none",
"template": "up | down | none",
"evidence": [ { "item": "waist", "diff_cm": 0.0, "kept_count": 0 } ],
"change_deadline": "2026-11-20",
"approved_by": "",
"decision": "send | skip | null",
"skip_reason": ""
}
],
"model_version": "",
"threshold": 0.30
}
1つ目の理由は、4つの確率を残せることです。 規則の1.5倍を後で変えても、残した確率から向きを計算し直せます。
2つ目は、evidence で根拠が読めることです。 担当者は確率の数字ではなく、「過去に残した4本のパンツよりウエストが2.5センチ小さい」という根拠を見て決めます。数字だけでは、送るかどうかを決められません。
p_other が高い候補は、サイズの案内では防げない返品のおそれです。 案内の対象にはせず、一覧で目に留めるだけにします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| カートシステム | データの書き出し(読み取りのみ) | 予約の注文、会員の過去の購入 |
| 返品の受付の表 | 読み取りのみ | 返品と交換の理由の区分 |
| 商品のマスタ | 読み取りのみ | サイズごとの実寸、素材とシルエットの区分 |
| 共有フォルダ | 一覧の書き出し | 案内の候補の一覧と、商品ごとの偏りの表 |
| メールの配信の仕組み | 承認された行だけを渡す | 会員IDと定型文の番号と変更の期限 |
| 社内のチャット | 通知 | 一覧ができたこと、期限が近い候補の件数 |
配信の仕組みへ渡すのは、decision が send の行だけです。 一覧を書き出した時点では何も送られません。担当者が承認の列を埋めて保存したことを合図に、別の処理が承認された行だけを配信の仕組みに渡します。 書き出しと送信を同じ処理にしないことで、承認の前に送られる経路を無くします。
人が確認する
evidenceを読む … どの項目が何センチ違うかを見て、案内が要るかを決めます。差が1センチ程度なら、送らないことも多いはずです- 会員の問い合わせの履歴を見る … 以前に「ゆったり着たい」「丈は詰める」と伝えてきている会員なら、送りません
- 向きのない候補を見る …
directionがnoneの候補は、項目ごとに向きが逆です。実寸の表を見る案内にするか、送らないかを決めます - 送らないと決めたら理由を書く …
skip_reasonに短く残します
2番目を省かないでください。 問い合わせの記録はモデルに入れておらず、会員が自分で伝えた希望は、どの確率よりも確かです。
目標は、720件をならして1件2分です。 候補にならなかった注文は一覧で件数を流し見るだけで、候補の注文は evidence と問い合わせの履歴を見るので数分かかります。 その配分でならすと2分です。候補が720件の3割を超える日は、線が低すぎるか、商品のマスタの実寸が誤っています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 商品のマスタに実寸が無い | その商品の行は見込まず、一覧に「実寸なし」と出す。商品の担当に実寸の登録を頼む |
| 実寸の値が明らかにおかしい(Mより S が大きい) | サイズの並びと実寸の大小を照らし、逆になっていれば見込まず商品の担当へ知らせる |
| 会員が同じ品目を一度も残していない | 実寸の差を欠けた値にして見込み、一覧に「比べる服なし」と出す |
| 同じ会員が同じ日に複数の候補 | 1通の案内にまとめる |
| 変更の受付の期限まで7日未満 | 候補にせず、一覧に「期限が近い」と印を付けるだけにする |
| 前回の案内に返信が無かった会員 | 同じシーズンの2通目は送らない |
| 学び直したモデルが前より当たらない | 入れ替えず、前のモデルを使い続けて知らせる |
| 書き出しの列が決めたとおりでない | 処理を止め、一覧を出さずに担当に知らせる |
| 新しい品目(初めて扱う品目) | 比べる項目の表に無いので見込まず、一覧に「品目の設定なし」と出す |
2行目の照らし合わせは、毎朝必ず行います。 実寸の入力の誤りは、その商品を注文した全員に誤った向きの案内を送ることにつながります。
記録を残す
- 毎朝の書き出しと、注文の行ごとの実寸の差
- 4つの確率(補正の前と後)と、使ったモデルの版と線
- 候補、向き、定型文の番号、
evidence - 担当者の承認と、送らなかった理由
- 送った案内と、会員の返信の有無、サイズの変更の有無
- 発送の後の、実際の返品と交換の理由
- 設定ファイルの変更の履歴(線、向きの開き、比べる項目)
4つ目と6つ目を並べて残すのが、振り返りの土台です。 1シーズン分たまると、送らなかった候補がどうなったかが見え、線を上げるか下げるかをこの表で決められます。
04実装レベルの3段階
最小構成では、毎朝の注文に間に合いません。 1件ずつ実寸を写すので、200件を試すための段階です。 半自動化で、1件5分が3分程度になります。 見比べる材料は一覧にそろいますが、向きの判断と定型文の選び、配信の仕組みへの入力が担当者に残ります。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、定型文を選んで1通ずつ宛先を入れる作業が、候補の件数だけあったからです。 段階を飛ばさないでください。 半自動化の一覧を1シーズン見ると、実寸が誤っている商品と、比べる服の無い会員の割合が先に分かります。そこを直してから配信まで自動につなぐほうが、誤った向きの案内が減ります。
05工数削減シミュレーション
導入後 720件 × 2分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 予約販売・受注生産で服を売っていて、注文から発送までに数週間あり、発送前ならサイズの変更を受け付けているアパレルの自社EC。商品のマスタにサイズごとの実寸(着丈・身幅・肩幅・袖丈・ウエスト・股下など)を持っていて、返品の受付で「小さい」「大きい」の理由を分けて記録している場合。カスタマーサポートが、注文ごとに会員の過去の購入と返品を見て、サイズの確認のメールを送るかどうかを決めている場合。
- 在庫のある商品を当日か翌日に発送していて、発送前に案内を送る時間がほとんど無い事業者(その場合は出荷前の確認に絞った構成が向きます)。商品のマスタに実寸が無く、S・M・L の表記しか持っていない場合。返品の理由を「サイズ」としか記録しておらず、小さかったのか大きかったのかが分からない場合。なお、返品を受け付けるかどうか、サイズの変更を有料にするかどうか、生産する数量をいくつにするかの判断は、この構成では代替できません。
07最小構成で試す方法
- 前のシーズンの予約の注文から、パンツの注文を200件選ぶ(うち実際にサイズ違いで返品・交換されたものを含める)
- その200件について、会員が過去に残したパンツのウエスト・ヒップ・股下を、商品のマスタから表計算に写す
- 今回のサイズの実寸との差を、項目ごとに表計算で引く
- 差の大きい順に並べ、上から40件に印を付ける
- 印を付けた40件のうち、実際に「小さい」「大きい」で返品された件数と、向きが合っていたかを数える
200件は必ずやってください。 モデルを作る前に、「残した服の実寸と比べると、サイズ違いの返品が上のほうに集まるのか」を確かめます。会員の氏名と住所の列は、表計算に写さないでください。
| 出てきた内容 | 判断 |
|---|---|
| 上の40件にサイズ違いの返品が集まり、向きも合う | モデルに進む。 実寸の差が手がかりになっている |
| 集まるが向きが合わない | 「丈が合わない」の振り分けか、比べる項目の選び方を見直す |
| まったく集まらない | 商品のマスタの実寸が先。 実寸の測り方が型ごとにそろっているかを確かめる |
3行目が出ることは珍しくありません。 失敗ではなく、同じ「身幅」を型ごとに違う場所で測っていたことが分かったということです。測り方をそろえてから同じ200件で取り直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| サイズの表記で比べて外れる | 実寸で比べる。 同じ M でも型で身幅が違う |
| 型ごとに実寸の測り方が違う | 品目ごとの測り方の決まりを作り、マスタを直す |
| 「丈が合わない」の扱いが決まらない | 丈の実寸の差の符号で small か large に振り分ける |
| 返品の期限の内側の購入を「残した」に数える | 期限を過ぎて返品が無いものだけを数える |
| 0で埋めて「差が無い」と読まれる | 比べる服が無いときは欠けた値のまま渡す |
| 出た確率をそのまま線に当てる | method="temperature" で補正してから使う |
| 向きの逆の項目がある注文に「ひとつ上」と書く | 一方が1.5倍を超えたときだけ向きを書く |
| 複数サイズの注文に案内を送る | 印を付けて案内の対象から外す |
| 承認の前に案内が送られる | 書き出しと配信を別の処理にし、承認された行だけを渡す |
| 案内の文面が会員を見張っているように読める | 「返品が多い」「体型」の言葉を使わず、作りの違いだけを書く |
上の3行が、この構成の失敗のほとんどです。 どれも、比べる相手の実寸が信用できないという同じところから出ています。モデルの工夫より先に、商品のマスタの測り方をそろえてください。
下の2行は、会員との関係に直結します。 承認していない案内と、履歴を見張っているように読める文面は、信頼を落とします。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 会員の購入と返品の履歴、選んだサイズ、店舗での購入の記録です。カートシステムには、氏名・住所・電話番号・メールアドレスも入っています。
- 会員を特定する列を見込みに入れない … 氏名、住所、電話番号、メールアドレスは、書き出しの段階で外します。会員IDも置き換えた値にして、モデルには入れません
- 体の寸法を作り出さない … 残した服の実寸から会員の体の寸法を推し量り、記録として残すことはしません。一覧に出すのは服どうしの実寸の差だけです
- 見込みを会員の扱いの区別に使わない … サイズ違いの返品の見込みが高い会員の注文を断る、返品の条件を変える、といった使い方はしません。見込みは、案内を送る候補を選ぶためだけのものです
- 案内は承認してから送る … 一覧を書き出した時点では何も送りません。送るかどうかは担当者が決めます
- 案内を販促に使わない … 予約の注文についての連絡に、他の商品の紹介や割引の告知を混ぜません
- 外部の生成AIに履歴を渡さない … この構成は生成AIを使いません。理由の文を作るために、一覧をチャットのAIに貼り付けることも、運用の決まりで禁じます
- 一覧を見られる人を限る … 会員ごとの購入と返品の履歴が載る一覧です。カスタマーサポートと、偏りの表だけを商品の企画の担当が開ける場所に分けて置きます
誤りが起きた場合のリスクは、誤った向きの案内を送ってサイズを合わなくしてしまうことと、承認していない案内が届くことの2つです。 前者は商品のマスタの実寸の誤りから起き、後者は書き出しと配信をつないでしまうことから起きます。どちらも、実寸の照らし合わせと処理の分け方で防ぎます。
10まず何から始めるか
1週目:商品のマスタの実寸を数える
予約の商品のうち、サイズごとの実寸が入っている割合を品目ごとに数えます。あわせて、型ごとの測り方が同じかを商品の担当に確かめます。 返品の受付の表で「小さい」「大きい」が分けて選ばれているかも見ます。
2週目:200件で試す
前のシーズンのパンツの予約の注文200件で、残した服との実寸の差を表計算で引き、差の大きい40件にサイズ違いの返品が集まるかを数えます。向きが合っていたかも数えます。
3週目:品目ごとの比べる項目と案内の文面を決める
パンツ・ジャケット・コート・スカートの比べる項目を決め、設定ファイルに書きます。向きごとの3つの定型文を、変更の期限と「変更しない場合は返信不要」を入れて作ります。 文面は、カスタマーサポートの責任者が確かめます。
4週目:毎朝の実寸の差の一覧を作る
Python で、毎朝6時に注文の行ごとの実寸の差を計算し、一覧に書き出すところまで作ります。この時点ではモデルを作らず、実寸の差の計算が表計算で引いたものと合うかを確かめます。
2か月目: 過去4シーズンで4つの区分のモデルを学ばせ、温度による補正をかけて、補正の前後の brier_score_loss を比べます。担当者は従来どおり決めながら、一覧の候補と並べます。3か月目以降: 承認された行だけを配信の仕組みに渡す処理と、商品ごとの偏りの表を足します。1シーズン分の案内と返品の理由を突き合わせ、線と向きの開きを見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
HistGradientBoostingClassifier の log_loss が、多クラスでは多クラスの交差エントロピーにあたり、区分ごとに木を作ってソフトマックスで確率に直すこと。predict_proba が区分ごとの確率を返すこと。欠けた値をそのまま扱い、分かれ目ごとに左右どちらへ送るかを学ぶこと。categorical_features の既定が "from_dtype" であること(ページは scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingClassifier | 2026-10-15 |
CalibratedClassifierCV の method に sigmoid・isotonic・temperature があり、sigmoid と isotonic は多クラスに1対他で広げて合計を1に直すのに対し、temperature は多クラスにそのまま対応すること(1.8で追加)。isotonic は補正に使う記録が少ないと過学習しやすいこと | scikit-learn: CalibratedClassifierCV | 2026-10-15 |
brier_score_loss が予測した確率と実際の結果の差の二乗の平均で、小さいほど良いこと。多クラスに対応し、既定では多クラスの範囲が0から2であること。labels と scale_by_half が1.7で追加されたこと | scikit-learn: brier_score_loss | 2026-10-15 |
返品を受け付けるかどうか、サイズの変更を有料にするかどうか、案内の文面と送る範囲は、自社のカスタマーサポートの責任者と決めてください。 本記事は上記の公式情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1666)についてのご相談はこちらから。
