2025. 11. 20. 20:28ㆍTIL
우선 어제는 새로운 프로젝트가 시작된 첫날이라 경황이 없어 TIL을 작성하지 못했는데, 반성하고 있다.
아무리 바빠도 꾸준하게 내 기록을 관리해야 하는데, 그러지 못해 아쉽다. 앞으로는 TIL 역시 하루 루틴의 일부로 생각해야겠다.
기초 프로젝트에서는 제공된 데이터셋 중 하나를 선택해 팀별로 전처리, 시각화를 수행해 인사이트를 도출하는 것이 최종 목표이다.
지금까지 배운 SQL, 파이썬 지식을 종합적으로 다뤄볼 수 있는 첫 번째 프로젝트 시간이다.
물론 아직 파이썬의 경우 너무 알아야 할 것도 많고 문법이 익숙하지 않아 시간을 충분히 두고, 여유있게 진행해야 할 것 같다.
1. 데이터 선정
선정 데이터 : 친환경 차량 성능 데이터 분석
선정 이유 : 데이터셋이 CSV파일 하나로 간단하고, 그만큼 전처리에 드는 시간이 줄어 다양한 분석을 시도해볼 수 있을 것 같아서.
데이터 내용 : 2000년 ~ 2022년까지 미국에서 생산된 모든 차의 제조사, 모델명, 차종, 엔진 크기, 변속기 종류, 연료 종류, 연비, 이산화탄소 배출량 등의 데이터가 들어 있다.
2. 데이터 전처리의 사고 과정
1) 데이터셋의 컬럼 파악하기
데이터셋의 전체 컬럼은 다음과 같다.
| YEAR | 차량 제조 연도 |
| MAKE | 제조사 |
| MODEL | 차량 모델명 |
| VEHICLE CLASS | 차량 분류 |
| ENGINE SIZE | 엔진 배기량 |
| CYLINDERS | 실린더 개수 |
| TRANSMISSION | 변속기 |
| FUEL | 연료 종류 |
| CITY (L/100 km) | 도심 연비 (도심 주행 시 연비) |
| HWY (L/100 km) | 고속도로 연비 (고속도로 주행 시 연비) |
| COMB (L/100 km) | 복합 연비 (도시 연비 55% + 고속도로 연비 45%) |
| COMB (mpg) | 복합 연비 |
| EMISSIONS | 이산화탄소 배출량 (단위 : g/km) |
여기서 주요하게 봐야 할 변수는 연도, 차량 분류, 엔진 배기량, 실린더 개수, 연료 종류, 복합 연비, 이산화탄소 배출량이 될 것 같다.
2) 차량 분류 카테고리 축소
'COMPACT', 'MID-SIZE', 'SUBCOMPACT', 'STATION WAGON - MID-SIZE', 'MINICOMPACT', 'TWO-SEATER', 'STATION WAGON - SMALL', 'FULL-SIZE', 'SUV', 'VAN - CARGO', 'VAN - PASSENGER', 'PICKUP TRUCK - STANDARD', 'PICKUP TRUCK - SMALL', 'MINIVAN', 'SUV - STANDARD', 'SPECIAL PURPOSE VEHICLE', 'SUV - SMALL', 'Compact', 'SUV: Small', 'Two-seater', 'Mid-size', 'Minicompact', 'Subcompact', 'Station wagon: Small', 'Full-size', 'SUV: Standard', 'Special purpose vehicle', 'Pickup truck: Small', 'Pickup truck: Standard', 'Minivan', 'Van: Passenger', 'Station wagon: Mid-size'
차량 분류를 보니 그 종류가 너무나도 많다. 자세히 보면 같은 내용인데 표기가 다른 경우도 있고, 한 가지 차종을 여러 단위로 분류한 것을 확인할 수 있다.
이처럼 카테고리 분류가 지나치게 세분화되어 있는 경우, 그룹화를 이용한 계산을 수행할 때 결측치가 많이 발생할 수 있고, 그룹별 계산이 원활히 진행되지 않아 올바른 시각화나 인사이트 도출에 어려움이 있을 것이라 판단되어 카테고리의 범위를 줄이기로 했다. 그러나 차량 분류 범위를 줄이려면 명확한 기준이 있어야 하는데, 환경 관련 + 미국 데이터라는 점을 이용해 미국 환경청의 연방규정집과 Automotive Trend Report를 참조해 실제로 어떻게 차량 분류가 이루어지는지 확인하였다.
미국 연방규정집 제 40편 제 600부 D절 제600.351-08조 : 동급 차량의 분류
i) Car line
| 구분 | 부피 | 데이터 내 표기 |
| Two seaters | - | 'TWO-SEATER', 'Two-seater’ |
| Minicompact cars | < 85 입방피트 | 'MINICOMPACT', 'Minicompact’ |
| Subcompact cars | 85 ~ 100 입방피트 | 'SUBCOMPACT', 'Subcompact’ |
| Compact cars | 100 ~ 110 입방피트 | 'COMPACT', 'Compact’ |
| Midsize cars | 110 ~ 120 입방피트 | 'MID-SIZE', 'Mid-size’ |
| Large cars | 120 입방피트 이상 | 'FULL-SIZE', 'Full-size’ |
| Small station wagons | 130 입방피트 이하 | 'STATION WAGON - SMALL', 'Station wagon: Small’ |
| Midsize station wagons | 130 ~ 160 입방피트 | 'STATION WAGON - MID-SIZE', 'Station wagon: Mid-size’ |
| Large station wagons | 160 입방피트 이상 | - |
ii) Light trucks
GVWR(gross vehicle weight rating) : 최대총중량 (차 중량 + 최대 탑승 가능 중량)
| 구분 | GVWR | 데이터 내 표기 |
| Small pickup trucks | ~ 6000 파운드 | 'PICKUP TRUCK - SMALL', 'Pickup truck: Small’ |
| Standard pickup trucks | 6000 ~ 8500 파운드 | 'PICKUP TRUCK - STANDARD', 'Pickup truck: Standard’ |
| Vans | ~ 8500 파운드 | 'VAN - CARGO’, 'VAN - PASSENGER', 'Van: Passenger’ |
| Minivans | ~ 8500 파운드 | 'MINIVAN', 'Minivan’ |
| Small SUV | ~ 6000 파운드 | 'SUV - SMALL', 'SUV: Small’ |
| Standard SUV | 6000 ~ 10000 파운드 | 'SUV’, 'SUV - STANDARD', 'SUV: Standard’ |
iii) Special Purpose Vehicles
GVWR ~8500 파운드이면서 특수한 목적이 있는 모든 차량
데이터 내 표기 (VEHICLE CLASS) : ‘SPECIAL PURPOSE VEHICLE’
크게 보면 3가지 (Car/Light Trucks/SPV), 작게 보면 6가지(Car/Wagon/Pickup Truck/Van/SUV/SPV)로 분류할 수 있다.
EPA (미국 환경청)에서 발표한 2024 Automotive Trend Report는 총 5가지 분류 (Sedan, Wagon / Car SUV / Truck SUV / Minivan, Van / Pickup)로 차를 구분했다.
SPV의 경우는 특수목적차량이기 때문에 따로 분류를 하는 것이 옳다고 판단하여, Car / Wagon / Pickup Truck / Van / SUV / SPV의 총 6가지 분류로 카테고리의 범주를 줄이는 전처리를 진행하였다.
3) 연비 단위 설정
오리지널 데이터셋은 연비의 단위가 L/100km이다. 이 처음 보는 단위는 어디서 나온 건가 고민하다가, 이 역시 전처리의 대상으로 설정했다. 데이터가 가지는 의미가 다르지 않다면 우리가 보기 편한 단위로 바꾸는 것이 옳다고 생각했다. 그래서 L/100km 단위를 익숙한 km/L 단위로 바꾸는 전처리를 수행하였다.
4) 연료 종류 이름 설정
오리지널 데이터셋의 연료 구분의 경우 직관적이지 않은 약자 (특히 가솔린이 X고 고급가솔린이 Z)로 되어 있어 코드 작성 시 편리함을 위해 연료 종류 이름을 익숙하게 바꾸었다.
3. 전체 코드 및 데이터셋 변화
import numpy as np
import pandas as pd
df = pd.read_csv("차량_연비_데이터(20022022).csv")
# 결측치 확인
df.isnull().sum()
# 연비 단위 수정
df['CITY(km/L)'] = 100 / df['CITY (L/100 km)']
df['HWY(km/L)'] = 100 / df['HWY (L/100 km)']
df['COMB(km/L)'] = 100 / df['COMB (L/100 km)']
# 차량 카테고리 축소
df['VEHICLE_CLASS_GROUP'] = df["VEHICLE CLASS"].replace({
'TWO-SEATER' : 'Car', 'Two-seater' : 'Car',
'MINICOMPACT': 'Car', 'Minicompact' : 'Car',
'SUBCOMPACT': 'Car', 'Subcompact' : 'Car',
'COMPACT' : 'Car', 'Compact' : 'Car',
'MID-SIZE': 'Car', 'Mid-size' : 'Car',
'FULL-SIZE' : 'Car', 'Full-size' : 'Car',
'STATION WAGON - MID-SIZE' : 'Wagon', 'Station wagon: Mid-size' : 'Wagon',
'STATION WAGON - SMALL' : 'Wagon', 'Station wagon: Small' : 'Wagon',
'PICKUP TRUCK - SMALL' : 'Pickup Truck', 'Pickup truck: Small' : 'Pickup Truck',
'PICKUP TRUCK - STANDARD' : 'Pickup Truck', 'Pickup truck: Standard' : 'Pickup Truck',
'VAN - CARGO' : 'Van',
'VAN - PASSENGER' : 'Van', 'Van: Passenger' : 'Van',
'MINIVAN' : 'Van', 'Minivan' : 'Van',
'SUV' : 'SUV', 'SUV - SMALL' : 'SUV', 'SUV: Small' : 'SUV',
'SUV - STANDARD' : 'SUV', 'SUV: Standard' : 'SUV',
'SPECIAL PURPOSE VEHICLE' : 'SPV', 'Special purpose vehicle' : 'SPV'
})
# 연료 종류 이름 변경
df['FUEL_TYPE'] = df['FUEL'].replace({
'X' : 'Gasoline',
'Z' : 'Premium Gasoline',
'D' : 'Diesel',
'E' : 'Ethanol',
'N' : 'Natural Gas'
})
<오리지널 데이터셋>

<전처리 후 데이터셋>

'TIL' 카테고리의 다른 글
| 251124_BootCamp Dat 26_데이터 분석 기초 프로젝트 (3) (1) | 2025.11.24 |
|---|---|
| 251121_BootCamp Day 25_데이터 분석 기초 프로젝트 (2) (1) | 2025.11.21 |
| 251118_BootCamp Day 22_이상치, 결측치 처리 (0) | 2025.11.18 |
| 251117_BootCamp Day 21_파이썬 데이터프레임의 이해 (0) | 2025.11.17 |
| 251114_BootCamp Day 20_QGIS를 이용한 공간 데이터 분석 (0) | 2025.11.14 |