Data Storytelling & Presentation Guide
Transform raw analysis into compelling narratives that drive action. Includes presentation templates, data visualization best practices, executive summary frameworks, and the narrative structures that turn data findings into business decisions.
Key Features
- Narrative Frameworks — 5 story structures adapted for data presentations (Situation-Complication-Resolution, Pyramid, etc.)
- Slide Templates — 15+ presentation layouts for insights, recommendations, and quarterly reviews
- Chart Annotation Guide — how to add context, callouts, and narrative to every chart type
- Executive Summary Templates — one-page formats for C-suite audiences
- Audience Adaptation Matrix — tailor depth, language, and format to stakeholder type
- Anti-Patterns Gallery — 20 common data presentation mistakes with before/after fixes
- Color and Typography — accessible, professional defaults for presentations
Quick Start
- Identify your audience using
docs/audience-matrix.md - Choose a narrative structure from
docs/frameworks/ - Select slide templates from
templates/slides/ - Apply chart annotations using
docs/annotation-guide.md
Usage Examples
Narrative Framework: SCR (Situation-Complication-Resolution)
## Monthly Retention Review — March 2026
**Situation:** Our D30 retention has been stable at 42% for the past 6 months,
aligned with our category benchmark of 40-45%.
**Complication:** In the last 3 weeks, D30 retention dropped to 34%,
concentrated in the mobile web segment (-12pp) while native app retention
held steady. This coincides with the checkout flow redesign shipped Feb 28.
**Resolution:** We recommend reverting the mobile web checkout to the
previous version while A/B testing the new flow with a 10% holdout.
Expected recovery: 2-3 weeks. Revenue impact if unaddressed: ~$45K/month.
Python: Generating Annotated Charts
import statistics
def calculate_annotation_points(values: list[float],
labels: list[str]) -> list[dict]:
"""Identify key data points worth annotating in a presentation.
Highlights: maximum, minimum, largest change, and anomalies.
"""
annotations = []
max_idx = values.index(max(values))
min_idx = values.index(min(values))
annotations.append({
"index": max_idx, "label": labels[max_idx],
"value": values[max_idx], "type": "peak",
"note": f"Peak: {values[max_idx]:,.0f}",
})
annotations.append({
"index": min_idx, "label": labels[min_idx],
"value": values[min_idx], "type": "trough",
"note": f"Low point: {values[min_idx]:,.0f}",
})
# Find largest period-over-period change
changes = [values[i] - values[i-1] for i in range(1, len(values))]
max_change_idx = changes.index(max(changes, key=abs)) + 1
annotations.append({
"index": max_change_idx, "label": labels[max_change_idx],
"value": values[max_change_idx], "type": "change",
"note": f"Largest shift: {changes[max_change_idx-1]:+,.0f}",
})
return annotations
# Example usage
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
revenue = [120000, 135000, 128000, 142000, 155000, 148000]
points = calculate_annotation_points(revenue, months)
for p in points:
print(f" {p['label']}: {p['note']}")
SQL: Building Presentation-Ready Summary Tables
-- Executive summary table: KPIs with period comparison
SELECT
'Revenue' AS metric,
SUM(CASE WHEN period = 'current' THEN amount END) AS current_value,
SUM(CASE WHEN period = 'previous' THEN amount END) AS previous_value,
ROUND(
(SUM(CASE WHEN period = 'current' THEN amount END)
- SUM(CASE WHEN period = 'previous' THEN amount END))
/ NULLIF(SUM(CASE WHEN period = 'previous' THEN amount END), 0)
* 100, 1
) AS pct_change
FROM revenue_summary
UNION ALL
SELECT
'Active Users',
COUNT(DISTINCT CASE WHEN period = 'current' THEN user_id END),
COUNT(DISTINCT CASE WHEN period = 'previous' THEN user_id END),
ROUND(
(COUNT(DISTINCT CASE WHEN period = 'current' THEN user_id END)
- COUNT(DISTINCT CASE WHEN period = 'previous' THEN user_id END))
* 100.0
/ NULLIF(COUNT(DISTINCT CASE WHEN period = 'previous' THEN user_id END), 0),
1
)
FROM user_activity;
Audience Adaptation Matrix
| Audience | Depth | Format | Lead With | Avoid |
|---|---|---|---|---|
| C-Suite | High-level | 3-5 slides | Business impact ($) | Technical jargon |
| VP/Director | Summary + detail | 8-12 slides | Trends and recommendations | Raw data tables |
| Manager | Detailed | 10-15 slides | Actionable insights | Abstract strategy |
| Analyst peers | Full depth | Notebook or doc | Methodology and caveats | Over-simplification |
Best Practices
- Lead with the "so what" — state your conclusion on slide 1, then support it
- One message per chart — if a chart needs more than one sentence to explain, split it
- Annotate, don't decorate — every visual element must carry information
- Use the 3-minute rule — if you can't explain a slide in 3 minutes, it's too complex
- End with a clear ask — every presentation should close with a specific recommendation and next step
- Test with one person first — present to a colleague before the stakeholder meeting
Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
| Audience disengaged | Too much data, no narrative | Restructure with SCR framework; cut 50% of slides |
| "What should we do?" after presenting | Analysis without recommendation | Always end with a specific action and expected outcome |
| Stakeholders question your numbers | No methodology context | Add a brief "How we measured this" appendix slide |
| Charts look cluttered | Too many series or data points | Aggregate, filter to top N, or use small multiples |
This is 1 of 11 resources in the Data Analyst Toolkit toolkit. Get the complete [Data Storytelling & Presentation Guide] with all files, templates, and documentation for $25.
Or grab the entire Data Analyst Toolkit bundle (11 products) for $129 — save 30%.
Top comments (0)