Date: 2026-03-16 Status: Design Complete → Implementation Phase Goal: f2a를 단순 통계 덤프 도구에서 자동 인사이트 생성 + 다차원 교차분석 + ML 준비도 평가 를 갖춘 최고 수준의 EDA 엔진으로 고도화한다.
| 영역 | 구현 상태 | 비고 |
|---|---|---|
| 데이터 로더 | ★★★★★ | 24+ 포맷, HuggingFace 다중 subset 자동 탐색 |
| 기초 통계 | ★★★★★ | 16개 기술통계, 4개 정규성 검정, 5종 상관분석 |
| 고급 통계 | ★★★★☆ | 7종 분포 피팅, 부분상관, MI 행렬, IF/LOF/Mahalanobis 등 |
| 시각화 | ★★★★☆ | 12종 Plotter, 30+ 차트 유형, base64 인라인 |
| HTML 리포트 | ★★★★☆ | 2-depth 탭, 드래그 스크롤, 툴팁, 모달, i18n 6개 언어 |
| 전처리 | ★★★★☆ | 상수/고결측/ID성/혼합타입/무한값 자동 탐지·정제 |
| # | 약점 | 영향도 | 현재 상태 |
|---|---|---|---|
| G1 | 자동 인사이트 엔진 부재 | ★★★★★ | 보고서가 수치/차트만 나열 — "그래서 뭐가 중요한데?" 대답 불가 |
| G2 | 교차분석(cross-dimensional) 부재 | ★★★★★ | 각 분석(상관/이상치/클러스터/분포)이 고립적 수행 — 연계 패턴 미탐지 |
| G3 | Data Profile 탭이 stub | ★★★★☆ | 7개 숫자 카드만 렌더링, 컬럼별 프로파일/샘플/메모리 분석 없음 |
| G4 | Dim Reduction / Feature Insights / Stat Tests 차트 누락 | ★★★★☆ | 섹션 빌더에 chart_keys 미등록 → 생성된 Figure도 미표시 |
| G5 | 통계 검정 시맨틱 오류 | ★★★☆☆ | Kruskal-Wallis가 범주형 그룹 변수 없이 수치 컬럼 간 비교 |
| G6 | 다중검정 보정 없음 | ★★★☆☆ | 쌍별 검정(Levene, Mann-Whitney)에서 Bonferroni/FDR 미적용 |
| G7 | 효과 크기(Effect Size) 미제공 | ★★★☆☆ | p-value만 보고, Cohen's d / η² / Cramér's V 없음 |
| G8 | 컬럼 역할 자동 분류 없음 | ★★★☆☆ | ID/타겟/피처/시간/텍스트 역할 미추론 |
| G9 | ML 준비도 평가 없음 | ★★★☆☆ | "이 데이터가 ML에 바로 쓸 수 있나?" 판단 기능 없음 |
| G10 | Health Radar 차트 없음 | ★★☆☆☆ | 수평 바만 존재, 방사형 종합 대시보드 미구현 |
f2a/
├── stats/
│ ├── insight_engine.py ← [신규] 자동 인사이트 생성 엔진
│ ├── cross_analysis.py ← [신규] 교차 분석 모듈
│ ├── column_role.py ← [신규] 컬럼 역할 자동 분류
│ └── ml_readiness.py ← [신규] ML 준비도 평가
│
├── viz/
│ ├── insight_plots.py ← [신규] 인사이트 시각화
│ ├── cross_plots.py ← [신규] 교차 분석 시각화
│ └── dimreduction_plots.py ← [신규] 차원축소 전용 시각화
│
├── core/
│ └── analyzer.py ← [수정] 새 모듈 통합 + VizResult 확장
│
└── report/
└── generator.py ← [수정] 인사이트 패널, 교차분석 섹션, 누락 차트 등록
| 파일 | 변경 내용 |
|---|---|
core/config.py |
새 분석 토글 추가 (insight_engine, cross_analysis, column_role, ml_readiness) |
core/analyzer.py |
_compute_stats() 확장, VizResult에 새 plot 메서드, _compute_advanced_stats() 확장 |
stats/statistical_tests.py |
Kruskal-Wallis 시맨틱 수정, 다중검정 보정 추가, 효과 크기 추가 |
stats/quality.py |
consistency() 성능 개선, 새 차원(timeliness, conformity) 추가 |
report/generator.py |
Data Profile 강화, 누락 차트 등록, 인사이트 패널, 교차분석 섹션, Health Radar |
report/i18n.py |
새 섹션/인사이트 번역 키 추가 |
목적: 모든 분석 결과를 종합하여 우선순위화된 자연어 인사이트를 자동 생성한다.
| 타입 | 아이콘 | 설명 | 예시 |
|---|---|---|---|
FINDING |
🔍 | 주목할 만한 데이터 패턴/사실 발견 | "column 'price'는 강한 오른쪽 꼬리(skew=2.3)를 가지며, log 변환으로 정규성이 크게 개선됩니다" |
WARNING |
데이터 품질/이상 경고 | "3개 컬럼 쌍에서 r>0.95의 다중공선성이 탐지되었습니다. VIF 기반 제거를 검토하세요" | |
RECOMMENDATION |
💡 | 데이터 전처리/모델링 제안 | "'age' 컬럼에 5.2%의 결측이 있습니다. 분포가 정규에 가까우므로 평균 대체가 적합합니다" |
OPPORTUNITY |
🚀 | 활용 가능한 패턴/기회 | "K-Means(k=3)에서 뚜렷한 3개 군집이 형성됩니다. 군집별 특성 분석으로 세분화 전략 수립이 가능합니다" |
각 분석 모듈의 결과에서 다음 규칙들을 체계적으로 적용:
분포 기반 인사이트:
class DistributionInsightRules:
"""분포 분석에서 인사이트를 추출하는 규칙 엔진."""
rules = [
# (조건 함수, 인사이트 생성 함수, 심각도/우선순위)
(lambda col: abs(col.skewness) > 2.0,
"극단적 비대칭: '{col}'의 skewness={val:.2f}. {transform} 변환 권장",
"high"),
(lambda col: col.kurtosis > 7.0,
"극단적 첨도: '{col}'에 heavy tail ({val:.1f}). 이상치가 통계량을 왜곡할 수 있음",
"high"),
(lambda col: col.is_normal and col.cv < 0.1,
"'{col}'는 정규분포이며 변동성이 매우 낮음 (CV={val:.3f}). 안정적 특성",
"low"),
(lambda col: not col.is_normal and col.best_fit != 'norm',
"'{col}'는 {best_fit} 분포에 가장 적합 (AIC 기준). 파라미터 변환 시 유용",
"medium"),
]상관 기반 인사이트:
- 다중공선성 탐지 → VIF>10 또는 |r|>0.9인 쌍 식별 + 제거 후보 추천
- 비선형 의존성 → MI가 높으나 Pearson이 낮은 쌍 (MI/max(MI) > 0.5 & |r| < 0.3)
- 교란 변수 의심 → 편상관에서 크게 감소하는 쌍 (|partial_r - r| > 0.3)
- 안정적 상관 → bootstrap CI 폭이 좁은 쌍 (CI_width < 0.1)
클러스터 기반 인사이트:
- 최적 k 추천 근거 (실루엣 스코어 + 엘보우)
- 군집별 핵심 차별화 특성 상위 3개
- 소수 군집(< 전체의 5%) → 이상치 군집 의심, 별도 분석 권고
- 군집 간 크기 편차 → 불균형 정도와 대응 전략
이상치 기반 인사이트:
- 다변량 합의(consensus ≥ 2/3) 이상치 비율 및 특성
- 단변량 vs 다변량 이상치 불일치 → 변수 간 상호작용 이상치
- 이상치 제거 전후 통계량 변화 추정
결측 기반 인사이트:
- 결측 패턴(MCAR/MAR/MNAR) 진단 + 대체 전략 추천
- 컬럼 간 결측 상관(함께 결측인 컬럼 쌍) → 체계적 결측 의심
- 결측률 구간별 카운트 (0%, 0-5%, 5-20%, 20-50%, 50%+)
@dataclass
class Insight:
type: InsightType # FINDING | WARNING | RECOMMENDATION | OPPORTUNITY
severity: str # critical | high | medium | low
category: str # distribution | correlation | cluster | anomaly | missing | quality | feature
title: str # 한줄 제목
description: str # 상세 설명
affected_columns: list[str] # 관련 컬럼
evidence: dict[str, Any] # 근거 데이터
action_items: list[str] # 구체적 조치 항목
priority_score: float # 0~1 산출 점수 (정렬용)
class InsightEngine:
"""모든 분석 결과를 종합하여 인사이트를 생성·우선순위화한다."""
def generate(self, stats: StatsResult, schema: DataSchema) -> list[Insight]:
"""모든 규칙 엔진을 실행하고 인사이트를 우선순위 역순으로 정렬하여 반환."""
def _score_priority(self, insight: Insight) -> float:
"""심각도 × 영향범위(affected_columns 수) × 실행가능성 가중으로 점수 산정."""┌──────────────────────────────────────────────────────────────┐
│ 📊 Key Insights [Show All / Top 10] │
├──────────────────────────────────────────────────────────────┤
│ 🔴 CRITICAL (2) │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ ⚠️ 3 column pairs show multicollinearity (VIF>10) ││
│ │ → col_a ↔ col_b (r=0.97), col_c ↔ col_d (r=0.95) ││
│ │ 💡 Action: Consider removing one from each pair ││
│ └──────────────────────────────────────────────────────────┘│
│ 🟡 HIGH (5) │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ 🔍 Column 'price' follows lognormal distribution ││
│ │ → skew=2.3, best-fit: lognorm (AIC=-1234) ││
│ │ 💡 Action: Apply log transform before modeling ││
│ └──────────────────────────────────────────────────────────┘│
│ 🟢 MEDIUM (8) │ ⚪ LOW (12) │
└──────────────────────────────────────────────────────────────┘
인사이트 패널 위치: 각 subset의 Basic 탭 Overview 섹션 바로 아래, 모든 분석 섹션보다 앞에 위치.
목적: 개별 분석을 넘어 분석 차원 간 교차점에서 발현하는 복합 패턴을 탐지한다.
| # | 교차 축 | 기법 | 근거 | 산출물 |
|---|---|---|---|---|
| X1 | 이상치 × 클러스터 | 클러스터별 이상치 분포 불균형 분석 | 특정 군집에 이상치 집중 → 해당 군집이 에러 데이터일 수 있음 | cluster_id별 anomaly_rate 테이블 + 막대 차트 |
| X2 | 결측 × 상관 | 결측 여부를 더미(0/1)로 변환 후 다른 컬럼과의 상관 | 결측이 무작위(MCAR)가 아닌 체계적(MAR/MNAR) 여부 판단 | missing_indicator ↔ features 상관행렬 |
| X3 | 분포 × 이상치 | 분포 꼬리 형태별 이상치 탐지 방법 적합성 | Heavy-tail 분포에서 IQR 방법은 과탐지 → Mahalanobis/IF 우선 권고 | 컬럼별 권장 이상치 탐지 방법 테이블 |
| X4 | 클러스터 × 상관 | 군집별 상관 구조 비교 (within-cluster correlation) | Simpson's paradox 탐지: 전체-수준과 군집-수준 상관이 역전되는 경우 | 군집별 상관행렬 + 전체 상관 대비 차이 히트맵 |
| X5 | 특성중요도 × 결측 | 중요 특성에서의 결측률 교차 확인 | 가장 중요한 컬럼에 결측이 많으면 심각한 정보 손실 | 중요도 vs 결측률 scatter + 경고 |
| X6 | 차원축소 × 클러스터 | t-SNE/UMAP 임베딩 공간에서 클러스터 레이블 오버레이 | 클러스터 분리도의 시각적 확인, 클러스터 경계 명확성 | 2D scatter (색상=클러스터, 마커=이상치) |
class SimpsonParadoxDetector:
"""
전체 데이터에서의 상관 방향과 군집 내 상관 방향이 반전되는
Simpson's Paradox를 자동 탐지한다.
근거: Simpson(1951), Blyth(1972)
"""
def detect(
self,
df: pd.DataFrame,
cluster_labels: np.ndarray,
numeric_cols: list[str],
) -> pd.DataFrame:
"""
Returns DataFrame:
col_a, col_b, overall_corr, cluster_corrs (dict),
is_paradox (bool), paradox_strength (float)
"""class MissingCorrelationAnalyzer:
"""
각 컬럼의 결측 여부를 이진 지시자(indicator)로 변환한 뒤,
원본 수치 컬럼들과의 상관을 계산하여 결측의 체계성을 진단한다.
높은 상관 → MAR (Missing At Random): 다른 변수 값에 의존하는 결측
낮은 상관 → MCAR (Missing Completely At Random): 완전 무작위 결측
근거: Little & Rubin (2002), *Statistical Analysis with Missing Data*
"""
def analyze(self, df: pd.DataFrame) -> dict:
"""
Returns:
missing_indicator_corr: DataFrame — 결측 지시자 × 수치 컬럼 상관 행렬
mar_suspects: list[dict] — |corr| > 0.3인 (결측컬럼, 상관컬럼, 상관계수) 쌍
mcar_test_result: dict — Little's MCAR test 결과 (가능한 경우)
imputation_strategy: dict — 컬럼별 추천 대체 전략
"""목적: 각 컬럼이 데이터셋 내에서 어떤 역할(ID, 타겟, 피처, 시간, 텍스트 등)을 하는지 자동 추론한다.
| 역할 | 탐지 기준 | 의미 | 후속 조치 |
|---|---|---|---|
ID |
유니크율 > 95%, 이름에 id/key/index 포함, 단조증가 패턴 | 개체 식별자 → ML에서 제거 필요 | "제거 권장" 인사이트 |
TIMESTAMP |
datetime 타입 or 단조증가 정수 + 이름에 time/date/ts 포함 | 시간 인덱스 → 시계열 분석 가능 | "시계열 분석 활성화" 인사이트 |
CATEGORICAL_FEATURE |
기존 categorical 타입 + 유니크율 < 5% | 범주형 입력 변수 | 인코딩 전략 추천 |
ORDINAL_FEATURE |
정수형 + 유니크 값이 연속적 + 이름에 level/grade/rating 포함 | 순서형 입력 변수 | 레이블 인코딩 추천 |
NUMERIC_FEATURE |
기존 numeric 타입 + ID/TIMESTAMP 아닌 것 | 연속형 입력 변수 | 스케일링/정규화 추천 |
TEXT |
기존 text 타입 | 자유 텍스트 → NLP 파이프라인 필요 | 텍스트 최소 프로파일(평균 길이, 어휘 크기) |
BINARY |
유니크 값이 정확히 2개 | 이진 변수 | 클래스 균형 확인 |
CONSTANT |
유니크 값이 1개 | 정보 없음 → 제거 필요 | "제거 필수" 인사이트 |
TARGET_CANDIDATE |
이름에 target/label/y/class 포함 + 낮은 cardinality | 잠재적 타겟 변수 후보 | ML 문맥에서 활용 |
@dataclass
class ColumnRole:
column: str
primary_role: str # 위 역할 중 하나
confidence: float # 0~1 확신도
secondary_role: str | None # 보조 역할 (예: ORDINAL이면서 TARGET_CANDIDATE)
properties: dict[str, Any] # 역할 판단 근거 증빙
class ColumnRoleClassifier:
"""모든 컬럼의 역할을 자동 추론한다."""
def classify(self, df: pd.DataFrame, schema: DataSchema) -> list[ColumnRole]:
"""각 컬럼에 대해 역할을 판정하고 확신도를 산출한다."""
def summary(self) -> pd.DataFrame:
"""컬럼 × 역할 요약 테이블을 반환한다."""목적: 데이터셋이 ML 파이프라인에 투입되기 전에 얼마나 준비되어 있는지를 다차원으로 평가한다.
| 차원 | 세부 지표 | 가중치 | 근거 |
|---|---|---|---|
| 완전성 (Completeness) | 전체 결측률, 고결측 컬럼 비율, 행 단위 결측 분포 | 25% | 결측이 많으면 대체/제거 전처리 필수 |
| 일관성 (Consistency) | 타입 혼합 컬럼 수, 이상 범위 값 비율, id-like 컬럼 비율 | 15% | 타입 불일치/이상값은 모델 오류 유발 |
| 균형성 (Balance) | 범주 불균형(Gini), 이상치 비율, 클래스 비율(타겟 존재 시) | 15% | 불균형 데이터는 편향된 학습 유발 |
| 정보성 (Informativeness) | 상수 컬럼 비율, 중복 행 비율, 평균 MI, 분산 분포 | 20% | 정보 없는 피처는 노이즈만 추가 |
| 독립성 (Independence) | 다중공선성(VIF>10 비율), 완전 상관 쌍 수, 평균 상관 | 15% | 높은 공선성은 모델 불안정 유발 |
| 규모성 (Scale) | 행 수 대비 컬럼 수(차원의 저주), 유효 피처 수 vs 표본 수 | 10% | n << p 상황은 과적합 위험 |
ML Readiness Score: 78.5 / 100
Grade: B+ (Good — minor preprocessing needed)
┌─────────────────────────────────────────┐
│ Completeness ████████████░░ 85% │
│ Consistency ██████████████ 95% │
│ Balance ██████████░░░░ 72% │
│ Informativeness ███████████░░░ 80% │
│ Independence ██████░░░░░░░░ 50% │ ← 주의 필요
│ Scale █████████████░ 90% │
└─────────────────────────────────────────┘
Blocking Issues (must fix before ML):
⛔ 2 columns have >50% missing — drop or impute
⛔ VIF > 100 detected for 'col_x' — remove or combine
Improvement Suggestions:
💡 Apply log transform to 3 skewed features
💡 Consider SMOTE for class imbalance (minority: 8%)
💡 Remove 2 constant columns
@dataclass
class ReadinessScore:
overall: float # 0~100
grade: str # A+, A, B+, B, C+, C, D, F
dimensions: dict[str, float] # 각 차원별 0~100
blocking_issues: list[str] # 반드시 해결해야 할 문제
suggestions: list[str] # 권장 개선 사항
details: dict[str, Any] # 상세 근거 데이터
class MLReadinessEvaluator:
"""데이터셋의 ML 준비도를 다차원으로 평가한다."""
def evaluate(
self, df, schema, stats: StatsResult
) -> ReadinessScore:
"""이전 분석 결과를 활용하여 ML 준비도를 산정한다."""| 개선 항목 | 현재 | 변경 | 근거 |
|---|---|---|---|
| Kruskal-Wallis 시맨틱 | 수치 컬럼 간 비교 (의미 없음) | 범주형 변수를 그룹 변수로 활용하여 수치 컬럼의 그룹 간 차이 검정 | 올바른 통계적 사용법 |
| 다중검정 보정 | 없음 | Benjamini-Hochberg FDR 보정 (모든 쌍별 검정에 적용) | Benjamini & Hochberg(1995) |
| 효과 크기 | 없음 | Cohen's d (연속), Cramér's V (범주), η² (ANOVA/KW), rank-biserial r (MW) | 실무적 유의미성 판단에 필수 |
| Bonferroni-adjusted significance | 없음 | adjusted_p 컬럼 추가 + significance star 업데이트 | 대량 다중비교 시 Type I 오류 통제 |
| 개선 항목 | 현재 | 변경 |
|---|---|---|
| consistency() | series.apply(type).nunique() — O(n) 느림 |
series.dtype 기반 빠른 검사 + 도메인 규칙 (ex: 음수 나이, 미래 날짜) |
| 새 차원: Timeliness | 없음 | datetime 컬럼의 최신성(recency) + 시간 범위 적절성 평가 |
| 새 차원: Conformity | 없음 | 값 범위, 패턴 일치(regex), 도메인 규격 준수율 평가 |
| 컬럼 품질 세분화 | 4차원 집계 | 각 차원별 컬럼 레벨 점수 표시 |
현재 7개 숫자 카드만 표시하는 Data Profile을 다음으로 확장:
| 구성요소 | 내용 |
|---|---|
| Dataset Overview Cards | 행 수, 컬럼 수, 메모리, 결측률, 중복률, 수치/범주 비율 |
| Column Role Table | 각 컬럼의 역할(ID/Feature/Target/Time), 타입, 유니크, 결측률, 샘플값 3개 |
| ML Readiness Dashboard | 6차원 레이더 차트 + 종합 점수/등급 + blocking issues + suggestions |
| Health Radar Chart | 방사형 차트: completeness, consistency, outlier_ratio(반전), skewness_balance, correlation_health, duplicate_freedom |
| Type Distribution Donut | 컬럼 타입 비율 도넛 차트 (numeric/categorical/text/datetime/boolean) |
| Memory Breakdown | 컬럼별 메모리 사용량 수평 막대 (Top-10 heavy columns) |
| Sample Data Preview | 첫 5행 + 마지막 5행 (민감 데이터 마스킹 옵션) |
| 섹션 | 누락 차트 | 등록 방법 |
|---|---|---|
| Dim. Reduction | t-SNE scatter, UMAP scatter, Factor loadings heatmap, Feature contribution bar | chart_keys 맵에 추가 + VizResult에 해당 plot 메서드 구현 |
| Feature Insights | Interaction strength bar, Monotonic gap scatter, Binning comparison, Cardinality distribution | chart_keys 맵에 추가 + viz/insight_plots.py 구현 |
| Statistical Tests | Group comparison boxplots, p-value summary bar, Effect size forest plot | chart_keys 맵에 추가 + 기존 plotter 확장 |
| Cross Analysis | 이상치×클러스터 bar, 결측×상관 heatmap, Simpson paradox highlight, 중요도×결측 scatter, 통합 2D scatter | viz/cross_plots.py에서 구현 |
viz/insight_plots.py:
| 차트 | 용도 | 기법 |
|---|---|---|
insight_severity_bar() |
인사이트 심각도별 개수 bar chart | 수평 막대, 색상 코딩 |
interaction_strength_bar() |
상호작용 세기 상위 N개 | 수평 막대 |
monotonic_gap_scatter() |
Pearson vs Spearman 차이 scatter | X=Pearson, Y=Spearman, 대각선 기준 |
binning_comparison() |
Equal-width vs equal-freq 엔트로피 비교 | 병렬 막대 |
cardinality_distribution() |
컬럼별 cardinality 분포 | 히스토그램 + 인코딩 전략 색상 |
viz/cross_plots.py:
| 차트 | 용도 |
|---|---|
anomaly_by_cluster_bar() |
군집별 이상치 비율 막대 |
missing_correlation_heatmap() |
결측 지시자 × 수치 컬럼 상관 히트맵 |
simpson_paradox_highlight() |
전체 vs 군집별 상관 비교 scatter (방향 반전 강조) |
importance_vs_missing_scatter() |
X=중요도, Y=결측률, 크기=유니크 수 |
unified_2d_scatter() |
t-SNE/UMAP 2D에 클러스터 색상 + 이상치 마커 통합 |
viz/dimreduction_plots.py:
| 차트 | 용도 |
|---|---|
tsne_scatter() |
t-SNE 2D scatter (클러스터 라벨 오버레이 지원) |
umap_scatter() |
UMAP 2D scatter |
factor_loadings_heatmap() |
Factor Analysis loadings 히트맵 |
feature_contribution_bar() |
PCA 기반 feature 기여도 bar chart |
def health_radar_chart(quality_scores: dict, ml_readiness: ReadinessScore) -> plt.Figure:
"""
6축 방사형 차트:
- Completeness (결측 기반)
- Consistency (타입 일관성)
- Outlier Freedom (1 - 이상치 비율)
- Distribution Health (정규성/대칭성)
- Correlation Health (다중공선성 없음 정도)
- Duplicate Freedom (1 - 중복률)
중앙에 종합 점수 표시, 각 축에 0~100 스케일.
"""Advanced 서브탭에 2개 신규 탭 추가:
[Basic] [Distribution+] [Correlation+] [Clustering] [Dim. Reduction]
[Feature Insights] [Anomaly+] [Stat Tests] [Cross Analysis ★] [Data Profile ★]
Cross Analysis 탭은 Phase 2의 6개 교차 분석을 포함:
Cross Analysis
├── Outlier × Cluster Distribution
├── Missing × Correlation (MAR Detection)
├── Distribution × Outlier Method Fitness
├── Cluster × Correlation (Simpson's Paradox Check)
├── Feature Importance × Missing Rate
└── Unified 2D Embedding (t-SNE/UMAP + Cluster + Anomaly overlay)
Data Profile 탭은 기존 7카드 → 풍부한 대시보드:
Data Profile ★ (Enhanced)
├── Overview Cards (확장)
├── Column Roles Table (신규)
├── ML Readiness Dashboard (신규)
│ ├── Radar Chart (6 dimensions)
│ ├── Score & Grade
│ ├── Blocking Issues
│ └── Suggestions
├── Health Radar Chart (신규)
├── Type Distribution Donut (신규)
├── Memory Breakdown Chart (신규)
└── Sample Data Preview (신규)
위치: Basic 탭의 Overview 바로 아래 (모든 분석 섹션보다 앞)
Basic Tab
├── Overview
├── ★ Key Insights Panel ★ ← 신규 위치
│ ├── Executive Summary (1~2문장 총평)
│ ├── Critical Issues (접힘가능)
│ ├── Key Findings (접힘가능)
│ ├── Recommendations (접힘가능)
│ └── Opportunities (접힘가능)
├── Data Quality
├── Preprocessing
├── Descriptive Statistics
│ ...
Phase 1: Insight Engine ─────────────────────────┐
stats/insight_engine.py │
(depends on: 기존 모든 stats 결과) │
│
Phase 2: Cross Analysis ───────────────────────┐ │
stats/cross_analysis.py │ │
(depends on: clustering, anomaly, correlation,│ │
missing, feature_importance, dimreduction) │ │
│ │
Phase 3: Column Role ──────────────────────────┐│ │
stats/column_role.py ││ │
(depends on: schema, descriptive) ││ │
││ │
Phase 4: ML Readiness ─────────────────────────┤│ │
stats/ml_readiness.py ││ │
(depends on: quality, column_role, stats) ││ │
││ │
Phase 5: 기존 모듈 개선 ──────────────────────── ││ │
stats/statistical_tests.py (패치) ││ │
stats/quality.py (패치) ││ │
││ │
Phase 6: 시각화 확장 ── ─────────────────────── ┤│ │
viz/insight_plots.py ││ │
viz/cross_plots.py ││ │
viz/dimreduction_plots.py ││ │
↓↓ ↓
Phase 7: 통합 ──────────────────────────────────────┘
core/config.py (토글 추가)
core/analyzer.py (새 모듈 호출 + VizResult 확장)
report/generator.py (인사이트 패널, 교차분석 섹션, Data Profile 강화, 누락 차트)
report/i18n.py (번역 키 추가)
병렬 가능: Phase 1·2·3은 서로 독립적으로 구현 가능 순차 필수: Phase 4(ML Readiness)는 Phase 3(Column Role) 완료 후 시작 최종 통합: Phase 7은 모든 모듈 완성 후
| 필요 기능 | 패키지 | 필수여부 | 비고 |
|---|---|---|---|
| FDR 보정 | scipy.stats (이미 있음) |
이미 설치 | scipy.stats.false_discovery_control 또는 직접 Benjamini-Hochberg 구현 |
| 효과 크기 계산 | 직접 구현 | 새 코드 | Cohen's d, η², rank-biserial r — 수식이 단순하므로 외부 패키지 불필요 |
| Radar chart | matplotlib (이미 있음) |
이미 설치 | polar projection subplot으로 구현 |
| Donut chart | matplotlib (이미 있음) |
이미 설치 | pie() with wedgeprops |
| 교차분석 | numpy, pandas, scipy (이미 있음) |
이미 설치 | 기존 의존성만으로 충분 |
결론: 새로운 외부 패키지 추가 불필요. 기존 scipy + numpy + pandas + matplotlib + sklearn으로 100% 구현 가능.
| 신규 분석 | 복잡도 | 대응 전략 |
|---|---|---|
| Insight Engine | O(1) — 이미 계산된 결과에서 규칙 적용 | 규칙 평가는 마이크로초 단위, 성능 무관 |
| Cross Analysis: 결측×상관 | O(n·d) | 기존 결측 분석 + 상관 결과 재활용 |
| Cross Analysis: Simpson's Paradox | O(k·d²) per cluster | k=max(10), d=max(15) → 무시 가능 |
| Column Role Classification | O(d) | 컬럼 수만큼, 룰 기반이므로 즉시 |
| ML Readiness | O(1) | 이미 계산된 통계량 조합 |
| Health Radar | O(1) | 단일 차트 렌더링 |
| 누락 차트 등록 | 기존과 동일 | 이미 VizResult에 존재하는 것을 등록만 |
총 추가 분석 시간 예측: 기존 Advanced 분석 대비 +5~10% 이내 (대부분 기존 결과 재활용)
| 카테고리 | Before (현재) | After (Enhancement) | 변화 |
|---|---|---|---|
| 자동 인사이트 | 0 | 4타입 × |
신규 |
| 교차 분석 | 0 | 6종 교차 분석 | 신규 |
| 컬럼 역할 분류 | 0 (타입만 추론) | 9종 역할 자동 분류 | 신규 |
| ML 준비도 | 0 | 6차원 평가 + 등급 + blocking issues | 신규 |
| 통계 검정 엄밀성 | p-value만 | + 효과 크기 + 다중검정 보정 | +200% |
| Data Profile | 7 카드 | 종합 대시보드 (7섹션) | +700% |
| 시각화 | 30+ 차트 | +15종 추가 | +50% |
| 보고서 섹션 | 21 섹션 | +2 탭 (Cross Analysis, Data Profile 강화) | +10% |
| 사용자 질문 | Before | After |
|---|---|---|
| "이 데이터에서 뭐가 중요해?" | 직접 표/차트 해석 | 자동 인사이트 → 핵심 발견 즉시 파악 |
| "ML에 바로 쓸 수 있어?" | 품질 점수만 참고 | ML Readiness 등급 + blocking issues 목록 |
| "이상치가 특정 그룹에 집중되나?" | 개별 이상치/클러스터 결과 따로 확인 | 교차분석 → 군집별 이상치 분포 한눈에 |
| "결측이 무작위인가?" | 결측률만 표시 | 결측×상관 분석 → MAR/MCAR 자동 진단 |
| "어떤 전처리가 필요해?" | 경고 목록 참고 | 인사이트 엔진 → 구체적 조치 항목 목록 |
| "Simpson's paradox는 없나?" | 확인 불가 | 교차분석 → 자동 탐지 + 시각화 |
| 기능 | pandas-profiling | sweetviz | f2a v1 (현재) | f2a v2 (Enhancement) |
|---|---|---|---|---|
| 기술 통계 | ★★★★ | ★★★ | ★★★★★ | ★★★★★ |
| 분포 분석 | ★★★ | ★★★ | ★★★★★ | ★★★★★ |
| 상관 분석 | ★★★ | ★★★★ | ★★★★★ | ★★★★★ |
| 이상치 탐지 | ★★ | ★★ | ★★★★★ | ★★★★★ |
| 클러스터링 | ✗ | ✗ | ★★★★ | ★★★★ |
| 차원축소 | ✗ | ✗ | ★★★★ | ★★★★★ |
| 교차분석 | ✗ | ✗ | ✗ | ★★★★ |
| 자동 인사이트 | ★★ | ★★★ | ✗ | ★★★★★ |
| ML 준비도 | ✗ | ✗ | ✗ | ★★★★ |
| 컬럼 역할 분류 | ✗ | ✗ | ✗ | ★★★★ |
| 통계 검정 엄밀성 | ★★ | ★ | ★★★ | ★★★★★ |
| i18n | ✗ | ✗ | ★★★★★ | ★★★★★ |
| HuggingFace 지원 | ✗ | ✗ | ★★★★★ | ★★★★★ |
| # | 파일 | 동작 | 예상 LOC | 의존성 |
|---|---|---|---|---|
| 1 | stats/insight_engine.py |
신규 | ~500 | StatsResult, DataSchema |
| 2 | stats/cross_analysis.py |
신규 | ~450 | numpy, pandas, scipy |
| 3 | stats/column_role.py |
신규 | ~250 | schema, descriptive stats |
| 4 | stats/ml_readiness.py |
신규 | ~350 | quality, column_role, StatsResult |
| 5 | stats/statistical_tests.py |
수정 | +~120 | scipy.stats |
| 6 | stats/quality.py |
수정 | +~80 | pandas |
| 7 | viz/insight_plots.py |
신규 | ~300 | matplotlib |
| 8 | viz/cross_plots.py |
신규 | ~350 | matplotlib, numpy |
| 9 | viz/dimreduction_plots.py |
신규 | ~200 | matplotlib |
| 10 | core/config.py |
수정 | +~30 | — |
| 11 | core/analyzer.py |
수정 | +~200 | 새 모듈 import |
| 12 | report/generator.py |
수정 | +~400 | HTML/CSS/JS |
| 13 | report/i18n.py |
수정 | +~200 | — |
| 합계 | ~3,430 LOC |
| 검증 항목 | 방법 | 기준 |
|---|---|---|
| 인사이트 품질 | 합성 데이터(정규/비정규/결측/이상치) + lerobot/roboturk 실데이터 | 알려진 패턴이 인사이트로 탐지되는지 |
| 교차분석 정확성 | Simpson's paradox 합성 데이터 | 반전 탐지 100% |
| ML 준비도 유효성 | 품질 좋은/나쁜 데이터셋 대비 | 점수 차이가 직관과 일치 |
| 통계 검정 보정 | 시뮬레이션(H0 하 1000회) | FDR ≤ 0.05 |
| 기존 테스트 통과 | pytest git_action/tests/ |
전체 통과 |
| HTML 렌더링 | 생성된 리포트 브라우저 확인 | 모든 섹션 올바르게 표시 |
| 성능 | 10만행 × 50컬럼 | 전체 분석 < 120초 |
이 계획은 f2a를 단순 통계 리포트 생성기에서 인텔리전트 데이터 분석 엔진으로 진화시키기 위한 로드맵이다. 모든 추가 기능은 학술적 근거 위에 실무적 가치를 제공하며, 기존 의존성만으로 구현 가능하다.