What Bulls fans were telling us between the games
I built a Python pipeline to turn thousands of public Reddit comments into structured evidence about sentiment, player narratives, leadership frustration, and the difference between live reaction and postgame reflection.
The question
Scores show what happened. I wanted to understand what fans kept believing, where patience broke, and when criticism shifted from players to the organization.
From raw threads to usable evidence
A reproducible pipeline turned raw discussion into structured, auditable evidence.
Collect
Pull public live-game and postgame Reddit threads through JSON-based scraping workflows.
Normalize
Unify comment fields, thread types, timestamps, game IDs, scores, and parent-child metadata.
Enrich
Add sentiment, intensity, player aliases, themes, profanity, emoji, negation, and sarcasm cues.
Aggregate
Build game summaries, theme counts, top comments, player profiles, and live-to-postgame shifts.
Interpret
Translate recurring patterns into audience, brand-trust, and organizational narrative insights.
Engineering decisions
Reviewable rules and modular scripts kept the analysis transparent and adaptable.
Built for traceability+
- Separate scripts for collection, cleanup, enrichment, and reporting
- Inspectable CSV outputs at each stage
- Player alias matching for nicknames and spelling variants
- Theme classification across team, leadership, and game topics
- VADER scoring paired with deterministic rules
Language-aware scoring+
Fan comments are messy by design. The enrichment layer accounted for negation, intensifiers, emojis, profanity, and sarcasm signals before producing game-level summaries.
→ unified comments
→ enriched comments
→ theme + player summaries
→ game-level insight
What the data made visible
The useful signal was the difference between temporary emotion and the narratives fans carried forward.
Live reaction and postgame meaning were different
Live threads captured sharper emotional swings. Postgame discussion provided a clearer view of the beliefs and frustrations that persisted.
Some frustration had moved beyond the court
Front-office language appeared in 250 detected theme mentions, showing that organizational direction had become part of the fan conversation.
Player narratives carried different kinds of weight
Mention frequency, framing, and sentiment helped separate future-facing belief, performance pressure, and signs of disengagement.
The organizational context
I reached out to a Chicago Bulls Senior Brand Manager on LinkedIn, then spoke with them over Zoom and by phone. Their 20+ years with the organization added valuable context to our conversation about fan trust and frustration with senior leadership.
The Bulls later made major front-office and roster changes. I do not claim this research influenced those decisions. The timing showed why social listening can matter as an early indicator of audience pressure.
Why the build matters
The result connects technical execution with the judgment needed to turn unstructured language into evidence a brand team can use.
Yes, I actually go to the games.
I spent a lot of that season at the United Center, sometimes in the 300 level and sometimes close enough to hear the bench. I was already noticing which players fans rallied behind, what changed the energy in the building, and which frustrations followed everyone home.
This project came from genuine curiosity about a team and fan base I was already invested in. What I saw in the data was also reflected in conversations with people I met and sat next to at the games.

And because I’m a branding person...
The Bulls’ primary logo has not changed since 1966. That is pretty incredible when you consider how often professional sports brands update their identities. Sometimes the smartest brand decision is knowing when not to change something.

