満期が近い保険契約を毎月洗い出し、更改されないおそれの高い順に連絡先を並べる
翌月から翌々月に満期を迎える契約を毎月取り出し、過去の更改・接触・事故・契約内容の変化から「更改されないおそれ」を点数にして、先に連絡すべき順に並べます。上位の契約には面談前の確認事項メモを下書きします。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- 保険/金融
- 対象部門
- 営業
- 対象業務
- 比較検討/集計・分析
- 主な課題
- 営業フォローが追いつかない/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に代理店システムから、翌々月に満期を迎える契約の一覧を出力する
- 担当者ごとに一覧を分け、それぞれが自分の担当分を開く
- 1件ずつ代理店システムで契約内容を開き、前年の更改の状況と保険料の変化を見る
- 事故の照会画面で直近1年の事故の有無と対応の状況を見る
- 顧客管理の表で最後に連絡した日と、そのときのやり取りを確かめる
- 気になる契約に印を付け、連絡する順番を頭の中で決める
- 面談の約束が取れた契約について、確認したいことを手帳や付箋にメモする
- 自動月初の定時に、代理店システムから出力した契約・事故のCSVと顧客管理の表を読み込む
- 自動翌月から翌々月に満期を迎える契約を取り出し、対象外の契約(解約の申し出済み、フリート契約など)を別枠に分ける
- 自動契約ごとに特徴量を作る(継続年数、保険料の変化、事故の有無、接触の間隔など)
- 自動学習済みのモデルが、更改されないおそれを0〜1の点数で出す
- 自動点数を押し上げている理由を、契約ごとに上位3つまで書き出す
- 自動担当者ごとに、点数と満期日から連絡の順番の案を並べた一覧を作る
- 自動点数の上位の契約について、生成AIが面談前の確認事項メモを下書きする
- 人担当者が一覧と理由を読み、自分の知っている事情で順番を入れ替える
- 人メモの下書きを読み、使うものだけを自分の言葉に直す
- 人連絡した日と結果を顧客管理の表に記録する
- 自動満期後に更改の結果を取り込み、翌年のモデルの学習データにする
各工程の詳しい説明を読む
- 月初に代理店システムから、翌々月に満期を迎える契約の一覧を出力する
- 担当者ごとに一覧を分け、それぞれが自分の担当分を開く
- 1件ずつ代理店システムで契約内容を開き、前年の更改の状況と保険料の変化を見る
- 事故の照会画面で直近1年の事故の有無と対応の状況を見る
- 顧客管理の表で最後に連絡した日と、そのときのやり取りを確かめる
- 気になる契約に印を付け、連絡する順番を頭の中で決める
- 面談の約束が取れた契約について、確認したいことを手帳や付箋にメモする
(a)連絡が満期の直前になる。 3〜5番を全件で丁寧に行うと、月初の数日がこれで終わります。実際に電話をかけ始めるのが遅れ、他社の見積りを取っていた顧客に届くのは満期の直前です。 そのときには、相手はほぼ決めています。
(b)見るべき契約が、見る時間のない月に埋もれる。 忙しい月は3〜5番を省き、なじみの顧客から連絡します。保険料が大きく上がった契約や、事故のあとで連絡が途絶えた契約は、なじみでないほど後回しになります。
(c)判断の根拠が残らない。 6番の判断は担当者の頭の中で行われ、どの契約をなぜ先にしたかは残りません。担当が替わると、その判断の材料もいっしょに消えます。
(d)結果を振り返れない。 更改されなかった契約について、事前に兆しがあったかを確かめる方法がありません。同じ見落としが、翌年も同じ形で起きます。
- 【自動】 月初の定時に、代理店システムから出力した契約・事故のCSVと顧客管理の表を読み込む
- 【自動】 翌月から翌々月に満期を迎える契約を取り出し、対象外の契約(解約の申し出済み、フリート契約など)を別枠に分ける
- 【自動】 契約ごとに特徴量を作る(継続年数、保険料の変化、事故の有無、接触の間隔など)
- 【自動】 学習済みのモデルが、更改されないおそれを0〜1の点数で出す
- 【自動】 点数を押し上げている理由を、契約ごとに上位3つまで書き出す
- 【自動】 担当者ごとに、点数と満期日から連絡の順番の案を並べた一覧を作る
- 【自動】 点数の上位の契約について、生成AIが面談前の確認事項メモを下書きする
- 【人】 担当者が一覧と理由を読み、自分の知っている事情で順番を入れ替える
- 【人】 メモの下書きを読み、使うものだけを自分の言葉に直す
- 【人】 連絡した日と結果を顧客管理の表に記録する
- 【自動】 満期後に更改の結果を取り込み、翌年のモデルの学習データにする
8番目が、この設計の分かれ目です。一覧は順番の案であって、指示ではありません。 担当者が「この顧客は先週会ったばかり」と知っていれば、点数が高くても後ろに回してかまいません。入れ替えた記録を残すことが、次の学習の材料になります。
2番目で別枠に分けているのも意図してのことです。 解約の申し出がすでに出ている契約は、点数を出すまでもなく手続きが必要です。点数の順番に混ぜると、確実に動くべき契約が一覧の途中に埋もれます。
02今回想定するシステム構成
代理店システム(契約・事故のCSV出力) 顧客管理の表(接触の記録) │ │ ▼【トリガー】毎月第1営業日の定時 Python(pandas で結合・特徴量の作成) │ 満期の抽出/対象外の別枠化/欠損の確認 ▼ Python(scikit-learn のロジスティック回帰) │ 更改されないおそれの点数(0〜1) │ 点数を押し上げている理由の上位3つ ▼ 担当者ごとの連絡順の一覧(Excel) │ ├──▶ 上位の契約だけ ── Claude API │ 面談前の確認事項メモの下書き(募集人が読むもの) ▼ 【担当者が順番を確かめ、連絡し、結果を記録】 ▼ 満期後の更改の結果 ── 翌年の学習データへ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理エンジン | Python(scikit-learn のロジスティック回帰 等) | R、BigQuery ML |
| 生成AI | Claude API(確認事項メモの下書き) | OpenAI API、Gemini API |
| データの取得元 | 代理店システムのCSV出力 | 保険会社ごとの照会画面からの出力 |
| 一覧の出力先 | Excel(担当者ごとのシート) | Googleスプレッドシート |
| 定時実行 | OSのタスクスケジューラ | ジョブ管理ツール |
代理店システムに書き込むことはしません。 この構成は、出力されたCSVを読むだけです。代理店システムの出力の形式や項目は保険会社ごとに違うため、どの項目が取り出せるかは、実際の出力で確かめてから特徴量を決めます。
モデルにロジスティック回帰を選ぶのは、点数の理由を説明できるからです。 scikit-learn の LogisticRegression は、既定のソルバーが lbfgs、正則化の強さの逆数 C の既定が1.0で、既定で正則化がかかるとされています。学習後の coef_ に特徴量ごとの係数が入り、どの特徴量が点数をどちらへ動かしたかを、契約ごとに書き出せます。 担当者が「なぜこの契約が上なのか」を読めない点数は、使われません。
点数は predict_proba で取り出します。 クラスごとの確率の推定値を返すとされ、2クラスなら「更改される」「更改されない」の2列が返ります。この構成では後者の列を点数にします。
点数がどれだけ実際の割合に近いかは、確かめる手段があります。 scikit-learn のドキュメントでは、LogisticRegression はそれ自体で較正された予測を返しやすいとされる一方、それはモデルの前提がデータに合い、正則化が適切に調整された場合とされています。点数0.3の契約が本当に3割外れるかは、第7章の方法で必ず確かめます。
03どうやって実装するのか
処理の起点を決める
毎月第1営業日の定時に、1回だけ動かします。 満期は1年前から決まっているため、日々の変化を追う必要はありません。月初にまとめて一覧を出すほうが、担当者がその月の連絡の段取りを組めます。
対象は2つの幅に分けます。新たに翌々月の満期に入った契約(月360件)と、翌月の満期で前月から持ち越した契約です。前者は初めての採点、後者は前月の連絡の結果を反映した採点のやり直しです。持ち越し分は、前月に連絡が取れなかった契約ほど点数が上がります。
実行の前に、代理店システムのCSVが当月の日付で出力されているかを確かめます。古いファイルのまま動くと、前月の一覧が当月の顔をして配られます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 契約 | 契約番号、種目、満期日、継続年数、保険料(今回と前年)、補償の主な内容、支払方法、担当者 | 代理店システムのCSV出力 |
| 異動 | 車両入替、住所変更、補償の追加・削除と日付 | 代理店システムのCSV出力 |
| 事故 | 直近1年の事故の有無、件数、受付日、支払の状況 | 代理店システムのCSV出力 |
| 接触 | 連絡した日、方法(電話・訪問・メール)、つながったか、要点 | 自社の顧客管理の表 |
| 過去の結果 | 過去の満期ごとの結果(満期前に更改/満期後に更改/更改されず)と、更改されなかった理由の区分 | 代理店システムと自社の記録 |
質を決めるのは、いちばん下の行です。 学習には「どの契約が更改されなかったか」が要ります。しかも理由の区分が要ります。 車を手放したので保険が不要になった契約と、他社へ移った契約を同じ「更改されず」にすると、車を手放しそうな顧客を探すモデルができてしまいます。
接触の記録は、つながらなかった電話も残します。 「3回かけて1回もつながらない」は、更改されないおそれの強い材料です。記録の粒度をそろえることが、最初の準備になります。
データの取得方法を決める
取得は、代理店システムから出力したCSVと、顧客管理の表を Python の pandas で読み込み、契約番号で結合するだけです。代理店システムのAPIには頼りません。API連携の有無や仕様は保険会社ごとに異なるため、この構成ではCSV出力を前提にし、API連携は利用環境に応じた個別実装とします。
| 作る特徴量 | 元のデータ | 考え方 |
|---|---|---|
| 継続年数 | 契約 | 長いほど更改されやすい傾向を想定 |
| 保険料の変化率 | 契約(今回÷前年) | 等級の変化や料率改定で上がった契約 |
| 前回の更改の時期 | 過去の結果 | 前回が満期後の手続きだったか |
| 直近1年の事故の有無 | 事故 | 事故後の保険料の上昇と、対応への不満 |
| 最後につながった接触からの日数 | 接触 | 長いほど事情が見えていない |
| 直近6か月のつながらなかった回数 | 接触 | 連絡を避けている可能性 |
| 補償を減らした異動の有無 | 異動 | 保険料を下げたい意向の表れ |
| 同じ契約者のほかの契約の数 | 契約 | 複数の契約がある顧客は移りにくい傾向を想定 |
| 担当者の交代の有無 | 契約 | 交代の直後は関係が薄い |
特徴量は、担当者が口で説明できるものだけにします。 「考え方」の列は仮説で、実際にどちらへ効くかは学習の結果で確かめます。 仮説と逆の係数が出たら、データの取り方を疑います。
入れない特徴量も先に決めます。 契約者の年齢、性別、国籍、住んでいる地域は使いません。担当者の番号も使いません。 入れると、点数が担当者の成績を映すようになります。
AIへ渡す前に整形する
- 対象外の別枠化 … 解約の申し出が受付済み、フリート契約、団体扱いの契約は点数を出さず、別のシートに並べます
- 学習データの理由の仕分け … 過去の「更改されず」のうち、車両の売却・廃車、物件の売却、契約者の死亡など保険の対象が無くなったものは、学習から外します
- 時点の固定 … 特徴量は、その契約の満期の2か月前の時点で分かっていた情報だけで作ります
- 欠損の扱い … 接触の記録が1件も無い契約は、日数を空欄にせず「記録なし」の印を別の列に立てます
- 尺度をそろえる …
StandardScalerで標準化してから学習します。Pipelineで標準化とモデルを一つにまとめ、採点のときも同じ変換を通します - 学習と検証の分け方 … ランダムに分けず、時期で分けます。 過去3年のうち古い2年半で学習し、直近の半年で検証します
- 重複の検知 … 同じ契約番号が一覧に2回入っていないかを確かめます
3番目を軽く見ないでください。 過去の契約で「満期後に解約の申し出があった」という情報を特徴量に混ぜると、検証では高い精度が出て、本番では何も当たらないモデルになります。採点の時点では、まだ起きていない出来事だからです。
5番目の標準化は、理由を書き出すためにも必要です。 尺度がそろっていないと、係数の大きさを比べられません。
AIに処理させる
AIの仕事は2つに分かれます。 点数を出すのはロジスティック回帰で、メモを書くのは生成AIです。点数は生成AIに出させません。 同じ契約に毎回同じ点数が付かないと、順番を比べられないからです。
| 処理 | させること | させないこと |
|---|---|---|
| ロジスティック回帰 | 更改されないおそれを0〜1で出す | 連絡するかしないかの決定 |
| 理由の書き出し | 係数×標準化後の値の大きい順に上位3つを並べる | 因果の断定(「事故のせいで移る」) |
| 生成AI | 上位の契約について、面談前に確かめたいことを箇条書きにする | 顧客向けの文面、補償の提案、保険料の見込み |
理由の書き出しは、モデルの計算そのものから作ります。 ロジスティック回帰では、各特徴量の係数と標準化後の値を掛けた値の合計が、点数のもとになる値(対数オッズ)です。この掛け算の値が大きい順に3つ並べれば、その契約で点数を押し上げている項目になります。 生成AIに理由を考えさせると、それらしい別の理由を書きます。
pipe = Pipeline([("scale", StandardScaler()), ("lr", LogisticRegression())])
pipe.fit(X_train, y_train) # y=1 が「更改されず」
score = pipe.predict_proba(X_now)[:, 1] # 2列目を点数にする
z = pipe["scale"].transform(X_now)
contrib = z * pipe["lr"].coef_[0] # 契約×特徴量の寄与
top3 = np.argsort(-contrib, axis=1)[:, :3] # 押し上げている上位3つ
寄与が負の特徴量は、理由に出しません。 点数を下げている項目は「更改されやすい材料」なので、上位3つに正の値が3つ無ければ、あるだけを出します。
生成AIに渡すのは、上位の契約の要約だけです。 例えば各担当者の上位10件、合わせて月40件前後にします。渡すのは、種目、前年からの変化、異動の要点、事故の有無と対応の状況、接触の要点、そして上の3つの理由です。氏名・住所・電話番号・証券番号は渡しません。
| させないこと | 理由 |
|---|---|
| 顧客に送る案内や説明の文面 | 顧客への情報提供と意向の把握は募集人が所定の手順で行う |
| 商品や補償の推奨 | 意向を把握する前に結論を置くことになる |
| 保険料の見込み額 | 保険会社の計算によるもので、推測の数字が独り歩きする |
| 他社との比較 | 根拠のない比較は顧客に誤解を与えうる |
| 点数の付け直し | 点数はモデルの出した値をそのまま使う |
1行目がいちばん起きやすい逸脱です。 「確認事項」を頼んでも、何も言わなければ「〇〇様、いつもお世話になっております」から始まる文面を書きます。メモは募集人が自分で読むもので、顧客には渡しません。
指示内容を固定する
あなたは損害保険代理店で、満期更改の面談を控えた募集人のために、
面談前に確認しておきたい事項を整理する立場です。
渡された契約の要約だけを見て書いてください。推測で事実を足さないでください。
【書くもの】
1. changes ……… 前年の満期から変わったこと(保険料、補償、異動)
2. to_confirm …… 面談で顧客に確かめたいこと。質問の形で書く
3. open_items …… 前回の接触で約束したまま終わっていないこと
4. cautions …… 面談の前に社内で確かめておくこと(事故の対応状況など)
【厳守事項】
- これは募集人が読む社内のメモです。顧客への挨拶、案内、説明の文面を書かないでください。
- 商品や補償を勧めないでください。「〇〇特約を付けるべき」とも書かないでください。
- 保険料の金額や見込みを計算しないでください。要約にある数字だけを写してください。
- 他社の商品や保険料と比べないでください。
- 要約に記載がないことは「不明」と書き、埋めないでください。
- 更改されない理由を断定しないでください。「〇〇の可能性があるため確認」までにしてください。
- 事故の相手方や、けがの内容について書かないでください。
- 点数と理由は変えずにそのまま扱い、評価し直さないでください。
- to_confirm は5つまで、各項目は60字以内にしてください。
【契約の要約】{contract_summary}
【点数を押し上げている理由(上位3つ)】{top_reasons}
【直近の接触の要点】{contact_notes}
「顧客への文面を書かない」を最初に置かないと、案内状になります。 面談の準備という言葉から、生成AIは顧客に見せる資料を想像しがちです。メモの読み手が募集人であることを、指示の冒頭で固定します。
「理由を断定しない」も同じです。 点数の理由に「保険料の上昇」があると、「保険料に不満があるため他社を検討中」と書きます。それは予測の理由であって、顧客の事実ではありません。 断定したメモを読んだ募集人は、その前提で面談に入ってしまいます。
出力形式を固定する
生成AIからは、次の形のJSONで受け取ります。 Claude API の構造化出力を使い、output_config.format に type: "json_schema" とスキーマを指定します。スキーマに沿った応答を制約付きの生成で保証するとされ、JSONの解析で失敗しません。
{
"contract_key": "",
"changes": [""],
"to_confirm": [""],
"open_items": [""],
"cautions": [""],
"unknown_fields": [""]
}
スキーマで字数や件数の上限は縛れません。 構造化出力は minLength maxLength などの文字列の制約や、minimum maximum などの数値の制約に対応していないとされています。「5つまで」「60字以内」は、受け取ったあと Python の側で数えて確かめます。
モデルの採点の結果は、生成AIとは別の表に持ちます。
| 列 | 中身 |
|---|---|
contract_key | 契約番号を置き換えた社内のキー |
score | 更改されないおそれ(0〜1) |
rank_in_staff | 担当者の中での順位 |
reason_1〜reason_3 | 点数を押し上げている特徴量と、その値 |
days_to_expiry | 満期までの日数 |
lane | score(点数順)/deadline(期限枠)/excluded(対象外) |
model_version | 採点に使ったモデルの版 |
1つ目の理由は、点数とメモを別の層に置けることです。 点数はモデルが決め、メモは生成AIが書きます。メモがうまく書けない月も、一覧は出せます。
2つ目は、lane で期限の枠を分けられることです。 満期まで30日を切って一度も接触できていない契約は、点数にかかわらず deadline に入れて一覧の先頭に置きます。 点数が低くても、手続きが間に合わなければ満期を過ぎてしまいます。
3つ目は、model_version で後から振り返れることです。 学習し直したモデルで順番が変わったとき、どの版の点数で連絡したかが分かります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 代理店システム | CSVの読み込み | 契約・異動・事故を取る。書き込まない |
| 顧客管理の表 | ファイルの読み込み | 接触の記録を取る |
| scikit-learn | Python の中で実行 | 学習済みモデルで採点し、理由を書き出す |
| Claude API | API呼び出し | 上位の契約のメモを下書きする |
| Excel | ファイルの書き出し | 担当者ごとのシートに一覧とメモを置く |
代理店システムへは書き込みません。 契約の手続きは、これまでどおり保険会社の手順で募集人が行います。この構成が出すのは、連絡の順番の案とメモの下書きまでです。
一覧は担当者ごとのシートに分け、自分の担当分だけを開けるようにします。 他の担当者の顧客の事情まで全員に見せる必要はありません。
人が確認する
担当者が見るのは、自分の担当の一覧全体です。 上位だけを見るのではありません。1件ずつ詳しく見るのは上位と期限枠で、残りは点数と理由を流し見ます。
- 期限枠を先に見る …
deadlineの契約は、点数にかかわらず今週中に連絡します - 上位の理由を読む … 3つの理由が、自分の知っている事情と合っているかを確かめます
- 順番を入れ替える … 先週会ったばかり、すでに更改の意向を聞いている、といった事情があれば後ろに回します。入れ替えた理由を一言残します
- メモの下書きを直す … 使う項目だけを残し、断定になっている箇所を直します
- 連絡の結果を記録する … つながったか、次の約束、更改の意向の有無を顧客管理の表に書きます
3番目を省かないでください。 担当者が入れ替えた契約がのちにどうなったかは、モデルが見落としている事情を教えてくれる材料です。
目標は、360件をならして1件4分です。 上位と期限枠で全体の2割前後という想定で、それより多い月は、点数の閾値か期限枠の条件を見直します。
メモは募集人の手元の準備で、面談の記録ではありません。 面談で確かめた顧客の意向や、説明した事項の記録は、代理店が定めた手順と様式で別に残します。
例外に対処する
| 起きること | 対応 |
|---|---|
| 初めて満期を迎える契約 | 過去の更改の記録が無い。点数は出すが「履歴少」の印を付け、順番は担当者の判断を優先 |
| 他の代理店から移管された契約 | 移管前の接触の記録が無い。「記録なし」の印を立て、期限枠の条件を早める |
| 解約の申し出が受付済み | 点数を出さず excluded の別枠へ。手続きを最優先 |
| 満期日が途中で変わった(中途の更改) | 抽出の対象から外れていないかを、前月の一覧と照合して確かめる |
| 特徴量の欠損が多い | 欠損の多い契約は点数の横に印を付け、点数の順番より担当者の判断を優先 |
| 保険会社の料率改定があった年 | 保険料の変化率の分布が変わる。改定の月は検証の結果を見てから一覧を配る |
| CSVの列や形式が変わった | 読み込みの時点で列名を照合し、合わなければ一覧を出さずに止める |
| 生成AIの応答が無い・上限を超えた | メモなしで一覧だけを配る。メモは翌営業日に作り直す |
上から3行目までが大半を占めます。 どれもモデルの問題ではなく、データの側で「その契約が点数を出してよい状態か」を見分ける問題です。 ここを別枠に分けるほうが、モデルの精度を上げるより効きます。
記録を残す
- 採点に使った特徴量の全列と、その時点のCSVのファイル名と出力日
- 点数、順位、理由の上位3つ、
lane、model_version - 担当者が順番を入れ替えた記録と、その理由
- 生成AIに渡した要約と、返ってきたメモ、担当者が直したあとのメモ
- 連絡した日、方法、つながったか、結果
- 満期後の更改の結果と、更改されなかった理由の区分
- モデルを学習し直した日、学習に使った期間、検証の結果
3つ目と最後から2つ目がそろって、初めて学習データになります。 「点数が高く、連絡して、更改された」契約と、「点数が高く、連絡できず、更改されなかった」契約を分けられないと、連絡の効果とモデルの当たり外れが混ざります。
連絡したかどうかは、必ず残します。 これが無いと、第12章で述べる学習データの偏りを確かめられません。
04実装レベルの3段階
最小構成は、連絡の順番を決めるためのものではありません。 データに差があるかを確かめるための段階です。 半自動化で、1件10分が6分程度になります。 画面を渡り歩いて事情を集める作業が、一覧の点数と理由を読む作業に変わります。ただし、メモ作りと、期限の近い契約の拾い出しが手で残ります。本格構成で4分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を3か月使うと、担当者が入れ替えた契約の傾向が見えてきます。そこに出てくる事情を特徴量に足してから、メモの下書きに進むほうが、メモの中身が当たります。
05工数削減シミュレーション
導入後 360件 × 4分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 自動車保険・火災保険などの個人・小規模法人の契約を数千件規模で扱い、毎月数百件の満期が来る損害保険代理店。満期の案内は出しているが、どの契約に先に電話するかが担当者の経験で決まっている場合。契約管理のシステムから契約・接触・事故の履歴をCSVで取り出せ、過去2〜3年分の更改の結果が残っている場合。
- 月の満期が数十件で、担当者が全件を把握できている場合。過去の更改の結果や接触の記録が残っておらず、学習に使うデータが無い場合。フリート契約や大口の企業契約が中心で、1件ごとに個別の交渉になる場合。なお、募集にあたっての説明や意向の確認、補償内容の提案は、この構成では代替できません。
07最小構成で試す方法
- 代理店システムから、過去1年に満期を迎えた契約をCSVで出力する(更改の結果が分かっているもの)
- 保険の対象が無くなった契約を外し、「更改された」「更改されなかった」の2つに分ける
- Excelで3つの単純な印を付ける(保険料が前年より上がった/直近1年に事故があった/直近6か月につながった接触が無い)
- 印の数で並べ、上位2割に実際の「更改されなかった」契約が何割入っているかを数える
- 全体の「更改されなかった」割合と比べる
これを必ずやってください。 Python を組む前に、「手元のデータに、並べる価値のある差があるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 上位2割に、全体の割合より明らかに多く入った | ロジスティック回帰に進む |
| 全体の割合とほとんど変わらない | 3つの印以外の材料が要る。接触の記録の整備が先 |
| 「更改されなかった」理由の区分が付けられない | 学習データが作れない。 理由の記録から始める |
2行目が出ることは珍しくありません。 失敗ではなく、担当者が勘で見ていた材料が、記録に残っていないということが分かったということです。その場合は、接触の記録の付け方をそろえて半年ためてから、同じ手順をやり直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 保険の対象が無くなった契約を「更改されず」に混ぜる | 理由の区分で学習から外す。混ぜると車を手放す人を探すモデルになる |
| 採点の時点で分からない情報を特徴量に入れる | 満期の2か月前の時点で分かっていた情報だけで作る |
| 学習と検証をランダムに分ける | 時期で分ける。 料率改定の年をまたぐと傾向が変わる |
| 正解率で良し悪しを見る | 更改されない契約は少数で、全部「更改される」と答えても正解率は高く出る。上位2割に何割入るかで見る |
| 点数を確率として顧客や上長に説明する | 予測であって確実ではない。 較正曲線で点数と実際の割合の差を確かめてから扱う |
| 過去に連絡した契約ほど更改されている | 連絡の効果がデータに混ざる。連絡の有無を残して分けて見る |
| 担当者の番号を特徴量に入れる | 点数が担当者の成績を映す。入れない |
| 上位だけに連絡して下位を放置する | 満期の手続きは全件に行う。期限枠を必ず設ける |
| メモが顧客向けの文面になる | 指示の冒頭で読み手を募集人に固定し、挨拶で始まる出力は後段で弾く |
| 点数の理由を生成AIに考えさせる | 係数×標準化後の値から機械的に出す |
上の3行が、この構成の失敗のほとんどです。 どれも、学習データが「その時点で本当に分かっていたこと」と「本当に防げた離反」だけでできているかという、同じ問題から出ています。
6行目は、見落とされやすい偏りです。 これまで担当者が気にかけて連絡した契約は、連絡したから更改されたのかもしれません。すると、モデルは「担当者が気にかけそうな契約は更改されやすい」と学び、本当に危ない契約の点数を下げてしまいます。 連絡の有無を記録し、連絡しなかった契約だけで傾向を見比べることで、偏りの大きさを確かめます。
較正の確認は、scikit-learn の較正曲線で行えます。 予測した確率をいくつかの区間に分け、区間ごとの実際の割合と並べて描くとされています。ずれが大きければ CalibratedClassifierCV で補正できますが、isotonic はデータが少ないと過学習しやすく、1,000件程度を超えるときに sigmoid 以上の働きをするとされています。 保有契約が数千件の代理店では、まず sigmoid から試します。
学習し直すたびに、係数の向きも見比べます。 前の版で点数を押し上げていた特徴量が、新しい版で逆向きになっていたら、データの取り方か理由の区分が変わった疑いがあります。 検証の数字が良くても、そのまま入れ替えないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 契約者の氏名・住所・連絡先、契約の内容と保険料、事故の履歴、そして担当者が書いた接触の記録です。傷害や人身の事故では、けがの内容など健康に関わる情報が含まれることがあります。
- 利用目的の範囲で使う … 満期の案内と更改の手続きのために契約の情報を使うことが、代理店と保険会社のプライバシーポリシーや委託契約の範囲に入っているかを、先に確かめてください。点数を別の目的(引受の判断や保険料の決定など)に使わないでください
- 生成AIへ渡す範囲を限る … 渡すのは上位の契約の要約だけです。氏名・住所・電話番号・証券番号、事故の相手方、けがの内容は渡しません。 契約番号は社内のキーに置き換えます
- 外部サービスの設定を確かめる … 生成AIのAPIに送った入出力を、提供元がモデルの学習に使うかどうか、どれだけの期間保存するかを、契約と利用規約で確かめてから使ってください
- 保存期間とアクセス権を決める … 一覧とメモは担当者ごとのシートに置き、自分の担当分と管理者だけが開けるようにします。特徴量とログは学習に要る期間(例えば3年)を決め、過ぎたものは消します
- 募集の手続きを代替させない … 金融庁の資料では、保険募集に際し、顧客が保険加入の適否を判断するのに必要な事項の情報提供と、顧客の意向の把握が求められる趣旨が示されています。この構成は、その説明も意向の把握もしません。 生成AIに顧客向けの説明文を作らせず、何を説明し、何を勧めるかは募集人が保険会社の所定の手順で決めます。具体的な運用は、所属する保険会社と代理店の募集管理の担当者に確かめてください
- 点数を顧客に見せない・扱いを変えない … 点数は連絡の順番を決めるための社内の予測です。点数の低い顧客への対応を薄くしたり、点数を理由に条件を変えたりしないでください
学習データの偏りにも注意します。 年齢や性別を特徴量から外しても、継続年数や支払方法がそれらと結びついていれば、点数が特定の顧客層に偏ることがあります。 半年ごとに、顧客層ごとの点数の分布と実際の結果を見比べ、偏りが大きければ特徴量を見直します。学習データそのものも、過去に担当者が連絡を選んだ結果を含んでいます。 点数は「これまでの代理店のやり方のもとでの見込み」であり、やり方が変われば当たり方も変わることを、使う人全員が知っておく必要があります。
誤りが起きた場合のリスクは、危ない契約を見落として満期を過ぎることと、点数を事実のように扱って面談の中身をゆがめることの2つです。 前者は期限枠で、後者はメモの書き方の制約と募集人の確認で防ぎます。
10まず何から始めるか
1週目:過去の結果に理由を付ける
代理店システムから過去1年に満期を迎えた契約を出力し、更改されなかった契約に理由の区分を付けます。 保険の対象が無くなった、他社へ移った、連絡がつかないまま満期を過ぎた、の3つで足ります。
2週目:印の数で並べて比べる
保険料の上昇、事故の有無、接触の空白の3つの印で並べ、上位2割に実際の「更改されなかった」契約が何割入るかを数えます。 全体の割合と比べて差が出るかを見ます。
3週目:接触の記録の付け方をそろえる
つながらなかった電話も残すことを、担当者6名で決めます。あわせて、特徴量に入れない項目(年齢、性別、地域、担当者の番号)を文書にしておきます。
4週目:ロジスティック回帰で採点する
Python で過去2〜3年の満期契約を学習し、直近の半年で検証します。上位2割に入る割合と較正曲線を確かめ、この時点では一覧を担当者に配らず、自分たちで結果と見比べます。
2か月目: 担当者ごとの一覧と期限枠を出し、実際の連絡の順番に使い始めます。入れ替えの記録を毎週数えます。3か月目以降: 上位の契約に確認事項メモの下書きを足し、1件10分が何分になったかを実測します。満期後の更改の結果を取り込み、半年ごとにモデルを学習し直す流れができた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
LogisticRegression の既定のソルバーが lbfgs、C の既定が1.0で小さいほど正則化が強いこと、既定で正則化がかかること。predict_proba がクラスごとの確率の推定値を返すこと。coef_ に特徴量ごとの係数が入ること。sag/saga は尺度のそろった特徴量で速い収束が保証され、sklearn.preprocessing の変換で前処理できること | scikit-learn: LogisticRegression | 2026-09-29 |
較正曲線が予測確率と実際の陽性の割合を区間ごとに比べること。LogisticRegression はそれ自体で較正された予測を返しやすいが、前提が合い正則化が適切な場合であること。CalibratedClassifierCV の sigmoid と isotonic、isotonic が小さなデータで過学習しやすく、約1,000件を超えるとき sigmoid 以上に働くこと | scikit-learn: Probability calibration | 2026-09-29 |
構造化出力を output_config.format に type: "json_schema" で指定すること。制約付きの生成でスキーマに沿った応答を保証すること。数値の制約(minimum 等)と文字列の制約(minLength 等)に対応していないこと | Claude API Docs: Structured outputs | 2026-09-29 |
| 平成26年改正保険業法の施行に向けた政令・内閣府令等の改正案で、保険募集に際し顧客が保険加入の適否を判断するのに必要な事項を情報提供すべき事項として規定すること、具体的な意向把握のプロセスを例示すること、保険募集人が自ら整備すべき体制を規定すること。施行が平成28年5月末とされていたこと | 金融庁: 平成26年改正保険業法(2年以内施行)に係る政府令・監督指針案の公表について | 2026-09-29 |
募集にあたっての情報提供と意向の把握の具体的な運用は、所属する保険会社と代理店の募集管理の担当者に確かめてください。 本記事は金融庁の公表資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0295)についてのご相談はこちらから。
