스파르타클럽 내일배움캠프 QA/QC 5기 05/13 TIL

2026. 5. 13. 20:49내일배움캠프 TIL

오늘은 태블로 강의 3강과 라이브 세션을 듣고 개인적으로 진행하고 있는 공모전을 진행했다.

1. 데이터 필드 생성 및 활용 (챕터 3-1)

데이터 그룹

  • 차원의 멤버를 사용자 기준으로 묶어 새로운 범주를 만드는 기능
  • 원본 데이터는 변경되지 않고, 새로운 차원 필드가 생성됨
  • 실습 예시: 17개 시도를 6개 권역(강원, 경기, 경상, 전라, 충청, 제주)으로 그룹핑
  • 그룹은 계산식으로도 구현 가능 → IF [시도] IN ('경기도','서울특별시','인천광역시') THEN '경기' ...

집합 (Set)

  • 차원의 멤버를 조건에 따라 **포함(True) / 제외(False)**로 나누는 기능
  • 세 가지 유형이 존재:
    • 정적 집합: 멤버를 수동 선택
    • 동적 집합: 조건이나 상위 N 기준으로 자동 분류
    • 결합된 집합: 교집합 / 합집합 / 차집합 연산 가능
  • 드릴다운 분석 활용: 집합 동작(Set Action)과 계산식을 결합하여 클릭 시 하위 카테고리가 펼쳐지는 인터랙션 구현

구간 차원과 히스토그램

  • 연속형 데이터를 일정 간격(Bin Size)으로 나누어 분포를 파악
  • 히스토그램: 구간 차원을 열에, 카운트를 행에 배치하여 데이터 분포 시각화
  • 막대차트(범주형 비교)와 히스토그램(연속형 분포)의 차이를 구분하는 것이 중요

측정값 이름 & 측정값

  • 측정값 이름(Measure Names): 모든 측정값 필드의 이름을 모아둔 가상 차원
  • 측정값(Measure Values): 선택된 측정값의 실제 값을 담는 가상 측정값
  • 여러 KPI(매출, 수익, 주문 수, 고객 수)를 한 뷰에 나란히 표시할 때 활용

2. 계산된 필드와 계산 수준 (챕터 3-2)

계산된 필드 기본

  • 기존 데이터를 바탕으로 사용자 정의 수식을 통해 새로운 필드를 생성
  • 만드는 방법: 행/열에 직접 입력(임시 계산) 또는 계산된 필드 편집기 사용
  • 네이밍 컨벤션: 계산식은 C_, 매개변수는 P_, 필터는 FLTR_ 접두사 활용

행 수준 계산 vs 집계 수준 계산 ⭐

이 부분이 가장 핵심적인 개념이었다.

구분 행 수준 계산 집계 수준 계산

계산 시점 집계 집계
기준 데이터 개별 행(Row) 집계된 결과
예시 [수익]/[매출] SUM([수익])/SUM([매출])
용도 행별 파생 변수 생성 비율, 평균 비교, KPI

핵심: 동일한 수익률 계산이라도 행 수준([수익]/[매출])과 집계 수준(SUM([수익])/SUM([매출]))의 결과가 다를 수 있다. 행 수준은 각 행의 수익률을 먼저 구한 뒤 집계하고, 집계 수준은 전체 수익과 매출의 합을 구한 뒤 나누기 때문이다.

3. 매개변수와 계산식 (챕터 3-3)

매개변수(Parameter)란?

  • 사용자가 지정한 단일 값을 저장하는 변수
  • 대시보드에서 사용자가 선택/입력하면 계산식, 필터, 참조선 등에 반영되어 뷰가 동적으로 변함
  • 필터와 달리 독립적이며, 별도로 계산식이나 필터와 연결해야 작동

매개변수 활용 실습

차원 선택 매개변수 (P_차원 선택):

IF [P_차원 선택]="고객 세그먼트" THEN [고객 세그먼트]
ELSEIF [P_차원 선택]="배송 방법" THEN [배송 방법]
ELSEIF [P_차원 선택]="제품 대분류" THEN [제품 대분류]
ELSEIF [P_차원 선택]="시도" THEN [시도]
END

측정값 선택 매개변수 (P_측정값 선택) — CASE문 활용:

CASE [P_측정값 선택]
  WHEN '매출' THEN SUM([매출])
  WHEN '수량' THEN AVG([수량])
  WHEN '수익' THEN MAX([수익])
  WHEN '할인율' THEN MIN([할인율])
END

증감비(전년비) 계산 ⭐

증감비 공식: (비교대상 - 기준) / 기준 × 100

주요 유형:

  • YoY (전년비): 올해 vs 작년 같은 기간 → 계절성, 연간 성장 추세 파악
  • MoM (전월비): 이번 달 vs 지난 달 → 단기 추세 감지
  • WoW (전주비): 이번 주 vs 지난 주 → 캠페인 효과 분석
  • DoD (전일비): 오늘 vs 어제 → 전일 대비 변동성 파악

KPI 전년비 계산식:

// C_금년 매출
IF YEAR([주문 일자])=[P_년도] THEN [매출] END

// C_전년 매출
IF YEAR([주문 일자])=[P_년도]-1 THEN [매출] END

// C_매출 전년비
(SUM([C_금년 매출]) - SUM([C_전년 매출])) / SUM([C_전년 매출])

색상 분리 팁: 양수/음수를 별도 계산식으로 분리하여 KPI 카드에서 증가(초록)/감소(빨강) 색상을 적용

4. 계산식 주요 함수 정리 (챕터 3-4)

문자열 함수

함수 용도 예시

+ (결합) 문자열 합치기 [시도]+" "+[시군구]
LEN() 문자열 길이 LEN([고객명])
LEFT() / RIGHT() 앞/뒤에서 추출 LEFT([고객번호],2)
MID() 중간 부분 추출 MID([고객번호], 2, 3)
CONTAINS() 특정 문자열 포함 여부 CONTAINS([제품명], "Samsung")
SPLIT() 구분자로 분리 SPLIT([제품 코드], "-", 1)
UPPER() / LOWER() 대소문자 변환 UPPER([제품명])

숫자 함수

  • ABS() — 절대값
  • CEILING() — 올림
  • FLOOR() — 버림
  • ROUND() — 반올림

날짜 함수

  • DATEADD('year', 1, [주문 일자]) — 날짜에 기간 더하기
  • DATEDIFF('day', [주문 일자], [배송 일자]) — 두 날짜 간 차이 계산

순위 함수

  • RANK() — 동점 시 같은 순위, 다음 순위 건너뜀 (1, 2, 2, 4)
  • RANK_DENSE() — 동점 시 같은 순위, 연속 순위 유지 (1, 2, 2, 3)
  • RANK_MODIFIED() — 동점 시 마지막 인스턴스 순위 공유
  • INDEX() — 파티션 내 현재 행의 순번 반환

LOD 표현식 (Level of Detail) ⭐

차트의 집계 수준과 무관하게 특정 수준에서 계산할 수 있는 핵심 기능

FIXED 구문:

// 시도별 매출 (뷰의 세부 수준과 무관하게 시도 기준으로 집계)
{FIXED [시도] : SUM([매출])}

// 고객별 첫 구매 일자
{FIXED [고객명] : MIN([주문 일자])}

뷰에 시군구 레벨로 데이터가 표시되더라도, FIXED로 시도 레벨의 매출 합계를 함께 볼 수 있다는 점이 강력하다.

 

 

📌 대회 개요

  • 주제: LiDAR 센서로 관측된 모기의 3D 좌표 시계열 → 80ms 후 위치 예측
  • 입력: 40ms 간격 11개 시점 (−400ms ~ 0ms)의 (x, y, z) 좌표
  • 출력: +80ms 시점의 (x, y, z) 좌표
  • 평가: R-Hit@1cm — 예측과 실제 간 3D 거리가 10mm 이내면 적중(1), 아니면 실패(0). 전체 평균 적중률이 점수
  • 데이터: train 10,000개 / test 10,000개 (각각 개별 CSV 파일)

📊 EDA 핵심 발견

모기 운동 특성

  • 평균 속도 약 0.62 m/s, 대부분 0.1~1.0 m/s
  • 궤적 직선성 평균 0.895 → 90%의 모기는 거의 직선 비행
  • 방향 변화 평균 12.1°, 대부분 0~10° → 급격한 방향 전환은 드묾
  • 축 간 상관 거의 0 → x, y, z 독립 예측 가능

노이즈

  • 관측 노이즈 약 2.8mm (3차 다항식 잔차 기준)
  • x축(3.2mm) > y축(3.0mm) > z축(2.1mm)
  • 속도/가속도 계산 시 노이즈가 증폭되는 문제 확인

타겟 변위

  • t=0 → +80ms 이동 거리 중앙값 46.2mm
  • 108mm 근처 상한선 존재 (시뮬레이션 제한 추정)
  • dx vs dy 산점도 원형 → 이동 방향 편향 없음

베이스라인 비교 (수학적 외삽)

방법 Mean Error Hit@10mm

Static (움직임 없음) 51.0mm 0.49%
Linear 외삽 12.9mm 57.88%
Linear + 가속도 16.3mm 51.31%
2차 다항식 33.1mm 21.23%

단순 선형 외삽이 가장 강력. 가속도/다항식은 노이즈 증폭으로 오히려 나빠짐

난이도 분석

  • Easy (91.4%): 직선 비행, Linear 오차 < 30mm
  • Hard (8.6%): 빠른 속도 + 큰 방향 변화, 오차 최대 98mm
  • Hard 케이스의 공통점: 관측 구간 후반부에서 방향 전환

Train vs Test

  • 속도 분포 거의 동일 → 운동 패턴은 환경 무관
  • x축 좌표에서 Test가 약간 더 넓음 → 절대좌표 의존 금지

🔧 모델링 과정

Phase 1: LightGBM v1 (잔차 보정)

  • 전략: Linear 외삽 예측값의 잔차를 LightGBM으로 보정
  • 피처: 상대좌표, 변위, 스무딩 가속도, 방향 변화 등 179개
  • 결과: Hit@10mm 59.97% (대회 점수 60.12%)
  • 문제: Early stopping이 21~61 라운드로 너무 빠름. 피처 중요도에서 "마지막 변위"에만 과도하게 의존. Easy 케이스 보정 0mm, Hard만 6.59mm 개선

Phase 2: LightGBM v2 (직접 예측)

  • 변경: 타겟을 잔차 → 상대 변위 직접 예측으로 변경, 피처 강화
  • 결과: Hit@10mm 57.36% ← 오히려 악화!
  • 원인: Hard 개선(+9.08mm)했지만 Easy 악화(-0.77mm). Easy가 91.4%이므로 전체 성능 하락
  • 교훈: Easy 케이스를 보호하는 잔차 보정 방식이 안전함

Phase 3: LightGBM v3 (v1 방식 + v2 피처)

  • 전략: v1의 잔차 보정 + v2의 강화 피처 + Huber loss
  • 피처 강화: 다중 스무딩(window 3,5,7,9), 곡률, 다중 시간 스케일 속도, 물리 기반 힌트, 교차 피처
  • 하이퍼파라미터: num_leaves 127, lr 0.02, 5000 rounds
  • 결과: Hit@10mm 61.96% (대회 점수 64.38%)
  • Easy 8.42mm(+0.27mm 개선), Hard 49.80mm(+8.19mm 개선) — 둘 다 개선 성공

Phase 4: XGBoost + 앙상블

  • 결과: LGB-XGB 상관 0.99로 거의 같은 모델 → 앙상블 효과 미미 (+0.14%p)
  • 교훈: 같은 피처/타겟에 유사 알고리즘을 쓰면 다양성이 없어 앙상블 효과 없음

Phase 5: DL 모델 (CNN+GRU) + 3모델 앙상블

  • DL 구조: 1D-CNN → Bidirectional GRU → Attention → 출력
  • 입력: 20채널 시퀀스 (원시/스무딩 좌표, 변위, 속도, 가속도)
  • 결과: DL 단독 Hit@10mm 63.53% — LGB(61.96%)보다 +1.57%p 높음
  • LGB-DL 상관 0.97 → 트리 대비 다른 패턴 포착
  • 3모델 앙상블 (LGB+XGB+DL): Hit@10mm 63.73% (대회 점수 65.76%)

📈 점수 변화 추이

버전 OOF Hit@10mm 대회 점수

Linear 외삽 (기준) 57.88% -
LightGBM v1 59.97% 60.12%
LightGBM v2 57.36% -
LightGBM v3 61.96% 64.38%
LGB+XGB 앙상블 62.10% -
LGB+XGB+DL 앙상블 63.73% 65.76%

💡 핵심 인사이트 & 교훈

  1. 단순한 베이스라인의 힘: Linear 외삽이 57.88%로 이미 강력. 복잡한 방법(2차 다항식, 가속도 보정)이 오히려 나빴음
  2. 노이즈 증폭 문제: 관측 노이즈 3mm가 미분 연산 시 증폭됨. Savitzky-Golay 스무딩으로 30.5% 노이즈 감소 달성
  3. 잔차 보정 vs 직접 예측: 잔차 보정이 Easy 케이스를 보호하면서 안전한 개선 가능. 직접 예측은 공격적이지만 Easy 악화 위험
  4. Huber Loss의 효과: MAE에서 Huber로 변경 시 Hard 케이스 보정이 더 적극적으로 이루어짐
  5. 앙상블은 다양성이 핵심: LGB-XGB 상관 0.99 → 효과 없음. LGB-DL 상관 0.97 → 의미 있는 개선. 서로 다른 구조의 모델이 필요
  6. OOF vs 실제 점수 갭: OOF보다 실제 점수가 약 2%p 높게 나옴. Test가 약간 더 예측하기 쉬운 분포