損保ジャパン — 機械学習による保険金不正請求検知(従来比3倍以上)と自然災害AI査定で現地調査を大幅削減
企業概要
- 社名: 損保ジャパン株式会社
- グループ: SOMPOホールディングス傘下(損保事業の中核)
- 事業: 損害保険(自動車・火災・傷害・賠償責任・自然災害補償等)
- 規模: 国内損保業界大手、保険料収入約1.5兆円
- DX推進組織: デジタル戦略部・データサイエンス室
- AI活用方針: 「顧客への迅速なサービス提供」と「業務効率化・不正対策の強化」
背景と課題
課題1: 保険金不正請求の増加
損害保険業界では保険金詐欺が社会問題化しており、以下の課題があった。
- 不正請求の手口の高度化・組織化により、経験則による目視検知では限界
- 年間数十万件の請求を少人数の調査員でスクリーニングするのは物理的に困難
- 不正を見逃すと保険会社の損害だけでなく、正直な契約者の保険料負担増にもつながる
課題2: 大規模自然災害時の査定処理
近年の台風・豪雨被害の大規模化により、
- 単一の台風で数万件の火災・水災保険請求が発生
- 現地調査員が全物件を訪問するのに数ヶ月かかるケースも
- 査定の遅延が被災した顧客の生活再建を遅らせるという深刻な問題
導入したシステム・AI
① 保険金不正請求検知AI
機械学習による異常検知システムで不正請求候補を自動スクリーニング。
- 技術: 機械学習(アンサンブル学習・異常検知アルゴリズム)
- 特徴量: 請求頻度・金額パターン・事故状況・契約履歴・第三者情報等、数百の特徴量を利用
- 仕組み: 過去の不正確定事例と正常事例で学習した分類モデルが、新規請求をリアルタイムでスコアリング
- 運用: 高リスクスコアの請求を自動的に調査員へエスカレーション
② 自然災害AI損害査定システム
衛星写真・航空写真・ドローン映像をAI画像解析で処理。
- 技術: コンピュータービジョン(物体検出・セグメンテーション)
- 入力: 災害前後の衛星画像・航空写真、契約物件の位置情報
- 処理: AIが建物被害を自動検出・損害レベルを分類(一部損・半損・全損等)
- 効果: 現地調査が必要な物件を絞り込み、優先度の高い案件から効率的に対応
③ データ統合プラットフォーム
- 契約データ・請求データ・外部データ(気象・地理情報等)を統合
- AIモデルへのリアルタイムデータパイプラインを整備
- 調査員向けダッシュボードでAI判定結果を可視化
成果
| 指標 | 導入前 | 導入後 |
|---|---|---|
| 不正請求検知精度 | ベースライン | 従来比3倍以上に向上 |
| 不正請求の見逃し率 | — | 大幅低減 |
| 自然災害時の現地調査件数 | 全件現地調査が原則 | AIスクリーニングで大幅削減 |
| 査定処理スピード(大規模災害時) | 数ヶ月 | 数週間以内 |
| 調査員1人あたり処理件数 | ベースライン | 生産性向上 |
実装方法
不正検知AIのアーキテクチャ
- 特徴量エンジニアリング層: 請求データから数百の特徴量を自動生成(請求間隔・金額分布・関係者ネットワーク等)
- モデル層: XGBoost / Random Forest のアンサンブルで不正リスクスコアを算出。Isolation Forestで未知パターンの異常検知も実施
- ルールエンジン統合: AIスコアと既存のルールベースシステムを組み合わせてファイナルスコアを決定
- 調査員ワークフロー: 高リスク案件はケース管理システムに自動登録し、調査員がレビュー・対応
自然災害査定のワークフロー
- 災害発生 → 気象データ・被災地マップで影響エリアを即時特定
- 衛星・航空会社からの画像データを自動取得(API連携)
- AIが建物被害を物件ごとに自動判定(数万件を数時間で処理)
- 低損害と判定された物件 → 写真確認のみで査定完了
- 高損害・判定不能物件 → 調査員が優先的に現地対応
モデルの継続改善
- 調査員のフィードバック(不正確定・誤検知)を定期的に再学習に反映
- 新手口の不正パターンが発見されたら特徴量・モデルを随時更新
- A/Bテストで新旧モデルの性能を比較検証してから本番切り替え
自前で実装するなら(参考コード)
機械学習による保険金不正請求検知システムの参考実装です。scikit-learnのアンサンブル学習とOpenAI APIを組み合わせた2段階検知アプローチを示します。
import numpy as np
import pandas as pd
from sklearn.ensemble import IsolationForest, GradientBoostingClassifier
from sklearn.preprocessing import StandardScaler
import json
from openai import OpenAI
client = OpenAI()
# ─── Stage 1: 機械学習による異常スコアリング ───
def build_fraud_detector(training_df: pd.DataFrame):
"""
保険請求データで不正検知モデルを学習
training_df に必要なカラム:
claim_amount, days_since_contract, claim_frequency_12m,
num_claimants, accident_hour, is_fraud (正解ラベル)
"""
features = [
"claim_amount", "days_since_contract",
"claim_frequency_12m", "num_claimants", "accident_hour"
]
X = training_df[features].fillna(0)
y = training_df["is_fraud"]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 教師あり: 過去の不正確定事例で学習
clf = GradientBoostingClassifier(n_estimators=200, max_depth=4, random_state=42)
clf.fit(X_scaled, y)
# 教師なし: 未知パターンの異常検知
iso_forest = IsolationForest(contamination=0.05, random_state=42)
iso_forest.fit(X_scaled)
return clf, iso_forest, scaler, features
def score_claim(claim: dict, clf, iso_forest, scaler, features: list) -> dict:
"""1件の保険請求を不正リスクスコアリング"""
X = np.array([[claim.get(f, 0) for f in features]])
X_scaled = scaler.transform(X)
fraud_prob = clf.predict_proba(X_scaled)[0][1] # 不正確率 (0-1)
anomaly_score = -iso_forest.score_samples(X_scaled)[0] # 異常度(高いほど異常)
# 総合リスクスコア(0-100)
composite_score = min(100, int((fraud_prob * 60 + anomaly_score * 40) * 100))
return {
"fraud_probability": round(fraud_prob, 3),
"anomaly_score": round(float(anomaly_score), 3),
"composite_risk_score": composite_score,
"requires_investigation": composite_score >= 70,
}
# ─── Stage 2: 高リスク案件をOpenAI APIでディープ分析 ───
def deep_analyze_suspicious_claim(claim: dict, risk_scores: dict) -> dict:
"""
高リスクと判定された請求をAIで詳細分析し、
調査員向けの具体的な調査ポイントを生成する
"""
response = client.chat.completions.create(
model="gpt-4o",
response_format={"type": "json_object"},
messages=[
{
"role": "system",
"content": (
"あなたは保険金不正請求調査の専門家AIです。\n"
"請求内容とリスクスコアを分析し、以下のJSON形式で回答してください:\n"
"{\n"
' "fraud_indicators": ["不正の疑いを示す具体的な指標リスト"],\n'
' "investigation_points": ["調査員が確認すべき具体的ポイント"],\n'
' "priority": "high/medium/low",\n'
' "recommended_action": "推奨する対応(調査・支払い保留・追加書類要求等)"\n'
"}"
)
},
{
"role": "user",
"content": (
f"請求内容: {json.dumps(claim, ensure_ascii=False)}\n"
f"リスクスコア: {json.dumps(risk_scores, ensure_ascii=False)}"
)
}
]
)
return json.loads(response.choices[0].message.content)
# ─── 使用例 ───
# 訓練データ(実際は数万件の過去請求データを使用)
training_data = pd.DataFrame({
"claim_amount": [150000, 5000000, 80000, 12000000, 95000],
"days_since_contract": [3650, 30, 1825, 14, 2190],
"claim_frequency_12m": [1, 5, 1, 8, 2],
"num_claimants": [1, 3, 1, 5, 1],
"accident_hour": [14, 2, 10, 3, 16],
"is_fraud": [0, 1, 0, 1, 0]
})
clf, iso_forest, scaler, features = build_fraud_detector(training_data)
# 新規請求のスコアリング
new_claim = {
"claim_id": "CLM-2024-089234",
"claim_amount": 8500000,
"days_since_contract": 21, # 契約から21日後に高額請求
"claim_frequency_12m": 6, # 直近12ヶ月で6回目
"num_claimants": 4, # 関係者4名
"accident_hour": 2, # 深夜2時の事故
"accident_type": "自動車対物事故",
"location": "高速道路"
}
risk_scores = score_claim(new_claim, clf, iso_forest, scaler, features)
print(f"不正確率: {risk_scores['fraud_probability']:.1%}")
print(f"総合リスクスコア: {risk_scores['composite_risk_score']}/100")
if risk_scores["requires_investigation"]:
analysis = deep_analyze_suspicious_claim(new_claim, risk_scores)
print(f"\n調査優先度: {analysis['priority']}")
print(f"推奨対応: {analysis['recommended_action']}")
print("不正指標:")
for indicator in analysis["fraud_indicators"]:
print(f" - {indicator}")
アーキテクチャのポイント: Stage1の機械学習モデルで全請求を高速スクリーニングし、高リスク案件のみをStage2(OpenAI APIによる詳細分析)に通すことで、APIコストを抑えながら精度を最大化できます。