TIL(Today I Learned)
1️⃣실전 프로젝트(3)
Overview & Trip 데이터 병합
Overview의 Trip 컬럼과 Trip데이터의 Trip_ID 컬럼을 기준으로 병합하였다.
- 병합 전 Overview 전처리를 진행
# 불분명 컬럼 요약
df_overview["Unnamed: 8"].describe()
# 불분명 컬럼 확인 -> 변화량
df_overview[[
"Battery State of Charge (Start)",
"Battery State of Charge (End)",
"Unnamed: 8"
]].head(10)
# 컬럼명 변경 "Unnamed: 8" -> "SOC_Consumed"
df_overview.rename(
columns={"Unnamed: 8":"SOC_Consumed"},
inplace = True
)
# 컬럼명 변경 "Trip" -> "Trip_ID" 병합용
df_overview.rename(
columns={"Trip":"Trip_ID"},
inplace=True
)
- 불필요 컬럼이 생성되어 도메인 기반 분석 후 제거
# 불필요 컬럼 제거
overview_drop_cols = {
'Unnamed: 13', # 결합 과정에서 생성된 빈 데이터
'Note', # 통일화된 데이터 X
'Date' # 단위 통일화 X Trip 데이터가 적기 때문에 삭제
}
df_overview.drop(
columns=overview_drop_cols,
inplace=True
)
# Overview 맨 아래 빈 행 제거
df_overview.dropna(
how="all",
inplace=True
)
병합 결과 ( 70 entries, 0 to 69, total 55 columns )
상관계수 기반 전처리
- 상관계수 0.95 이상 변수
| No | Variable_1 | Variable_2 | Correlation |
| 1 | Heating Power LIN [W] | Heater Current [A] | 0.9993 |
| 2 | Coolant Temperature Heatercore [℃] | Coolant Temperature Inlet [℃] | 0.9973 |
| 3 | Battery Temperature [℃] | max. Battery Temperature [℃] | 0.9970 |
| 4 | Requested Heating Power [W] | Heating Power LIN [W] | 0.9968 |
| 5 | SoC [%] | displayed SoC [%] | 0.9960 |
| 6 | Temperature Coolant Heater Inlet [℃] | Temperature Heat Exchanger Outlet [℃] | 0.9960 |
| 7 | Requested Heating Power [W] | Heater Current [A] | 0.9959 |
| 8 | Temperature Defrost lateral left [℃] | Temperature Defrost lateral right [℃] | 0.9954 |
| 9 | Temperature Feetvent Co-Driver [℃] | Temperature Feetvent Driver [℃] | 0.9941 |
| 10 | Temperature Coolant Heater Outlet [℃] | Temperature Heat Exchanger Outlet [℃] | 0.9886 |
| 11 | Coolant Temperature Inlet [℃] | Temperature Coolant Heater Inlet [℃] | 0.9818 |
| 12 | Coolant Temperature Heatercore [℃] | Temperature Coolant Heater Inlet [℃] | 0.9817 |
| 13 | Coolant Temperature Heatercore [℃] | Temperature Heat Exchanger Outlet [℃] | 0.9808 |
| 14 | Temperature Vent central right [℃] | Temperature Vent right [℃] | 0.9794 |
| 15 | Temperature Vent right [℃] | Temperature Vent central left [℃] | 0.9772 |
| 16 | Heating Power CAN [kW] | Heating Power LIN [W] | 0.9768 |
| 17 | Coolant Temperature Inlet [℃] | Temperature Heat Exchanger Outlet [℃] | 0.9758 |
| 18 | Heating Power CAN [kW] | Heater Current [A] | 0.9756 |
| 19 | Temperature Coolant Heater Inlet [℃] | Temperature Coolant Heater Outlet [℃] | 0.9754 |
| 20 | Temperature Vent right [℃] | Temperature Vent right [℃] | 0.9731 |
| 21 | Coolant Temperature Heatercore [℃] | Temperature Coolant Heater Outlet [℃] | 0.9705 |
| 22 | Temperature Defrost lateral left [℃] | Temperature Defrost central left [℃] | 0.9657 |
| 23 | Temperature Defrost lateral right [℃] | Temperature Defrost central left [℃] | 0.9617 |
| 24 | Motor Torque [Nm] | Longitudinal Acceleration [m/s²] | 0.9599 |
| 25 | Temperature Vent central left [℃] | Temperature Vent right [℃] | 0.9558 |
| 26 | Temperature Vent right [℃] | Temperature Vent central right [℃] | 0.9555 |
| 27 | Temperature Head Co-Driver [℃] | Temperature Head Driver [℃] | 0.9552 |
| 28 | Coolant Temperature Inlet [℃] | Temperature Coolant Heater Outlet [℃] | 0.9547 |
- 제거할 변수 요약
-
외기온 시작값과 거의 동일한 정보 (상관계수 0.98~1.00) 제거
-
Ambient Temperature [℃]_mean
-
Ambient Temperature [℃]_max
-
- 배터리 온도 Start/End 와 중복 정보 제거
-
Battery Temperature [℃]_mean
-
Battery Temperature [℃]_max
-
- Fan 컬럼: 99% 동일한 데이터 제거
-
범주형 데이터 인코딩
- 날씨 컬럼 재분류 8개 -> 4개 (축소)
# 날씨 컬럼 재분류
weather_map = {
"sunny": "clear",
"sunrise": "clear",
"sunset": "clear",
"slightly cloudy": "cloudy",
"cloudy": "cloudy",
"rainy": "rainy",
"dark, little rainy": "rainy",
"dark": "dark"
}
df_merged["Weather"] = (
df_merged["Weather"]
.map(weather_map)
)
- 인코딩 컬럼: Route/Area, Weather
# 인코딩 컬럼
cat_cols = [
"Route/Area",
"Weather",
]
df_encoded = pd.get_dummies(
df_merged,
columns = cat_cols,
drop_first=True,
dtype=int
)
# 인코딩 후 식별자 제거
df_encoded.drop(
columns=["Trip_ID"],
인코딩 결과( 70 entries, 0 to 69, total 58 columns )
- 머신러닝 시 오류를 줄이기 위해 컬럼명 통일
df_encoded.columns = (
df_encoded.columns
.str.replace(r"\[.*?\]", "", regex=True)
.str.replace("(", "", regex=False)
.str.replace(")", "", regex=False)
.str.replace("/", "_", regex=False)
.str.replace(" ", "_", regex=False)
.str.replace("__", "_", regex=False)
.str.replace("_+_", "_", regex=False)
.str.strip("_")
)
머신러닝 BaseLine 설계
- 타겟변수: Distance
- 모델: RF, LGBM, CatBoost
- 주요 평가지표: RMSE, MAE

- 변수 중요도 판별 후 하위 10개 제거(변동성 큼)

- 물리식을 활용한 파생변수 생성 distance = time * speed(소폭 향상)

진행 계획
1. Feature Importance 확인
2. SHAP 분석
3. VIF 계산
4. 하이퍼파라미터 튜닝
5. 교차 검증
6. 오차 분석
7. 추가 파생변수(선택)
8. 최종 모델 선정
9. 보고서 작성
💡 느낀점
상관관계 분석과 변수 정리를 통해 데이터의 중복 정보를 줄이고, 모델 성능 향상에 필요한 전처리의 중요성을 체감할 수 있었다. 또한 다양한 모델을 비교하며 단순히 성능뿐만 아니라 변수의 의미와 해석 가능성까지 고려하는 과정이 중요하다는 것을 배웠다. 데이터에 따라 봐야하는 주요 지표가 다르기 때문에 프로젝트 데이터에 적용하여 정확도 보다는 rmse 기준으로 최적의 모델과 파라미터를 찾아갈 예정이다.
'실전 프로젝트 대시보드' 카테고리의 다른 글
| Chapter.7 실전 프로젝트 대시보드(6) (0) | 2026.06.05 |
|---|---|
| Chapter.7 실전 프로젝트 대시보드(5) (0) | 2026.06.04 |
| Chapter.7 실전 프로젝트 대시보드(4) (0) | 2026.06.02 |
| Chapter.7 실전 프로젝트 대시보드(2) (1) | 2026.05.28 |
| Chapter.7 실전 프로젝트 대시보드(1) (0) | 2026.05.27 |