I build hockey analytics from the data layer up. I created nhlscraper, a CRAN R package with 6,000+ downloads covering 125+ NHL/ESPN endpoints. During my NHL Stats R&D internship, I helped refine a 71-value puck-touch taxonomy and built an R Shiny/JavaScript tracking system with 100+ validation rules; across 5 NHL games, it tripled tracking throughput and prevented roughly 500 detectable data-entry errors per game. I study Statistics & Data Science and Computer Science at Connecticut College and am joining Clear Sight Analytics as a 2026–27 Analytics Engineer.
🏒 Analytics Engineer @ Clear Sight Analytics | R / SQL / Power BI
To be added.
🏒 Intern, Stats R&D @ National Hockey League | R / SQL / JavaScript
Co-improved a 71-value puck-touch taxonomy spanning 25 actions, 9 touch types, and 37 outcomes, testing 15 V1-to-V2 revisions and documenting definitions, clarifications, and standards for future trackers and auditors. Engineered an R Shiny/JavaScript tracker app backed by SQLite and Parquet with 100+ row- and sequence-level validation rules, outcome inference, and synchronized visualizers; then, led 3 user training sessions for the app. Deployed the system to complete ground-truth tracking for 5 NHL games, tripling the previous workflow’s throughput and eliminating ~500 detectable human-errors per game.
🏒 nhlscraper | R / C / Developer Tools
Created and maintain nhlscraper, an R package that makes NHL and ESPN data more accessible by scraping, cleaning, and analyzing data from 125+ API endpoints. Since publishing it on CRAN, the package has surpassed 6,000 downloads, been added to the SportsAnalytics CRAN Task View, and appeared in academic papers and course materials. Reverse-engineered more than 50 undocumented NHL EDGE endpoints and built native C routines that accelerate play-by-play and shift-processing workflows by up to 167× while preserving reliable R fallbacks.
🏒 nhlplotter | R
Created nhlplotter, a companion R package to nhlscraper for visualizing NHL data with ggplot2. Built regulation NHL rink layouts with full-rink, half-rink, and zone views in horizontal or vertical orientations, allowing users to overlay play-by-play and replay tracking data in a shared coordinate system.
⛏️ bedrocktrader | R
Created bedrocktrader, an R package for analyzing villager trading in Minecraft: Bedrock Edition, where nested random-generation rules determine which items and prices players are offered. Translated Mojang’s pinned source tables into three probability-aware views covering 281 trade combinations, 2,787 item specifications, and 30,592 exact price-and-item offers across 13 professions. Derived an analytical engine that accounts for trade selection, repeated source entries, biome and dimension restrictions, emerald prices, and complete enchantment sets without simulation; for example, the package calculates a 2.79% chance that a fully unlocked librarian offers Mending for at most 26 emeralds.
🏒 CSAS 2027 | R / SQL
Developed an R pipeline to estimate NHL screen assists from public goal-replay tracking, crediting teammates who obstruct the goalie’s view on scoring plays. Achieved 92.60% precision and 73.21% recall for conservative player attribution against independent Clear Sight Analytics annotations on the reserved 2025–26 evaluation set. Built an interactive explorer with player rankings, playing-time rates, and animated replays for every credited goal. The full paper also examines screening’s association with scoring through a separate mixed-effects analysis.
Co-developed calibrated size above expected (CSAx), a frame-relative measure of how “big” NHL forwards play, using 10 contact and interior-shot features across 1,763 forward-seasons. Among forwards in comparable roles, one standard deviation higher CSAx was associated with 22% higher adjusted odds of logging at least 300 NHL minutes the following season. The full paper also examines scouting reports, contracts, and playoff availability. This work was selected for poster presentation at CMSAC 2026.
🏒 HALO Hackathon 2026 | R
Built an end-to-end R pipeline combining AHL player-tracking data with XGBoost and LightGBM models to analyze established 5-on-4 offensive-zone play. Developed Attempted Exploitable Mismatch per State (AEM/state), a coaching-focused metric that measures whether power-play units recognize and attack high-value openings. Across 32 teams, AEM/state correlated with scoring at r = 0.442 and increased team-level explanatory R² from 0.281 to 0.346 beyond xG alone. The full paper also identifies actionable puck-movement patterns associated with creating mismatches.

