TIL(Today I Learned)
1️⃣실전 프로젝트(5)
주행거리(Distance)를 회귀 예측 파이프 라인

- 병합·정제 — 여러 Trip*.csv를 합치고 인코딩/깨진 문자(℃) 수정, 컬럼명 오탈자(Velocity [km/h]]]) 보정.
- 컬럼 축소 — 상관계수 0.9 이상 쌍 + 도메인 판단(HVAC 송풍구 세부 온도 등은 "원인이 아닌 결과값")으로 중복 컬럼 대량 제거.
- 정렬·결측 처리 — Trip_ID/Time 정렬, SoC 등은 Trip별 선형보간, 통째로 빈 컬럼은 삭제.
- 리샘플링 — 0.1초 → 1초 평균.
- 파생변수 — Accel_abs, Total_HVAC, Battery_Power, Temp_gap.
- 이상치 탐색 — 주요 15개 변수 히스토그램+박스플롯으로 확인(대부분 "정상 주행 범위"로 보고 유지).
- 트립 단위 특징화 — 변수별 mean/std/max 요약통계 + 변화량(diff) 통계 → 트립 1개 = 특징벡터 1행.
- 외부데이터 병합 — Overview.xlsx(날씨·경로·거리·duration·SOC소모 등) 결합.
- 통계검정 — TripA vs TripB(Mann-Whitney U), Weather/Route(Mann-Whitney U).
- 추가: 인코딩·변수선택 — 범주 재분류 + 원핫, LassoCV로 55개 중 5개 선택 후 VIF로 다중공선성 확인.
전처리 과정에서 개선이 필요한 부분
1.분석 단위를 '트립'으로 통일
가장 큰 문제입니다. TripA vs TripB Mann-Whitney를 1초 리샘플된 수만~수십만 행 위에서 돌려서 전부 p=0.0, 이건 차이가 크다는 뜻이 아니라 표본이 너무 커서 나온 착시
- 독립성 위반: 같은 트립 안의 연속된 1초 샘플은 강하게 자기상관돼 있어 서로 독립이 아니다. Mann-Whitney의 전제가 깨져서, 실제 정보량(유효 표본 수)은 행 수보다 훨씬 작다.
- n이 크면 사소한 차이도 유의: 수만 행이면 중앙값이 0.1만 달라도 p=0.
→ 고치는 법: 트립을 하나의 관측치로 봐서, 각 트립의 변수별 평균(또는 중앙값) 한 값씩 → TripA 약 30개 vs TripB 약 37개로 Mann-Whitney. 그리고 p가 아니라 효과크기(rank-biserial, 또는 Cliff's delta) 비교.
2.효율(km/SoC)에 대한 환경 검정
"환경은 거리 자체가 아니라 같은 거리를 가는 데 드는 효율에 영향을 준다", 정작 검정은 Distance에 대해서만 . 주장과 검정 대상이 맞지 않다. 결론을 뒷받침하려면 타겟을 효율(km_per_soc)로 바꿔서
- Weather(clear vs cloudy), Route(Munich East vs North) → 효율 Mann-Whitney + 효과크기
- 외기온은 연속형이니 효율 vs Ambient_Temperature_Start의 Spearman 상관(비모수)
3.다중비교 보정이 없습니다
TripA/B에서 변수 8개를 따로 검정하고, Weather/Route도 여러 번 검정했는데 보정이 없어요. 검정을 많이 하면 우연한 "유의"가 늘어난다. → Holm 또는 Benjamini-Hochberg(FDR) 보정을 적용하고, 보정 후 p 포함
4.결측이 무작위가 아니라는 점 (검정보다 명시)
SoC 결측이 TripB에 구조적으로 쏠려 있다(데이터 출처가 달라서). 즉 결측이 무작위(MCAR)가 아니라서 단순 선형보간의 정당성에 한계. Little's MCAR test까지 갈 필요는 없지만, "결측이 특정 그룹에 집중돼 무작위가 아니며, 그래서 트립별로 나눠 보간했다"는 한 문장을 근거로
5. 리샘플링 후 lag/이동평균 피쳐 생성
① 병합
② Trip_ID·Time 정렬 ← lag/rolling의 대전제 (필수)
③ 결측 보간
④ 1초 리샘플링
───────────────────
⑤ lag / rolling 생성 ← 여기 (정렬·보간 다음)
⑥ 트립별 요약통계로 압축
머신러닝 과정에서 개선이 필요한 부분
1. 데이터 누수(leakage) — 타겟이 Distance인데, 가장 중요한 변수로 뽑힌 Duration(주행시간, 중요도 40%), SOC_Consumed(21%), 그리고 Velocity_mean/max, 각종 _diff·요약통계는 전부 그 주행이 끝나야 알 수 있는 사후(post-hoc) 값
2. SHAP 해석을 과신 — "Duration이 클수록 거리가 늘고, 이는 물리적으로 일치한다"는 서술은 인사이트가 아니라 거의 거리의 정의를 재확인한 것입니다.
3. 모델 비교 시 feature set이 모델마다 다릅니다 (공정성 문제) — 서로 다른 변수셋으로 나온 RMSE를 한 표에 모아 비교하면 "어느 모델이 더 낫다"는 결론을 댈 수 없다. 모든 모델을 동일한 feature set으로 수정
4. 평가 수치의 절대 크기 맥락 — RMSE 4.4~6km인데 Distance 중앙값이 16km, 평균 19km. 즉 평균 거리의 약 25~30% 오차예요. R²만 보면 좋아 보이지만 실용 관점에서 이 오차가 허용 가능한지는 별도로 논해야 하고, 그 R²의 상당 부분이 Duration 한 변수에서 온다는 점을 주의
5. 표본이 작아(n=55 학습) 부스팅 불안정 — No further splits with positive gain 경고, 55개 표본으로는 트리가 거의 안 자란다는 신호. n_estimators=300, iterations=500, depth 등은 표본 대비 과하다. "데이터가 작아 결과는 확정이 아닌 경향"이라는 한계, 그리고 50-fold RMSE 표준편차가 1.8 수준(즉 fold마다 1.6~10.7km까지 출렁)이라는 점
💡 느낀점
이번 프로젝트에서 가장 크게 배운 건 성능 숫자가 높다고 좋은 모델이 아니다라는 점이었다. R²=0.84라는 수치만 보면 잘 된 것 같았지만, Duration이나 SOC_Consumed처럼 주행이 끝나야 알 수 있는 변수가 거리를 거의 정의해버리는 데이터 누수가 숨어 있었다. 점수를 의심하고 이 변수를 예측 시점에 정말 알 수 있는가를 따져보는 과정에서, 모델링보다 문제를 어떻게 정의하느냐가 먼저라는 걸 체감했다. 전처리에서도 비슷했다. 수십만 행짜리 시계열에 통계검정을 돌려 p=0이 나왔을 때 차이가 크다고 착각했지만, 사실은 표본이 커서 생긴 착시였다. 분석 단위(트립이냐 시점이냐)를 정하는 것과 p-value만이 아니라 효과크기·표본 크기를 함께 보는 것의 중요성을 알게 됐다.
'실전 프로젝트 대시보드' 카테고리의 다른 글
| Chapter.7 실전 프로젝트 대시보드(7) (0) | 2026.06.08 |
|---|---|
| Chapter.7 실전 프로젝트 대시보드(6) (0) | 2026.06.05 |
| Chapter.7 실전 프로젝트 대시보드(4) (0) | 2026.06.02 |
| Chapter.7 실전 프로젝트 대시보드(3) (0) | 2026.06.01 |
| Chapter.7 실전 프로젝트 대시보드(2) (1) | 2026.05.28 |