EDA Playbook — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited EDA Playbook (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Skipping EDA before modeling is the single most common source of silent failures in ML pipelines: leakage that makes offline metrics fictional, structural missingness treated as random, a target definition nobody actually agreed on. This playbook is a fixed-order audit that surfaces those problems while they cost hours instead of quarters - and its output is a decision log, not a pile of plots.
Run the sections in order: schema problems invalidate the target analysis, and the target definition must be pinned before any feature-target relationship means anything.
A compact audit that produces the whole table at once:
audit = pd.DataFrame({
"dtype": df.dtypes.astype(str),
"null_pct": (df.isna().mean() * 100).round(1),
"nunique": df.nunique(),
"modal_pct": (df.apply(lambda c: c.value_counts(normalize=True).iloc[0]) * 100).round(1),
})
print(audit.to_string())Example output on a 5,000-row churn extract:
dtype null_pct nunique modal_pct
age float64 0.0 62 2.1
plan str 0.0 3 84.7
last_invoice_amt float64 30.5 3475 0.0
acct_flag float64 0.0 1 100.0
churned int64 0.0 2 92.4Read it: last_invoice_amt at 30.5% null crosses the 20% line - decision required; acct_flag is a single constant value - near-zero variance, flag it; plan is 84.7% one value - usable but weak.
Profile independently before studying interactions:
Random and structural missingness require different treatment, so diagnose before imputing:
df.isna().corr()). Columns missing together (correlation near 1.0) indicate a pipeline branch or a form version - investigate the source, do not impute across the break.Correlation with the target is useful; near-perfect correlation is an alarm:
EDA output is only valuable if it drives decisions. For each flagged issue record: the finding, the decision (drop / impute / transform / flag / investigate upstream), and the rationale - not just the outcome. Treat the log as living; update it when modeling reveals new issues.
EDA DECISION LOG - [FILL: dataset] - [FILL: analyst]
Grain: one row = [FILL] Rows: [FILL] (expected: [FILL])
Target: [FILL: verbatim definition, window, measurement time]
Prediction-time inventory: [FILL: columns known at prediction time]
| # | Finding | Decision | Rationale |
|---|--------------------------------------|---------------------|----------------------------------|
| 1 | last_invoice_amt 30.5% null, | Impute 0 + missing | Nulls = never invoiced (free |
| | missing only where plan = free | indicator column | plan); structural, not random |
| 2 | acct_flag constant (1 value) | Drop | Zero variance, no signal |
| 3 | refund_amt r = 0.97 with churn | Drop - LEAKAGE | Populated after churn event |
| 4 | churned imbalance 12:1 | Stratify; use PR-AUC| Accuracy meaningless at 12:1 |Produce a written EDA summary containing: dataset health at a glance (rows, grain, schema surprises), the verbatim target definition, the top risks ranked, and the decision log with one row per flagged issue - finding, decision, rationale. This document, not the notebook, is what the modeling work builds on.
The EDA ships only when: every column appears in the audit table; every issue crossing a threshold (20% null, 98% modal, |r| > 0.95, 10:1 imbalance) has a logged decision with rationale; the target definition is written and confirmed; every timestamp feature is cleared against the prediction-time inventory; and a second analyst could act on the log without opening the notebook.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.