ML

[Kaggle] 선형회귀모델학습-의료 보험료 예측하기 |EDA-매트릭스 시각화, 원핫인코딩, 범주형을 수치형으로 변환하기

ha_data 2024. 2. 1. 22:15

 

선형 회귀 모델 실습

Medical Cost Personal Datasets (kaggle.com)

 

Medical Cost Personal Datasets

Insurance Forecast by using Linear Regression

www.kaggle.com

풀어야 하는 문제
주어진 건강 및 인구통계학적 정보를 바탕으로 개인의 연간 의료 보험료를 예측

입력: 독립 변수들
출력: 개인 의료비 예측값

 

1. EDA (Exploratory Data Analysis) 탐색적 데이터 분석

데이터 분석의 초기 단계에서 진행하는과정

데이터를 여러 각도에서 살피며 데이터의 특징, 구조, 패턴, 이상치, 변수 간의 관계 등을 이해

기초 통계 분석 : 평균, 중앙값, 표준편차, 최소/최대 값

시각화: 데이터 패턴, 이상치, 경향성 

변수간 관계 파악: 상관관계 분석

이상치 탐지: 비정상적 데이터 식별

결측치 분석: 데이터 누락 식별

# 기본 정보
print('#'*20, '기본 정보', '#'*20)
insurance_data.info() # info() 안에서 자동으로 print를 진행

# 기초 통계량
summary_statistics = insurance_data.describe(include='all')
print('#'*20, '기초 통계량', '#'*20)
print(summary_statistics)
 

 

#################### 기본 정보 ####################
<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

 

수치화된 데이터 시각화

import matplotlib.pyplot as plt

#가로x세로:14x10 이 안에 4개의 그래프 그리기
plt.figure(figsize=(14, 10))

# 나이 분포
plt.subplot(2, 2, 1) #2x2 에서 1번째
plt.hist(insurance_data['age'], color='skyblue', edgecolor='black')
plt.title('Age Distribution')
plt.xlabel('Age')
plt.ylabel('Frequency')

나이, BMI, 아이들 수 등 변수를 시각화 해서 분포 확인 가능

의료비 같은 경우 앞쪽이 높고 뒤쪽이 낮음 -> log형식으로 바꾸면 치우친 데이터가 평탄해짐 

상관관계 매트릭스 만들기

correlation_matrix = insurance_data.corr()

# 상관관계 메트릭스 시각화
plt.figure(figsize=(5, 4))

plt.matshow(correlation_matrix, fignum=1)
plt.colorbar()
plt.xticks(range(len(correlation_matrix.columns)), correlation_matrix.columns, rotation=90)
plt.yticks(range(len(correlation_matrix.columns)), correlation_matrix.columns)
plt.title('Correlation Matrix of Medical Cost Datasets', y=1.15)
plt.show()

# 상관관계 값 프린트
print('#'*20, '상관관계 값 확인', '#'*20)
print(correlation_matrix)

상관도를 확인 가능. 상관관계 값 =1 상관관계가 있음. 독립적이지 않음

 

카테고리 데이터 분포 시각화

성별의 경우 이상치가 많이 분포되어 있음. 이런경우 이상치를 제거하는 작업이 필요해질 수 있음

 

카테고리형 변수 인코딩

범주형 변수는 선형 모델에 입력으로 사용하기 위해 수치형으로 변경해야 함

원-핫 인코딩 방식을 사용 

ex. 성별이라면 ? 성별_남성, 성별_여성 이라는 별도의 열 만들기 -> 각각 0과 1 값으로 표현 

Pandas의 get_dummies 함수 사용 -> drop_first = True 옵션을 사용하는게 좋음

새롭게 생겨난 변수들은 강한 상관관계를 나타냄 '남 vs 여'. 따라서 첫 카테고리를 제거하여 다중공선성을 제거해야됨

insurance_encoded = pd.get_dummies(insurance_data, drop_first=True)
insurance_encoded

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)