Sports Visualization logo

Sports Visualization

Community
WalrusQuant
sports-visualization

Create honest sports-analysis figures from user-owned data, including distributions, rates, rating trajectories, calibration plots, and walk-forward metric comparisons. Use for exploration and communication.

Overview

PublisherWalrusQuant
Repositorysports-analytic-skills
Skill namesports-visualization
Stars
53
Forks
4
Bundled files
5
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 5 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by WalrusQuant on GitHub. Read the source before you install it.

Installation

Install the Sports Visualization AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/WalrusQuant/sports-analytic-skills/tree/main/skills/sports-visualization
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/WalrusQuant/sports-analytic-skills.git /tmp/sports-analytic-skills
mkdir -p .claude/skills
cp -r /tmp/sports-analytic-skills/skills/sports-visualization .claude/skills/sports-visualization
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Sports Visualization in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Sports Visualization on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Sports Visualization is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Sports Visualization

Outcome

Create the smallest reproducible figure that answers a defined question without exaggerating the evidence. Every important figure states its period, sample size, metric definition, grain, and relevant baseline. Add uncertainty when the claim depends on noisy differences.

This skill constructs figures. Use anti-slop-analytics for an independent keep/fix/kill review and results-reporting for the surrounding narrative.

When to use this skill

Use for exploratory distributions, coverage plots, model diagnostics, calibration, ratings and form trajectories, team or player comparisons, walk-forward results, and publication figures. Do not start with chart type: start with the question and the unit represented by each mark.

Required inputs

  • question and intended audience;
  • user-owned data or metrics artifact;
  • sport, competition, grain, natural key, and period;
  • relevant denominator, filters, and missing-data rules;
  • metric definition and direction;
  • comparison baseline and uncertainty artifact when applicable;
  • desired output path and reproduction context.

If the source is a screenshot or rounded report table, do not reconstruct precise data unless explicitly labeled approximate. Prefer the underlying table.

Workflow

  1. State the single claim or diagnostic question.
  2. Validate input grain, keys, columns, types, and duplicated events.
  3. Define what one mark, line, bar, or interval represents.
  4. Choose the smallest chart that makes the comparison direct.
  5. Add sport, population, period, denominator, units, and baseline.
  6. Check axes, transforms, aggregation, bins, smoothing, missingness, and ordering.
  7. Add uncertainty or fold spread if the claim compares noisy quantities.
  8. Export the image and preserve the plotting command or code.
  9. Write a one-sentence factual interpretation and one limitation.
  10. Run an anti-slop pass before using the figure in a public claim.

Plot selection catalog

QuestionPreferred figureEssential checks
What periods are covered?season/week coverage timelinemissing periods and schedule type
What is the outcome distribution?histogram, ECDF, or quantile plotbin sensitivity, units, ties/outliers
How does a rate change over time?line or dot plot with denominatorsvarying n, rule eras, full scale
Is there home advantage?home-row rate by season with intervalcorrect grain; do not use full doubled panel
How does form evolve?as-of line or small multiplesshifted window, gaps, unequal schedules
Is a probability reliable?reliability curve plus countsbins, reference diagonal, sample size
Where does a margin model miss?residual versus prediction/contextheteroskedasticity and outliers
How does rating evolve?as-of trajectory with selected labelsupdate timing, regression, inactive teams
Does a candidate beat a baseline?paired fold dots/bars or compact tablesame events/folds, metric direction
How stable is a ranking?ordered dots with intervals/rank distributionopportunity and schedule strength

Read references/plot_catalog.md when routing a question to a chart. Read references/honest_labels.md before finalizing titles, captions, annotations, and uncertainty language.

Encoding defaults

ComparisonPreferAvoid
Rates over seasonsline/dots or bars with ncropped “dramatic” axis
Candidate versus baselinepaired dots, common-scale bars, or tableseparate charts with different scales
Distributionhistogram/ECDF plus median or quantilesmean-only summary
Probabilitiesreliability curve and count panelpie chart or “lock” language
Rankingsordered dots or small multiplesrainbow spaghetti
Many teams over timeselected labeled series or faceted small multiplesunreadable 30-line legend
Two time seriesaligned panels or indexed comparisondual axes tuned for correlation
Effectspoint estimate and intervalstars without magnitude

For rates, the axis must show changes without manufacturing drama. Zero is not mandatory for every line plot, but any restricted range must be justified and clearly labeled. Bar length encodes magnitude and normally needs a meaningful zero.

Sports-specific caveats

  • Team-game panels often contain complementary home and away rows. A home-win figure should filter is_home == 1; state unique-game n.
  • Rolling features and ratings must be plotted as of the prediction timestamp, not after the event update.
  • Unequal games played, minutes, plate appearances, or attempts can make player and team rates incomparable. Show opportunity thresholds or uncertainty.
  • Schedule strength, postseason selection, neutral venues, overtime, ties, and rule changes can alter apparent trends.
  • Season facets may have different lengths and missing weeks. Do not connect discontinuous observations as though spacing were equal.
  • Calibration bins need event counts. A smooth-looking curve from small bins is not strong evidence.
  • Fold-level model charts must retain losing folds and compare the same held-out rows.

Honest title and caption template

text
Title: <quantity> by <comparison> — <sport/competition>, <period>
Subtitle/caption: n=<games/events/rows>; grain=<grain>; <metric definition>;
baseline=<reference>; uncertainty=<method or unknown>; exclusions=<important filters>.
Source: <artifact>; reproduce: <script/command>.

Use descriptive titles such as “Held-out log-loss by season” rather than conclusion titles such as “Model Dominates.” Put interpretation in the caption, bounded by the observed population.

Uncertainty and aggregation

  • Use intervals appropriate to the sampling/design assumptions; name the method.
  • When repeated teams, players, or games induce dependence, avoid pretending rows are independent. Consider grouped resampling or fold variation.
  • Distinguish an unweighted season mean, an event-weighted mean, and a pooled metric. Label whichever is plotted.
  • Do not invent error bars when only aggregate numbers exist. State uncertainty as unavailable and show the raw fold or season values.
  • Show both numerator and denominator for important rates when feasible.

Hard constraints and integrity rules

  1. Period and denominator appear on every key figure.
  2. Metric, units, sport, population, and grain are explicit when not obvious.
  3. A comparative claim includes its relevant baseline.
  4. Axes and transforms do not manufacture the effect.
  5. Dual-axis correlation theater is prohibited.
  6. Probabilities are displayed as uncertain quantities, not destiny.
  7. Training metrics are never labeled held-out or walk-forward.
  8. Losing folds, missing periods, and excluded groups are not silently removed.
  9. Every claim-bearing figure has a reproduction path.
  10. Unknown uncertainty is disclosed, not fabricated.

Anti-patterns

  • rainbow spaghetti with every team unlabeled;
  • decorative 3-D, pie, gradients, or gauges;
  • one hot streak presented as season truth;
  • a correlation heatmap without a question;
  • missing baseline in a model-comparison chart;
  • smoothed lines with no method or window;
  • in-sample fit presented as validation;
  • cropped axes used to magnify small home-field changes;
  • image exports with no source data or command.

Standalone helpers

Install pandas and matplotlib; Parquet also needs pyarrow or fastparquet. The table helpers accept user-owned CSV, Parquet, JSON, JSONL, or NDJSON.

For a team-game panel with is_home and point_diff:

bash
python <path-to-sports-visualization>/scripts/plot_home_margin_hist.py \
  --input games.csv --out home_margin.png

For a panel with season, is_home, and binary won:

bash
python <path-to-sports-visualization>/scripts/plot_home_win_rate.py \
  --input games.parquet --out home_rate.png

Column flags map alternate schemas. The home-win helper drops rows without an observed season/outcome, labels each season's eligible home-row denominator, uses a 0-to-1 rate scale, and displays 95% Wilson intervals. Those intervals treat eligible games as Bernoulli observations and do not account for broader season/team dependence.

For a JSON report containing a folds array, each row needs an explicit fold label, held-out denominator (n_test by default), and candidate and baseline metric fields:

bash
python <path-to-sports-visualization>/scripts/plot_walkforward_metrics.py \
  --json metrics.json \
  --fold-col fold \
  --metric logistic_log_loss \
  --baseline constant_log_loss \
  --out comparison.png

The helper rejects duplicate fold labels and missing/nonpositive denominators, but cannot verify that the two metric columns came from identical rows or derive sampling uncertainty from aggregate scores. Perform the row-identity check before plotting; its default title labels uncertainty unavailable.

Worked examples

Home win rate

Validate the panel is team-game grain, filter home rows, count unique contests, and show per-season rate with denominator. Caption the figure as “home rows only” and disclose ties or excluded games.

Walk-forward model comparison

Plot candidate and baseline on the same y-axis for every eligible fold. State that lower log-loss is better, retain folds where the candidate loses, and use a table instead if small differences are difficult to read honestly.

Team rating trajectories

Plot ratings recorded before each event update. Label a small number of relevant teams directly, mark long inactivity gaps, and avoid interpreting a rating line as causal player or coaching impact.

Output contract

Return the figure path, source artifact, plotting command/code, purpose, population and grain, period and denominator, metric/baseline, uncertainty method, important exclusions, one bounded interpretation, and remaining limits.

Resources

  • references/plot_catalog.md — read when choosing the visual form for a sports question.
  • references/honest_labels.md — read when writing titles, captions, denominators, and uncertainty notes.
  • scripts/plot_home_margin_hist.py — standalone home-margin distribution plot.
  • scripts/plot_home_win_rate.py — standalone home-win-rate plot.
  • scripts/plot_walkforward_metrics.py — standalone fold comparison plot.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Sports Visualization AI skill do?

Create honest sports-analysis figures from user-owned data, including distributions, rates, rating trajectories, calibration plots, and walk-forward metric comparisons. Use for exploration and communication.

Why use Sports Visualization on TypingMind?

Because you install it once and use it with any model. Sports Visualization is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Sports Visualization in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/WalrusQuant/sports-analytic-skills/tree/main/skills/sports-visualization. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Sports Visualization?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Sports Visualization?

As many as you like. As long as a model supports skills, you can use Sports Visualization with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Sports Visualization AI skill free?

Yes. It is published on GitHub by WalrusQuant under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇