skills/visualization-choice-reporting/SKILL.md
Matches visualization types to data questions and creates narrated reports that highlight insights and recommend actions. Covers chart selection (comparison, trend, distribution, relationship, composition, geographic), perceptual best practices, and narrative reporting (headline, pattern, context, meaning, action). Use when analyzing data for patterns, building dashboards, presenting metrics, monitoring KPIs, or when user mentions "visualize this", "what chart should I use", "create a dashboard", "analyze this data", "show trends", "report on".
npx skillsauth add lyndonkl/claude visualization-choice-reportingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Copy this checklist and track your progress:
Visualization Choice & Reporting Progress:
- [ ] Step 1: Clarify question and profile data
- [ ] Step 2: Select visualization type
- [ ] Step 3: Design effective chart
- [ ] Step 4: Narrate insights and actions
- [ ] Step 5: Validate and deliver
Step 1: Clarify question and profile data
Define the question you're answering (What's the trend? How do X and Y compare? What's the distribution? What drives Z? What's the composition?). Profile your data: type (categorical, numerical, temporal, geospatial), granularity (daily, user-level, aggregated), size (10 rows, 10K, 10M), dimensions (1D, 2D, multivariate). See Question-Data Profiling.
Step 2: Select visualization type
Match question type to chart family using Chart Selection Guide. Consider data size (small → tables, medium → standard charts, large → heatmaps/binned), number of series (1-3 → standard, 4-10 → small multiples, 10+ → interactive/aggregated), and audience expertise (executives → simple with insights, analysts → detailed exploration).
Step 3: Design effective chart
For simple cases → Apply Design Checklist (clear title, labeled axes, legend if needed, annotations, accessible colors). For complex cases (multivariate, dashboards, interactive) → Study resources/methodology.md for advanced techniques (small multiples, layered charts, dashboard layout, interaction patterns).
Step 4: Narrate insights and actions
Lead with insight headline ("Revenue up 30% YoY driven by Enterprise segment"), annotate key patterns (arrows, labels, shading), provide context (vs benchmark, target, previous), interpret meaning ("Suggests product-market fit in Enterprise"), recommend actions ("Double down on Enterprise sales hiring"). See Narrative Framework.
Step 5: Validate and deliver
Self-assess using resources/evaluators/rubric_visualization_choice_reporting.json. Check: Does chart answer the question clearly? Are insights obvious at a glance? Are next actions clear? Create visualization-choice-reporting.md with question, data summary, visualization spec, narrative, and actions. See Delivery Format.
Question Types → Chart Families
| Question Type | Example | Primary Chart Families | |---------------|---------|------------------------| | Trend | How has X changed over time? | Line, area, sparkline, horizon | | Comparison | How do categories compare? | Bar (horizontal for names), column, dot plot, slope chart | | Distribution | What's the spread/frequency? | Histogram, box plot, violin, density plot | | Relationship | How do X and Y relate? | Scatter, bubble, connected scatter, hexbin | | Composition | What are the parts? | Treemap, pie/donut, stacked bar, waterfall, sankey | | Geographic | Where is it happening? | Choropleth, bubble map, flow map, dot map | | Hierarchical | What's the structure? | Tree, dendrogram, sunburst, circle packing | | Multivariate | How do many variables interact? | Small multiples, parallel coordinates, heatmap, SPLOM |
Data Type → Encoding Considerations
| Question Type | Chart Types | When to Use | |---------------|-------------|-------------| | Comparison | Bar (horizontal), Column, Grouped bar, Dot plot, Slope chart | Categorical → Numerical. Horizontal bar for long names/ranking. Grouped for 2-3 metrics. Slope for before/after. | | Trend | Line, Area, Sparkline, Step, Candlestick | Time → Numerical. Line for continuous trends. Area for cumulative/part-to-whole. Sparkline for inline. Step for discrete changes. | | Distribution | Histogram, Box plot, Violin, Density plot | Numerical → Frequency. Histogram for shape/outliers. Box for quartiles across groups. Violin for full density. | | Relationship | Scatter, Bubble, Hexbin, Connected scatter | Numerical X → Numerical Y. Scatter for correlation. Bubble for 3rd/4th variable (size/color). Hexbin for dense data. | | Composition | Treemap, Pie/Donut, Stacked bar (100%), Waterfall, Sankey | Parts of whole. Treemap for hierarchy. Pie for 2-5 categories (part-to-whole key). Waterfall for cumulative. Sankey for flow. | | Geographic | Choropleth, Bubble map, Flow map | Spatial patterns. Choropleth for regions. Bubble for precise locations. Flow for origin-destination. | | Multivariate | Small multiples, Heatmap, Parallel coordinates | Many variables. Small multiples for consistent comparison. Heatmap for matrix (time×day). Parallel for dimensions. |
Essential Elements
Perceptual Best Practices
Declutter
Accessibility
Structure: Headline → Pattern → Context → Meaning → Action
1. Headline (one sentence, insight-first):
2. Pattern (what do you see?):
3. Context (compared to what?):
4. Meaning (why does it matter?):
5. Action (what should we do?):
Example Full Narrative:
Headline: Enterprise revenue up 120% YoY while SMB declined 10%, resulting in overall 30% growth.
Pattern: Revenue grew from $2M/month (Q1) to $2.6M (Q4). Enterprise segment contributed $1.5M in Q4 (up from $680K in Q1), while SMB dropped from $1.3M to $1.1M.
Context: Total revenue 15% above plan. Enterprise growth (120%) far exceeds industry average (25%). SMB churn rate doubled from 5% to 10% in Q3-Q4.
Meaning: Strong product-market fit in Enterprise; SMB pricing or feature set may be misaligned. Enterprise is now 58% of revenue vs 34% in Q1, reducing diversification.
Actions:
- Prioritize: Hire 2 Enterprise AEs for Q1, double down on Enterprise playbook
- Fix: Launch SMB annual plans (Q1) to reduce churn; interview churned SMB customers to identify gaps
- Monitor: Enterprise win rate, SMB churn by plan type, revenue concentration risk
Create visualization-choice-reporting.md with these sections:
1. Question: The question you're answering with data (e.g., "How has revenue trended over the past year?")
2. Data Summary: Source, time period, granularity, dimensions, size (e.g., "Analytics DB, Jan-Dec 2024, monthly, revenue by segment, 24 rows")
3. Visualization:
4. Narrative: (Headline → Pattern → Context → Meaning → Action structure from above)
5. Validation: Self-check with rubric (Clarity ✓, Accuracy ✓, Insight ✓, Actionability ✓, Accessibility ✓)
6. Appendix (optional): Raw data, alternatives considered, statistical tests, assumptions
See resources/template.md for full template with examples.
Chart Selection Errors
❌ Pie chart for >5 categories: Hard to compare angles accurately ✓ Use horizontal bar chart: Position on common scale is more accurate
❌ Line chart for categorical data: Implies continuity that doesn't exist (e.g., revenue by product) ✓ Use bar chart: Discrete categories
❌ 3D charts: Perspective distorts values, adds no information ✓ Use 2D with color/size: Clearer, more accurate
Design Mistakes
❌ Y-axis doesn't start at zero (bar chart): Exaggerates differences ✓ Start at zero for bar/column: Accurate visual proportion
❌ Dual Y-axes with different scales: Misleading correlations ✓ Use small multiples or index to 100: Compare shapes, not scales
❌ Rainbow color scheme: Not colorblind-safe, no perceptual ordering ✓ Sequential (light→dark) or diverging (blue→white→red) palette
Narrative Failures
❌ Title: "Revenue by Month": Descriptive, not insightful ✓ "Revenue up 30% YoY, driven by Enterprise": Insight-first
❌ No context: "Revenue is $2.6M" (vs what?) ✓ Add benchmark: "Revenue $2.6M, 15% above $2.25M target"
❌ Pattern without meaning: "Revenue increased" (so what?) ✓ Interpret: "Revenue up 30%, suggests Enterprise product-market fit, informs 2025 hiring plan"
❌ No actions: Ends with "interesting pattern" ✓ Recommend: "Hire 2 Enterprise AEs, investigate SMB churn"
Further reading:
testing
Cluster a conference's event records into a small set of coarse themes with finer sub-clusters, an explicit outlier bucket, and soft (multi-membership) affinities — using the hybrid embed-then-label pipeline (embed abstracts, reduce, density-cluster, then LLM-label the clusters) when embedding libraries are available, and an LLM-reasoned hierarchical fallback when they are not. Embeddings do the grouping; the LLM only names the groups. Conference-agnostic. Use when turning structured event records into a navigable theme map for preference elicitation and scheduling, when you need 6-8 reasonable themes rather than 20 muddy ones, or when overlapping talks must belong to more than one theme. Trigger keywords - theme clustering, cluster talks, embed then label, soft membership, outlier talks, conference themes, topic map.
development
Build a personal conference schedule as a constraint-optimization problem — hard constraints (no time overlap, room-to-room travel time, capacity/registration, the attendee's own must-attends and blackouts) plus a user-owned weighted objective trading interest against breadth, pacing (maximize contiguous free time), and serendipity. Surfaces unbreakable conflicts (two high-value overlapping talks the model cannot rank) as decisions for the human rather than silently picking, and reports what each choice traded away. Conference-agnostic. Use to turn a preference profile plus a theme map into a day-by-day plan, to resolve overlapping sessions, or to balance a packed vs paced schedule. Trigger keywords - schedule optimization, conference schedule, constraint optimization, overlapping talks, contiguous free time, conflict surfacing, packed vs paced.
development
Parse a heterogeneous conference program (markdown, HTML, PDF-derived text, or JSON) into normalized event records with per-field confidence scores and independent classification axes (topic, depth, format, prerequisites, recorded, capacity). Detects the program's format before extracting, treats every inferred field as uncertain (present vs inferred vs missing), and flags thin or missing abstracts so downstream enrichment can target them. Conference-agnostic. Use when ingesting a conference or event schedule into a structured store, normalizing a talk/session list, or extracting per-session metadata with calibrated confidence. Trigger keywords - program ingestion, parse schedule, session extraction, event records, conference program, talk metadata, per-field confidence.
development
Build a personalized preference profile from a small number of well-chosen, cluster-grounded questions instead of a long survey. Represents the person's interests as an uncertainty region over the theme map, picks the single highest-information-gain choice-based question (contrasting real talks from different clusters), balances exploiting known interests against exploring uncertain ones, deliberately injects outlier probes to fight selection bias, and stops as soon as the schedule would be stable. Also elicits the user-owned objective weights and hard constraints. Interactive — runs where it can actually ask the person. Conference-agnostic. Use to turn a theme map into a preference profile, to decide what to ask a conference attendee, or to elicit scheduling priorities. Trigger keywords - preference elicitation, ask few questions, information gain, choice-based questions, selection bias probe, objective weights, attendee preferences.