Staff Analyst turning messy data into decisions

I build the data pipelines, metrics and experiments behind faster month-end close and higher margin per sale at Angi.

Skyscraper skyline: a tall tower with setbacks and an antenna between two smaller buildings
The professional path

Resume, experience and the work behind the numbers.

Theme park: a Ferris wheel with a striped tent, a roller coaster and balloons
Just the fun stuff

Side projects and experiments from outside the day job.

Swipe or tap to pick a path

Jeff Mewhinney

Hi! I'm an analytics professional based in Fishers, IN. Since 2019 I've been working to deliver impactful analysis and tooling across commercial BI, paid search, experimentation, finance, sales, and customer care data. I like to wear a lot of hats and work cross-functionally because it unlocks the most impactful decisions.

Lately I have been leading the migration of our financial data to a lakehouse architecture, and building AI workflows that make it possible to support more functions than ever before. If you want a numbers person that gets a little obsessed with the ins and outs of your data: I'm your guy.

Hours saved per month via automation: about 400, up from 40, and increasing.

Analyst time spent on ad hoc requests: down from 80% to 30%, and decreasing.

Margin per sale impact: 37% more estimated margin per sale.

Resume

Bullets marked ! have a story.

Staff Analyst

Angi

Feb 2026 – Present

Indianapolis, IN

Senior Business Analyst

Angi

Feb 2022 – Feb 2026

  • Ad hoc work: about 80% to under 30%. Share of analyst time. Other factors also contributed.

Business Analyst II

Angi

Feb 2019 – Feb 2022

Commercial Strategy Intern, Clubs and Lounges

United Airlines

Sep 2017 – 2018

Chicago, IL

Staff Analyst with 8+ years building commercial BI for a B2B sales organization, spanning sales force effectiveness, channel performance, and customer acquisition reporting. Expert in Tableau and Looker with working knowledge of Power BI, backed by advanced SQL and Python. Trusted partner to sales, finance, and executive leaders, turning ambiguous business questions into dashboards and models that drive measurable revenue outcomes.

  • Tableau Development
  • SQL & Large Datasets
  • Sales Force Effectiveness
  • Channel Analytics
  • KPI Design & Governance
  • Commercial Data Translation
  • Stakeholder Partnership
  • Self-Serve BI

Visualization: Tableau, Looker, Power BI; Analytics: SQL, Python; Platforms: Snowflake, dbt, Lakehouse

Taylor University, Upland, IN. B.A. Business (Economics, Management & Marketing), May 2017.

Want to know more?

Hiring or building something with data? Email Jeff or find me on LinkedIn.

The pier

Three stops on the boardwalk: a sports quiz, a movie bracket and a Pokemon fix.

Do You Know Ball?

Live

Daily sports trivia. Guess the player from career stats.

Take a shot (Do You Know Ball?, opens in a new tab)

Movie Bracket

Pick actors or movies head to head, then compare your bracket with other voters.

In progress

Fixing Pokemon power creep

Newer Pokemon run stronger than old ones. I rebalanced every Pokemon, 1,214 counting forms and Megas, and tested 486 of them in 168,000 battles.

Go inside

No. 001 Jeff

Newer Pokemon tend to be stronger than older ones. As a Gen 1 child, I find that unacceptable and built a more level playing field.

scroll to see how

Before and after

Charizard

Charizard

Gen 1. Total stats 534 to 548, up 14.

  • HPHP Official78 Normalized80
  • AtkAtk Official84 Normalized86
  • DefDef Official78 Normalized80
  • SpASpA Official109 Normalized112
  • SpDSpD Official85 Normalized87
  • SpeSpe Official100 Normalized103
  • Total statsTotal stats Official534 Normalized548 (+14)
Butterfree

Butterfree

Gen 1. Total stats 395 to 429, up 34.

  • HPHP Official60 Normalized65
  • AtkAtk Official45 Normalized49
  • DefDef Official50 Normalized54
  • SpASpA Official90 Normalized98
  • SpDSpD Official80 Normalized87
  • SpeSpe Official70 Normalized76
  • Total statsTotal stats Official395 Normalized429 (+34)
Garchomp

Garchomp

Gen 4. Total stats 600 to 570, down 30.

  • HPHP Official108 Normalized103
  • AtkAtk Official130 Normalized123
  • DefDef Official95 Normalized90
  • SpASpA Official80 Normalized76
  • SpDSpD Official85 Normalized81
  • SpeSpe Official102 Normalized97
  • Total statsTotal stats Official600 Normalized570 (-30)
Gholdengo

Gholdengo

Gen 9. Total stats 550 to 503, down 47.

  • HPHP Official87 Normalized79
  • AtkAtk Official60 Normalized55
  • DefDef Official95 Normalized87
  • SpASpA Official133 Normalized122
  • SpDSpD Official91 Normalized83
  • SpeSpe Official84 Normalized77
  • Total statsTotal stats Official550 Normalized503 (-47)

Those are just some of my favorite examples (justice for Butterfree, down with Gholdengo), but it's only the tip of this nerdy iceberg!

Loading 1,214 Pokemon

The rebalance

Average battle power by generation, Gen 1 to 9, for the 486 fully evolved, non-legendary Pokemon. Official: 500, 481, 476, 509, 517, 515, 508, 523, 532. Normalized: 510, 499, 511, 504, 507, 498, 500, 504, 500. The official line dips in Gens 2 and 3, then climbs from Gen 4 to 532 by Gen 9. Normalized stays between 498 and 511.

Average battle power by generation
GenOfficialNormalized
1424428
2411427
3413437
4457456
5455441
6516509
7470471
8479473
9476463
Official

Official stats. Average battle power climbs from Gen 4.

Normalized

Normalized. The climb is gone.

168,000 battles

The line averages the 486 fully evolved, non-legendary Pokemon.

Battle power is an index of how strong a Pokemon fights, not just its total stats.

Battle test

486 Pokemon. Random 6v6 teams at level 50. 168,000 battles.

Stat set
Charizard

Charizard Gen 1

Total stats

534548

Gholdengo

Gholdengo Gen 9

Total stats

550503

Win-chance swing

+3.8 points-1.8 points

Normalized removes the generation edge. It overcorrects a little: newer Pokemon end up 1.8 points behind under this bot.

A second play style gives +4.0 official and -0.9 Normalized. That bot is not proven stronger, so read it as a second look.

Win-chance swing: how much swapping one Gen 1 Pokemon for a typical Gen 9 Pokemon changes the win chance of an even matchup.

Eight methods tried

I tried eight ways to fix it. One became the backbone.

Eight methods tried
  • Location-scale

    Shift each generation to a common average and spread. Keep stat shape and rank.

    Move every generation to the same average and spread. Keep each Pokemon's stat shape and its rank among its peers.

    Creep left0.15
    Edit size9.4

    Backbone

  • Percentile cohorts

    Rank each stat inside groups like starters and fossils.

    Creep left0.15
    Edit size8.7

    Borrowed

  • Bell curve

    Force total stats onto a symmetric bell curve.

    Creep left0.10
    Edit size10.5

    Borrowed

  • Mixed-effects

    Fit a model per stat and remove the generation term.

    Creep left0.60
    Edit size6.7

    Rejected

  • Archetype clusters

    Group Pokemon by design archetype and fix each group.

    Creep left0.71
    Edit size9.7

    Diagnostic only

  • Size and shape

    Fix total size and stat mix in separate steps.

    Creep left0.15
    Edit size9.4

    Rejected

  • Battle power

    Aim at battle strength instead of raw totals.

    Creep left1.41
    Edit size11.3

    Borrowed

  • Minimum edit

    Find the fewest edits, about 90 Pokemon, that remove the trend.

    Creep left0.28
    Edit size4.1

    Borrowed

Final: Normalized

Normalized is location-scale plus pieces borrowed from four other methods.