이 실습은 Aurélien Géron의 『Hands-On Machine Learning(3rd Ed.)』 기반으로 진행되며, 2020년도 OECD 국가들의 1인당 GDP와 삶의 만족도 데이터를 활용하여 선형 회귀 모델을 훈련
문제 정의
: 어떤 국가의 1인당 GDP가 주어졌을 때, 해당 국가의 삶의 만족도(Life Satisfaction) 를 예측하는 선형 회귀 모델을 구현
🔄 선형 회귀 모델 구현 단계
선형 회귀 모델을 구현하는 과정은 다음의 5단계로 구성됨.
| 단계 | 설명 |
| ① 문제 정의 | 예측하고자 하는 대상(삶의 만족도)과 입력(1인당 GDP)을 설정 |
| ② 데이터 수집 | 실제 관측된 입력/타깃 데이터를 확보 |
| ③ 데이터 적재 및 전처리 | 수집한 원본 데이터를 모델 훈련에 적합하게 가공 |
| ④ 모델 선택 및 훈련 | 회귀 모델 선택 후 훈련 수행 |
| ⑤ 모델 활용 | 새로운 데이터에 대한 예측 수행 |
1. 문제 정의
OECD 회원국의 1인당 GDP를 입력으로 받아, 삶의 만족도(Life Satisfaction) 를 예측하는 머신러닝 모델을 구축
2. 데이터 수집
이번 실습에서는 아래 두 개의 공개 데이터를 사용
- gdp_per_capita.csv
: IMF 제공, 국가별 1인당 GDP 데이터 - oecd_bli.csv
: OECD 제공, 국가별 삶의 만족도 지표 포함 ('더 나은 삶의 지수')
🔍 최종 목표 테이블 (예시)
| 국가 | 1인당 GDP (USD) | 삶의 만족도 |
| 헝가리 | 12,240 | 4.9 |
| 한국 | 27,195 | 5.8 |
| 프랑스 | 37,675 | 6.5 |
| 호주 | 50,967 | 7.3 |
| 미국 | 55,805 | 7.2 |
이 표는 원본 데이터가 아닌, 원시 CSV 데이터를 적재하고 정제 및 전처리한 결과물
이 과정이 머신러닝 모델의 정확도에 큰 영향을 주므로, 데이터 전처리는 모델 훈련보다 중요
3. 데이터 적재, 정제, 전처리
- 데이터 적재 (Data Loading):
서버 또는 로컬에서 CSV 파일을 불러오는 작업 - 데이터 정제 (Data Cleaning):
오류, 누락값(NaN), 이상치 등을 제거하거나 수정 - 데이터 전처리 (Data Preprocessing):
정제된 데이터를 머신러닝 모델에 맞는 형식으로 변환 (필드명 수정, 병합, 인덱싱 등)
⚙️ 실습 환경 설정
1. Python 버전 체크
import sys
assert sys.version_info >= (3, 7), "Python 3.7 이상이어야 함"
2. 필수 모듈 불러오기
import numpy as np
import pandas as pd
3. 실행 결과 고정 (랜덤 시드)
np.random.seed(42)
4. 그래프 설정
import matplotlib.pyplot as plt
plt.rc('font', size=12)
plt.rc('axes', labelsize=14, titlesize=14)
plt.rc('legend', fontsize=12)
plt.rc('xtick', labelsize=10)
plt.rc('ytick', labelsize=10)
데이터 준비
1. 1인당 GDP 데이터 적재
datapath = "https://github.com/ageron/data/raw/main/lifesat/"
gdp_per_capita = pd.read_csv(
datapath + "gdp_per_capita.csv",
thousands='.', # 천 단위 구분자
encoding='latin1', # 특수 문자 처리
na_values="n/a" # 결측치 처리
)
▶️ 출력 예시
| Entity | Code | Year | GDP per capita |
| Afghanistan | AFG | 1950 | 1040.0 |
| Afghanistan | AFG | 1951 | 1098.0 |
| ... | ... | ... | ... |
2. 2020년 데이터만 필터링
mask_gdp_2020 = gdp_per_capita["Year"] == 2020
gdp_per_capita = gdp_per_capita[mask_gdp_2020]
3. 불필요한 열 삭제
gdp_per_capita.drop(columns=['Code', 'Year'], inplace=True)
4. 국가명 'South Korea' → 'Korea'로 변경
gdp_per_capita.loc[gdp_per_capita['Entity'] == 'South Korea', 'Entity'] = 'Korea'
5. 컬럼 이름 변경 및 인덱스 설정
gdp_per_capita.columns = ['Country', 'GDP per capita (USD)']
gdp_per_capita.set_index('Country', inplace=True)
▶️ 출력 예시
gdp_per_capita.loc['Korea']
# GDP per capita (USD) 27195.0
# Name: Korea, dtype: float64
OECD 삶의 만족도 데이터 적재
1. CSV 적재
oecd_bli = pd.read_csv(datapath + "oecd_bli.csv", thousands=',')
2. 데이터 구조 확인
oecd_bli.shape
# 출력 결과: (2369, 17)
oecd_bli.head(3)
| Country | Indicator | Inequality | Unit | Value |
| Australia | Life satisfaction | Total | ... | 7.3 |
3. 'Life satisfaction' 여부 및 수 확인
oecd_bli.Indicator.unique()
# 출력: 24개 지표
'Life satisfaction' in oecd_bli.Indicator.unique()
# 출력: True
oecd_bli[oecd_bli.Indicator == 'Life satisfaction'].shape
# 출력: (168, 17) → 중복 포함'AI(ML & DL)' 카테고리의 다른 글
| [기계학습] ML 프로젝트 A-Z 까지 ( 1 ) (0) | 2025.04.18 |
|---|---|
| [기계학습] 선형 회귀 실습 (1인당 GDP와 삶의 만족도 예측) ( 2 ) (0) | 2025.04.14 |
| [기계학습] Python Pandas 란?? ( 4 ) (0) | 2025.04.07 |
| [기계학습] Python Pandas 란?? ( 3 ) (0) | 2025.04.04 |
| [기계학습] Python Pandas 란 ?? ( 2 ) (0) | 2025.04.04 |