| name | data-analysis |
| description | Exploratory data analysis patterns -- profiling, distributions, correlations, segmentation, anomaly detection, and translating statistics into narrative insights |
| tier | standard |
| applyTo | **/*analy*,**/*eda*,**/*profile*,**/*statistic*,**/*correlat*,**/*outlier* |
Data Analysis
| Property | Value |
|---|
| Domain | Data Analytics |
| Category | Analysis & Insight Extraction |
| Trifecta | SKILL.md + data-analysis.instructions.md + analyze.prompt.md |
| Depends | data-visualization (chart output), data-ingest.cjs (ingestion) |
Overview
Turn raw data into actionable insight statements. This skill covers the full EDA pipeline: profiling the dataset, exploring distributions, finding correlations, detecting anomalies, and -- critically -- translating statistical findings into business-language narratives tagged with story intents for downstream visualization.
The cardinal rule: statistics are not insights. "Mean revenue is $4.2M" is a statistic. "Revenue grew 34% YoY but growth is decelerating -- Q3 peak was 8% vs. 22% last year" is an insight.
Module 1: Data Profiling
First pass on any dataset. Compute before exploring.
| Metric | What It Tells You | Red Flag |
|---|
| Row count | Dataset scale | <100 rows limits statistical power |
| Column count | Dimensionality | >50 columns suggests feature bloat |
| Null percentage | Data completeness | >20% nulls in key column = unreliable |
| Unique count | Cardinality | Unique count = row count → likely ID |
| Type inference | String/number/date/boolean | Mixed types in same column = dirty |
| Memory estimate | Processing feasibility | >500MB warns for browser context |
| Duplicate rows | Data quality | >1% duplicates needs dedup decision |
Profiling Output Template
Dataset: {name} ({rowCount} rows x {colCount} columns)
Source: {source} | Format: {format} | Encoding: {encoding}
Column Summary:
{name}: {type} | {nullPct}% null | {uniqueCount} unique | min={min} max={max} mean={mean}
...
Quality Score: {score}/100
- Completeness: {completeness}% (columns with <5% nulls)
- Consistency: {consistency}% (columns with single type)
- Uniqueness: {uniqueness}% (no unexpected duplicates)
Warnings:
- Column "X" has 23% nulls -- consider imputation or exclusion
- Column "Y" has mixed types (78% number, 22% string) -- needs cleaning
Module 2: Descriptive Statistics
What to compute first for every numeric column.
| Statistic | When It Matters |
|---|
| Mean vs. Median | If mean >> median, right-skewed (outliers pull up) |
| Standard Dev | Spread -- is the data tight or dispersed? |
| Min / Max | Range -- any impossible values? |
| Percentiles | P25, P50, P75 -- where does the bulk sit? |
| Skewness | >1 or <-1 suggests non-normal distribution |
| Kurtosis | >3 = heavy tails (more outliers than expected) |
Rule of Thumb: Mean vs. Median
- If
|mean - median| / median > 0.1 (10%), report median as the "typical" value
- Always report both -- the gap itself is an insight
Module 3: Distribution Analysis
| Shape | What It Suggests | Story Intent |
|---|
| Normal | Stable process, predictable | Distribution |
| Right-skewed | Many small values, few large (income) | Deviation |
| Left-skewed | Most values high, some low (test scores) | Deviation |
| Bimodal | Two populations mixed together | Compare (groups) |
| Uniform | No pattern -- random or categorical codes | None (check) |
| Power law | Few items dominate (Pareto, web traffic) | Part-to-Whole |
Normality Quick Check
- Compare mean to median (>10% gap = non-normal)
- Check skewness (|skew| > 1 = non-normal)
- If important: Shapiro-Wilk test (n < 5000) or Anderson-Darling
Module 4: Correlation & Relationship
| Strength | |r| Range | Interpretation |
| -------- | ----------- | --------------------------- |
| Strong | 0.7 -- 1.0 | Likely meaningful |
| Moderate | 0.4 -- 0.7 | Worth investigating |
| Weak | 0.1 -- 0.4 | Unlikely actionable alone |
| None | < 0.1 | No linear relationship |
Simpson's Paradox Awareness
Always check: does the correlation reverse when you split by a categorical variable?
Overall: Ad spend positively correlates with sales (+0.6)
By region: In 3 of 4 regions, correlation is NEGATIVE
Cause: High-spend region has higher baseline sales (confound)
Rule: If a strong correlation exists, segment by the top 2-3 categorical variables and re-check.
Module 5: Segmentation
Group-by patterns for discovering sub-populations.
| Technique | When to Use | Output |
|---|
| Group-by aggregate | Categorical × numeric | Segment averages |
| Percentile buckets | Continuous variable, create tiers | Low/Mid/High |
| RFM analysis | Customer behavior (recency, freq, $) | Customer segments |
| Cohort analysis | Time-based grouping (signup month) | Retention curves |
| Cross-tabulation | Two categorical variables | Contingency table |
"So What?" for Segments
For each segment found, answer: "If I could only act on ONE segment, which one and why?"
Module 6: Time-Series Decomposition
| Component | What It Is | Detection |
|---|
| Trend | Long-term direction | Rolling average (window = period) |
| Seasonality | Repeating pattern at fixed intervals | Autocorrelation at lag = period |
| Residual | What's left (noise + anomalies) | Original - trend - seasonality |
Rolling Average Windows
| Data Frequency | Window |
|---|
| Daily | 7 or 30 |
| Weekly | 4 or 13 |
| Monthly | 3 or 12 |
| Quarterly | 4 |
Module 7: Anomaly Detection
| Method | Best For | Threshold |
|---|
| Z-score | Normal-ish distributions | |
| IQR fence | Skewed distributions | < Q1-1.5×IQR or > Q3+1.5×IQR |
| Isolation | Multivariate outliers | Score > 0.7 (heuristic) |
| Visual | Any -- always plot first | Inspect scatter/box |
Anomaly Protocol
- Detect and flag -- never auto-remove
- Investigate: is it a data error, a real outlier, or a different population?
- Document the decision: kept (real), removed (error), or separated (sub-population)
Module 8: "So What?" Translation (DIKW)
The most important module. Convert statistics into business language.
| Level | Example (Bad) | Example (Good) |
|---|
| Data | "Column revenue has 5000 values" | (Don't report raw data) |
| Information | "Mean revenue is $4.2M" | "Average quarterly revenue is $4.2M across 8 quarters" |
| Knowledge | "Revenue has a positive trend" | "Revenue grew 34% YoY but growth rate decelerated from 22% to 8%" |
| Wisdom | (Requires domain context) | "Growth is decelerating -- if Q3 seasonal effect weakens, plan for flat" |
Insight Statement Template
[WHAT]: {metric} is {value/behavior}
[SO WHAT]: This means {business implication}
[NOW WHAT]: Consider {action or follow-up question}
[STORY INTENT]: {compare|trend|deviation|distribution|relationship|part-to-whole|flow|hierarchy|spatial}
[CHART]: {recommended chart type} because {rationale}
Example Insight Statements
[WHAT]: California's population (39M) is 5x the median state (7.5M)
[SO WHAT]: Resource allocation models using state averages will dramatically under-serve CA
[NOW WHAT]: Segment by population tier, not just state count
[STORY INTENT]: Compare
[CHART]: Horizontal bar (sorted descending) because ranking 50 items with long labels
[WHAT]: Support ticket resolution time has a bimodal distribution (peaks at 2h and 48h)
[SO WHAT]: Two distinct processes exist -- quick fixes and escalated investigations
[NOW WHAT]: Separate the two populations before setting SLA targets
[STORY INTENT]: Distribution
[CHART]: Histogram with two highlighted peaks, or violin plot for visual impact
Module 9: Hypothesis Framework
Structured approach to moving from observation to testable claim.
| Step | Action |
|---|
| Observe | Note a pattern in the data |
| Hypothesize | State a testable claim ("X causes Y because Z") |
| Test | Check against data (filter, segment, correlate) |
| Conclude | Supported, refuted, or inconclusive |
| Narrate | Write the finding as an insight statement |
Anti-Patterns
| Anti-Pattern | Problem | Fix |
|---|
| Reporting stats only | No business meaning | Always add "so what?" |
| Correlation = causation | Misleading conclusions | Check for confounders, state "correlates" |
| Ignoring base rates | Percentages without context | Always report denominator |
| Survivorship bias | Only analyzing what's visible | Ask "what's missing from this data?" |
| Over-aggregation | Hiding variation with averages | Show distribution, not just mean |
| Premature optimization | Jumping to solutions before understanding | Complete the EDA before recommending action |