손해율 분석과 이상 청구 탐지
목표
계약과 청구 데이터에서 상품·분기별 손해율과 합산비율을 계산하고, 계약 직후 청구·특정 병원 집중·수취 계좌 공유 세 가지 이상 징후를 찾아 조사 의뢰 목록을 만듭니다.
왜 중요한가
손해보험의 성적표는 두 숫자입니다. 손해율은 받은 보험료 중 얼마가 보험금으로 나갔는가이고, 합산비율은 거기에 사업비까지 더해 100% 를 넘는지 보는 것입니다. 합산비율이 100% 를 넘으면 보험 영업 자체로는 손해라는 뜻입니다. 경영진이 매달 보는 숫자이고, 요율 인상·인수 기준 강화·판매 중단이 이 숫자에서 결정됩니다.
분모가 경과보험료라는 것이 중요합니다. 1년치 보험료를 받았어도 이번 분기에 번 것은 그중 3개월치뿐입니다. 분자는 발생손해액이고, 이미 지급한 것뿐 아니라 접수됐지만 아직 심사 중인 건의 추산액도 들어갑니다. 지급액만 세면 손해율이 실제보다 좋아 보이고, 그 착시가 다음 분기에 터집니다.
사기 탐지는 손해율 관리의 다른 얼굴입니다. 가입하자마자 청구가 들어오는 계약, 유독 한 병원에서 큰 금액이 반복되는 청구, 서로 다른 계약인데 같은 계좌로 돈이 나가는 청구 — 하나하나는 우연일 수 있지만 패턴은 조사 대상입니다. 룰은 판단이 아니라 조사 의뢰의 근거를 만드는 것이고, 최종 판단은 조사 조직(SIU)이 합니다.
이 실습의 규칙
- 분기는
2026Q1(1–3월)·2026Q2(4–6월). 경과보험료는 분기 첫날에 유효한 계약(start_date가 분기 첫날 이하)마다annual_premium ÷ 4의 정수 몫(원 미만 버림)을 구해 더한 값입니다(실습 단순화). 합계를 낸 뒤 4 로 나누면 1원이 어긋날 수 있습니다. - 발생손해액 = 사고일이 그 분기인 청구 중
DENIED를 뺀 것의paid_amount + reserve_amount합. 부지급 건에 추산액이 남아 있어도 넣지 않습니다. - 손해율(%) = 발생손해액 ÷ 경과보험료 × 100, 사업비율(%) = 사업비 ÷ 경과보험료 × 100, 둘 다 소수 첫째 자리로 반올림합니다. 합산비율은 반올림한 손해율과 사업비율을 더한 값입니다.
- 계약 직후 청구 = 사고일이
start_date로부터 90일 미만(정확히 90일은 아님, 「석 달」 이 아니라 날수). 청구 상태와 관계없이 셉니다. 분기를 나누는 날짜는 언제나 사고일입니다. - 병원 집중 = 그 병원의
PAID청구가 4건 이상이면서 그PAID청구들의 평균 지급액이 전체PAID청구 평균의 2배 초과. 부지급·미결 청구는 건수에도 평균에도 넣지 않고,HOSPITAL사유도 걸린 병원의PAID청구에만 붙입니다. - 수취 계좌 공유 = 같은
payee_account로 서로 다른 계약 3건 이상. 걸린 계좌의 청구는 상태와 관계없이 모두PAYEE사유를 받습니다.
단계
- 오른쪽 예시의 생성기를
/root/ins/make_claims.py로 저장하고python3 make_claims.py로 실행하세요.claims.db에 계약 65건, 청구 110건, 사업비 6행이 들어갑니다. - 상품·분기별 경과보험료를
/root/ins/earned.csv에product,quarter,policies,earned_premium머리글로 6줄 적으세요. - 상품·분기별 손해율을
/root/ins/loss_ratio.csv에product,quarter,earned,incurred,loss_ratio_pct머리글로 적으세요. - 합산비율을
/root/ins/combined.csv에product,quarter,loss_ratio_pct,expense_ratio_pct,combined_pct머리글로 적고,/root/ins/combined.txt에worst_product=,worst_quarter=,over_100_count=세 줄을 적으세요. - 계약 직후 청구를
/root/ins/early_claims.csv에claim_no,policy_no,days_since_start,paid_amount머리글로 적으세요. - 병원 집중을
/root/ins/hospital_flag.csv에hospital_id,claims,avg_amount,ratio머리글로 적으세요.claims는 그 병원의PAID청구 수,ratio는 전체PAID평균 대비 배수(소수 둘째 자리)입니다. - 수취 계좌 공유를
/root/ins/payee_flag.csv에payee_account,policies,claims,total_paid머리글로 적고, 세 규칙 중 하나라도 걸린 청구를/root/ins/siu_referral.csv에claim_no,reasons머리글로 적으세요.reasons는EARLY·HOSPITAL·PAYEE를 알파벳순으로+로 잇습니다. /root/ins/loss_report.md에## Loss Ratio and Combined Ratio(손해율과 합산비율),## Anomalies(이상 징후),## SIU Referral(조사 의뢰),## Limitations(한계) 네 절로 보고서를 쓰세요. 절 제목은 영어 제목이나 같은 뜻의 한국어·일본어·중국어 제목 어느 쪽이든 되고, 둘을 괄호로 함께 적어도 됩니다.
참고
- 분기는
CASE WHEN substr(accident_date, 6, 2) <= '03' THEN '2026Q1' ELSE '2026Q2' END로 나눌 수 있습니다. - 비율은
ROUND(x * 100.0 / y, 1)처럼 실수 나눗셈으로 하세요. 정수끼리 나누면 0 이 됩니다. - 흔한 실수 1: 손해율 분자에
OPEN건의 추산액을 빼는 것. 아직 안 나간 돈도 발생손해입니다. - 흔한 실수 2: 2026-02-15 가입 계약을 1분기 경과보험료에 넣는 것. 분기 첫날에는 없던 계약입니다.
- 흔한 실수 3: 병원 평균을
PAID가 아닌 전체 청구로 내는 것. 부지급·미결 건은 지급액이 0 이라 평균을 끌어내립니다.
계약·청구 데이터 만들기
오른쪽 예시의 생성기를 /root/ins/make_claims.py 로 저장하고 python3 make_claims.py 로 실행하세요. claims.db 에 계약 65건, 청구 110건, 사업비 6행이 들어갑니다.
실습 안내에 있는 생성기를 /root/ins/make_claims.py 로 저장하고 python3 로 실행하세요. 손으로 고치면 뒤 단계의 숫자가 전부 어긋납니다.
경과보험료 계산하기
상품·분기별 경과보험료를 /root/ins/earned.csv 에 product,quarter,policies,earned_premium 머리글로 6줄 적으세요.
분기마다 start_date <= 분기 첫날인 계약을 상품별로 세고 annual_premium / 4 (정수 나눗셈) 를 더하세요. 두 질의를 UNION ALL 로 합치면 6줄입니다. 분기 첫날에 가입한 계약은 그 분기에 들어가고, 2026-02-15 가입 계약은 2분기에만 들어갑니다. 몫은 계약마다 낸 뒤 더합니다.
발생손해액과 손해율 계산하기
상품·분기별 손해율을 /root/ins/loss_ratio.csv 에 product,quarter,earned,incurred,loss_ratio_pct 머리글로 적으세요.
claim 을 policy 와 조인해 상품을 얻고, 사고일의 월로 분기를 나눠 paid_amount + reserve_amount 를 더하세요(DENIED 제외). 2단계 결과를 .import 로 올려 LEFT JOIN 하면 분모가 붙습니다. ROUND(x * 100.0 / y, 1).
사업비를 더해 합산비율 보기
합산비율을 /root/ins/combined.csv 에 product,quarter,loss_ratio_pct,expense_ratio_pct,combined_pct 머리글로 적고, /root/ins/combined.txt 에 worst_product=, worst_quarter=, over_100_count= 세 줄을 적으세요.
expense 표를 상품·분기로 조인해 사업비 ÷ 경과보험료 × 100 을 소수 첫째 자리로 반올림하고, 반올림한 손해율에 더하세요(둘 다 반올림한 뒤 더한다). worst 는 combined_pct 가 가장 큰 줄, over_100_count 는 100 을 넘는 줄 수입니다.
가입 직후 청구 찾기
계약 직후 청구를 /root/ins/early_claims.csv 에 claim_no,policy_no,days_since_start,paid_amount 머리글로 적으세요.
claim 과 policy 를 조인해 julianday(accident_date) − julianday(start_date) < 90 인 건을 뽑으세요. 정확히 90일인 청구는 들지 않습니다.
특정 병원에 몰린 고액 청구 찾기
병원 집중을 /root/ins/hospital_flag.csv 에 hospital_id,claims,avg_amount,ratio 머리글로 적으세요. claims 는 그 병원의 PAID 청구 수, ratio 는 전체 PAID 평균 대비 배수(소수 둘째 자리)입니다.
status='PAID' 인 청구만으로 전체 평균을 먼저 구하고(CTE), 병원별 COUNT(*) >= 4 이면서 AVG(paid_amount) > 2 × 전체 평균인 병원만 남기세요. avg_amount 는 정수, ratio 는 ROUND(…, 2).
수취 계좌 공유와 조사 의뢰 목록 만들기
수취 계좌 공유를 /root/ins/payee_flag.csv 에 payee_account,policies,claims,total_paid 머리글로 적고, 세 규칙 중 하나라도 걸린 청구를 /root/ins/siu_referral.csv 에 claim_no,reasons 머리글로 적으세요. reasons 는 EARLY·HOSPITAL·PAYEE 를 알파벳순으로 + 로 잇습니다.
payee_flag 는 payee_account 로 GROUP BY 해 COUNT(DISTINCT policy_no) >= 3. siu_referral 은 5단계 청구 + 6단계 병원의 PAID 청구 + 7단계 계좌의 청구를 모아 청구별 사유를 알파벳순 + 로 잇고 claim_no 순으로 정렬합니다.
손해율·이상 청구 보고서 쓰기
/root/ins/loss_report.md 에 ## Loss Ratio and Combined Ratio(손해율과 합산비율), ## Anomalies(이상 징후), ## SIU Referral(조사 의뢰), ## Limitations(한계) 네 절로 보고서를 쓰세요. 절 제목은 영어 제목이나 같은 뜻의 한국어·일본어·중국어 제목 어느 쪽이든 되고, 둘을 괄호로 함께 적어도 됩니다.
절 제목 네 개는 영어 제목이나 같은 뜻의 한국어·일본어·중국어 제목 그대로. 손해율(loss ratio) 절에는 가장 나쁜 상품과 그 합산비율(combined ratio)을 한 줄에, 이상 징후(Anomalies) 절에는 6단계의 병원 번호와 7단계의 공유 계좌(payee account)를 전부, 조사 의뢰(SIU Referral) 절에는 siu_referral.csv 의 건수를 숫자로 적으세요.