보험 산업 분석¶
보험 산업의 데이터 분석 기법과 활용 사례 가이드.
산업 개요¶
보험은 리스크 평가, 가격 책정, 클레임 관리가 핵심인 데이터 집약적 산업이다.
| 구분 | 설명 |
|---|---|
| 핵심 데이터 | 계약, 클레임, 고객, 외부 데이터 |
| 주요 분석 영역 | 언더라이팅, 가격, 사기 탐지, CLV |
| 규제 환경 | IFRS 17, K-ICS, 개인정보보호 |
| 트렌드 | InsurTech, 텔레매틱스, AI 언더라이팅 |
데이터 소스¶
내부 데이터¶
| 데이터 | 설명 | 분석 활용 |
|---|---|---|
| 계약 데이터 | 보험료, 보장내용, 계약기간 | 포트폴리오 분석 |
| 클레임 데이터 | 청구 내역, 지급액, 처리 시간 | 손해율 분석 |
| 고객 데이터 | 인구통계, 계약 이력, 접점 | 세그멘테이션 |
| 설계사 데이터 | 실적, 이탈률, 채널 | 영업 효율 |
외부 데이터¶
| 데이터 | 출처 | 활용 |
|---|---|---|
| 기상 데이터 | 기상청 | 자연재해 리스크 |
| 교통사고 | 도로교통공단 | 자동차보험 가격 |
| 의료 통계 | 건강보험공단 | 건강보험 언더라이팅 |
| 신용 정보 | CB사 | 도덕적 위험 평가 |
| IoT/텔레매틱스 | 차량, 웨어러블 | UBI 보험 |
핵심 분석 영역¶
1. 언더라이팅 분석¶
리스크 평가 및 인수 여부 결정:
┌─────────────────────────────────────────────────────────┐
│ 언더라이팅 분석 파이프라인 │
├─────────────────────────────────────────────────────────┤
│ │
│ 신청 데이터 │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 데이터 검증 │──►│ 리스크 스코어│──►│ 인수 결정 │ │
│ │ │ │ 산출 │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ 가격 책정 │ │
│ │ (리스크 프리미엄) │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
주요 모델:
| 모델 | 용도 | 특징 |
|---|---|---|
| GLM | 손해율 예측 | 해석 가능, 규제 적합 |
| GBM | 리스크 스코어 | 높은 예측력 |
| Survival Analysis | 사망/장해 예측 | 시간 의존성 반영 |
Python 예시:
import statsmodels.api as sm
# GLM - Tweedie distribution for claim severity
model = sm.GLM(
y_severity,
X_features,
family=sm.families.Tweedie(link=sm.families.links.Log(), var_power=1.5)
)
result = model.fit()
# 예측 손해율 = 빈도 x 심도
expected_loss = frequency_model.predict(X) * severity_model.predict(X)
2. 가격 책정 (Pricing)¶
기술적 보험료 산출:
\[\text{순보험료} = \text{예상손해액} + \text{안전할증}\]
\[\text{영업보험료} = \frac{\text{순보험료}}{1 - \text{사업비율} - \text{이익률}}\]
세분화 가격:
| 요소 | 자동차보험 | 건강보험 |
|---|---|---|
| 인구통계 | 연령, 성별 | 연령, 성별 |
| 행동 | 주행거리, 운전습관 | 운동량, 식습관 |
| 지역 | 사고율 높은 지역 | 의료비 지역차 |
| 이력 | 무사고 할인 | 병력 |
3. 클레임 분석¶
손해율 분석:
def calculate_loss_ratio(claims_df, premiums_df):
"""손해율 = 지급보험금 / 경과보험료"""
incurred_claims = claims_df.groupby('product')['paid_amount'].sum()
earned_premiums = premiums_df.groupby('product')['earned'].sum()
loss_ratio = incurred_claims / earned_premiums
return loss_ratio
# 삼각형 기법 (Triangle Method)
def chain_ladder(triangle):
"""IBNR(미보고발생손해액) 추정"""
development_factors = []
for i in range(triangle.shape[1] - 1):
factor = triangle[:, i+1].sum() / triangle[:, i].sum()
development_factors.append(factor)
# Ultimate claims 추정
ultimate = triangle[:, -1] * np.cumprod(development_factors[::-1])[::-1]
return ultimate
IBNR 추정 (준비금):
| 기법 | 설명 | 적용 |
|---|---|---|
| Chain Ladder | 과거 발전 패턴 기반 | 일반적 |
| Bornhuetter-Ferguson | 사전 손해율 + 발전 패턴 | 신상품 |
| Cape Cod | 평균 손해율 가정 | 안정적 포트폴리오 |
4. 보험 사기 탐지¶
┌─────────────────────────────────────────────────────────┐
│ 사기 탐지 시스템 │
├─────────────────────────────────────────────────────────┤
│ │
│ 클레임 접수 │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Rule-based │ ──► Red Flag 필터링 │
│ │ Screening │ (중복청구, 시기 이상 등) │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ ML Scoring │ ──► 사기 확률 점수 │
│ │ │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Low Risk │ │ Medium Risk │ │ High Risk │ │
│ │ Auto-Pay │ │ Sample Audit│ │ SIU 조사 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
주요 피처:
| 카테고리 | 피처 예시 |
|---|---|
| 청구 패턴 | 청구 빈도, 시기, 금액 분포 |
| 네트워크 | 동일 병원, 정비소 연결 |
| 텍스트 | 사고 설명 유사도, 템플릿 감지 |
| 시간 | 가입-청구 간격, 청구 시점 |
이상치 탐지 모델:
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
# Isolation Forest
clf = IsolationForest(contamination=0.05, random_state=42)
clf.fit(X_claims)
fraud_scores = clf.decision_function(X_claims)
# Supervised (과거 사기 건 레이블 있을 때)
from xgboost import XGBClassifier
model = XGBClassifier(scale_pos_weight=len(y[y==0])/len(y[y==1]))
model.fit(X_train, y_train)
5. 고객 분석¶
CLV (Customer Lifetime Value):
\[CLV = \sum_{t=1}^{T} \frac{(Premium_t - Claims_t - Costs_t)}{(1+r)^t} \times P(Retain)_t\]
이탈 예측:
| 신호 | 설명 |
|---|---|
| 갱신 미응답 | 연락 실패 |
| 불만 접수 | 클레임 불만, 서비스 불만 |
| 경쟁사 비교 | 견적 조회 |
| 혜택 감소 | 추가 담보 해지 |
# 이탈 예측 모델
from sklearn.ensemble import GradientBoostingClassifier
features = [
'tenure', 'num_claims', 'premium_change',
'complaint_count', 'contact_frequency',
'discount_expiry_soon'
]
model = GradientBoostingClassifier()
model.fit(X_train[features], y_churn)
# SHAP으로 이탈 요인 분석
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
고급 분석 기법¶
텔레매틱스 (UBI)¶
Usage-Based Insurance 분석:
| 데이터 | 분석 | 활용 |
|---|---|---|
| GPS 위치 | 운전 지역 리스크 | 지역별 가격 |
| 가속/감속 | 급제동, 급가속 빈도 | 운전 습관 점수 |
| 야간 운전 | 고위험 시간대 | 시간대별 할증 |
| 주행거리 | 노출 측정 | PAYD 보험료 |
def calculate_driving_score(trip_data):
"""텔레매틱스 기반 운전 점수"""
scores = {
'acceleration': score_acceleration(trip_data['accel']),
'braking': score_braking(trip_data['decel']),
'speeding': score_speeding(trip_data['speed'], trip_data['speed_limit']),
'night_driving': score_night(trip_data['time']),
'mileage': score_mileage(trip_data['distance'])
}
# 가중 평균
weights = {'acceleration': 0.2, 'braking': 0.25, 'speeding': 0.3,
'night_driving': 0.1, 'mileage': 0.15}
total_score = sum(scores[k] * weights[k] for k in scores)
return total_score
자연어 처리 (NLP)¶
클레임 문서 분석:
from transformers import pipeline
# 클레임 분류
classifier = pipeline("text-classification",
model="insurance-claim-classifier")
claim_text = "차량 후방 추돌로 범퍼 파손, 정비 견적 150만원"
result = classifier(claim_text)
# → {'label': 'AUTO_COLLISION', 'score': 0.95}
# 심도 예측
severity_model = pipeline("regression",
model="claim-severity-predictor")
estimated_cost = severity_model(claim_text)
이미지 분석¶
차량 손상 평가:
from torchvision import models
import torch
# 손상 탐지 및 심도 평가
class DamageAssessor:
def __init__(self):
self.detection_model = models.detection.fasterrcnn_resnet50_fpn()
self.severity_model = models.resnet50(num_classes=5) # 5단계 손상
def assess(self, image):
# 손상 부위 탐지
damages = self.detection_model(image)
# 각 손상별 심도 평가
assessments = []
for damage in damages:
cropped = crop_region(image, damage.bbox)
severity = self.severity_model(cropped)
assessments.append({
'location': damage.label,
'severity': severity.argmax(),
'confidence': damage.score
})
return assessments
규제 및 리포팅¶
IFRS 17¶
| 요구사항 | 분석 영역 |
|---|---|
| BBA (Building Block) | 현금흐름 추정, 할인율 |
| CSM | 이익 인식 패턴 |
| Risk Adjustment | 리스크 마진 산출 |
| 코호트 | 연도/상품별 그룹핑 |
손해율 리포트¶
def generate_loss_report(claims_df, period='M'):
"""기간별 손해율 리포트"""
report = claims_df.groupby(pd.Grouper(key='accident_date', freq=period)).agg({
'paid_amount': 'sum',
'earned_premium': 'sum',
'claim_count': 'count'
})
report['loss_ratio'] = report['paid_amount'] / report['earned_premium']
report['frequency'] = report['claim_count'] / report['policy_count']
report['severity'] = report['paid_amount'] / report['claim_count']
return report
주요 KPI¶
| KPI | 산식 | 목표 |
|---|---|---|
| 손해율 | 지급보험금 / 경과보험료 | < 65% |
| 사업비율 | 사업비 / 수입보험료 | < 25% |
| 합산비율 | 손해율 + 사업비율 | < 95% |
| 유지율 | 갱신 계약 / 만기 계약 | > 85% |
| 사기 탐지율 | 적발 사기 / 전체 사기 | > 70% |
기술 스택 권장¶
| 영역 | 도구 |
|---|---|
| 데이터 처리 | Spark, Pandas |
| 모델링 | scikit-learn, XGBoost, LightGBM |
| 딥러닝 | PyTorch, TensorFlow |
| 시계열 | Prophet, statsmodels |
| 시각화 | Plotly, Tableau |
| MLOps | MLflow, Kubeflow |
요약¶
보험 분석은 언더라이팅, 가격 책정, 클레임 관리, 사기 탐지 영역에서 통계/ML 기법을 활용한다. GLM 기반 전통 모델과 GBM/딥러닝 현대 기법을 결합하고, 텔레매틱스/IoT 데이터를 활용한 UBI가 트렌드다. 규제 준수(IFRS 17)와 해석 가능성이 중요하다.