실전 프로젝트 대시보드

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

devjjun 2026. 5. 28. 20:12

TIL(Today I Learned)


1️⃣실전 프로젝트(2)

병합된 Trip 데이터 수정 방안

  1. 컬럼 제거 및 컬럼명 수정
  2. 중복행 제거 및 데이터 타입 확인
  3. Trip_ID 기준 정렬
  4. Time 기준 정렬
  5. 결측치 확인 및 처리
  6. 1초 리샘플링

컬럼명 오탈자 수정 

  • Velocity [km/h]]] -> Velocity [km/h]
df_cleaned['Velocity [km/h]'] = (
    df_cleaned['Velocity [km/h]']
    .fillna(df_cleaned['Velocity [km/h]]]'])
)

df_cleaned = df_cleaned.drop(columns=['Velocity [km/h]]]'])

상관계수 및 도메인 기반 불필요 컬럼 삭제 

  • 상관계수 0.9이상 확인 
corr = df_cleaned.corr(numeric_only=True)

high_corr = (
    corr.where(~np.eye(corr.shape[0], dtype=bool))
        .unstack()
        .dropna()
)

high_corr = high_corr[
    abs(high_corr) > 0.9
].sort_values(key=abs, ascending=False)

print(high_corr)
  • 출력값 

  • 도메인과 결합하여 제거한 결측치 
분류 컬럼명 제거 이유
결합 과정 생성 컬럼 Unnamed: 23 병합 과정에서 생성된 빈 컬럼으로 분석 정보 없음
SoC 중복 계열 displayed SoC [%] SoC [%]와 상관계수 매우 높아 정보 중복
SoC 중복 계열 min. SoC [%] SoC [%]와 거의 동일한 패턴
SoC 중복 계열 max. SoC [%) SoC [%]와 거의 동일한 패턴
배터리 온도 중복 max. Battery Temperature [℃] Battery Temperature [℃]와 상관계수 매우 높음
히터/전력 중복 Heating Power LIN [W] Heating Power CAN [kW]와 유사한 히터 소비 정보
히터/전력 중복 Heater Current [A] 히터 소비량을 이미 전력 컬럼이 대표 가능
히터/전력 중복 Requested Heating Power [W] 실제 소비 전력보다 요청값 성격이라 중복 가능성 큼
히터/전력 중복 Heater Signal ON/OFF 수준의 제한적인 정보
외기온 중복 Ambient Temperature Sensor [℃] Ambient Temperature [℃]와 매우 높은 상관관계
냉각수/열교환기 중복 Coolant Temperature Heatercore [℃] 냉각계열 센서들과 거의 동일한 흐름
냉각수/열교환기 중복 Coolant Temperature Inlet [℃] Heat Exchanger Temperature [℃]와 높은 상관
냉각수/열교환기 중복 Temperature Coolant Heater Inlet [℃] 냉각계열 중복 센서
냉각수/열교환기 중복 Temperature Coolant Heater Outlet [℃] 냉각계열 중복 센서
냉각수/열교환기 중복 Temperature Heat Exchanger Outlet [℃] Heat Exchanger Temperature [℃]와 유사
HVAC 세부 송풍구 센서 Temperature Defrost lateral left [℃] 실내 공조 세부 위치 센서로 직접적 영향 낮음
HVAC 세부 송풍구 센서 Temperature Defrost lateral right [℃] 공조 위치 차이만 반영
HVAC 세부 송풍구 센서 Temperature Defrost central [℃] 공조 결과값 성격
HVAC 세부 송풍구 센서 Temperature Defrost central left [℃] HVAC 세부 분배 센서
HVAC 세부 송풍구 센서 Temperature Defrost central right [℃] 다른 Defrost 계열과 높은 중복
HVAC 세부 송풍구 센서 Temperature Footweel Driver [℃] 운전석 발쪽 세부 공조 센서
HVAC 세부 송풍구 센서 Temperature Footweel Co-Driver [℃] 조수석 발쪽 세부 공조 센서
HVAC 세부 송풍구 센서 Temperature Feetvent Co-Driver [℃] 세부 송풍 위치 센서
HVAC 세부 송풍구 센서 Temperature Feetvent Driver [℃] 세부 송풍 위치 센서
HVAC 세부 송풍구 센서 Temperature Head Co-Driver [℃] 얼굴 방향 세부 공조 센서
HVAC 세부 송풍구 센서 Temperature Head Driver [℃] 얼굴 방향 세부 공조 센서
HVAC 세부 송풍구 센서 Temperature Vent right [℃] Vent 계열 중복 센서
HVAC 세부 송풍구 센서 Temperature Vent central right [℃] Vent 계열 중복 센서
HVAC 세부 송풍구 센서 Temperature Vent central left [℃] Vent 계열 중복 센서
히터 전압 중복 Heater Voltage [V] Heating Power CAN [kW]와 중복되는 히터 동작 정보
결측치 과다 Coolant Volume Flow +500 [l/h] 절반 이상 결측치 존재, TripB 전용 가능성 높아 공통 모델 안정성 저하

Trip_ID 및 Time [s] 기준으로 정렬 

df_refined = df_refined.sort_values(['Trip_ID','Time [s]']).reset_index(drop=True)
  • 결과값( 19 columns, 0 to 1094792)


결측치 처리(보간)

  • 컬럼 정리 후 결측치 

  1. SoC 계열(전체 대비 2~3%) -> 배터리 상태 핵심 변수라 유지 -> 앞뒤보간(Trip 별로 보간)
  2. Requested Coolant Temperature(전체 대비 2%) ->  삭제 or (유지 + 보간) -> Trip 단위로 누락되어 삭제
#결측치 보간
interp_cols = {
    'SoC [%]',
    'Requested Coolant Temperature [℃]'
}

for col in interp_cols:
  df_refined[col] = (
      df_refined.groupby('Trip_ID')[col].
      transform(lambda x: x.interpolate().bfill().ffill())
  )

df_refined[['SoC [%]', 'Requested Coolant Temperature [℃]']].isnull().sum()

# Requested Coolant Temperature [℃] Trip 단위 통째로 비어있어서 보간 불가 -> 삭제
df_refined = df_refined.drop(columns=['Requested Coolant Temperature [℃]'])

1초 단위로 resampling

# astype(int)를 통해서 0~0.9는 0초 1~1.9초는 1초 이런식으로 묶음
df_refined['Time_bin'] = df_refined['Time [s]'].astype(int)

# 기존 0.1초 Time 컬럼 제거
df_refined = df_refined.drop(columns=['Time [s]'])

# Trip_ID별로 나누고 1초 구간별 평균값 만들기
df_resampled = (df_refined.groupby(['Trip_ID','Time_bin']).mean(numeric_only=True).reset_index())

# 컬럼명을 다시 Time [s]로 변경해줌
df_resampled = df_resampled.rename(columns = {'Time_bin' : 'Time [s]'})
  • 결과값 ( total 18 columns, 0 to 109504 )

 

추후 진행 계획

  • 주요 변수 그래프 확인 후 도메인과 결합하여 이상치 처리 
  • 파생변수 생성 
  • 요약통계 및 변화량 기반 feature 생성 
  • Overview merge
  • 모델링 계획 수립 

💡 느낀점

오늘은 TripA와 TripB 데이터를 통합한 뒤 컬럼 정리, 결측치 처리, 상관관계 분석을 통해 실제 시계열 데이터 전처리 과정을 깊게 경험할 수 있었다. 특히 단순히 데이터의 관점이 아니라 도메인 지식과 함께, 차량 데이터의 물리적 특성과 시간 흐름을 함께 고려해야 한다는 점이 인상적이었다. 또한 공통 컬럼만 남겨 통합 모델 구조를 설계하면서 데이터의 일반화와 모델 안정성을 생각해볼 수 있었다. 리샘플링 이후에는 변화량과 요약통계 기반 Feature Engineering을 진행할 예정이고 Overview와 병합한 후 모델링 게획을 수립할 예정이다