<?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[Football Hacking]]></title><description><![CDATA[Analista de dados no futebol, combino Python, web scraping e leitura tática para revelar padrões invisíveis e explicar o jogo além do óbvio — sempre com insights práticos e direto ao ponto.]]></description><link>https://www.footballhacking.com</link><image><url>https://substackcdn.com/image/fetch/$s_!OtA5!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89b86110-c200-49f0-9e8b-8940dc131747_1024x1024.png</url><title>Football Hacking</title><link>https://www.footballhacking.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 17 Apr 2026 15:02:39 GMT</lastBuildDate><atom:link href="https://www.footballhacking.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Saulo Faria]]></copyright><language><![CDATA[pt-br]]></language><webMaster><![CDATA[saulofaria@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[saulofaria@substack.com]]></itunes:email><itunes:name><![CDATA[Saulo Faria]]></itunes:name></itunes:owner><itunes:author><![CDATA[Saulo Faria]]></itunes:author><googleplay:owner><![CDATA[saulofaria@substack.com]]></googleplay:owner><googleplay:email><![CDATA[saulofaria@substack.com]]></googleplay:email><googleplay:author><![CDATA[Saulo Faria]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Manchester City vs Arsenal Prediction: Fair Odds, Tactical Analysis and Betting Edge]]></title><description><![CDATA[Fair odds, structural asymmetries and the exact signals that will decide this game live.]]></description><link>https://www.footballhacking.com/p/manchester-city-vs-arsenal-prediction</link><guid isPermaLink="false">https://www.footballhacking.com/p/manchester-city-vs-arsenal-prediction</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Fri, 17 Apr 2026 12:09:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Qqqc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.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_!Qqqc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qqqc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qqqc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2901179,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/194506949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.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_!Qqqc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Qqqc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb75acdc3-1ccd-431b-add0-89fbc9ebafbd_1536x1024.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 role="img" 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><title></title><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></h1><p><em><strong>This analysis is grounded in a data-driven framework built on pass network structures and Expected Threat (xT). Rather than relying on surface-level metrics, it evaluates how each team organizes possession, how value flows through their passing network, and how attacking sequences evolve under pressure. By combining network centrality, progression patterns and xT dynamics, the objective is to translate what is typically seen qualitatively on the pitch into measurable, repeatable insights &#8212; revealing not just where teams play, but how and why their structure generates or destroys value.</strong></em></p><p></p><p>Most people will watch Manchester City vs Arsenal trying to answer a simple question:</p><p><strong>Who is playing better?</strong></p><p>That question is not just incomplete &#8212; it actively leads you to the wrong conclusion in this type of match.</p><p>Because this is not a game where territorial dominance, possession share, or even isolated chance creation will give you a reliable read. Both teams will have control phases. Both teams will reach their preferred zones. Both teams will produce moments that look like superiority.</p><p>And yet, the match will not be decided there.</p><p>It will be decided in something much more fragile:</p><p><strong>What happens when structure meets resistance.</strong></p><p>This is a game where control is constantly tested, where attacking sequences are repeatedly challenged, and where the difference between sustained threat and structural collapse often comes down to a single moment of pressure.</p><p>And that is exactly what you should be tracking live.</p><p>At the end of this article, there is a <strong>live betting checklist</strong> designed to help you identify when the match is actually shifting &#8212; not when it simply looks like it is.</p><div><hr></div><h2><strong>Poisson probabilities and fair odds</strong></h2><p>Before getting into the structural layer, the probabilistic baseline already tells you something critical &#8212; and it goes against the intuitive narrative.</p><p>From the Poisson matrix:</p><ul><li><p><strong>Manchester City win:</strong> 42.00%</p></li><li><p><strong>Draw:</strong> 32.86%</p></li><li><p><strong>Arsenal win:</strong> 25.13%</p></li></ul><p>Fair odds:</p><ul><li><p><strong>Manchester City:</strong> 2.38</p></li><li><p><strong>Draw:</strong> 3.04</p></li><li><p><strong>Arsenal:</strong> 3.98</p></li></ul><p>This is not a dominant-favorite game.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nLg0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nLg0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 424w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 848w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 1272w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nLg0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png" width="1456" height="779" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:779,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87477,&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://www.footballhacking.com/i/194506949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.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_!nLg0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 424w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 848w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.png 1272w, https://substackcdn.com/image/fetch/$s_!nLg0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1d4351b-dcb9-44c2-8ad6-126f5ce8fd9d_1506x806.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 role="img" 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><title></title><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></p><p>The draw probability is extremely high, which usually signals a very specific type of match:</p><ul><li><p>prolonged control phases</p></li><li><p>structural cancellation</p></li><li><p>limited clean separation</p></li></ul><p>In other words, a match where both teams can impose their structure &#8212; but neither can consistently convert that structure into value without something breaking first.</p><p>That&#8217;s the key dynamic:</p><p><strong>This match is structurally stable&#8230; until it isn&#8217;t.</strong></p><p>And when that break happens, it tends to be decisive.</p><p>If you want to explore full score distributions and simulation layers, the complete model is available here:<br></p><p>https://app.footballhacking.com</p><div><hr></div><h2><strong>Structural collision</strong></h2><p>This is not a matchup defined by stylistic opposition in the simple sense of possession versus control.</p><p>It is a matchup between two teams that both want to regulate the game through structure, but do so with different value maps.</p><p>Manchester City arrive as the more efficient attacking system and the more forceful defensive influence. Arsenal arrive as the more conservative progression structure, with a clearer commitment to central access in the final-third approach, but with weaker attacking conversion from that access.</p><p>Both teams show a midfield bottleneck profile, which means the match is likely to be decided less by raw territorial occupation and more by what happens when circulation reaches congestion.</p><p>The key question is not who has the ball.</p><p>It is which team can preserve value after first resistance.</p><div><hr></div><h2><strong>Structural collision in practice: left vs center</strong></h2><p>City&#8217;s attacking map is tilted toward the left corridor as the main final-third entry lane.</p><p>That does not mean they are purely left-sided; it means their possession structure repeatedly finds its most stable route into advanced territory there. They can originate from the left corridor and remain on the left, or begin centrally and still finish on the left. The left corridor is therefore not just a wing outlet but a destination corridor for the whole structure.</p><p>Arsenal, by contrast, prefer to progress into the final third through the central corridor. Their highest-frequency and one of their highest-value patterns both terminate centrally, and their strongest value route comes from the right half-space into the central corridor.</p><p>Structurally, Arsenal want the game to narrow near the box.</p><p>City want to stretch it first and often land on the left before deciding whether to attack the box or recycle.</p><p>So the collision is clear:</p><p>City want to draw Arsenal across the width and then stabilize on the left corridor.<br>Arsenal want to protect central access and use central occupation as their own launch point.</p><p>Resistance should therefore appear in two main zones.</p><p>First, Arsenal will try to compress City&#8217;s access once City circulate through midfield and begin leaning toward the left corridor.</p><p>Second, City will try to suffocate Arsenal&#8217;s central progression before it can become a stable final-third platform.</p><p>What happens after resistance is where the matchup separates.</p><div><hr></div><h2><strong>Response to resistance: the central asymmetry</strong></h2><p>City&#8217;s resistance-response profile is mostly constructive.</p><p>Even under pressure, they still produce progressive escapes, especially from the right half-space or central defensive zones into advanced territory. That tells you their structure can absorb pressure and still re-emerge facing forward.</p><p>Arsenal&#8217;s response profile is less stable.</p><p>Under resistance in midfield-right or advanced central zones, they are more likely to produce forced value loss, lateral escape, or backward escape.</p><p>In structural terms, Arsenal can still reach their preferred zones, but they are less reliable at preserving attacking continuity when the opponent contests the route.</p><p>That is the central asymmetry of the match.</p><div><hr></div><h2><strong>Progression pattern</strong></h2><p>City&#8217;s progression pattern is built around recurrence rather than one direct lane.</p><p>The most frequent route is left corridor to left corridor, followed closely by central corridor to left corridor. That indicates a system that uses central circulation as a drawing mechanism and the left corridor as the release point.</p><p>There is also an important cross-structure pattern:</p><p>left half-space &#8594; right half-space</p><p>This carries very high value relative to its frequency.</p><p>That suggests City are not merely wing-loading; they are using one side to disorganize the block and then attacking the far half-space with greater threat.</p><p>So City&#8217;s underlying pattern looks like this over time:</p><p>circulation forms &#8594; pressure invited &#8594; ball reaches left corridor &#8594; second wave &#8594; structural relocation</p><p>The key point is continuity.</p><p>The first entry is often not the decisive one.<br>The decisive action is frequently the next structural relocation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZOKJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 424w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 848w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png" width="1456" height="1436" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1436,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:134720,&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://www.footballhacking.com/i/194506949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.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_!ZOKJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 424w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 848w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!ZOKJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6548cf7a-5ffa-4fb3-8809-d6f410e98011_1661x1638.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 role="img" 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><title></title><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></p><div><hr></div><h2><strong>Arsenal progression pattern</strong></h2><p>Arsenal&#8217;s progression pattern is narrower and more vertical in intent.</p><p>Central corridor to central corridor is their dominant route by volume, and it also carries solid value.</p><p>But the most important pattern is right half-space to central corridor, which generates by far the highest value among their listed routes.</p><p>That means Arsenal&#8217;s best attacking progression is not simply &#8220;through the middle.&#8221;</p><p>It is created when the right half-space becomes the launching pad for central access.</p><p>There is also a strong left half-space to central corridor route, so the system can feed the center from either interior lane.</p><p>But the right-to-central connection appears to be the sharper one.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pdsl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pdsl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 424w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 848w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pdsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png" width="1456" height="1436" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1436,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:147990,&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://www.footballhacking.com/i/194506949?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.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_!Pdsl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 424w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 848w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!Pdsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F699ef621-c418-44d7-b0b8-6ec8a24b4210_1661x1638.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 role="img" 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><title></title><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></p><div><hr></div><p><strong>&#128274; Continue reading to unlock the full breakdown of frequency vs value, defensive reactions, attack continuity and the live betting checklist for this match.</strong></p><p></p>
      <p>
          <a href="https://www.footballhacking.com/p/manchester-city-vs-arsenal-prediction">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Manchester United 2025/26: Why Their Structure Works — Until It Doesn’t]]></title><description><![CDATA[A deep tactical breakdown of progression, network dependency, and the real problem in the final third]]></description><link>https://www.footballhacking.com/p/manchester-united-202526-why-their</link><guid isPermaLink="false">https://www.footballhacking.com/p/manchester-united-202526-why-their</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 16 Apr 2026 13:35:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/70730dba-6732-4b87-a2a6-4ee687d94021_2560x1440.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_!MmdM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MmdM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 424w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 848w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 1272w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MmdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png" width="2554" height="1122" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea478c29-f637-4359-be52-40f371a68dab_2554x1122.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1122,&quot;width&quot;:2554,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4896333,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/194402093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2f284d8-c73a-46c4-8004-2cfdd146073f_2560x1440.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_!MmdM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 424w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 848w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.png 1272w, https://substackcdn.com/image/fetch/$s_!MmdM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea478c29-f637-4359-be52-40f371a68dab_2554x1122.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 role="img" 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><title></title><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>Manchester United&#8217;s 2025/26 season tells a very specific story &#8212; one that doesn&#8217;t show up in traditional stats, league tables, or even most tactical breakdowns.</p><p>On the surface, this is a team that:</p><ul><li><p>progresses the ball consistently</p></li><li><p>reaches the final third at high volume</p></li><li><p>imposes territorial control</p></li></ul><p>But underneath, there&#8217;s a structural contradiction:</p><blockquote><p><strong>United can arrive in dangerous zones. They just can&#8217;t consistently stay there.</strong></p></blockquote><p>That single idea explains almost everything about their season.</p><div><hr></div><h2>Where Manchester United Stand in the Table (Probabilistic View)</h2><p>Manchester United currently sit <strong>3rd in the table with 55 points</strong>, but their position becomes much more interesting when we look at probabilistic outcomes rather than just the standings.</p><p>According to the model:</p><ul><li><p><strong>Title probability:</strong> 0.0%</p></li><li><p><strong>2nd place:</strong> 0.68%</p></li><li><p><strong>3rd place:</strong> 33.48%</p></li><li><p><strong>4th place:</strong> 37.05%</p></li><li><p><strong>5th place:</strong> 18.29%</p></li><li><p><strong>6th place:</strong> 6.80%</p></li></ul><p>Lower positions quickly become negligible.</p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5674eb77-443b-47c8-a162-158803d5cc12_1430x605.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/83ecc30a-ca59-400d-9228-778b1e80a0dc_1430x605.png&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/843a0021-a85d-4761-bc5d-dbc672228f64_1456x720.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p><div><hr></div><h3>What this actually means</h3><p>United are not in a title race.</p><p>They are in a <strong>tight distribution around Champions League qualification</strong>.</p><blockquote><p>The model concentrates ~70% of outcomes between <strong>3rd and 4th place</strong>.</p></blockquote><p>That&#8217;s crucial.</p><p>Because it tells us:</p><ul><li><p>The team is <strong>structurally competitive</strong></p></li><li><p>But lacks the consistency to <strong>break into the top tier (Arsenal/City level)</strong></p></li></ul><div><hr></div><h3>The key interpretation</h3><p>This is not a volatile team.</p><p>It&#8217;s a <strong>bounded team</strong>.</p><blockquote><p>Their performance distribution is narrow &#8212; but capped.</p></blockquote><p>They are very likely to:</p><ul><li><p>stay in the top 4 fight</p></li><li><p>finish near their current position</p></li></ul><p>But very unlikely to:</p><ul><li><p>collapse</p></li><li><p>or overperform into a title push</p></li></ul><div><hr></div><h3>Why this matters for the analysis</h3><p>This probabilistic profile perfectly matches what we see in the structure:</p><ul><li><p>Strong progression &#8594; keeps them competitive</p></li><li><p>Weak final-third continuity &#8594; prevents elite jump</p></li></ul><p>In other words:</p><blockquote><p><strong>The table is not lying.<br>It&#8217;s just incomplete without structure.</strong></p></blockquote><div><hr></div><h2>&#9889; Want to see this before the match even starts?</h2><p>If you&#8217;re reading this and thinking <em>&#8220;this is exactly the kind of edge I need pre-match&#8221;</em> &#8212; that&#8217;s literally what the Football Hacking app is built for.</p><p>&#128073; <a href="https://app.footballhacking.com/">https://app.footballhacking.com/</a></p><p>Inside the app you get:</p><ul><li><p><strong>Poisson + Dixon-Coles probabilities</strong> (not xG guesses &#8212; actual betting-grade modeling)</p></li><li><p><strong>Monte Carlo robustness analysis</strong> (is the edge stable or fragile?)</p></li><li><p><strong>League-specific calibration (&#961; adjustment)</strong> &#8212; no generic models</p></li><li><p><strong>Full probability matrices (correct score, match odds, BTTS, totals)</strong></p></li></ul><p>This isn&#8217;t just prediction.</p><p>It&#8217;s <strong>decision support under uncertainty</strong>.</p><div><hr></div><h2>Structural Identity: Multi-Entry, Center-Finishing</h2><p>Manchester United are not predictable in how they build.</p><p>They are predictable in <strong>where the move becomes dangerous</strong>.</p><p>The data shows:</p><ul><li><p>Central &#8594; Central progression</p><ul><li><p><strong>62.4% of entries</strong></p></li><li><p><strong>+0.0203 &#916;xT</strong></p></li></ul></li><li><p>Left half-space &#8594; Central</p><ul><li><p><strong>+0.0184 &#916;xT</strong></p></li></ul></li><li><p>Right half-space &#8594; Central</p><ul><li><p><strong>+0.0224 &#916;xT</strong></p></li></ul></li></ul><p>This creates a very clear identity:</p><blockquote><p><strong>Multiple entry points. One payoff zone: the central corridor.</strong></p></blockquote><p>That&#8217;s actually a <em>good</em> thing.</p><p>It means:</p><ul><li><p>flexibility in buildup</p></li><li><p>consistency in attacking intention</p></li></ul><p>But it also creates a hidden risk&#8230;</p><p></p><p><em><strong>What is &#916;xT (Delta Expected Threat)?</strong></em></p><p><em>&#916;xT measures how much a single action increases or decreases a team&#8217;s probability of creating a goal.</em></p><p><em>In simple terms:</em></p><ul><li><p><em><strong>Positive &#916;xT</strong> &#8594; the action moves the ball into a more dangerous area</em></p></li><li><p><em><strong>Negative &#916;xT</strong> &#8594; the action reduces attacking potential</em></p></li></ul><p><em>Unlike basic stats, &#916;xT doesn&#8217;t just track possession &#8212; it tracks <strong>how valuable that possession becomes over time</strong>.</em></p><div><hr></div><h2>The Real Problem: Final-Third Instability</h2><p>United average:</p><ul><li><p><strong>95.8 final-third passes per match</strong></p></li></ul><p>That&#8217;s elite territory access.</p><p>But:</p><ul><li><p><strong>Final-third net value: negative</strong></p></li></ul><p>This is where things break.</p><p>They:</p><ul><li><p>arrive well</p></li><li><p>circulate poorly after arrival</p></li><li><p>lose attacking value after first contact</p></li></ul><p>This is not a creativity issue.</p><p>It&#8217;s a <strong>continuity problem</strong>.</p><div><hr></div><h2>Progression Patterns That Actually Work</h2><h3>1. Central progression is real (not cosmetic)</h3><p>This isn&#8217;t sterile possession.</p><p>High frequency + high &#916;xT means:</p><blockquote><p><strong>United genuinely break lines through the middle.</strong></p></blockquote><div><hr></div><h3>2. Left half-space = decision hub</h3><p>From this zone, United can:</p><ul><li><p>go inside (high value)</p></li><li><p>go wide (low value)</p></li><li><p>recycle</p></li></ul><p>But here&#8217;s the key:</p><blockquote><p><strong>Inside continuation is ~3x more valuable than wide continuation.</strong></p></blockquote><p>That&#8217;s a decision-making bottleneck, not a structural one.</p><div><hr></div><h3>3. Right side only works if it collapses inward</h3><p>Right-sided play becomes dangerous only when:</p><ul><li><p>it feeds the central corridor</p></li></ul><p>Otherwise, it becomes:</p><ul><li><p>possession without threat</p></li><li><p>width without penetration</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!371A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!371A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 424w, https://substackcdn.com/image/fetch/$s_!371A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 848w, https://substackcdn.com/image/fetch/$s_!371A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 1272w, https://substackcdn.com/image/fetch/$s_!371A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!371A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png" width="1456" height="1035" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1035,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91050,&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://www.footballhacking.com/i/194402093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.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_!371A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 424w, https://substackcdn.com/image/fetch/$s_!371A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 848w, https://substackcdn.com/image/fetch/$s_!371A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.png 1272w, https://substackcdn.com/image/fetch/$s_!371A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8db491d1-643d-4f34-b574-c0ec7e30e017_2232x1586.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 role="img" 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><title></title><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></p><div><hr></div><h2>The Network: Bruno Fernandes Is the System</h2><p>This isn&#8217;t subtle.</p><p>Bruno dominates:</p><ul><li><p>Load centrality &#8594; 9 matches</p></li><li><p>Closeness &#8594; 14</p></li><li><p>Eigenvector &#8594; 13</p></li><li><p>PageRank &#8594; 15</p></li></ul><p>That&#8217;s not influence.</p><p>That&#8217;s <strong>structural dependency</strong>.</p><div><hr></div><h3>What that means in practice</h3><ul><li><p>Bruno = organizer</p></li><li><p>Casemiro = stabilizer</p></li><li><p>Shaw / Lisandro = left-side continuity</p></li><li><p>Dalot = outlet</p></li></ul><p>This is a <strong>hierarchical network</strong>, not a distributed one.</p><p>And that matters because:</p><blockquote><p>When Bruno is disrupted, the entire system loses coherence.</p></blockquote><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DPE7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DPE7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 424w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 848w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 1272w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DPE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png" width="1456" height="1495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1495,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:189155,&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://www.footballhacking.com/i/194402093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.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_!DPE7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 424w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 848w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.png 1272w, https://substackcdn.com/image/fetch/$s_!DPE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70c337af-501c-4c33-aa40-8b3813b0ff42_1919x1971.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 role="img" 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><title></title><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></p><div><hr></div><h2>Hidden Mechanism: Progression via Reset</h2><p>Some of the strongest edges in the network are:</p><ul><li><p>Defender &#8594; Goalkeeper</p></li><li><p>Deep reset &#8594; Relaunch</p></li></ul><p>Example:</p><ul><li><p>Shaw &#8594; Lammens</p></li><li><p>Lisandro &#8594; Lammens</p></li></ul><p>This tells us:</p><blockquote><p>United often recover structure by going backwards.</p></blockquote><p>That&#8217;s not inherently bad.</p><p>But it becomes a problem when combined with&#8230;</p><div><hr></div><h2>Dead Circulation Loops</h2><p>Negative-value connections include:</p><ul><li><p>De Ligt &#8594; Shaw</p></li><li><p>Yoro &#8594; Dalot</p></li><li><p>Mazraoui &#8594; De Ligt</p></li></ul><p>These are:</p><ul><li><p>horizontal</p></li><li><p>outward</p></li><li><p>low-threat</p></li></ul><p>They:</p><ul><li><p>keep possession</p></li><li><p>kill momentum</p></li></ul><p>This is where attacks quietly die.</p><div><hr></div><h2>Defensive Reality: Control Without Destruction</h2><p>United&#8217;s defensive profile is fascinating.</p><ul><li><p>Territorial pressure: <strong>0.999 (elite)</strong></p></li><li><p>Suppression: <strong>0.672</strong></p></li><li><p>Destabilization: <strong>0.425</strong></p></li></ul><p>Translation:</p><blockquote><p>They control where the game happens&#8230; but not always how it ends.</p></blockquote><div><hr></div><h3>Where they actually hurt opponents</h3><ul><li><p>Attacking third (central)</p><ul><li><p><strong>negative opponent &#916;xT</strong></p></li></ul></li><li><p>Right half-space (high)</p></li><li><p>Midfield right half-space</p></li></ul><p>This is where pressing works.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VooF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VooF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 424w, https://substackcdn.com/image/fetch/$s_!VooF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 848w, https://substackcdn.com/image/fetch/$s_!VooF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 1272w, https://substackcdn.com/image/fetch/$s_!VooF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VooF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:151180,&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://www.footballhacking.com/i/194402093?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.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_!VooF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 424w, https://substackcdn.com/image/fetch/$s_!VooF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 848w, https://substackcdn.com/image/fetch/$s_!VooF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.png 1272w, https://substackcdn.com/image/fetch/$s_!VooF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F57c4e203-3585-4369-a42d-bac6f1ae935b_2609x1934.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 role="img" 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><title></title><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></p><div><hr></div><h3>Where they don&#8217;t</h3><ul><li><p>Defensive third (central): high volume, low impact</p></li><li><p>Defensive right side: even positive opponent &#916;xT</p></li></ul><p>Meaning:</p><blockquote><p>When the press is broken, the structure behind it is vulnerable.</p></blockquote><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>Resistance Response: Where Attacks Collapse</h2><p>This is the key weakness of the season.</p><p>After pressure:</p><p>Instead of:</p><ul><li><p>staying near the action</p></li></ul><p>They:</p><ul><li><p>reset wide or deep</p></li><li><p>lose &#916;xT</p></li></ul><p>Examples:</p><ul><li><p>Final third &#8594; midfield reset &#8594; negative value</p></li><li><p>Half-space &#8594; defensive third &#8594; loss of threat</p></li></ul><p>This confirms the core diagnosis:</p><blockquote><p><strong>United lose continuity after resistance.</strong></p></blockquote><div><hr></div><h2>Home vs Away: Two Versions of the Same Team</h2><h3>At Home</h3><ul><li><p>xT per 100 passes: <strong>0.794</strong></p></li><li><p>Final-third net: <strong>positive</strong></p></li><li><p>Defensive influence: <strong>0.791</strong></p></li></ul><p>This is the <strong>functional version</strong> of United.</p><ul><li><p>broader progression</p></li><li><p>stable final-third play</p></li><li><p>bottleneck stays in midfield</p></li></ul><div><hr></div><h3>Away</h3><ul><li><p>xT per 100 passes: <strong>0.368</strong></p></li><li><p>Final-third net: <strong>negative</strong></p></li><li><p>Efficiency drops sharply</p></li></ul><p>Here:</p><ul><li><p>progression still exists</p></li><li><p>but breaks later</p></li><li><p>continuity collapses in attack</p></li></ul><p>Most important stat:</p><blockquote><p><strong>Bottleneck reaches the final phase in 31% of away matches (vs 0% at home).</strong></p></blockquote><div><hr></div><h2>&#9889; If you&#8217;re betting or trading this team&#8230;</h2><p>You don&#8217;t need more opinions.</p><p>You need structure + probability.</p><p>That&#8217;s exactly what the app gives you:</p><p>&#128073; <a href="https://app.footballhacking.com/">https://app.footballhacking.com/</a></p><p>Use it to:</p><ul><li><p>compare <strong>your read vs model probabilities</strong></p></li><li><p>detect <strong>over/undervalued markets</strong></p></li><li><p>measure <strong>risk (Monte Carlo robustness)</strong> before entering</p></li></ul><p>Because spotting patterns is step one.</p><p><strong>Knowing when to trust them is step two.</strong></p><div><hr></div><h2>Structural Risk Summary</h2><p>There are three core vulnerabilities:</p><h3>1. Final-third breakdown</h3><p>Access is not the issue.</p><p>Retention is.</p><div><hr></div><h3>2. Wide/deep recycling</h3><p>Kills attacking momentum.</p><div><hr></div><h3>3. Defensive gaps (right side, deeper zones)</h3><p>Expose the team after press bypass.</p><div><hr></div><h2>Final Tactical Insight</h2><p>Manchester United are:</p><blockquote><p><strong>A Bruno-led, center-finishing system with strong access &#8212; but fragile continuity.</strong></p></blockquote><p>They can:</p><ul><li><p>reach danger zones</p></li><li><p>impose structure</p></li><li><p>control territory</p></li></ul><p>But they struggle to:</p><ul><li><p>sustain pressure</p></li><li><p>maintain attacking value after disruption</p></li></ul><div><hr></div><h2>&#127919; Final Call-to-Action</h2><p>If you want to anticipate this BEFORE kickoff &#8212; not react to it mid-game:</p><p>&#128073; <a href="https://app.footballhacking.com/">https://app.footballhacking.com/</a></p><p>Inside you&#8217;ll find:</p><ul><li><p>probability models built for betting (not storytelling)</p></li><li><p>robustness layers (so you don&#8217;t get trapped in fake edges)</p></li><li><p>league-adjusted dynamics most models ignore</p></li></ul><div><hr></div><h2>Live Match Checklist (Use This)</h2><p>When watching Manchester United:</p><ul><li><p>Is <strong>Bruno central to circulation</strong>?</p></li><li><p>Are entries finishing <strong>centrally or stuck wide</strong>?</p></li><li><p>After pressure, do they <strong>stay or reset deep</strong>?</p></li><li><p>Is left half-space feeding <strong>inside or outside</strong>?</p></li><li><p>Is the press creating <strong>negative xT or just forcing passes</strong>?</p></li><li><p>When the opponent breaks the press, especially right side &#8212; <strong>control or chaos?</strong></p></li></ul><div><hr></div><p>If you can answer those in real time&#8230;</p><p>You&#8217;re not watching the game anymore.</p><p>You&#8217;re reading it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Chelsea vs Manchester United (Premier League Round 33): The Midfield Bottleneck That Will Decide the Match]]></title><description><![CDATA[How midfield structure and xT dynamics will decide Chelsea vs Manchester United &#8212; with a live betting checklist.]]></description><link>https://www.footballhacking.com/p/chelsea-vs-manchester-united-premier</link><guid isPermaLink="false">https://www.footballhacking.com/p/chelsea-vs-manchester-united-premier</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Wed, 15 Apr 2026 18:10:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a1a0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.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_!a1a0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a1a0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a1a0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2797189,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/194309291?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.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_!a1a0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!a1a0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe747ae7f-891e-40d7-92c6-6fa154af8f01_1536x1024.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 role="img" 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><title></title><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>This match will be played on Saturday, April 18, for Round 33 of the Premier League.</p><p>At first glance, this looks like a classic high-profile Premier League clash.</p><p>Two big teams. Big names. Big expectations.</p><p>But structurally, this is something much more specific.</p><p>This is a match between two teams that both experience their main friction in midfield &#8212; but react to that friction in completely different ways.</p><p>And in games like this, the winner is rarely the team that &#8220;plays better.&#8221;</p><p>It&#8217;s the team whose structure <strong>survives the interaction</strong>.</p><p>At the end of this article, you&#8217;ll find a <strong>live betting checklist</strong> designed to help you track whether the game is unfolding as expected &#8212; and whether that supports your betting decisions in real time.</p><div><hr></div><h2>Why this matchup is not about possession</h2><p>It&#8217;s tempting to frame this game through familiar lenses:</p><ul><li><p>Who dominates the ball</p></li><li><p>Who creates more chances</p></li><li><p>Who controls territory</p></li></ul><p>But those are outputs.</p><p>The real question sits earlier in the chain:</p><p>&#128073; What happens when each team meets resistance?</p><p>Chelsea arrive as the more efficient and structurally stable side.</p><p>Their profile shows:</p><ul><li><p>higher xT generation per 100 passes</p></li><li><p>better final-third efficiency</p></li><li><p>stronger defensive suppression</p></li></ul><p>They don&#8217;t need long sequences to create value. They need <strong>functional sequences</strong>.</p><p>Manchester United, by contrast, are more structure-oriented but less productive in outcome.</p><p>Their profile shows:</p><ul><li><p>lower progression output</p></li><li><p>negative net value in the final third</p></li><li><p>heavy dependence on central access</p></li></ul><p>So this match is not about volume.</p><p>&#128073; It&#8217;s about whether that volume translates into <strong>sustained value</strong>.</p><div><hr></div><h2>Understand the edge before the market does</h2><p>If you want to quantify this kind of structural edge instead of relying on intuition:</p><p>&#128073; The <strong>Football Hacking web app</strong> gives you:</p><ul><li><p>Poisson-based match probabilities</p></li><li><p>Dixon-Coles adjustments (low-score realism)</p></li><li><p>Monte Carlo simulations (robustness of outcomes)</p></li><li><p>Fair odds for match, BTTS, and totals</p></li><li><p>League-specific diagnosis (pre-live vs live reliability)</p></li></ul><p>&#128073; <a href="https://app.footballhacking.com/">https://app.footballhacking.com/</a></p><div><hr></div><h2>1. Structural collision: right vs central</h2><p>Chelsea&#8217;s attacking structure is not just right-leaning.</p><p>It is <strong>right-resolving</strong>.</p><p>Even when they originate centrally or from the left corridor, the attack often ends up on the right side &#8212; particularly in the right half-space.</p><p>That distinction matters.</p><p>&#128073; Right corridor = volume<br>&#128073; Right half-space = value</p><p>This pattern is sustained through:</p><ul><li><p>Enzo Fern&#225;ndez (connective distribution)</p></li><li><p>Caicedo (stability and recycling)</p></li><li><p>Reece James (right-side facilitation)</p></li></ul><div><hr></div><p>Manchester United, on the other hand, are structurally pulled toward the center.</p><p>Their most meaningful attacking routes are:</p><ul><li><p>central corridor &#8594; central corridor (frequency)</p></li><li><p>half-space &#8594; central corridor (value)</p></li></ul><p>Everything converges toward:</p><p>&#128073; Bruno Fernandes as the relational hub</p><p></p>
      <p>
          <a href="https://www.footballhacking.com/p/chelsea-vs-manchester-united-premier">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Borussia Dortmund vs Bayer Leverkusen (Bundesliga Matchday 29) — Structural Control, Corridor Dynamics & The Hidden Geometry of the Game]]></title><description><![CDATA[A deep tactical analysis using pass networks, expected threat (xT) and graph theory centralities]]></description><link>https://www.footballhacking.com/p/borussia-dortmund-vs-bayer-leverkusen</link><guid isPermaLink="false">https://www.footballhacking.com/p/borussia-dortmund-vs-bayer-leverkusen</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 09 Apr 2026 13:44:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K4E2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K4E2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K4E2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K4E2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2966886,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/193688054?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.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_!K4E2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!K4E2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce4a8e1f-36c2-44ce-811a-dad2849f58d0_1536x1024.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 role="img" 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><title></title><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>This analysis is derived from a large-scale database where matches are decomposed through pass networks, expected threat (xT), and graph theory centrality metrics.</p><p>That allows us to move beyond what most analyses capture.</p><p>Because football at this level is not defined by:</p><ul><li><p>possession percentages</p></li><li><p>shot counts</p></li><li><p>or isolated chances</p></li></ul><p>It is defined by:</p><p>&#128073; how teams <strong>organize space</strong><br>&#128073; how they <strong>progress through corridors</strong><br>&#128073; and how they <strong>reproduce attacking patterns under pressure</strong></p><div><hr></div><h2><strong>This is not a ranking battle &#8212; this is a structural confrontation</strong></h2><p>On paper:</p><ul><li><p>Borussia Dortmund &#8594; 2nd</p></li><li><p>Bayer Leverkusen &#8594; 6th</p></li></ul><p>But structurally, this game lives in a different dimension.</p><p>Dortmund:</p><ul><li><p>stable positional structure</p></li><li><p>repeatable progression routes</p></li><li><p>controlled home environment</p></li></ul><p>Leverkusen:</p><ul><li><p>fluctuating structure</p></li><li><p>inconsistent away identity</p></li><li><p>reactive spatial behavior</p></li></ul><p>This is not about better vs worse.</p><p>&#128073; It is about <strong>structure vs variability</strong></p><div><hr></div><h2><strong>Game environments &#8212; what kind of match each team creates</strong></h2><p>Dortmund at home does not just win games.</p><p>They <strong>shape them</strong>.</p><ul><li><p>high scoring output</p></li><li><p>low concession rate</p></li><li><p>consistent defensive control</p></li><li><p>stable rhythm</p></li></ul><p>&#128073; their matches become <strong>predictable in structure</strong></p><div><hr></div><p>Leverkusen away:</p><ul><li><p>score enough to compete</p></li><li><p>concede frequently</p></li><li><p>fail to stabilize defensive phases</p></li><li><p>oscillate between control and chaos</p></li></ul><p>&#128073; their matches become <strong>unstable environments</strong></p><div><hr></div><h2><strong>Why environment matters</strong></h2><p>Because when a <strong>structured system meets an unstable one</strong>:</p><p>&#128073; the unstable system is forced into uncomfortable states</p><p>And that is where structural weaknesses appear.</p><div><hr></div><h2><strong>Build-up origins &#8594; final third entry: where the game truly begins</strong></h2><p>To understand this matchup, we need to connect:</p><p>&#128073; where possession starts<br>&#128073; where attacking value is generated</p><p>Because progression is not random.</p><p>It follows <strong>paths</strong>.</p><div><hr></div><h2><strong>Dortmund &#8212; a directional progression model</strong></h2><p>Dortmund&#8217;s attacking identity is not symmetrical.</p><p>It is <strong>directional and repeatable</strong>.</p><h3>Build-up origin:</h3><ul><li><p>central defensive corridor</p></li><li><p>left defensive corridor</p></li></ul><p>These zones:</p><ul><li><p>stabilize possession</p></li><li><p>structure spacing</p></li><li><p>initiate progression</p></li></ul><div><hr></div><h3>Final third entry distribution:</h3><p>Across matches:</p><ul><li><p>right corridor &#8594; dominant entry lane</p></li><li><p>right half-space &#8594; consistent secondary channel</p></li><li><p>central &#8594; situational penetration</p></li><li><p>left &#8594; minimal contribution</p></li></ul><p>&#128073; This creates a very clear pattern:</p><p><strong>     </strong><em><strong>central/left build-up &#8594; diagonal progression &#8594; right-side entry</strong></em></p><div><hr></div><h2><strong>Why this matters more than it seems</strong></h2><p>Dortmund does not rely on unpredictability.</p><p>They rely on:</p><p>&#128073; repetition + efficiency</p><p>The same pathways:</p><ul><li><p>are executed repeatedly</p></li><li><p>become faster</p></li><li><p>become more precise</p></li></ul><p>This leads to:</p><ul><li><p>consistent final third access</p></li><li><p>reduced decision friction</p></li><li><p>structural dominance</p></li></ul><div><hr></div><h2><strong>Progression chains &#8212; where attacking value is concentrated</strong></h2><p>Dortmund&#8217;s key passing dynamics show:</p><ul><li><p>full-backs as vertical accelerators</p></li><li><p>central defenders as distribution anchors</p></li><li><p>forwards as terminal nodes</p></li></ul><p>And crucially:</p><p>&#128073; the highest-value actions concentrate on the <em><strong>right corridor and right half-space</strong></em></p><p>This aligns perfectly with their entry distribution.</p><div><hr></div><h2><strong>Midfield &#8212; not dominant, but essential</strong></h2><p>Dortmund&#8217;s midfield is often misunderstood.</p><p>It does not dominate progression.</p><p>Instead, it:</p><ul><li><p>connects phases</p></li><li><p>stabilizes transitions</p></li><li><p>supports directional play</p></li></ul><p>&#128073; value is created after midfield, not within it</p><div><hr></div><h2><strong>Leverkusen &#8212; absence of structural repetition</strong></h2><p>Now the contrast.</p><p>From the dataset:</p><p>&#128073; there is no consistent relationship between build-up origin and final third entry</p><p>This is critical.</p><p>Because it means:</p><ul><li><p>no dominant corridor</p></li><li><p>no repeatable attacking route</p></li><li><p>no structural reinforcement</p></li></ul><div><hr></div><h3>Final third entry behavior:</h3><ul><li><p>right corridor &#8594; inconsistent</p></li><li><p>left corridor &#8594; inconsistent</p></li><li><p>half-spaces &#8594; irregular</p></li><li><p>central &#8594; occasional</p></li></ul><p>&#128073; Leverkusen does not arrive in the same spaces consistently</p><div><hr></div><h2><strong>What this means in practice</strong></h2><p>Without a stable progression route:</p><ul><li><p>attacking patterns do not consolidate</p></li><li><p>efficiency does not increase</p></li><li><p>decisions become reactive</p></li></ul><p>This leads to:</p><p>&#128073; variability<br>&#128073; unpredictability<br>&#128073; and structural fragility</p><div><hr></div><h2><strong>Midfield comparison &#8212; continuity vs fragmentation</strong></h2><p>Dortmund:</p><ul><li><p>integrated midfield</p></li><li><p>supports progression</p></li><li><p>maintains continuity</p></li></ul><p>Leverkusen:</p><ul><li><p>inconsistent midfield role</p></li><li><p>unstable connections</p></li><li><p>breaks between phases</p></li></ul><p>&#128073; one connects the game<br>&#128073; the other interrupts it</p><div><hr></div><h2><strong>Final third behavior &#8212; persistence vs breakdown</strong></h2><p>Dortmund:</p><ul><li><p>consistent entry zones</p></li><li><p>low breakdown rate</p></li><li><p>persistence under pressure</p></li></ul><p>&#128073; when pressured &#8594; they stay in the same corridor</p><p>This creates:</p><ul><li><p>overloads</p></li><li><p>defensive fatigue</p></li><li><p>eventual structural collapse</p></li></ul><div><hr></div><p>Leverkusen:</p><ul><li><p>inconsistent entry zones</p></li><li><p>higher breakdown rate</p></li><li><p>reliance on individual actions</p></li></ul><p>&#128073; attacks are not structurally protected</p><div><hr></div><h2><strong>Resistance vs reaction &#8212; how each team behaves under pressure</strong></h2><p>Dortmund:</p><ul><li><p>attacking corridors &#8594; progressive continuation</p></li><li><p>midfield &#8594; recirculation</p></li><li><p>central attacking zones &#8594; high-value progression</p></li></ul><p>&#128073; pressure does not disrupt structure</p><div><hr></div><p>Leverkusen:</p><ul><li><p>pressure &#8594; fragmentation</p></li><li><p>progression &#8594; unstable</p></li><li><p>attacks &#8594; frequently collapse</p></li></ul><p>&#128073; pressure breaks their structure</p><div><hr></div><h2><strong>Defensive behavior &#8212; disruption vs exposure</strong></h2><p>Dortmund:</p><ul><li><p>central defensive control</p></li><li><p>disruption of opponent rhythm</p></li><li><p>forced low-value actions</p></li></ul><p>In advanced zones:</p><p>&#128073; defensive pressure can collapse entire attacking sequences</p><div><hr></div><p>Leverkusen:</p><ul><li><p>inconsistent defensive structure</p></li><li><p>poor transition control</p></li><li><p>high exposure</p></li></ul><p>&#128073; they do not control defensive phases</p><div><hr></div><p>&#128274; <em><strong>Premium Section &#8212; Tactical Exploitation, Interaction Layer &amp; Where the Game Breaks</strong></em></p><p>From this point forward, we are no longer describing teams.</p><p>We are analyzing <strong>how they collide</strong>.</p><p>Because matches like this are not decided by:</p><ul><li><p>who plays better</p></li><li><p>but by <strong>whose structure survives the interaction</strong></p><p></p></li></ul>
      <p>
          <a href="https://www.footballhacking.com/p/borussia-dortmund-vs-bayer-leverkusen">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Why Match Odds and Handicap Markets Are the Smartest Bets (Pre-Match and Live)]]></title><description><![CDATA[Stop Betting Goals Blindly &#8212; Start Understanding What Teams Actually Do When It Matters]]></description><link>https://www.footballhacking.com/p/why-match-odds-and-handicap-markets</link><guid isPermaLink="false">https://www.footballhacking.com/p/why-match-odds-and-handicap-markets</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Tue, 07 Apr 2026 13:03:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JfE7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.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_!JfE7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JfE7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JfE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2613615,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/193447757?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.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_!JfE7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JfE7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82e886bb-8e38-40b5-93ab-157697645aeb_1536x1024.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 role="img" 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><title></title><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>If you&#8217;ve spent any serious time in football betting, you&#8217;ve probably noticed something frustrating: <strong>you can be &#8220;right&#8221; about a game&#8230; and still lose money</strong>.</p><p>You read the match well.<br>You identified the stronger team.<br>You even anticipated dominance.</p><p>And yet &#8212; your bet on goals fails.</p><p>Why?</p><p>Because most bettors (and even many models) focus on <em>averages</em>, not <strong>behavior under pressure</strong>.</p><p>This is exactly why, in my view, <strong>match odds and handicap markets consistently outperform goals markets</strong> &#8212; both pre-match and especially live.</p><p>Let&#8217;s break this down properly.</p><div><hr></div><h2>The Core Misconception: Football Is Not Just About Averages</h2><p>Most betting approaches revolve around things like:</p><ul><li><p>Average goals scored</p></li><li><p>Average goals conceded</p></li><li><p>xG numbers</p></li><li><p>Historical over/under frequencies</p></li></ul><p>These are useful. But they miss something critical:</p><blockquote><p><strong>Football is a dynamic system driven by necessity, not averages.</strong></p></blockquote><p>A team doesn&#8217;t play the same way when:</p><ul><li><p>It&#8217;s winning</p></li><li><p>It&#8217;s drawing</p></li><li><p>It&#8217;s losing</p></li></ul><p>And more importantly:</p><blockquote><p><strong>A team&#8217;s true strength is revealed when it </strong><em><strong>needs</strong></em><strong> to change the game.</strong></p></blockquote><div><hr></div><h2>&#8220;When It Needs To&#8221; &#8212; The Most Underrated Concept in Betting</h2><p>This is the key idea.</p><p>Let me put it simply:</p><ul><li><p>A strong team is not just one that scores more goals on average</p></li><li><p>It&#8217;s a team that <strong>can impose its will when the game demands it</strong></p></li></ul><p>This has huge implications.</p><h3>Scenario 1 &#8212; Favorite Is Losing (or Drawing)</h3><ul><li><p>Time remaining: enough to react</p></li><li><p>Game state: unfavorable</p></li><li><p>Incentive: maximum</p></li></ul><p>What happens?</p><ul><li><p>The favorite increases pressure</p></li><li><p>Risk-taking increases</p></li><li><p>Offensive structure becomes more aggressive</p></li><li><p>Game volatility rises</p></li></ul><p>&#128073; This is where <strong>match odds and handicap markets shine</strong></p><p>Because you&#8217;re not betting on <em>goals</em> &#8212; you&#8217;re betting on <strong>the team&#8217;s ability to recover control</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h3>Scenario 2 &#8212; Favorite Is Winning</h3><ul><li><p>Time remaining: irrelevant in many cases</p></li><li><p>Game state: favorable</p></li><li><p>Incentive: control, not expansion</p></li></ul><p>What happens?</p><ul><li><p>Tempo drops</p></li><li><p>Risk is minimized</p></li><li><p>Possession becomes conservative</p></li><li><p>Attacks become selective</p></li></ul><p>&#128073; This is where <strong>goals markets become traps</strong></p><p>You may think:</p><blockquote><p>&#8220;This game is underperforming in goals &#8212; it should correct.&#8221;</p></blockquote><p>But in reality:</p><blockquote><p><strong>There is no reason for correction. The game is already solved.</strong></p></blockquote><div><hr></div><h2>Why Goals Markets Mislead You</h2><p>Goals betting assumes something like:</p><blockquote><p>&#8220;If the match is below average, it will revert upward.&#8221;</p></blockquote><p>But football is not a random distribution system.</p><p>It is <strong>strategic and state-dependent</strong>.</p><p>Let&#8217;s look at the two classic traps:</p><div><hr></div><h3>Trap #1 &#8212; Low Goals, Favorite Winning</h3><ul><li><p>You see: &#8220;Expected goals not reached yet&#8221;</p></li><li><p>You think: &#8220;There&#8217;s value in Over&#8221;</p></li></ul><p>But:</p><ul><li><p>The favorite has no incentive to push</p></li><li><p>The opponent may lack quality to break through</p></li><li><p>The game enters control mode</p></li></ul><p>&#128073; Result: slow death &#8594; losing bet</p><div><hr></div><h3>Trap #2 &#8212; High Goals, Favorite Not Winning</h3><ul><li><p>You see: &#8220;Too many goals already&#8221;</p></li><li><p>You think: &#8220;Game is overextended&#8221;</p></li></ul><p>But:</p><ul><li><p>The favorite still <em>needs</em> a result</p></li><li><p>Pressure continues</p></li><li><p>Game remains open</p></li></ul><p>&#128073; Result: chaos continues &#8594; goals keep coming</p><div><hr></div><h2>What the Market Gets Wrong</h2><p>Bookmakers are not naive.</p><p>But they are constrained by:</p><ul><li><p>Pre-match goal expectations</p></li><li><p>Public betting behavior</p></li><li><p>Statistical baselines</p></li></ul><p>This leads to a subtle inefficiency:</p><blockquote><p><strong>Markets often underprice the &#8220;reaction capacity&#8221; of strong teams</strong></p></blockquote><p>Especially live.</p><p>Because:</p><ul><li><p>They anchor heavily to pre-match expectations</p></li><li><p>They adjust slower to <em>behavioral shifts</em> than to raw stats</p></li></ul><div><hr></div><h2>Why Match Odds and Handicap Markets Capture This Edge</h2><p>These markets don&#8217;t care about <em>how many goals happen</em>.</p><p>They care about:</p><ul><li><p>Who controls the game</p></li><li><p>Who needs the result</p></li><li><p>Who can impose change</p></li></ul><p>Which aligns perfectly with:</p><blockquote><p><strong>&#8220;What the team is capable of doing when it needs to.&#8221;</strong></p></blockquote><div><hr></div><h3>Match Odds</h3><p>Simple but powerful.</p><p>You&#8217;re betting on:</p><ul><li><p>Structural superiority</p></li><li><p>Adaptation capacity</p></li><li><p>Game state response</p></li></ul><div><hr></div><h3>Handicap Markets</h3><p>Even better in many cases.</p><p>Why?</p><p>Because they allow you to:</p><ul><li><p>Price partial dominance</p></li><li><p>Capture comeback probability</p></li><li><p>Reduce variance compared to correct score or goals</p></li></ul><div><hr></div><h2>Pre-Match vs Live &#8212; Same Logic, Different Speed</h2><h3>Pre-Match</h3><p>You&#8217;re essentially asking:</p><ul><li><p>Which team has higher <strong>latent control capacity</strong>?</p></li><li><p>If the game becomes difficult, who adapts better?</p></li></ul><p>This is where structured models matter.</p><div><hr></div><h3>Live</h3><p>Now things get interesting.</p><p>You can observe:</p><ul><li><p>Current game state</p></li><li><p>Time remaining</p></li><li><p>Alignment (or misalignment) with expectations</p></li></ul><p>And ask:</p><blockquote><p><strong>Is the stronger team still in a position where &#8220;when it needs to&#8221; applies?</strong></p></blockquote><p>If yes &#8594; opportunity<br>If no &#8594; avoid</p><div><hr></div><h2>This Is Where Most Bettors Lose Money</h2><p>Let&#8217;s be blunt.</p><p>If you&#8217;re betting goals without understanding:</p><ul><li><p>Game state</p></li><li><p>Incentives</p></li><li><p>Structural strength</p></li></ul><p>You are likely:</p><p>&#128073; Overpaying for variance<br>&#128073; Underestimating control<br>&#128073; Misreading necessity</p><p>And that translates directly into:</p><blockquote><p><strong>Long-term losses &#8212; even if your reads feel &#8220;correct&#8221;</strong></p></blockquote><div><hr></div><h2>How I Approach This (And Why It Works)</h2><p>At Football Hacking, I don&#8217;t treat matches as static probability distributions.</p><p>I treat them as:</p><blockquote><p><strong>Adaptive systems driven by pressure, structure, and necessity</strong></p></blockquote><p>That&#8217;s why the web app focuses on:</p><ul><li><p><strong>Poisson models (properly adjusted)</strong></p></li><li><p><strong>Monte Carlo simulations (50,000 runs per match)</strong></p></li><li><p><strong>League diagnostics (pre-match vs live reliability)</strong></p></li><li><p><strong>Fair odds across key markets (including match odds and handicap)</strong></p></li><li><p><strong>Final table simulations (context matters more than you think)</strong></p></li></ul><p>&#128073; <a href="https://app.footballhacking.com/">https://app.footballhacking.com/</a></p><div class="image-gallery-embed" data-attrs="{&quot;gallery&quot;:{&quot;images&quot;:[{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a81439f-d8bf-4727-b23e-777f2701d737_1774x458.png&quot;},{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/780e3c4f-0565-4450-98de-24acf1de53ea_1801x564.png&quot;}],&quot;caption&quot;:&quot;&quot;,&quot;alt&quot;:&quot;&quot;,&quot;staticGalleryImage&quot;:{&quot;type&quot;:&quot;image/png&quot;,&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2fc1131a-e224-4e7c-be03-69a602f125e2_1456x720.png&quot;}},&quot;isEditorNode&quot;:true}"></div><p></p><div><hr></div><h2>The Real Question You Should Be Asking</h2><p>Not:</p><blockquote><p>&#8220;How many goals should happen?&#8221;</p></blockquote><p>But:</p><blockquote><p><strong>&#8220;What is this team capable of doing if the game demands it?&#8221;</strong></p></blockquote><p>That single shift changes everything.</p><div><hr></div><h2>Final Thought &#8212; And a Warning</h2><p>If you keep betting based only on:</p><ul><li><p>Goal averages</p></li><li><p>xG totals</p></li><li><p>Historical over/under trends</p></li></ul><p>You&#8217;re playing a game that:</p><p>&#128073; The market already understands<br>&#128073; The public overuses<br>&#128073; And where margins are razor thin</p><p>Meanwhile, the real edge sits in:</p><blockquote><p><strong>Understanding behavior under pressure</strong></p></blockquote><p>And that&#8217;s exactly what match odds and handicap markets allow you to exploit.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>Want to Go Deeper?</h2><p>If this way of thinking resonates with you, you&#8217;re going to like what I share regularly.</p><p>&#128073; Subscribe to the newsletter for deeper breakdowns, models, and real betting insights.</p><p>And if you&#8217;re serious about gaining an edge:</p><p>&#128073; <a href="https://app.footballhacking.com/">Explore the Football Hacking Web App</a></p><p>Because the truth is simple:</p><blockquote><p><strong>If you&#8217;re not using structured probabilities, simulations, and league diagnostics&#8230;<br>you are very likely leaving money on the table.</strong></p></blockquote>]]></content:encoded></item><item><title><![CDATA[The Hidden Pattern Behind Profitable Live Betting Leagues]]></title><description><![CDATA[What most bettors miss about league behavior &#8212; and how base and slope expose real in-play opportunities]]></description><link>https://www.footballhacking.com/p/the-best-leagues-for-live-betting</link><guid isPermaLink="false">https://www.footballhacking.com/p/the-best-leagues-for-live-betting</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Fri, 03 Apr 2026 03:15:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wSFf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.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_!wSFf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wSFf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wSFf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2820617,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/192845384?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.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_!wSFf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!wSFf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3038ab37-9304-413f-a023-e342cb69f570_1536x1024.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 role="img" 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><title></title><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>&#128073; If you want to truly understand how football behaves beyond surface-level stats &#8212; and turn that into decision-making &#8212; subscribe now. This is where models become actionable.</p><div><hr></div><p>Most bettors think live betting is about speed.</p><p>It&#8217;s not.</p><p>It&#8217;s about <strong>context</strong>.</p><p>Because the same situation &#8212;<br>a favorite losing at 60&#8217; &#8212;<br>means completely different things depending on the league.</p><p>And if you ignore that, your model isn&#8217;t wrong.</p><p>You are.</p><div><hr></div><h2>The Real Problem: Treating All Leagues as Equal</h2><p>Here&#8217;s what almost nobody does:</p><p>They build a model&#8230;<br>they validate it&#8230;<br>and then they apply it <em>uniformly across leagues</em>.</p><p>That&#8217;s the mistake.</p><p>Because football leagues are not just different in quality.</p><p>They are different in <strong>structure</strong>.</p><p>And that structure determines one thing:</p><blockquote><p>Does your model improve&#8230; or degrade&#8230; when the game goes live?</p></blockquote><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>Base and Slope: The Hidden DNA of Each League</h2><p>Let&#8217;s simplify this in a way that actually matters for betting.</p><ul><li><p><strong>Base</strong> &#8594; how stable the league is at its core (low-score dependency, structural consistency)</p></li><li><p><strong>Slope</strong> &#8594; how the league reacts when volatility increases (game state changes)</p></li></ul><p>Now translate that into live betting:</p><ul><li><p><strong>High positive slope</strong> &#8594; the model adapts and often improves</p></li><li><p><strong>Near-zero slope</strong> &#8594; the model holds structure but doesn&#8217;t evolve much</p></li><li><p><strong>Negative slope</strong> &#8594; the model becomes less reliable under pressure</p></li></ul><p>But here&#8217;s the nuance most people miss:</p><blockquote><p>Slope alone does NOT define live quality.</p></blockquote><p>The interaction between <strong>base + slope</strong> is what matters.</p><p></p>
      <p>
          <a href="https://www.footballhacking.com/p/the-best-leagues-for-live-betting">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🚀 Stop Guessing: How League Diagnosis Is Changing Football Betting (Pre-Match and Live)]]></title><description><![CDATA[A new way to understand when your model is actually trustworthy.]]></description><link>https://www.footballhacking.com/p/stop-guessing-how-league-diagnosis</link><guid isPermaLink="false">https://www.footballhacking.com/p/stop-guessing-how-league-diagnosis</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Tue, 31 Mar 2026 14:42:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hDi_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.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_!hDi_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hDi_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hDi_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3249217,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/192737152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.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_!hDi_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!hDi_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7b8ddeb-f893-409f-b6b3-b69a437be4b5_1536x1024.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 role="img" 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><title></title><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>If you&#8217;ve ever used a football model&#8212;even a good one&#8212;you&#8217;ve probably asked yourself this:</p><p><strong>&#8220;Can I really trust this prediction?&#8221;</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking &#233; uma publica&#231;&#227;o apoiada pelos leitores. Para receber novos posts e apoiar meu trabalho, considere tornar-se uma assinatura gratuita ou uma assinatura paga.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Not just in general&#8230; but specifically:</p><ul><li><p>Can I trust this <strong>before kickoff</strong>?</p></li><li><p>Or does this game only become reliable <strong>once it starts</strong>?</p></li></ul><p>That question is exactly what most models fail to answer.</p><p>And that&#8217;s precisely what we just solved.</p><div><hr></div><h2>&#129504; The Hidden Problem in Football Models</h2><p>Most football models&#8212;Poisson-based or not&#8212;give you:</p><ul><li><p>probabilities</p></li><li><p>odds</p></li><li><p>maybe even correct score distributions</p></li></ul><p>But they <strong>don&#8217;t tell you when they are reliable</strong>.</p><p>And that&#8217;s a massive blind spot.</p><p>Because the truth is:</p><blockquote><p><strong>Not all leagues behave the same way.</strong></p></blockquote><p>Some leagues are:</p><ul><li><p>stable</p></li><li><p>predictable</p></li><li><p>well-behaved pre-match</p></li></ul><p>Others are:</p><ul><li><p>chaotic</p></li><li><p>reactive</p></li><li><p>only understandable once the game unfolds</p></li></ul><p>Until now, this was something you had to &#8220;feel&#8221;.</p><p>Now it&#8217;s measurable.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>&#9881;&#65039; Introducing League Reliability Diagnosis</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tsg1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tsg1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 424w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 848w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 1272w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tsg1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png" width="1456" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49047,&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://www.footballhacking.com/i/192737152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.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_!Tsg1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 424w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 848w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 1272w, https://substackcdn.com/image/fetch/$s_!Tsg1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b290b51-b02e-4b84-8dd8-1f03fd0382d0_1818x399.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We&#8217;ve just added a new feature to the app that does something simple&#8212;but powerful:</p><blockquote><p>It tells you how reliable each league is for <strong>pre-live</strong> and <strong>live betting scenarios</strong>.</p></blockquote><p>No formulas. No complexity exposed.</p><p>Just:</p><ul><li><p><strong>Pre-Live Suitability Score</strong></p></li><li><p><strong>Live Suitability Score</strong></p></li><li><p>A clear interpretation of what that means</p></li></ul><p>All of this is calculated internally using structural league behavior derived from real match data (not guesswork).</p><div><hr></div><p>&#128073; <strong><a href="https://app.footballhacking.com">Try it yourself with a 7-day free trial</a></strong></p><div><hr></div><h2>&#128202; What This Actually Means in Practice</h2><p>Let&#8217;s break it down.</p><h3>1. Pre-Live Suitability</h3><p>This tells you:</p><blockquote><p>How much you can trust the model <strong>before kickoff</strong></p></blockquote><p>High score =</p><ul><li><p>stable scoring patterns</p></li><li><p>low structural noise</p></li><li><p>consistent behavior</p></li></ul><p>Low score =</p><ul><li><p>heavy or irregular leagues</p></li><li><p>higher model uncertainty</p></li><li><p>more caution required</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MMkf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MMkf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 424w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 848w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 1272w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MMkf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png" width="1456" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49320,&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://www.footballhacking.com/i/192737152?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.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_!MMkf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 424w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 848w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 1272w, https://substackcdn.com/image/fetch/$s_!MMkf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2af60c8-c7db-48ed-aa6b-b12cb18df600_1818x399.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h3>2. Live Suitability</h3><p>This tells you:</p><blockquote><p>How much the game itself adds useful information</p></blockquote><p>High score =</p><ul><li><p>strong reaction to match dynamics</p></li><li><p>game state matters</p></li><li><p>live opportunities emerge</p></li></ul><p>Low score =</p><ul><li><p>game flow doesn&#8217;t add much</p></li><li><p>what you saw pre-match is basically what you get</p></li></ul><div><hr></div><h2>&#128293; Why This Changes Everything</h2><p>This feature answers something that was previously implicit:</p><blockquote><p><strong>Where is the edge actually coming from?</strong></p></blockquote><p>Because now you can clearly separate:</p><h3>&#128994; Pre-Live Driven Leagues</h3><ul><li><p>model already captures most of the truth</p></li><li><p>good for early positions</p></li></ul><h3>&#128308; Live-Driven Leagues</h3><ul><li><p>game state reveals hidden value</p></li><li><p>ideal for in-play strategies</p></li></ul><h3>&#128993; Hybrid Leagues</h3><ul><li><p>both approaches can work</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>&#129513; Real Insight: Same Sport, Different Physics</h2><p>One of the most surprising discoveries behind this feature is:</p><blockquote><p><strong>Football is not statistically uniform across leagues.</strong></p></blockquote><p>Two leagues can look similar on the surface&#8230;</p><p>&#8230;but behave completely differently under the hood.</p><p>Some leagues:</p><ul><li><p>suppress variance early</p></li><li><p>explode later</p></li></ul><p>Others:</p><ul><li><p>stay flat throughout</p></li><li><p>or even become less predictable</p></li></ul><p>This is not opinion.</p><p>It&#8217;s measurable behavior.</p><p>And now it&#8217;s visible inside the app.</p><div><hr></div><p>&#128073; <strong><a href="https://app.footballhacking.com">Unlock league-level intelligence now (7-day free trial)</a></strong></p><div><hr></div><h2>&#129504; Built on Real Model Behavior (Not Heuristics)</h2><p>This is not a &#8220;tagging&#8221; system or subjective classification.</p><p>It&#8217;s derived from how the model behaves under different conditions.</p><p>The same engine that powers:</p><ul><li><p>Poisson score distributions</p></li><li><p>Dixon-Coles adjustments</p></li><li><p>dispersion and skew analysis</p></li></ul><p>&#8230;is used to evaluate:</p><ul><li><p>structural stability</p></li><li><p>responsiveness to match dynamics</p></li></ul><p>So when the app tells you a league is:</p><ul><li><p>&#8220;Excellent for live&#8221;</p></li><li><p>or &#8220;Difficult for pre-live&#8221;</p></li></ul><p>It&#8217;s not a guess.</p><p>It&#8217;s a reflection of how reality behaves in that competition.</p><div><hr></div><h2>&#9889; From Theory to Action</h2><p>Let&#8217;s make this practical.</p><p>Before this feature, your workflow probably looked like:</p><blockquote><p>&#8220;This looks like a good spot&#8230; I think I&#8217;ll enter.&#8221;</p></blockquote><p>Now it becomes:</p><blockquote><p>&#8220;This league is strong for live, the favorite is not winning, and the game confirms dominance.&#8221;</p></blockquote><p>That&#8217;s a completely different level of decision-making.</p><p>You&#8217;re no longer relying on:</p><ul><li><p>intuition</p></li><li><p>isolated stats</p></li></ul><p>You&#8217;re combining:</p><ul><li><p>model output</p></li><li><p>league behavior</p></li><li><p>game state</p></li></ul><div><hr></div><h2>&#129513; Where This Fits in the App</h2><p>This feature is already integrated into the main workflow.</p><p>Right after selecting a league, you now see:</p><ul><li><p>Pre-Live Suitability</p></li><li><p>Live Suitability</p></li><li><p>League Profile (Hybrid / Live-Oriented / Pre-Live Oriented)</p></li></ul><p>This sits <strong>before match selection</strong>, which is exactly where it belongs.</p><p>Because:</p><blockquote><p><strong>Context comes before prediction.</strong></p></blockquote><p>And that&#8217;s a principle most tools completely ignore.</p><div><hr></div><h2>&#128640; Why This Matters Long-Term</h2><p>This is not just a UI improvement.</p><p>It&#8217;s a shift in how betting models should be used.</p><p>Instead of asking:</p><blockquote><p>&#8220;What is the probability?&#8221;</p></blockquote><p>You start asking:</p><blockquote><p>&#8220;When should I trust this probability?&#8221;</p></blockquote><p>That single shift is what separates:</p><ul><li><p>casual users</p></li><li><p>from structured, data-driven decision makers</p></li></ul><div><hr></div><h2>&#128161; Final Thought</h2><p>There&#8217;s a common belief in betting:</p><blockquote><p>&#8220;Models don&#8217;t work.&#8221;</p></blockquote><p>The reality is more nuanced:</p><blockquote><p>Models work&#8212;but only if you understand <strong>when</strong> they work.</p></blockquote><p>This new feature exists to answer exactly that.</p><p>And once you start thinking this way&#8230;</p><p>&#8230;it&#8217;s very hard to go back.</p><div><hr></div><p>&#128073; <strong><a href="https://app.footballhacking.com">Start your 7-day free trial and test it yourself</a></strong></p><div><hr></div><p>If you&#8217;ve been looking for a more structured, data-driven approach to football betting, this is one of those features that quietly changes everything.</p><p>And it&#8217;s just getting started.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I Tested Football Leagues With Dixon-Coles — Here’s What Actually Predicts Stability]]></title><description><![CDATA[Some leagues reward data-driven betting. Others punish it. These parameters show you exactly where the difference lies.]]></description><link>https://www.footballhacking.com/p/i-tested-football-leagues-with-dixon</link><guid isPermaLink="false">https://www.footballhacking.com/p/i-tested-football-leagues-with-dixon</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 26 Mar 2026 13:43:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NLOR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.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_!NLOR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NLOR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NLOR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2542980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/192205691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.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_!NLOR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!NLOR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9100ebfe-3033-4ce8-8ad0-039b027f66f9_1536x1024.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 role="img" 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><title></title><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>&#128073; <strong>Quick note before we dive in:</strong><br>If you want to move beyond intuition and start thinking like a data-driven bettor, subscribe to the <strong>Football Hacking newsletter</strong> and explore the <strong><a href="https://app.footballhacking.com/">Football Hacking Web App</a></strong>.<br>Everything you&#8217;re about to read&#8212;Poisson modeling, Dixon-Coles adjustments, Monte Carlo robustness&#8212;is already being applied there in real scenarios.</p><p>And one important detail:<br><strong>this is an ongoing research process.</strong><br>More leagues are constantly being studied, refined, and added&#8212;so the insights you&#8217;ll see here are just the beginning of a much deeper framework that keeps evolving.</p><div><hr></div><h2>The Hidden Layer Most Bettors Ignore</h2><p>Most people think they&#8217;re analyzing matches.</p><p>They&#8217;re not.</p><p>They&#8217;re reacting to narratives, recent results, or market movement.</p><p>But if you&#8217;re using a Poisson model&#8212;especially with a Dixon-Coles adjustment&#8212;you&#8217;re already operating at a different level. And once you introduce <strong>league-specific base and slope parameters</strong>, you unlock something even more powerful:</p><blockquote><p>You stop modeling matches&#8230; and start modeling <strong>league behavior</strong>.</p></blockquote><p>And that changes everything.</p><div><hr></div><h2>The Core Idea (Without Overcomplicating It)</h2><p>At the heart of this approach is a simple but profound adjustment:</p><pre><code>rho = base + slope * (d_total_goals - 1)</code></pre><p>This is not just math&#8212;it&#8217;s interpretation.</p><ul><li><p><strong>Base</strong> tells you how structured a league is</p></li><li><p><strong>Slope</strong> tells you how that structure reacts to instability<br></p></li></ul><p>Together, they define:</p><ul><li><p>Predictability</p></li><li><p>Stability</p></li><li><p>Reliability of your model<br></p></li></ul><p>And ultimately:</p><blockquote><p>Whether your edge is real&#8212;or just noise.</p></blockquote><div><hr></div><h2>Base: The Structural DNA of a League</h2><p>Think of <strong>base</strong> as the league&#8217;s personality when everything is &#8220;normal.&#8221;</p><p>When dispersion is around 1 (i.e., matches behave close to Poisson expectations), base defines how much low-score outcomes deviate from independence.</p><div><hr></div><h3>What the Data Tells Us</h3><p>Across the leagues you&#8217;ve calibrated, a pattern emerges very clearly:</p><h3>&#128313; Strongly Negative Base (&#8776; -0.20)</h3><p>Leagues like:</p><ul><li><p>LaLiga</p></li><li><p>Serie A</p></li><li><p>Ligue 2</p></li><li><p>Eredivisie<br></p></li></ul><p>These are leagues with <strong>strong structural discipline</strong>.</p><p>Matches tend to:</p><ul><li><p>Follow tactical expectations</p></li><li><p>Respect game state</p></li><li><p>Produce more &#8220;controlled&#8221; outcomes</p></li></ul><p>&#128073; In practical terms:<br><br>These leagues are <strong>predictable</strong>&#8212;not in outcomes, but in <em>distribution of outcomes</em>.</p><p></p>
      <p>
          <a href="https://www.footballhacking.com/p/i-tested-football-leagues-with-dixon">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[🚀 Football Hacking App Is Moving to Its Own Domain — Here’s What That Means]]></title><description><![CDATA[Nothing changes today &#8212; everything becomes possible from here.]]></description><link>https://www.footballhacking.com/p/football-hacking-app-is-moving-to</link><guid isPermaLink="false">https://www.footballhacking.com/p/football-hacking-app-is-moving-to</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 19 Mar 2026 13:04:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cPU5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.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_!cPU5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cPU5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cPU5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2743821,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/191462451?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.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_!cPU5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!cPU5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00e9569f-4d1a-4968-b4b2-2d4a3beacda7_1536x1024.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 role="img" 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><title></title><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></p><p>A small change on the surface&#8230;<br>but a very important step behind the scenes.</p><p>&#128073; <a href="https://app.footballhacking.com/">The Football Hacking app is officially moving to a new home:</a></p><p>At first glance, you might think: <em>&#8220;Okay, just a new URL.&#8221; </em>But this move is actually about something much bigger.</p><div><hr></div><h2>&#128295; This Isn&#8217;t About New Features (Yet)</h2><p>Let&#8217;s be clear &#8212; nothing changes in terms of functionality right now.</p><ul><li><p>Same models</p></li><li><p>Same data</p></li><li><p>Same dashboards</p></li><li><p>Same logic you&#8217;re already used to</p></li></ul><p>This is not a &#8220;new version&#8221; of the app.</p><p>&#128073; It&#8217;s the <strong>foundation for what comes next</strong>.</p><div><hr></div><h2>&#129521; Why This Step Was Necessary</h2><p>Until now, the app was running in an environment that made fast iteration&#8230; difficult.</p><p>If you want to build something serious &#8212; something that evolves consistently &#8212; you need the right structure behind it.</p><p>Moving to a dedicated domain allows:</p><ul><li><p>More control over the platform</p></li><li><p>Better organization of the system</p></li><li><p>A cleaner path for future development</p></li><li><p>The ability to scale without friction</p></li></ul><p>In simple terms:</p><p>&#128073; This move is what makes <em>continuous improvement possible</em>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>&#128161; Why the App Will Become a Separate Subscription</h2><p>As the app grows, so does the work required to maintain and evolve it.</p><p>Even without new features today, there&#8217;s already:</p><ul><li><p>Ongoing model calibration</p></li><li><p>Data processing and validation</p></li><li><p>Infrastructure management</p></li><li><p>Continuous monitoring</p></li></ul><p>Separating the app into its own subscription is what allows:</p><ul><li><p>Consistent development over time</p></li><li><p>Proper support for users</p></li><li><p>Long-term sustainability of the project</p></li></ul><p>&#128073; It&#8217;s not about changing the product &#8212;<br>it&#8217;s about making sure it <strong>keeps improving</strong>.</p><div><hr></div><h2>&#127873; Premium Newsletter Subscribers &#8212; You&#8217;re Covered</h2><p>If you&#8217;re already a <strong>Premium subscriber to the Football Hacking newsletter</strong>, you will:</p><p>&#9989; <strong>Continue to have Premium access to the app for a limited period</strong></p><p>No disruption. No sudden changes.</p><p>This transition is designed to be smooth &#8212; and fair to those who&#8217;ve been supporting the project.</p><div><hr></div><h2>&#129504; Building for the Long Term</h2><p>This move marks a shift in mindset.</p><p>Football Hacking is no longer just something that works today &#8212;<br>it&#8217;s something being structured to <strong>evolve continuously</strong>.</p><p>That means:</p><ul><li><p>More flexibility to improve models</p></li><li><p>Faster iteration cycles</p></li><li><p>A stronger, more reliable platform</p></li></ul><p>&#128073; The goal isn&#8217;t to change everything overnight.</p><p>It&#8217;s to build something that gets <strong>better every week</strong>.</p><div><hr></div><h2>&#128302; What This Unlocks</h2><p>Even though you don&#8217;t see new features today, this step unlocks:</p><ul><li><p>Future improvements without technical bottlenecks</p></li><li><p>Better integration between tools</p></li><li><p>A more professional and scalable ecosystem</p></li></ul><p>Think of it like this:</p><p>&#128073; Before, development had limits.<br>&#128073; Now, those limits are gone.</p><div><hr></div><h2>&#128236; The Newsletter Is Still the Core</h2><p>The Football Hacking newsletter remains at the heart of everything.</p><p>That&#8217;s where you&#8217;ll continue to find:</p><ul><li><p>Deep analytical insights</p></li><li><p>Model breakdowns</p></li><li><p>Strategy discussions</p></li><li><p>Context that makes the data actually usable</p></li></ul><p>&#128073; If you&#8217;re not subscribed yet, this is the best time to join.</p><p>Because as the ecosystem grows, the newsletter becomes even more valuable.</p><div><hr></div><h2>&#128200; Why This Matters for You</h2><p>If you&#8217;re already using Football Hacking, this change means:</p><ul><li><p>A more stable platform going forward</p></li><li><p>Continuous improvements over time</p></li><li><p>A project that is being taken seriously at every level</p></li></ul><p>And if you&#8217;re considering joining:</p><p>&#128073; You&#8217;re getting in at the exact moment things start scaling.</p><div><hr></div><h2>&#9889; Final Thoughts</h2><p>No new features. No flashy updates.</p><p>Just something much more important:</p><p>&#128073; <strong>A solid foundation to keep building.</strong></p><p>This is the kind of step that often goes unnoticed &#8212;<br>but it&#8217;s exactly what separates short-term projects from long-term platforms.</p><p>Football Hacking is choosing the second path.</p><div><hr></div><p><strong>&#128073; Join the newsletter. Follow the evolution. Be part of what&#8217;s coming next.</strong></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><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[The Most Predictable Football Leagues in the World (Data Study) ]]></title><description><![CDATA[We ran thousands of probabilistic forecasts across dozens of leagues. The results reveal where football behaves like a model &#8212; and where it behaves like chaos.]]></description><link>https://www.footballhacking.com/p/the-most-predictable-football-leagues</link><guid isPermaLink="false">https://www.footballhacking.com/p/the-most-predictable-football-leagues</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Tue, 17 Mar 2026 03:15:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!j4xT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.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_!j4xT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j4xT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j4xT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3452982,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/191124536?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.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_!j4xT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!j4xT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb664ff9-b014-4aff-883d-bbf39eb775c9_1536x1024.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 role="img" 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><title></title><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><h2></h2><p>If you build football prediction models long enough, you eventually encounter a frustrating reality.</p><p>Sometimes the model works beautifully.</p><p>Other times it fails completely.</p><p>And the strange part is that <strong>the model itself hasn&#8217;t changed</strong>.</p><p>What changed was the <strong>league</strong>.</p><p>Some competitions follow statistical patterns that align remarkably well with probabilistic models. Others produce erratic outcomes, unstable goal distributions, and unpredictable tactical dynamics.</p><p>In other words:</p><p><strong>Football leagues themselves have different levels of predictability.</strong></p><p>This insight is rarely discussed in mainstream football analytics, but it has enormous implications for anyone working with:</p><p>&#8226; sports data science<br>&#8226; predictive modeling<br>&#8226; betting market analysis<br>&#8226; probability forecasting.</p><p>Over the past weeks I ran a large modeling experiment across dozens of professional football leagues to answer a simple but powerful question:</p><p><strong>Which football leagues are actually predictable?</strong></p><p>To answer that, I evaluated three different prediction tasks:</p><p>&#8226; <strong>Match Odds</strong> (Home / Draw / Away)<br>&#8226; <strong>BTTS &#8212; Both Teams to Score</strong><br>&#8226; <strong>Over 2.5 Goals</strong></p><p>Each league was ranked using three probabilistic evaluation metrics:</p><p>&#8226; <strong>Log Loss</strong><br>&#8226; <strong>Brier Score</strong><br>&#8226; <strong>Global Goal Dispersion Index</strong></p><p>Together these metrics reveal something deeper than simply &#8220;which team wins&#8221;.</p><p>They reveal <strong>how stable the statistical structure of a league actually is</strong>.</p><p>&#128073; <strong><a href="https://footballhacking.streamlit.app">Explore the Football Hacking web app</a></strong></p><div><hr></div><h1>Free Preview</h1><p>If two leagues have the same average number of goals per match, it does not mean they behave the same statistically.</p><p>In reality, football competitions vary enormously in terms of:</p><p>&#8226; tactical consistency<br>&#8226; attacking patterns<br>&#8226; defensive structures<br>&#8226; goal variance.</p><p>Some leagues follow distributions that fit extremely well with Poisson-based probability models.</p><p>Others exhibit <strong>significant overdispersion</strong>, where goal variance exceeds theoretical expectations.</p><p>This difference has a direct impact on prediction accuracy.</p><p>Even a well-designed model will struggle in a chaotic league, while a relatively simple model can perform surprisingly well in competitions where statistical patterns are stable.</p><p>In this study, I evaluated dozens of leagues by running rolling predictions and measuring how accurately the model estimated probabilities for:</p><p>&#8226; match outcomes<br>&#8226; both teams to score<br>&#8226; total goals.</p><p>The results produced a ranking of leagues based on their <strong>predictability under probabilistic models</strong>.</p><p>And some of the results are genuinely surprising.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w3T1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w3T1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 424w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 848w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 1272w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w3T1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png" width="650" height="996" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:996,&quot;width&quot;:650,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135554,&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://www.footballhacking.com/i/191124536?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.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_!w3T1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 424w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 848w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.png 1272w, https://substackcdn.com/image/fetch/$s_!w3T1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4765a56-f6f4-4993-a9ee-b967f0ba3b3e_650x996.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 role="img" 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><title></title><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>&#128073; <strong><a href="https://footballhacking.streamlit.app">Explore the Football Hacking web app</a></strong></p><div><hr></div><h1>Methodology: How the League Rankings Were Built</h1><p>The predictions used in this analysis are based on a structured probabilistic framework built around expected goals.</p><p>For each match, the model estimates:</p><p>&#8226; expected goals for the home team<br>&#8226; expected goals for the away team.</p><p>These values are derived from historical attacking and defensive strengths relative to league scoring averages.</p><p>Once expected goals are calculated, a <strong>Poisson goal distribution</strong> is used to estimate the probability of every possible scoreline.</p><p>For example:</p><p>0&#8211;0<br>1&#8211;0<br>1&#8211;1<br>2&#8211;1<br>2&#8211;2<br>3&#8211;1<br>and so on.</p><p>From this distribution we can derive probabilities for various betting markets.</p><p>However, real football results deviate slightly from pure Poisson assumptions &#8212; particularly for low-scoring matches.</p><p>To address this, the model applies <strong>Dixon&#8211;Coles adjustments</strong>, which correct the probabilities of outcomes like:</p><p>&#8226; 0&#8211;0<br>&#8226; 1&#8211;0<br>&#8226; 0&#8211;1<br>&#8226; 1&#8211;1.</p><p>These corrections significantly improve the realism of football probability models.</p><p>Once probabilities are generated, predictions are evaluated using proper scoring rules.</p><div><hr></div><h1>The Three Metrics Used to Rank Leagues</h1><p></p>
      <p>
          <a href="https://www.footballhacking.com/p/the-most-predictable-football-leagues">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[100,000+ Football Matches Dataset With Betting Odds: A Powerful Resource for Sports Betting Research and Data Science]]></title><description><![CDATA[A massive, structured football dataset combining match results and betting market data &#8212; built for sports betting research, predictive modeling, machine learning, and serious football analytics.]]></description><link>https://www.footballhacking.com/p/100000-football-matches-dataset-with</link><guid isPermaLink="false">https://www.footballhacking.com/p/100000-football-matches-dataset-with</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 12 Mar 2026 12:29:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uQaO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.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_!uQaO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uQaO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uQaO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1621878,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/190718436?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.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_!uQaO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!uQaO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99eb1d7e-1856-4d6b-acf3-3bf97ee6758f_1024x1024.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 role="img" 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><title></title><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></p><p>If you work with <strong>football analytics, sports betting research, or machine learning</strong>, access to a large, clean, and structured dataset is often the difference between theoretical ideas and real, testable models.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking &#233; uma publica&#231;&#227;o apoiada pelos leitores. Para receber novos posts e apoiar meu trabalho, considere tornar-se uma assinatura gratuita ou uma assinatura paga.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>That&#8217;s why I&#8217;m excited to announce the release of the <strong>Football Matches Dataset (100,000+ Games with Betting Odds)</strong> &#8212; a structured historical dataset designed specifically for <strong>quantitative football analysis, betting market research, and predictive modeling</strong>.</p><p>This dataset brings together <strong>match results, bookmaker odds, implied probabilities, and market margins</strong> across more than <strong>100,000 professional football matches</strong>, covering multiple leagues and seasons.</p><p>Whether you&#8217;re a <strong>data scientist, bettor, researcher, or football analyst</strong>, this dataset provides a <strong>solid historical foundation for building and validating football prediction models.</strong></p><div><hr></div><h2>Why Historical Football Data Matters</h2><p>Most football analytics projects eventually hit the same bottleneck:</p><p><strong>Data availability and data quality.</strong></p><p>Public football datasets often have one of two problems:</p><ol><li><p>They only contain <strong>match results</strong></p></li><li><p>They lack <strong>structured betting market information</strong></p></li></ol><p>Without odds data, you can&#8217;t properly study <strong>market efficiency, bookmaker margins, or betting value strategies.</strong></p><p>This dataset was designed specifically to solve that problem.</p><p>It combines <strong>match results and betting market data</strong> in a clean structure ready for analysis.</p><div><hr></div><h2>What Makes This Dataset Valuable</h2><p>The <strong>Football Matches Dataset (100,000+ Games with Betting Odds)</strong> includes key variables used in sports analytics and betting research.</p><h3>Core Match Data</h3><p>Each row represents a professional football match and includes:</p><ul><li><p>League</p></li><li><p>Country</p></li><li><p>Season</p></li><li><p>Round</p></li><li><p>Match date (UTC)</p></li><li><p>Home team</p></li><li><p>Away team</p></li><li><p>Final score</p></li><li><p>Match result (home win / draw / away win)</p></li></ul><p>This structure allows you to easily build models based on <strong>historical match outcomes and league-level dynamics.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ADeE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ADeE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ADeE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1908561,&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://www.footballhacking.com/i/190718436?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.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_!ADeE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!ADeE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ba58649-4731-49e5-a7d4-b950d68748cd_1536x1024.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 role="img" 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><title></title><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><div><hr></div><h3>Betting Market Data</h3><p>Where this dataset becomes particularly powerful is the inclusion of <strong>bookmaker market data.</strong></p><p>Each match contains:</p><ul><li><p>Home odds</p></li><li><p>Draw odds</p></li><li><p>Away odds</p></li><li><p>Implied probabilities</p></li><li><p>Bookmaker margin (overround)</p></li><li><p>Favorite team according to the market</p></li><li><p>Indicator showing whether the favorite actually won</p></li></ul><p>This makes it possible to study:</p><ul><li><p><strong>Market efficiency</strong></p></li><li><p><strong>Favorite-longshot bias</strong></p></li><li><p><strong>Betting value strategies</strong></p></li><li><p><strong>Closing-line value proxies</strong></p></li><li><p><strong>Market pricing behavior</strong></p></li></ul><p>These are essential ingredients for <strong>serious sports betting research.</strong></p><div><hr></div><h2>Dataset Structure</h2><p>The dataset contains the following columns:</p><pre><code><code>match_id
league
country
season
season_status
round
date_utc
home_team
away_team
home_goals
away_goals
result
odd_home
odd_draw
odd_away
implied_prob_home
implied_prob_draw
implied_prob_away
bookmaker_margin
favorite_side
favorite_won
</code></code></pre><p>The structure follows a <strong>flat tabular format</strong>, which makes it extremely easy to load and analyze.</p><p>For example, loading the dataset in Python is straightforward:</p><pre><code><code>import pandas as pd

df = pd.read_csv("football_matches_dataset.csv")
</code></code></pre><p>From there, you can immediately begin building models, visualizations, and research pipelines.</p><div><hr></div><h2><em>Get the Full Dataset</em></h2><p><em>If you&#8217;re serious about <strong>football analytics, sports betting research, or predictive modeling</strong>, having access to a large historical dataset is essential.</em></p><p><em>This <strong>100,000+ football matches dataset with betting odds</strong> gives you the raw material needed to build models, run backtests, and explore betting market behavior at scale.</em></p><p><em>Instead of spending weeks collecting and cleaning data, you can start analyzing immediately.</em></p><p><em>&#128073; <strong><a href="https://saulofaria0.gumroad.com/l/football-matches-dataset">Get instant access to the dataset here</a>:</strong></em></p><div><hr></div><h2>What You Can Build With This Dataset</h2><p>This dataset opens the door to a wide range of <strong>football analytics and betting research projects.</strong></p><p>Here are some of the most powerful applications.</p><div><hr></div><h3>1. Poisson-Based Football Prediction Models</h3><p>One of the most common approaches in football modeling is the <strong>Poisson distribution</strong>, which estimates the probability of goals scored by each team.</p><p>With over <strong>100,000 matches</strong>, you can build robust estimates of:</p><ul><li><p>Attack strength</p></li><li><p>Defensive strength</p></li><li><p>Expected goals distributions</p></li><li><p>Match outcome probabilities</p></li></ul><p>These can then be compared against bookmaker odds to identify <strong>potential value bets.</strong></p><div><hr></div><h3>2. Betting Strategy Backtesting</h3><p>If you want to test betting strategies, historical data is essential.</p><p>This dataset allows you to backtest ideas such as:</p><ul><li><p>Betting on <strong>market underdogs</strong></p></li><li><p>Betting on <strong>home favorites</strong></p></li><li><p>Value betting based on model probabilities</p></li><li><p>Strategies based on <strong>bookmaker margin</strong></p></li><li><p>Filters by <strong>league or season</strong></p></li></ul><p>Instead of guessing whether a strategy works, you can <strong>simulate thousands of historical bets.</strong></p><div><hr></div><h3>3. Machine Learning Models</h3><p>Because the dataset is large and structured, it can easily be used for <strong>machine learning experiments.</strong></p><p>Examples include:</p><ul><li><p>Logistic regression models</p></li><li><p>Gradient boosting classifiers</p></li><li><p>Neural network predictors</p></li><li><p>Outcome probability estimators</p></li></ul><p>Potential target variables include:</p><ul><li><p>Match result</p></li><li><p>Favorite wins</p></li><li><p>Probability calibration</p></li></ul><p>You can also generate additional features such as:</p><ul><li><p>Rolling team performance</p></li><li><p>League-level goal averages</p></li><li><p>Market-implied strengths</p></li></ul><div><hr></div><h3>4. Betting Market Efficiency Research</h3><p>Another fascinating application is studying how efficient football betting markets actually are.</p><p>Using this dataset, you can analyze:</p><ul><li><p>Whether favorites win as often as the market predicts</p></li><li><p>How bookmaker margins vary across leagues</p></li><li><p>Whether implied probabilities are well calibrated</p></li><li><p>Market bias patterns across seasons</p></li></ul><p>These insights are particularly valuable for <strong>academic research and professional betting analysis.</strong></p><div><hr></div><h3>5. Football Data Visualization Projects</h3><p>For those who enjoy building dashboards or analytics tools, this dataset is also perfect for visualization.</p><p>You can build charts such as:</p><ul><li><p>League goal distributions</p></li><li><p>Favorite win rates</p></li><li><p>Odds vs result comparisons</p></li><li><p>Market margin analysis</p></li><li><p>Season-level trends</p></li></ul><p>If you want inspiration for what this kind of analysis can look like, you can explore the <strong><a href="https://footballhacking.streamlit.app">Football Hacking analytics app</a></strong>:</p><p>The app demonstrates the type of <strong>data-driven football insights that can be built from structured datasets like this one.</strong></p><div><hr></div><h2>File Format and Compatibility</h2><p>You will receive the dataset in a clean CSV file:</p><pre><code><code>football_matches_dataset.csv
</code></code></pre><p>It works seamlessly with:</p><ul><li><p><strong>Python (Pandas, NumPy, Scikit-Learn)</strong></p></li><li><p><strong>R</strong></p></li><li><p><strong>SQL databases</strong></p></li><li><p><strong>Excel</strong></p></li><li><p><strong>Google Sheets</strong></p></li><li><p><strong>Data visualization tools</strong></p></li></ul><p>This makes it suitable for both <strong>advanced data scientists and analysts working with spreadsheets.</strong></p><div><hr></div><h2>Built for Data Science Workflows</h2><p>The dataset was intentionally structured to integrate easily with <strong>data science pipelines.</strong></p><p>Because it follows a simple tabular format, you can:</p><ul><li><p>Import it directly into Python or R</p></li><li><p>Store it in SQL databases</p></li><li><p>Use it in machine learning workflows</p></li><li><p>Create dashboards and analytics tools</p></li></ul><p>In other words, it is designed to <strong>get you analyzing immediately instead of spending hours cleaning raw data.</strong></p><div><hr></div><h2>Important Note About Current Seasons</h2><p>Some leagues in the dataset may still be <strong>in progress</strong>.</p><p>These matches are clearly labeled using the:</p><pre><code><code>season_status
</code></code></pre><p>column.</p><p>This allows you to easily filter between <strong>completed seasons and ongoing competitions</strong> when performing analysis or backtests.</p><div><hr></div><h2>Created by Football Hacking</h2><p>This dataset is part of the <strong>Football Hacking ecosystem</strong>, a project dedicated to:</p><ul><li><p>Data-driven football analysis</p></li><li><p>Probabilistic modeling of football matches</p></li><li><p>Sports betting research</p></li><li><p>Quantitative football analytics</p></li></ul><p>The goal is simple:</p><p><strong>Use data to understand football outcomes and betting markets more objectively.</strong></p><p>If you&#8217;re interested in seeing the type of models and analytics that can be built from structured football data, explore the <a href="https://footballhacking.streamlit.app">Football Hacking app</a>:</p><div><hr></div><h2>Final Thoughts</h2><p>Football analytics and sports betting research both depend heavily on <strong>high-quality historical data.</strong></p><p>The <strong>Football Matches Dataset (100,000+ Games with Betting Odds)</strong> provides exactly that: a large, structured dataset combining <strong>match results and betting market information</strong>.</p><p>With over <strong>100,000 matches</strong>, it becomes possible to:</p><ul><li><p>Build robust predictive models</p></li><li><p>Backtest betting strategies</p></li><li><p>Study betting market efficiency</p></li><li><p>Train machine learning algorithms</p></li><li><p>Create football analytics dashboards</p></li></ul><p>For anyone serious about <strong>football data science or betting research</strong>, this dataset provides a powerful starting point.</p><p>If you want to explore what can be built from structured football data, take a look at the <a href="https://footballhacking.streamlit.app">Football Hacking app</a>:</p><p>And if you want to run your <strong>own analyses, models, and backtests</strong>, the <strong>100,000+ match dataset</strong> gives you the raw material to do exactly that.</p><h2><em>Turn Football Data Into Real Insights</em></h2><p><em>Behind every serious football model, betting strategy, or analytics project is <strong>one thing: reliable historical data</strong>.</em></p><p><em>This dataset gives you <strong>100,000+ structured football matches with betting market information</strong>, ready for immediate use in Python, R, SQL, Excel, or any analytics workflow.</em></p><p><em>Whether you want to <strong>build prediction models, analyze betting markets, or backtest strategies</strong>, this dataset gives you the data infrastructure to do it.</em></p><p><em>&#128073; <strong><a href="https://saulofaria0.gumroad.com/l/football-matches-dataset">Get the Football Matches Dataset (100,000+ Games) here</a>:</strong></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking &#233; uma publica&#231;&#227;o apoiada pelos leitores. Para receber novos posts e apoiar meu trabalho, considere tornar-se uma assinatura gratuita ou uma assinatura paga.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><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[Log Loss Explained: The Essential Metric for Evaluating Football Prediction Models]]></title><description><![CDATA[Why accuracy alone is misleading &#8212; and why probabilistic models must be evaluated with log loss]]></description><link>https://www.footballhacking.com/p/log-loss-explained-the-essential</link><guid isPermaLink="false">https://www.footballhacking.com/p/log-loss-explained-the-essential</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Tue, 10 Mar 2026 15:29:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XehX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.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_!XehX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XehX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!XehX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!XehX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!XehX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XehX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2629681,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/190515542?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.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_!XehX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!XehX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!XehX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!XehX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f8ee6eb-87fb-4e6f-9df0-496b621b5adc_1536x1024.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 role="img" 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><title></title><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>If you build prediction models for football &#8212; especially models based on probability distributions like Poisson &#8212; sooner or later you face a crucial question:</p><p><strong>How do you know if your model is actually good?</strong></p><p>Many people evaluate models using simple metrics like:</p><ul><li><p>accuracy</p></li><li><p>hit rate</p></li><li><p>ROI</p></li></ul><p>But these metrics hide a fundamental problem.</p><p>A probabilistic model is <strong>not supposed to guess outcomes</strong>.</p><p>It is supposed to <strong>estimate probabilities</strong>.</p><p>And that is exactly where <strong>log loss</strong> becomes essential.</p><p>Log loss is one of the most important metrics in <strong>machine learning, forecasting, and predictive modeling</strong>. If you work with sports betting models, understanding this metric is absolutely crucial.</p><div><hr></div><h2>Why Accuracy Is a Misleading Metric</h2><p>Imagine two models predicting the same football match.</p><p><strong>Match:</strong> Barcelona vs Villarreal</p><h3>Model A</h3><p><em><strong>Outcome&#9;       Probability</strong></em></p><p><strong>Barcelona win&#9;51%</strong></p><p><strong>Draw&#9;                25%</strong></p><p><strong>Villarreal win&#9;24%</strong></p><p></p><h3>Model B</h3><p><em><strong>Outcome&#9;        Probability</strong></em></p><p><strong>Barcelona win&#9;90%</strong></p><p><strong>Draw&#9;                 5%</strong></p><p><strong>Villarreal win&#9; 5%</strong></p><p></p><p>Now imagine <strong>Barcelona wins the match</strong>.</p><p>Both models predicted the correct outcome. If you measure <strong>accuracy</strong>, both models look equally good.</p><p>But in reality they are not.</p><p>Model B was <strong>extremely confident</strong>.<br>Model A was <strong>much more cautious</strong>.</p><p>If Villarreal had won the match, Model B would have made a <strong>massively wrong prediction</strong>.</p><p>Accuracy completely ignores this difference.</p><p>Log loss does not.</p><div><hr></div><h2>What Log Loss Actually Measures</h2><p>Log loss evaluates <strong>how good your probability estimates are</strong>.</p><p>It measures whether your model assigned <strong>appropriate probability</strong> to the event that actually occurred.</p><p>The principle is simple:</p><ul><li><p>If your model assigns <strong>high probability to the correct outcome</strong>, the log loss is <strong>low (good)</strong>.</p></li><li><p>If your model assigns <strong>low probability to the correct outcome</strong>, the log loss is <strong>high (bad)</strong>.</p></li></ul><p>This means log loss <strong>punishes overconfidence</strong>.</p><p>And in probabilistic forecasting, that is extremely important.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>The Log Loss Formula</h2><p>The log loss formula is extremely simple.</p><p>Log Loss = -log(p)</p><p>Where:</p><ul><li><p><strong>p</strong> = probability assigned to the outcome that actually happened</p></li></ul><p>For example, imagine the real outcome occurs and your model assigned the following probabilities.</p><p><em><strong>Probability assigned &#9;        Log Loss</strong></em></p><p><strong>0.90&#9;                                 0.105</strong></p><p><strong>0.70&#9;                                         0.357</strong></p><p><strong>0.50&#9;                                 0.693</strong></p><p><strong>0.20&#9;                                 1.609</strong></p><p><strong>0.05&#9;                                 2.996</strong></p><p>Notice something important.</p><p>If your model assigns <strong>very low probability to the event that actually happens</strong>, the penalty becomes extremely large.</p><p>This forces models to stay <strong>well calibrated</strong>.</p><div><hr></div><h2>Why Log Loss Is Perfect for Betting Models</h2><p>Football models &#8212; especially those based on Poisson distributions &#8212; generate <strong>probabilities</strong>, not predictions.</p><p>For example:</p><p><em><strong>Outcome&#9;Probability</strong></em></p><p><strong>Home win&#9;47%</strong></p><p><strong>Draw&#9;        28%</strong></p><p><strong>Away win       25%</strong></p><p>These probabilities can then be transformed into:</p><ul><li><p>fair odds</p></li><li><p>expected value</p></li><li><p>value betting opportunities</p></li></ul><p>But before trusting these probabilities, you must answer one fundamental question:</p><p><strong>Are these probabilities actually reliable?</strong></p><p>Log loss helps answer exactly that.</p><p>It tells you whether your model is:</p><ul><li><p>well calibrated</p></li><li><p>overconfident</p></li><li><p>unstable</p></li><li><p>poorly specified</p></li></ul><p>Without this type of evaluation, a model might look good <strong>just because of variance</strong>.</p><div><hr></div><h2>Example: Comparing Two Models Over a Season</h2><p>Imagine evaluating two models over an entire league season.</p><p><em><strong>Model&#9;    Average Log Loss</strong></em></p><p><strong>Model A&#9;    0.92</strong></p><p><strong>Model B&#9;    1.12</strong></p><p>Even if both models have similar accuracy, <strong>Model A is clearly better</strong>.</p><p>Why?</p><p>Because its probability estimates are <strong>closer to the true uncertainty of football matches</strong>.</p><p>This is exactly what matters when building <strong>probability-driven betting strategies</strong>.</p><div><hr></div><h2>The Relationship Between Log Loss and Market Efficiency</h2><p>Here is where things become really interesting.</p><p>Bookmakers publish odds.</p><p>Those odds imply probabilities.</p><p>If your model consistently produces <strong>lower log loss than the implied probabilities from bookmakers</strong>, that suggests something important.</p><p>Your model may be capturing <strong>information the market is not fully pricing</strong>.</p><p>This does not guarantee profit.</p><p>But it strongly suggests that your model has <strong>predictive value</strong>.</p><div><hr></div><h2>Where Log Loss Fits Inside Football Hacking</h2><p>Inside the <strong><a href="https://footballhacking.streamlit.app">Football Hacking ecosystem</a></strong>, probabilistic models are evaluated using metrics designed to measure <strong>prediction quality</strong> rather than just profit.</p><p>These include:</p><ul><li><p>log loss</p></li><li><p>probability calibration</p></li><li><p>Monte Carlo robustness simulations</p></li><li><p>probability dispersion analysis</p></li></ul><p>These tools help distinguish between models that:</p><ul><li><p>truly understand uncertainty</p></li><li><p>only appear good due to variance</p></li></ul><p>If you want to explore how these models behave in practice, you can experiment directly in the Football Hacking web app.</p><p>&#128073; <a href="https://footballhacking.streamlit.app">Explore the prediction tools here:</a></p><div><hr></div><h2>Why Many Betting Models Ignore Log Loss</h2><p>Many betting models focus only on <strong>profit backtests</strong>. But profit alone is a very noisy signal.</p><p>Short-term variance can easily hide weak models.</p><p>Log loss measures something deeper: <strong>the quality of probability estimates themselves.</strong></p><p>This is why it is widely used in:</p><ul><li><p>machine learning competitions</p></li><li><p>forecasting research</p></li><li><p>predictive modeling systems</p></li></ul><p>It is one of the most reliable ways to evaluate probabilistic models.</p><div><hr></div><h2>Turning Probability Models Into Practical Tools</h2><p>Understanding log loss is only the first step. The real challenge is transforming probability models into <strong>decision-making tools</strong>.</p><p>Inside the Football Hacking platform you can explore:</p><ul><li><p>Poisson match predictions</p></li><li><p>probability distributions</p></li><li><p>Monte Carlo robustness simulations</p></li><li><p>league table forecasts</p></li></ul><p>All built around transparent, data-driven models.</p><p>&#128073; <a href="https://footballhacking.streamlit.app">Try the web app here</a></p><div><hr></div><h2>Join the Football Hacking Community</h2><p>If you&#8217;re interested in <strong>data-driven football forecasting</strong>, the Football Hacking newsletter covers topics like:</p><ul><li><p>statistical modeling in football</p></li><li><p>betting market inefficiencies</p></li><li><p>probability calibration</p></li><li><p>advanced prediction techniques</p></li></ul><p>Some articles are free, while premium subscribers get access to deeper analysis and additional tools.</p><p>&#128073; Subscribe (Free or Premium):<br></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><div><hr></div><h2>Final Thoughts</h2><p>In predictive modeling &#8212; especially in sports betting &#8212; the biggest mistake is confusing <strong>correct predictions with good models</strong>.</p><p>A model can be correct by luck.</p><p>But a good model consistently assigns <strong>accurate probabilities</strong> to events.</p><p>That is exactly what <strong>log loss measures</strong>.</p><p>It is not a glamorous metric.</p><p>But it answers one of the most important questions in predictive modeling:</p><p><strong>Does your model actually understand uncertainty?</strong></p>]]></content:encoded></item><item><title><![CDATA[Understanding Bookmaker Juice: The Hidden Cost Inside Betting Odds]]></title><description><![CDATA[How bookmaker margins distort probabilities &#8212; and why understanding them is essential for serious betting analysis.]]></description><link>https://www.footballhacking.com/p/understanding-bookmaker-juice-the</link><guid isPermaLink="false">https://www.footballhacking.com/p/understanding-bookmaker-juice-the</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Fri, 06 Mar 2026 13:38:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CBhF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.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_!CBhF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CBhF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CBhF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2429387,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/190093442?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.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_!CBhF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!CBhF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23406359-3d55-4427-938c-f68f3784c57e_1536x1024.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 role="img" 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><title></title><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></p><div><hr></div><h2>A Quick Note Before We Begin</h2><p>This article is available to <strong>both free (partially) and premium subscribers</strong>.</p><p>However, <strong>most advanced articles, deep analytical breakdowns, and the full Football Hacking web app are reserved for premium members</strong>.</p><p>Premium members get:</p><ul><li><p>Full access to the <strong><a href="https://footballhacking.streamlit.app/">Football Hacking web app</a></strong></p></li><li><p>Advanced analytics and prediction tools</p></li><li><p>Exclusive research articles on betting markets and modeling</p></li><li><p>Detailed breakdowns of football prediction methodologies</p></li></ul><p>&#128073; <strong>Become a Premium Subscriber:</strong><br></p><p><em>Note: Access to the web app is granted manually after subscription and may take a few hours to activate.</em></p><div><hr></div><h2>The Invisible Cost Behind Every Betting Market</h2><p>When bettors look at odds, they usually focus on just one thing:</p><p><strong>&#8220;What probability does this odd represent?&#8221;</strong></p><p>For example:</p><p><strong>Outcome  Odds</strong></p><p><strong>Home        2.00</strong></p><p><strong>Draw         3.40</strong></p><p><strong>Away         3.60</strong></p><p>At first glance, this seems straightforward.</p><p>But there is a hidden layer that many bettors ignore.</p><p>That layer is called <strong>bookmaker juice</strong> &#8212; also known as:</p><ul><li><p>Overround</p></li><li><p>Margin</p></li><li><p>Vig</p></li><li><p>House edge</p></li></ul><p>And it is <strong>one of the most important concepts in sports betting</strong>.</p><p>If you don&#8217;t understand bookmaker margin, you are essentially trying to evaluate markets <strong>without seeing their true probabilities</strong>.</p><div><hr></div><h2>What is Bookmaker Juice?</h2><p>Bookmakers do not create fair markets.</p><p>Instead, they create <strong>markets with built-in margin</strong>.</p><p>This ensures that <strong>the bookmaker always has a mathematical edge</strong> over bettors.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sBXh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sBXh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sBXh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2527929,&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://www.footballhacking.com/i/190093442?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.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_!sBXh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!sBXh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5b91e0-44ef-477f-970c-b97677f6af44_1536x1024.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 role="img" 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><title></title><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></p><p>Let&#8217;s look at the example odds again:</p><p><strong>Outcome Odds </strong></p><p><strong>Home       2.00</strong></p><p><strong>Draw        3.40</strong></p><p><strong>Away        3.60</strong></p><p>To understand the bookmaker&#8217;s margin, we first convert odds into <strong>implied probabilities</strong>.</p><p>The formula is simple:</p><p><em><strong>Probability = 1 / Odds</strong></em></p><p>So we get:</p><p><strong>Outcome Odds  Implied Probability </strong></p><p><strong>Home       2.00     50.00%</strong></p><p><strong>Draw        3.40     29.41% </strong></p><p><strong>Away        3.60     27.78%</strong></p><p>Now we sum the probabilities: <strong>50 + 29.41 + 27.78 = 107.19%</strong></p><p>But probabilities should sum to <strong>100%</strong>.</p><p>The extra <strong>7.19%</strong> represents the <strong>bookmaker margin</strong>.</p><p>This is the <strong>juice</strong> embedded in the market.</p><div><hr></div><h2>Why Juice Matters More Than Most Bettors Realize</h2><p>Many bettors try to identify value by simply comparing odds with their model predictions.</p><p>But there is a critical mistake in that approach.</p><p><strong>Bookmaker odds do not represent true probabilities.</strong></p><p>They represent <strong>probabilities plus margin</strong>.</p><p>&#128073; <strong><a href="https://footballhacking.streamlit.app/">Explore the Web App</a>:</strong></p><p>If you compare your model directly to bookmaker odds <strong>without adjusting for juice</strong>, you are comparing:</p><ul><li><p><strong>Your fair probabilities</strong></p></li><li><p><strong>Against distorted market probabilities</strong></p></li></ul><p>That comparison is flawed.</p><p>Professional betting analysis requires removing this margin first.</p><p>Only then can you see <strong>what the market actually believes</strong>.</p><p></p><p><em>For full access to all analytical features, research articles, and advanced betting tools:</em></p><p><em>&#128073; <strong>Become a Premium Subscriber:</strong></em></p>
      <p>
          <a href="https://www.footballhacking.com/p/understanding-bookmaker-juice-the">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[How to Read Dispersion and Skew in Football Models (And Make Smarter Decisions)?]]></title><description><![CDATA[From Averages to Extremes: What Dispersion and Skew Really Tell Us About Football?]]></description><link>https://www.footballhacking.com/p/how-to-read-dispersion-and-skew-in</link><guid isPermaLink="false">https://www.footballhacking.com/p/how-to-read-dispersion-and-skew-in</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Tue, 03 Mar 2026 03:15:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MKQz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.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_!MKQz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MKQz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MKQz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3091023,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/189265481?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.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_!MKQz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!MKQz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4173ba7c-40b1-403f-808c-c5b28ac3b7f8_1536x1024.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 role="img" 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><title></title><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><strong>If you like data-driven football analysis, consider subscribing to the Football Hacking newsletter (free or premium).</strong><br>Premium members get full access to my tools, models, and <strong>the complete dataset behind the web app across all leagues in my database</strong>.<br>You can also explore the live models here:</p><p> &#128073; <a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p><p>Poisson-based models are everywhere in football analytics. They&#8217;re elegant, interpretable, and often very effective&#8212;<strong>when the competition behaves in a reasonably stable way</strong>.</p><p>But not all leagues do.</p><p>Some competitions produce tight, controlled matches. Others regularly explode into wild scorelines. If you ignore that difference, your model will quietly misprice the tails&#8212;exactly where big wins, big losses, and big mistakes live.</p><p>That&#8217;s why I rely on a small set of <strong>diagnostic metrics</strong> to understand <em>how close reality is to a Poisson world</em> and <em>how the extremes behave</em>:</p><ul><li><p><strong>d_home</strong>: dispersion of home goals</p></li><li><p><strong>d_away</strong>: dispersion of away goals</p></li><li><p><strong>d_total_goals</strong>: dispersion of total goals</p></li><li><p><strong>d_skellam</strong>: dispersion of goal difference</p></li><li><p><strong>skew</strong>: asymmetry of extremes (which side produces more blowouts)</p></li></ul><p>Let&#8217;s go through them in practical terms.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><div><hr></div><h2>Why Dispersion Matters</h2><p>In a &#8220;perfect&#8221; Poisson process, <strong>variance &#8776; mean</strong>. So we track dispersion as:</p><blockquote><p><strong>Dispersion = Variance / Mean</strong></p></blockquote><ul><li><p><strong>&#8776; 1.0</strong> &#8594; The data behaves like Poisson expects.</p></li><li><p><strong>&gt; 1.0</strong> &#8594; <strong>Overdispersion</strong>: more chaos, fatter tails, more extreme outcomes than the model assumes.</p></li><li><p><strong>&lt; 1.0</strong> &#8594; <strong>Underdispersion</strong>: results are more concentrated and controlled than the model assumes.</p></li></ul><p>This directly affects:</p><ul><li><p>How often your model misses <strong>blowouts and collapses</strong></p></li><li><p>Whether you overprice or underprice <strong>extreme scorelines</strong></p></li><li><p>How much you should trust <strong>handicaps, totals, and margin markets</strong></p></li></ul><div><hr></div><h2>d_home: Dispersion of Home Goals</h2><p><strong>d_home</strong> tells you how variable <strong>home team goals</strong> are compared to a Poisson process.</p><ul><li><p><strong>&#8776; 1.0</strong> &#8594; Home goals behave like Poisson.</p></li><li><p><strong>&gt; 1.0</strong> &#8594; Home scoring is <strong>more volatile</strong> than expected: more games where the home team either stalls or explodes. The model tends to <strong>underestimate big home wins</strong>.</p></li><li><p><strong>&lt; 1.0</strong> &#8594; Home goals are <strong>more controlled</strong> and concentrated. The model may <strong>overestimate extreme home scores</strong>.</p></li></ul><p><strong>Decision tip:</strong><br>If d_home is high, be cautious with <strong>large home handicaps</strong> and extreme home scorelines.</p><div><hr></div><h2>d_away: Dispersion of Away Goals</h2><p><strong>d_away</strong> measures the same thing for <strong>away team goals</strong>.</p><ul><li><p><strong>&#8776; 1.0</strong> &#8594; Away goals fit Poisson well.</p></li><li><p><strong>&gt; 1.0</strong> &#8594; Away scoring is <strong>more chaotic</strong> than expected. The model may <strong>underestimate rare high away scores</strong>.</p></li><li><p><strong>&lt; 1.0</strong> &#8594; Away goals are <strong>more predictable</strong> and concentrated. The model may <strong>overestimate extreme away scores</strong>.</p></li></ul><p><strong>Decision tip:</strong><br>If d_away is low, be skeptical of markets that rely heavily on <strong>high away scoring</strong> (for example, aggressive away team totals or BTTS driven mainly by the away side).</p><div><hr></div><h2>d_total_goals: Dispersion of Total Goals</h2><p><strong>d_total_goals</strong> looks at <strong>home + away goals</strong> and is especially relevant for <strong>Over/Under</strong> markets.</p><ul><li><p><strong>&#8776; 1.0</strong> &#8594; Total goals behave like Poisson expects.</p></li><li><p><strong>&gt; 1.0</strong> &#8594; Matches are <strong>more chaotic</strong> in total scoring. The model may <strong>underestimate very high or very low totals</strong>.</p></li><li><p><strong>&lt; 1.0</strong> &#8594; Matches are <strong>more controlled</strong>. The model may <strong>overestimate extreme Overs and wild scorelines</strong>.</p></li></ul><p><strong>Decision tip:</strong><br>If d_total_goals is high, be more conservative with <strong>high Over lines</strong> and extreme totals.</p><div><hr></div><h2>d_skellam: Dispersion of Goal Difference</h2><p>Goal difference (home &#8722; away) follows a <strong>Skellam distribution</strong> if both teams are Poisson. A practical diagnostic is:</p><blockquote><p><strong>d_skellam = Var(Home &#8722; Away) / Mean(Total Goals)</strong></p></blockquote><ul><li><p><strong>&#8776; 1.0</strong> &#8594; Winning margins look like the model expects.</p></li><li><p><strong>&gt; 1.0</strong> &#8594; Margins are <strong>more spread out</strong>: more big wins and heavy defeats. The model may <strong>underestimate wide handicaps</strong>.</p></li><li><p><strong>&lt; 1.0</strong> &#8594; Margins are <strong>more concentrated</strong>: more narrow wins and draws. The model may <strong>overestimate big winning margins</strong>.</p></li></ul><p><strong>Decision tip:</strong><br>If d_skellam is high, be extra cautious with <strong>large handicaps and exact margin markets</strong>.</p><div><hr></div><h2>Skew: This Is NOT Home Advantage</h2><p>Here&#8217;s the crucial clarification:</p><blockquote><p><strong>Skew does NOT measure home advantage or away advantage.</strong></p></blockquote><p>Home advantage is about <strong>average performance</strong>.<br><strong>Skew is about the tails</strong>: it tells you <strong>to which side the extreme results (blowouts, big margins) tend to go</strong>.</p><p>In football terms, skew answers this question:</p><blockquote><p>When games break, <strong>do they break more often into big home wins or big away wins</strong>?</p></blockquote><ul><li><p><strong>Skew &#8776; 0</strong> &#8594; Symmetric tails. Big home wins and big away wins happen with similar frequency.</p></li><li><p><strong>Skew &gt; 0</strong> &#8594; Right-skewed. <strong>Extreme results are more often big home wins</strong>. The model may <strong>underestimate very large home victories</strong>.</p></li><li><p><strong>Skew &lt; 0</strong> &#8594; Left-skewed. <strong>Extreme results are more often big away wins</strong>. The model may <strong>underestimate very large away victories</strong>.</p></li></ul><p>This is about <strong>blowouts and heavy margins</strong>, not about who is better on average.</p><p>You can have:</p><ul><li><p>Strong home advantage but <strong>skew &#8776; 0</strong> (extremes balanced), or</p></li><li><p>Modest home advantage but <strong>positive skew</strong> (when games explode, they usually explode in favor of the home side).</p></li></ul><p><strong>Decision tip:</strong></p><ul><li><p>Positive skew &#8594; be careful with <strong>large home handicaps</strong> being too cheap.</p></li><li><p>Negative skew &#8594; be careful with <strong>large away handicaps</strong> being too cheap.</p></li></ul><div><hr></div><h2>How to Use These Metrics Together</h2><p>Think of them as <strong>context and risk filters</strong>:</p><ul><li><p><strong>Dispersion near 1.0</strong> &#8594; Poisson assumptions are well supported.</p></li><li><p><strong>Dispersion well above 1.0</strong> &#8594; More chaos &#8594; be conservative with extremes.</p></li><li><p><strong>Dispersion below 1.0</strong> &#8594; More control &#8594; extremes are rarer than the model suggests.</p></li><li><p><strong>Skew</strong> tells you <strong>which side tends to produce the blowouts</strong>.</p></li></ul><p>They don&#8217;t replace your model. They tell you <strong>how much you should trust it, and where it&#8217;s likely to fail first</strong>.</p><div><hr></div><h2>Explore This in the Football Hacking Web App</h2><p>All these metrics are available in my tools so you can <strong>inspect league behavior before trusting any prediction</strong>.</p><p>&#128073; Visit the app: <a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p><p>And an important note:</p><p><strong>Premium subscribers get access to the full dataset behind the web app for </strong><em><strong>all leagues in my database</strong></em><strong>.</strong><br>That means you can <strong>download and analyze the same data</strong> used in the models.</p><div><hr></div><h2>Final Call to Action</h2><p>If you care about:</p><ul><li><p>Football analytics</p></li><li><p>Probabilistic modeling</p></li><li><p>Understanding <strong>when</strong> a model should (and should not) be trusted</p></li></ul><p>&#128073; <strong>Subscribe to the Football Hacking newsletter (free or premium).</strong></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><br>&#128073; <strong><a href="https://footballhacking.streamlit.app/">Explore the web app and the data:</a></strong></p><p>The real edge is not just building models&#8212;it&#8217;s <strong>understanding the environments they live in</strong>. That&#8217;s how you avoid being fooled by averages and start respecting the extremes.</p>]]></content:encoded></item><item><title><![CDATA[Why Poisson Models Work Better in Some Football Leagues Than Others?]]></title><description><![CDATA[From signal to chaos: when Poisson Works&#8212;and when it doesn&#8217;t&#8212;in football.]]></description><link>https://www.footballhacking.com/p/why-poisson-models-work-better-in</link><guid isPermaLink="false">https://www.footballhacking.com/p/why-poisson-models-work-better-in</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 26 Feb 2026 14:28:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eHbT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.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_!eHbT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eHbT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eHbT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3100655,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/189254431?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.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_!eHbT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!eHbT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F746200fa-1c20-40d8-ae97-a0e192ee8de6_1536x1024.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 role="img" 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><title></title><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><strong>&#128073; If you want full access to my models, data, and interactive tools, become a premium subscriber to Football Hacking. Premium members get complete access to the web app, more leagues, and deeper analytics. This is where I publish and maintain everything I actually use in practice.</strong></p><p>Football fans love certainty. Bettors love probabilities. Data scientists love models. And somewhere in the middle of all that sits one of the most popular tools in football analytics: the <strong>Poisson model</strong>.</p><p>If you&#8217;ve ever tried to predict football scores, you already know the drill: estimate expected goals (&#955;) for each team, run a Poisson distribution, build a score matrix, and out come the probabilities. Simple. Elegant. Powerful.</p><p>But there&#8217;s a catch.</p><p>If you&#8217;ve tested this seriously across multiple leagues, you&#8217;ve probably noticed something strange:<br><strong>the same Poisson model can look great in one league and pretty mediocre in another.</strong></p><p>That&#8217;s not a bug. That&#8217;s a feature of reality.</p><p>In this article, I&#8217;ll explain <strong>why the accuracy of Poisson-based models is strongly related to the technical and structural level of a league</strong>, what&#8217;s really going on under the hood from a statistical point of view, and how you can use this insight to become more selective, more realistic, and more profitable with your models.</p><p>And if you want to explore these ideas in practice, with real data and interactive tools, you can check the Football Hacking web app here:<br>&#128073; </p><p><a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p><div><hr></div><h2>The Hidden Assumptions Behind Poisson</h2><p>Let&#8217;s start with something most people skip: <strong>what Poisson is actually assuming about football</strong>.</p><p>When you model goals with a Poisson distribution, you are implicitly assuming that:</p><ol><li><p>Goals are <strong>rare, discrete events</strong></p></li><li><p>They occur with a <strong>stable average rate</strong> (&#955;) over the match</p></li><li><p>Each goal is <strong>approximately independent</strong> of the previous one</p></li><li><p>The process is <strong>stationary</strong> enough to be summarized by a single parameter</p></li></ol><p>In plain English, Poisson works best when:</p><blockquote><p>The game behaves like a reasonably stable random process with a consistent scoring rate.</p></blockquote><p>Of course, football is not perfectly like that. Tactics change, red cards happen, teams adapt, psychology matters, and randomness is everywhere. But in some environments, <strong>reality is much closer to these assumptions than in others</strong>.</p><p>And that&#8217;s where league quality and structure come in.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>High-Level Leagues: More Signal, Less Noise</h2><p>In top leagues and major competitions, you usually see:</p><ul><li><p>Better tactical organization</p></li><li><p>More consistent game models</p></li><li><p>Fewer extreme, chaotic matches</p></li><li><p>Higher technical quality in finishing and defending</p></li><li><p>More predictable team behavior over time</p></li><li><p>Better data quality and more stable lineups</p></li></ul><p>All of this has a statistical consequence:</p><blockquote><p>The goal-scoring process becomes <strong>more stable and more regular</strong>.</p></blockquote><p>From a modeling perspective, that means:</p><ul><li><p>The estimated &#955; values are <strong>more reliable</strong></p></li><li><p>The variance is closer to what Poisson expects</p></li><li><p>Extreme outliers are less frequent</p></li><li><p>The distribution of scores looks <strong>more &#8220;Poisson-like&#8221;</strong></p></li></ul><p>In other words, in strong, well-structured leagues, <strong>there is more signal and less noise</strong>. And simple probabilistic models love that.</p><p>This is one of the reasons why Poisson (especially with small corrections like Dixon&#8211;Coles) often performs <strong>surprisingly well</strong> in top European leagues and major competitions.</p><p>If you want to see how this looks in practice across different leagues, you can explore the interactive models in the Football Hacking web app:<br>&#128073; </p><p><a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p><div><hr></div><h2>Lower or More Chaotic Leagues: When Noise Takes Over</h2><p>Now let&#8217;s look at the other side.</p><p>In many lower-tier or structurally unstable leagues, you often find:</p><ul><li><p>Big tactical inconsistencies</p></li><li><p>Large quality gaps between teams</p></li><li><p>Frequent individual mistakes leading to goals</p></li><li><p>More red cards and game-breaking events</p></li><li><p>Poor pitches, travel issues, or unstable squads</p></li><li><p>Less predictable match dynamics</p></li></ul><p>Statistically, this creates several problems:</p><ul><li><p>The true scoring rate <strong>is not stable</strong></p></li><li><p>Variance tends to be <strong>higher than the mean</strong> (overdispersion)</p></li><li><p>You see <strong>more extreme scorelines</strong> than Poisson would expect</p></li><li><p>The independence assumption between goals is violated more often</p></li><li><p>A single event can completely change the nature of the match</p></li></ul><p>The result?</p><blockquote><p>The real data generating process moves <strong>away</strong> from what Poisson assumes.</p></blockquote><p>So even if your model is coded perfectly, calibrated carefully, and backtested properly, it will <strong>naturally perform worse</strong> in these environments. Not because Poisson is &#8220;bad&#8221;, but because <strong>the league itself is more chaotic and less statistically regular</strong>.</p><div><hr></div><h2>This Is Really About Stability, Not Just &#8220;Quality&#8221;</h2><p>It&#8217;s tempting to summarize this as &#8220;Poisson works better in better leagues&#8221;. But that&#8217;s a bit too simplistic.</p><p>A more precise statement is:</p><blockquote><p>Poisson works better in <strong>more stable, structured, and predictable environments</strong>.</p></blockquote><p>Technical quality helps, yes. But what really matters is:</p><ul><li><p>Tactical consistency</p></li><li><p>Behavioral regularity of teams</p></li><li><p>Lower variance in match dynamics</p></li><li><p>A more stationary scoring process</p></li></ul><p>You can even find leagues that are not elite in global terms, but still <strong>very stable and structured</strong>, where Poisson performs reasonably well. And you can also find high-profile competitions with crazy schedules, heavy rotation, and wild match dynamics, where performance drops.</p><p>So the key variable is not fame. It&#8217;s <strong>statistical stability</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Overdispersion: The Silent Enemy of Simple Models</h2><p>One of the clearest ways to see this effect is through <strong>overdispersion</strong>.</p><p>In a perfect Poisson world, we expect:</p><blockquote><p>Variance &#8776; Mean</p></blockquote><p>But in many real leagues, especially chaotic ones, you often observe:</p><blockquote><p>Variance &gt; Mean</p></blockquote><p>This means:</p><ul><li><p>More blowouts than expected</p></li><li><p>More weird scorelines</p></li><li><p>Fatter tails in the distribution</p></li><li><p>More uncertainty than your &#955; can capture</p></li></ul><p>When overdispersion is high, a simple Poisson model will:</p><ul><li><p>Underestimate extreme results</p></li><li><p>Misprice longshots</p></li><li><p>Look poorly calibrated in the tails</p></li><li><p>Appear &#8220;inaccurate&#8221;, even if your average predictions are decent</p></li></ul><p>This is not a small technical detail. It&#8217;s a <strong>structural mismatch</strong> between model and reality.</p><div><hr></div><h2>Where Dixon&#8211;Coles Helps (And Where It Doesn&#8217;t)</h2><p>The Dixon&#8211;Coles adjustment is a smart, practical fix for one very specific problem:<br><strong>the dependence between low-score outcomes like 0&#8211;0, 1&#8211;0, 0&#8211;1, and 1&#8211;1</strong>.</p><p>In many organized leagues, this correction:</p><ul><li><p>Improves calibration</p></li><li><p>Fixes systematic bias in low scores</p></li><li><p>Makes the joint distribution more realistic</p></li></ul><p>But notice something important:</p><blockquote><p>Dixon&#8211;Coles does not fix chaos.</p></blockquote><p>If your league suffers from:</p><ul><li><p>Highly unstable team behavior</p></li><li><p>Frequent game-breaking events</p></li><li><p>Massive overdispersion</p></li><li><p>Rapid regime changes inside matches</p></li></ul><p>Then the problem is <strong>much bigger</strong> than low-score correlation. You&#8217;re no longer dealing with a small correction to a mostly Poisson-like process. You&#8217;re dealing with a <strong>different process altogether</strong>.</p><div><hr></div><h2>What Betting Markets Already Know (And Show You)</h2><p>Here&#8217;s the cool part: <strong>bookmakers already encode this uncertainty in the odds</strong>.</p><p>Remember the concept of <strong>overround / juice</strong>?</p><ul><li><p>Big leagues, high liquidity &#8594; low margin, tight prices</p></li><li><p>Small or risky leagues &#8594; higher margin, worse prices</p></li></ul><p>That higher margin is not just greed. It&#8217;s <strong>risk management</strong>.</p><p>It&#8217;s the market saying:</p><blockquote><p>&#8220;This environment is harder to price. There is more uncertainty here.&#8221;</p></blockquote><p>Which is exactly the same conclusion your Poisson model is quietly reaching when it starts to miss more often.</p><div><hr></div><h2>Practical Implications for Your Modeling</h2><p>If you&#8217;re building Poisson-based models (like I do in Football Hacking), this leads to some very practical rules:</p><ol><li><p><strong>Segment performance by league</strong> instead of trusting global metrics</p></li><li><p>Measure overdispersion and calibration <strong>per competition</strong></p></li><li><p>Demand a <strong>higher edge</strong> in noisier leagues</p></li><li><p>Consider <strong>shrinking, regularizing, or smoothing &#955; more aggressively</strong> where instability is high</p></li><li><p>Be selective: not all leagues deserve the same confidence or stake size</p></li></ol><p>In other words:</p><blockquote><p>Your model&#8217;s accuracy is not just about your code. It&#8217;s about the statistical nature of the league you&#8217;re modeling.</p></blockquote><p>You can see how this plays out across different competitions in the Football Hacking web app, where I expose the same framework to multiple leagues and markets:<br>&#128073; </p><p><a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p><div><hr></div><h2>A Useful Mental Model: Signal vs Noise</h2><p>Here&#8217;s the simplest way to think about all this:</p><ul><li><p>Strong, stable leagues &#8594; <strong>More signal, less noise</strong></p></li><li><p>Chaotic, unstable leagues &#8594; <strong>Less signal, more noise</strong></p></li></ul><p>Poisson is a <strong>signal-hungry model</strong>. It needs a world where the average rate actually means something.</p><p>When noise dominates, no amount of elegance in your probability theory will save you.</p><div><hr></div><h2>So, Are You Right?</h2><p>Yes. Absolutely.</p><p>Your intuition is correct: <strong>the effectiveness of a Poisson model is strongly related to the technical and structural level of the league</strong>&#8212;more precisely, to how <strong>stable and regular</strong> the goal-scoring process is in that competition.</p><p>This is not a philosophical opinion. It&#8217;s a direct consequence of:</p><ul><li><p>The assumptions behind Poisson</p></li><li><p>The variance structure of different leagues</p></li><li><p>The presence (or absence) of chaos in match dynamics</p></li></ul><div><hr></div><h2>Final Thoughts</h2><p>Poisson is not magic. It&#8217;s a tool. A very good one&#8212;when reality cooperates.</p><p>The real edge is not just building a better model. It&#8217;s knowing <strong>where your model deserves to be trusted</strong> and where it should be treated with skepticism.</p><p>That&#8217;s how you move from &#8220;I have a model&#8221; to:</p><blockquote><p>&#8220;I understand the environment my model lives in.&#8221;</p></blockquote><p>And that&#8217;s where real, long-term edges are built.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><div><hr></div><p><strong>&#128073; If you want full access to my Poisson models, multiple leagues, and the tools I actually use in practice, become a premium subscriber to Football Hacking and use the web app here:</strong><br>&#128073; <a href="https://footballhacking.streamlit.app/">https://footballhacking.streamlit.app/</a></p>]]></content:encoded></item><item><title><![CDATA[How the “Poisson Preds” Page Works in Football Hacking (Streamlit + Poisson + Dixon–Coles)]]></title><description><![CDATA[A practical, beginner-friendly walkthrough of Poisson scoreline matrices, Dixon&#8211;Coles, and fair odds in Streamlit.]]></description><link>https://www.footballhacking.com/p/how-the-poisson-preds-page-works</link><guid isPermaLink="false">https://www.footballhacking.com/p/how-the-poisson-preds-page-works</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Mon, 23 Feb 2026 16:02:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Hjqa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.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_!Hjqa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hjqa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hjqa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4017109,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/188903323?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.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_!Hjqa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Hjqa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9600fea7-c1b1-45e4-975c-bac49f397816_1536x1024.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 role="img" 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><title></title><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></h1><p>If you&#8217;ve ever wanted a <strong>clean, explainable baseline</strong> for football predictions&#8212;something you can implement in a few functions, test quickly, and ship into a web app&#8212;then the Poisson model is still one of the best places to start.</p><p>In the <a href="https://footballhacking.streamlit.app/">Football Hacking web app</a>, the <strong>Poisson Predictions</strong> page (Poisson Preds) takes match-level data from your MongoDB pipeline, estimates <strong>expected goals for each team</strong>, builds a <strong>scoreline probability matrix</strong> with Poisson, applies a <strong>Dixon&#8211;Coles correction</strong> for low scores, and then converts that matrix into the &#8220;betting-friendly&#8221; views people actually want: <strong>1X2, Double Chance, Draw No Bet, BTTS, and Over/Under lines</strong>&#8212;plus a heatmap that makes the whole thing instantly readable.</p><p>In this post, I&#8217;ll walk through your code in detail, but in a way that&#8217;s friendly to <strong>beginner/intermediate Python users</strong> who know pandas and basic stats, and are now leveling up into &#8220;real app logic.&#8221;</p><p><a href="https://footballhacking.streamlit.app/">Open the Football Hacking web app and check the </a><strong><a href="https://footballhacking.streamlit.app/">Poisson Preds</a></strong><a href="https://footballhacking.streamlit.app/"> page while you read&#8212;seeing the UI and the output tables side-by-side makes everything click faster.</a></p><p><a href="https://github.com/saulo-data/football.hacking/blob/main/pages/poisson_preds.py">You can also check it on Github.</a></p><div><hr></div><h2>Why Poisson Works (and Why It&#8217;s Not &#8220;Perfect&#8221;)</h2><p>In football modeling, Poisson is popular because it maps nicely from a single parameter&#8212;<strong>&#955; (lambda)</strong>, the expected goals&#8212;into a full distribution:</p><p></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;[\nP(X=k)=\\frac{e^{-\\lambda}\\lambda^k}{k!}\n]&quot;,&quot;id&quot;:&quot;NYPNKYRBGU&quot;}" data-component-name="LatexBlockToDOM"></div><p>So if you estimate:</p><ul><li><p><strong>&#955;_home</strong> = expected home goals</p></li><li><p><strong>&#955;_away</strong> = expected away goals</p></li></ul><p>You can compute the probability of every realistic scoreline: 0&#8211;0, 1&#8211;0, 1&#8211;1, 2&#8211;1, and so on.</p><p>The catch: goals aren&#8217;t perfectly independent. Low scorelines (0&#8211;0, 1&#8211;0, 0&#8211;1, 1&#8211;1) often behave slightly differently than vanilla Poisson suggests. That&#8217;s exactly why your page includes the <strong>Dixon&#8211;Coles adjustment</strong>.</p><div><hr></div><h2>The Big Picture: What This Script Does End-to-End</h2><p>At a high level, your page logic has six layers:</p><ol><li><p><strong>Pull match stats from MongoDB</strong> (FotMob pipeline stored in <code>db.fotmob_stats</code>)</p></li><li><p><strong>Transform raw stats into a tidy DataFrame</strong> (<code>stats_to_df</code>)</p></li><li><p><strong>Let the user pick a league and choose teams</strong> (Streamlit UI + form)</p></li><li><p><strong>Estimate expected goals</strong> from league averages + attack/defense &#8220;capacities&#8221; (<code>get_goals_metrics</code>)</p></li><li><p><strong>Create a Poisson score matrix</strong> and apply <strong>Dixon&#8211;Coles</strong> (<code>get_matrix_poisson</code> + <code>apply_dixon_coles_to_matrix</code>)</p></li><li><p><strong>Compute probabilities and fair odds</strong> for common markets + show a heatmap and a performance chart</p></li></ol><p>That&#8217;s a solid architecture: small, testable functions + a clean UI orchestration section at the bottom.</p><div><hr></div><h2>Imports and Page Setup: Streamlit + Data + Viz + Stats</h2><pre><code><code>import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
from football_main_app import db
from scipy.stats import poisson
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import seaborn as sns
</code></code></pre><h3>What matters here</h3><ul><li><p><strong>Streamlit (</strong><code>st</code><strong>)</strong> is the UI engine.</p></li><li><p><strong>pandas / numpy</strong> handle transformation and numeric work.</p></li><li><p><code>db</code> comes from your main app module, and is presumably a MongoDB client/connection.</p></li><li><p><code>scipy.stats.poisson</code> provides <code>pmf</code> and <code>cdf</code>.</p></li><li><p><strong>matplotlib + seaborn</strong> render the &#8220;Weighted Performance&#8221; chart and the colormap for heatmaps.</p></li></ul><p>You also import <strong>Plotly Express</strong> (<code>px</code>) but you don&#8217;t use it in this script. Not a problem, but you can remove it to keep things clean.</p><p>Then you configure the page:</p><pre><code><code>st.set_page_config(
    page_title='Poisson Predictions', 
    layout='wide', 
)
</code></code></pre><p>Wide layout makes sense here because your UI is very &#8220;dashboard-y&#8221; (heatmap + chart + multiple tables).</p><div><hr></div><h2>MongoDB Fetch Layer: Cached for 12 Hours</h2><pre><code><code>@st.cache_data(show_spinner=False, ttl='12h')
def get_stats(year: int) -&gt; dict:
    YEAR = year
    stats = list(db.fotmob_stats.aggregate([
        {"$match": {"general.season": {"$in": [f"{YEAR}", f"{YEAR-1}/{YEAR}"]}}}, 
        {"$project": {"_id": 0, "general": 1, "teams": 1, "stats": 1, "score": 1, 'result': 1}}
    ]))
    return stats
</code></code></pre><h3>Why this is smart</h3><ul><li><p><code>@st.cache_data</code> prevents re-hitting your database every rerun.</p></li><li><p><code>ttl='12h'</code> is a good tradeoff: the page stays fast, and data refreshes twice a day.</p></li><li><p>Aggregation pipeline does two important things:</p><ul><li><p><code>$match</code> limits by season strings that appear to be formatted either <code>"2026"</code> or <code>"2025/2026"</code></p></li><li><p><code>$project</code> returns only the fields you need, excluding <code>_id</code></p></li></ul></li></ul><p>One small note: the function annotation says it returns <code>dict</code>, but you actually return a <strong>list of dicts</strong>. If you want to be precise, you could annotate it as <code>list[dict]</code>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>Turning Raw Match Docs into a DataFrame</h2><p>The <code>stats_to_df</code> function is doing the heavy lifting of converting nested MongoDB documents into a flat table.</p><p>Key features:</p><ul><li><p>You store league/season/team names</p></li><li><p>You store team images (nice for future UI upgrades)</p></li><li><p>You compute a <strong>weighted performance</strong> feature per match for home and away</p></li><li><p>You store scoreline and result</p></li></ul><pre><code><code>weights = np.array([1.12, 1.25, 1.32, 1.50])
</code></code></pre><p>This means your weighted performance is not a naive average&#8212;it&#8217;s a <strong>hand-crafted blend</strong> where the last metric (<code>xg_op_for_100_passes</code>) is most influential.</p><p>You build the values arrays:</p><pre><code><code>values_home = np.array([
    stat['stats']['ball_possession']['home'],
    stat['stats']['passes_opp_half_%']['home'],
    stat['stats']['touch_opp_box_100_passes']['home'],
    stat['stats']['xg_op_for_100_passes']['home']
])
weighted_performance_home = np.average(values_home, weights=weights, axis=0)
</code></code></pre><p>Same for away.</p><h3>Why this is a nice touch in a Poisson page</h3><p>Even though Poisson predictions are about goals, your page also shows &#8220;performance context.&#8221; That&#8217;s huge from a product perspective: you&#8217;re not only spitting out odds; you&#8217;re helping the user understand <em>why</em> a team might be stronger in that venue context.</p><p>At the end you return:</p><pre><code><code>df = pd.DataFrame({
    'league': leagues, 
    'season': seasons,
    'home': home, 
    'home_image': home_images,
    'away': away, 
    'away_image': away_images,
    'weighted_performance_home': weighted_performances_home, 
    'weighted_performance_away': weighted_performances_away, 
    'score_home': score_home, 
    'score_away': score_away, 
    'goals_sum': goals_sum,
    'result': results
})
</code></code></pre><p>That becomes your &#8220;league dataset&#8221; driving everything else.</p><div><hr></div><h2>League and Venue Goal Averages</h2><p>You compute a couple of helpful league-level baselines:</p><pre><code><code>def venue_goals_avg(df, column_home, column_away):
    home_goals_avg = df[column_home].mean()
    away_goals_avg = df[column_away].mean()

    return home_goals_avg, away_goals_avg
</code></code></pre><p>This is the <strong>home/away venue baseline</strong> for the league:</p><ul><li><p>Average home goals</p></li><li><p>Average away goals</p></li></ul><p>You also compute total goals average:</p><pre><code><code>def get_total_goals_avg(df, column):
    return df[column].mean()
</code></code></pre><p>These league-level averages are important because they anchor your expected goals estimates (&#955;). Without them, you&#8217;d be guessing in a vacuum.</p><div><hr></div><h2>Estimating Expected Goals for a Match</h2><p>This function is the core of &#8220;where &#955; comes from&#8221;:</p><pre><code><code>def get_goals_metrics(df_league, column_team_home, home_team, column_home_scores,
                     columns_team_away, away_team, columns_away_scores,
                     total_home_avg, total_away_avg):
</code></code></pre><p>Inside it:</p><h3>Step 1: compute how much the home team scores at home (within this league dataset)</h3><pre><code><code>home_scored_avg = df_league[df_league[column_team_home] == home_team][column_home_scores].mean()
</code></code></pre><h3>Step 2: compute how much the away team scores away</h3><pre><code><code>away_scored_avg = df_league[df_league[columns_team_away] == away_team][columns_away_scores].mean()
</code></code></pre><h3>Step 3: compute conceding averages (defense)</h3><pre><code><code>home_conceced_avg = df_league[df_league[column_team_home] == home_team][columns_away_scores].mean()
away_conceced_avg = df_league[df_league[columns_team_away] == away_team][column_home_scores].mean()
</code></code></pre><p>So:</p><ul><li><p>home conceded = goals the opponents scored when this team was home</p></li><li><p>away conceded = goals the opponents scored when this team was away</p></li></ul><h3>Step 4: convert into &#8220;capacities&#8221; relative to league baseline</h3><pre><code><code>home_of_cap = home_scored_avg / total_home_avg
away_of_cap = away_scored_avg / total_away_avg

home_def_cap = home_conceced_avg / total_away_avg
away_def_cap = away_conceced_avg / total_home_avg
</code></code></pre><p>Interpretation:</p><ul><li><p><code>home_of_cap &gt; 1</code> means the home team scores more than league-average home teams (good attack at home)</p></li><li><p><code>away_def_cap &gt; 1</code> means the away team concedes more than league-average (weak defense in away matches)</p></li></ul><h3>Step 5: expected goals are &#8220;attack &#215; opponent defense &#215; league baseline&#8221;</h3><pre><code><code>home_goals = home_of_cap * away_def_cap * total_home_avg
away_goals = away_of_cap * home_def_cap * total_away_avg
</code></code></pre><p>This is a classic strength model pattern. It&#8217;s simple, explainable, and works surprisingly well as a baseline.</p><div><hr></div><h2>Building the Poisson Scoreline Matrix</h2><pre><code><code>def get_matrix_poisson(home_goals, away_goals, max_goals):
    home_probs = [poisson.pmf(i, home_goals) for i in range(max_goals)]
    away_probs = [poisson.pmf(i, away_goals) for i in range(max_goals)]
    goal_matrix = np.outer(home_probs, away_probs) 

    return goal_matrix
</code></code></pre><p>Here&#8217;s the important idea:</p><ul><li><p><code>home_probs[i]</code> is P(home scores i)</p></li><li><p><code>away_probs[j]</code> is P(away scores j)</p></li><li><p><code>np.outer(home_probs, away_probs)</code> creates a matrix where each cell is:</p></li></ul><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;[\nP(\\text{home}=i)\\cdot P(\\text{away}=j)\n]&quot;,&quot;id&quot;:&quot;CRWCSVMUVI&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>You set <code>max_goals=7</code> later, meaning you model scorelines 0..6 for both teams.</p><p><strong>Practical note:</strong> This &#8220;truncates&#8221; probabilities above 6 goals. For typical football &#955; values (like 0.8 to 2.0), the missing mass is small. If you ever start modeling leagues with higher scoring, you might bump this to 9 or 10.</p><div><hr></div><h2>Dixon&#8211;Coles Correction: Fixing Low-Score Dependence</h2><p>This section is gold, because it handles the biggest &#8220;Poisson feels a bit off&#8221; issue.</p><p>You define the &#964; adjustment:</p><pre><code><code>def dc_tau(i, j, lam_home, lam_away, rho):
    if i == 0 and j == 0:
        return 1 - (lam_home * lam_away * rho)
    if i == 1 and j == 0:
        return 1 + (lam_away * rho)
    if i == 0 and j == 1:
        return 1 + (lam_home * rho)
    if i == 1 and j == 1:
        return 1 - rho

    return 1.0
</code></code></pre><p>Then apply it only to the (0,0), (1,0), (0,1), (1,1) cells:</p><pre><code><code>def apply_dixon_coles_to_matrix(P, lam_home, lam_away, rho, normalize=True):
    P_dc = P.astype(float).copy()
    for i in (0, 1):
        for j in (0, 1):
            P_dc[i, j] *= dc_tau(i, j, lam_home, lam_away, rho)

    if normalize:
        s = P_dc.sum()
        P_dc /= s

    return P_dc
</code></code></pre><h3>Why normalize?</h3><p>Because once you tweak a few cells, the matrix might no longer sum to 1. Normalization brings it back into a valid probability distribution.</p><h3>Where does <code>rho</code> come from in your code?</h3><pre><code><code>def get_rho(goals_avg):
    if goals_avg &gt;= 3.0:
        rho = -0.02
    elif goals_avg &lt;= 2.6:
        rho = -0.1
    else:
        rho = -0.05

    return rho
</code></code></pre><p>This is a heuristic: lower-scoring leagues get stronger negative rho (more correction effect). It&#8217;s a nice practical choice for an app feature&#8212;simple and stable.</p><div><hr></div><h2>Converting Matrix &#8594; Tables and Markets</h2><h3>Heatmap table (scoreline probabilities)</h3><pre><code><code>def matrix_to_df(goal_matrix, home_team, away_team):
    max_goals = goal_matrix.shape[0]
    goals_table = pd.DataFrame(
        goal_matrix, 
        columns=[f"{away_team} {i}" for i in range(max_goals)],
        index=[f"{home_team} {i}" for i in range(max_goals)]
    )
    goals_table = goals_table * 100

    return goals_table
</code></code></pre><p>This just formats the matrix into a readable DataFrame and converts to percentage.</p><h3>1X2 + Double Chance + Draw No Bet</h3><pre><code><code>home_win_prob = np.tril(goal_matrix, k=-1).sum() * 100
draw_prob = goal_matrix.diagonal().sum() * 100
away_win_prob = np.triu(goal_matrix, k=1).sum() * 100
</code></code></pre><ul><li><p><code>np.tril(..., k=-1)</code> = below diagonal &#8594; home goals &gt; away goals</p></li><li><p>diagonal = draw</p></li><li><p><code>np.triu(..., k=1)</code> = above diagonal &#8594; away goals &gt; home goals</p></li></ul><p>Then:</p><ul><li><p>Double chance &#8220;Home&#8221; = home win + draw</p></li><li><p>Double chance &#8220;Away&#8221; = away win + draw</p></li><li><p>&#8220;No Draw&#8221; = home win + away win</p></li></ul><p>Draw No Bet is derived by conditioning on &#8220;a win occurs&#8221;:</p><pre><code><code>any_win_double_chance_prob = home_win_prob + away_win_prob
home_handicap_0 = home_win_prob / any_win_double_chance_prob * 100
</code></code></pre><p>That&#8217;s exactly what DNB is: probability of home winning given the match is not a draw.</p><p>Finally, you compute &#8220;fair odds&#8221;:</p><pre><code><code>'Odd': np.round(100 / home_win_prob, 2)
</code></code></pre><p>Because you&#8217;re working in percent. (If you were in decimals, it would be <code>1/prob</code>.)</p><div><hr></div><h2>BTTS: Both Teams To Score</h2><pre><code><code>btts_yes = goal_matrix[1:, 1:].sum()
btts_no = 1 - btts_yes
</code></code></pre><p>This is a very clean slice:</p><ul><li><p><code>[1:, 1:]</code> means goals &#8805; 1 for both teams.</p></li></ul><p>Then fair odds are <code>1 / probability</code>.</p><div><hr></div><h2>Over/Under Lines (0.5 to 5.5)</h2><p>Instead of summing the matrix by total goals, you use a Poisson shortcut:</p><pre><code><code>goals = home_goals + away_goals
under = poisson.cdf(i, goals)
over = 1 - under
</code></code></pre><p>This works because the sum of two independent Poisson variables is also Poisson:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;[\nX \\sim Poisson(\\lambda_1),\\ Y \\sim Poisson(\\lambda_2)\\ \\Rightarrow\\ X+Y \\sim Poisson(\\lambda_1+\\lambda_2)\n]&quot;,&quot;id&quot;:&quot;BHOIQQMYSB&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>So totals are easy and fast.</p><p>You loop 0..5, creating O/U 0.5 &#8230; 5.5 markets.</p><div><hr></div><h2>Formatting Probabilities into a MultiIndex Table</h2><pre><code><code>def probs_to_df(probs):
    reform = {(outerKey, innerKey): values
              for outerKey, innerDict in probs.items()
              for innerKey, values in innerDict.items()}
    df = pd.DataFrame.from_dict(reform, orient='index').transpose()
    df.columns = pd.MultiIndex.from_tuples(df.columns)

    return df.round(2)
</code></code></pre><p>This is a neat pattern: it produces a single DataFrame with MultiIndex columns like:</p><ul><li><p>(&#8220;Match Odds&#8221;, &#8220;Home&#8221;) &#8594; {Prob, Odd}</p></li><li><p>(&#8220;Match Odds&#8221;, &#8220;Draw&#8221;) &#8594; {Prob, Odd}</p></li><li><p>etc.</p></li></ul><p>It&#8217;s perfect for a dashboard.</p><div><hr></div><h2>Styling: Highlighting the &#8220;ROI Zone&#8221; Odds</h2><pre><code><code>styled_df = df.style.highlight_between(
    color='#5A915A',
    left=1.7,
    right=2,
    axis=1,
    subset=pd.IndexSlice[['Odd'], :]
).format(precision=2)
</code></code></pre><p>This is a Football Hacking signature detail: it visually emphasizes odds between <strong>1.70 and 2.00</strong> (your &#8220;historical ROI sweet spot&#8221; narrative).</p><p>Also note: you highlight only the <code>Odd</code> rows via <code>subset=pd.IndexSlice[['Odd'], :]</code>.</p><div><hr></div><h2>Plotting Weighted Performance Bars (Home vs Away Context)</h2><pre><code><code>def plot_venue_performances(df, home_team, away_team):
    df_home = df[df['home'] == home_team]
    df_away = df[df['away'] == away_team]

    fig,ax = plt.subplots(figsize=(8, 5))
    ax.set_title('Weighted Performance Home/Away', fontweight='bold')
    ...
    sns.barplot(data=df_home, x='home', y='weighted_performance_home', ax=ax,                
               color='#213991')
    sns.barplot(data=df_away, x='away', y='weighted_performance_away', ax=ax,     
                color='#915221')
</code></code></pre><p>This chart provides narrative support: you&#8217;re not just modeling goals&#8212;you&#8217;re showing performance metrics that correlate with attacking dominance (possession, touches in box per 100 passes, open-play xG per 100 passes, etc.).</p><div><hr></div><h2>The UI Orchestration: Where Everything Comes Together</h2><p>At the bottom:</p><ol><li><p>Load data:</p></li></ol><pre><code><code>stats = get_stats(year=2026)
df = stats_to_df(stats=stats)
</code></code></pre><ol start="2"><li><p>Select league:</p></li></ol><pre><code><code>league = st.selectbox(... options=sorted(df['league'].unique()))
df_league = df[df['league'] == league]
</code></code></pre><ol start="3"><li><p>Show dataset:</p></li></ol><pre><code><code>st.dataframe(df_league.drop(columns=['home_image', 'away_image']), hide_index=True)
</code></code></pre><ol start="4"><li><p>Select teams with a form:</p></li></ol><pre><code><code>submitted, home, away = input_form(...)
</code></code></pre><ol start="5"><li><p>On submit, compute everything:</p></li></ol><pre><code><code>total_home_avg, total_away_avg = venue_goals_avg(...)
home_goals, away_goals = get_goals_metrics(...)
rho = get_rho(...)
goal_matrix = get_matrix_poisson(... max_goals=7)
goal_matrix = apply_dixon_coles_to_matrix(...)
</code></code></pre><ol start="6"><li><p>Produce tables:</p></li></ol><pre><code><code>match_probs = get_match_probs(goal_matrix)
btts = get_btts_probs(goal_matrix)
goal_probs = get_unders_overs(home_goals, away_goals)
</code></code></pre><ol start="7"><li><p>Render heatmap + chart:</p></li></ol><pre><code><code>st.dataframe(goals_table.style.background_gradient(...))
plot_venue_performances(...)
</code></code></pre><ol start="8"><li><p>Render market tables and warnings:</p></li></ol><pre><code><code>st.warning('These are the fair odds according to the Poisson distribution...')
</code></code></pre><p>That warning is important: it sets expectations and protects users from confusing &#8220;fair odds&#8221; with bookmaker prices.</p><div><hr></div><h2>Practical Notes and &#8220;Next Improvements&#8221; (If You Want to Evolve It)</h2><p>If you ever want to push this page from &#8220;strong baseline&#8221; to &#8220;seriously sharp,&#8221; here are upgrade paths that keep your current architecture:</p><ul><li><p><strong>Dynamic </strong><code>max_goals</code>: set it based on &#955; (e.g., 7 for low &#955;, 10 for high &#955;)</p></li><li><p><strong>Totals from the matrix</strong>: for consistency, derive totals by summing matrix diagonals by (i+j), rather than Poisson-sum shortcut&#8212;especially after Dixon&#8211;Coles adjustment</p></li><li><p><strong>Team sample size guardrails</strong>: if a team has few matches in the selected season, shrink estimates toward the league average (simple Bayesian shrinkage)</p></li><li><p><strong>Home advantage parameter</strong>: explicit multiplier applied to &#955;_home or to attack/defense capacities</p></li><li><p><strong>In-play version</strong>: update &#955; based on time remaining and game state (you&#8217;ve already explored this idea elsewhere)</p></li></ul><div><hr></div><h2>Final Takeaway</h2><p>This page is a great example of what &#8220;Football Hacking style&#8221; looks like in code:</p><ul><li><p><strong>Clean data pipeline &#8594; tidy dataframe</strong></p></li><li><p><strong>Explainable expected goals estimate</strong></p></li><li><p><strong>Poisson matrix for full scoreline distribution</strong></p></li><li><p><strong>Dixon&#8211;Coles correction for realism at low scores</strong></p></li><li><p><strong>Market probabilities + fair odds</strong></p></li><li><p><strong>UI that teaches while it predicts</strong></p></li></ul><p>That&#8217;s not just a prediction tool&#8212;it&#8217;s a learning tool, which is exactly what makes it Substack-friendly.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>If you want to explore Poisson predictions across leagues and matchups (and see the probability heatmap + fair odds instantly), open the Football Hacking web app and head to <strong>Poisson Preds</strong>. And if you&#8217;re reading this on Substack, consider becoming a <strong>premium subscriber</strong>&#8212;I&#8217;ll be publishing deeper builds that go beyond baseline Poisson (and show how to make it survive real-world match dynamics).</p>]]></content:encoded></item><item><title><![CDATA[How to Build a Football Pass Network in Python (Step by Step)]]></title><description><![CDATA[Stop Guessing, Start Mapping: Visualizing Ball Circulation with Pass Networks]]></description><link>https://www.footballhacking.com/p/how-to-build-a-football-pass-network</link><guid isPermaLink="false">https://www.footballhacking.com/p/how-to-build-a-football-pass-network</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 19 Feb 2026 16:02:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!v_HK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.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_!v_HK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v_HK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v_HK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3533652,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/188490589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.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_!v_HK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!v_HK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d471e2c-9039-45e2-b247-44b090e3ce7c_1536x1024.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 role="img" 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><title></title><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>If you&#8217;ve ever wanted to visualize how a team actually <strong>moves the ball</strong> on the pitch, pass networks are one of the most powerful (and elegant) tools you can use. They turn raw event data into a tactical map: who connects with whom, where players operate, and which relationships really drive the game.</p><p>Before we jump into the code, an important note: <strong><a href="https://footballhacking.streamlit.app/">the data used to build this kind of pass network can be downloaded directly from the Football Hacking app</a></strong>, exactly as shown in the image above. Instead of being locked into static charts, you can grab the raw CSV files and create your own visualizations, tweak them, and run your own analysis in Python.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eBd0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eBd0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eBd0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png" width="1456" height="654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:654,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:277117,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/188490589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.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_!eBd0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!eBd0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa97d62d0-bdec-42de-95a4-e1aa41953690_1912x859.png 1456w" sizes="100vw"></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 role="img" 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><title></title><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>That independence is the whole point here. Once you control the data, you control the questions you can ask.</p><p>In this article, I&#8217;ll walk you through a complete Python script that:</p><ul><li><p>Loads pass data from a CSV file</p></li><li><p>Filters it to a single team (AC Milan, in this case)</p></li><li><p>Computes average player positions</p></li><li><p>Counts passing interactions between players</p></li><li><p>Builds a <strong>directed pass network</strong> using NetworkX</p></li><li><p>Plots everything on a football pitch using <code>mplsoccer</code> and <code>matplotlib</code></p></li></ul><p>By the end, you&#8217;ll not only understand what each line does, but you&#8217;ll also know how to adapt this to <strong>any team, any match, any league</strong> &#8212; especially using data downloaded from the Football Hacking app.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Wi2V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wi2V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 424w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 848w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 1272w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wi2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png" width="1260" height="887" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:887,&quot;width&quot;:1260,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:244298,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/188490589?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.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_!Wi2V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 424w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 848w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 1272w, https://substackcdn.com/image/fetch/$s_!Wi2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c90f5e3-1ed7-46bb-ae89-b2f31c13ff30_1260x887.png 1456w" sizes="100vw"></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 role="img" 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><title></title><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><div><hr></div><h2>Why Pass Networks Matter in Football Analysis</h2><p>A pass network is more than a pretty graphic. It&#8217;s a compact way to answer questions like:</p><ul><li><p>Who are the main hubs in possession?</p></li><li><p>Which players connect most often?</p></li><li><p>Is the team building through the center or the flanks?</p></li><li><p>Are there isolated players in the structure?</p></li><li><p>Who actually controls the tempo?</p></li></ul><p>Instead of looking at hundreds or thousands of individual passes, you get a <strong>structural overview</strong> of how the team plays.</p><p>And the best part? With Python and open libraries, you can build this yourself in a few dozen lines of code.</p><div><hr></div><h2>The Libraries We Use</h2><p>Let&#8217;s start with the imports:</p><pre><code><code>import pandas as pd
from mplsoccer import Pitch
import matplotlib.pyplot as plt
import networkx as nx
</code></code></pre><p>Each library has a clear role:</p><ul><li><p><strong>pandas</strong>: for loading and manipulating the CSV data.</p></li><li><p><strong>mplsoccer</strong>: for drawing a proper football pitch with correct coordinates.</p></li><li><p><strong>matplotlib</strong>: for general plotting and figure styling.</p></li><li><p><strong>networkx</strong>: for creating and handling the pass network as a graph (nodes and edges).</p></li></ul><p>This combination is extremely common in football analytics workflows: pandas for data, NetworkX for structure, mplsoccer + matplotlib for visualization.</p><div><hr></div><h2>Loading the Data</h2><pre><code><code>df = pd.read_csv('passes_mil_com.csv')
df = df[df['team'] == 'AC Milan']
</code></code></pre><p>Here, we read a CSV file containing pass events. This is exactly the kind of file you can download from the <strong>Football Hacking app</strong>.</p><p>Then we filter the dataset to keep only <strong>AC Milan&#8217;s</strong> passes. This is crucial: a pass network usually represents <strong>one team&#8217;s internal structure</strong>, not both teams mixed together.</p><p>At this point, <code>df</code> contains only passes made by AC Milan players in this match.</p><div><hr></div><h2>Computing Average Player Positions</h2>
      <p>
          <a href="https://www.footballhacking.com/p/how-to-build-a-football-pass-network">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[You Can Now Download All the Data from the Football Hacking App (And Build Your Own Visuals)]]></title><description><![CDATA[If you&#8217;ve ever wanted to go beyond looking at charts and actually get your hands on the data, this update is for you.]]></description><link>https://www.footballhacking.com/p/you-can-now-download-all-the-data</link><guid isPermaLink="false">https://www.footballhacking.com/p/you-can-now-download-all-the-data</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 12 Feb 2026 13:46:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!iodj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.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_!iodj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iodj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iodj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iodj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iodj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iodj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2489003,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/187743405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.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_!iodj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!iodj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!iodj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!iodj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8cec39a3-fbab-4a9a-9063-56cade1bb3a0_1536x1024.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 role="img" 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><title></title><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>If you&#8217;ve ever wanted to go beyond looking at charts and actually <strong>get your hands on the data</strong>, this update is for you. &#128073; <strong><a href="https://footballhacking.streamlit.app/">Visit the Football Hacking web app today</a></strong>, explore the matches, and you&#8217;ll see something new: <strong>all the data used to generate the charts is now available for download</strong>. And if you&#8217;re not yet a subscriber, this is the perfect moment to <strong>join the Football Hacking newsletter</strong> and follow everything that&#8217;s coming next.</p><p>Yes, you read that right. From now on, when you explore a match, a team, or a specific visualization in the app, you can also download the underlying dataset and use it however you want. No black boxes. No &#8220;trust me, this is what the numbers say.&#8221; You get the numbers. You get the control.</p><p>This is a big step toward what I believe is one of the most important principles in football analytics: <strong>independence</strong>.</p><div><hr></div><h2>Why This Changes the Game</h2><p>Most platforms show you beautiful charts, dashboards, and tables&#8212;but that&#8217;s where it ends. You&#8217;re stuck with <strong>someone else&#8217;s choices</strong>:</p><ul><li><p>Someone else&#8217;s color scales</p></li><li><p>Someone else&#8217;s chart types</p></li><li><p>Someone else&#8217;s filters and thresholds</p></li><li><p>Someone else&#8217;s interpretation of what matters</p></li></ul><p>Now, with the Football Hacking app, you&#8217;re not limited to that anymore. You can <strong>download the exact same data</strong> used to build the visualizations and take it wherever you want: Python, R, Excel, your own dashboards, your own notebooks, your own experiments.</p><p>Want to tweak the pitch dimensions?<br>Change the binning of zones?<br>Highlight different players?<br>Compare two matches in a way the app doesn&#8217;t show yet?</p><p>Go for it. The data is yours.</p><p>This is especially powerful if you&#8217;re already working with Python and libraries like <strong>mplsoccer</strong>, which is quickly becoming the standard tool for football visualizations in the data community.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zcI0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zcI0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zcI0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png" width="1456" height="654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:654,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:290216,&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://www.footballhacking.com/i/187743405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.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_!zcI0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!zcI0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8760f68b-1411-4ac1-af58-52097fb40e17_1912x859.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 role="img" 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><title></title><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></p><div><hr></div><h2>Build Your Own Visuals with mplsoccer</h2><p>If you&#8217;re not familiar with it yet, <strong>mplsoccer</strong> is a Python library built on top of Matplotlib that makes it much easier to create football-specific charts: pitches, heatmaps, pass networks, shot maps, and much more.</p><p>With the data downloaded from the Football Hacking app, you can:</p><ul><li><p>Recreate the same charts you see in the app</p></li><li><p>Customize them to match your style or your club&#8217;s branding</p></li><li><p>Combine multiple matches into a single analysis</p></li><li><p>Build entirely new visualizations that don&#8217;t exist yet in the app</p></li></ul><p>For example, instead of just looking at a pass map, you might want to:</p><ul><li><p>Build a <strong>pass network</strong> with custom thresholds</p></li><li><p>Change node sizes based on a metric you prefer (xT, involvement, touches, centrality, etc.)</p></li><li><p>Compare first half vs second half</p></li><li><p>Overlay tactical zones or specific patterns</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!InuZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!InuZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!InuZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png" width="1456" height="654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:654,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:275059,&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://www.footballhacking.com/i/187743405?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.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_!InuZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 424w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 848w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.png 1272w, https://substackcdn.com/image/fetch/$s_!InuZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2e12071-a17a-44cf-a6d6-b1555b2086fd_1912x859.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 role="img" 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><title></title><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>And the best part? You&#8217;re no longer dependent on any single tool or interface. You&#8217;re building <strong>your own analytical workflow</strong>.</p><div><hr></div><h2>Independence Is Not a Buzzword</h2><p>In football analytics, independence is everything.</p><p>When you control the data, you control:</p><ul><li><p>The questions you can ask</p></li><li><p>The hypotheses you can test</p></li><li><p>The stories you can tell</p></li><li><p>The mistakes you can discover and fix</p></li></ul><p>Relying only on ready-made charts is comfortable, but it also puts a ceiling on your growth. You start thinking in terms of &#8220;what the tool allows me to see&#8221; instead of &#8220;what I want to investigate.&#8221;</p><p>By making the data downloadable, the Football Hacking app becomes not just a place to <strong>consume insights</strong>, but a place to <strong>start your own analysis</strong>.</p><p>And that&#8217;s exactly the point.</p><p>&#128073; <strong><a href="https://footballhacking.streamlit.app/">If you haven&#8217;t yet, go to the Football Hacking web app now</a></strong>, explore a match, download the data, and try building your first custom chart. Also, <strong>subscribe to the Football Hacking newsletter</strong> to stay close to everything that&#8217;s coming next.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Assine agora&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.footballhacking.com/subscribe?"><span>Assine agora</span></a></p><p></p><div><hr></div><h2>A New Premium Series Is Coming (Including Pass Networks)</h2><p>This update is also a preview of what&#8217;s ahead.</p><p>Very soon, I&#8217;ll be launching a <strong>new series for premium subscribers</strong> where I&#8217;ll walk you step by step through building different types of football visualizations using Python and mplsoccer.</p><p>We&#8217;ll cover things like:</p><ul><li><p>Shot maps and chance quality visualizations</p></li><li><p>Heatmaps and positional maps</p></li><li><p>Progressive actions and zone-based charts</p></li><li><p><strong>Pass networks</strong> (yes, properly built and interpreted)</p></li><li><p>And several other practical, match-analysis-driven graphics</p></li></ul><p>The idea is simple: you&#8217;ll use <strong><a href="https://footballhacking.streamlit.app/">the same data you can download from the app</a></strong>, and I&#8217;ll show you how to turn it into clear, insightful, and professional-looking charts.</p><p>If you&#8217;ve ever looked at a visualization and thought, &#8220;I wish I knew how to build this myself,&#8221; this series is for you.</p><div><hr></div><h2>From Viewer to Builder</h2><p>This is the shift I care most about.</p><p>Not just giving you charts.<br>Not just giving you metrics.<br>But giving you <strong>the tools and the data</strong> to become a builder of your own analysis.</p><p>Whether you&#8217;re a student, an analyst, a coach, a content creator, or just someone obsessed with understanding the game more deeply, having access to the raw data changes how you think. You stop being a spectator of analytics and start becoming <strong>an active participant</strong> in the process.</p><p>And that&#8217;s exactly what Football Hacking is about.</p><div><hr></div><h2>Start Today</h2><p>Here&#8217;s what I recommend you do right now:</p><ol><li><p>&#128073; Visit the <strong><a href="https://footballhacking.streamlit.app/">Football Hacking web app</a></strong></p></li><li><p>Explore a match or a team</p></li><li><p>Download the data used in the charts</p></li><li><p>Open Python and try a simple mplsoccer plot</p></li><li><p>See how much freedom you suddenly have</p></li></ol><p>And if you want to follow the upcoming tutorials, deep dives, and the full visualization series, <strong>become a subscriber to the Football Hacking newsletter</strong>&#8212;especially the premium tier, where all the hands-on content will live.</p><p>This is just the beginning. The data is now in your hands. Let&#8217;s build something great with it. &#9917;&#128202;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.footballhacking.com/subscribe?&quot;,&quot;text&quot;:&quot;Inscreva-se&quot;,&quot;language&quot;:&quot;pt-br&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Football Hacking is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Digite seu e-mail&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Inscreva-se"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Manchester United After Amorim: What the Data Says About the Carrick Effect]]></title><description><![CDATA[From transition to transformation: what the data really shows.]]></description><link>https://www.footballhacking.com/p/manchester-united-after-amorim-what</link><guid isPermaLink="false">https://www.footballhacking.com/p/manchester-united-after-amorim-what</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Fri, 06 Feb 2026 03:10:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Mprd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.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_!Mprd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Mprd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Mprd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2242635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/187008338?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.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_!Mprd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Mprd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc89d20e9-601c-426e-bf7c-1f24fb72940b_1536x1024.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 role="img" 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><title></title><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>If you care about football beyond narratives and headlines, this is one of those moments where the numbers actually tell a fascinating story. Manchester United&#8217;s 1&#8211;1 draw against Leeds United marked the end of Rubem Amorim&#8217;s stint and the beginning of a new chapter, first under an interim setup and then under Michael Carrick. Since then, something has clearly shifted. The eye test hints at it. The table suggests it. But today, we&#8217;re going to do what really matters: follow the data.</p><p>All the metrics you&#8217;ll see discussed here were extracted directly from my MongoDB database and processed and analyzed using Python. No vibes. No highlight clips. Just structured, reproducible analysis. And if you want to explore these numbers interactively, with filters, comparisons, and intuitive visuals, make sure to visit the Football Hacking web app. It&#8217;s the fastest way to turn raw football data into real insight.</p><p>Before we dive in: if you enjoy this kind of deep, data-driven football analysis, consider subscribing to the newsletter&#8212;especially the premium tier. That&#8217;s where I publish the most detailed breakdowns, methodologies, and experimental metrics you won&#8217;t find anywhere else on the internet. If you&#8217;re serious about understanding the game through numbers, that&#8217;s where you want to be.</p><p>Now, let&#8217;s talk about what actually changed at Manchester United.</p><div><hr></div><h2>The Context: Same Squad, Different Signals</h2><p>Managerial changes often come wrapped in emotional narratives: &#8220;new energy,&#8221; &#8220;fresh ideas,&#8221; &#8220;a psychological boost.&#8221; Sometimes that&#8217;s true. Sometimes it&#8217;s just noise. The only way to separate signal from storytelling is to look at performance indicators that describe how a team plays, not just what the scoreboard says.</p><p>In this article, we&#8217;ll focus on a few core pillars:</p><ul><li><p><strong>xG from open play per 100 passes</strong> and its <strong>balance</strong> (for vs. against)</p></li><li><p><strong>Percentage of passes in the opponent&#8217;s half</strong></p></li><li><p><strong>A split-sample comparison</strong>: matches with Amorim vs. matches without him</p></li><li><p><strong>Weighted Relative Performance</strong>, a custom metric I created</p></li><li><p><strong>Poisson-based probabilities</strong> for scoring and conceding 2+ goals</p></li><li><p><strong>Expected Threat (xT)</strong> and <strong>Load Centrality</strong> in the debut against Manchester City</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vjtn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vjtn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 424w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 848w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 1272w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vjtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png" width="1456" height="439" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:439,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72497,&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://www.footballhacking.com/i/187008338?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.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_!Vjtn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 424w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 848w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.png 1272w, https://substackcdn.com/image/fetch/$s_!Vjtn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e8cb3c6-bf03-4135-a11e-c0eef4c8053e_1494x450.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 role="img" 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><title></title><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>Again, all of this comes from my own MongoDB database, cleaned, transformed, and analyzed in Python. If you want to explore these dimensions team by team and match by match, don&#8217;t forget to check the Football Hacking app.</p><div><hr></div><h2>United at the Top in Open-Play xG per 100 Passes</h2><p>Let&#8217;s start with one of my favorite productivity metrics: <strong>xG from open play per 100 passes</strong>. Instead of just asking &#8220;how much xG does a team generate?&#8221;, this metric asks something more interesting: <em>how efficient is a team at turning possession into danger?</em></p><p>Right now, Manchester United sits at the <strong>top of the Premier League</strong> in this metric. That alone is striking. Even more striking is that they&#8217;re also performing very well in the <strong>balance</strong> of this same metric&#8212;meaning the gap between what they create and what they allow is strongly positive.</p><p>In practical terms, this suggests two things:</p><ol><li><p>United are generating high-quality chances relative to the amount of passing they do.</p></li><li><p>They are not allowing opponents to do the same at the same rate.</p></li></ol>
      <p>
          <a href="https://www.footballhacking.com/p/manchester-united-after-amorim-what">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[From Raw Data to Insight: Visualizing Football Shots from FotMob with Python (Final Part) ]]></title><description><![CDATA[You&#8217;ve scraped the data. Now let&#8217;s see what it&#8217;s really saying]]></description><link>https://www.footballhacking.com/p/from-raw-data-to-insight-visualizing</link><guid isPermaLink="false">https://www.footballhacking.com/p/from-raw-data-to-insight-visualizing</guid><dc:creator><![CDATA[Saulo Faria]]></dc:creator><pubDate>Thu, 29 Jan 2026 13:51:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!snv4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.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_!snv4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!snv4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!snv4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!snv4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!snv4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!snv4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2556598,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/186191659?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.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_!snv4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!snv4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!snv4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!snv4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bbcb2ca-95f2-4acd-bb1c-05769d7bce5b_1536x1024.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 role="img" 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><title></title><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></p><p>If you made it this far, you&#8217;re officially at the <strong>final chapter of this web scraping series</strong>. And before we write a single new line of code, I want to say <strong>Thank You</strong>.</p><p>Thank you to everyone who trusted my work enough to become a <strong>premium subscriber</strong>. Your support is what makes it possible to go deeper, build things properly, and publish content that goes beyond surface-level tutorials.</p><p>And if you&#8217;re reading this and you&#8217;re <em>not</em> a premium subscriber yet, this is the perfect moment to become one. This article closes the series with something extremely concrete: <strong>we finally turn scraped football data into a real, interpretable visualization</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JoP7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JoP7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JoP7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2527839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.footballhacking.com/i/186191659?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.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_!JoP7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!JoP7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5213a3a1-f7de-4231-8bf6-bcc851fb73c0_1536x1024.png 1456w" sizes="100vw"></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 role="img" 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><title></title><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></p><p>&#128073; <strong>Upgrade to premium and unlock the full series</strong>.</p><p>This is also the article where everything clicks.<br>All the scraping, all the data cleaning, all the small technical decisions finally pay off visually.</p><p>So I strongly encourage you to <strong>read this post until the end</strong>. Not just for the final chart, but because understanding <em>why</em> we structure data this way will make you a much better analyst, scraper, and Python user.</p><p>And as always, you can already explore real football insights in my free web app here:<br>&#128073; https://footballhacking.streamlit.app/</p><div><hr></div><h2><strong>A Quick Recap: Where We Left Off</strong></h2><p>Before we move forward, let&#8217;s briefly reconnect with the previous step of this journey.</p><p>In the last article, we focused on <strong>extracting shot data from FotMob</strong>, transforming raw API responses into a structured Python dictionary containing information such as:</p><ul><li><p>Minute of the shot</p></li><li><p>Expected Goals (xG)</p></li><li><p>Expected Goals on Target (xGoT)</p></li><li><p>Shot outcome</p></li><li><p>Team identifier</p></li></ul><p>If you haven&#8217;t read that post yet, I highly recommend doing so first, because <strong>this article builds directly on top of it</strong>.</p><p>You can find it here:<br>&#128073; <a href="https://www.footballhacking.com/p/web-scraping-football-data-with-python-2e3?r=30n7hp">https://www.footballhacking.com/p/web-scraping-football-data-with-python-2e3?r=30n7hp</a></p><p>Now, instead of stopping at raw data, we&#8217;ll take the most important step in any data project:<br><strong>turning numbers into something we can actually interpret</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EjEa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EjEa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 424w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 848w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 1272w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EjEa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png" width="1456" height="613" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:613,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:329544,&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://www.footballhacking.com/i/186191659?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.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_!EjEa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 424w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 848w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.png 1272w, https://substackcdn.com/image/fetch/$s_!EjEa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fb804aa-4af3-4611-9f45-dfb6cb59af41_1595x671.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 role="img" 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><title></title><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></p>
      <p>
          <a href="https://www.footballhacking.com/p/from-raw-data-to-insight-visualizing">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>