ADP 실기 데이터 분석 기획부터 SQL·Python 보고서까지
ADP 실기에서 데이터 분석 기획서, SQL 가공, Python 모델링, 결과 해석 보고를 재현성 중심으로 연결하는 실행 체계를 정리합니다.
2026-08-14 · 최초 발행 2024-04-29
기획에서 보고까지 이어지는 분석 실행 흐름
ADP 실기(Advanced Data Analytics Professional Practical)는 데이터 분석 기획서 수립, SQL·Python 구현, 결과 해석 보고를 연결하는 과정을 평가한다. 비즈니스 문제를 해결하는 실제 분석 흐름을 압축한 구조이며, 시험 규정과 사용 가능 라이브러리는 변경될 수 있으므로 최신 정보를 확인해야 한다.
평가에서 다루는 산출물은 기획서, SQL 스크립트, Python 노트북 또는 스크립트, 보고서다. 파일명·포맷·서술 형식도 요구사항에 맞춰야 한다.
분석 자체만으로는 충분하지 않다. 문제 정의가 명확한지, 데이터 가공이 정확하고 정합적인지, 모델링이 재현성과 일반화 성능을 갖추는지, 설명 가능한 결과와 비즈니스 인사이트를 제시하는지가 함께 평가 대상이 된다.
CRISP-DM 관점에서는 Business Understanding에서 시작해 Data Understanding/Preparation, Modeling, Evaluation으로 이어지고, Deployment는 보고서가 대신한다. 이 흐름에 다음 품질 게이트를 배치할 수 있다.
- 스키마·결측·중복을 검증한다.
- 정규성, 독립성 등 통계적 가정을 검토한다.
- 교차검증과 홀드아웃으로 모델을 검증한다.
- 대안 가설과 한계를 검토해 해석을 검증한다.
시드 고정, 환경·버전 명시, 데이터 스냅샷 고정, 쿼리와 코드의 주석화도 재현성 체계에 포함된다.
기획서는 문제와 측정 기준을 묶는다
기획서에는 문제 재정의, 가설, 지표와 평가계획, 데이터 소스·스키마·키 관계, 리스크와 완화 전략을 담는다. 분석 결과가 어떤 의사결정 변수와 성과지표(KPI), 제약조건에 연결되는지도 분명히 해야 한다.
누락을 줄이려면 산출물 체크리스트 기반의 템플릿을 사용하는 편이 낫다. 기획서에는 문제정의·목표지표, 가설·변수설계, 데이터 소스·스키마·키, 결측·이상치 전처리 정책, 분석 방법·평가계획, 리스크·한계·완화책을 포함할 수 있다.
SQL에서 정합성을 확보하는 방법
SQL은 조인, 집계, 윈도 함수, 조건부 집계, 서브쿼리와 CTE로 정형 데이터를 가공하는 구간이다. 키 유일성, 누락·중복 처리, 시간 경계 조건의 포함·제외 여부를 명시해야 결과의 정합성을 유지할 수 있다.
실행 시에는 트랜잭션을 read only로 두고 커밋을 통제하며, 실행계획 확인으로 성능을 점검한다.
-- 목적: 월별 매출과 상위 고객 비중 산출
-- 안전 실행
BEGIN;
SET TRANSACTION READ ONLY;
WITH orders_clean AS (
SELECT
o.order_id,
o.customer_id,
o.order_date::date AS order_date,
o.amount::numeric AS amount
FROM orders o
WHERE o.order_status = 'completed'
),
mth AS (
SELECT
date_trunc('month', order_date) AS ym,
customer_id,
SUM(amount) AS m_amount
FROM orders_clean
GROUP BY 1, 2
),
ranked AS (
SELECT
ym,
customer_id,
m_amount,
RANK() OVER (PARTITION BY ym ORDER BY m_amount DESC) AS rnk,
SUM(m_amount) OVER (PARTITION BY ym) AS m_total
FROM mth
),
top_share AS (
SELECT
ym,
SUM(CASE WHEN rnk <= 10 THEN m_amount ELSE 0 END) / NULLIF(MAX(m_total),0) AS top10_share,
COUNT(*) AS cust_cnt
FROM ranked
GROUP BY ym
)
SELECT ym::date AS month, ROUND(top10_share*100, 2) AS top10_pct, cust_cnt
FROM top_share
ORDER BY month;
ROLLBACK; -- 읽기 전용이므로 롤백
이 예시에서는 키 유일성 검사, NULL·음수 금액 제거, 경계일 포함 여부 확인이 필수다.
Python 분석은 파이프라인과 검증을 함께 남긴다
Python 구간에서는 EDA, 인코딩·스케일링·결측 대체 같은 전처리, 피처 엔지니어링, 모델 학습과 검증을 파이프라인으로 구성한다. 시드 고정과 교차검증을 적용하고 ROC-AUC, F1, RMSE 등의 성능지표를 일관되게 보고한다.
모델 결과는 계수나 특성 중요도, SHAP·Permutation Importance 등을 적용 가능한 범위에서 활용해 해석할 수 있다.
# 전제: data.csv(train) 존재, target 컬럼 포함
import os, random, numpy as np, pandas as pd
from sklearn.model_selection import StratifiedKFold, cross_validate
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, make_scorer
# 재현성
SEED = 42
os.environ["PYTHONHASHSEED"] = str(SEED)
random.seed(SEED); np.random.seed(SEED)
df = pd.read_csv("data.csv")
y = df["target"].astype(int)
X = df.drop(columns=["target"])
num_cols = X.select_dtypes(include=["int64","float64"]).columns.tolist()
cat_cols = X.select_dtypes(include=["object","category"]).columns.tolist()
preprocess = ColumnTransformer(
transformers=[
("num", StandardScaler(with_mean=False), num_cols),
("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
],
remainder="drop",
)
clf = LogisticRegression(
max_iter=200,
solver="liblinear",
random_state=SEED,
)
pipe = Pipeline(steps=[("prep", preprocess), ("clf", clf)])
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)
scoring = {"roc_auc": "roc_auc", "f1": "f1"}
cv_res = cross_validate(pipe, X, y, scoring=scoring, cv=cv, n_jobs=-1, return_train_score=True)
print("ROC-AUC(mean±std):", np.mean(cv_res["test_roc_auc"]).round(4), "±", np.std(cv_res["test_roc_auc"]).round(4))
print("F1(mean±std):", np.mean(cv_res["test_f1"]).round(4), "±", np.std(cv_res["test_f1"]).round(4))
# 피처 중요도(선형모형 계수 기반, 참고용)
pipe.fit(X, y)
if hasattr(pipe.named_steps["clf"], "coef_"):
coefs = pipe.named_steps["clf"].coef_[0]
# 주의: OneHot 이후 피처명 전개 필요
feature_names = pipe.named_steps["prep"].get_feature_names_out()
imp = pd.Series(coefs, index=feature_names).sort_values(key=np.abs, ascending=False)
print(imp.head(10))
시험 환경에서 허용하는 라이브러리 범위와 버전은 최신 정보를 확인해야 한다.
검증 실패를 되돌리는 분석 경로
입력에는 문제 요구사항, 제공 데이터 사전·스키마, 제약사항이 들어간다. 기획서에서 SQL, Python, 검증으로 진행하되 품질 게이트의 통과 여부에 따라 다시 점검하고 재실행한다.
최종 제출물은 재현 가능한 코드, 결과표, 차트, 결론으로 구성한다. 에러와 예외는 로그 및 근거와 함께 보고한다.
보고서는 비즈니스 임팩트 요약, 데이터·모형·검증 방법, 지표와 시각화 결과, 인사이트와 한계, 우선순위·가정·모니터링 계획을 포함한 실행 권고로 구성할 수 있다. 시각화는 변수 중요도, 잔차·리프트 차트, 분포·추세처럼 의사결정에 직접 쓰이는 차트에 집중한다.
분석 주제에 적용하는 방식
고객 이탈 예측에서는 60일 내 이탈 확률을 예측하고 상위 N% 타깃팅을 제안한다. SQL로 고객과 거래 로그를 조인해 최근성·빈도·금액 지표와 활동 채널을 파생하고, Python에서는 Stratified CV, ROC-AUC 최적화, 캘리브레이션, 리프트 차트를 활용한 마케팅 시뮬레이션을 수행한다.
매출 원인 분석은 전년동기 대비 매출 증감 요인을 분해하는 문제다. 제품·지역·채널별 월 매출을 피벗·윈도 집계하고 이동평균·YoY를 계산한 뒤, 기여도 분해(분해 트리/SHAP)와 가설 검정으로 유의 요인을 제시한다.
고객 세분화에서는 행동 기반 세그먼트를 정의하고 운영 정책을 권고한다. 세션·주문 기준으로 사용자를 집계하고 정규화 전처리를 거쳐 KMeans/GM 및 클러스터 프로파일링을 수행하며, 실루엣과 CH 지수로 안정성을 평가한다.
SQL·Python·스프레드시트의 역할
| 항목 | SQL | Python | 스프레드시트 |
|---|---|---|---|
| 성능 | 대용량 조인/집계 우수 | 중~대 규모 적정, 병렬화 가능 | 소규모 한정 |
| 확장성 | 수평 확장(DB 엔진 의존) | 라이브러리 기반 확장 용이 | 낮음 |
| 일관성 | 스키마/제약조건으로 높음 | 코드 규약에 따라 상이 | 낮음 |
| 안정성 | 트랜잭션/락 지원 | 가상환경·시드로 보장 가능 | 수동 오류 위험 |
| 운영 편의 | SQL 스크립트 배포 용이 | 파이프라인/패키징 필요 | 버전 관리 취약 |
대용량 필터·조인·윈도 처리는 SQL에 맡기고, 복합 변환·모델링·해석에는 Python을 사용한다. 스프레드시트는 임시 검토와 시연에 최소한으로 사용한다.
재현성과 분석 깊이 사이의 선택
시드·버전 고정, 데이터 스냅샷, 의존성 명시는 재현성을 높이지만 초기 세팅 비용을 늘린다. 단순 모델을 먼저 쓰면 해석과 안정성은 확보하기 쉽지만 극한 성능에 미치지 못할 수 있다.
스키마와 정합성 검사를 통과한 뒤 모델링하는 품질 게이트는 오류를 줄이지만, 시간 제약에서는 분석 깊이가 감소할 수 있다. 시각화 역시 의사결정형 차트에 집중하면 전달력은 높아지지만 탐색적 인사이트를 놓칠 위험이 있다.
템플릿과 파이프라인화를 적용하면 작업 시간을 2030% 단축할 수 있고, 품질 게이트는 오답률을 1525% 감소시키는 데 연결된다. 시드와 버전을 고정해 재현 실패 0%를 목표로 삼을 수 있다. 제출물 표준화는 리뷰·피드백을 효율화하고 재사용 자산 축적에도 도움이 된다.