All posts

Purdue · Data visualization

Building 20 points apart for Purdue's data challenge

The result changed when we asked which opponents the dataset actually covered. That check became part of the visualization.

I'm preparing an entry for Purdue's Boiler Up, Hammer Data Challenge. Students use a shared NCAA women's basketball dataset to create a public visualization. Purdue's student winner can advance to the Big Ten Academic Alliance Data Viz Championship.

My project, 20 points apart, follows score margins across 21 seasons. In the recorded nonconference games, the share decided by at least 20 points rose from 31.3% in 2005–08 to 44.1% in 2023–26. The size of that increase depends on which opponents we include.

Changing the question

The first version compared the AP and Coaches polls. It gave us a straightforward chart, but the overlap between two rankings left little to explore. I also wasn't satisfied with the site's presentation, so I asked for a second version.

We switched to game results and a question a reader could investigate: have large winning margins become more common? Separating conference and nonconference games gave the comparison more context. Conference games come from a different scheduling structure, and combining the two groups would hide that distinction.

Defining the sample

The supplied games.parquet file contained 114,705 records. We kept completed final games with positive, unequal scores, then filtered to games marked as regular season. Some March conference tournament games carried that regular-season label, so we used the same November-through-February window every year.

That left 101,730 recorded games from 2005–06 through 2025–26. It also excluded genuine regular-season games outside the window. The resulting sample is a consistent calendar comparison; it does not establish that the source contains every NCAA game.

For each game, the margin is the absolute difference between the two scores. The analysis groups games by season and the source's conference flag, then counts margins of at least 10, 20, and 30 points. The opening comparison pools three early seasons and three recent seasons to reduce dependence on one year.

Checking opponent coverage

The initial 20-point comparison showed an increase of 12.8 percentage points in nonconference games. Before treating that as the whole finding, we checked how much the opponent sample mattered.

The second view includes a game only when both teams have at least five recorded conference games that season. That is a schedule-based coverage check. It is not an official Division I classification, and it cannot correct every change in the dataset.

With that filter, the nonconference share rises from 29.9% to 36.3%, an increase of 6.4 percentage points. The upward pattern survives, while the estimated increase becomes smaller. Conference games show a more modest change: 20.5% to 22.9% in the full sample, with an 11-point median margin in both windows.

Those comparisons describe recorded outcomes. They do not tell us whether recruiting, budgets, scheduling, or any other factor caused the change.

Letting readers inspect the result

The page opens with the comparison, then lets readers change the margin threshold and opponent filter. A season-by-season chart shows whether the pooled endpoints conceal a different path. The latest-season explorer lets readers choose a team and inspect its scorelines, with Purdue selected initially.

We built the charts with JavaScript and SVG, and used Python to produce the data behind them. The article is rendered in HTML before the interactive controls load. That keeps the explanation readable while the charts initialize and gives search engines actual page content to index.

I used AI assistance for the analysis, implementation, and editing, including the revision from the first version. I've published the analysis script, chart source, derived data, and methodology on GitHub so readers can examine the choices and reproduce the exports from the supplied file.

Preparing the entry

The visualization now lives on my own site, alongside this account of how it was built. The competition entry has not been submitted. Purdue's posted deadline is December 11, 2026, at 11:59 p.m.; the showcase is January 22, 2027.

Before submission, I'll review the page and its explanation together. The coverage check is central to the story, so it needs to remain visible wherever the headline result appears.