데이터를 수집·카탈로그화했다면 이제 읽고 이해할 차례다. 모델을 만들기 전 데이터 사이언티스트는 반드시 데이터를 들여다본다 — 이것이 EDA(Exploratory Data Analysis)다.
Athena는 S3에 저장된 데이터를 서버리스 SQL로 쿼리하는 서비스다. Presto/Trino 엔진 기반이고 클러스터 프로비저닝이 전혀 없다. Glue Data Catalog의 테이블 정의를 그대로 사용한다.
서버리스: 인프라 관리 없음. 쿼리할 때만 동작.
schema-on-read: 데이터를 옮기지 않고 S3에 둔 채로 쿼리.
과금 = 스캔한 데이터량: 쿼리가 스캔한 바이트당 과금($5/TB). 스캔량 최소화가 곧 비용 절감이다.
-- Glue Catalog에 등록된 테이블을 바로 쿼리SELECT customer_id, AVG(amount) AS avg_amountFROM ml_datalake.transactionsWHERE year = '2026' AND month = '06' -- 파티션 필터로 스캔량 감소GROUP BY customer_idORDER BY avg_amount DESCLIMIT 100;
위 쿼리에서 WHERE year='2026' AND month='06'는 파티션 프루닝을 일으켜 해당 파티션의 Parquet만 스캔한다.
스캔량을 줄이는 3대 레버
레버
원리
효과
열 기반 포맷(Parquet/ORC)
필요한 컬럼 블록만 읽음
컬럼 수 비율만큼 감소
파티셔닝
조건에 맞는 폴더만 읽음
파티션 수 비율만큼 감소
압축(Snappy/GZIP)
물리 바이트 자체가 작아짐
2~10배 감소
세 레버는 곱해진다. CSV 풀스캔 대비 잘 설계된 Parquet 쿼리가 수십 배 저렴해지는 이유다.
Athena 비용이 "스캔한 데이터량"에 비례한다는 점은 ML 데이터 준비에 직접 영향을 준다. CSV로 풀스캔하면 비싸고 느리지만, 잘 파티셔닝된 Parquet은 같은 쿼리가 훨씬 낮은 비용으로 돈다. ML 피처를 뽑는 쿼리를 자주 돌린다면 이 차이가 누적된다.
Athena는 ML 워크플로의 빠른 피처 탐색에 적합하다. SageMaker가 학습 데이터로 Parquet을 S3에서 읽기 전에, 분석가가 Athena로 "타깃 분포는? 클래스 불균형은?"을 SQL로 확인한다. 또 Athena CTAS(CREATE TABLE AS SELECT)로 쿼리 결과를 Parquet으로 S3에 저장해 학습 데이터셋을 직접 만들 수도 있다.
Redshift는 페타바이트급 데이터웨어하우스(OLAP)다. 데이터를 Redshift 내부 노드에 적재(또는 Redshift Serverless)하고, MPP(Massively Parallel Processing)로 복잡한 분석 쿼리를 고속 처리한다.
구분
Athena
Redshift
모델
서버리스, S3 직접 쿼리
데이터웨어하우스(적재 필요)
데이터 위치
S3 (이동 없음)
클러스터 내부(또는 Serverless)
적합
임시·간헐적 쿼리, 탐색
반복적·고성능 분석, BI 대시보드
과금
스캔량
클러스터(노드 시간) 또는 RPU
준비 작업
없음(카탈로그만)
적재(COPY), 분산키·정렬키 설계
정답 키워드
"간헐적", "관리 부담 최소", "S3 그대로"
"반복적 BI", "복잡한 조인", "지속 워크로드"
Redshift Spectrum은 둘의 다리다 — Redshift에서 S3의 데이터를 외부 테이블로 직접 쿼리할 수 있다. 자주 쓰는 데이터(핫)는 Redshift 내부에, 차가운 데이터는 S3에 두고 Spectrum으로 조인한다.
ML 통합 측면에서 Redshift ML도 있다. SQL CREATE MODEL 문으로 Redshift 안에서 SageMaker Autopilot을 호출해 모델을 학습·추론할 수 있다. 데이터를 옮기지 않고 SQL만으로 예측 컬럼을 만든다.
-- Redshift ML: SQL로 모델 학습 (내부적으로 SageMaker Autopilot 호출)CREATE MODEL churn_predictorFROM (SELECT tenure, monthly_charges, churned FROM transactions)TARGET churnedFUNCTION predict_churnIAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftMLRole'SETTINGS (S3_BUCKET 'ml-datalake-redshiftml');
헷갈리기 쉬운 비교 — "임시 탐색/간헐적 쿼리 + 관리 부담 최소 + 데이터를 S3에 그대로"면 Athena. "반복적인 고성능 BI 쿼리 + 복잡한 조인 + 지속적 워크로드"면 Redshift. "Redshift에서 S3 차가운 데이터를 조인"이면 Redshift Spectrum. "데이터 이동 없이 SQL로 ML"이면 Redshift ML.
데이터를 쿼리할 수 있게 됐으니 이제 이해할 차례다. EDA는 모델링 전에 데이터의 구조·품질·관계를 파악하는 과정이며, 피처 엔지니어링·데이터 정제의 근거를 제공한다.
점검
질문
발견 시 대응
분포
각 피처가 어떻게 분포하나?
왜도(skew) → log 변환
결측치
어느 컬럼에 결측이 많나?
대치(imputation) 또는 제거
이상치
극단값이 있나?
클리핑, 제거, robust 스케일링
상관관계
피처 간/타깃과 상관은?
다중공선성 제거, 무의미 피처 드롭
클래스 불균형
타깃 분포가 치우쳤나?
오버/언더샘플링, class weight
카디널리티
범주형 컬럼의 고유값 수는?
인코딩 전략 결정
데이터 누수
타깃과 비현실적으로 높은 상관이 있나?
해당 피처 제거
import pandas as pddf = pd.read_parquet("s3://ml-datalake/curated/churn/train.parquet")# 기초 통계print(df.describe()) # 수치형 분포(평균/표준편차/사분위)print(df.isnull().mean()) # 컬럼별 결측 비율print(df["churned"].value_counts(normalize=True)) # 클래스 불균형 확인print(df.corr(numeric_only=True)) # 피처 상관행렬
상관계수를 어떻게 읽는가 — EDA에서 바로 판단으로 이어지는 표다.
관측
무엇을 뜻하나
조치
피처-타깃 상관 ≈ 0
예측에 기여하지 않음
드롭 후보
피처-타깃 상관 0.99
데이터 누수 의심
원인 추적 후 제거
피처-피처 상관 0.95
다중공선성
하나만 남기거나 차원 축소
결측률 > 50%
정보가 거의 없음
컬럼 제거 또는 "결측 여부" 플래그화
소수 클래스 < 1%
극단 불균형
층화 분할 + 리샘플링 + PR-AUC
EDA는 1977년 통계학자 John Tukey가 그의 저서 Exploratory Data Analysis에서 정립한 개념이다. 핵심 철학은 "가설을 세우고 검정하기 전에, 먼저 데이터가 스스로 말하게 하라"이다. 박스플롯·히스토그램·산점도 같은 시각화도 Tukey의 유산이다. ML에서 EDA를 건너뛰면 클래스 불균형이나 데이터 누수(data leakage)를 놓쳐 모델이 잘못된 패턴을 학습한다.
⚠️ 함정: EDA 단계에서 가장 위험한 실수는 데이터 누수(data leakage)다. 예를 들어 "결제 완료일"이라는 컬럼이 "구매 여부" 타깃을 사실상 미리 담고 있으면, 검증 정확도는 99%인데 실제 배포에선 무용지물이다. EDA에서 타깃과 비현실적으로 높은 상관(예: 0.99)을 가진 피처가 보이면 누수를 의심해야 한다.
AWS에서 EDA를 수행하는 환경은 보통 SageMaker Studio / 노트북이다. 노트북에서 Athena로 SQL 쿼리하거나, S3의 Parquet을 pandas로 직접 읽어 분석한다. 대규모 데이터는 SageMaker Data Wrangler가 시각적 EDA와 변환을 묶어 제공한다(Week 3에서 깊게 다룸).
[S3 Parquet] ──┬──> Athena SQL (대용량 집계·샘플링)
├──> pandas 노트북 (세밀한 분석·시각화)
└──> Data Wrangler (시각적 EDA + 변환 + 품질 리포트)
⚠️ 함정: EDA를 전체 데이터로 한 뒤 그 결과를 근거로 특성을 고르고, 그다음에 train/test를 나누면 이미 누수가 시작된 것이다. 특성 선택·변환 기준은 분할 이후 train에서만 도출해야 한다. 탐색 목적의 눈으로 보는 것과, 그 통계를 학습에 쓰는 것은 구분해야 한다.