실전 프로젝트 대시보드

Chapter.7 실전 프로젝트 대시보드(3)

devjjun 2026. 6. 1. 20:30

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

 

  • 제거할 변수 요약
    1.  외기온 시작값과 거의 동일한 정보 (상관계수 0.98~1.00) 제거
      • Ambient Temperature [℃]_mean
      • Ambient Temperature [℃]_max
    2. 배터리 온도 Start/End 와 중복 정보 제거
       
      1. Battery Temperature [℃]_mean
      2. Battery Temperature [℃]_max
    3. 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 기준으로 최적의 모델과 파라미터를 찾아갈 예정이다.