Fjelstul Worldcup R Package Online
But the deep story isn't about the data. It's about what people did with it.
The data frame matches became legendary. Then cards . Then goals . Then substitutions . Then penalty_shootouts . Each one a layer of geological time, preserving the sediment of football history: Miroslav Klose's 16 goals, the phantom "goal" of 1966, the 2002 South Korea run that statisticians still argue about. fjelstul worldcup r package
By 2020, the package had grown legs. Users on GitHub began opening issues: "Hey, the corner kick count for 1962 seems off." "Can you add referee nationalities?" "What about penalty shootout sequences?" Joshua didn't just fix them. He traced each correction back to a primary source—a grainy YouTube video of a black-and-white broadcast, a scanned Italian sports newspaper from 1934, a handwritten match report from the Uruguayan Football Association. But the deep story isn't about the data
A journalist used fjelstul to prove that red cards were 40% more likely in knockout matches when the referee was from a nation with a colonial history over one of the teams. A high school teacher in Brazil taught probability using the distribution of hat-tricks. A data artist made a sonification of every World Cup goal—each country assigned a musical note, each tournament a movement. Then cards
It was 3:00 AM in Oslo, but Joshua Fjelstul wasn't sleeping. He was staring at a spreadsheet that had grown like a cancerous vine across his screen: 52 columns wide, 70,000 rows deep. It was the complete history of every foul, every offside call, every yellow card, and every substituted player in every FIFA World Cup match since 1930.
The problem started simply enough. He was a PhD student researching European legal integration, but the 2018 World Cup had just ended. France had beaten Croatia 4-2. And like millions of others, Joshua found himself arguing with a friend: "Who actually committed the most fouls in a single final?" The official FIFA records were PDFs. Broken links. Inconsistent languages. One year, they tracked "dangerous play"; the next, they switched to "unsporting behavior."
He didn't sue. He didn't tweet. He just updated the package to version 2.0.0, adding a new dataset: officiating_decisions_with_context .