본문 바로가기
빅데이터분석

[powerBI] 메타코드 강의후기_(4) 가설설정 및 통계적 검정

by 모닥불🔥 2024. 10. 6.

https://www.metacodes.co.kr/edu/read2.nx?EP_IDX=14157&EM_IDX=13981&M2_IDX=31635

 

메타코드에 새로 올라온 powerBI 강의! (이미지를 클릭하면 수강신청 링크로 이동한다.)

무료 수강 기간이 끝나서 아쉽지만 50% 세일 중이다.


5. 통계적 가설 검정-1

가설 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

from scipy.stats import chi2_contingency, ttest_ind, mannwhitneyu, ks_2samp, f_oneway
from sklearn.preprocessing import StandardScaler

from utils2 import *
from stat_utils import *

pd.set_option('future.no_silent_downcasting', True)
pd.set_option('display.max_columns', None)

 

여기에서 utils2와 stat_utils는 그래프를 그리는 함수를 코드로 적은 다음 미리 .py 파일로 저장한 것이다.

df = pd.read_csv('data/fraud_oracle.csv')
df.head()

 

이렇게 봐선 뭐가 중요한 변수이고 각 변수들끼리 어떤 연관성이 있는지 알기 어렵다.

컬럼을 카테고리화 하면 훨씬 내용을 이해하기 쉽다. 어떤 것끼리 묶을 수 있을지 고민해보자.

time_vars = ["Month", "WeekOfMonth", "DayOfWeek", "DayOfWeekClaimed", 'MonthClaimed', 'WeekOfMonthClaimed']
vehicle_vars = ["Make", "VehiclePrice", "VehicleCategory", "AgeOfVehicle"]
personal_vars = ["Sex", 'MaritalStatus', "Age", 'DriverRating', 'AgeOfPolicyHolder', 'NumberOfCars', 'PastNumberOfClaims']
policy_vars = ["PolicyType", 'Deductible', 'AgentType', "NumberOfSuppliments", "BasePolicy"]
accident_vars = ['Days_Policy_Accident', 'Days_Policy_Claim', 'PoliceReportFiled', 'WitnessPresent', 'AddressChange_Claim']

 


Liability인데 보험사기인 경우는 36건 뿐이다. 눈으로 보기에도 확연하게 너무 적은 것을 볼 수 있다.

비교가 무의미하게 표본 수가 적은 Liability를 제외하고 collision, all perils만 분석하겠다는 결론을 내릴 수 있다.

plot_count_plot(df, "BasePolicy", "FraudFound_P")

 

결정이 되었으니, 데이터프레임을 보험 종류별로 나눈다.

collision = df.loc[df['BasePolicy']=="Collision"]
liability = df.loc[df['BasePolicy']=="Liability"]
all_p = df.loc[df['BasePolicy']=="All Perils"]

 

기본적인 데이터 형태를 파악한다.

.shape - 행, 열 개수

.FraudFound_P.value_counts() - 보험사기 여부 각각 몇 건씩인지

보험사기로 나온 케이스가 전체의 몇 %를 차지하는지(비율)

 

각 보험 유형에 따른 결과는 아래 그림을 참고!

 

그런 다음, 컬럼들을 다 넣고 연관이 있는지 살펴본다.

statistical_tests_step1 함수는 주어진 데이터프레임에 따라(여기에서는 all_p), 보험사기 여부와 관련 있는 컬럼인지 아닌지 판단하여, 연관성이 있다고 나오는 컬럼만 출력하는 코드이다. (강사님이 만드신 코드, 강의자료에 있음!)

output, rel_cols_all = statistical_tests_step1(all_p, "FraudFound_P", [i for i in all_p.columns if i!='FraudFound_P'])

output, rel_cols_collision = statistical_tests_step1(collision, "FraudFound_P", [i for i in collision.columns if i!='FraudFound_P'])

 

두 보험 유형에서 공통적으로 유의미하다고 나오는 변수가 무엇인지 살펴보면, MonthClaimed, Fault, VehichlePrice, AddressChange_Claim이 있다. 여기에서 시간 관련 변수인 MonthClaimed(클레임이 들어온 달)는 별로 의미가 없을 것이라 생각해 제외하면, Fault(사고의 책임 여부), VehiclePrice(차량가격), AddressChange_Claim(주소변경) 세 가지 요인이 영향을 미칠 후보로 나온다.

[i for i in rel_cols_all if i in rel_cols_collision]

 

생각을 해보자... 흐으음... 보험사기를 예측하고자 하기 때문에 종속변수는 늘 보험사기가 될 것이다.

즉, ㅇㅇ변수가 보험사기를 높인다/낮춘다/영향을 준다는 식으로 기술되어야 할 것 같다!

 

여기에서 강사님은

가설1: 차량가격이 보험사기에 영향을 미친다.

(이후 나올) 가설 2: 주소지 변경이 보험사기에 영향을 미친다

라는 가설을 세우셨다.

 

이런 과정을 체계적으로 차근차근 따라하다 보면 충분히 초보자도 가설을 세울 수 있을 것 같다.

 

다음 글에서는 이렇게 설정한 가설을 어떻게 검증하는지, 이어서 정리하겠다. :)

그럼 이만, 화르륵 🔥

 

* 메타코드 서포터즈로서 강의를 제공받아 글을 작성하고 있다. 이미지 클릭 시 구매 사이트로 이동