Emma Peterson

Emma PetersonEmma PetersonEmma Peterson
Home
Portfolio
Passions
LinkedIn
Contact

Emma Peterson

Emma PetersonEmma PetersonEmma Peterson
Home
Portfolio
Passions
LinkedIn
Contact
More
  • Home
  • Portfolio
  • Passions
  • LinkedIn
  • Contact
  • Home
  • Portfolio
  • Passions
  • LinkedIn
  • Contact

Portfolio

Data work — from raw, scattered sources to decisions

This is where my data work lives. I'm drawn to the messy problems — the ones where the answer exists but it's buried across a dozen sources, in inconsistent formats, going stale by the day. I pull that data together, make it trustworthy, and turn it into something a business can act on.

What I do

Build the dataset when it doesn't exist. Scraping, pipelines, cleaning, normalization — turning a dozen incompatible sources into one you can actually query.

Keep it honest as it moves. Change tracking, history, and integrity checks, so you're reading a market shift and not a broken scrape.

Turn it into a call someone can make. Analysis, dashboards, and a recommendation with the tradeoffs named.

Automotive MARKET TRACKER — The Analysis

A competitive-intelligence platform for the automotive-repair industry

Built in my role at a B2B company to answer a question the team actually had: who owns which collision-repair shops, where, and which insurer networks accept them. No current source for that existed, so I built one — a Python platform tracking 5,300+ shops across 17 national operators, cross-referenced against insurance Direct Repair Programs (DRPs), that turns a market analysts used to map by hand into a live, queryable dataset flagging acquisitions, rebrands, and closures as they happen.

The business problem

The U.S. collision-repair industry is consolidating fast. Private-equity-backed operators are rolling up independent shops, large networks acquire and rebrand each other, underperforming locations quietly close, and insurers steer work toward shops inside their Direct Repair Programs. Anyone trying to read this market — a corporate-development team choosing where to acquire, an insurance network manager hunting coverage gaps, a supplier sizing up competitors — needs the same three answers: who owns what, where, and which insurer networks accept it?

Those answers live across 17+ corporate store-locators that each update on their own schedule, in their own format, and go stale the moment a shop changes hands. There was no single current source of truth, just a pile of websites and a lot of manual copying. The decisions riding on this picture — where to buy, build, or compete — are worth millions, and they were being made from lists that were out of date before the spreadsheet was finished.

What I built

I reverse-engineered each operator's authoritative data source — XML sitemaps, embedded page JSON, AJAX endpoints, per-state listings — and built 17 scrapers that run in parallel into a single historical database. Because every site is structured differently and several deploy anti-bot defenses, the platform does three things a one-off scraper doesn't:

  • It normalizes messy real-world data. Wildly inconsistent address formats — US and Canadian, line-break and route-numbered streets, zip codes with stripped leading zeros — get standardized, so the same shop is never counted twice.
  • It tracks change over time. Every shop carries a first-seen and last-seen date, and a fuzzy-matching diff engine catches renames, relocations, and network-tier changes between runs, then infers why a shop disappeared: genuine closure, rebrand, relocation, or migration to a sister brand.
  • It protects data integrity. Health checks refuse to record a wave of "closures" when a scrape looks broken, so a website redesign never gets mistaken for shops going out of business.

Where a site reliably blocks automation, I built a clean manual-refresh fallback instead of fighting it — a deliberate choice to keep the data honest rather than brittle.

Tools: Python, Playwright, requests / curl_cffi, rapidfuzz, SQLite, openpyxl.

What it shows

  • A live count of 5,300+ active locations and 690+ tracked closures, with full history on every shop — so an analyst can see which operators are actually adding locations, and read tier and ownership changes as early warning on M&A.
  • A cross-network DRP matrix showing which insurer programs accept each location — so an insurer can find metros where its network is thin against rivals and recruit shops to close the gap.
  • Closure-reason analysis that separates real closures from rebrands and intra-network migrations — so a shrinking shop count gets read correctly as consolidation, not decline.
  • Geographic overlap and state-coverage views — so an acquirer can spot where a competitor is weakest and time an entry before the market converges.

Impact

  • Replaces days of manual, locator-by-locator gathering per refresh with an unattended run of about five to ten minutes.
  • Surfaces acquisitions, rebrands, and closures within a single refresh cycle instead of months later in a trade publication.
  • Lets one analyst monitor the entire national landscape — 17 operators, thousands of shops — that would otherwise require ongoing manual tracking shop by shop.

Limitations

Counts reflect public store-locators, which can lag real-world openings and closings by a refresh cycle; one operator's anti-bot protection blocks automation reliably, so its data refreshes on a weekly manual cadence.

automotive MARKET TRACKER — The Dashboard

The scraper creates a locally viewable dashboard. This is intractable and can be used to export the results to excel for further data analysis.

This is the individual page for one of the consolidators. Here patterns within a particular company can be tracked.

"Closed Locations" is a subsection that can be viewed independently. It notes what, when, where, and why. This can easily be filtered in the output excel file.

Data exploration

"My whole life I have been a book worm. My childhood was filled with flashlights under the covers, desperate for one last chapter. As I aged I realized that love would never fade, just evolve. So I began keeping track of each book I read on assorted apps. One day I discovered Google Sheets and my obsession grew from there. Every book I've read since 2017 has been meticulously logged and tracked. 


I learned how to code and scrape websites so that my list could automatically update. For years I would sit down for hours a week to update my to read list and assorted important data, such as amazon rating, price, amount of reviews, etc. That monotonous task drove me to innovate and change. I learned how to use Tableau (a data visualization tool) to track the patterns in my reading habits. Many things can foster my passion but no matter how many times the seasons change, I will always return to my love of reading."

The Raw Spreadsheet

Investor Story & Growth Experiments

Original

Ziva's investor presentation buried a strong pitch under cluttered, text-heavy slides that were hard to follow — the kind of deck that loses a room before the idea lands.

Edited

Drawing on formal training in presentation design, I rebuilt the deck around a clear narrative — cutting clutter, tightening the messaging, and giving each slide one job. The reworked version holds attention long enough for the strength of the pitch to come through.

Social Media Impact

Beyond the deck, I designed and ran a test-and-learn social strategy to see what resonated with Ziva's audience. Engagement-focused campaigns drove a 131% increase in TikTok views and a 100% jump in profile visits — turning a quiet presence into measurable reach ahead of launch.

Explore more of Emma's Data visualization

Every Business Task is a Puzzle Worth Solving

Find out more

Copyright © 2026 Emma Peterson Portfolio - All Rights Reserved.

Powered by

This website uses cookies.

We use cookies to analyze website traffic and optimize your website experience. By accepting our use of cookies, your data will be aggregated with all other user data.

DeclineAccept