이 글에서는 캐글의 Vehicle Insurance Claim Fraud Detection 데이터셋을 사용하여 보험 사기 탐지 분석을 수행하는 과정과 그에 따른 데이터 시각화 코드를 자세히 설명합니다.
https://www.kaggle.com/datasets/shivamb/vehicle-claim-fraud-detection
Vehicle Insurance Claim Fraud Detection
Fraud detection use-case for vehicle insurance industry
www.kaggle.com
1. 라이브러리 및 데이터 불러오기
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
pd.set_option('future.no_silent_downcasting', True)
pd.set_option('display.max_columns', None) # 전처 컬럼 보기
df = pd.read_csv('fraud_oracle.csv')
df.head()
데이터는 다양한 컬럼으로 구성되어 있으며, 각 컬럼은 아래와 같이 세분화되어 있습니다.
1. 사고 날짜
- Month: 월 - 사고가 발생한 월.
- WeekOfMonth: 월의 주 - 사고가 발생한 주.
- DayOfWeek: 요일 - 사고가 발생한 요일.
2. 사고 접수 날짜
- DayOfWeekClaimed: 클레임 요일 - 보험 청구가 접수된 요일.
- MonthClaimed: 클레임 월 - 보험 청구가 접수된 월.
- WeekOfMonthClaimed: 클레임 주 - 보험 청구가 접수된 주.
- Year: 연도 - 사고가 발생한 연도.
3. 차량 정보
- Make: 제조사 - 차량의 제조사.
- VehicleCategory: 차량 분류 - 차량의 분류 (예: 승용차, 트럭 등).
- VehiclePrice: 차량 가격 - 차량의 가격 범위.
- AgeOfVehicle: 차량 연식 - 차량의 연식.
4. 사고 정보
- AccidentArea: 사고 지역 - 사고가 발생한 지역 (도시/농촌).
- Fault: 책임 - 사고에 대한 책임 여부 (보험 가입자/타인).
- RepNumber: 보고서 번호 - 사고 보고서의 고유 번호.
- PoliceReportFiled: 경찰 보고서 제출 여부 - 사고 후 경찰 보고서 제출 여부.
- WitnessPresent: 목격자 존재 여부 - 사고 당시 목격자 존재 여부.
- NumberOfSuppliments: 추가 수리 항목 - 차량 수리를 위해 필요한 추가 수리 항목.
5. 가입자 정보
- Sex: 성별 - 보험 가입자의 성별.
- MaritalStatus: 결혼 여부 - 보험 가입자의 결혼 상태.
- Age: 나이 - 보험 가입자의 나이.
- AgeOfPolicyHolder: 보험 가입자 나이 - 보험 가입자의 나이.
- PastNumberOfClaims: 과거 청구 건수 - 이전에 청구한 보험 건수.
- DriverRating: 운전자 등급 - 운전자의 평가 등급.
6. 보험 상품 정보
- PolicyNumber: 정책 번호 - 보험 정책의 고유 번호.
- PolicyType: 정책 유형 - 보험 정책의 유형.
- Deductible: 공제액 - 보험 청구 시 가입자가 부담해야 하는 금액.
- BasePolicy: 기본 정책 - 기본 보험 정책 유형.
- AgentType: 에이전트 유형 - 보험 에이전트의 유형.
- NumberOfCars: 차량 수 - 보험 정책에 포함된 차량 수.
7. 보험 사기 여부
- FraudFound_P: 사기 발견 여부 - 보험 청구가 사기인지를 나타냄 (0: 정상, 1: 사기).
2. 데이터 확인
데이터 구조 및 결측치를 확인합니다.
df.shape
df.nunique()
df.info()
df.describe()
df.isnull().sum()
3. 데이터 시각화
데이터를 더 직관적으로 이해하기 위해 Plotly를 사용하여 다양한 시각화를 생성하였습니다.
범주형 변수에 대한 카운트 플롯과 숫자형 변수에 대한 히스토그램을 그려 데이터의 분포를 시각적으로 확인할 수 있도록 했습니다.
help(px.histogram) # 함수의 사용법과 매개변수에 대한 설명
dir(px) #모듈 내의 모든 속성과 메서드 리스트
예시 ) MaritalStatus(결혼 여부) 컬럼의 값들을 시각화한 px.histogram 코드
# 많은 수 부터
df['MaritalStatus'].value_counts(ascending=False).index
# countplot 은 categorical
px.histogram(df, x='MaritalStatus', title = 'Count of MaritalStatus',
category_orders={'MaritalStatus':df['MaritalStatus'].value_counts().index})
ValueError: Mime type rendering requires nbformat>=4.2.0 but it is not installed
위와 같은 에러가 나올때는 nbformat 모듈을 설치하고 재실행 합니다.
!pip install nbformat
def count_plot(df, column):
fig = px.histogram(df, x=column, title=f"Count plot of {column}",
category_orders={column:df[column].value_counts().index})
fig.show()
return fig
def histogram_plot(df, column):
fig = px.histogram(df, x=column, title=f"Count plot of {column}")
fig.show()
return fig
4. 시각화 자동화 함수
반복적인 시각화 작업을 간소화하기 위해 자동화 함수를 작성했습니다. 데이터프레임의 각 열을 반복하며, 해당 열이 숫자형이면 히스토그램을 그리고 범주형이면 카운트 플롯을 생성하도록 만들었습니다.
def plot_df(df):
fig_list = list()
for column in df.columns:
if pd.api.types.is_numeric_dtype(df[column]):
fig = histogram_plot(df, column)
elif pd.api.types.is_object_dtype(df[column]):
fig = count_plot(df, column)
fig_list.append(fig)
return fig_list
5. 코드 정리 및 모듈화
작성한 시각화 함수는 모듈화하여 utils.py 파일에 정리하였습니다. 이를 통해 재사용성을 높이고, 코드의 가독성을 유지할 수 있습니다. Docstring을 통해 함수의 목적과 사용 방법을 명확히 설명함으로써 코드 유지보수에도 용이하게 하였습니다.
plot_df(df)
from utils import plot_count_plot, plot_histogram, plot_dataframe
plot_count_plot(df, 'Make')
plot_dataframe(df)
이렇게 모듈화를 통해 작업을 체계적으로 정리하면, 향후 분석 과정에서 필요한 코드를 쉽게 불러와 사용할 수 있습니다.
6. 마무리
이번 분석을 통해 Vehicle Insurance Claim Fraud Detection 데이터셋을 사용하여 보험 사기 탐지의 기초적인 분석 및 시각화 과정에 대해 설명하였습니다.