<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Sunday League Stats: Nerd Lab]]></title><description><![CDATA[Soccer Analytics Deep Dives]]></description><link>https://jakeaburgess.substack.com/s/nerd-lab</link><image><url>https://substackcdn.com/image/fetch/$s_!VY29!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22f61d18-40a0-499e-b9e8-ed6c6c88991f_688x688.png</url><title>Sunday League Stats: Nerd Lab</title><link>https://jakeaburgess.substack.com/s/nerd-lab</link></image><generator>Substack</generator><lastBuildDate>Mon, 24 Aug 2026 22:04:11 GMT</lastBuildDate><atom:link href="https://jakeaburgess.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jake Burgess]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jakeaburgess@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jakeaburgess@substack.com]]></itunes:email><itunes:name><![CDATA[Jake Burgess]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jake Burgess]]></itunes:author><googleplay:owner><![CDATA[jakeaburgess@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jakeaburgess@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jake Burgess]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Putting Numbers Behind "Schmetzer Ball"]]></title><description><![CDATA[As seen on Sounder at Heart]]></description><link>https://jakeaburgess.substack.com/p/putting-numbers-behind-schmetzer</link><guid isPermaLink="false">https://jakeaburgess.substack.com/p/putting-numbers-behind-schmetzer</guid><dc:creator><![CDATA[Jake Burgess]]></dc:creator><pubDate>Sun, 15 Feb 2026 14:39:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!S1hi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S1hi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S1hi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 424w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 848w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 1272w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S1hi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S1hi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 424w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 848w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 1272w, https://substackcdn.com/image/fetch/$s_!S1hi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2633d89d-d6a1-4f34-bc90-403b2e96f9dc_1472x981.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://www.sounderatheart.com/2026/02/putting-numbers-behind-schmetzer-ball/">https://www.sounderatheart.com/2026/02/putting-numbers-behind-schmetzer-ball/</a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Introducing Possession Value Added (PV+) ]]></title><description><![CDATA[A framework for valuing every on-ball action in terms of goal probability]]></description><link>https://jakeaburgess.substack.com/p/introducing-possession-value-added</link><guid isPermaLink="false">https://jakeaburgess.substack.com/p/introducing-possession-value-added</guid><dc:creator><![CDATA[Jake Burgess]]></dc:creator><pubDate>Mon, 12 Jan 2026 21:43:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0f858ae1-2452-462b-879c-f6f13d8ec5eb_857x1200.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2><strong>What is PV+?</strong></h2><p>PV+ (Possession Value Added) is an action-value model I developed to measure contribution of every on-ball action in soccer. The model estimates how much each action &#8212; every pass, carry, tackle, shot, and reception &#8212; increases or decreases a team&#8217;s chances of scoring and conceding. By translating actions into units of goals scored and prevented, PV+ measures player performance in the currency that actually decides matches.</p><h2>Background and Inspiration</h2><p>PV+ was inspired by the pioneering work of American Soccer Analysis and their Goals Added (G+) metric. ASA&#8217;s framework demonstrated that on-ball actions could be systematically valued in goal units by modeling how each action changes the probability of scoring. Their work fundamentally shaped how I think about player evaluation, and PV+ would not exist without their foundation.</p><p>I built PV+ because I wanted a deeper, more contextual understanding of how action-value frameworks operate in practice &#8212; and to bridge this understanding with visualizations that communicate not just outcomes, but why and how actions matter. My motivation was twofold: to explore the limits of action-value modeling for soccer, and to improve the way these insights are communicated visually and intuitively. The result is a model that shares the core philosophy of action-value measurement while introducing its own architectural and interpretive decisions. </p><h2>What I Built:</h2><ol><li><p>A complete data pipeline scraping and processing over 1.3 million MLS match events (this number will continue to grow)</p></li><li><p>A dual-model probability architecture (P+ and P-) for separately estimating attacking and defensive value</p></li><li><p>A nine-component value allocation system spanning passing, receiving, carrying, defending, and shooting</p></li><li><p>A framework that attributes Goals Prevented (GP) across all action types, not just defensive actions.</p></li></ol><h2>How PV+ Works</h2><p><strong>Step 1: Model the Game State</strong></p><p>For every action, PV+ builds a representation of the current game state including</p><ul><li><p>Spatial context: Location on pitch, distance to goal, angle, pitch zone</p></li><li><p>Momentum: progression, speed of play, directional movement</p></li><li><p>Situational context: Post-turnover, set piece sequences, settled vs. transitional play</p></li><li><p>Sequence features: What happened immediately before an action</p></li></ul><p><strong>Step 2: Two Probability Models</strong></p><p>Unlike single-model approaches, PV+ uses two separate machine learning models trained on different outcomes</p><p>P+ (Attacking Model): </p><blockquote><p>Given any game state, what is the probability the team in possession scores within the next 100 actions</p></blockquote><p>P- (Defensive Model)</p><blockquote><p>Given this game state, what is the probability the team in possession concedes within the next 100 actions.</p></blockquote><p>Training these models separately allows PV+ to learn that the game states which lead to goals are different from the states that prevent them. This is particularly important for properly valuing defensive contributions.</p><p><strong>Step 3: Measure the Delta</strong></p><p>For every action, PV+ compares the game state before and after:</p><ul><li><p>If a pass increases scoring probability from 4% to 7% that action adds <strong>+0.03 Goals Added</strong></p></li><li><p>If a tackle decreases conceding probability from 8% to 2%, that action contributes <strong>+0.06 Goals Prevented</strong></p></li></ul><p><strong>Step 4: Allocate Credit</strong></p><p>Different actions generate value in different ways. PV+ reflects this through specific allocation rules:</p><ul><li><p>Passing &amp; Receiving - 50% of the pass delta goes to the passer and 50% goes to the receiver</p></li><li><p>Carrying - 100% of the carry delta goes to the ball carrier</p></li><li><p>Defending - Full credit for both attacking value created and danger eliminated</p></li><li><p>Shooting - Scaled xG-based value, rewarding position quality independent of finishing performance</p></li></ul><h2>The Nine Components of PV+</h2><p>PV+ breaks down into nine distinct value components:</p><p><strong>Goals Added (GA)</strong></p><ol><li><p>GA from Passing</p></li><li><p>GA from Receiving</p></li><li><p>GA from Carrying</p></li><li><p>GA from Defending</p></li></ol><p><strong>Goals Prevented (GP)</strong></p><ol start="5"><li><p>GP from Passing</p></li><li><p>GP from Receiving</p></li><li><p>GP from Carrying </p></li><li><p>GP from Defending</p></li></ol><p><strong>Shooting</strong></p><ol start="9"><li><p>Shooting Value</p></li></ol><p><strong>Total PV+ = &#931;(Goals Added) + &#931;(Goals Prevented) + Shooting Value</strong></p><p>This granular breakdown allows analysis of how players create value, not just how much value they accumulate.</p><h2>Using Player Rankings as Validation</h2><p>A critical part of developing PV+ was using player rankings as a reality check. After training the model, I examined league-wide PV+ rankings to assess whether the outputs aligned with on-field performance and soccer intuition. The results were encouraging:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wJO9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wJO9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 424w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 848w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 1272w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wJO9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png" width="932" height="687" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa0f5985-da67-428c-8f75-1d1587042641_932x687.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:932,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:158907,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jakeaburgess.substack.com/i/184278220?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wJO9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 424w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 848w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 1272w, https://substackcdn.com/image/fetch/$s_!wJO9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa0f5985-da67-428c-8f75-1d1587042641_932x687.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The very top of the leaderboard is dominated by established MLS stars&#8212;players widely recognized for consistently creating danger, progressing the ball, and generating high-quality chances. Names like Lionel Messi, Hany Mukhtar, Denis Bouanga, and Anders Dreyer naturally rise to the top, reinforcing that PV+ is capturing the attacking impact fans and analysts already recognize.</p><p>Just as importantly, defensive contributors also crack the top tier. Players such as<strong> </strong>Kai<strong> </strong>Wagner, Jeppe Tverskov, and Alexander Freeman, who add value on both sides of the ball, appear alongside elite attackers. The resulting rankings are not far off from what one might expect from an MLS All-Star XI.</p><h2>What Makes PV+ Distinct</h2><p>While PV+ shares philosophical roots with ASA&#8217;s Goals Added, I made several independent modeling decisions:</p><p><strong>Dual Probability Architecture: </strong>Rather than a single possession value model, PV+ trains separate models for scoring probability (P+) and conceding probability (P-). This allows the defensive model to learn features specifically predictive of conceding, rather than simply the inverse of attack. The totals from these models are totaled in order to compute the final PV+ tally. </p><p><strong>Action Horizon Approach: </strong>PV+ uses a 100-action forward horizon rather than possession-bounded sequences. This captures value that flows across possession changes &#8212; critical for properly crediting the value of attacking and defensive actions occurring throughout dynamic game states.</p><p><strong>Universal GP Attribution:</strong> Goals Prevented value is allocated to all action types (passing, receiving, carrying, and defending), not just defensive actions. For example, an outside back who carries the ball away from danger contributes positive GP. This reflects the reality that all players participate in defensive structure even when their team is in possession.</p><h2>Limitations</h2><p>No metric captures everything. PV+ is strictly on-ball, which means:</p><ul><li><p>Off-ball movement that creates space is not fully captured</p></li><li><p>Pressing contributions aren&#8217;t measured</p></li><li><p>Positioning that closes passing lanes do not contribute value</p></li><li><p>Tactical discipline and defensive shape takeaways are limited</p></li></ul><h2>Why PV+ Matters</h2><p>Soccer is a low-scoring game where the moments that decide matches often don&#8217;t appear on the scoresheet. For fans, PV+ provides goal-based context for the actions they intuitively recognize as important. It helps explain why and how a player influenced the game, not just what they produced.</p><p>For coaches and analysts, PV+ offers a framework to evaluate performance across possessions and game states, highlighting how value is created and prevented throughout a match. It supports tactical analysis by identifying which actions consistently increase danger or suppress it, and which players reliably drive those outcomes. </p><p>For clubs, models like PV+ have the potential to support smarter recruitment, squad building, and player development. By measuring contributions in goal-based units across all phases of play, PV+ can help surface undervalued players, clarify role fit, and reinforce tactical principles grounded in how goals are actually created and prevented.</p><h2>What&#8217;s Next</h2><p>This methodology post is the foundation. Going forward, PV+ will be applied in a consistent, repeatable way through weekly outputs, including: </p><ul><li><p>Weekly PV+ player performance visualizations</p></li><li><p>League-wide and team-specific leaderboards</p></li><li><p>Breakdowns by role and contribution type (creation, carrying, defending, shooting)</p></li><li><p>Contextual matchweek summaries highlighted where and how value was generated</p></li></ul><p>These updates will focus much less on explaining the model and more on using it &#8212; showing how PV+ performs week to week, how player roles differ, and how value accumulates over a season. The goal is to make action-value concepts intuitive, visual, and useful for understanding MLS matches as they happen</p><p>More coming soon.</p><div><hr></div><h2>Acknowledgments</h2><p>I want to explicitly acknowledge American Soccer Analysis for their foundational work on Goals Added. The <a href="https://www.americansocceranalysis.com/home/2020/5/4/goals-added-deep-dive-methodology">g+ methodology, </a>publicly documented and shared with the soccer analytics community, provided the inspiration for PV+. I encourage anyone interested in action-value models to read their original methodology articles and explore their publicly available g+ data. PV+ is my implementation of these ideas-built from scratch, trained on data I collected, with modeling decisions I made independently. </p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://jakeaburgess.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Sunday League Stats! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building An xG Model ]]></title><description><![CDATA[Building My First xG Model - And How it Will Power the Possession/ Action System I am Working On]]></description><link>https://jakeaburgess.substack.com/p/building-an-xg-model</link><guid isPermaLink="false">https://jakeaburgess.substack.com/p/building-an-xg-model</guid><dc:creator><![CDATA[Jake Burgess]]></dc:creator><pubDate>Thu, 20 Nov 2025 20:45:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/20c06f4b-33c5-4e5c-a0cb-c45b20e6f93c_390x390.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the past few weeks, i&#8217;ve been putting together a full analytics pipeline from raw event data into a structured database, and now into my first version of an expected goals (xG) model. It&#8217;s still early, but this model is already strong enough to anchor the next project: a full possession-value and action-value framework for MLS games (basically my version of VAEP/Goals Added).</p><p>This write-up walks through what I have built, shows the model outputs, and explains how this connects to the larger Soccer analytics system I&#8217;m building for the 2025 MLS season.</p><h1><strong>What is xG?</strong></h1><p>xG (expected goals) is a probability model that estimates:</p><p><strong>&#8220;Given the characteristics of a shot, how likely is it to become a goal"?&#8221;</strong></p><p>Each shot gets a value between 0 and 1.</p><ul><li><p>A simple tap-in might have a 0.60 xG or 60% chance of scoring</p></li><li><p>A 30-yard long range shot might have a 0.02 xG or 2% chance.</p></li></ul><p>xG is not meant to judge skill. Instead, it&#8217;s measuring the quality of the chance.</p><h1><strong>The Data Behind the Model</strong></h1><p>Everything starts with the event data I scraped and stored in it&#8217;s own database. Every pass, defensive action, foul, shot, etc. is stored with coordinates, qualifiers, and my own engineered features.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KCJk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KCJk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 424w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 848w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 1272w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KCJk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png" width="1456" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:286911,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jakeaburgess.substack.com/i/179490565?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!KCJk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 424w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 848w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 1272w, https://substackcdn.com/image/fetch/$s_!KCJk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F578133ce-b7fd-4563-9caa-8df38b7b7185_1910x952.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>From this giant database, I filtered down to shot events and variables like distances, angles, body-part indicators, play patterns, and other contextual flags.</p><p>Then I removed all outcome-dependent data (like blocked shot coordinates or where a miss landed) so the model wouldn&#8217;t cheat.</p><p></p><h1><strong>What the Shot Data Looks Like</strong></h1><p>Before modeling, I visualized the goal vs non-goal shots across the pitch. As expected, goals are heavily clustered inside the box:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WzTn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WzTn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 424w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 848w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 1272w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WzTn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png" width="850" height="525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:525,&quot;width&quot;:850,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195519,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jakeaburgess.substack.com/i/179490565?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WzTn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 424w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 848w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 1272w, https://substackcdn.com/image/fetch/$s_!WzTn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa33fdcd2-e7e3-409a-85a1-7fde2b311588_850x525.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>Training the xG Model</strong></h1><p>I used the following features to train a Logistic Regression model based off of all of the shots in my database.</p><ul><li><p>Shot x,y coordinates</p></li><li><p>Shot Distance</p></li><li><p>Shot Angle</p></li><li><p>Body Part </p></li><li><p>Player Pattern Indicators (Regular Play/Set Piece/ Fast Break/ etc)</p></li><li><p>Contextual Flags (Was the shot a volley? / Was it first touch?/ etc.)</p></li></ul><p></p><h1><strong>xG Model Performance</strong></h1><p>The model&#8217;s performance metrics ended up solid for a first iteration.</p><ul><li><p>ROC-AUC: 0.84</p><ul><li><p>ROC-AUC measures the model&#8217;s ability to correctly rank shots form least likely to most likely to be scored.</p></li></ul></li><li><p>Log Loss: 0.25</p><ul><li><p>Log Loss measures how &#8220;confident&#8221; and accurate the probability predictions are. A 0.25 is solid for a first-generation xG model. </p></li></ul></li><li><p>Brier Score: 0.073</p><ul><li><p>The Brier Score is the average squared difference between predicted probability and the actual outcome. Lower = Better.</p><p></p></li></ul></li></ul><h1><strong>Visualizing the Model</strong></h1><p>Here&#8217;s what predicted xG looks like across the pitch:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Pwh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Pwh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 424w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 848w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 1272w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Pwh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png" width="990" height="606" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:990,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128562,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jakeaburgess.substack.com/i/179490565?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2Pwh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 424w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 848w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 1272w, https://substackcdn.com/image/fetch/$s_!2Pwh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F581bb924-c091-4e1f-a8bf-6503871c38b0_990x606.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The model behaves as expected:</p><ul><li><p>high-probability shots are right on top of the keeper</p></li><li><p>angles influence probability noticeably</p></li><li><p>long-range shots collapse down to near-zero </p></li></ul><h1>The Calibration Curve</h1><p>Here&#8217;s the calibration curve for the model:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fCld!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fCld!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 424w, https://substackcdn.com/image/fetch/$s_!fCld!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 848w, https://substackcdn.com/image/fetch/$s_!fCld!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 1272w, https://substackcdn.com/image/fetch/$s_!fCld!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fCld!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png" width="691" height="547" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:547,&quot;width&quot;:691,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48027,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://jakeaburgess.substack.com/i/179490565?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fCld!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 424w, https://substackcdn.com/image/fetch/$s_!fCld!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 848w, https://substackcdn.com/image/fetch/$s_!fCld!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 1272w, https://substackcdn.com/image/fetch/$s_!fCld!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffc8e7f3-f05f-4b05-9a02-08dca11cf63b_691x547.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There&#8217;s a noticeable dip for predicted values around 0.6 xG. A few reasons explain this.</p><p>1.<strong>Very high xG shots are rare</strong>. Most real-world shots are under 0.25 xG. The higher the predicted value, the fewer examples the model can learn from, which increases noise.</p><p>2.<strong>Small Sample Size = Volatility</strong>. This model was built on around 6,000 shots that took place in the 2025 MLS season. A High-xG bin might only have a few shots. If a handful miss, the calibration will spike downwards.</p><h1><strong>Next Steps</strong></h1><p>Right now, this xG model lives solely in python. My next step is inserting the xG values back into the database and attaching each value to its corresponding event or action.</p><h1>How This Will Power My VAEP Model</h1><p>Once the xG values are merged back into the database, they essentially become the backbone for everything that follows. The first major step will be creating a possession-level value system. For very possession in a match, I&#8217;ll calculate the <em>possession_xG, </em>which will be equivalent to the highest xG value generated before that possession ends. This gives me a single number representing &#8220;how dangerous was this possession?&#8221; and becomes the target for the possession-value model.</p><p>From there, I can start breaking the game into individual actions. Every pass, dribble, tackle, or block will be evaluated in terms of how it changes the expected value of the possession. In practice, that means comparing the expected value immediately after an action to the expected value right before it. The difference becomes that action&#8217;s VAEP score. It&#8217;s a clean way to quantify how much each action helps or hurts a team&#8217;s chance of scoring or preventing a goal regardless of whether the play ends in a shot. </p><p>This is where the model starts to matter. Possessions gain meaning, not just isolated events. Player impacts are valued beyond goals and assists and the data becomes something coaches, analysts, and fans can all understand.</p><div><hr></div><h1><strong>A final note</strong></h1><p>This entire project wouldn&#8217;t have been possible without the foundational work of <strong>McKay Johns</strong> &#8212; his tutorials opened the door for independent analysts like me to build full models from scratch. He is absolutely worth following for anyone interested in soccer analytics:<br></p><p><strong><a href="https://twitter.com/mckayjohns">https://twitter.com/mckayjohns</a></strong></p><p></p>]]></content:encoded></item></channel></rss>