[Kaggle] 선형회귀모델학습-의료 보험료 예측하기 |EDA-매트릭스 시각화, 원핫인코딩, 범주형을 수치형으로 변환하기
선형 회귀 모델 실습
Medical Cost Personal Datasets (kaggle.com)
Medical Cost Personal Datasets
Insurance Forecast by using Linear Regression
www.kaggle.com
풀어야 하는 문제
주어진 건강 및 인구통계학적 정보를 바탕으로 개인의 연간 의료 보험료를 예측
입력: 독립 변수들
출력: 개인 의료비 예측값
1. EDA (Exploratory Data Analysis) 탐색적 데이터 분석
데이터 분석의 초기 단계에서 진행하는과정
데이터를 여러 각도에서 살피며 데이터의 특징, 구조, 패턴, 이상치, 변수 간의 관계 등을 이해
기초 통계 분석 : 평균, 중앙값, 표준편차, 최소/최대 값
시각화: 데이터 패턴, 이상치, 경향성
변수간 관계 파악: 상관관계 분석
이상치 탐지: 비정상적 데이터 식별
결측치 분석: 데이터 누락 식별
#################### 기본 정보 ####################
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1338 entries, 0 to 1337
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 1338 non-null int64 #모두 1338 값 가짐 -> 결측치 없음
1 sex 1338 non-null object
2 bmi 1338 non-null float64
3 children 1338 non-null int64
4 smoker 1338 non-null object
5 region 1338 non-null object
6 charges 1338 non-null float64
dtypes: float64(2), int64(2), object(3)
memory usage: 73.3+ KB
#################### 기초 통계량 ####################
age sex bmi children smoker region \
count 1338.000000 1338 1338.000000 1338.000000 1338 1338
unique NaN 2 NaN NaN 2 4
top NaN male NaN NaN no southeast
freq NaN 676 NaN NaN 1064 364
mean 39.207025 NaN 30.663397 1.094918 NaN NaN
std 14.049960 NaN 6.098187 1.205493 NaN NaN
min 18.000000 NaN 15.960000 0.000000 NaN NaN
25% 27.000000 NaN 26.296250 0.000000 NaN NaN
50% 39.000000 NaN 30.400000 1.000000 NaN NaN
75% 51.000000 NaN 34.693750 2.000000 NaN NaN
max 64.000000 NaN 53.130000 5.000000 NaN NaN
charges
count 1338.000000
unique NaN
top NaN
freq NaN
mean 13270.422265
std 12110.011237
min 1121.873900
25% 4740.287150
50% 9382.033000
75% 16639.912515
max 63770.428010
수치화된 데이터 시각화
나이, BMI, 아이들 수 등 변수를 시각화 해서 분포 확인 가능
의료비 같은 경우 앞쪽이 높고 뒤쪽이 낮음 -> log형식으로 바꾸면 치우친 데이터가 평탄해짐
상관관계 매트릭스 만들기
상관도를 확인 가능. 상관관계 값 =1 상관관계가 있음. 독립적이지 않음
카테고리 데이터 분포 시각화
성별의 경우 이상치가 많이 분포되어 있음. 이런경우 이상치를 제거하는 작업이 필요해질 수 있음
카테고리형 변수 인코딩
범주형 변수는 선형 모델에 입력으로 사용하기 위해 수치형으로 변경해야 함
원-핫 인코딩 방식을 사용
ex. 성별이라면 ? 성별_남성, 성별_여성 이라는 별도의 열 만들기 -> 각각 0과 1 값으로 표현
Pandas의 get_dummies 함수 사용 -> drop_first = True 옵션을 사용하는게 좋음
새롭게 생겨난 변수들은 강한 상관관계를 나타냄 '남 vs 여'. 따라서 첫 카테고리를 제거하여 다중공선성을 제거해야됨
agebmichildrenchargessex_malesmoker_yesregion_northwestregion_southeastregion_southwest012
age bmi children charges sex_male smoker_yes region_northwest region_southeast region_southwest
0 19 27.900 0 16884.92400 0 1 0 0 1
1 18 33.770 1 1725.55230 1 0 0 1 0
2 28 33.000 3 4449.46200 1 0 0 1 0
성별_남성, 흡연_yes 만 남아있게됨 나머지 성별_여자, 흡연_no는 삭제됨 (get_first)