<?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[Transfer Science]]></title><description><![CDATA[Data-driven deep dives into transfers and player valuations.

Built for fans and professionals interested in the business of football.]]></description><link>https://www.transferscience.com</link><image><url>https://substackcdn.com/image/fetch/$s_!RwaV!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5929608b-875d-4f74-9264-d2bb70bbbca3_1254x1254.png</url><title>Transfer Science</title><link>https://www.transferscience.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 13 Jun 2026 11:42:43 GMT</lastBuildDate><atom:link href="https://www.transferscience.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Transfer Science]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[transferscience@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[transferscience@substack.com]]></itunes:email><itunes:name><![CDATA[MartinOnData]]></itunes:name></itunes:owner><itunes:author><![CDATA[MartinOnData]]></itunes:author><googleplay:owner><![CDATA[transferscience@substack.com]]></googleplay:owner><googleplay:email><![CDATA[transferscience@substack.com]]></googleplay:email><googleplay:author><![CDATA[MartinOnData]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[An Unpretentious Guide to Group A]]></title><description><![CDATA[Can a blind-data look tell us who&#8217;s getting out of this group?]]></description><link>https://www.transferscience.com/p/an-unpretentious-guide-to-group-a</link><guid isPermaLink="false">https://www.transferscience.com/p/an-unpretentious-guide-to-group-a</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 11 Jun 2026 15:01:30 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e9dfc36f-09e5-425f-a26b-c12dc5bc16f1_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>With the kick-off of the World Cup fast approaching (in a couple of hours), I must confess something.</p><p>As an Arsenal fan who has barely had time to catch his breath, I somehow did not realise the World Cup was starting today.</p><p>Honestly, I did not have much time to prepare.</p><p>So instead of watching ten preview podcasts, reading every tactical thread on Twitter, and pretending I had watched all of Czechia&#8217;s qualifiers, I did what any normal person would do.</p><p>I opened my laptop, pulled some Wyscout data, spent two hours cleaning it, and decided to create this unpretentious guide to Group A (Mexico, South Africa, South Korea and Czechia).</p><p>My purpose is twofold.</p><p>First, I want to see which players we should watch out for, based solely on national-team form and only according to the data.</p><p>Second, I want to come back once the games are played and see whether this blind-data approach actually pointed us somewhere useful.</p><div><hr></div><h2><em>The approach</em></h2><p>I focus only on the players selected for the World Cup and only on their performances for their senior national teams. </p><p>More specifically, I look at matches played since <strong>7 September 2023</strong>, which I define as the start of the World Cup qualification cycle. The hosts, of course, did not play qualifiers, so for them I include their other senior national-team games, including friendlies.</p><p>For each broad position group &#8212; goalkeeper, central defender, wing-back/full-back, defensive midfielder, central midfielder, attacking midfielder/wide attacker, and striker/link-up forward &#8212; I use a set of metrics to create player indexes (you may find the methodology <a href="https://drive.google.com/drive/folders/1F69sjvxOK5WSpro8VTKrcgYe_J3OHswS?usp=sharing">here</a>).</p><p>Then I use z-scores to compare the players.</p><p>If you are new to this, a z-score is just a way of saying how far a player is from the average player in the sample.</p><p>In plain English:</p><p>If a player has a z-score of <strong>1.5</strong>, it means he is <strong>1.5 standard deviations above the average</strong> for the players considered.</p><p>Which is the technical way of saying:</p><blockquote><p>This guy stands out. A lot.</p></blockquote><p>And yes, I know this methodology is not perfect.</p><p>Ideally, you would compare players who are playing in the same league, under similar conditions, against broadly similar opposition. Here, we are comparing players from four national teams who played in different parts of the world, in different qualification routes, against different opponents.</p><p>So, no, this is not a definitive ranking of player quality.</p><p>But that is not really the point.</p><p>The point is to compare the players in this group before I have watched most of them properly, using only the data available from their national-team performances.</p><p>It is a Substack post, not an academic paper.</p><p>My pub, my rules.</p><p>Let&#8217;s get into it.</p><div><hr></div><h2><em>1 &#8212; Best Goalkeepers</em></h2><p>Here are the Group A goalkeepers ranked.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bljY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bljY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 424w, https://substackcdn.com/image/fetch/$s_!bljY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 848w, https://substackcdn.com/image/fetch/$s_!bljY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 1272w, https://substackcdn.com/image/fetch/$s_!bljY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bljY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png" width="1456" height="625" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:625,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121639,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.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_!bljY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 424w, https://substackcdn.com/image/fetch/$s_!bljY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 848w, https://substackcdn.com/image/fetch/$s_!bljY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.png 1272w, https://substackcdn.com/image/fetch/$s_!bljY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf482162-1642-4a8e-8a15-ecc5ea33f8b1_1700x730.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><strong>Ronwen Williams</strong> &#8212; the first (but not the only) player in this exercise I had to Google &#8212; tops the table with a z-score of <strong>1.4</strong>. In plain English: among this group of keepers, the South African is the clear standout. He also comes with a solid sample: roughly <strong>30 full 90s</strong>.</p><p>Second comes Czechia&#8217;s <strong>Jind&#345;ich Stan&#283;k</strong>, with a z-score of <strong>1</strong>. That puts him about one standard deviation above the average keeper in this group. The sample is smaller, so I would be a little more careful here. But with Czechia&#8217;s other keeper sitting in negative territory, my data-only guess is that Stan&#283;k starts between the posts.</p><p>Third is Korea Republic&#8217;s <strong>Kim Seung-gyu</strong>, with a z-score of <strong>0.8</strong>. That is (also) very solid. As a rule of thumb, once a player is above <strong>0.5</strong>, he is already meaningfully above the group average.</p><blockquote><p><em><strong>So, overall, the top of the goalkeeper table is not especially chaotic. Williams leads, Stan&#283;k and Kim are comfortably positive, and all three look like credible tournament keepers on the data.</strong></em></p></blockquote><p>Then we get to Mexico&#8217;s eternal World Cup character: <strong>Guillermo Ochoa</strong>.</p><p>He comes in at <strong>-0.55</strong>, which means he was roughly half a standard deviation below the Group A goalkeeper average. Could he still pull off another World Cup resurrection and justify the memes one more time? Maybe. </p><p>But from a blind-data point of view, I&#8217;ll pass on this one.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2><em>2 &#8212; Best central defenders</em></h2><p>When it comes to central defenders, there is one clear outlier: <strong>Kim Min-jae</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_!1x-R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1x-R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 424w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 848w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 1272w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1x-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png" width="1456" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183403,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.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_!1x-R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 424w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 848w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.png 1272w, https://substackcdn.com/image/fetch/$s_!1x-R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea770b5f-051f-4e0d-a33c-67f1eac99299_2132x838.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><blockquote><p><em><strong>The Korea Republic centre-back comes out with a z-score of 2.3, which is ridiculous in this context. </strong></em></p></blockquote><p>Remember: a z-score of 2 means a player is two standard deviations above the average player in the sample. So, at least in this Group A pool, Kim is not just good. He is the standout central defender by a distance.</p><p>Second comes Mexico&#8217;s <strong>C&#233;sar Montes</strong>, with a z-score of <strong>0.81</strong>. Not Kim-level, but still comfortably above average.</p><p>In third, we have another Korean defender, although with a lower-reliability sample, so I would be careful before over-interpreting that one. Then come two Czech defenders: <strong>Ladislav Krej&#269;&#237;</strong> and <strong>David Zima</strong>, one at Wolves, the other at Sparta Prague.</p><p>The first South African centre-backs only appear near the bottom of the table, both below the Group A average.</p><p>Which is interesting.</p><blockquote><p><em><strong>South Africa have the best goalkeeper in the group by this method, but some of the weakest centre-back scores.</strong></em></p></blockquote><p>What do I do with that?</p><div><hr></div><h2><em>3 &#8212; Best full-backs</em></h2><p>Now to the full-backs.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XgwH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XgwH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 424w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 848w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 1272w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XgwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png" width="1456" height="587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c771928-398a-485c-a591-760265d14446_2268x914.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:587,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:213652,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.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_!XgwH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 424w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 848w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.png 1272w, https://substackcdn.com/image/fetch/$s_!XgwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c771928-398a-485c-a591-760265d14446_2268x914.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>Here, Mexico&#8217;s <strong>Israel Reyes</strong> leads the way with a z-score of <strong>1.68</strong>. Behind him, Czechia look very strong, with <strong>Vladim&#237;r Coufal</strong> and <strong>David Jur&#225;sek</strong> both above <strong>1.0</strong>.</p><blockquote><p><em><strong>That feels like a genuine Czech strength: two flanks, two strong profiles, both coming out very well in the data.</strong></em></p></blockquote><p>Then we get two South African players &#8212; <strong>Siyabonga Kabini</strong> and <strong>Aubrey Modiba</strong> &#8212; also above the <strong>0.5</strong> mark. Again, anything above 0.5 is already a player meaningfully above the group average.</p><p>Interestingly, Korea Republic do not dominate this category. Only one Korean full-back comes out with a positive z-score.</p><p>Maybe their system does not favour full-backs. Maybe the role is less expressive in their national team. Maybe I should stop pretending I have watched enough Korea Republic full-back minutes to comment with confidence.</p><p>So I&#8217;ll stop there.</p><div><hr></div><h2><em>4 &#8212; Best midfielders</em></h2><p>In midfield, we again have one clear standout. And once again, he is Korean.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zl3D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zl3D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 424w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 848w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 1272w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zl3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png" width="1456" height="587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:587,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195794,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.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_!zl3D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 424w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 848w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.png 1272w, https://substackcdn.com/image/fetch/$s_!zl3D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff38ec1bf-feb2-4f06-87c5-83f7a837e220_2268x914.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><strong>Hwang In-beom</strong>, now at Feyenoord, comes out with a z-score of <strong>2.27</strong>. That is way, way above the sampled midfielders from Group A.</p><p>Second is Czechia&#8217;s <strong>Luk&#225;&#353; &#268;erv</strong>, with <strong>1.66</strong>. Third is South Africa&#8217;s <strong>Teboho Mokoena</strong>, from Mamelodi Sundowns, with <strong>1.15</strong>.</p><p>So the top three midfielders are nicely spread: one Korean, one Czech, one South African.</p><p>Then things get interesting: the next three are all Mexican, although with lower scores.</p><p>So Korea have the standout player. Mexico kind of have depth. Czechia and South Africa each have one strong midfield profile.</p><p>Which is basically exactly the kind of sentence that makes me want to watch this group now.</p><div><hr></div><h2><em>5 &#8212; Best attacking midfielders</em></h2><p>Among the attacking midfielders and wide attackers, Korea Republic take over.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ffjv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ffjv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 424w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 848w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 1272w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ffjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png" width="1456" height="517" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:517,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177595,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.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_!Ffjv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 424w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 848w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.png 1272w, https://substackcdn.com/image/fetch/$s_!Ffjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F62842f0f-90b9-4911-8700-846c1c808c69_2268x806.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>At the top we have <strong>Lee Kang-in (1.7)</strong>, followed closely by <strong>Son Heung-min (1.4)</strong>, and then <strong>Hwang Hee-chan (0.8)</strong> also appearing strongly. That is a serious attacking trio, and the data likes them a lot.</p><p>South Africa&#8217;s <strong>Oswin Appollis</strong> (0.9) also appears high, which is one of the more interesting names in the table. Mexico get a player into the top five too, but overall this category looks heavily Korean.</p><p>The striking thing is the Czech absence.</p><p>Czechia showed up strongly at full-back and reasonably well in defence and midfield. But in this attacking-mid / wide-attacker bucket, they do not really pop in the same way.</p><p>So, if we are doing this blindly, the attacking edge clearly belongs to Korea Republic.</p><div><hr></div><h2><em>6 &#8212; Best forwards</em></h2><p>And finally, the cherry on top: the forwards.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!te9g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!te9g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 424w, https://substackcdn.com/image/fetch/$s_!te9g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 848w, https://substackcdn.com/image/fetch/$s_!te9g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 1272w, https://substackcdn.com/image/fetch/$s_!te9g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!te9g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png" width="1456" height="601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195773,&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.transferscience.com/i/201594147?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.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_!te9g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 424w, https://substackcdn.com/image/fetch/$s_!te9g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 848w, https://substackcdn.com/image/fetch/$s_!te9g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.png 1272w, https://substackcdn.com/image/fetch/$s_!te9g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ba25acb-3aac-479f-a06f-a7b177e57f64_2160x892.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>Here we have a player above everyone else: <strong>Iqraam Rayners (1.9)</strong>, from Mamelodi Sundowns, who comes out almost two standard deviations above the average Group A forward. Had to google this one as well. Sorry.</p><p>That is a proper standout score, though.</p><p>Second comes Czechia&#8217;s <strong>Patrik Schick (1)</strong>, which feels less surprising. Third is Korea Republic&#8217;s <strong>Oh Hyeon-gyu (0.9)</strong>, now at Besiktas. Then comes <strong>Ra&#250;l Jim&#233;nez</strong> (0.6) in fourth.</p><p>I expected Jim&#233;nez to be a little higher, but hey. That is the whole point of doing this blind: sometimes the data pushes back against the names in your head.</p><p>South Africa have the standout. Czechia have the established name. Korea have a strong option. Mexico are still there, but not quite leading the line in the data.</p><p>So I am calling this category even.</p><div><hr></div><h2><em>So, what should we take from all this?</em></h2><p>What should we take from all this amateur blind-data analysis?</p><p><em><strong>First</strong></em>, Korea Republic look like the strongest team in the group on individual quality.</p><p>Not everywhere. But in the places that usually decide football matches &#8212; midfield and attack &#8212; they show up very strongly. Kim Min-jae dominates the centre-back table. Hwang In-beom dominates the midfield table. Lee Kang-in, Son Heung-min and Hwang Hee-chan dominate the attacking-mid / wide-attacker table. That is a pretty convincing spine.</p><p><em><strong>Second</strong></em>, Czechia look solid in the less glamorous areas. They show well at full-back, have good centre-back options, a strong midfield profile in &#268;erv, and of course Patrik Schick up front.</p><p><em><strong>Third</strong></em>, South Africa are the most interesting team in the group. They have the best goalkeeper by the data, the standout striker in Rayners, and a strong midfield profile in Mokoena. But the centre-back scores are worrying. Best goalkeeper, weak central defenders. This is either a red flag, or the beginning of a very fun tournament story.</p><p><em><strong>Fourth</strong></em>, Mexico do not really impress at the individual level in this blind-data exercise. That surprised me a bit. They have good players here and there &#8212; Israel Reyes, C&#233;sar Montes, a few midfielders, Jim&#233;nez still hanging around &#8212; but they do not dominate any category in the way Korea do. They look more like a team with decent depth than a team with obvious data standouts.</p><p>Maybe that is unfair. Maybe the model punishes them because they are hosts and played a different mix of games. Maybe tournament Mexico will do tournament Mexico things. But if I had to judge only from this exercise, I would not have Mexico as the automatic favourite.</p><p><em><strong>Which means, naturally, Mexico will probably top the group and make me look stupid.</strong></em></p><p>So here is the final blind-data prediction:</p><p><strong>1. Korea Republic</strong><br><strong>2. Czechia</strong><br><strong>3. Mexico</strong><br><strong>4. South Africa</strong></p><p>Let&#8217;s see whether the laptop knew ball.</p><p>Thank you for reading until the end &#10084;&#65039;</p><p>Cheers,</p><p><em><strong>Martin</strong></em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Transfer Science! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Subtle Art of the Transfer Flip]]></title><description><![CDATA[Before the Ballon d&#8217;Or, there was the Balance Sheet d&#8217;Or: what 12 seasons of transfer data reveal about football&#8217;s best buy-low, sell-high deals.]]></description><link>https://www.transferscience.com/p/the-subtle-art-of-the-transfer-flip</link><guid isPermaLink="false">https://www.transferscience.com/p/the-subtle-art-of-the-transfer-flip</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Wed, 03 Jun 2026 08:31:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4d21cc34-32ea-4947-a3d3-9822c4bf8f5f_1731x909.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em><strong>Transfer Science #002</strong></em>, the newsletter for people who think &#8220;he should have scored&#8221; deserves a probability attached to it.</p><p>Today, we&#8217;re diving into the <strong>subtle art of buying low and selling high</strong> &#8212; the transfer flip.</p><p>By the end of this post, you&#8217;ll know:</p><ul><li><p>which deals have broken the market in terms of absolute profit;</p></li><li><p>which transfers have generated the most ridiculous returns on investment; </p></li><li><p>and which ones might go down as some of the worst deals ever made.</p></li></ul><div><hr></div><h2><em><strong>Before we begin</strong></em></h2><p>Before we get into the rankings, a few definitions.</p><p>For the purposes of this article, we define a <strong>transfer flip</strong> as a case where a club buys a player <em><strong>for a fee</strong></em> and later sells that same player <em><strong>for another fee</strong></em>. </p><p>This means that players who arrive for free, come through the academy, or leave without a fee are <em><strong>not</strong></em> included in the analysis.</p><p>We restrict the analysis to players who were <strong>24 or younger at the time of the original purchase</strong>. This is important: older players naturally lose value as they age, which would mechanically bias the results.</p><p>All transfer fees are expressed in <strong>2026 euros</strong>, so figures are comparable across time.</p><p>The data comes from <a href="https://www.transfermarkt.com/">Transfermarkt</a>.</p><p>Now that we&#8217;ve got that out of the way, let&#8217;s start with some context.</p><div><hr></div><h1><em><strong>1 &#8212; How common are transfer flips?</strong></em></h1><p>Our dataset spans 12 seasons of transfer activity (<strong>2014/15 to 2025/26</strong>) and includes close to <strong>28,000 fee-paying transactions</strong> across 100 associations.</p><p>The table below presents the number of transfers per confederation, along with the number of participating associations and clubs. Overall, a rather comprehensive picture of global transfer activity</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T-yS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T-yS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 424w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 848w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 1272w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T-yS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png" width="1456" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97399,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.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_!T-yS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 424w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 848w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.png 1272w, https://substackcdn.com/image/fetch/$s_!T-yS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3f66bc0-00b8-493a-8dc0-8243285e2b6d_1616x626.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>However, not all of these transactions are relevant for our analysis.</p><p>The key question is:</p><blockquote><p><em><strong>Out of these 27,924 transfers, how many involve a player who is later resold after being bought once?</strong></em></p></blockquote><p>In total, <strong>7,938 transfers</strong> meet this criterion. Of these, <strong>5,306 involve players who were 24 or younger at the time of initial purchase</strong>, which is the subset we focus on in this analysis.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LJuq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LJuq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 424w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 848w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 1272w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LJuq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png" width="1456" height="352" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e45122a5-3583-4162-b9de-915d29885feb_1620x392.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:352,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68530,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.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_!LJuq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 424w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 848w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 1272w, https://substackcdn.com/image/fetch/$s_!LJuq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe45122a5-3583-4162-b9de-915d29885feb_1620x392.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Now delving even further, among these flips:</p><ul><li><p><strong>63.4% are profitable</strong> for the intermediary club (the one that bought and sold)</p></li><li><p>Clubs hold players for an average of <strong>2.3 seasons</strong></p></li></ul><p>As for the fees paid, the <strong>median resale fee is &#8364;1.7m with </strong>the <strong>median profit is around &#8364;0.5m</strong>. On average, clubs flipping younger players generate <strong>relatively modest profits</strong>. </p><p>Most clubs are not printing &#8364;20m gains every summer, despite what newspaper headlines might make you think. In practice, the transfer market looks very different: clubs typically make <strong>small gains</strong>, break even, or occasionally take losses.</p><p>The <strong>average profit is &#8364;2.6m</strong>, with extreme outcomes ranging from a <strong>&#8364;135m loss to a &#8364;142.3m gain</strong>. </p><p>Can you guess which two players are behind those extremes?  </p><p>Take a guess (you&#8217;ll get the answers below &#8212; don&#8217;t peek just yet &#128578;).</p><div><hr></div><h1><em><strong>2 &#8212; The Most Profitable Transfer Flips</strong></em></h1><p>Let&#8217;s start with the simplest measure: absolute profit.</p><p>The way we&#8217;ll approach this is simple. I&#8217;ll briefly walk you through the 10 biggest transfer flips, ranked by profit generated.</p><p>But instead of starting at the top, let&#8217;s build up to it.</p><p>Because where&#8217;s the fun in revealing the winner straight away?</p><div><hr></div><h3><em>#10 Alisson to Liverpool: the only goalkeeper who made the top 20</em></h3><p>At #10, we have the only goalkeeper in the top 20: Alisson.</p><p>Roma bought him for around &#8364;10.3m and sold him to Liverpool two seasons later for around &#8364;90.1m.</p><p>A huge profit.</p><p>And, unlike some of the other names in this ranking, this one worked beautifully for the buyer too.</p><p>Liverpool paid a massive fee, but they bought one of the most valuable pieces of their title-winning machine.</p><p>There are no cheap or expensive players. There are valuable players and replaceable ones.</p><p>Alisson was very much the former.</p><div><hr></div><h3><em>#9 Thomas Lemar to Atl&#233;tico Madrid: the Monaco machine</em></h3><p>At #9 comes Thomas Lemar.</p><p>Monaco bought him from Caen for around &#8364;5.2m and sold him to Atl&#233;tico Madrid for close to &#8364;89.5m after that famous Monaco cycle.</p><p>This is the version of flipping that every development club dreams of: buy young, build a title-winning team, create a market frenzy, and sell the pieces at maximum value.</p><p>Lemar did not become the superstar some expected him to be. But for Monaco, the deal was a masterpiece.</p><div><hr></div><h3><em>#8 Enzo Fern&#225;ndez to Chelsea: the fast flip</em></h3><p>At #8 comes Enzo Fern&#225;ndez, whose move from Benfica to Chelsea generated roughly &#8364;84.6m of profit in just one season.</p><p>This is one of the cleanest modern examples of the fast flip.</p><p>Benfica paid a premium to get him from River Plate &#8212; roughly three times his market value &#8212; but then extracted an even bigger premium from Chelsea only months later.</p><p>Buy expensive.</p><p>Sell even more expensive.</p><p>Simple in theory. Very hard in practice.</p><div><hr></div><h3><em>#7 Antony to Manchester United: Ajax&#8217;s flip, United&#8217;s flop</em></h3><p>At #7 comes Manchester United&#8217;s Antony <s>flip</s> flop.</p><p>Two seasons of Eredivisie football were enough to turn Antony from a &#8364;19.3m winger into a &#8364;104.7m sale to Manchester United, generating around &#8364;85.4m of profit for Ajax.</p><p>Brilliant business for Ajax.</p><p>A much more painful one for United.</p><div><hr></div><h3><em>#6 Mois&#233;s Caicedo to Chelsea: Brighton in one transfer</em></h3><p>At #6, we have Brighton&#8217;s brilliant Mois&#233;s Caicedo flip.</p><p>Brighton bought Caicedo for a relatively modest fee and, three seasons later, sold him to Chelsea for a profit of around &#8364;86.7m.</p><p>That is Brighton in a sentence.</p><p>Identify the talent early. Develop him. Sell him when the richest clubs start panicking.</p><p>Nobody really questions Caicedo&#8217;s ability. He is an elite defensive midfielder. But Chelsea paid the fully repriced version of him.</p><p>Brighton bought the uncertainty. Chelsea bought the proof.</p><p>And proof is expensive.</p><p>What you do with that proof, of course, is another story.</p><div><hr></div><h3><em>#5 Virgil van Dijk to Liverpool and #4 Harry Maguire to Manchester United: same recipe, different endings</em></h3><p>Now we enter the &#8364;90m-profit zone.</p><p>And this is where two centre-backs arrive almost side by side.</p><p>Both were bought at similar ages. Both were bought for similar fees. Both were sold two seasons later for enormous profits.</p><p>One became arguably the greatest Premier League centre-back of his generation.</p><p>The other is Harry Maguire.</p><p>Southampton bought Van Dijk aged 24 for &#8364;20.2m and sold him to Liverpool two seasons later for &#8364;107.1m.</p><p>Leicester bought Maguire aged 24 for &#8364;17.3m and sold him to Manchester United two seasons later for &#8364;106.9m.</p><p>From the selling clubs&#8217; perspective, both deals were close to perfect.</p><p>Buy a Premier League-ready defender. Let him develop. Let a bigger club convince itself that he is the missing piece.</p><p>Then sell at peak market heat.</p><p>The buying-club stories, of course, are very different.</p><p>Van Dijk transformed Liverpool.</p><p>Maguire became a much more complicated case.</p><p>But for Southampton and Leicester, the flips were excellent.</p><p>Turning a two-season centre-back stint into roughly &#8364;90m of profit is the sort of deal every sporting director dreams about.</p><div><hr></div><h3><em>#3 Jude Bellingham to Real Madrid: Dortmund&#8217;s masterstroke</em></h3><p>Third comes Jude Bellingham, Dortmund&#8217;s first appearance in this ranking &#8212; but not their last.</p><p>They signed him from Birmingham City for &#8364;36.9m, a fee that, at the time, many would have considered aggressive for a 17-year-old midfielder playing in England&#8217;s second tier.</p><p>Three seasons later, they sold him to Real Madrid, generating close to &#8364;95.6m in profit.</p><p>What makes this case different is that Bellingham lived up to the hype almost immediately after his move.</p><p>He became one of Real Madrid&#8217;s key players, spent much of his first season as their leading goalscorer, and helped them win major trophies in his debut campaign.</p><p>So this is not a simple story of one club winning and another losing.</p><p>Dortmund bought early. Real Madrid bought certainty.</p><p>Win-win.</p><div><hr></div><h3><em>#2 Du&#353;an Vlahovi&#263; to Juventus: when ROI becomes absurd</em></h3><p>Second comes Du&#353;an Vlahovi&#263;.</p><p>Fiorentina bought him for around &#8364;4m and four seasons later sold him to Juventus for &#8364;102m, generating close to &#8364;98m in profit.</p><p>The return on investment?</p><p>Around 2,464%.</p><p>Yes, you read that correctly.</p><p>Juventus fans might not describe this transfer as a success story, but for Fiorentina, it was an extraordinary piece of business.</p><p>They signed an 18-year-old striker, developed him, benefited from his goalscoring output &#8212; especially in his final two seasons &#8212; and sold him at the exact moment when top clubs came knocking.</p><p>A perfect execution of the transfer-flip model.</p><p>What happened next at Juventus is another story.</p><p>And now, finally, the winner.</p><div><hr></div><h3><em>#1 Ousmane Demb&#233;l&#233; to Barcelona: the <s>Ballon d&#8217;Or</s> Balance Sheet d&#8217;Or winner</em></h3><p>At the top of the ranking is Ousmane Demb&#233;l&#233;.</p><p>During the 2016/17 season, Dortmund bought him from Rennes at the age of 19 for around &#8364;45m.</p><p>One season later, they sold him to Barcelona for &#8364;187m.</p><p>In inflation-adjusted terms, the deal generated about &#8364;142m in profit.</p><p>It is hard to imagine many deals ever topping that.</p><p>What makes the story even more interesting is the context at the time of the transfer. Demb&#233;l&#233; was valued at around &#8364;15m, meaning Dortmund appeared to be paying a significant premium &#8212; roughly three times his market value.</p><p>Who would have guessed that such an investment would turn into the most profitable transfer flip ever recorded?</p><p>For Dortmund, the return on investment was around 316%.</p><p>Not bad for a single season.</p><p>And here&#8217;s the complete table.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0DYD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0DYD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 424w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 848w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 1272w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0DYD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png" width="1456" height="1334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1334,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:606977,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0DYD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 424w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 848w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.png 1272w, https://substackcdn.com/image/fetch/$s_!0DYD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7744712a-f1fe-4f21-b589-837e28794953_2312x2118.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 class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">You haven&#8217;t subscribed yet?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3><em>What about #11 to #20?</em></h3><p>I won&#8217;t comment on every single deal, but a few patterns are worth noting.</p><p><em><strong>First</strong></em>, Dortmund are brilliant. Demb&#233;l&#233;. Bellingham. And also <em><strong>Jadon Sancho</strong></em> (another poor piece of business for the Red Devils).</p><p>That is not an accident.</p><p>Dortmund have repeatedly operated in the most lucrative part of the transfer market: elite young attackers and midfielders who are good enough to play immediately, but also young enough for richer clubs to imagine another level of upside.</p><p>The <strong>Jadon Sancho</strong> deal is a perfect example. Dortmund bought him from Manchester City, developed him into one of Europe&#8217;s most exciting wide players (I mean who didn&#8217;t enjoy his dribbling), and sold him to United for a huge profit.</p><p>Again, the sporting story after the sale is more complicated.</p><p>But the flip? Excellent.</p><div><hr></div><p><em><strong>Second</strong></em>, one-season flips are the most fascinating category.</p><p>Enzo Fern&#225;ndez is the obvious example, but he is not alone. Add <em><strong>Tanguy Ndomb&#233;l&#233;</strong></em> and <em><strong>Victor Osimhen </strong></em>to the list. Some clubs manage to buy a player, watch the market reprice him almost immediately, and sell before the story has time to cool down.</p><p>That is rare. And risky. But when it works, it looks like football&#8217;s version of venture capital.</p><p>Buy uncertainty. Sell hype. Cash out before everyone updates the spreadsheet.</p><div><hr></div><p><em><strong>Third</strong></em>, <strong>the Premier League is often on the buying side of these stories</strong>.</p><p>That is not necessarily a criticism. The Premier League is the richest league in the world, so it naturally pays the exit fees that allow other clubs to record these profits.</p><p>But some clubs appear more often than others.</p><p>Manchester United, in particular, show up four times in the top 20 as the end of cycle buying club. And for the wrong reasons. Harry Maguire. Antony. Jadon Sancho. And <em><strong>Bruno Fernandes</strong></em>.</p><p>Now, these deals should not all be put in the same bucket.</p><p>Bruno Fernandes was clearly <s>the only</s> a successful transfer for United. Sporting made a huge profit, yes, but United bought a player who instantly became one of their most important performers. Maguire is more debatable. Sancho and Antony are harder to defend.</p><p>The lesson is not simply &#8220;United bad.&#8221;</p><p>The lesson is that when you repeatedly buy players after their value has already exploded, the margin for error becomes tiny. </p><p>United clearly did not read the memo. Or should I say the memos?</p><div><hr></div><p>And for completeness sake, here&#8217;s a bonus table with the most profitable <em><strong>one-season</strong></em> transfer flips. </p><p>13 clubs on the end side of the deals come from the Premier league. I&#8217;ll just leave this here (you can learn more about the Premier league buying premium <a href="https://substack.com/home/post/p-195540367">here</a>).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!i6OJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!i6OJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 424w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 848w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 1272w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!i6OJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png" width="1456" height="1374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:599461,&quot;alt&quot;:&quot;&quot;,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!i6OJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 424w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 848w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.png 1272w, https://substackcdn.com/image/fetch/$s_!i6OJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdca6d998-ce0e-442a-b9e9-a1ccd639549b_2312x2182.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><h1><em><strong>3 &#8212; The Best Returns on Investment</strong></em></h1><p>So far, we have looked at the biggest flips in absolute euro terms.</p><p>But there is another way to look at this.</p><p>Because a <strong>&#8364;80m profit</strong> is enormous, of course. But if the player originally cost <strong>&#8364;40m</strong>, that is a very different deal from buying someone for <strong>&#8364;1m</strong> and selling him for <strong>&#8364;40m</strong>. In both cases the net profit is around &#8364;40m. In the first case, the return is 100%. In the second, it is 3,900%.</p><p>So next, let&#8217;s look at the most ridiculous returns on investment.</p><p>The table below presents the highest-ROI transfer flips where the initial fee was at least <strong>&#8364;0.5m</strong>. I include this filter for a simple reason: without it, the ROI ranking explodes because tiny initial fees create absurd percentages. And even with that filter, some of the numbers are still ridiculous.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Yl8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Yl8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 424w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 848w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 1272w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Yl8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png" width="1456" height="1374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:612353,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.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_!8Yl8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 424w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 848w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.png 1272w, https://substackcdn.com/image/fetch/$s_!8Yl8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19a712ca-b9d9-4b65-b18b-bce3bce75c6e_2312x2182.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>At number one, we have <strong>Benfica&#8217;s Ederson flip</strong>.</p><p>Benfica initially bought him for around <strong>&#8364;0.6m</strong> and sold him to Manchester City two seasons later for <strong>&#8364;50.6m</strong>. That is a net profit of roughly <strong>&#8364;50m</strong>.</p><p>Or, put differently, a return on investment of around <strong>7,760%</strong>.</p><p>Wow.</p><p>A few other deals are worth mentioning.</p><p>One is <strong>AZ Alkmaar&#8217;s Vincent Janssen flip</strong>. One elite season in the Eredivisie was all it took for Tottenham to pay more than 43 times AZ&#8217;s initial investment.</p><p>Just one season. Around <strong>&#8364;27.6m</strong> in net profit. </p><p>For the record, he did find the net at Spurs. </p><p>But only <strong>2 </strong>times in <strong>3</strong> Premier League <s>games</s> seasons.</p><p>Another painful reminder that Dutch goalscoring numbers do not always translate neatly to English football.</p><p>Further down the ranking, we find <strong>Fiorentina&#8217;s Du&#353;an Vlahovi&#263; flip</strong> again.</p><p>So not only was Vlahovi&#263; one of the biggest flips in absolute terms, with <strong>&#8364;98m</strong> in profit, he was also one of the best pure ROI deals in the dataset: around <strong>2,464%</strong>.</p><p>I love this one.</p><div><hr></div><h1><em><strong>4 &#8212; The Worst Transfer Flips</strong></em></h1><p>Now for the other side of the game.</p><p>Not every flip works.</p><p>Sometimes clubs buy young players, fail to develop them, and sell at a loss. Sometimes the player does not adapt. Sometimes the market changes. Sometimes the original fee was simply too high.</p><p>If we rank the worst flips overall, many of the deals involve long holding periods of five seasons or more. That matters, because age starts to become a major factor. A player bought at 24 and sold six years later is no longer the same kind of resale asset. And that&#8217;s why I won&#8217;t comment on the fact that we have 14 Premier league teams in the top 20 on the wrong side of the deal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wOmJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wOmJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 424w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 848w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 1272w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wOmJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png" width="1456" height="1314" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1314,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:556634,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.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_!wOmJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 424w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 848w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.png 1272w, https://substackcdn.com/image/fetch/$s_!wOmJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cc7a60d-18a3-4da7-8fb4-1dcd737dad22_2312x2086.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>So the more interesting list is narrower:</p><blockquote><p><em><strong>Which clubs lost the most money after just one season?</strong></em></p></blockquote><p>That is the brutal version of the transfer flip. Buy high. Sell low. Quickly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y4Fs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y4Fs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 424w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 848w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 1272w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y4Fs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png" width="1456" height="1334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1334,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:574647,&quot;alt&quot;:&quot;&quot;,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!y4Fs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 424w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 848w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.png 1272w, https://substackcdn.com/image/fetch/$s_!y4Fs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef5afd9d-bce7-4477-ba95-b43b40bd6cec_2312x2118.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>At the top is <em><strong>Shoya Nakajima</strong></em>, whose move generated a major one-season loss.</p><p>I&#8217;ll be honest: I had to look this one up.</p><p>The specifics are a bit unusual, but the numbers are clear: a loss of around <strong>&#8364;28.8m</strong> after a single season.</p><p>Porto got a good deal though. The Qatari club? Not so much. Although, to be fair, they are probably not losing sleep over the balance sheet.</p><p>At #3 comes <em><strong>Jo&#227;o F&#233;lix</strong></em>, whose move from Chelsea to Al-Nassr generated a loss of around <strong>&#8364;23.1m</strong> for the Blues. He never delivered on his potential, did he.</p><p>This is another reminder that not all &#8220;young upside&#8221; bets are equal. Sometimes the market gives you a second exit. Sometimes it does not. And sometimes the only way out is to take the loss and move on.</p><p>At #5 comes <strong>Christian Benteke</strong>, who moved from Liverpool to Crystal Palace after generating a loss of <strong>&#8364;19.8m</strong> for the Merseyside club.</p><p>In hindsight, maybe <s>Brendan Rodgers</s> someone should have listened a little more closely to Ian Graham (Liverpool&#8217;s Director of Research and author of this brilliant <a href="https://www.amazon.co.uk/How-Win-Premier-League-Revolution/dp/152993463X">book</a>) when he warned that Benteke did not completely fit the team&#8217;s system.</p><p>But hindsight is a beautiful, annoying thing.</p><p>When we look at <em><strong>two-season</strong></em> holds, Premier League clubs dominate again. For the wrong reasons of course.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rmTE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rmTE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 424w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 848w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 1272w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rmTE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png" width="1456" height="1394" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1394,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:576514,&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.transferscience.com/i/199602579?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.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_!rmTE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 424w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 848w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.png 1272w, https://substackcdn.com/image/fetch/$s_!rmTE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9335cdbc-20fe-4732-8afa-639e6cc2e6ee_2312x2214.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>Here we find names such as:</p><ul><li><p><strong>Timo Werner</strong>, a loss of around <strong>&#8364;42.9m</strong> for Chelsea;</p></li><li><p><strong>Nikola Vla&#353;i&#263;</strong>, a loss of around <strong>&#8364;24.8m</strong> for West Ham;</p></li><li><p><strong>Memphis Depay and Romelu Lukaku</strong>, total loss of around <strong>&#8364;43m</strong> for Manchester United.</p></li></ul><p>If we want to be generous, there is one positive interpretation.</p><p>At least Premier League clubs tend to move quickly when something does not work.</p><p>They buy expensively, realise the fit is wrong, take the loss, and save on the wages.</p><p>Not exactly beautiful transfer strategy.</p><p>But sometimes cutting your losses is better than pretending the spreadsheet is fine.</p><div><hr></div><h1><em>My personal take-aways</em></h1><p><em><strong>First</strong></em>, transfer flips are more common than one might think. But the typical flip is not an &#8364;80m+ hyped-young-superstar jackpot. Most flips are much smaller, with the median profit sitting around half a million.</p><p><em><strong>Second</strong></em>, at the very top of the market, the numbers become absurd. We are talking &#8364;80m+ profits or 2,000%+ returns on investment often in a single season. I mean, come on. To borrow the kind of phrase ChatGPT would definitely overuse: this is not normal transfer business. This is financial alchemy.</p><p><em><strong>Third</strong></em>, the biggest profits often come from giving young players the platform and playing time to become seen (thank you captain Obvious). Everyone says clubs should pave the way for youngsters. Sure, they may not win you games straight away &#8212; unless their name is Erling Haaland &#8212; but they can give you the option to write very large cheques when the time comes.</p><p>Dortmund, Brighton, Ajax (and others) all showed different versions of the same idea:</p><p><strong>Buy uncertainty. Develop it. Sell (perceived) certainty.</strong></p><p><em><strong>Fourth</strong></em>, timing matters. The best flips are not just about identifying talent. They are also about knowing when to sell. Wait too long, and the market cools. Sell too early, and you leave money on the table. </p><p>The sweet spot is when the player&#8217;s story is obvious enough for richer clubs to believe it, but early enough that they can still imagine another level of upside &#8212; or, at the very least, another resale if things do not work out. Which, as we saw, happens more often than your sporting director would care to admit.</p><p>But one should not forget that the same logic that creates <em><strong>Bellingham</strong></em> also creates <em><strong>Antony</strong></em>.</p><p>The same belief in upside that creates <em><strong>Virgil van Dijk</strong></em> also creates <em><strong>Harry Maguire</strong></em>.</p><p>That is the subtle art of the transfer flip.</p><p><s>Prost auf die</s> Cheers to those who master it.</p><p>Next week, we&#8217;ll dive deeper into the clubs that do.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to not miss it</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Thank you for reading until the end.</p><p>See you next week.</p><p>Cheers,<br><em><strong>Martin</strong></em></p><p><em>P.S. What is your favorite transfer flip/flop? Drop your thoughts below &#8212; I read them all &#10084;&#65039;</em></p>]]></content:encoded></item><item><title><![CDATA[Premier League Clubs Pay the Transfer Tax. Here’s the Bill]]></title><description><![CDATA[What 21 years of transfer deals reveal about the premiums paid across world football]]></description><link>https://www.transferscience.com/p/premier-league-clubs-overpay-for</link><guid isPermaLink="false">https://www.transferscience.com/p/premier-league-clubs-overpay-for</guid><pubDate>Thu, 28 May 2026 08:29:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0d33b33d-f871-4bef-b0db-34597f2fe71e_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em><strong>Transfer Science #001</strong>, </em>the newsletter that brings a calculator to a pub debate and somehow still gets invited back.</p><p>Everyone says Premier League clubs overpay for transfers. </p><p>But by how much, exactly?</p><p>Using 21 seasons of transfer data, you&#8217;ll learn:</p><ul><li><p>how much Premier League clubs pay above market value when buying players;</p></li><li><p>which other leagues overpay the most in the transfer market; and</p></li><li><p>and which leagues extract the strongest premiums when selling.</p></li></ul><div><hr></div><h4><em>Before we begin</em></h4><p>For the purposes of this article, we&#8217;ll use <a href="https://www.transfermarkt.com/">Transfermarkt</a> player market values as a reference point for what a player was worth at the time of the transfer.</p><p>Are these market values perfect? Of course not.</p><p>But they are, at the very least, a somewhat consistent public benchmark that has existed for many years&#8212;and one that fans love to debate. If you&#8217;d like to understand how those values are built, you can read more about their methodology <a href="https://www.transfermarkt.co.in/transfermarkt-market-value-explained-how-is-it-determined-/view/news/385100">here</a>.</p><h3><em>Okay, Martin, so What Are We Actually Doing Today?</em></h3><p>We&#8217;ll examine whether the clubs from a given league tend to <strong>overpay or underpay</strong> for a player relative to his perceived market value (paid transfers only).</p><p>This is <em><strong>not</strong></em> a judgment of whether the transfer was successful. </p><ul><li><p>A club can easily overpay for a player and make a brilliant signing. </p></li><li><p>A club can also buy well below market value and fail badly. </p></li></ul><p>So the question we&#8217;ll examine is simply: <em><strong>At the moment the deal happened, did the buying club pay more or less than the player&#8217;s market value? </strong></em>Nothing more, nothing less.</p><p>To answer it, we&#8217;ll analyse 21 seasons of transfers data spanning the 2005/06 - 2025/26 seasons.</p><p>Let&#8217;s go!</p><div><hr></div><h1><em><strong>1 &#8212; How Closely Do Market Values and Transfer Fees Match?</strong></em></h1><p>Before zooming in on the different leagues, it helps to understand the broader market.</p><p>Since the 2005/06 season, there have been 19,682 transfers involving a non-zero fee in the world&#8217;s 10 strongest football leagues (as per Opta&#8217;s <a href="https://theanalyst.com/articles/strongest-football-leagues-in-the-world-opta-power-rankings">ranking</a> : Premier league (ENG), Bundesliga (GER), La Liga (ESP), Serie A (ITA), Ligue 1 (FRA), Jupiler Pro League (BEL), Primeira Liga (POR), Liga Profesional (ARG), Championship (ENG), Serie A (BRA).</p><p><em><strong>Based on those transfers, transfer fees have tracked players&#8217; perceived market values remarkably closely.</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Z_o!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Z_o!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 424w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 848w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Z_o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png" width="1456" height="1112" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1112,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:369722,&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://transferscience.substack.com/i/195540367?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.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_!3Z_o!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 424w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 848w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.png 1272w, https://substackcdn.com/image/fetch/$s_!3Z_o!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd579ac2-dc46-4c53-950a-d7981db3893a_1598x1220.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>As shown in the figure, teams tend to overpay only slightly. The simplest linear model across those<strong> transfers</strong> suggests that a <strong>&#8364;1 of market value is associated with &#8364;1.01 in transfer fees on average.</strong></p><p>Another way to frame it:</p><blockquote><p><em><strong>Historically, clubs have paid an average premium of around 1% relative to players&#8217; perceived market values.</strong></em></p></blockquote><p>Now, the <em><strong>calculation</strong></em> of market value in is a complex (and exciting) subject in itself, but not the focus of this piece. </p><p>Even without diving too deeply into valuation theory, some patterns should not surprise us. Richer leagues can pay premium prices because they have greater financial strength. Clubs also often pay above perceived market value for young, high-upside players because they are not just buying current ability; they are buying future resale value too.</p><p>These effects have been quantified in this industry-leading CIES Football Observatory <a href="https://www.mdpi.com/2227-7072/12/3/93">paper</a>.</p><p>My point is this: before we interpret league-level premiums too literally, we need to keep one thing in mind.</p><blockquote><p>A premium is not always &#8220;bad negotiating.&#8221;</p></blockquote><p>Sometimes it reflects player profile and market context &#8212; things we are not fully unpacking here.</p><p>Great. Now let&#8217;s finally quantify how much more the Premier League pays compared with the other nine leagues.</p><div><hr></div><h1><em><strong>2 &#8212; The Premier League Spending Premium</strong></em></h1><p>The chart below shows each league&#8217;s <strong>3-season rolling median transfer overpay</strong> for incoming transfers.</p><p>That may sound technical, but the logic is simple &#8212; for each league, we compare the fees paid for new <em><strong>arrivals</strong></em> with those players&#8217; market values at the time of the transfer. We then calculate the <strong>fee-to-value ratio</strong> and take the median across transfers in the league. Finally, we smooth the results over three seasons to highlight longer-term trends rather than one-season spikes. Or in plain English:</p><blockquote><p><em>The chart shows whether clubs in each league tend to pay above (&gt;0%) or below (&lt;0%) market value for incoming players, and how that pattern has evolved over time.</em></p></blockquote><p>The black line shows the overall trend across the top 10 leagues, while the red line shows the Premier League.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TTBO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TTBO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 424w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 848w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 1272w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TTBO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png" width="1456" height="925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:925,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:419573,&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.transferscience.com/i/195540367?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.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_!TTBO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 424w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 848w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.png 1272w, https://substackcdn.com/image/fetch/$s_!TTBO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0edd657b-c88a-4545-a8e9-3879451fd16a_1880x1194.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>So what do we see?</p><p>As of the 2025/26 season, the overall market trend in the top 10 leagues sits around <strong>1%</strong>. In other words, clubs across these leagues have recently completed transfers at fees roughly just above <strong>the players&#8217; perceived market values</strong>.</p><p>The Premier League clubs?</p><p>They sit closer to <strong>+30%</strong>.</p><p>That means:</p><blockquote><p><em><strong>Premier League clubs tend to pay around 30% above players&#8217; market values, while the wider market has paid at benchmark on average.</strong></em></p></blockquote><p>That is a huge, though hardly surprising, gap.</p><p>We have all heard the argument that England&#8217;s television revenue helps drive transfer inflation across world football. (A great topic for a future newsletter, isn&#8217;t it?)</p><p>The broader conclusion from this descriptive analysis is clear:</p><blockquote><p><em><strong>The Premier League consistently pays the biggest premium in world football.</strong></em></p></blockquote><p>If you&#8217;re wondering which league comes closest&#8212;and occasionally even exceeds it (notably between 2017/18 and 2023/24, which is not exactly a title you want to win)&#8212;it is the <em>only other</em> English league in our top-10 sample: <em><strong>the EFL Championship</strong></em>. The well-known English player premium is one likely explanation, isn&#8217;t it.</p><p>And just for completeness&#8217; sake, here is a table showing that same ranking as of the 2023/24 - 2025/26 period.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/bYy7Z/4/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67449d87-81a4-4832-beae-965dacc12a18_1220x716.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f5c783e-5707-413e-ba8b-bb8032325dba_1220x906.png&quot;,&quot;height&quot;:449,&quot;title&quot;:&quot;Transfer Fee to Market Value Buying Premium&quot;,&quot;description&quot;:&quot;2023/24 - 2025/26&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/bYy7Z/4/" width="730" height="449" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>Okay, so what about the other leagues?</p><p>The picture becomes just as interesting once we move beyond England.</p><p>Ligue 1 clubs sit third in our ranking, paying an average <strong>10.2% premium</strong> on incoming transfers. Serie A follows with a more modest <strong>+4.0% premium</strong>, suggesting Italian clubs tend to pay slightly above benchmark value, but nowhere near Premier League levels.</p><p>The most surprising result may be LaLiga. Spanish clubs record a <strong>-20.3% buying premium</strong>, which means they have recently completed transfers at fees roughly <strong>20% below players&#8217; perceived market values</strong>. That is a remarkable number for one of Europe&#8217;s elite leagues. It likely reflects a combination of tighter financial constraints, stronger negotiating discipline, and a greater willingness to wait for value rather than chase inflated deals.</p><p>The same broad pattern appears in Belgian Pro League (-13.9%) and Primeira Liga (-10%). Neither result is especially surprising. Both leagues have long reputations as talent development markets, stepping-stone leagues and strong sellers into richer competitions. We knew they identify talent earlier, but now we can quantify their edge at the negotiation table.</p><p>Those were the arrivals. What about the departures?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">You haven&#8217;t subscribed yet?</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h1><em><strong>3 &#8212; The Selling Premium</strong></em></h1><p>Buying is only half the story. If the first chart measured how leagues <em><strong>buy</strong></em>, this second one looks at how leagues <em><strong>sell</strong></em>.</p><p>The logic is the same: we compare outgoing transfer fees with players&#8217; market values at the time of the move; we calculate the fee-to-value ratio and we smooth the median results over three seasons to reveal the broader trend.</p><p>And here&#8217;s what the data show.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5adv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5adv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 424w, https://substackcdn.com/image/fetch/$s_!5adv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 848w, https://substackcdn.com/image/fetch/$s_!5adv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 1272w, https://substackcdn.com/image/fetch/$s_!5adv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5adv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png" width="1456" height="919" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:919,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:373207,&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.transferscience.com/i/195540367?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.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_!5adv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 424w, https://substackcdn.com/image/fetch/$s_!5adv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 848w, https://substackcdn.com/image/fetch/$s_!5adv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.png 1272w, https://substackcdn.com/image/fetch/$s_!5adv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05e6afa5-b893-41bc-a902-808a03fee3d2_1888x1192.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>This time, the picture is far less extreme for the Premier league. As of the 2025/26 season, Premier League clubs sit around <strong>+6%, </strong>while<strong> </strong>the overall market trend sits around <strong>-8%.</strong></p><p>So yes, Premier League clubs still tend to sell slightly above benchmark value, but compared with the +30% premium they pay when buying, the selling edge is modest. Premier League clubs dominate football&#8217;s buying market, but they do <strong>not</strong> dominate football&#8217;s selling market to the same degree. </p><p>Having said that, the two English leagues are the only ones with a positive sale premium.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/jISbM/3/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d937cc86-852b-46c5-8339-96c0b6a04323_1220x716.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f43136b0-a154-4d76-9be2-c0841f853168_1220x906.png&quot;,&quot;height&quot;:449,&quot;title&quot;:&quot;Transfer Fee to Market Value Selling Premium&nbsp;&quot;,&quot;description&quot;:&quot;2023/24 - 2025/26&quot;}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/jISbM/3/" width="730" height="449" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>The most surprising result is the Bundesliga.</p><p>German clubs sold players for fees <strong>22.1% below their perceived market values</strong> over the 2023/24 to 2025/26 period&#8212;the lowest figure in our sample. That is kind of unexpected for a league widely respected for strong recruitment, player development, and smart sporting management.</p><p>Second from bottom sits the Belgian Pro League at <strong>-14.3%</strong>, followed closely by LaLiga at <strong>-13.1%</strong>. That said, while these leagues rank near the bottom of our 10-league sample, the gaps are not as dramatic as they may first appear. The overall average sits around <strong>-8%</strong>, meaning most leagues outside England are clustered within a relatively narrow band below benchmark value.</p><p>So rather than suggesting these leagues are &#8220;bad sellers,&#8221; the table may instead reflect different market realities: fewer cash-rich domestic buyers, greater urgency to sell or less leverage in negotiations than English clubs enjoy.</p><p>In simple terms:</p><blockquote><p><em><strong>English clubs often sell from a position of strength. Many other leagues sell from a position of necessity.</strong></em></p></blockquote><p>That distinction may explain more than the raw percentages themselves.</p><div><hr></div><p>Boom &#8212; that&#8217;s it for the first edition of <em><strong>Transfer Science</strong></em>.</p><p>You now have a number for the next time someone says Premier League clubs overpay.</p><p>They do.</p><p>Recently, by about <strong>+30% on incoming transfers</strong>.</p><p>Thank you for reading until the end.</p><p>See you next week.</p><p>Cheers,<br><em><strong>Martin</strong></em></p><div><hr></div><p><em>PS. Would you like to see league-specific analysis showing which teams drive these premiums up (and down)? Drop your suggestions below. I read them all &#10084;&#65039;</em></p>]]></content:encoded></item><item><title><![CDATA[The Future of the Python Football Review]]></title><description><![CDATA[Hi friends,]]></description><link>https://www.transferscience.com/p/the-future-of-the-python-football</link><guid isPermaLink="false">https://www.transferscience.com/p/the-future-of-the-python-football</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Wed, 08 Apr 2026 11:03:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vrnm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friends,</p><p>Here&#8217;s a quick update on what&#8217;s been happening behind the scenes and where this newsletter is heading.</p><p>For the past five months, I&#8217;ve been reading and working on valuation models for football transfers. What was initially planned as a simple newsletter edition has grown into something much deeper than expected.</p><p>Going forward, the newsletter will move away from the &#8220;teaching Python&#8221; format and toward market-focused analysis. Think Swiss Ramble, but for player valuations, salaries, and performance. This includes:</p><ul><li><p>Player transfer and wage evaluations (obviously)</p></li><li><p>Assessing how well teams perform in the transfer market&#8212;and how players perform at the negotiation table</p></li><li><p>Transfer window reviews</p></li><li><p>Case studies (e.g. what Kevin De Bruyne&#8217;s data scientists might have said to Man City during negotiations for his &#8364;80 million contract extension in 2021)</p></li></ul><p>The previous articles won&#8217;t disappear&#8212;only the name of the newsletter and my handle will change.</p><p>So the <em><strong>Python Football Review</strong> </em>is evolving into <em><strong>Transfer Science</strong></em> (hopefully I won&#8217;t change the name again before the first new post is out).</p><p>If this isn&#8217;t something you&#8217;re interested in, please feel free to unsubscribe.</p><p>If it is, I&#8217;m glad to have you here.</p><p>Also&#8212;if there&#8217;s something within these topics you&#8217;d like to learn more about or read regularly, drop your ideas in the comments or just hit reply. I&#8217;d genuinely love your feedback.</p><p>Cheers,<br>Martin</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vrnm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vrnm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vrnm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68775,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/193561877?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vrnm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vrnm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F986ddc0b-a950-4abd-8d05-e75f4db51b0b_1280x720.jpeg 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>]]></content:encoded></item><item><title><![CDATA[How Good Really Was FiveThirtyEight’s Soccer Power Index?]]></title><description><![CDATA[A Seven-Season Reality Check Against Pinnacle&#8217;s Closing Odds]]></description><link>https://www.transferscience.com/p/how-good-really-was-fivethirtyeights</link><guid isPermaLink="false">https://www.transferscience.com/p/how-good-really-was-fivethirtyeights</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 11 Dec 2025 09:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yUV6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>FiveThirtyEight has always had a kind of mythic status in the football world. Their <a href="https://fivethirtyeight.com/methodology/how-our-club-soccer-predictions-work/">Soccer Power Index</a> (SPI) was one of the first &#8220;super-model&#8221; rating systems I stumbled upon when I began my own analytics journey. And for years &#8212; before it was shut down &#8212; SPI became a reference point for pre-game probabilities and end-of-season title chances across football Twitter.</p><p>Last week, I came across a historical dataset that included SPI&#8217;s match-by-match outcome probabilities. Naturally, the first question that came to my mind was:</p><p><em><strong>&#8220;If someone blindly trusted SPI for years&#8230; would they have made money?&#8221;</strong></em></p><p>And that curiosity brings us to today&#8217;s issue.</p><p>Welcome to<em> <strong>The Python Football Review #019</strong>.</em></p><p>In this edition, we&#8217;ll explore how much one would have won (or lost) over seven seasons by betting strictly according to SPI&#8217;s implied probabilities &#8212; and we&#8217;ll compare those numbers to <em>the sharpest odds in world football</em>: Pinnacle&#8217;s closing line.</p><p>As always, the Python notebook is included at the end so you can replicate everything yourself from scratch (and mock my results).</p><p>Let&#8217;s get into it.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v4wD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v4wD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 424w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 848w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v4wD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg" width="1456" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:105364,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!v4wD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 424w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 848w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!v4wD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff1d7d7fe-bee5-4219-9c10-d2a789a77b96_1690x655.jpeg 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><figcaption class="image-caption"><a href="https://fromthebyline.substack.com/p/fivethirtyeight-is-dead-long-live">FiveThirtyEight is Dead; Long Live Public Soccer Projection Models</a></figcaption></figure></div><div><hr></div><h1><em><strong>A Few Words About the Data</strong></em></h1><p>The historical SPI dataset &#8212; available on <a href="https://www.kaggle.com/datasets/thedevastator/club-soccer-predictions-spi-ratings-and-forecast">Kaggle</a> &#8212; includes <strong>40 leagues</strong> (male and female, national and international) covering the <strong>2016/17 to 2022/23</strong> seasons. For every match, we have SPI&#8217;s estimated probability of home win, draw and away win as illustrated below.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eXNA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eXNA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 424w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 848w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 1272w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eXNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png" width="800" height="208" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:208,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20488,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!eXNA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 424w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 848w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 1272w, https://substackcdn.com/image/fetch/$s_!eXNA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48ca9932-e781-4481-8878-e6d93f03ffd7_800x208.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>From these probabilities we&#8217;ll compute <em>fair odds</em> simply by taking the inverse. For example, SPI gave <strong>Bastia a 4.63% chance</strong> of beating PSG in the opening match of 2016/17. The corresponding odds according to FiveThirtyEight are therefore <strong>1 / 0.0463 = 21.6</strong> which means that if you bet 1&#8364; on that outcome, you would have won a total of 21.6&#8364; back (in case if a winning wager of course).</p><p>To analyse <em>profitability</em>, I then needed the market odds for each match. Based on <em>ease</em> of downloading, I downloaded the market odds for 18 of those 40 leagues (my newsletter, my rules), which is still a very healthy sample.</p><p>The odds data comes from <strong><a href="https://x.com/12Xpert">Joseph Buchdahl</a>&#8217;s </strong><a href="https://www.football-data.co.uk/downloadm.php">football-data.co.uk</a>, as usual. For market prices, we take <strong>Pinnacle closing odds</strong>, because: <em>If your system consistently beats Pinnacle&#8217;s closing price, you almost certainly have an edge.</em></p><p>After matching team names across the two datasets, we end up with <strong>36,335 matches</strong>. And here is what the final analysis table looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DPyZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DPyZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 424w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 848w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 1272w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DPyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png" width="1456" height="246" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:246,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85419,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.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_!DPyZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 424w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 848w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 1272w, https://substackcdn.com/image/fetch/$s_!DPyZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59cc97d1-a475-4571-8d53-31f85a76236e_1986x336.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><code>fair_home</code>, <code>fair_draw</code>, <code>fair_away</code> &#8594; from SPI</p></li><li><p><code>home_odds</code>, <code>draw_odds</code>, <code>away_odds</code> &#8594; Pinnacle closing odds</p></li></ul><p>Here&#8217;s the overall coverage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wv7j!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wv7j!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 424w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 848w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 1272w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wv7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png" width="603" height="577.875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1012,&quot;width&quot;:1056,&quot;resizeWidth&quot;:603,&quot;bytes&quot;:153423,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.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_!wv7j!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 424w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 848w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.png 1272w, https://substackcdn.com/image/fetch/$s_!wv7j!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdcc62606-97fb-496f-a24d-36d9ef214ceb_1056x1012.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><h1><em><strong>The Betting Simulation</strong></em></h1><p>For each match, we look for <strong>value</strong>. A value bet exists when <em><strong>Market odds &gt; Fair odds.</strong></em></p><p>Simple example: In Bastia vs PSG, SPI assigns PSG fair odds of <strong>1.19</strong>, while Pinnacle offers <strong>1.34</strong>. That&#8217;s a <strong>12.6% value edge ((1.34/1.19) -1)</strong>, which means &#8212; in theory &#8212; we&#8217;d place a bet on PSG. To avoid over-exposure, we place <strong>only one bet per match</strong>, even if multiple outcomes show theoretical value. For each bet we will place a single unit wager.</p><p>So to recap: we&#8217;re about to test <strong>36,335 matches</strong> across <strong>7 seasons</strong> and <strong>18 leagues</strong>. We&#8217;ll compare SPI&#8217;s fair odds to Pinnacle&#8217;s closing odds and look for value. Whenever value appears, we place a <strong>single 1-unit bet</strong> on the outcome with the <strong>highest positive edge</strong>.</p><p>And the question is: <em><strong>What would the profitability look like? Would SPI beat the market? Or would it behave like a very polite random walk?</strong></em></p><p>Let&#8217;s find out.</p><div><hr></div><h1><em><strong>Simulation Results</strong></em></h1><p>Over the full period, the model would have generated <strong>33,929 bets</strong>, each taken when the SPI-implied probability appeared higher than Pinnacle&#8217;s market probability.<br>Across these bets, the <strong>average perceived value was around +18.2% </strong>(that&#8217;s a lot), and the system achieved a <strong>31% win rate</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WBcM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WBcM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 424w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 848w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 1272w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WBcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png" width="824" height="162" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:162,&quot;width&quot;:824,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24156,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.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_!WBcM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 424w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 848w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 1272w, https://substackcdn.com/image/fetch/$s_!WBcM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3694b787-b414-442c-ad7b-37ec7651f34a_824x162.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>However, despite the perceived positive expected value, the long-term outcome was a <strong>net loss of about 2,114 points</strong>, corresponding to a <em><strong>&#8211;6.2% rate of return</strong></em>. In practical terms:</p><blockquote><p><em><strong>For every &#8364;100 placed, you&#8217;d expect to lose about &#8364;6.</strong></em></p></blockquote><p>Can the results be improved? Of course. There are dozens of <s>data mining</s> filtering techniques we could explore, such as:</p><ul><li><p>restricting to lower odds (more likely events)</p></li><li><p>betting only when value exceeds certain thresholds &#8212; or avoiding extreme value outliers (model/market mistakes)</p></li><li><p>focusing on home-only strategies (or excluding draws)</p></li><li><p>applying Kelly-criterion staking</p></li></ul><p>These could change the curve and potentially improve performance.</p><p>But the <em>general conclusion</em> is :</p><blockquote><p><em><strong>A na&#239;ve, blind strategy that follows SPI as a pricing model would lose money against Pinnacle.</strong></em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yUV6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yUV6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 424w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 848w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 1272w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yUV6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png" width="889" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/deab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:889,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33631,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.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_!yUV6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 424w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 848w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.png 1272w, https://substackcdn.com/image/fetch/$s_!yUV6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeab0caa-6ae4-4c2c-bfb1-95630641c821_889x540.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><h2><em><strong>Is this surprising? Not really.</strong></em></h2><p>No one ever claimed SPI was designed for betting. And importantly, we used Pinnacle <em><strong>closing </strong></em>odds, widely considered the sharpest lines in the world.</p><p>And SPI&#8212;at its core&#8212;is:</p><ul><li><p>a <em><strong>static</strong></em> <em><strong>pre-game</strong></em> index</p></li><li><p>ignoring late team news &amp; therefore blind to injuries, squad rotation, fatigue, travel, and line-up announcements</p></li><li><p>accessible to everyone well in advance.</p></li></ul><p>Meanwhile, Pinnacle&#8217;s <em><strong>closing </strong></em>line:</p><ul><li><p>reflects the aggregated knowledge of the sharpest bettors</p></li><li><p><em><strong>adjusts dynamically</strong></em> until the final seconds before kickoff</p></li><li><p>incorporates global betting pressure</p></li><li><p>reacts instantly to breaking news</p></li></ul><p>So would it be surprising if a <strong>static</strong>, pre-game, publicly available rating system consistently beat the closing line of the sharpest bookmaker in the world?</p><blockquote><p><em><strong>No &#8212; exatly the opposite would be suprising.</strong></em></p></blockquote><p>Having said that, here&#8217;s how SPI&#8217;s predicted probabilities fared against the actual results. In the chart below, we compare <strong>SPI&#8217;s probabilities</strong> to those implied by <strong>Pinnacle&#8217;s closing odds</strong>, and we check how well each aligns with reality. </p><p>A perfectly calibrated model would sit right on the dashed 45&#176; line &#8212; meaning that events predicted at 30% really happen 30% of the time, 60% events happen 60% of the time, and so on.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zZ_R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zZ_R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 424w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 848w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 1272w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zZ_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png" width="619" height="427.38994974874373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc404b5e-100a-47db-bac5-f901035e30ff_995x687.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:687,&quot;width&quot;:995,&quot;resizeWidth&quot;:619,&quot;bytes&quot;:60699,&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.pythonfootball.com/i/181040224?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.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_!zZ_R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 424w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 848w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.png 1272w, https://substackcdn.com/image/fetch/$s_!zZ_R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc404b5e-100a-47db-bac5-f901035e30ff_995x687.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><strong>Pinnacle (blue)</strong> is (for the most part) almost glued to that line. This is exactly what you&#8217;d expect from the sharpest bookmaker in the world. Their odds, once binned at 2.5% intervals, map extremely closely to actual match outcomes. When Pinnacle says something is 70% likely, it really <em>is</em> about 70% likely.</p><p><strong>SPI (orange)</strong>, however, shows consistent patterns of miscalibration:</p><ul><li><p><strong>At low probabilities</strong>, SPI <em>underestimates</em> the probabilities&#8212; for example events it predicted at 5% happened around 9% of the time.</p></li><li><p><strong>Across most of the range (10&#8211;90%)</strong>, SPI systematically <em>overestimates</em> true frequencies &#8212; for example, matches it rated at 50% actually occurred only 41% of the time.</p></li><li><p><strong>At high probabilities (90&#8211;100%)</strong>, SPI becomes too conservative again, assigning lower win chances than what actually happened on the pitch.</p></li></ul><p>In simple terms: <em><strong>SPI gets the direction right, but the confidence wrong.</strong></em></p><p>It knows which team is stronger, but it consistently misjudges <em>by how much</em>. And this miscalibration is exactly why betting strictly on SPI&#8217;s probabilities &#8212; without adjustments &#8212; fails to beat Pinnacle. Pinnacle isn&#8217;t just predicting winners; it&#8217;s capturing the <em>true likelihood</em> with remarkable precision.</p><div><hr></div><h2><em><strong>A broader reminder</strong></em></h2><p>This little experiment highlights an important point: even well-constructed &#8220;super-computer&#8221; models have limits. FiveThirtyEight&#8217;s SPI was analytically strong, but that doesn&#8217;t automatically translate into beating the sharpest sports betting markets on a match-by-match basis &#8212; and it was never designed to.</p><p>End-of-season simulations, title probabilities, and playoff chances were always where SPI shined. These tools are incredibly valuable for understanding long-term dynamics, but they are still just simulations. They don&#8217;t replace real-time information, market pressure, or closing-line pricing.</p><p>And to be clear: SPI <em>was</em> useful &#8212; very much so.<br>It consistently captured <strong>directional team strength</strong>, meaning it generally understood who the stronger and weaker sides were based on recent performance. It was also <strong>transparent</strong> in how it was built (combining xG and non-shot xG), which allowed you to adjust ratings yourself. If you felt a team was over- or under-performing those metrics you could mentally nudge the probabilities up or down.</p><p>So no, SPI couldn&#8217;t beat Pinnacle&#8217;s game-by-game closing odds. But that&#8217;s an unrealistic benchmark for any static pre-game public model.</p><p>What SPI <em>did</em> provide was a solid, interpretable foundation &#8212; a starting point for reasoning about team quality, season trajectories, and long-term probabilities. And for most fans, analysts, and hobbyist forecasters, that is already incredibly powerful.</p><div><hr></div><p>Boom &#8212; that was FiveThirtyEight vs Pinncle.</p><p>This was a fun exercise, even if I&#8217;m a little disappointed the curve ends well below zero. I honestly expected something slightly closer to breakeven. </p><p>But maybe that&#8217;s the next step &#8212; building a more refined, bottom-up forecasting model that incorporates last-minute news and seeing whether that can close the gap.</p><p>If you want to reproduce the results yourself, the code is available below.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/PythonFootball/PythonFootballReview/tree/main/pfr_019&quot;,&quot;text&quot;:&quot;Download Python Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/PythonFootball/PythonFootballReview/tree/main/pfr_019"><span>Download Python Code</span></a></p><div><hr></div><p>Thanks for reading all the way to the end.</p><p>See you next week,<br><strong>Martin</strong></p>]]></content:encoded></item><item><title><![CDATA[The Death of the Long-Range Screamer]]></title><description><![CDATA[A myth or reality?]]></description><link>https://www.transferscience.com/p/the-death-of-the-long-range-screamer</link><guid isPermaLink="false">https://www.transferscience.com/p/the-death-of-the-long-range-screamer</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 04 Dec 2025 14:09:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uIL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ever since the xG revolution took place, everyone loves saying that <em>xG killed long-range screamers</em>. Well &#8230; that sounds like the perfect topic for this little newsletter. </p><p>Welcome to <em>The Python Football Review #018.</em></p><p>In this issue, you&#8217;ll learn:</p><ul><li><p>how much the average shot distance has dropped over the last 11 seasons</p></li><li><p>whether this shift actually affected conversion rates</p></li><li><p>and whether the &#8220;death of the screamer&#8221; is a myth or a real trend</p></li></ul><p>As always, the full code is available at the end so you can reproduce the analysis from scratch, check the numbers, and mock my conclusions if you want.</p><p>Let&#8217;s get into it.</p><div><hr></div><h2><em>A few words on the data</em></h2><p>For this study, we&#8217;ll use <strong>11 seasons of data (2014/15 to 2024/25)</strong> from Europe&#8217;s top five leagues, courtesy of <strong>Understat</strong> (via <code>soccerdata</code>). The dataset includes roughly <strong>half a million shots</strong>. We focus solely on <strong>open-play shots</strong>.</p><p>The data is already clean. We just need to add three features:</p><ol><li><p><strong>shot distance in meters</strong>, calculated from the pitch coordinates of each shot</p></li><li><p>a <strong>dummy variable (1/0) for shots outside the box</strong></p></li><li><p>a <strong>dummy variable for shots taken from 25+ meters</strong> (our definition of a long-range shot)</p></li></ol><div><hr></div><h1><em><strong>1 &#8212; How did shot volume evolve?</strong></em></h1><p>Across Europe&#8217;s top five leagues, the average number of open-play shots per match has been remarkably stable. In 2014/15 we recorded <strong>16.6 shots per match</strong>, and in 2024/25&#8230; also <strong>16.6</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_!DnyJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DnyJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 424w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 848w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DnyJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:566711,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!DnyJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 424w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 848w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!DnyJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f51b710-b1c7-4f92-b40f-f7db09eb6bd5_2418x1382.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>There&#8217;s some negligible year-to-year variance, but nothing that suggests a structural change. So no, teams are not shooting less overall.</p><p>What about the shots from outside the box? Now it gets interesting. Outside-the-box shots fell from <strong>8.6 to 6.9 per match</strong> &#8212; a <strong>20% decline</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_!8Pmp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Pmp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 424w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 848w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 1272w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Pmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png" width="1456" height="828" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:828,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:566703,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8Pmp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 424w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 848w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.png 1272w, https://substackcdn.com/image/fetch/$s_!8Pmp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79566c53-55d0-426f-a970-ffd78dd7eb26_2394x1362.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 what about the shots from 25 meters or more (i.e. the &#8220;screamer zone&#8221;) ? These shots dropped from <strong>5.4 to 3.7 per match</strong> &#8212; a <strong>31% drop</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_!80_p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!80_p!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 424w, https://substackcdn.com/image/fetch/$s_!80_p!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 848w, https://substackcdn.com/image/fetch/$s_!80_p!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!80_p!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!80_p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:568342,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!80_p!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 424w, https://substackcdn.com/image/fetch/$s_!80_p!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 848w, https://substackcdn.com/image/fetch/$s_!80_p!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.png 1272w, https://substackcdn.com/image/fetch/$s_!80_p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5a3f6bc9-20da-4bbb-afd8-a3429830a9b7_2418x1390.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>This is the trend people usually talk about when they say &#8220;xG killed long-range shots,&#8221; and to be fair, the decline <em>is</em> real and observable across all leagues. </p><div><hr></div><h1><em><strong>2 &#8212; What about shot distance?</strong></em></h1><p>Across all open-play shots, the <strong>average shot distance</strong> dropped from <strong>20.8m to 19.1m</strong> &#8212; an <strong>8% decrease</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_!uIL6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uIL6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 424w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 848w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 1272w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uIL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png" width="1456" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:616779,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!uIL6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 424w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 848w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.png 1272w, https://substackcdn.com/image/fetch/$s_!uIL6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F401a6811-3e91-4438-b4ca-d8e632de4140_2430x1380.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>Outside-the-box shots distance dropped from <strong>27m to around 26m</strong> &#8212; roughly <strong>4% down</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_!1dTw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1dTw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 424w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 848w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1dTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png" width="1456" height="837" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:837,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:613242,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1dTw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 424w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 848w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.png 1272w, https://substackcdn.com/image/fetch/$s_!1dTw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8eda64f8-1260-402d-b59b-14298577fe9e_2404x1382.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>As for true long-range efforts (25m+), the average distance basically stayed the same. Don&#8217;t be misled by the upward-sloping line in the chart &#8212; yes, it&#8217;s increasing, but the Y-axis range is only 1.6 meters. Technically, between 2014/15 and 2024/25, the average distance rose by just <strong>0.8%</strong>, from <strong>29.93m to 30.17m</strong>. In other words, not significant.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1a7x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1a7x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 424w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 848w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 1272w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1a7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png" width="1456" height="825" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:825,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:720827,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!1a7x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 424w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 848w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.png 1272w, https://substackcdn.com/image/fetch/$s_!1a7x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6d1a732-7c8a-45a1-ace6-1bbb237f12a3_2420x1372.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>Taken together, this section paints a clear picture:</p><blockquote><p><em><strong>Teams take the same number of shots as before &#8212; but they take far fewer from long range. </strong></em></p></blockquote><p>Thank you, Captain Obvious. Now that we confirmed what everobody talked about, let&#8217;s get into the conversion rates.</p><div><hr></div><h1><em><strong>3 &#8212; Conversion rates</strong></em></h1><p>Now comes the fun part: Has this shift actually hurt long-range scoring?</p><p>Across all open-play shots, conversion increased from <strong>9.3% to 10.8%</strong> &#8212; a <strong>1.5 percentage point increase</strong>. Should not come as a surprise since shots are being taken from closer positions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!utjv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!utjv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 424w, https://substackcdn.com/image/fetch/$s_!utjv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 848w, https://substackcdn.com/image/fetch/$s_!utjv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 1272w, https://substackcdn.com/image/fetch/$s_!utjv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!utjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png" width="1456" height="844" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:844,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:674668,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!utjv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 424w, https://substackcdn.com/image/fetch/$s_!utjv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 848w, https://substackcdn.com/image/fetch/$s_!utjv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.png 1272w, https://substackcdn.com/image/fetch/$s_!utjv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F552f52f2-ac68-4e3e-a77d-6b67b5ea4948_2412x1398.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>Outside-the-box conversion rose from <strong>3.3% to 4.6%</strong> &#8212; up <strong>1.3 percentage points</strong>, which is meaningful at that low baseline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CtLK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CtLK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 424w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 848w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CtLK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png" width="1456" height="844" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:844,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:681592,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CtLK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 424w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 848w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.png 1272w, https://substackcdn.com/image/fetch/$s_!CtLK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27ff5a27-b89c-41d8-ae08-f7540b3ef536_2422x1404.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>As for the long-range shots, conversion increased from <strong>1.7% to 2.8%</strong> &#8212; a <strong>1.1 pp increase</strong>, the <strong>largest relative jump</strong> of all.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8ktD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8ktD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 424w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 848w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8ktD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png" width="1456" height="844" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:844,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:712284,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!8ktD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 424w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 848w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.png 1272w, https://substackcdn.com/image/fetch/$s_!8ktD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa936b23a-3dae-48ea-af11-7065a40c8a55_2406x1394.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>What appears to be happening is teams <em>keeping </em>the risky long shots out of the game.</p><p>Long-range shots are clearly on the decline. On average, you&#8217;ll only see <strong>1.7 true long-range attempts per match</strong> today. But when teams <em>do</em> shoot from distance, the chances of observing a goal as a spectator are <strong>65% higher than a decade ago</strong>.</p><p>Why? Because only the right players are allowed to try. The long-range &#8220;permission&#8221; has shifted from <em>everyone</em> to <em>only the players who can actually hit them</em>.</p><div><hr></div><h1><em><strong>So did xG kill the long-range screamers?</strong></em></h1><p>Yes, the average shot distance dropped. Yes, the volume of long-range shots dropped &#8212; dramatically. But the idea that screamers are &#8220;dead&#8221; is&#8230; incomplete.</p><p>If you care about <strong>volume</strong>, then yes, long-range shooting is fading.</p><p>If you care about <strong>expected reward</strong>, then screamers are alive and well &#8212; in fact, they&#8217;re converting at the highest rates we&#8217;ve seen in more than a decade.</p><p>Modern footballers haven&#8217;t stopped shooting from range &#8212; they&#8217;ve simply stopped shooting <strong>bad</strong> long-range shots.</p><p>So the next time your Granit Xhaka (or your Declan Rice, or your Enzo Fern&#225;ndez) winds up from 25 yards&#8230; well, the numbers say it&#8217;s a <em>better</em> shot today than it was back in 2014.</p><p>And before I leave you, here&#8217;s the scatter plot of every player who attempted at least 30 shots across the dataset. Dotted lines are the medians.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jstb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jstb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 424w, https://substackcdn.com/image/fetch/$s_!jstb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 848w, https://substackcdn.com/image/fetch/$s_!jstb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!jstb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jstb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png" width="1456" height="986" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:986,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:697281,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/180443025?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jstb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 424w, https://substackcdn.com/image/fetch/$s_!jstb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 848w, https://substackcdn.com/image/fetch/$s_!jstb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.png 1272w, https://substackcdn.com/image/fetch/$s_!jstb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F103642cf-9c2c-44d5-9f07-444a5525b5d7_2008x1360.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>There&#8217;s one dot sitting right above the <strong>9% conversion from 31 meters</strong>. That&#8217;s <strong>Xabi Alonso</strong> &#8212; as if you needed reminding of how outrageous he was from range.</p><div><hr></div><p>Boom &#8212; and that&#8217;s the story behind the supposed death of the long-range screamer.</p><p>If you&#8217;re interested in replicating all the figures from scratch, you can download the full code below.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/PythonFootball/PythonFootballReview/blob/main/PFR_018_long_range_shots.ipynb&quot;,&quot;text&quot;:&quot;Download the Python Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/PythonFootball/PythonFootballReview/blob/main/PFR_018_long_range_shots.ipynb"><span>Download the Python Code</span></a></p><p>As always, thank you for reading all the way to the end.</p><p>See you next week,</p><p><em>Martin</em></p>]]></content:encoded></item><item><title><![CDATA[Which xG Data Should You Trust?]]></title><description><![CDATA[Opta, StatsBomb, Wyscout and Understat &#8212; the head-to-head comparison nobody shows you.]]></description><link>https://www.transferscience.com/p/which-xg-data-should-you-trust</link><guid isPermaLink="false">https://www.transferscience.com/p/which-xg-data-should-you-trust</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 20 Nov 2025 09:01:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kJPR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>StatsBomb loves reminding us that <em><strong>&#8220;not all xG is created equal.&#8221;</strong></em></p><p>So I decided to put that to the test.</p><p>Welcome to <em><strong>The Python Football Review #017</strong></em> &#8212; an edition where we compare xG from four of the most widely used sources in football analytics: <strong>Opta, StatsBomb, Wyscout and Understat</strong>.</p><p>By the end of it, you&#8217;ll learn:</p><ul><li><p>How closely the four providers agree on the same matches</p></li><li><p>How quickly their xG trends converge as the season unfolds</p></li><li><p>Which models consistently diverge</p></li><li><p>And how different your league table would look depending on which xG provider you trust</p></li></ul><p>Let&#8217;s dive in.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kJPR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kJPR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kJPR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bcfec9a9-8091-46aa-b2f8-43adcd281527_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;:2534612,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_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_!kJPR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kJPR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbcfec9a9-8091-46aa-b2f8-43adcd281527_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><div><hr></div><h1>1 &#8212; The Data</h1><p>For this edition, we&#8217;re working with five full seasons of matches (2017/18 to 2021/22) across the Premier League, Bundesliga, Serie A, La Liga and Ligue 1. </p><p>For every game, the dataset includes the <em><strong>full-time xG scoreline</strong></em> from four sources: <a href="https://theanalyst.com/">Opta</a>, <a href="https://www.hudl.com/en_gb/products/statsbomb">StatsBomb</a>, <a href="https://www.hudl.com/en_gb/products/wyscout">Wyscout</a> and <a href="https://understat.com/">Understat</a>. Here&#8217;s a quick look at the structure of the dataset:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Utb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Utb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 424w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 848w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 1272w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Utb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png" width="1456" height="477" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:477,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157507,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.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_!2Utb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 424w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 848w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.png 1272w, https://substackcdn.com/image/fetch/$s_!2Utb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a49ac8f-00bd-41aa-b92e-b542fb85b4fa_1986x650.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><em>Two quick disclaimers before we go further: </em></p><ul><li><p><em>For obvious reasons, I can&#8217;t share the full dataset &#8212; which also makes sharing the Python code somewhat pointless, since you wouldn&#8217;t be able to reproduce the tables without the underlying data. (So no Python template for this edition.)</em></p></li><li><p><em>The four sources were extracted at different points in time: <strong>StatsBomb</strong> &#8594; May 2022, <strong>Wyscout</strong> &#8594; October 2022, <strong>Opta</strong> &#8594; May 2023, <strong>Understat</strong> &#8594; November 2025. I mention this because some providers occasionally retro-update past xG values (more on that in the end). If any discrepancies show up, timing could be part of the explanation.</em></p></li></ul><div><hr></div><h2><strong>How complete is the dataset?</strong></h2><p>Across the five leagues and five seasons, we&#8217;re very close to full coverage. A handful of matches are missing because <strong>at least one provider had no xG values</strong> for that game. The 2019/20 Ligue 1 season was interrupted due to Covid, hence the 279 games.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0GD8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0GD8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 424w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 848w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 1272w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0GD8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png" width="456" height="194.59872611464968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1b4835af-d1c8-4728-af39-31f970c34293_942x402.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:402,&quot;width&quot;:942,&quot;resizeWidth&quot;:456,&quot;bytes&quot;:55316,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0GD8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 424w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 848w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 1272w, https://substackcdn.com/image/fetch/$s_!0GD8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1b4835af-d1c8-4728-af39-31f970c34293_942x402.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Overall, it&#8217;s a very healthy sample.</p><div><hr></div><h2><strong>Basic descriptive statistics</strong></h2><p>Before diving deeper, let&#8217;s look at some classic descriptive stats &#8212; the mean, median, standard deviation and maximum xG values across all teams, all games and all providers.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UJu7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UJu7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 424w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 848w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 1272w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UJu7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png" width="308" height="160.93693693693695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:666,&quot;resizeWidth&quot;:308,&quot;bytes&quot;:42139,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!UJu7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 424w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 848w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 1272w, https://substackcdn.com/image/fetch/$s_!UJu7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49f37709-c18c-4a17-a1b2-38eef7350016_666x348.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>A few quick observations:</p><ul><li><p><strong>StatsBomb and Opta</strong> are similar across every summary metric.</p></li><li><p><strong>Understat</strong> runs slightly higher on average (mean team xG = 1.38) and just about the same median-wise (1.22).</p></li><li><p><strong>Wyscout</strong> is the most generous model in this sample &#8212; highest mean (1.44), highest variance and the highest maximum single-team xG per match.</p></li></ul><p>But this is just basic summary stuff. Let&#8217;s now look at the <strong>full distributions</strong>.</p><div><hr></div><h1>2 &#8212; Comparing xG distributions across providers</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!09bg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!09bg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 424w, https://substackcdn.com/image/fetch/$s_!09bg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 848w, https://substackcdn.com/image/fetch/$s_!09bg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 1272w, https://substackcdn.com/image/fetch/$s_!09bg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!09bg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png" width="1456" height="701" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:701,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:286107,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.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_!09bg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 424w, https://substackcdn.com/image/fetch/$s_!09bg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 848w, https://substackcdn.com/image/fetch/$s_!09bg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.png 1272w, https://substackcdn.com/image/fetch/$s_!09bg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffc1af10c-b630-4303-b948-7f1a21d029ec_1990x958.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><h3><strong>How to read this figure</strong></h3><p>This is a smoothed distribution (a <a href="https://mathisonian.github.io/kde/">KDE curve</a>) of all xG values assigned per team per match. It shows how often each xG level occurs across thousands of matches.</p><p>The <strong>x-axis</strong> is the xG a team had in a match (0 &#8594; 7). The <strong>y-axis</strong> is a relative frequency: higher peaks mean &#8220;this xG value happens more often.&#8221;</p><ul><li><p>Where the curves sit <em>higher</em>, that provider gives those xG values more frequently.</p></li><li><p>Where the curves tail off <em>more slowly</em>, that provider gives more high-xG games.</p></li></ul><p>The exact height doesn&#8217;t matter &#8212; it&#8217;s the <em><strong>shape </strong></em>and <em><strong>position </strong></em>of each curve relative to the others.</p><h2><strong>What we learn from it</strong></h2><ul><li><p><em><strong>Opta and StatsBomb are nearly identical.</strong></em> Their curves overlap almost perfectly, which tells us the two models likely behave very similarly on a match-by-match basis.</p></li><li><p><em>Understat</em> runs a bit higher at the very low end (below ~0.4 xG) and again at the higher end (above ~2.3 xG), while sitting slightly lower in the middle. A subtle but noticeable difference.</p></li><li><p><em>Wyscout</em> assigns the lowest xG values up to around 1.5, and then consistently shifts furthest to the right with the heaviest tail. In other words, <em><strong>Wyscout hands out higher xG more often and produces the most extreme single-match xG values</strong></em>.</p></li></ul><h2><strong>Match-level agreement between providers</strong></h2><p>To complement the distribution plots, here&#8217;s a simple correlation matrix comparing each provider&#8217;s <strong>match-level xG values</strong>. Each number is a Pearson correlation: <strong>1.00 means identical behaviour</strong>, lower values mean more disagreement.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d0OH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d0OH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 424w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 848w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 1272w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d0OH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png" width="494" height="330.1865284974093" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:774,&quot;width&quot;:1158,&quot;resizeWidth&quot;:494,&quot;bytes&quot;:152782,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!d0OH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 424w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 848w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.png 1272w, https://substackcdn.com/image/fetch/$s_!d0OH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96f4ab0e-ec21-4ae5-8b50-8b79418f4775_1158x774.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><h3>What this tells us:</h3><ul><li><p><strong>Opta &#215; Understat</strong> show the strongest alignment at match level (0.96).</p></li><li><p><strong>Opta &#215; StatsBomb</strong> and <strong>StatsBomb &#215; Understat</strong> are also very tight (&#8776;0.92&#8211;0.93).</p></li><li><p><strong>Wyscout is an outlier</strong> &#8212; its match-level xG correlates the least with everybody else (0.86&#8211;0.88 range).</p></li></ul><p>Here are a few scatterplot (with linear fits on top) before we zoom out ask a bigger question: <em><strong>How quickly do these (small?) differences disappear once we look at season-long trends instead of single matches?</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CkvV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CkvV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 424w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 848w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CkvV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png" width="1456" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:655836,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.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_!CkvV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 424w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 848w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.png 1272w, https://substackcdn.com/image/fetch/$s_!CkvV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed493864-9aeb-49db-bb3a-5290d0a12493_2384x1036.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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!V7pZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!V7pZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 424w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 848w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!V7pZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png" width="1456" height="622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:622,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:609404,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.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_!V7pZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 424w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 848w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.png 1272w, https://substackcdn.com/image/fetch/$s_!V7pZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faba6cd9f-7a48-4a7e-b1e3-93e1926c80a2_2384x1018.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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Iy9x!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Iy9x!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 424w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 848w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 1272w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Iy9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png" width="1456" height="626" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:626,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:669062,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.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_!Iy9x!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 424w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 848w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.png 1272w, https://substackcdn.com/image/fetch/$s_!Iy9x!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea70e349-cf1c-40f2-a2bc-f9152cc3adaa_2376x1022.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><h1>3 &#8212; How quickly do providers <em>agree</em> as the season unfolds?</h1><p>So far, we&#8217;ve looked at <em>individual</em> xG values. But single matches only get you so far.</p><p>To really understand how similar the providers are, we need to zoom out and look at what happens <strong>as the season progresses</strong>. Instead of comparing isolated xG values, we compare <strong>each team&#8217;s cumulative xG difference</strong> &#8212; the running total of <em>xG</em> <em>for</em> minus <em>xG against</em> &#8212; and check how closely the providers track each other over time.</p><p>In other words: <em><strong>As teams pile up more matches, how quickly do the providers&#8217; season-long xG trends start agreeing with one another?</strong></em></p><p>That&#8217;s exactly what the chart below shows.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lJ6K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lJ6K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 424w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 848w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 1272w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lJ6K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png" width="530" height="321.0576923076923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:882,&quot;width&quot;:1456,&quot;resizeWidth&quot;:530,&quot;bytes&quot;:309014,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!lJ6K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 424w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 848w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.png 1272w, https://substackcdn.com/image/fetch/$s_!lJ6K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72a8e060-4d5e-4b00-b113-48149800a279_1584x960.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><h3><strong>What you&#8217;re looking at</strong></h3><p>Each line shows (once more) the <strong>Pearson correlation</strong> (the one you first learned at school) between two providers&#8217; <strong>cumulative xG differences</strong> at each match week. A value of <strong>1.0</strong> means the two providers generate <em>identical</em> season-long curves. A value of <strong>0</strong> means the curves have nothing in common. Put simply: <strong>the higher the line, the stronger the agreement.</strong></p><h2><strong>What we learn from this</strong></h2><p>First, notice that <strong>all provider pairs start fairly high</strong> &#8212; even the least aligned pair begins around <strong>0.87</strong>, which is already strong. </p><p>But some pairs converge faster and more tightly than others. Three clear clusters emerge:</p><ol><li><p><em><strong>Opta x Understat:</strong></em><strong> the fastest and strongest agreement. </strong>After just a few matches, they&#8217;re already above <strong>0.97</strong>, and by the end of the season they&#8217;re sitting at <strong>0.99</strong>. These two tell virtually the same season-long story.</p></li><li><p><em><strong>Opta x StatsBomb</strong></em><strong> and </strong><em><strong>StatsBomb x Understat</strong></em><strong>: the middle cluster. </strong>By the 15-game mark, both pairs push past <strong>0.98</strong>. Consistent, tight, and very stable.</p></li><li><p><em><strong>Anything involving Wyscout: the outlier. </strong></em>Pairs with Wyscout start lower (<strong>0.88&#8211;0.90</strong>) and take longer to catch up. Even late in the season they peak slightly below the others. Wyscout &#8220;thinks differently,&#8221; but still gets close in the long run.</p></li></ol><p>By season&#8217;s end, every pair reaches very strong agreement (&gt;0.97). <em><strong>That tells us that while providers may disagree on individual matches, their season-long signals eventually converge &#8212; even for Wyscout.</strong></em></p><div><hr></div><h1>4 &#8212; Biggest differences</h1><p>Now that we understand <em>how</em> the providers move together, let&#8217;s look at something a bit more fun (and perhaps more intuitive): <em><strong>How often do providers disagree on who &#8220;won&#8221; the xG battle in a match?</strong></em></p><p>For every game, we&#8217;ll assign a winner based on which team created more xG (according to each provider). That gives us three possible scenarios:</p><p><strong>Scenario 1 &#8212; All four providers agree</strong></p><p>Example: <strong>Tottenham vs Arsenal (20/21) &#8212; </strong>Even though Spurs won on the scoreboard, all four models agree Arsenal created the better chances. (Why this happens is a newsletter of its own&#8230;)</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q9Z5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q9Z5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 424w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 848w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 1272w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q9Z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png" width="1456" height="275" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:275,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87821,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!q9Z5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 424w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 848w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 1272w, https://substackcdn.com/image/fetch/$s_!q9Z5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfc78222-cbc8-4bc5-8315-0abe9b0e134d_1960x370.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Scenario 2 &#8212; One provider disagrees</strong></p><p>Example: <strong>Everton vs Brighton &#8212; </strong>Three models choose the same xG winner. The fourth &#8212; <em>Wyscout in this case</em> &#8212; goes the other way.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Eerx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Eerx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 424w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 848w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 1272w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Eerx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png" width="1456" height="263" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:263,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85603,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Eerx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 424w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 848w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 1272w, https://substackcdn.com/image/fetch/$s_!Eerx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04d61dbe-dac6-4ac7-90b1-ba3830c690b8_1968x356.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Scenario 3 &#8212; A 2-vs-2 split</strong></p><p>Example: <strong>Liverpool vs Leeds &#8212; </strong>Opta + Understat (in this case) on one side, StatsBomb + Wyscout on the other.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-3HV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-3HV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 424w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 848w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 1272w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-3HV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png" width="1456" height="273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:273,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85821,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!-3HV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 424w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 848w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 1272w, https://substackcdn.com/image/fetch/$s_!-3HV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd563abd-2021-4585-a6ca-7b06fffc4312_1966x368.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>How often does each scenario occur?</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9_7N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9_7N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 424w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 848w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 1272w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9_7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png" width="422" height="132.1735849056604" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:166,&quot;width&quot;:530,&quot;resizeWidth&quot;:422,&quot;bytes&quot;:30520,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!9_7N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 424w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 848w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 1272w, https://substackcdn.com/image/fetch/$s_!9_7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ce1057-99b6-4382-80d2-1c21ca7f357d_530x166.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Across all five seasons and all five leagues, here&#8217;s the breakdown:</p><ul><li><p><strong>76.1%</strong> of games &#8594; <em>all four providers agree</em></p></li><li><p><strong>15.9%</strong> &#8594; <em>exactly one provider disagrees</em></p></li><li><p><strong>8.0%</strong> &#8594; <em>a 2&#8211;2 split</em></p></li></ul><p>I don&#8217;t know if this surprises you, but next time you&#8217;re unhappy with <em><a href="https://x.com/xGPhilosophy">xGPhilosophy</a>&#8217;s</em> scoreline on X, remember this: in roughly <strong>1 out of 4 games</strong>, you can turn to another provider and find a different xG storyline to defend your team&#8217;s dignity &#8212; or to complain that xG is &#8220;broken.&#8221;</p><p><em>(That was irony for the xG haters out there.)</em></p><p>Moving on&#8230;</p><div><hr></div><h2><strong>Who is the lone dissenter?</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o7mz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o7mz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 424w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 848w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 1272w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o7mz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png" width="250" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:250,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:21325,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!o7mz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 424w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 848w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 1272w, https://substackcdn.com/image/fetch/$s_!o7mz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d5faf4d-a7b4-4a94-9729-21972b93b030_250x200.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When <em>exactly one</em> model goes its own way, it&#8217;s overwhelmingly <strong>Wyscout with 45% of all 1-dissenter games. </strong>StatsBomb follows with 23% and then come Understat and Opta with 16%. No shock here &#8212; at this point in the newsletter, Wyscout consistently emerges as the &#8220;free spirit&#8221; of the group.</p><div><hr></div><h2><strong>Which pairs disagree together in 2-vs-2 splits?</strong></h2><p>When we get a split vote, here&#8217;s how it breaks down:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t7lT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t7lT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 424w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 848w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 1272w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t7lT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png" width="298" height="228.73513513513512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:284,&quot;width&quot;:370,&quot;resizeWidth&quot;:298,&quot;bytes&quot;:44787,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!t7lT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 424w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 848w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 1272w, https://substackcdn.com/image/fetch/$s_!t7lT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d2f0120-b3ed-411d-a9b1-f1ff4f9c5bc8_370x284.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The way to read this table is simple: among all <strong>2-vs-2 split</strong> games, <strong>38.6%</strong> of the time it&#8217;s <strong>StatsBomb + Wyscout</strong> teaming up. In <strong>21.5%</strong> of cases it&#8217;s <strong>Understat + Wyscout</strong>, and in <strong>15.4%</strong> of cases it&#8217;s <strong>StatsBomb + Understat</strong>.</p><p>Once again, Wyscout is the model that most often breaks away from the others. (And I promise I&#8217;m <em>not</em> trying to make this newsletter about Wyscout &#8212; the numbers are doing it for me.)</p><div><hr></div><h1><strong>5 &#8212; Who Ranks Teams the Most Differently?</strong></h1><p>Let&#8217;s now move from match-level disagreements to something even more practical: <em><strong>How much do the providers diverge when ranking teams over a full season?</strong></em></p><p>For this section, we rank every team in every league-season based on their <strong>season-long xG difference</strong> (xG for &#8211; xG against) according to each provider. Then we look at the <strong>largest gaps</strong> between those rankings &#8212; the cases where the four models disagree the most about how good (or bad) a team really was.</p><p>Here are the 10 biggest &#8220;disagreements&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GTt7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GTt7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 424w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 848w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 1272w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GTt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png" width="1456" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b086efba-38e7-4408-b035-892670efd285_2186x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:147412,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.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_!GTt7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 424w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 848w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.png 1272w, https://substackcdn.com/image/fetch/$s_!GTt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb086efba-38e7-4408-b035-892670efd285_2186x700.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>The standout case is <strong>Bologna (2020/21)</strong>. Wyscout ranked them <strong>18th</strong>, Opta and Understat both had them <strong>11th</strong>, and StatsBomb put them <strong>14th</strong> &#8212; a spread of <strong>7 places</strong>, the biggest in the entire dataset.</p><p>And as you&#8217;ll see across the top 10 cases, Wyscout tends to offer either the <strong>best</strong> or the <strong>worst</strong> ranking in these big-disagreement seasons.</p><p>Even if we ignore Wyscout for a moment, there are still interesting differences. For instance:</p><ul><li><p><strong>Werder Bremen (2019/20)</strong> &#8594; StatsBomb had them <strong>10th</strong>, Opta had them <strong>15th</strong></p></li><li><p><strong>N&#238;mes (2019/20)</strong> &#8594; StatsBomb would have relegated them (<strong>20th</strong>), while Opta had them at <strong>16th</strong>, safely above the drop</p></li></ul><p>Now, keep in mind these are the <strong>most extreme</strong> ranking spreads. I&#8217;m not sure what I expected, but given the earlier convergence results &#8212; showing that all four models eventually align over the long run (just at different speeds) &#8212; this shouldn&#8217;t really shock us. A range of 5&#8211;6 places feels&#8230; reasonable. (Does it shock you?)</p><p>That said, the key takeaway is this: <em><strong>If you really want to criticise xG, here&#8217;s your ammunition: depending on the provider you choose, a team can be &#8220;relegated&#8221; or &#8220;saved.&#8221;</strong></em></p><p>(That&#8217;s another joke &#8212; but the numbers do make the point.)</p><div><hr></div><h1><strong>6 &#8212; Which model gets you closest to reality?</strong></h1><p>So far we&#8217;ve compared the providers <em>to each other</em>. But the really important question is: <em><strong>does it matter which xG source you use when you compare it to actual results? </strong></em></p><p>Surprisingly&#8230; much less than you&#8217;d think.</p><h2><strong>Actual Points vs Expected Points (xPoints)</strong></h2><p>The chart below shows how well each provider&#8217;s <strong>cumulative expected points (xPoints)</strong> tracks <strong>actual points won</strong>, week by week.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GpLG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GpLG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 424w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 848w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 1272w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GpLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png" width="620" height="378.9835164835165" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:890,&quot;width&quot;:1456,&quot;resizeWidth&quot;:620,&quot;bytes&quot;:255424,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!GpLG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 424w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 848w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.png 1272w, https://substackcdn.com/image/fetch/$s_!GpLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F405deeff-bc4a-4e51-9132-f4019af3a30f_1596x976.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>If you&#8217;re new to xPoints: it&#8217;s simply the probability of a team winning/drawing/losing based on its xG, typically modelled with a Poisson distribution (McKay Johns has a great beginner-friendly explanation of this <a href="https://mckayjohns.substack.com/p/how-to-calculate-expected-points">here</a>).</p><p>What the chart shows is that all four providers <strong>track reality in a similar way</strong>. One model does lag a bit behind the others (no need to name it &#8212; you already know). </p><p><strong>Understat performs best</strong>, but the margin vs Opta/StatsBomb is small. Understat is also the first to cross <strong>80% correlation</strong> with real points &#8212; around <strong>matchweek 10</strong>. StatsBomb follows at <strong>matchweek 14</strong>. Opta around <strong>matchweek 15</strong>. And our usual outlier joins later (matchweek 17).</p><p>This means that <em><strong>Understat&#8217;s xG model aligns with real results the fastest</strong></em>, despite being the only source here that isn&#8217;t a traditional data provider. Funny how this works.</p><div><hr></div><h2><strong>Goal Difference vs xG Difference</strong></h2><p>This second chart compares <em><strong>actual</strong></em><strong> goal difference</strong> with <em><strong>xG </strong></em><strong>difference</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_!EKEu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EKEu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 424w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 848w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 1272w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EKEu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png" width="614" height="376.15934065934067" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:892,&quot;width&quot;:1456,&quot;resizeWidth&quot;:614,&quot;bytes&quot;:276669,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EKEu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 424w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 848w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.png 1272w, https://substackcdn.com/image/fetch/$s_!EKEu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0981596-f9ee-4862-9199-bfa2452a0f56_1594x976.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>Here the story is similar &#8212; but the gaps widen slightly: Understat again leads the pack. Opta and StatsBomb stay close together. Wyscout drifts below the others more noticeably. No model collapses completely, but some definitely require more match weeks before their xGD stabilises toward reality.</p><div><hr></div><h2><strong>League Table Positions vs xPoints Table</strong></h2><p>Finally, this third chart compares <strong>real league table positions</strong> with those created using <strong>xPoints-based rankings</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_!nK7u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nK7u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 424w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 848w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 1272w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nK7u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png" width="572" height="333.92857142857144" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:850,&quot;width&quot;:1456,&quot;resizeWidth&quot;:572,&quot;bytes&quot;:385149,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!nK7u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 424w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 848w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.png 1272w, https://substackcdn.com/image/fetch/$s_!nK7u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28501a49-22f4-4572-ae18-403a5ff9a1aa_1998x1166.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>This is a stricter, more volatile test &#8212; ranking stability takes longer to emerge. Here&#8217;s when each model crosses <strong>80% Spearman correlation</strong> with actual league tables:</p><ul><li><p><em>Understat</em> &#8594; matchweek 16</p></li><li><p><em>Opta</em> &#8594; matchweek 19</p></li><li><p><em>StatsBomb</em> &#8594; matchweek 19</p></li><li><p><em>Wyscout</em> &#8594; matchweek 22</p></li></ul><p>Again, the theme repeats: <strong>all four models converge</strong>, but <em>at different speeds</em>, and <em>one model</em> consistently needs a few extra weeks to fall in line.</p><p>So does xG data choice provider matters? <em><strong>It does &#8230;but far less than the xG evangelists (or the xG haters) would have you believe.</strong></em></p><div><hr></div><h1>7 &#8212; Wrapping up</h1><p>Boom &#8212; that was &#8216;<em>Not All xG Is Created Equal&#8216; <strong>Python Football Review </strong></em>style.</p><p>I guess that despite StatsBomb&#8217;s claims that it is the best xG provider in the industry (notably because they consider things like shot height, nearby players, and goalkeeper position), it turns out they&#8217;re not that different from Opta after all.</p><p>And while we&#8217;re on this topic, it&#8217;s worth adding another small disclaimer. While preparing this newsletter, I was genuinely baffled by how close Opta and StatsBomb were. All the marketing talk around StatsBomb&#8217;s superiority must have gotten into my head. So, to make sure there wasn&#8217;t an error in my data, I tried to double-check whether my StatsBomb values were accurate.</p><p>I had a hard time finding another source of StatsBomb match-level data, so I scoured the internet and eventually stumbled upon a YouTube video dating back to April 2020 reviewing Statsbomb data (which at the time was hosted on Fbref) for Dortmund&#8217;s 2019/20 season.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Wq_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Wq_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 424w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 848w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 1272w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Wq_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png" width="570" height="301.4423076923077" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:770,&quot;width&quot;:1456,&quot;resizeWidth&quot;:570,&quot;bytes&quot;:894200,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0Wq_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 424w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 848w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.png 1272w, https://substackcdn.com/image/fetch/$s_!0Wq_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61243b10-e6a0-4d09-9a01-4ff3f11eb23c_1472x778.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><figcaption class="image-caption">Source: <a href="https://www.youtube.com/watch?v=RoA7KcOqvhc&amp;t=87s">Youtube</a></figcaption></figure></div><p>Comparing those numbers to mine revealed some differences:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kso2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kso2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 424w, https://substackcdn.com/image/fetch/$s_!kso2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 848w, https://substackcdn.com/image/fetch/$s_!kso2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 1272w, https://substackcdn.com/image/fetch/$s_!kso2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kso2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png" width="1416" height="406" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:406,&quot;width&quot;:1416,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71010,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178995609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!kso2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 424w, https://substackcdn.com/image/fetch/$s_!kso2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 848w, https://substackcdn.com/image/fetch/$s_!kso2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.png 1272w, https://substackcdn.com/image/fetch/$s_!kso2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa690a3d9-9de8-4990-bc02-c1f03a984421_1416x406.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><ul><li><p>Match 1 (vs Augsburg): </p><ul><li><p>My data &#8594; <strong>2.7 vs 0.7</strong></p></li><li><p>Statsbomb (as of 2020) &#8594; <strong>2.4 vs 0.7</strong></p></li></ul></li><li><p>Match 2 (vs K&#246;ln): </p><ul><li><p>My data &#8594; <strong>1.4 vs 0.7</strong></p></li><li><p>Statsbomb (as of 2020)  &#8594; <strong>1.7 vs 0.8</strong></p></li></ul></li><li><p>Match 3 (vs Union Berlin): </p><ul><li><p>My data &#8594; <strong>1.9 vs 1.9</strong></p></li><li><p>Statsbomb (as of 2020)  &#8594; <strong>1.8 vs 2.1</strong></p></li></ul></li></ul><p>This makes me think that <strong>StatsBomb retro-updated their xG model</strong> (all providers revise historic values occasionally), which means that my data captured an earlier version of their feed.</p><p>Having said that &#8230; here are a few personal takeaways:</p><h4><strong>1. I was surprised by how close Opta and Understat are</strong></h4><p>Understat isn&#8217;t really a &#8220;provider&#8221; in the formal sense, and I still have no idea where they source their raw data. So either they rely on Opta (somewhat), or they built a very similar model &#8212; which seems like the more plausible explanation. Either way, Understat remains a great free resource that&#8217;s reliable enough for most purposes.</p><h4><strong>2. Wyscout&#8217;s reliability (or lack thereof)</strong></h4><p>Wyscout never had a reputation for best data in the industry. Still, I always interpreted that to mean they might struggle with <em>less popular leagues</em> &#8212; lower coverage, lower interest, fewer people checking and validating data, etc. </p><p>What surprised me, though, is how differently they behave in the five biggest and most well-covered leagues. I expected their model to track much more closely with Opta and StatsBomb.</p><p>As we saw in the cumulative plots, they eventually converge &#8212; but along the way they produce more outliers than the others. If you&#8217;re using this for predictive modelling, that variance could change a few odds that your model produces.</p><h4><strong>3. xG models converge over the season &#8212; but match-to-match variance can be big</strong></h4><p>Over the long run, the models tell almost the same story. But game-by-game? In <strong>25% of matches</strong>, at least one provider disagrees with the others about who &#8220;won&#8221; the xG battle (based on my simple xG-winner classification). This looks like a big diasgreement to me.</p><h4><strong>4. Understat data correlates best with actual team performance</strong></h4><p>I was genuinely surprised to find that Understat consistently leads the pack when it comes to convergence to actual team performance &#8212; whether you look at points, rankings, or xG differences. It&#8217;s almost ironic: the only source in the comparison that <em>isn&#8217;t</em> a formal data provider ends up aligning with reality the fastest.</p><div><hr></div><h4><strong>What was your biggest takeaway?</strong></h4><p>I&#8217;d genuinely love to hear it.</p><p>The natural follow-up is obvious: <strong>shot-by-shot analysis</strong>. Instead of comparing match-level aggregates, compare each provider&#8217;s probability for each individual shot. If that&#8217;s something you&#8217;d like to see in a future edition, drop a comment &#8212; I&#8217;d be happy to expand this series.</p><p>Thank you for reading until the end.</p><p>See you next week,</p><p><em>Martin</em></p>]]></content:encoded></item><item><title><![CDATA[How Soon Can You Trust the League Table?]]></title><description><![CDATA[And what 10 seasons of data reveal about when standings converge.]]></description><link>https://www.transferscience.com/p/how-soon-can-you-trust-the-league</link><guid isPermaLink="false">https://www.transferscience.com/p/how-soon-can-you-trust-the-league</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 13 Nov 2025 15:06:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5F3J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend, </p><p>A few weeks back, <a href="https://substack.com/@aurelnazmiu">Aurel Nazmiu</a> shared a great visual showing when the Premier League table stabilises during the season.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sGdP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sGdP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 424w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 848w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 1272w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sGdP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png" width="450" height="602.6627218934912" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1358,&quot;width&quot;:1014,&quot;resizeWidth&quot;:450,&quot;bytes&quot;:337455,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35ccf866-88f1-4284-baef-8f9645c1b09e_1014x1358.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!sGdP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 424w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 848w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.png 1272w, https://substackcdn.com/image/fetch/$s_!sGdP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20262003-91a9-4f79-b35d-acb3d65fef34_1014x1358.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><figcaption class="image-caption">Source: <a href="https://www.linkedin.com/posts/activity-7378349427503173632-KoXv?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAAA1HkSMBcGVBEKGPvcsl-Uy62YaHAOp9Qtc">Linkedin</a></figcaption></figure></div><p>I loved it for three reasons:</p><ol><li><p>It shows you don&#8217;t need fancy, complicated charts to do good analytics.</p></li><li><p>This seemingly simple graph hides a surprising (to a beginner) amount of data wrangling beneath the surface.</p></li><li><p>And when you try to recreate it yourself, you naturally start asking deeper questions you never considered when you first saw the figure &#8212; like <em>what type of correlation should I use, and why does that matter?</em> (more on that below).</p></li></ol><p>Welcome to <em><strong>The Python Football Review #016</strong></em>.</p><p>In today&#8217;s edition, we&#8217;ll <strong>replicate that figure</strong>, then <strong>extend it to Europe&#8217;s top five leagues</strong> to see which ones settle earlier than others. </p><p>And along the way, you&#8217;ll see that a huge chunk of visualisation actually happens <em>before</em> you ever touch <code>matplotlib</code> &#8212; and why the classic (Pearson) correlation doesn&#8217;t work well with ranks (so we&#8217;ll use Spearman instead).</p><p>Let&#8217;s dive in.</p><div><hr></div><h2><em>So, what&#8217;s the plan, Martin?</em></h2><p>We&#8217;ll start by <em><strong>collecting</strong></em> 10 seasons of Premier League results data. Then we&#8217;ll <em><strong>wrangle</strong></em> it into a dataset that contains each team&#8217;s league position at every matchweek, along with a variable for each team&#8217;s final-season position. Once we have that, we&#8217;ll calculate the <em><strong>Spearman correlation</strong></em> and finally <em><strong>plot</strong></em> the results.</p><p>Without further ado, let&#8217;s collect some data.</p><div><hr></div><h1>1 &#8212; Collecting the Data</h1><p>First, we import the libraries we&#8217;ll use. <code>Polars </code>for fast, readable wrangling. <code>NumPy </code>for small numeric utilities. <code>Matplotlib </code>for plotting. And SciPy&#8217;s <code>spearmanr </code>to compute the Spearman rank correlations between interim and final league positions.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uKQk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uKQk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 424w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 848w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 1272w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uKQk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png" width="404" height="225.30769230769232" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:624,&quot;resizeWidth&quot;:404,&quot;bytes&quot;:58387,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.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_!uKQk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 424w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 848w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 1272w, https://substackcdn.com/image/fetch/$s_!uKQk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb478f06-a3c9-4398-8860-6f72f2b05211_624x348.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>We&#8217;ll collect <strong>10 seasons of Premier League results</strong> from <a href="https://x.com/12Xpert">Joseph Buchdahl</a>&#8217;s <a href="http://football-data.co.uk/">Football-Data.co.uk</a> &#8212; a fantastic open resource with historical match CSVs. With Polars&#8217; <code>read_csv</code>, we can load them directly.</p><p>Here&#8217;s what the following snippet does:</p><ul><li><p>Defines the list of the 10 seasons we want.</p></li><li><p>Creates an empty list to store each season&#8217;s table.</p></li><li><p>Loops over each season and loads the corresponding CSV.</p></li><li><p>Keeps only the relevant columns: date, home team, away team, full-time result, full-time goals.</p></li><li><p>Adds a <code>season</code> column so we can track each row back to its year.</p></li><li><p>Appends each cleaned table to our list.</p></li><li><p>Concatenates everything into one big DataFrame.</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_!4djK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4djK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 424w, https://substackcdn.com/image/fetch/$s_!4djK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 848w, https://substackcdn.com/image/fetch/$s_!4djK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 1272w, https://substackcdn.com/image/fetch/$s_!4djK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4djK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png" width="508" height="319.1858407079646" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:852,&quot;width&quot;:1356,&quot;resizeWidth&quot;:508,&quot;bytes&quot;:164845,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.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_!4djK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 424w, https://substackcdn.com/image/fetch/$s_!4djK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 848w, https://substackcdn.com/image/fetch/$s_!4djK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.png 1272w, https://substackcdn.com/image/fetch/$s_!4djK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5bd5590e-2983-4b0c-adb2-df69ca39da1d_1356x852.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>The result is a clean Polars table with <strong>one row per match</strong>, ready for wrangling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nzUI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nzUI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 424w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 848w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 1272w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nzUI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png" width="430" height="335.0242718446602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c3255502-87f7-4fb3-a7f4-947503049464_824x642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:642,&quot;width&quot;:824,&quot;resizeWidth&quot;:430,&quot;bytes&quot;:91119,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.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_!nzUI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 424w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 848w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.png 1272w, https://substackcdn.com/image/fetch/$s_!nzUI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc3255502-87f7-4fb3-a7f4-947503049464_824x642.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><h1>2 &#8212; Wrangling</h1><p>We start by renaming all columns to lowercase.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lmDv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lmDv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 424w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 848w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 1272w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lmDv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png" width="650" height="101.47275405007363" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:212,&quot;width&quot;:1358,&quot;resizeWidth&quot;:650,&quot;bytes&quot;:42536,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.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_!lmDv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 424w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 848w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 1272w, https://substackcdn.com/image/fetch/$s_!lmDv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37c70692-0742-438c-aa12-3f5f50aa9407_1358x212.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Next, we build the team-level data. For each <strong>home team</strong>, we calculate their goals for, goals against, points won, and goal difference.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3iMe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3iMe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 424w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 848w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 1272w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3iMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png" width="486" height="546.75" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:864,&quot;resizeWidth&quot;:486,&quot;bytes&quot;:144737,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.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_!3iMe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 424w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 848w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.png 1272w, https://substackcdn.com/image/fetch/$s_!3iMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31f37efb-5137-420e-9d87-db2f4f8f1983_864x972.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>We repeat the same for each <strong>away team</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_!I05g!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I05g!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 424w, https://substackcdn.com/image/fetch/$s_!I05g!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 848w, https://substackcdn.com/image/fetch/$s_!I05g!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 1272w, https://substackcdn.com/image/fetch/$s_!I05g!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I05g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png" width="474" height="528.3577981651376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:872,&quot;resizeWidth&quot;:474,&quot;bytes&quot;:146547,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.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_!I05g!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 424w, https://substackcdn.com/image/fetch/$s_!I05g!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 848w, https://substackcdn.com/image/fetch/$s_!I05g!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.png 1272w, https://substackcdn.com/image/fetch/$s_!I05g!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd47f239d-699f-4cff-bb74-ccebb8e264f0_872x972.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>Then we stack the two together using a concatenation.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o9qf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o9qf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 424w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 848w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 1272w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o9qf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png" width="594" height="160.01162790697674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:278,&quot;width&quot;:1032,&quot;resizeWidth&quot;:594,&quot;bytes&quot;:55041,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.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_!o9qf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 424w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 848w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 1272w, https://substackcdn.com/image/fetch/$s_!o9qf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa404cdb5-bea2-4025-b57e-44b063f1f63f_1032x278.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And now we have <strong>one row per team per match</strong>, containing that team&#8217;s goals for, goals against, points earned, and goal difference.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ESEA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ESEA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 424w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 848w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 1272w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ESEA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png" width="532" height="492.9265536723164" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c673b65a-9106-4300-bd5d-197900134062_708x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:708,&quot;resizeWidth&quot;:532,&quot;bytes&quot;:77476,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.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_!ESEA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 424w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 848w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.png 1272w, https://substackcdn.com/image/fetch/$s_!ESEA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc673b65a-9106-4300-bd5d-197900134062_708x656.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>Since our data is ordered by date, we create a <strong>matchweek number</strong>. Yes &#8212; this is a simplification because not all teams play on the exact same day, but over 10 seasons this should not meaningfully impact the results.</p><p>In addition to matchweek, we compute: cumulative points, cumulative goals for, cumulative goals against, cumulative goal difference.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0oLT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0oLT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 424w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 848w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 1272w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0oLT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png" width="1356" height="740" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:740,&quot;width&quot;:1356,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157958,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.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_!0oLT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 424w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 848w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.png 1272w, https://substackcdn.com/image/fetch/$s_!0oLT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d4ca332-74b4-4ce0-88d0-8468c1e266c2_1356x740.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>This produces a tidy table showing, for every team in every season, how their totals evolve <em><strong>after each matchweek</strong></em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fVp6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fVp6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 424w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 848w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 1272w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fVp6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png" width="508" height="334.56161616161614" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c64cb425-be78-4190-893c-51d89c4fff67_990x652.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:652,&quot;width&quot;:990,&quot;resizeWidth&quot;:508,&quot;bytes&quot;:88892,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.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_!fVp6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 424w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 848w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.png 1272w, https://substackcdn.com/image/fetch/$s_!fVp6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc64cb425-be78-4190-893c-51d89c4fff67_990x652.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><h2><strong>Ranking the teams each week</strong></h2><p>Based on the interim values for points accumulated, goals for, goals against, and goal difference, we create each team&#8217;s position for every matchweek. We do this by sorting first by <em><strong>points</strong></em>, then by <em><strong>goal difference</strong></em>, and finally by <em><strong>goals for</strong></em>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Cwg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Cwg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 424w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 848w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Cwg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png" width="751" height="250" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de623566-12ff-4b30-9c73-02f09b369303_751x250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:250,&quot;width&quot;:751,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37668,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.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_!0Cwg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 424w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 848w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.png 1272w, https://substackcdn.com/image/fetch/$s_!0Cwg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde623566-12ff-4b30-9c73-02f09b369303_751x250.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>This new <code>cum_pos</code> column is what we care about.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LEqs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LEqs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 424w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 848w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 1272w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LEqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png" width="746" height="269" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:269,&quot;width&quot;:746,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:18335,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!LEqs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 424w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 848w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.png 1272w, https://substackcdn.com/image/fetch/$s_!LEqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe5f1653b-c253-4141-bb8a-09fdc50b7bba_746x269.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>With our clean data ready, we move into the analytical phase. First, we select only the columns we need for the correlation exercise.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ztss!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ztss!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 424w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 848w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 1272w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ztss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png" width="670" height="101" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:101,&quot;width&quot;:670,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:12336,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.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_!Ztss!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 424w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 848w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 1272w, https://substackcdn.com/image/fetch/$s_!Ztss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd666912f-2da2-4d51-a1e5-c54358d5d1af_670x101.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GbL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GbL2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 424w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 848w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 1272w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GbL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png" width="390" height="247" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9119497d-44e8-40d4-8006-2848606d95b4_390x247.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:247,&quot;width&quot;:390,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11628,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.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_!GbL2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 424w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 848w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.png 1272w, https://substackcdn.com/image/fetch/$s_!GbL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9119497d-44e8-40d4-8006-2848606d95b4_390x247.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>Then we create a <strong>final positions table</strong> by keeping only the <strong>last matchweek of each season</strong> &#8212; these are the official final ranks.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uDhF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uDhF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 424w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 848w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 1272w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uDhF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png" width="495" height="172" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:172,&quot;width&quot;:495,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20394,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.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_!uDhF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 424w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 848w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 1272w, https://substackcdn.com/image/fetch/$s_!uDhF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffa6519d-fe7c-4ad3-a548-19ed062459df_495x172.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y3pB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y3pB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 424w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 848w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 1272w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y3pB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png" width="305" height="269" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:269,&quot;width&quot;:305,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10376,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.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_!Y3pB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 424w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 848w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.png 1272w, https://substackcdn.com/image/fetch/$s_!Y3pB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F590c8f40-f25f-4752-b2ba-d62b4745d496_305x269.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>Finally, we join the final positions back to <strong>all</strong> matchweeks, so for any given matchweek, we can compare a team&#8217;s <strong>current position</strong> vs its <strong>final position</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Tkdv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Tkdv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 424w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 848w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 1272w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Tkdv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png" width="522" height="96" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:96,&quot;width&quot;:522,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10524,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.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_!Tkdv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 424w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 848w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 1272w, https://substackcdn.com/image/fetch/$s_!Tkdv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c8784dc-9397-46e0-921a-63b020129d7e_522x96.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tedq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tedq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 424w, https://substackcdn.com/image/fetch/$s_!tedq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 848w, https://substackcdn.com/image/fetch/$s_!tedq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 1272w, https://substackcdn.com/image/fetch/$s_!tedq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tedq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png" width="465" height="275" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:275,&quot;width&quot;:465,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13057,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.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_!tedq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 424w, https://substackcdn.com/image/fetch/$s_!tedq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 848w, https://substackcdn.com/image/fetch/$s_!tedq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.png 1272w, https://substackcdn.com/image/fetch/$s_!tedq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03c47af3-b81c-4beb-a598-bed4028b12ee_465x275.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><h2><strong>Correlation over time</strong></h2><p>Next, we compute the correlation for each matchweek. The loop:</p><ul><li><p>takes matchweek <em>k</em></p></li><li><p>extracts all team positions at that point</p></li><li><p>compares them to the final table</p></li><li><p>computes<em><strong> Spearman&#8217;s &#961;</strong></em></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_!H5cJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H5cJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 424w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 848w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 1272w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H5cJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png" width="605" height="295" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/237391e8-4d54-464f-a810-7985f7bb8253_605x295.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:295,&quot;width&quot;:605,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35153,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.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_!H5cJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 424w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 848w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.png 1272w, https://substackcdn.com/image/fetch/$s_!H5cJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F237391e8-4d54-464f-a810-7985f7bb8253_605x295.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>Why <em><strong>Spearman</strong></em> and not <em><strong>Pearson</strong></em> (the classic correlation you first learn at school)?</p><ul><li><p><strong>Pearson</strong> works on raw numeric distances &#8212; it assumes linear relationships, not ranks.</p></li><li><p><strong>Spearman</strong> works on <strong>ranks</strong>, which fits league tables perfectly. League positions are ordinal, not numerical &#8212; finishing 1st vs 2nd is not the same &#8220;distance&#8221; as finishing 10th vs 11th.</p></li></ul><p>So Spearman is the right choice for football standings.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XoMZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XoMZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 424w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 848w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 1272w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XoMZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png" width="193" height="428" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:428,&quot;width&quot;:193,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11734,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.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_!XoMZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 424w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 848w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.png 1272w, https://substackcdn.com/image/fetch/$s_!XoMZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a111a7b-6ac0-4f7d-9c34-5ddae5d270cb_193x428.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><h1>3 &#8212; Plotting</h1><p>Once correlations are computed for all weeks, we plot them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g56l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g56l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 424w, https://substackcdn.com/image/fetch/$s_!g56l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 848w, https://substackcdn.com/image/fetch/$s_!g56l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 1272w, https://substackcdn.com/image/fetch/$s_!g56l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g56l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png" width="738" height="473" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:473,&quot;width&quot;:738,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:65745,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.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_!g56l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 424w, https://substackcdn.com/image/fetch/$s_!g56l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 848w, https://substackcdn.com/image/fetch/$s_!g56l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.png 1272w, https://substackcdn.com/image/fetch/$s_!g56l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d8df938-d233-4507-91d6-2b65d4d20a0f_738x473.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>In competition economics (my day job), an 80% threshold is often used as a way to summarise a relatively strong effect or a reliable sample. I think it also links loosely to the Pareto idea &#8212; the 20% of factors that deliver 80% of the results. Regardless, for the purposes of this small article, we&#8217;ll treat 80% as the level where things start to &#8220;stabilise&#8221; (my newsletter, my rules).</p><p>So the natural question is:</p><blockquote><p><em><strong>At which matchweek does the Premier League&#8217;s correlation exceed 80%?</strong></em></p></blockquote><p>Answer: <em><strong>Around Matchweek 10.</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CvXt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CvXt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 424w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 848w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 1272w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CvXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png" width="800" height="490" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:490,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42799,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!CvXt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 424w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 848w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.png 1272w, https://substackcdn.com/image/fetch/$s_!CvXt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07dc6402-5f1a-4e76-9fd9-fdde3efd4480_800x490.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>By that point, the table already starts to resemble its final shape to a meaningful degree. A few observations stand out:</p><ul><li><p>The <strong>70% threshold</strong> is crossed as early as Matchweek 6.</p></li><li><p>But it&#8217;s only around <strong>Matchweek 10</strong> that the league passes the <strong>80%</strong> mark &#8212; our &#8220;stability&#8221; line.</p></li><li><p>And interestingly, crossing from <strong>80% to 90%</strong> takes quite a bit longer. It&#8217;s only after roughly <strong>Matchweek 20</strong> that the Premier League reaches the 90% correlation level.</p></li><li><p>The final 10% &#8212; from 90% to 100% &#8212; takes about <strong>18 additional matchweeks</strong>, almost half the season.</p></li></ul><p>Early structure forms quickly. True stability takes time.</p><h2><em><strong>And what about the other Big 5 leagues?</strong></em></h2><h2>It turns out:</h2><ul><li><p><strong>Ligue 1</strong> crosses the 80% threshold only after Matchweek 15, and reaches the 90% mark around Matchweek 25 &#8212; a bit late.</p></li><li><p><strong>Serie A</strong> and the <strong>Bundesliga</strong> are the earliest to stabilise among the Big 5, passing the 0.8 threshold at Matchweek 9 &#8212; though La Liga and the Premier League aren&#8217;t far behind.</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_!5F3J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5F3J!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 424w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 848w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 1272w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5F3J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png" width="995" height="588" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:588,&quot;width&quot;:995,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83390,&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.pythonfootball.com/i/178409648?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.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_!5F3J!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 424w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 848w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.png 1272w, https://substackcdn.com/image/fetch/$s_!5F3J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F864e866c-c8ca-4edd-a2e6-e228321afcd1_995x588.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><p>Boom &#8212; that was the behind-the-scenes look at <strong>when league standings actually settle</strong>.</p><p>You&#8217;ve now seen the amount of wrangling required to produce a graph that looks deceptively simple. You&#8217;ve seen the kinds of questions you end up asking only once you start working with the data (you&#8217;ve probably heard of correlation &#8212; but maybe not the difference between Pearson and Spearman). And you&#8217;ve learned that Ligue 1 takes its time to stabilise, while Serie A is the quickest of the Big 5.</p><p>This whole exercise reminded me of one of my favourite truths about (football) analytics: <em><strong>the best insights show up only once you&#8217;re deep in the weeds doing the work.</strong></em></p><p>On paper, this looked like a trivial problem: <em>&#8220;Compare matchweek positions to final positions. Plot the correlation.&#8221;</em> Easy.</p><p>But once I started building the table &#8212; lining up matchweeks, ranking teams, joining final positions &#8212; a bigger question surfaced:</p><p><em><strong>&#8220;Wait&#8230; what exactly is being correlated here? Do distances between positions even mean anything? No. So why am I reaching for Pearson? This is a ranking problem &#8212; of course Spearman is the right tool.&#8221;</strong></em></p><p>You only see the true shape of a problem once you&#8217;re inside it.</p><p>Thanks for reading until the end.</p><p>See you next week,<br><em><strong>Martin</strong></em></p><div><hr></div><p>As usual, you can grab the code below. The part that downloads all five leagues and plots the figure is included inside.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://github.com/PythonFootball/PythonFootballReview/blob/main/PFR_016_position_correlation.ipynb&quot;,&quot;text&quot;:&quot;Grab the Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://github.com/PythonFootball/PythonFootballReview/blob/main/PFR_016_position_correlation.ipynb"><span>Grab the Code</span></a></p><p>Simply download it, open a <a href="https://colab.research.google.com/">Google Colab</a> session (if you don&#8217;t have Python installed), and run it line by line to replicate the analysis. And if you&#8217;re feeling adventurous, try switching the leagues and exploring beyond the Big 5.</p><p>Hint: you can use keys like <strong>E1</strong> (Championship), <strong>E2</strong> (League One), <strong>E3</strong> (League Two), <strong>I2</strong> (Serie B), <strong>SP2</strong> (Segunda Divisi&#243;n), <strong>D2</strong> (2. Bundesliga), <strong>F2</strong> (Ligue 2), <strong>B1</strong> (Belgium), <strong>P1</strong> (Portugal), <strong>T1</strong> (Turkey)&#8230; just to name a few.</p><p>Cheers!</p>]]></content:encoded></item><item><title><![CDATA[3 Reasons Why Football Fans Are Best Placed to Learn Python for Analytics]]></title><description><![CDATA[And why you can do it too]]></description><link>https://www.transferscience.com/p/3-reasons-why-football-fans-are-best</link><guid isPermaLink="false">https://www.transferscience.com/p/3-reasons-why-football-fans-are-best</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Fri, 07 Nov 2025 08:54:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a15f7ddb-50a8-4219-8648-4215bdb43853_571x503.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review</em> #015.</p><p>When it comes to learning Python for analytics, football fans are the best-suited group out there.</p><p>Yes &#8212; that&#8217;s the claim we&#8217;re exploring today.</p><p>Let&#8217;s not waste time and jump straight into it.</p><div><hr></div><h3><strong>Reason #1: Football is the perfect sandbox for the entire data science workflow.</strong></h3><p>After 10 years in consulting, I can safely say that most business problems only cover two or three parts of the data science workflow (<em>collect</em> &#8594; <em>wrangle</em> &#8594; <em>visualise</em> &#8594; <em>model</em> &#8594; <em>deploy</em>). But only rarely,  the full spectrum.</p><p>Football covers all of them.</p><blockquote><p><em><strong>It&#8217;s rich enough to challenge you, familiar enough to stay fun, and concrete enough to show progress fast.</strong></em></p></blockquote><p>Every key stage of the workflow appears naturally:</p><p><em><strong>Collection </strong></em>&#8212; If you stick around long enough, you&#8217;ll eventually touch all the main methods &#8212; using community-built wrappers (where most of us start), web scraping, and calling APIs from data providers. It&#8217;s a natural progression: from hobby projects to more serious analytical work. Football lets you go all the way &#8212; from analyst to data engineer.</p><p><em><strong>Wrangling</strong> </em>&#8212; Football data is gloriously messy &#8212; and that&#8217;s a good thing. Even early on, you&#8217;ll run into challenges like merging sources where <em>&#8220;Man Utd&#8221;</em> in one dataset needs to match <em>&#8220;Manchester United&#8221;</em> in another. This is the unglamorous middle of every real project &#8212; and football gives you plenty of practice.</p><p><em><strong>Visualisation </strong></em>&#8212; Few domains offer better opportunities to visualise data. From simple scatter plots and line charts to more advanced visuals &#8212; xG flow charts, player radars, passing networks, pass sonars &#8212; football has it all. In analytics, visuals are often the final product &#8212; and football gives you endless ways to master the craft.</p><p><em><strong>Modelling </strong></em>&#8212; When it comes to modelling, we can safely say that <strong>machine learning is the name of the game in football analytics. </strong>Think of the buzzword <em>expected goals</em> &#8212; behind it often sits a simple but powerful model: <strong>logistic regression. </strong>How do teams find replacements for departing players? They could turn to <strong>clustering and dimensionality reduction</strong> &#8212; algorithms that combine dozens of metrics into just a few, then group players by similarity. How do platforms project a team&#8217;s chances of winning the title &#8212; or even the next game? That&#8217;s <strong>regression analysis</strong> at work.</p><p>My point is this: the four main pillars of machine learning &#8212; <strong>prediction, classification, clustering, and dimensionality reduction</strong> &#8212; are the same questions fans, scouts, and journalists ask every week.</p><p><strong>Deployment</strong> &#8212; Finally, football pushes you to share your insights &#8212; from hobby dashboards to professional tools. Whether it&#8217;s tracking trends, explaining tactics, or previewing matches, football gives you a reason to build and publish your work.</p><p>When you learn Python through football analytics, you naturally learn to wear all three hats:</p><ul><li><p>Engineer &#8594; collecting and structuring data</p></li><li><p>Analyst &#8594; finding and visualising insights</p></li><li><p>Scientist &#8594; building and testing models</p></li></ul><p>That&#8217;s what makes football the perfect playground for learning analytics end to end.</p><div><hr></div><h3><strong>Reason #2: The easiest way to learn something? Start with what you love.</strong></h3><p>I learned that the hard way.</p><p>I improved my French through <em>Football Manager.</em> Back when I was a junior economics consultant trying to break into the Paris consulting world, that game became my tutor.</p><p>You might think knowing the difference between a <em>Meneur de jeu en retrait</em> (Deep-Lying Playmaker) and a <em>Milieu r&#233;cup&#233;rateur</em> (Ball-Winning Midfielder) wouldn&#8217;t help me professionally &#8212; and you&#8217;d be right.</p><p>But beyond the tactics and jargon, I was absorbing grammar, vocabulary, and sentence structures without even realising it. The learning stuck because <em><strong>it felt like play.</strong></em></p><p>The same pattern repeated in my career.</p><p>I perfected my <strong>R skills</strong> not through formal training, but by combining client projects with late-night forecasting experiments. There&#8217;s no better way to master <em>dplyr</em> than trying to fuzzy-match messy data sources full of special characters. Sure, I used R at work &#8212; but the real progress came from side projects that didn&#8217;t feel like work.</p><p>Now, I sharpen my <strong>Python</strong> through <em>The Python Football Review. </em>At work, it&#8217;s only the third tool I use (not my choice!). But I knew one truth: if you don&#8217;t use a language &#8212; any language &#8212; you lose it. The newsletter gave me a reason to keep learning: exploring football questions that genuinely interested me, while staying sharp with new libraries and trends.</p><blockquote><p><em><strong>Same lesson every time: When you learn through something you already love, the learning sticks.</strong></em></p></blockquote><p>That&#8217;s why <strong>football fans have a real head start</strong> when learning Python for analytics. You already understand the context and the meaning behind the numbers.</p><p>Picking your favourite team as your &#8220;dataset&#8221; is what most data learners dream of.</p><p>Imagine collecting Arsenal&#8217;s data from this season. Modelling Arsenal&#8217;s title chances using their average xG difference &#8212; that&#8217;s <strong>linear regression</strong> in action. Predicting their next match result based on their 6-game rolling form &#8212; that&#8217;s <strong>logistic regression. </strong>Grouping &#216;degaard, Rice, and N&#248;rgaard by playing style &#8212; that&#8217;s <strong>K-Means clustering.</strong></p><p>Suddenly, abstract algorithms become intuitive. When you start with football, the learning never feels forced. It&#8217;s relevant, motivating, and &#8212; most importantly &#8212; sustainable.</p><p><strong>As a fan, you already have the perfect excuse to get into Python. </strong>The subject you love is the best teacher you&#8217;ll ever have.</p><div><hr></div><h3><strong>Reason #3: The Feedback loop is fast (and addictive)</strong></h3><p>The best kind of learning is the kind that gives you <strong>instant feedback.</strong></p><p>In football, that feedback comes naturally. The data changes every week &#8212; new matches, new patterns, new stories. You can test your code, tweak it, rerun it after the next round, and instantly see how things evolve.</p><p>That sense of progress keeps you motivated far longer than any textbook ever could.</p><p>And then there&#8217;s the <strong>community.</strong></p><p>Football has one of the most active, passionate data communities anywhere online &#8212; fans and analysts sharing visuals, models, and insights for every league, every team.</p><p>Imagine posting your own shot map after the weekend&#8217;s game and joining the discussion around what it means. You&#8217;ll get instant feedback &#8212; on your visual style, your code, your interpretation &#8212; from people who genuinely care about the same questions you do.</p><p>That kind of feedback is priceless. It&#8217;s fast, constructive, and it helps you improve without feeling like work.</p><p>With quick feedback loops and a supportive community, <strong>learning Python through football starts to feel like play. </strong>You don&#8217;t think of it as &#8220;practicing coding&#8221; &#8212; you&#8217;re just exploring, visualising, modelling, sharing. And without noticing, you get better every single week.</p><div><hr></div><p>Boom &#8212; those were the 3 reasons football fans are perfectly suited to learn Python for analytics.</p><p>Thanks for reading,</p><p><em><strong>Martin</strong></em></p>]]></content:encoded></item><item><title><![CDATA[5 Mistakes Beginners Make When Learning Python for Football (and How to Solve Them)]]></title><description><![CDATA[Hi friend,]]></description><link>https://www.transferscience.com/p/5-mistakes-beginners-make-when-learning</link><guid isPermaLink="false">https://www.transferscience.com/p/5-mistakes-beginners-make-when-learning</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Wed, 05 Nov 2025 08:30:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1T1n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review</em> #014.</p><p>Today, we&#8217;re tackling a question I&#8217;ve been thinking about a lot lately: <em><strong>What are the biggest mistakes beginners make when they start learning Python for football?</strong></em></p><p>Let&#8217;s dive into five of them and see how beginners can move past them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1T1n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1T1n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 424w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 848w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 1272w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1T1n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png" width="1038" height="1033" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1033,&quot;width&quot;:1038,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1925088,&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.pythonfootball.com/i/177910393?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.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_!1T1n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 424w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 848w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.png 1272w, https://substackcdn.com/image/fetch/$s_!1T1n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc20a2c17-8097-4948-8e7a-ba4021e4e197_1038x1033.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><div><hr></div><h3><strong>Mistake #1 &#8212; </strong><em><strong>Starting without a roadmap</strong></em></h3><p>Python is everywhere &#8212; websites, apps, machine learning, and of course, football analytics. The good news: there are thousands of tutorials. The bad news: <strong>that&#8217;s the problem.</strong></p><p>You search online and you&#8217;re hit with two extremes: a 5-hour<strong> Python bootcamps</strong> made for software engineers or overly<strong> technical research papers / GitHub projects</strong> written by data scientists for other data scientists. And on rare occasions, you&#8217;ll find <strong>a single video showing one cool football visualisation or model</strong> &#8212; but nothing structured, nothing that takes you from start to finish.</p><p>Both are valuable. Neither are designed for a beginner who just wants to answer a simple football question like:</p><blockquote><p>&#8220;How many points is my team projected to win based on their current form?&#8221;</p></blockquote><p>So you bounce from tutorial to tutorial, learning random bits of Python without ever completing a project. The overwhelm quickly turns into paralysis:</p><blockquote><p>&#8220;Am I supposed to learn <em>all</em> of Python before I start analysing football?&#8221;</p></blockquote><p>No.</p><p>In the beginning, you don&#8217;t need <em>all</em> of Python &#8212; you need the <strong>minimum viable skills</strong> that let you move through the four phases of a project: <em><strong>Collect</strong></em><strong> &#8212;&gt; </strong><em><strong>Wrangle </strong></em><strong>&#8212;&gt; </strong><em><strong>Visualise</strong></em><strong> &#8212;&gt; </strong><em><strong>Model</strong></em><strong>.</strong></p><p>Just enough to complete something real &#8212; fast. </p><p>Once you understand the framework and have a tiny toolkit for each phase, you stop wandering and start building. And that brings us to the next mistakes &#8212; one per phase &#8212; starting with:</p><div><hr></div><h3><strong>Mistake #2 &#8212; </strong><em><strong>Getting stuck at data collection</strong></em></h3><p>Few things derail a beginner faster than getting stuck at step one &#8212; <strong>finding usable data.</strong></p><p>Many YouTube tutorials gloss over this stage because collecting data can be a pain, but in real projects you have to source it yourself. The bottleneck usually looks like one of two things:</p><ul><li><p>you lose days trying to build scrapers (often with ChatGPT&#8217;s help), or</p></li><li><p>you simply don&#8217;t know where to find analysis-ready data.</p></li></ul><p>So you copy someone&#8217;s code&#8230; and it breaks. Now you&#8217;re left wondering: <em>Did the website change? Is my environment broken? Did the site upgrade its bot protection?</em></p><p>You have no idea where the problem is, and the frustration kills your momentum.</p><p>The easier path &#8212; especially when starting out &#8212; is to use <strong>reliable shortcuts. </strong>In football analytics, those shortcuts are community-built wrappers like <strong><a href="https://soccerdata.readthedocs.io/en/latest/">soccerdata</a></strong> and <strong><a href="https://scraperfc.readthedocs.io/en/latest/">scraperfc</a></strong>.</p><p>These packages exist because people in the analytics community created them so <em>you don&#8217;t have to build scrapers yourself.</em> They let you load team, match, and event data across multiple leagues in minutes, using simple one-liners.</p><p>Spend your time analysing football &#8212; not fighting HTML (at least not in the beginning).</p><div><hr></div><h3><strong>Mistake #3 &#8212; </strong><em><strong>Letting pandas slow you down</strong></em></h3><p>You&#8217;ve finally collected your football data. Naturally, you want to jump straight to the fun part &#8212; plotting visuals, building models, proving your point.</p><p>Not so fast.</p><p>In real projects, the bottleneck isn&#8217;t the chart or the model. It&#8217;s getting your data into a shape where those things <em>even work.</em></p><p>That stage is called <strong>wrangling</strong> &#8212; cleaning, transforming, structuring &#8212; and seasoned analysts joke that it eats <strong>80% of every project. </strong>It&#8217;s funny only because it&#8217;s true.</p><p>Sure, some paid feeds or public repos give you neat, tidy tables. But the moment you combine sources or scrape data yourself, chaos appears: missing values, inconsistent team names, wrong data types, tables shaped like abstract art.</p><p>Every tiny issue compounds. This is where frustration spikes.</p><p>For years, the default tool was <em><strong><a href="https://pandas.pydata.org/">pandas</a> </strong></em>&#8212; every tutorial on Earth seemed to start with: <code>import pandas as pd</code>.</p><p>And soon you&#8217;re staring at code like:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l11r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l11r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 424w, https://substackcdn.com/image/fetch/$s_!l11r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 848w, https://substackcdn.com/image/fetch/$s_!l11r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 1272w, https://substackcdn.com/image/fetch/$s_!l11r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l11r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png" width="1064" height="256" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:256,&quot;width&quot;:1064,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l11r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 424w, https://substackcdn.com/image/fetch/$s_!l11r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 848w, https://substackcdn.com/image/fetch/$s_!l11r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 1272w, https://substackcdn.com/image/fetch/$s_!l11r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44275fe8-7702-4f55-bb58-a24c03bc3ee6_1064x256.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And thinking:<em> &#8220;How am I supposed to remember this?&#8221;</em> Welcome to <strong>pandas bracket soup</strong>.</p><p>The Fix? Use <em><strong><a href="https://pola.rs/">Polars</a></strong></em> &#8211; a modern, readable and fast library. Instead of nested brackets and constant index resets, <em><strong>Polars reads like plain English</strong></em>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xrQI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xrQI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 424w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 848w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 1272w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xrQI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png" width="946" height="224" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:224,&quot;width&quot;:946,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xrQI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 424w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 848w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 1272w, https://substackcdn.com/image/fetch/$s_!xrQI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd9c7a1f-43a6-4152-bae5-1f91f5c3a84b_946x224.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If your wrangling code is readable, <strong>you learn faster. </strong></p><p>Instead of wrestling with syntax, you stay focused on the football question.</p><div><hr></div><h3><strong>Mistake #4 &#8212; </strong><em><strong>Jumping into advanced visuals without mastering the basics</strong></em></h3><p>You&#8217;ve collected your data. You&#8217;ve wrangled it into shape. Now comes the part that feels the most rewarding: <strong>turning numbers into visuals.</strong></p><p>But this is where many beginners hit a wall.</p><p>You search GitHub, find someone&#8217;s beautiful shot map or radar chart, copy the template &#8230; and then spend two hours tweaking fonts, colours, and layout. You&#8217;re focussed on styling instead of learning fundamentals.</p><p>The real bottleneck isn&#8217;t Python syntax. Most visuals take just a few lines of code. The bottleneck is <strong>not knowing what to plot, or why. </strong><em>&#8220;Is this a scatter? A bar? A line? A radar?&#8221;</em> So you jump into advanced football charts without first learning the basics.</p><p>Here&#8217;s the thing nobody explains: A shot map is just a <strong>scatter plot</strong> on a pitch. An xG flow is just a <strong>line chart</strong> over time. A radar is just a <strong>bar chart</strong>, arranged differently.</p><p>If you understand the fundamentals (scatter, line, bar etc.) &#8212; you can build the football-specific visuals later with (greater) confidence.</p><p>So focus on the fundamentals first, templates later.</p><p>Start with <em><strong><a href="https://matplotlib.org/">Matplotlib</a></strong></em> to learn the core chart types and how to shape data for them. Then add <em><strong><a href="https://mplsoccer.readthedocs.io/en/latest/">mplsoccer</a></strong></em> to place those charts on a football pitch when you&#8217;re ready. </p><div><hr></div><h3><strong>Mistake #5 &#8212; </strong><em><strong>Treating modelling like black-box magic</strong></em></h3><p>You&#8217;ve gathered your data, wrangled the mess, and even sketched a few charts. Now every football guru on Twitter is going to ask, <em>&#8220;Great&#8212;so what does this mean for the next match? The next season? The next transfer?&#8221;</em>.</p><p>Welcome to data modelling: the stage where history turns into actionable predictions &#8230; and the stage every beginner thinks <em>is</em> the whole show.</p><p>Newcomers often picture this step as black-box AI magic&#8212;machine learning this, neural networks that. In reality, most useful models boil down to a few clear ideas and a single line of code that does the heavy lifting. The hard part isn&#8217;t running a model; it&#8217;s <strong>framing the question</strong>, <strong>choosing the right tool</strong>, and <strong>interpreting results without fooling yourself</strong>.</p><p>The biggest trap beginners fall into is <strong>jumping straight to complex algorithms</strong> without understanding the mechanics or the &#8220;why&#8221; behind them.</p><p>The truth is, if you focus on just <strong>one algorithm per key machine learning task</strong>, you&#8217;ll cover 80% of what you&#8217;ll ever need.</p><p>In practice, that means mastering:</p><ul><li><p>Two <strong>supervised</strong> algorithms &#8212; <em>Linear Regression</em> (for predictions) and <em>Logistic Regression</em> (for classifications).</p></li><li><p>Two <strong>unsupervised</strong> algorithms &#8212; <em>K-Means Clustering</em> (for grouping) and <em>PCA</em> (for dimensionality reduction).</p></li></ul><p>Those four alone will prepare you for the vast majority of real-world problems you&#8217;ll face. Once you understand the mechanics &#8212; how to run them, how to read results, and how to apply them &#8212; then you can move on to the fancier stuff like ensemble models or XGBoost.</p><p>With <em><strong><a href="https://scikit-learn.org/stable/">scikit-learn</a></strong></em>, most of these take a single line of code. The real work lies in <strong>framing the question</strong> and <strong>interpreting the output</strong>.</p><p>And speaking from experience &#8212; you&#8217;d be surprised how often, even in the business world, a simple linear regression delivers great results. </p><p>Just remember: <em>simple is smooth, and smooth is fast.</em></p><p>You don&#8217;t need neural networks to start. You need a <strong>question &#8594; a simple model &#8594; an insight</strong>.</p><div><hr></div><p>Boom &#8212; those were the 5 biggest traps beginners fall into when learning Python for football.</p><p>Thanks for reading,</p><p><em>Martin</em></p>]]></content:encoded></item><item><title><![CDATA[Elliot Anderson and the Art of Showing Just Enough Data]]></title><description><![CDATA[So Josh Williams just tweeted this &#8212; a great little bit of football analytics on Sky Sports.]]></description><link>https://www.transferscience.com/p/elliott-anderson-and-the-art-of-showing</link><guid isPermaLink="false">https://www.transferscience.com/p/elliott-anderson-and-the-art-of-showing</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Mon, 03 Nov 2025 23:57:21 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/cca2990c-c5e2-4987-a263-675dba1e7989_1366x1228.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So <a href="https://substack.com/@distancecovered">Josh Williams</a> just tweeted this &#8212; a great little bit of football analytics on Sky Sports.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://x.com/DistanceCovered/status/1985435841104396422" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EKKy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 424w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 848w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 1272w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EKKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png" width="520" height="467.30897009966776" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1082,&quot;width&quot;:1204,&quot;resizeWidth&quot;:520,&quot;bytes&quot;:919196,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://x.com/DistanceCovered/status/1985435841104396422&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.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_!EKKy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 424w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 848w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.png 1272w, https://substackcdn.com/image/fetch/$s_!EKKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd579f0b0-2aea-490d-8798-96001fd70a49_1204x1082.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>And it&#8217;s not the first time I&#8217;ve stumbled across Elliot Anderson&#8217;s name this season either.</p><p>So, since I&#8217;m officially <em>back</em> (after a long summer break), I thought &#8212; why not do a quick, improvised <strong>Python Football Review</strong>?</p><p>Welcome to <em><strong>The Python Football Review</strong></em><strong> #013</strong>, where we&#8217;ll recreate Sky Sports&#8217; figure in just a few minutes using Python.</p><div><hr></div><h3>Step 1 &#8212; Collecting the Data</h3><p>We&#8217;ll start with the basics. Install <code>soccerdata</code> to scrape data from Opta via <strong>FBref</strong>, and import it alongside <code>polars</code> (for easy wrangling) and <code>matplotlib</code> (for plotting).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0iWT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0iWT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 424w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 848w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 1272w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0iWT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png" width="350" height="204.2622950819672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:610,&quot;resizeWidth&quot;:350,&quot;bytes&quot;:60934,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.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_!0iWT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 424w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 848w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 1272w, https://substackcdn.com/image/fetch/$s_!0iWT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3b910fdf-0ecb-4575-9d3b-98c5a94c9c3c_610x356.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>From FBref, <em><strong>tackles</strong></em> live in the defensive stats, while <em><strong>progressive passes</strong></em> come from the standard stats. No, FBref doesn&#8217;t have <em><strong>line-breaking passes</strong></em>, but progressive passes are the closest we can get &#8212; so we&#8217;ll take them and move on.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yrmI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yrmI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 424w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 848w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 1272w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yrmI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png" width="544" height="156.3116883116883" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:354,&quot;width&quot;:1232,&quot;resizeWidth&quot;:544,&quot;bytes&quot;:82130,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.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_!yrmI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 424w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 848w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 1272w, https://substackcdn.com/image/fetch/$s_!yrmI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1aa123e9-ffd1-4dc8-b3e2-401365fa0b9a_1232x354.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Step 2 &#8212; Wrangling the Data</h3><p><code>soccerdata</code> returns pandas DataFrames, but I prefer working in <strong>Polars</strong> for its clarity. So, we convert everything to Polars, rename our columns of interest, and keep only what we need.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uyi2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uyi2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 424w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 848w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 1272w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uyi2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png" width="510" height="279.72727272727275" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:724,&quot;width&quot;:1320,&quot;resizeWidth&quot;:510,&quot;bytes&quot;:155334,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.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_!Uyi2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 424w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 848w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.png 1272w, https://substackcdn.com/image/fetch/$s_!Uyi2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4327f6cc-a5db-47d8-81d6-d7a4c6ad6c77_1320x724.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>Next, we join the two datasets, create <em>tackles per 90</em> and <em>progressive passes per 90</em>, and filter for midfielders only. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tBRy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tBRy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 424w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 848w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 1272w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tBRy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png" width="606" height="224.33653846153845" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:539,&quot;width&quot;:1456,&quot;resizeWidth&quot;:606,&quot;bytes&quot;:114418,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.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_!tBRy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 424w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 848w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 1272w, https://substackcdn.com/image/fetch/$s_!tBRy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F120b55c9-45dd-4cd7-b4c6-875823cbe45a_1524x564.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>After this step, we&#8217;re left with a clean DataFrame of <strong>102 midfielders</strong> &#8212; ready to visualize.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PDRW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PDRW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 424w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 848w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 1272w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PDRW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png" width="1456" height="574" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:574,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:142133,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.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_!PDRW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 424w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 848w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.png 1272w, https://substackcdn.com/image/fetch/$s_!PDRW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff52a6d70-0638-40a6-83a2-fc046597dc5f_1644x648.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><h3>Step 3 &#8212; Visualizing</h3><p>Now that we&#8217;ve got our cleaned dataset, it&#8217;s time for making the visual. </p><p>We&#8217;ll create a simple scatter plot, where each dot represents a player &#8212; progressive passes on the x-axis, tackles on the y-axis.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!29zl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!29zl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 424w, https://substackcdn.com/image/fetch/$s_!29zl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 848w, https://substackcdn.com/image/fetch/$s_!29zl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 1272w, https://substackcdn.com/image/fetch/$s_!29zl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!29zl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png" width="550" height="477.6957163958641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1176,&quot;width&quot;:1354,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:241219,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.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_!29zl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 424w, https://substackcdn.com/image/fetch/$s_!29zl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 848w, https://substackcdn.com/image/fetch/$s_!29zl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.png 1272w, https://substackcdn.com/image/fetch/$s_!29zl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F137cbabf-7335-4208-95ec-0fd78171f0c2_1354x1176.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 here is our scatter plot. </p><p>Right away, <strong>Nottingham Forest&#8217;s </strong><em><strong>Elliot Anderson</strong></em> jumps off the chart &#8212; an aggressive ball-winner (26 tackles) <em>and</em> an exceptional progressive passer (89 progressive passes).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iEVl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iEVl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 424w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 848w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 1272w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iEVl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png" width="1456" height="857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:857,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!iEVl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 424w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 848w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.png 1272w, https://substackcdn.com/image/fetch/$s_!iEVl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59ce489f-5fcd-4b75-88b8-0a570f25b298_1498x882.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>If you look closely at Sky Sports&#8217; version, you&#8217;ll see their metrics are per 90 minutes.<br>So, let&#8217;s replicate that too. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7yiZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7yiZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 424w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 848w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 1272w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7yiZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png" width="522" height="462.1628959276018" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1174,&quot;width&quot;:1326,&quot;resizeWidth&quot;:522,&quot;bytes&quot;:253941,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.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_!7yiZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 424w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 848w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.png 1272w, https://substackcdn.com/image/fetch/$s_!7yiZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dddb6b5-e7ad-42fe-b523-5c97dcc7ef05_1326x1174.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>Once we adjust for minutes played, <em><strong>Anderson</strong></em> still stands out &#8212; averaging <strong>8.9 progressive passes</strong> and <strong>2.6 tackles per 90 minutes</strong>. But he&#8217;s no longer quite the outlier he appeared to be in the first figure. </p><p>What happened? Well, some players in the dataset likely have played far fewer games than he has &#8212; which naturally inflates their per-game averages.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!koSt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!koSt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 424w, https://substackcdn.com/image/fetch/$s_!koSt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 848w, https://substackcdn.com/image/fetch/$s_!koSt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 1272w, https://substackcdn.com/image/fetch/$s_!koSt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!koSt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png" width="1456" height="868" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:868,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157256,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.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_!koSt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 424w, https://substackcdn.com/image/fetch/$s_!koSt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 848w, https://substackcdn.com/image/fetch/$s_!koSt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.png 1272w, https://substackcdn.com/image/fetch/$s_!koSt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84bbe7d8-ae46-4319-ab50-958904cf130c_1496x892.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>So, once we account for that (for example, by keeping only players who&#8217;ve played at least <strong>six matches</strong>), we end up right where we expected to be from the start.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_d5z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_d5z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 424w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 848w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 1272w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_d5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png" width="1456" height="879" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:879,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:145845,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.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_!_d5z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 424w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 848w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.png 1272w, https://substackcdn.com/image/fetch/$s_!_d5z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b4fc90f-b599-4681-b974-bf64c30d4c01_1464x884.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>This small exercise is a great reminder of what matters when visualizing data.<br>It&#8217;s not just about plotting numbers &#8212; it&#8217;s about making sure the sample is <em>representative</em>. Because if you include everyone without context, outliers can easily distort the message.</p><p>It&#8217;s also a reminder that with the right filters, you can subtly shape which stories (and which players) stand out (I am not saying that&#8217;s the case here). That&#8217;s why even Sky&#8217;s version says <em>&#8220;selected midfielders.&#8221;</em> Filtering matters. (And kudos to them for making that clear).</p><p>Anderson is an exceptional player. Sky Sports are a trusted source. This little project simply serves as a reminder of the dos and don&#8217;ts in data visualization. Here, everything is perfectly valid &#8212; but it also shows how, depending on the filters you use, the picture can shift.</p><p>Here&#8217;s the same figure again, this time keeping only players who&#8217;ve played at least <strong>three full matches</strong> &#8212; which is still a fair cut-off (roughly 30% of the season so far).</p><p>So Curtis Jones for Player of the Season? Maybe not (yet?) &#8230; but you get the point.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fHRx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fHRx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 424w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 848w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 1272w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fHRx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png" width="652" height="384.2142857142857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:858,&quot;width&quot;:1456,&quot;resizeWidth&quot;:652,&quot;bytes&quot;:157161,&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.pythonfootball.com/i/177934508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.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_!fHRx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 424w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 848w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.png 1272w, https://substackcdn.com/image/fetch/$s_!fHRx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0802f98c-8f45-40bc-9520-79b6499cff96_1466x864.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><h3>Wrapping Up</h3><p>This was a small but fun reminder of two things:</p><ol><li><p>With Python, you can recreate Sky Sports-worthy analytics visuals in minutes (even if the Matplotlib aesthetics we used here still lag a bit behind).</p></li><li><p>Data always needs context &#8212; even the cleanest chart can mislead if you forget to filter carefully. (Not that I&#8217;m saying there&#8217;s one &#8220;proper&#8221; filter here &#8212; but you see what I mean)</p></li></ol><p>And with that, we wrap up this short, improvised edition of the <em><strong>Python Football Review</strong></em>.</p><p>Ah &#8212; it feels <em>so good</em> to be back.</p><p>Thanks for reading,</p><p><em><strong>Martin</strong></em></p><p><em>P.S. As usual, you can grab the code below.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/odnrongb273utop/PFR_013.ipynb/file&quot;,&quot;text&quot;:&quot;Grab the Python code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/odnrongb273utop/PFR_013.ipynb/file"><span>Grab the Python code</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Why Visuals Matter More Than You Think ]]></title><description><![CDATA[The beginner&#8217;s guide to avoiding visualisation traps &#8212; and how to fix them fast]]></description><link>https://www.transferscience.com/p/why-visuals-matter-more-than-you</link><guid isPermaLink="false">https://www.transferscience.com/p/why-visuals-matter-more-than-you</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 07 Aug 2025 08:01:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kz2V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #012</em> &#8212; and to our ongoing <strong>&#8220;in plain English&#8221;</strong> series.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kz2V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kz2V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kz2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png" width="488" height="488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/261dd25b-1449-47f8-8348-9594b6a119b9_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;:488,&quot;bytes&quot;:1965905,&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.pythonfootball.com/i/170258228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_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_!kz2V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!kz2V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F261dd25b-1449-47f8-8348-9594b6a119b9_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>Today, we&#8217;re zooming in on <strong>data visualisation</strong> &#8212; what it is, why it matters, and how it fits into a typical football analytics workflow. Even though the term <em>kind of</em> explains itself, there's more nuance than you might think.</p><p>There&#8217;ll be <strong>no Python code</strong> in this one &#8212; just ideas, insights, and some visuals to help you build intuition.</p><div><hr></div><h3>Quick heads-up</h3><p>I&#8217;m working on a <em><strong>Fast-Track</strong></em><strong> Guide to Football Analytics with Python</strong> &#8212; designed to cut through the fluff and get you building your first football data project <em>fast</em>.</p><p>If templates and walkthroughs sound like your thing, join the waitlist below. It&#8217;s launching in early September.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pythonfootball.com/survey/3897364?token=&quot;,&quot;text&quot;:&quot;Join the Wait List&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pythonfootball.com/survey/3897364?token="><span>Join the Wait List</span></a></p><p>Alright, let&#8217;s get into it.</p><div><hr></div><h1>A (good) graph is worth a thousand words?</h1><p>Why do we make graphs?</p><p>Seems obvious, right? To visually represent our analysis.</p><p>But here&#8217;s the catch: in the rush to produce slick-looking visuals, we often forget the <strong>actual point</strong> of a graph &#8212; <strong>to reveal patterns and problems that numbers alone </strong><em><strong>can&#8217;t</strong></em><strong> show</strong>.</p><p>Allow me to introduce you to...</p><h1>Anscombe&#8217;s Quartet: When Statistics Lie</h1><p>In 1973, statistician Francis Anscombe made a powerful point.</p><p>He created four datasets &#8212; now known as <strong>Anscombe&#8217;s Quartet</strong> &#8212; that all had <strong>nearly identical statistical summaries</strong>: same mean, same variance, same correlation, same regression line.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hzt7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hzt7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 424w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 848w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 1272w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hzt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png" width="631" height="405.64285714285717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:765,&quot;width&quot;:1190,&quot;resizeWidth&quot;:631,&quot;bytes&quot;:958075,&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.pythonfootball.com/i/170258228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.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_!Hzt7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 424w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 848w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.png 1272w, https://substackcdn.com/image/fetch/$s_!Hzt7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6140d9e-5a54-400d-8e3f-db3a29420feb_1190x765.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>But when plotted, they looked radically different.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-SXF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-SXF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-SXF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg" width="607" height="449.72480948348857" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1181,&quot;resizeWidth&quot;:607,&quot;bytes&quot;:53873,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/170258228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-SXF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 424w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 848w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!-SXF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F52447bd6-f9cc-45c9-a094-9b2ca3281a71_1181x875.jpeg 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>Each quadrant tells a different story:</p><ul><li><p><strong>Top Left: Linear Relationship</strong></p><p>What you&#8217;d expect. A clean trend. Visuals and stats agree.</p></li><li><p><strong>Top Right: Non-Linear Relationship</strong></p><p>The correlation exists, but it&#8217;s not linear. A regression line would mislead.</p></li><li><p><strong>Bottom Left: Outlier Distortion</strong></p><p>One rogue point skews the analysis. You&#8217;d miss this without a plot.</p></li><li><p><strong>Bottom Right: High-Leverage Point</strong></p><p>A single point creates the illusion of a relationship. Remove it, and it vanishes.</p></li></ul><p><strong>Lesson:</strong> Always visualise your data. Don&#8217;t trust the stats alone.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>So what <em>is</em> data visualisation, really?</h1><p>In theory, data visualisation is the use of graphs and figures to communicate the insights hidden in your data.</p><p>In practice, it serves <strong>two different purposes</strong> (especially in a football analytics workflow):</p><ol><li><p>Visuals <em>before</em> modeling &#8212; to <strong>explore</strong> and clean your data.</p></li><li><p>Visuals <em>after</em> modeling&#8212;to <strong>communicate</strong> your findings to others.</p></li></ol><p>Let&#8217;s unpack both.</p><div><hr></div><h1>Data Visualisation <em>Before</em> Modeling</h1><p>Before you train any model &#8212; or even start building one &#8212; you should always look at your data visually.</p><p>Why?</p><ul><li><p>To <strong>spot outliers</strong></p></li><li><p>To <strong>see patterns</strong> that stats might hide</p></li><li><p>To <strong>double-check</strong> missing values, or duplicates</p></li><li><p>To <strong>rethink aggregations</strong> (maybe total annual wage makes more sense than average?)</p></li></ul><p>This &#8220;visual inspection&#8221; often sends you back to the wrangling phase to fix or reshape your dataset &#8212; and that&#8217;s a good thing.</p><h3>Most-used graphs at this stage:</h3><ul><li><p><strong>Scatter plots</strong> &#8211; Show relationships between two numeric variables</p></li><li><p><strong>Histograms</strong> &#8211; Show the distribution of a single variable</p></li><li><p><strong>Box plots</strong> &#8211; Highlight outliers and spread of a variable</p></li><li><p><strong>Line plots</strong> &#8211; Track a variable over time</p></li><li><p><strong>Bar charts</strong> &#8211; Compare categorical groups</p></li></ul><p>These are your <strong>exploratory workhorses</strong> &#8212; the ones you&#8217;ll return to over and over.</p><blockquote><p>The Python Toolstack? Usually just <code>matplotlib</code> or <code>seaborn</code>&#8212; one line of code gets you 80% of the way there.</p></blockquote><div><hr></div><h1>Data Visualisation <em>After</em> Modeling</h1><p>This is where data visualization becomes <strong>the final product</strong>.</p><p>You&#8217;ve done the heavy lifting. Now it&#8217;s time to <em>show</em> your insights &#8212; clearly and convincingly.</p><p>And football has its own set of specialized visuals for this:</p><ul><li><p><strong>Radar charts / Pizza plots</strong> &#8211; Compare player profiles across attributes</p></li><li><p><strong>Pass maps</strong> &#8211; Show passing patterns or clusters</p></li><li><p><strong>Pass networks</strong> &#8211; Visualize team structure and ball movement</p></li><li><p><strong>Heat maps</strong> &#8211; Show player or team activity zones</p></li><li><p><strong>Shot maps</strong> &#8211; Reveal shooting tendencies and goal threats</p></li><li><p><strong>xG Flow charts</strong> &#8211; Track expected goals across match time</p></li></ul><blockquote><p>The Python Toolstack? Usually <code>matplotlib</code> and <code>seaborn</code> again, combined with <code>mplsoccer</code>, a library tailored to football analytics.</p></blockquote><div><hr></div><h2>A Few Rules of Thumb From 10 Years in Consulting</h2><p>Rendering a simple figure is, in most cases, a one-liner. The real challenge is almost never the plotting itself &#8212; it&#8217;s getting your data into the right format and shape.</p><p>I told you wrangling was important (if you missed the football data wrangling issue, grab it <a href="https://www.pythonfootball.com/p/football-data-wrangling-in-plain?r=5mroiq">here</a>).</p><p>Of course, you still need to get familiar with different visualisation libraries and functions. But that&#8217;s generally the <em>easier</em> part.</p><h2>The Real Bottlenecks</h2><p>There are two major hurdles that beginners face when visualising data:</p><ul><li><p><strong>Not knowing what you want to show.</strong></p></li></ul><p>This is the hardest part. Especially early on, it's easy to feel lost &#8212; you have the data, but you don&#8217;t know what story to tell or what figure would best show it. </p><p>Here is a thought-starter:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Nr4R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Nr4R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 424w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 848w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 1272w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Nr4R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png" width="1061" height="795" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:795,&quot;width&quot;:1061,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:218170,&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.pythonfootball.com/i/170258228?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.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_!Nr4R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 424w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 848w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.png 1272w, https://substackcdn.com/image/fetch/$s_!Nr4R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d645a3e-5025-472a-9410-dc96746ff7b4_1061x795.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><ul><li><p><strong>Not knowing how to wrangle the data into shape.</strong></p></li></ul><p>You might have an idea (&#8220;I want a scatter plot showing Shooting Goals Added/90 vs xG/90 per player&#8221;), but you can&#8217;t quite get the DataFrame to that point. Wrangling data is a fundamental skill that will follow you everywhere.</p><p>For beginners, the easiest way to get started is with <code>polars</code> &#8212; lightning fast, simpler syntax (the code reads like a recipe), and easy to revisit after a break.</p><p>If you get past these two &#8212; that is, you know what to graph <strong>and</strong> you can wrangle your way into the right shape &#8212; you&#8217;ve done <strong>80%</strong> of the visualisation work.</p><h2>The Last 20%: Branding and Beautifying</h2><p>As with most things in life, going from 80% to 100% takes <strong>disproportionate effort</strong>. It&#8217;s where diminishing returns kick in. But let&#8217;s not kid ourselves &#8212; a <strong>beautiful</strong> figure often stands out because of:</p><ul><li><p>Clean <strong>labels</strong> and <strong>titles</strong></p></li><li><p>Thoughtful <strong>color palettes</strong></p></li><li><p>Well-placed <strong>annotations</strong></p></li><li><p>Consistent <strong>fonts and styling</strong></p></li></ul><p>Take a look at the most popular football analytics accounts on Twitter: they have a recognisable aesthetic. That&#8217;s their visual branding &#8212; a consistent combination of font choices, color themes, and annotation styles.</p><p>As a beginner though, your job is <em>not</em> to perfect every tiny detail. Your job is to <strong>get the fundamentals right</strong> &#8212; and trust that polish will come with time.</p><p>The good news? Once you design your own visualisation template (or adapt an existing one), you rarely need to touch it again. That&#8217;s the power of templating.</p><div><hr></div><p><strong>Boom &#8212; that was data visualisation fundamentals in plain English.</strong></p><p>Data visualisation isn&#8217;t just about making pretty charts.</p><p>It&#8217;s about <strong>thinking clearly</strong>, <strong>communicating honestly</strong>, and <strong>seeing what&#8217;s really there</strong> &#8212; even when the stats try to tell a different story.</p><p>If you enjoyed this post, consider sharing it with someone who might find it useful.</p><p>If you&#8217;d like access to Python football templates, stick around &#8212; or join the waitlist for the upcoming <em>Fast-Track Guide to Football Analytics with Python</em>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pythonfootball.com/survey/3897364?token=&quot;,&quot;text&quot;:&quot;Join the Wait List&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pythonfootball.com/survey/3897364?token="><span>Join the Wait List</span></a></p><p>Either way, deep dives are coming.</p><p>Comments and shares are always appreciated.</p><p>Thanks for reading&#8212;see you next Thursday!</p><p><em><strong>Martin</strong></em></p><p><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[Football Data Wrangling (in plain English)]]></title><description><![CDATA[Why 80 % of data science is about wrangling&#8212;and the Python shortcut that makes it painless]]></description><link>https://www.transferscience.com/p/football-data-wrangling-in-plain</link><guid isPermaLink="false">https://www.transferscience.com/p/football-data-wrangling-in-plain</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 31 Jul 2025 08:01:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0Yr7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #011.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0Yr7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0Yr7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0Yr7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png" width="438" height="438" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9b178bd-a6a4-443d-a0e1-d8c395481617_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;:438,&quot;bytes&quot;:1789181,&quot;alt&quot;:&quot;&quot;,&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.pythonfootball.com/i/169327855?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0Yr7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!0Yr7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9b178bd-a6a4-443d-a0e1-d8c395481617_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>Seasoned analysts will tell you that <strong>80 % of any football data project is spent on one thing: wrangling</strong>. If the term is new to you, think of it as the combined art of <em>cleaning</em> and <em>transforming</em> raw tables so your analysis doesn&#8217;t fall apart later.</p><p>In this issue you&#8217;ll learn:</p><ul><li><p>what data wrangling <em>really</em> means,</p></li><li><p>why even &#8220;clean&#8221; datasets still trip people up,</p></li><li><p>the common bottlenecks that beginners face, and</p></li><li><p>the one Python library that makes wrangling faster&#8212;and far less painful.</p></li></ul><p>Enjoy!</p><div><hr></div><p>Before we dive in &#8212; quick heads-up.</p><p>I&#8217;m working on a <em><strong>Fast-Track</strong></em><strong> Guide to Football Analytics with Python</strong> &#8212; designed to cut through the usual beginner roadblocks and get you hands-on, fast.</p><p>It&#8217;s packed with ready-to-use templates and practical case studies, so you can skip the fluff and start exploring football data with confidence.</p><p><strong>Interested?</strong> Join the waitlist below:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pythonfootball.com/survey/3897364?token=&quot;,&quot;text&quot;:&quot;Join the Waitlist&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.pythonfootball.com/survey/3897364?token="><span>Join the Waitlist</span></a></p><p>Okay, let&#8217;s dive in.</p><div><hr></div><h1><strong>1 &#8211; Cleaning</strong></h1><p>Last week, you learned the four ways to collect football data. If you missed that issue, you can catch up <a href="https://www.pythonfootball.com/p/football-data-collection-in-plain?r=5mroiq&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=false">here</a>. Once you&#8217;ve collected the data, your next move is to clean it.</p><h4><em><strong>But wait, Martin&#8212;isn&#8217;t the data I just downloaded already clean?</strong></em></h4><p>It&#8217;s tempting to think so. If your feed comes from an internal pipeline, a paid JSON API, or a trusted public hub like FBref, the tables usually <strong>look</strong> pristine. Yet they almost always hide little traps:</p><ul><li><p>A handful of xG values are missing&#8212;models choke on blank rows.</p></li><li><p>Brighton appear as &#8220;Brighton&#8221;, &#8220;Brighton &amp; Hove Albion&#8221; and &#8220;BHAFC&#8221; across seasons. Pick one or your merges will explode.</p></li><li><p>Dates sneak in as plain text; numeric columns arrive as strings. Try plotting those and see what happens.</p></li></ul><p>Long story short: <strong>&#8220;collected&#8221; does not equal &#8220;analysis&#8209;ready.&#8221;</strong> The safest mindset is to assume every dataset is dirty until proven clean.</p><p>Once you&#8217;ve fixed the nulls, unified names, and straightened data types, you can move on to the fun part: transforming.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1><strong>2 &#8211; Transforming</strong></h1><p>Cleaning makes the data <em>safe</em>; transforming makes it <em>useful</em>.</p><p>Here&#8217;s what usually happens in this stage:</p><ul><li><p><strong>Zoom in</strong> &#8211; Slice the universe down to what matters: maybe just Premier League matches since 2014/15, or only Arsenal home fixtures, or every shot taken after the 75&#8209;minute mark.</p></li><li><p><strong>Create new metrics</strong> &#8211; Raw columns rarely answer football questions on their own. You might turn <code>xG</code> and <code>minutes</code> into <em>xG per 90 min,</em> combine passes into a <em>possession percentage</em>, or compute <em>contributions</em> as goals plus assists.</p></li><li><p><strong>Summarise up a level</strong> &#8211; Event data might be often <em>too</em> granular for the question you&#8217;re asking. Aggregate it until each row matches the decision-making level you care about: turn <em>individual shots</em> into <strong>total xG per match</strong> or combine <em>match records</em> into <strong>team-season aggregates.</strong></p></li><li><p><strong>Reshape the table</strong> &#8211; Statistical models prefer &#8220;one <em>row</em> = one observation.&#8221; That could mean pivoting <em>long</em> (each team a separate row). A graph may require &#171; one <em>column</em> = one observation &#187; and that could mean pivoting wide (each team in its own column). Switching formats is routine.</p></li><li><p><strong>Stitch multiple sources together</strong> &#8211; Want to add betting odds or other non-performance data? You&#8217;ll merge tables on date, match ID, or team name; uniform naming from the <em>cleaning</em> step is what keeps these joins from exploding.</p></li><li><p><strong>Scale where needed</strong> &#8211; Some algorithms behave better when inputs sit on a common scale. Simple min&#8209;max scaling is often enough.</p></li></ul><p>A single project may loop through these tasks several times: aggregate, spot an outlier, go back, filter differently, aggregate again. The end&#8209;product is one tidy, logically structured DataFrame you can feed straight into a model or visual.</p><p>The goal is simple: produce a single, well&#8209;structured DataFrame your model, chart, or dashboard can consume without complaint.</p><p><strong>Cleaning + transforming = wrangling</strong>&#8212;and that&#8217;s where 80 % of real project time goes.</p><p>Told you it was important.</p><div><hr></div><h1>3 &#8211; How do you actually wrangle data in Python?</h1><p>For years the default answer was <code>pandas</code>.</p><p>Pandas gives Python a DataFrame object (Python itself has none), and every tutorial on Earth seems to start with <code>import pandas as pd</code>.</p><p>But here&#8217;s the trouble: the API is showing its age.</p><p>You juggle <code>as_index=False</code>, fight the dreaded <em>SettingWithCopyWarning</em>, and chain methods that read nothing like plain English. Great library&#8212;just (dare I say it) not beginner&#8209;friendly.</p><p>A newer option, <code>polars</code>, fixes all three pain&#8209;points:</p><ul><li><p><strong>Faster</strong> &#8211; Under the hood it&#8217;s Rust, so large tables fly.</p></li><li><p><strong>Cleaner syntax</strong> &#8211; Verbs like <code>select</code>, <code>filter</code>, <code>with_columns</code> read like a recipe.</p></li><li><p><strong>Short learning curve</strong> &#8211; Fewer edge&#8209;case arguments, no copy&#8209;view headaches.</p></li></ul><h4>If someone offered you <em>standard</em> vs. <em>faster, clearer, easier to remember</em>, which would you pick?</h4><p>Exactly.</p><p>Here&#8217;s a sample <code>Polars</code> code. For this exercise, we&#8217;ll use a <strong>2023/24 Fantasy Premier League</strong> dataset available on Github that contains ~ 30,000 rows, where each row records a single player&#8217;s stats for one Premier League gameweek. The data contains <strong>41 columns</strong> covering everything from goals and assists to minutes played, xG, xA, and more.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eL_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eL_V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 424w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 848w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 1272w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eL_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png" width="1456" height="407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:407,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110802,&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.pythonfootball.com/i/169327855?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.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_!eL_V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 424w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 848w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.png 1272w, https://substackcdn.com/image/fetch/$s_!eL_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16a61e64-620c-4233-b843-ffa877a2eee0_1830x512.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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wYHq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wYHq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 424w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 848w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 1272w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wYHq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png" width="1456" height="553" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:553,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92337,&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.pythonfootball.com/i/169327855?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.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_!wYHq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 424w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 848w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.png 1272w, https://substackcdn.com/image/fetch/$s_!wYHq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26399ce-3c9f-403d-8b56-a837b87f9c22_1470x558.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>If we want to wrangle the data to discover <strong>Arsenal&#8217;s top contributors in goals and assists</strong>, here&#8217;s how we could do it with Polars:</p><h3>A quick Polars demo</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I2Gi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I2Gi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 424w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 848w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 1272w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I2Gi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png" width="1046" height="694" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:694,&quot;width&quot;:1046,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143289,&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.pythonfootball.com/i/169327855?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.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_!I2Gi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 424w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 848w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.png 1272w, https://substackcdn.com/image/fetch/$s_!I2Gi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba1761f5-2c15-4f35-abe5-9a164d0f4a6c_1046x694.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>Try reading that line by line:</p><ol><li><p><code>read_csv</code> &#8211; load the file (using its <a href="https://raw.githubusercontent.com/vaastav/Fantasy-Premier-League/refs/heads/master/data/2023-24/gws/merged_gw.csv">URL</a>).</p></li><li><p><code>select</code> &#8211; keep only the columns we need.</p></li><li><p><code>filter</code> &#8211; keep only the Arsenal rows only.</p></li><li><p><code>with_columns</code> &#8211; add <code>assists + goals_scored</code> as <em>contributions</em>.</p></li><li><p><code>group_by</code><strong> / </strong><code>agg</code> &#8211; group by each player and aggregate his total contributions.</p></li><li><p><code>sort</code>  &#8211; rank the players by their contributions and show the top five.</p></li><li><p><code>head</code> - show the top 5 performers.</p></li></ol><p>That&#8217;s the entire story&#8212;no temporary variables, no <code>lambdas</code>, no warnings. Swap <code>select</code> for <code>merge</code> or <code>pivot</code> and you&#8217;ve covered 80 % of day&#8209;to&#8209;day wrangling.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EExb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EExb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 424w, https://substackcdn.com/image/fetch/$s_!EExb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 848w, https://substackcdn.com/image/fetch/$s_!EExb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 1272w, https://substackcdn.com/image/fetch/$s_!EExb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EExb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png" width="254" height="226.70093457943926" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:382,&quot;width&quot;:428,&quot;resizeWidth&quot;:254,&quot;bytes&quot;:33183,&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.pythonfootball.com/i/169327855?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.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_!EExb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 424w, https://substackcdn.com/image/fetch/$s_!EExb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 848w, https://substackcdn.com/image/fetch/$s_!EExb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 1272w, https://substackcdn.com/image/fetch/$s_!EExb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b608c32-6172-43a6-92cf-94b1eff3b387_428x382.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The point of this demo is to show that <strong>Polars reads like a recipe</strong> (it has tons of other advantages but that&#8217;s a story for another time). Even if you&#8217;ve never written a line of Python in your life, you&#8217;ll have no trouble following it. Better still, once you type it out, the syntax sticks&#8212;because you use clear, verb-style commands. </p><p>Next time you need to wrangle data, the steps will come right back to you, streamlining your workflow like nothing else. Speaking from experience here.</p><p>Now, <code>polars</code> won&#8217;t make every wrinkle disappear, but it removes a lot of the boilerplate that trips newcomers. Learn a dozen <em>verbs</em> and you&#8217;ll slice through datasets while everyone else is still Googling &#8220;Pandas groupby keeps index true/false?&#8221;</p><p>(And yes, Pandas is still the industry standard; we&#8217;ll look at bridging the two in a future issue.)</p><div><hr></div><h1><strong>4 &#8211; Rules of thumb from a decade in data consulting</strong></h1><ol><li><p><strong>Choose a library you can walk away from and still remember.</strong></p><p>If you might take a few weeks off, Polars&#8217; verb&#8209;style API is far easier to pick up again than Pandas&#8217; bracket soup.</p></li><li><p><strong>Assume every dataset is messy.</strong></p><p>Even &#8220;premium&#8221; feeds hide quirks&#8212;extra spaces in names, dashes instead of <code>NaN</code>, silent duplicates. Treat cleanliness as a hypothesis you must test, not a fact.</p></li><li><p><strong>Verify first, trust later.</strong></p><p>Quick descriptive stats (min, max, unique counts) expose impossible values before they poison your model.</p></li><li><p><strong>Name things clearly and consistently.</strong></p><p>Lower&#8209;case, snake_case, no spaces: <code>team_id</code>, <code>match_date</code>, <code>xg_total</code>. Future&#8209;you&#8212;and your join keys&#8212;will thank you.</p></li><li><p><strong>Interrogate every column.</strong></p><p>A header can lie. Ask &#8220;What exactly does <em>possession</em> mean here?&#8221; before you publish a chart based on it.</p></li><li><p><strong>Debug on a snack&#8209;size sample.</strong></p><p>Pivot won&#8217;t run on 100 k rows? Slice ten rows, fix the issue, then scale back up. Small chunks reveal problems fast.</p></li></ol><p>Stick to these habits and wrangling becomes routine rather than a recurring nightmare.</p><div><hr></div><p><strong>Boom&#8212;that&#8217;s data wrangling in plain English for absolute beginners.</strong></p><p>If this issue helped, feel free to pass it on. You now understand why most people stall at the wrangling stage&#8212;and how to jump ahead of 90 % of them.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/football-data-wrangling-in-plain?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/football-data-wrangling-in-plain?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I&#8217;m still tweaking the format, so hit reply and tell me what you&#8217;d like more (or less) of: shorter bites, deeper dives, extra Python snippets, or broader football concepts? </p><p>My goal is to build this newsletter <em>with</em> you, not just <em>for</em> you.</p><p>See you next Thursday,</p><p><strong>Martin</strong></p><p><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[Football Data Collection (in plain English)]]></title><description><![CDATA[The 4 Ways to Collect Football Data&#8212;and the Best Starting Point for Beginners]]></description><link>https://www.transferscience.com/p/football-data-collection-in-plain</link><guid isPermaLink="false">https://www.transferscience.com/p/football-data-collection-in-plain</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 24 Jul 2025 08:00:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/34793e12-2626-4796-ba78-e9decf4d72d6_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #010.</em></p><p>Today we&#8217;re tackling the unglamorous but absolutely critical first step in any football analytics project: <strong>collecting the data</strong>.</p><p>By the end of this issue you&#8217;ll know the <strong>4 main ways to source football data</strong>&#8212;and <strong>how to start pulling it with only a few lines of Python</strong>, all explained in <em>plain English</em>.</p><div><hr></div><p>Before we get started, just a quick heads-up.</p><p>I&#8217;ve started working on a beginner-friendly <em><strong>Fast-Track</strong></em><strong> Guide to Football Analytics with Python</strong>.</p><p>It will be packed with useful templates, practical case studies, and easy-to-follow explanations.</p><p>If you&#8217;d like to be the first to know when it launches (and maybe even grab an early-bird bonus), you can join the waitlist below:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.pythonfootball.com/survey/3897364?token=&quot;,&quot;text&quot;:&quot;Join the Waitlist&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.pythonfootball.com/survey/3897364?token="><span>Join the Waitlist</span></a></p><p>Okay, so grab a coffee, and let&#8217;s dive in.</p><div><hr></div><h1>What <em>Data Collection</em> Really Means</h1><p>Most coding courses hand you spotless CSVs. Real life doesn&#8217;t.</p><p>Unless you work somewhere that pipes cleaned match feeds straight to your desk, <strong>you are the data engineer</strong>. Your job is to move raw numbers&#8212;from a website, an API, or a database&#8212;onto your machine in a format you can actually use.</p><p>Ian Graham, Liverpool&#8217;s former Director of Research and the brains behind the first in-house analytics department in the Premier League, recalls sprinting into the office the morning after their 4-0 comeback against Barcelona just to open an analysis-ready match file. Lovely&#8212;if you have a dedicated data engineering team.</p><p>Most of us don&#8217;t.</p><p>So here&#8217;s how to do it yourself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!68qI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!68qI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!68qI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!68qI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!68qI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!68qI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png" width="618" height="618" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e097a112-18ae-4d12-b42e-44bcff9b7e4d_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;:618,&quot;bytes&quot;:1874110,&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.pythonfootball.com/i/168967691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_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_!68qI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!68qI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!68qI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!68qI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe097a112-18ae-4d12-b42e-44bcff9b7e4d_1024x1024.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><h1>1&#8212;Manual Copy</h1><p>Sometimes the fastest route is staring you in the face: open Understat or FBref, copy-paste the table into Excel, job done.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cCSM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cCSM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 424w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 848w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 1272w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cCSM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png" width="1456" height="585" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/db2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:585,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:344225,&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.pythonfootball.com/i/168967691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.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_!cCSM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 424w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 848w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.png 1272w, https://substackcdn.com/image/fetch/$s_!cCSM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdb2d049a-dacb-4b4f-813d-0e48723ef781_2172x872.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>There&#8217;s nothing technically tricky here&#8212;other than finding exactly what you need.</p><p>But manual work can&#8217;t be automated, and it doesn&#8217;t scale.</p><p><em>Thank you, Captain Obvious.</em></p><p>Still, for a quick sanity check or a one-off chart, copy-paste is quicker than spinning up a full scraper.</p><p>You can do even better: <strong>never start copying until you&#8217;ve checked GitHub or Kaggle.</strong></p><p>Chances are someone has already posted the dataset you need. If you can <code>read_csv()</code> or <code>read_html() </code>a clean file in a single line, take the gift and run.</p><div><hr></div><h1>2&#8212;Web Scraping</h1><p>The data you need isn&#8217;t always gift-wrapped. It may sit behind dynamic tables, dropdown menus, or JavaScript calls that no public wrapper touches. <strong>Web scraping</strong> is the art of writing a script that visits a page, finds the right pieces of the markup, and copies the numbers to your machine.</p><p>In practice you:</p><ol><li><p><strong>Request</strong> the page&#8217;s HTML.</p></li><li><p><strong>Parse</strong> its <em>nodes</em> (individual tags such as <code>&lt;tr&gt;</code> or <code>&lt;td&gt;</code> that hold text).</p></li><li><p><strong>Extract</strong> what you need and save it to a DataFrame.</p></li></ol><p><em>Expect a learning curve though.</em></p><p>You&#8217;ll juggle <strong>CSS selectors</strong> (mini-queries like <code>.table-row &gt; td:nth-child(3)</code> that tell Python &#8220;grab the 3rd cell in each row&#8221;), deal with cookies and CAPTCHAs, and respect <code>robots.txt</code> so you don&#8217;t hammer the host server.</p><p><strong>Typical Python toolkit</strong></p><ul><li><p><code>requests</code> + <code>BeautifulSoup</code> for quick and clean for static pages and simple tables.</p></li><li><p><code>Selenium</code> for spinning up a headless browser so you can click buttons, open dropdowns, and wait for JavaScript to load.</p></li><li><p><code>pandas.read_html()</code> &#8211; a one-liner that sometimes grabs simple tables without extra code (You can check out <span class="mention-wrap" data-attrs="{&quot;name&quot;:&quot;McKay Johns&quot;,&quot;id&quot;:15691582,&quot;type&quot;:&quot;user&quot;,&quot;url&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/152becb8-787f-4f56-992b-5ddf614750b6_4000x4000.jpeg&quot;,&quot;uuid&quot;:&quot;56928a26-355a-4e3e-9d71-ae2acdf72b44&quot;}" data-component-name="MentionToDOM"></span>&#8217;s brilliant explanation on <a href="https://www.youtube.com/watch?v=I0TB9m_hyCo">YouTube</a>).</p></li></ul><p>Scraping could fill a course by itself, but even basic skills pay off: once you automate a tricky site, the data updates are yours forever.</p><div><hr></div><p>Now, if you&#8217;d rather skip copy-pasting (too basic, not scalable) <strong>and</strong> avoid the overhead of building custom scrapers (steep learning curve, time-consuming upkeep), you have two smoother routes:</p><ol><li><p><strong>Pay for polished feeds</strong>&#8212;exactly what most pro clubs do. Providers like Opta, StatsBomb, or Wyscout deliver match files that are already cleaned and documented.</p></li><li><p><strong>Lean on community wrappers</strong>&#8212;open-source libraries that pull multiple seasons of advanced metrics with a single line of Python.</p></li></ol><p>We&#8217;ll look at the paid option first, then wrap up with the beginner-friendly community wrappers that most hobby analysts start with.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>3&#8212;Paid APIs</h1><p>Professional setups lean on <strong>APIs</strong>&#8212;stable web endpoints that deliver data in a clean, documented format. (API = <strong>Application Programming Interface</strong>: a contract that lets your code request specific data from a provider&#8217;s server.)</p><p>Think of it as web-scraping&#8217;s legal, high-speed, fully supported cousin&#8212;just one that usually comes with a price tag.</p><p><strong>Typical workflow</strong></p><ol><li><p>Create an account and grab your personal API key.</p></li><li><p>Read the docs for the endpoint you need&#8212;<code>/matches</code>, <code>/shots</code>, <code>/players</code>, etc.</p></li><li><p>Hit the URL, pass your key, and pull back a JSON payload (basically one giant nested dictionary you&#8217;ll flatten during wrangling).</p></li></ol><p><strong>Pros</strong></p><ul><li><p>Clean, consistent schema&#8212;no guessing which table cell holds the xG.</p></li><li><p>Historical depth and live feeds.</p></li><li><p>Official support; if something breaks, you have a help desk.</p></li></ul><p><strong>Cons</strong></p><ul><li><p>Cost (sometimes eye-watering).</p></li><li><p>You still have to wrangle the JSON into tidy columns&#8212;just a smaller headache than messy HTML.</p></li></ul><p>Pricing varies. Wyscout is usually cheaper; StatsBomb is the gold-standard and priced accordingly.</p><p>If you&#8217;re working on a hobby project and don&#8217;t need live updates, take advantage of <strong>StatsBomb&#8217;s free datasets</strong>&#8212;entire seasons (e.g., Europe&#8217;s top-five leagues 2015/16), Arsenal&#8217;s 2003/04 Invincibles, Bayer Leverkusen&#8217;s 2023/24 unbeaten run, even Lionel Messi&#8217;s whole career. Grab them here: <a href="https://statsbomb.com/what-we-do/hub/free-data/">https://statsbomb.com/what-we-do/hub/free-data/</a> or use their Python library <code>statsbombpy</code><strong>.</strong></p><p><em>Ready for the easiest path of all?</em></p><p>Enter community wrappers that fetch those same metrics in a single line of Python.</p><div><hr></div><h1>4&#8212;Community wrappers</h1><p>The football analytics community has blessed us with Python <em>wrappers</em>&#8212;packages that hide 97 % of the scraping grunt work.</p><p>Instead of copy-pasting from FBref, building a custom crawler, or paying StatsBomb money you don&#8217;t have, you can often import a library and fetch the data in a single line.</p><p><strong>Flagship wrapper: </strong><code>soccerdata</code> by <a href="https://x.com/p_robberechts">Pieter Robberechts</a>. Behind the scenes it scrapes several public sources and returns tidy (pandas) DataFrames. With the same package you can tap into</p><ul><li><p><strong>FBref &amp; Understat:</strong> xG, xGOT, xA, xGChain, xGFlow, shot locations, and other advanced team/player stats</p></li><li><p><strong>SofaScore, WhoScored, FotMob:</strong> line-ups and player ratings</p></li><li><p><strong>ClubElo:</strong> historical team strength</p></li><li><p><strong>SoFIFA:</strong> FIFA/FC player attributes</p></li></ul><p>&#8230;and more (full documentation <a href="https://soccerdata.readthedocs.io/en/latest/">here</a>).</p><p>Usually it&#8217;s one line to set parameters, one line to pull clean data. Simple as that.</p><p><strong>Why beginners love wrappers</strong></p><ul><li><p>Zero scraping headaches&#8212;instant gratification</p></li><li><p>Perfect sandbox to practise Polars/Pandas before wrestling with raw HTML</p></li></ul><p><strong>Caveats</strong></p><ul><li><p>Community projects can go stale; endpoints change and packages break&#8212;be ready to fork or patch</p></li><li><p>Documentation still matters&#8212;read it so you hit the right methods and parameters</p></li><li><p>Coverage is uneven: plenty of x-metrics for Europe&#8217;s top five leagues, far less for lower tiers or niche competitions</p></li></ul><p><strong>Bottom line:</strong> start with wrappers. If they cover your use-case, you&#8217;re already analysing. If not, fall back on the other three roads: manual copy, web scraping, or APIs.</p><div><hr></div><h1>5&#8212;The Python Corner</h1><p>And finally &#8212; here&#8217;s the <strong>Python code of the day</strong>. </p><p>It illustrates why starting with wrappers is the <strong>fastest and most efficient way</strong> for beginners to begin collecting advanced, up-to-date football data.</p><p><em><strong>So, how do you get xG data for Europe&#8217;s top five leagues for the past eight seasons?</strong></em></p><p>Easy.</p><p>First, install <code>soccerdata</code> (if you haven&#8217;t already), and load the library along with a data-wrangling tool &#8212; in this case, <strong>Polars</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_!8YPl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8YPl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 424w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 848w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 1272w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8YPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png" width="378" height="295.82608695652175" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:598,&quot;resizeWidth&quot;:378,&quot;bytes&quot;:223052,&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.pythonfootball.com/i/168967691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.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_!8YPl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 424w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 848w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.png 1272w, https://substackcdn.com/image/fetch/$s_!8YPl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a9264d3-0f1d-41e1-9d1f-501d00636bae_598x468.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>Then, define the scope of your data. You simply call <code>sd.FBref()</code>, set the league to <code>"Big 5 European Leagues Combined"</code>, and select the seasons from 2017&#8211;18 through the current 2024&#8211;25 season. After that, use <code>.read_schedule()</code> &#8212; and voil&#224;, the data is yours.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NVhH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NVhH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 424w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 848w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 1272w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NVhH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png" width="1256" height="756" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:756,&quot;width&quot;:1256,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:430072,&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.pythonfootball.com/i/168967691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.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_!NVhH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 424w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 848w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.png 1272w, https://substackcdn.com/image/fetch/$s_!NVhH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5653106f-1c16-443b-9c99-b2ddbd8e11ef_1256x756.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 class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lFxs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lFxs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 424w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 848w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 1272w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lFxs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png" width="1320" height="688" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:688,&quot;width&quot;:1320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143866,&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.pythonfootball.com/i/168967691?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.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_!lFxs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 424w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 848w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.png 1272w, https://substackcdn.com/image/fetch/$s_!lFxs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b892112-be82-44a5-aee8-71241c654ec5_1320x688.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>In the code example, we also convert the resulting DataFrame to a <strong>Polars DataFrame</strong> to take advantage of its friendly, high-performance syntax. </p><p>And that&#8217;s it &#8212; <strong>quick and easy</strong>, just as promised.</p><div><hr></div><p>Boom&#8212;that was data collection in plain English.</p><p>If you found this newsletter helpful, please spread the word! You now know the 4 ways you can get started collecting football data.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/football-data-collection-in-plain?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/football-data-collection-in-plain?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>I&#8217;m still experimenting with the format of the newsletter, so your feedback is super welcome&#8212;would you prefer shorter content, longer deep dives, more Python, or more football concepts? Or does this format hit the mark?</p><p>My aim is to build a truly practical newsletter <em>together</em> with you.</p><p>Until next week,</p><p><em><strong>Martin</strong></em></p><p><em><strong>The Python Football Review</strong></em></p>]]></content:encoded></item><item><title><![CDATA[How Wrong Are Football Pundits?]]></title><description><![CDATA[16 Years &#183; 5,582 Lawro & Sutton Picks &#8212; What Would Your Bankroll Look Like if You&#8217;d Followed Every Single One?]]></description><link>https://www.transferscience.com/p/how-wrong-are-football-pundits</link><guid isPermaLink="false">https://www.transferscience.com/p/how-wrong-are-football-pundits</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 17 Jul 2025 08:01:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ttsi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #009.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ttsi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ttsi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ttsi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92119,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ttsi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ttsi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f4c734c-6d6f-4690-a192-b5ae4d19bbc1_1280x720.jpeg 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><figcaption class="image-caption">Youtube</figcaption></figure></div><p>For as long as I&#8217;ve watched football, I&#8217;ve been fascinated by the pundits who sit in match&#8209;day studios and announce exactly how the weekend will unfold.</p><p>But are they actually any good&#8212;or are we all just blindly trusting their reputation?</p><p>It&#8217;s time to find out.</p><p>This week I crunched every Premier League prediction that BBC (and Liverpool) legend <strong>Mark Lawrenson</strong> made between <strong>2009/10&#8211;2021/22</strong>, along with those of his successor <strong>Chris Sutton</strong> (2022/23&#8211;2024/25), and stacked them against the market&#8217;s odds. My questions were simple:</p><ul><li><p>How many matches did they call correctly?</p></li><li><p>What would your bankroll look like if you&#8217;d followed them with flat&#8209;stake bets?</p></li><li><p>Was Lawrenson really biased against Tottenham, West Ham, and Southampton?</p></li></ul><p>And&#8212;because this <em>is</em> the Python Football Review&#8212;I&#8217;m sharing the code at the end so that you can replicate the analysis yourself.</p><p>Enjoy!</p><div><hr></div><h1>1&#8239;&#8212;&#8239;The Data</h1><p>I scraped <a href="https://www.myfootballfacts.com/premier-league/all-time-premier-league/predictions/">MyFootballFacts</a> for Lawrenson&#8217;s and Sutton&#8217;s predictions over 16 seasons. In theory, 16&#8239;&#215;&#8239;380 = 6,080 games; I collected <strong>5,582</strong> predictions&#8212;covering 92&#8239;% of all fixtures (a few predictions were missing, nothing crucial).</p><p>Actual results and average market odds came from <a href="http://football-data.co.uk/">Football&#8209;Data.co.uk</a>.</p><p>For each match I have:</p><ul><li><p>the pundit&#8217;s <em>predicted</em> scoreline and full-time forecast</p></li><li><p>the <em>real</em> scoreline and outcome</p></li><li><p>market&#8209;average odds for home win, draw and away win</p></li></ul><p>That&#8217;s enough to run a profit&#8209;and&#8209;loss simulation with a simple 1&#8209;unit flat&#8209;stake strategy.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PkX2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PkX2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 424w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 848w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 1272w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PkX2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png" width="1456" height="330" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:330,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89734,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.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_!PkX2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 424w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 848w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 1272w, https://substackcdn.com/image/fetch/$s_!PkX2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcee2dc02-7769-4185-8788-7c59ea1d83c7_1608x364.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h1>2&#8239;&#8212;&#8239;Simulation Results</h1><p>So what would have happened if we placed a single&#8209;unit bet on all 5,582 forecasts?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cveB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cveB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 424w, https://substackcdn.com/image/fetch/$s_!cveB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 848w, https://substackcdn.com/image/fetch/$s_!cveB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 1272w, https://substackcdn.com/image/fetch/$s_!cveB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cveB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png" width="288" height="93" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aadf7522-9419-4064-bec7-5a586e039326_288x93.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:93,&quot;width&quot;:288,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4176,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.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_!cveB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 424w, https://substackcdn.com/image/fetch/$s_!cveB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 848w, https://substackcdn.com/image/fetch/$s_!cveB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 1272w, https://substackcdn.com/image/fetch/$s_!cveB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faadf7522-9419-4064-bec7-5a586e039326_288x93.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The pundits called <strong>2,862</strong> matches correctly (<strong>51&#8239;% win rate</strong>), resulting in a <strong>+14.5&#8209;unit profit</strong> on a 1&#8209;unit stake per game&#8212;an overall rate of return (ROR) of <strong>+0.3&#8239;%</strong> (14.5/5582) across the 16&#8209;season sample.</p><p>Now that&#8217;s a surprise. Honestly, I expected a loss.</p><p>No disrespect, but making money in betting is about <em>value</em>, not simply picking winners, and punditry is (mostly) about predicting winners.</p><p>Having said that, a 0.3% ROR over 16 seasons is nothing to brag about. I mean the pundits were basically treading water&#8212;just about breaking even.</p><p>Nothing more, nothing less.</p><h3>Individual performance</h3><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bjdc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bjdc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 424w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 848w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 1272w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bjdc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png" width="419" height="134" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:134,&quot;width&quot;:419,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8582,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.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_!bjdc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 424w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 848w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 1272w, https://substackcdn.com/image/fetch/$s_!bjdc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f1c5a75-968f-44ef-bfb5-17a6c8c94fe3_419x134.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><strong>Mark Lawrenson</strong>: 4,450 forecasts &#8594; 2,289 correct predictions (<strong>51&#8239;% win rate</strong>) &#8594; <strong>+47.6 units</strong> (<strong>+1.0&#8239;% ROR</strong>). He started strong, dipped to &#8211;60 units, then clawed his way back and spent most of the time above zero.</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_!qHOd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qHOd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 424w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 848w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 1272w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qHOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png" width="587" height="467" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:467,&quot;width&quot;:587,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38343,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.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_!qHOd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 424w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 848w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.png 1272w, https://substackcdn.com/image/fetch/$s_!qHOd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c4a37c7-e3f5-4590-96c0-fd9f25207b15_587x467.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><ul><li><p><strong>Chris Sutton</strong>: 1,132 forecasts &#8594; 573 wins (<strong>51&#8239;% win rate</strong>) &#8594; <strong>&#8211;33 units</strong> (<strong>&#8211;3&#8239;% ROR</strong>).</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_!uoRE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uoRE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 424w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 848w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 1272w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uoRE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png" width="592" height="462" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:462,&quot;width&quot;:592,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:40623,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.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_!uoRE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 424w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 848w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.png 1272w, https://substackcdn.com/image/fetch/$s_!uoRE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff83904-73da-4a3f-b785-601e6d399d67_592x462.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>Sutton hasn&#8217;t found the same luck (yet?). After 1,000 forecasts he&#8217;s 33 units down. For context, at the same stage Lawro was &#8211;60, so don&#8217;t write him off just yet.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>3&#8239;&#8212;&#8239;Should We Be Impressed with Lawro&#8217;s Record?</h1><p>Let&#8217;s be real: <strong>a 1&#8239;% ROI over 13 seasons is nothing to brag about.</strong> You&#8217;d have earned more interest parking the cash in a half&#8209;decent savings account.</p><p>Remember, this is <em>after</em> decades of insider contacts, professional playing experience, and BBC resources.</p><p>Lawro&#8217;s Predictions began as a TV segment and became a BBC Sport website staple, regularly generating <em>hundreds of thousands</em> of page impressions each week&#8212;peaking at 1.2&#8239;million when Rick Astley guested over Christmas&#8239;2020 (<a href="https://www.bbc.com/sport/football/61493783">BBC</a>).</p><p>Now, that&#8217;s a lot of interest for a 1&#8239;% return over 13 years of predictions, wouldn&#8217;t you agree?</p><p>It&#8217;s not really about betting, of course, but many fans still treat the column as a tipping service.</p><p>Any experienced bettor will tell you:</p><ul><li><p>Profitable betting is about <strong>value</strong>, not just calling winners.</p></li><li><p><strong>Blindly following</strong> tipsters (or pundits?) won&#8217;t get you far. If they&#8217;re right, odds adjust and the edge disappears; if they&#8217;re wrong, your bankroll suffers.</p></li><li><p><em>If betting were easy money, it wouldn&#8217;t be legal.</em> Harsh but true. As Lawro himself once <a href="https://www.bbc.com/sport/football/61493783">joked</a>:</p></li></ul><blockquote><p><em>&#8220;If I honestly thought I could accurately predict the results of football matches, I wouldn't be here, freezing my backside off. I would be in Barbados, in Sandy Lane hotel.&#8221;</em></p></blockquote><div><hr></div><h1>4&#8239;&#8212;&#8239;Did Lawro Have Biases?</h1><p>Before we get to the Python corner, let&#8217;s tackle a complaint Lawro heared a lot. Fans of Tottenham, Southampton, and especially West Ham have long <a href="https://www.bbc.com/sport/football/61493783">claimed</a> he&#8217;s biased against them.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M6k3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M6k3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 424w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 848w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 1272w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M6k3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png" width="595" height="227" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:227,&quot;width&quot;:595,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19789,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.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_!M6k3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 424w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 848w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 1272w, https://substackcdn.com/image/fetch/$s_!M6k3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F170382e3-c794-491b-ad19-8ecd17be51e1_595x227.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"><a href="https://x.com/WestHam/status/687023879072550914?ref_src=twsrc%5Etfw">West Ham United on X: "88: 'Lawro, what's the score?' sing the travelling Hammers fans! He predicted we'd lose 2-1 tonight, by the way... [1-3] #WHUFC #BOUWHU" / X</a></figcaption></figure></div><p>So here&#8217;s a small analysis we can run: grade only Lawrenson&#8217;s for/against calls at average odds. </p><ul><li><p>If his picks beat the market (i.e., show a positive ROR), you could argue his forecasts were broadly justified. </p></li><li><p>If they fail to beat the market, critics have a case that he under-performed&#8212;wilfully or not&#8212;on certain teams. </p></li></ul><p>Yes, this is a simplification. A positive ROR might just reflect a few mis-priced games, while a negative one could be the product of small samples, long-shot variance, or statistically insignificant results. The goal here is insight and a bit of fun.</p><p>So how did his predictions fare for those clubs?</p><p>The table below shows the simulation results for matches involving any of those three teams in which Lawrenson picked a side (draws are excluded).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sge5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sge5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 424w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 848w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 1272w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sge5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png" width="596" height="163" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:163,&quot;width&quot;:596,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16176,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.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_!Sge5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 424w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 848w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 1272w, https://substackcdn.com/image/fetch/$s_!Sge5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf523900-5450-4c9e-9f5d-acb6c78a58c0_596x163.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><ul><li><p><strong>Spurs supporters can relax</strong>&#8212;Lawro was actually <em>better than average</em> on Tottenham fixtures, both in accuracy (60% win rate) and profit (2% ROR)</p></li><li><p><strong>Hammers fans:</strong> his 53&#8239;% hit&#8209;rate and +1&#8239;% ROR are almost exactly his long&#8209;run baseline. No real bias either way.</p></li><li><p><strong>Saints die&#8209;hards do have a case.</strong> He undershot on Southampton, paying out only 46&#8239;% of the time and reaching a negative 8&#8239;% of returns meaning that over the long term for any 100&#163; wagered, you&#8217;d be expected to lose 8&#163;.</p></li></ul><p>Looking wider, the best teams in his for/against prediction portfolio were Reading (+22% ROR), Watford (20%) and Cardiff (19%).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Gfxj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Gfxj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 424w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 848w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 1272w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Gfxj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png" width="485" height="351.566985645933" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:606,&quot;width&quot;:836,&quot;resizeWidth&quot;:485,&quot;bytes&quot;:101418,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.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_!Gfxj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 424w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 848w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.png 1272w, https://substackcdn.com/image/fetch/$s_!Gfxj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fca0a95cf-9cca-4137-8daf-b6f6e07bd63d_836x606.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>Blackpool were Lawro&#8217;s Trojan horse: only 43&#8239;% win rate and a &#8211;31&#8239;% ROR, followed by Brighton (-16%) and Wigan (-14%).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FhER!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FhER!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 424w, https://substackcdn.com/image/fetch/$s_!FhER!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 848w, https://substackcdn.com/image/fetch/$s_!FhER!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 1272w, https://substackcdn.com/image/fetch/$s_!FhER!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FhER!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png" width="519" height="383.6626794258373" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:618,&quot;width&quot;:836,&quot;resizeWidth&quot;:519,&quot;bytes&quot;:107706,&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.pythonfootball.com/i/168451957?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.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_!FhER!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 424w, https://substackcdn.com/image/fetch/$s_!FhER!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 848w, https://substackcdn.com/image/fetch/$s_!FhER!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.png 1272w, https://substackcdn.com/image/fetch/$s_!FhER!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2be14c5f-8c3b-4ef1-bbcf-e7d5f3aa0204_836x618.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><strong>Bottom line:</strong> the &#8220;Lawro hates my team&#8221; meme is mostly myth&#8212;unless you&#8217;re a <strong>Southampton</strong> fan. (And even then, there are <em>five</em> clubs he performed worse against).</p><div><hr></div><h1>5 &#8212; The Code</h1><p>Finally, here&#8217;s the Python notebook so you can replicate the analysis yourself.</p><p>About 80&#8239;% of the work went into scraping the data; I&#8217;ll spare you that mess so you can jump straight into the clean, analysis&#8209;ready dataset and do some wrangling. <em>You&#8217;re welcome. </em>(We&#8217;ll tackle web&#8209;scraping another day.)</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/folder/vcx3hcrw71p9e/PFR-009&quot;,&quot;text&quot;:&quot;Download the notebook and data&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/folder/vcx3hcrw71p9e/PFR-009"><span>Download the notebook and data</span></a></p><p>If you&#8217;re new to Python, a Gmail account is all you need: open a <strong>Google Colab</strong> session, import the notebook you just downloaded, and run the cells in order. At the second cell you&#8217;ll be prompted to upload the data file&#8212;select the one you grabbed from the link above&#8212;then continue executing cell by cell.</p><p>The notebook loads the pre-cleaned data and walks through every step needed to produce the simulation tables.</p><p><strong>Credits:</strong> Predictions from <a href="https://www.myfootballfacts.com/premier-league/all-time-premier-league/predictions/">MyFootballFacts</a> and results/odds from <a href="http://football-data.co.uk/">Football&#8209;Data.co.uk</a> (maintained by <a href="https://x.com/12xpert">Joseph&#8239;Buchdahl</a>).</p><div><hr></div><p>Boom&#8212;that was <em>football</em> <em>pundits uncovered</em>.</p><p>If you enjoyed this edition, please share it with a friend.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/how-wrong-are-football-pundits?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/how-wrong-are-football-pundits?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>You now know how accurate football pundits really are, why their tips deserve a pinch of salt, and how to wrangle a dataset to test a pundit&#8217;s track record.</p><p>Thanks for reading&#8212;see you next Thursday!</p><p>Martin</p><p><em><strong>The Python Football Review</strong></em></p><p><em>P.S. Did the results surprise you? Reply below or drop your favourite pundit clich&#233; and I&#8217;ll test it in a future issue.</em></p>]]></content:encoded></item><item><title><![CDATA[You Shall Not Pass]]></title><description><![CDATA[Ranking elite shot-stoppers with xGOT&#8212;plus the World Cup & Euro champions who quietly sit among the worst.]]></description><link>https://www.transferscience.com/p/you-shall-not-pass</link><guid isPermaLink="false">https://www.transferscience.com/p/you-shall-not-pass</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 10 Jul 2025 08:01:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xYsg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #008!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xYsg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xYsg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xYsg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a19905b-a39c-4873-a21e-3f336f2b1d37_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;:2108176,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_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_!xYsg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xYsg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a19905b-a39c-4873-a21e-3f336f2b1d37_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>Last week we crowned football&#8217;s <a href="https://www.pythonfootball.com/p/the-myth-of-the-clinical-striker?r=5mroiq">greatest finishers</a>. Today we turn the spotlight on goalkeepers and ask:</p><blockquote><p><em><strong>Who are the elite shot-stoppers?</strong></em></p></blockquote><p>To find out, I&#8217;ll dive into Opta&#8217;s post-shot data and examine:</p><ul><li><p>whether the clean-sheet leaders are truly world-class shot-stoppers</p></li><li><p>which names quietly top the <strong>Goals Prevented</strong> leaderboard</p></li><li><p>which fan favourites <em>leak</em> more than they should (brace yourself, we&#8217;ve got a World Cup and Euro champions in the list)</p></li></ul><p>A step-by-step Python template is included so you can rerun (and roast) my numbers.</p><p>Enjoy!</p><div><hr></div><h2>Quick refresher / disclaimer</h2><p>If xGOT (expected goals on target) is new to you, start with my 101 primer <a href="https://www.pythonfootball.com/p/expected-goals-on-target-xgot-101?r=5mroiq">here</a>. In one sentence:</p><ul><li><p><strong>xGOT</strong> = the probability that a <em>shot on target</em> becomes a goal&#8212;ball flight, pace, and placement included.</p></li></ul><p>From there we can build two related keeper metrics:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fEDf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fEDf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 424w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 848w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 1272w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fEDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png" width="537" height="258" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:258,&quot;width&quot;:537,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19628,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.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_!fEDf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 424w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 848w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.png 1272w, https://substackcdn.com/image/fetch/$s_!fEDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73eccac5-883d-49d2-9884-1352bcd07e7e_537x258.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><strong>Example</strong></p><p>A keeper faces 105 xGOT and concedes 100 goals.</p><ul><li><p><strong>GPR</strong> = 105 &#247; 100 = <strong>1.05</strong> &#8594; he saved 5 % more than the average goalie would.</p></li><li><p><strong>GP</strong> = 105 &#8722; 100 = <strong>+5</strong> &#8594; over the sample he <em>prevented</em> five goals than the average keeper would.</p></li></ul><p>Of course, shot-stopping is only one pillar of goalkeeping. Distribution, aerial command, and sweeping all matter too&#8212;ranking low here doesn&#8217;t automatically make anyone a poor keeper, just one who saves fewer shots than the model predicts.</p><p>Thank you, Captain Obvios.</p><p>Enough talk; let&#8217;s see the data.</p><div><hr></div><h1>1 &#8212; Scope of the study</h1><p>For this review we pull eight seasons of Opta post-shot data via Fbref (2017/18 &#8211; 2024/25) from Europe&#8217;s big-five leagues&#8212;Premier League, La Liga, Serie A, Bundesliga, and Ligue 1.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cOO2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cOO2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 424w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 848w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 1272w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cOO2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png" width="566" height="82" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92f7e510-c182-4403-831c-07f2359500ad_566x82.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:82,&quot;width&quot;:566,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5719,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.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_!cOO2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 424w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 848w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 1272w, https://substackcdn.com/image/fetch/$s_!cOO2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f7e510-c182-4403-831c-07f2359500ad_566x82.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Across the sample we see:</p><ul><li><p><strong>122,732</strong> shots on target that yielded <strong>38,877</strong> goals (excluding own goals)</p></li><li><p>Those shots carried <strong>37,986 xGOT</strong>, so sample-wide <strong>Goals Prevented Rate of 0.98</strong>&#8212;keepers prevented about 2**% less** than the model expected.</p></li><li><p>The average shot on target weighed in at <strong>0.31 xGOT</strong>, and goalkeepers logged roughly <strong>0.26 clean sheets per 90 minutes</strong>.</p></li></ul><p>In plain English: over eight seasons the &#8220;typical&#8221; big-five keeper is a hair below par&#8212;about two extra goals allowed every hundred matches. That gives us a baseline: anyone posting a <strong>positive GPR comfortably above 1.00</strong> is bending probability in their team&#8217;s favour.</p><p>Let&#8217;s find out who.</p><div><hr></div><h1>2 &#8212; Are clean-sheet leaders world-class shot-stoppers, too?</h1><p>Okay, over the eight seasons studied, here are the top 10 keepers (minimum 160 games) ranked by clean sheets per 90 minutes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Lsme!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lsme!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 424w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 848w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 1272w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lsme!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png" width="647" height="305" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:305,&quot;width&quot;:647,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26692,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.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_!Lsme!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 424w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 848w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.png 1272w, https://substackcdn.com/image/fetch/$s_!Lsme!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2dcf60e4-8449-4fb2-bc4e-5c6a6ff27de6_647x305.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>No surprises here&#8212;we see the usual suspects: first-choice keepers at elite clubs.</p><p>Across the period, <strong>Marc-Andr&#233; ter Stegen</strong> tops the list with 113 clean sheets in 247 full matches, or <strong>0.46 clean sheets per 90</strong>. He conceded 210 goals from 225 xGOT, giving him a <strong>Goals Prevented ratio of 1.07</strong>. In plain English, he allowed roughly <strong>7 % fewer goals</strong> than the average keeper would have from the same shots&#8212;fine margins.</p><p><strong>Ederson</strong> and <strong>Jan Oblak</strong> sit second and third at 0.45 and 0.44 clean sheets per 90, while <strong>Alisson</strong> and <strong>Courtois</strong> round out the top five. If I&#8217;d closed my eyes and guessed, these five names would still have made the cut (though perhaps in a different order).</p><p>What really stands out is Oblak&#8217;s <strong>Goals Prevented ratio of 1.14</strong>: his shot-stopping erased roughly <strong>14 % of the goals</strong> an average keeper would have conceded. That&#8217;s truly elite&#8212;though you hardly needed the stat to remember how dominant he&#8217;s been. Alisson isn&#8217;t far behind at 1.13.</p><p>Then come the interesting cases: <strong>Ederson</strong> at 1.03 and <strong>Neuer</strong> at 1.02. Both are still <em>above</em> par, yet only marginally so.</p><p><em><strong>Does that make two world-class keepers merely average shot-stoppers?</strong></em></p><p>Rhetorical question&#8212;over long samples goals and xGOT tend to converge. More likely, their strengths lie elsewhere: Ederson&#8217;s distribution powers Manchester City&#8217;s build-up, and Neuer practically invented the modern sweeper-keeper role.</p><p>Another working hypothesis &#8212; playing behind dominant sides means they face fewer truly testing shots, giving them fewer opportunities to accumulate xGOT (as is also the case for Alisson and Courtois though, so the jury is still out on this one).</p><p>The point stands, though: <strong>Goals Prevented reframes the conversation by isolating pure shot-stopping, stripping out the protection provided by an elite defence.</strong></p><p>So what happens if we flip the question and rank keepers solely by Goals Prevented Rate? Can anyone top Oblak&#8217;s +14 %?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>3 &#8212; Elite shot-stoppers</h1><p>Over the eight-season window, 29 goalkeepers posted a <strong>Goals Prevented Rate</strong> above 1.0. Here are the top performers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MghG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MghG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 424w, https://substackcdn.com/image/fetch/$s_!MghG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 848w, https://substackcdn.com/image/fetch/$s_!MghG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 1272w, https://substackcdn.com/image/fetch/$s_!MghG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MghG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png" width="640" height="377" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:377,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33340,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.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_!MghG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 424w, https://substackcdn.com/image/fetch/$s_!MghG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 848w, https://substackcdn.com/image/fetch/$s_!MghG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.png 1272w, https://substackcdn.com/image/fetch/$s_!MghG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1732d95d-64c5-4272-b910-704fb4c32d91_640x377.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>Surprise, surprise: former Nice and PSV guardian <strong>Walter Ben&#237;tez</strong> tops the table with an eye-catching <strong>1.15</strong> Goals Prevented Rate. Put differently, he kept out 15 extra goals for every 100 he conceded&#8212;across 164 matches. Wow.</p><p>Unless you&#8217;re a Football Manager addict, this might be the first time you&#8217;ve heard his name. Ben&#237;tez has just moved to Crystal Palace on a free; if he beats Dean Henderson to the No. 1 shirt, he could be a savvy FPL pick.</p><p>The metric highlights elite shot-stoppers who don&#8217;t enjoy elite defences. Because Ben&#237;tez faced far more shots than keepers at super-clubs, his clean-sheet rate is a modest <strong>0.30 per 90</strong>&#8212;still above average, but nothing to headline.</p><p>Goals Prevented cuts through that noise.</p><p>Rounding out the list are the familiar faces: <strong>Oblak</strong> (1.14), <strong>Alisson</strong> (1.13) and <strong>Courtois</strong> (1.10). Ben&#237;tez has roughly 100 fewer games than this trio, so a little regression is possible in the future, but topping the chart at all is impressive.</p><p><em><strong>Why it matters?</strong></em></p><p>Scouts can use Goals Prevented to scan global databases for keepers at mid-table sides who are already &#8220;adding&#8221; goals&#8212;spotting the next Oblak (or dare I say Benitez) before everyone else.</p><p>Okay, now to the biggest under-performers.</p><div><hr></div><h1>4 &#8212; Elite under-performers</h1><p>Twenty-six goalkeepers in the data set posted a <strong>Goals Prevented</strong> rate below 1.0. Here are the biggest under-performers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fvMQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fvMQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 424w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 848w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 1272w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fvMQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png" width="625" height="348" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:348,&quot;width&quot;:625,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31487,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.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_!fvMQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 424w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 848w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.png 1272w, https://substackcdn.com/image/fetch/$s_!fvMQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6b8e8a5-1f0d-4195-b5fb-8242aeb3df8e_625x348.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><strong>Lorenzo Montip&#242;</strong> (Verona) anchors the table at <strong>0.86</strong>, meaning that for every <strong>100 goals</strong> he conceded, the average keeper would have conceded only <strong>86</strong>. In other words, he handed opponents <strong>14 &#8220;free&#8221; goals</strong> per 100 allowed. Ouch.</p><p>Next come journeyman Frenchman <strong>Beno&#238;t Costil,</strong> Union Berlin&#8217;s <strong>Alexander Schwolow</strong> and Sassuolo&#8217;s <strong>Andrea Consigli</strong> all with 0.88.</p><p>So far, so ordinary&#8212;until you scroll and spot <strong>World-Cup winner Steve Mandanda</strong> and <strong>European-championship hero Rui Patr&#237;cio</strong>, both at <strong>0.94</strong>.</p><p>You might argue that Mandanda was rarely France&#8217;s first-choice and that both keepers are deep into their thirties, so age drag is real. You could also shrug and say &#8220;four percentage points off the mean&#8212;maybe it&#8217;s noise.&#8221;</p><p>Still, you certaintly didn&#8217;t expect national-team players from heavyweight nations to flirt with this list, did you?</p><p>I certaintly didn't.</p><p>And finally, let&#8217;s fast-forward to 2024/25 for a fresh snapshot.</p><div><hr></div><h1>5 &#8212; What happened last year?</h1><p>During the 2024/25 season, 49 goalkeepers logged at least 20 league appearances <strong>and</strong> finished with a Goals Prevented ratio above 1.0. The chart above shows the top ten.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7KQu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7KQu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 424w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 848w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 1272w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7KQu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png" width="729" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:729,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28921,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.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_!7KQu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 424w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 848w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.png 1272w, https://substackcdn.com/image/fetch/$s_!7KQu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6376e3b-7241-4fca-b8ba-288c2d9670c4_729x303.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><strong>Yehvann Diouf</strong> (Reims) sets the pace at <strong>1.31</strong>&#8212;Opta&#8217;s model says an average keeper would have conceded <strong>31 % more</strong> goals from the same shots. Put differently, Diouf erased roughly one goal out of every three the model expected. That&#8217;s a hefty spike in form.</p><p>Next comes a distinctly Balkan quartet &#8212; three Serbs and one Bosnian &#8212; <strong>Vanja Milinkovi&#263;-Savi&#263;</strong> (1.29), <strong>&#272;or&#273;e Petrovi&#263;</strong> (1.27), <strong>Nikola Vasilj</strong> (1.25), and <strong>Mile Svilar</strong> (1.25).</p><p>If Yugoslavia still existed, its national-team coach would have a pleasant selection headache. Well, I guess Serbia&#8217;s coach certainly does now.</p><p>At the other end of the table, <strong>31</strong> keepers fell below the break-even line. The headline shock sits in the bottom ten: PSG&#8217;s undisputed No. 1 <strong>Gianluigi Donnarumma</strong> slumped to <strong>0.87</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_!Llbz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Llbz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 424w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 848w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 1272w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Llbz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png" width="719" height="297" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:297,&quot;width&quot;:719,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29118,&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.pythonfootball.com/i/167891603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.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_!Llbz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 424w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 848w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.png 1272w, https://substackcdn.com/image/fetch/$s_!Llbz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7edaf1b7-43ca-44dd-86dc-a769e016d8af_719x297.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><em><strong>Wait, what?</strong></em></p><p>Despite starring in PSG&#8217;s late-stage Champions League run, Donnarumma cost his side roughly <strong>13 % more goals than xGOT predicted</strong> over the league season. Maybe supporters forgive that as long as he delivers on the nights that truly matter, but the domestic data is hard to ignore.</p><p>And finally, below you&#8217;ll find a Python template to reproduce every step of the analysis from scratch.</p><div><hr></div><h1>6 &#8212; The Python Corner</h1><p>Here&#8217;s how to replicate everything we just did in Python.</p><p>Are you new to Python and programming? Head to <a href="https://colab.research.google.com/">Google Colab</a> and open a Python session&#8212; all you need is a Gmail account.</p><p>Next, grab the notebook I used for this issue by clicking the button below. Inside, you&#8217;ll find step-by-step instructions on how to</p><ul><li><p>pull eight seasons of Opta data from FBref with <code>soccerdata</code>;</p></li><li><p>wrangle it with <code>polars</code>; and</p></li><li><p>reproduce every insight we&#8217;ve just covered.</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/sowqvzc9gxfdy24/PFR_008_YouShallNotPass.ipynb/file&quot;,&quot;text&quot;:&quot;Download Python Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/sowqvzc9gxfdy24/PFR_008_YouShallNotPass.ipynb/file"><span>Download Python Code</span></a></p><p>Once downloaded, simply import the notebook, launch the code and enjoy.</p><div><hr></div><p>And there you have it&#8212;elite shot-stoppers in a nutshell.</p><p>If this issue helped you, please pass it along!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/you-shall-not-pass?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/you-shall-not-pass?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>You now know how to rank elite shot-stoppers with xGOT, quantify how much they save their teams, identify the biggest under-achievers, and pull eight seasons of data with Python to analyse all of it yourself.</p><p>Until next week,</p><p><strong>Martin</strong></p><p><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[Shooting Royalty]]></title><description><![CDATA[Ranking elite ball-strikers with xGOT: how much they outshoot the average finisher and which big names fall short]]></description><link>https://www.transferscience.com/p/shooting-royalty</link><guid isPermaLink="false">https://www.transferscience.com/p/shooting-royalty</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 03 Jul 2025 08:01:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rohg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #007!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rohg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rohg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rohg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rohg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rohg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rohg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg&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;:248318,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rohg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rohg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rohg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rohg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0225e7a-ee4d-4099-bdd9-dffe04239ccc_1536x1024.jpeg 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>Last week we busted the <em><a href="https://www.pythonfootball.com/p/the-myth-of-the-clinical-striker?r=5mroiq">myth of the clinical striker</a></em>&#8212;why even superstars rarely beat their xG by much, and why that&#8217;s perfectly fine. The big lesson: only a few players finish well above expectation, and the word &#8220;clinical&#8221; is messy because xG mixes team service, movement, and finishing into one number.</p><p>To study <em>pure finishing</em> we need a sharper tool: <strong>xGOT (Expected Goals on Target)</strong>. xGOT looks at what happens <em>after</em> the ball leaves the boot, so it isolates a striker&#8217;s shot placement.</p><p>So, in this issue we&#8217;ll:</p><ul><li><p>reveal <strong>who</strong> the best strikers of the ball are,</p></li><li><p>see <strong>how far</strong> they outshine the average shooter,</p></li><li><p>call out the big names who &#8216;<em>under-perform&#8217;</em> xGOT yet still top the scoring charts (spoiler: two Ballon d&#8217;Or winners make the list),</p></li><li><p>and give you the full step-by-step Python code to run the analysis yourself.</p></li></ul><p>Enjoy!</p><div><hr></div><h3><strong>Before we dive in, a quick refresher / disclaimer</strong></h3><p>If xG or xGOT are new concepts for you, you can grab a primer <a href="https://www.pythonfootball.com/p/expected-goals-xg-101?r=5mroiq">here</a> and <a href="https://www.pythonfootball.com/p/expected-goals-on-target-xgot-101?r=5mroiq">here</a>. In short:</p><ul><li><p><strong>xG (Expected Goals)</strong> gauges <em>chance quality</em>&#8212;how promising the opportunity was <em>before</em> the shot.</p></li><li><p><strong>xGOT (Expected Goals on Target)</strong> gauges <em>shot execution</em>&#8212;what the striker actually did with the ball <em>after</em> contact.</p></li></ul><p>To isolate pure finishing skill professionals compare <strong>xGOT to xG</strong>:</p><ul><li><p><strong>Over-performing xG</strong> &#8594; the player beats the &#8220;average&#8221; shooter on identical chances.</p></li><li><p><strong>Under-performing xG</strong> &#8594; could signal below-par finishing <em>or</em> contextual factors we&#8217;ll unpack later.</p></li></ul><p>So, for this issue we&#8217;ll treat xGOT strictly as a proxy for striking technique. It goes without saying that an elite forward offers far more than goals&#8212;target men and pressing forwards change games without scoring&#8212;but today we&#8217;re zooming in on finishing alone.</p><p>Alright, let&#8217;s roll out the data.</p><div><hr></div><h1><strong>1 &#8212; Scope of the study</strong></h1><p>For this review we&#8217;ll pull Opta&#8217;s <strong>xGOT</strong> dataset&#8212;Opta calls it <em>Post-Shot Expected Goals (PSxG)</em>&#8212;via FBref. It covers <strong>eight seasons</strong> of shot-level data from Europe&#8217;s top-five leagues (2017/18 &#8211; 2024/25) and totals <strong>360,430 shots</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OZun!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OZun!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 424w, https://substackcdn.com/image/fetch/$s_!OZun!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 848w, https://substackcdn.com/image/fetch/$s_!OZun!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 1272w, https://substackcdn.com/image/fetch/$s_!OZun!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OZun!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png" width="728" height="90.56459330143541" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:78,&quot;width&quot;:627,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:6843,&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.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.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_!OZun!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 424w, https://substackcdn.com/image/fetch/$s_!OZun!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 848w, https://substackcdn.com/image/fetch/$s_!OZun!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 1272w, https://substackcdn.com/image/fetch/$s_!OZun!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6fd6558-459e-4ab5-8443-66a3dd69f63d_627x78.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Across those attemps, 5,724 players accumulated a total of 38,883 goals from 39,998 xG and 38,759 xGOT. This means that the:</p><ul><li><p><strong>Goals : xG = 0.97</strong></p></li></ul><p>Players scored about 3 % fewer goals than the pre-shot model predicted. That near-one ratio is the sanity check we want: over a huge sample, hot and cold streaks cancel out, so xG should line up with reality. The small shortfall suggests that, overall, goalkeepers and imperfect finishing trimmed the total slightly. Or perhaps it&#8217;s simply a bit of noise &#8212; right in the range where statistical error tends to lie.</p><ul><li><p><strong>xGOT : xG = 0.97</strong></p></li></ul><p>Post-shot expected goals are at the same 0.97 ratio. Even after accounting for shot placement, the picture barely changes: strikers are still expected to finish just below the pre-shot expectation. This should not surprise you. If xGOT had drifted far from xG, we&#8217;d worry about model noise &#8212; because over the long term, the two should converge.</p><ul><li><p><strong>xG / shot &#8776; xGOT / shot &#8776; 0.11</strong></p></li></ul><p>The typical open-play attempt in the big five leagues offers roughly an <strong>11 % chance of becoming a goal</strong>, whether judged before the strike (xG) or after you know its placement (xGOT).</p><p>These results echo last week&#8217;s findings: over large samples, goals converge toward xG, and the average non-penalty shot in the big five leagues sits around <strong>0.11 expected goals</strong>. Numbers differ slightly from last week because that issue used Understat data over an 11-season window.</p><p>With the baseline set, let&#8217;s see which players top the charts in <strong>xGOT &#247; xG</strong>.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1><strong>2 &#8212; The best strikers of the ball</strong></h1><p>Over the 8 seasons studied, <strong>38 players</strong> reached 80+ league goals. Exactly <strong>20</strong> finished with an <strong>xGOT : xG ratio above 1.00</strong>&#8212;meaning their shot placement <em>added</em> value on top of chance quality. The stand-outs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3MTU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3MTU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 424w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 848w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 1272w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3MTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png" width="509" height="391.1399491094148" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:302,&quot;width&quot;:393,&quot;resizeWidth&quot;:509,&quot;bytes&quot;:22630,&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.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.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_!3MTU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 424w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 848w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.png 1272w, https://substackcdn.com/image/fetch/$s_!3MTU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F537272aa-2b95-4adb-bead-22e04b5ed7f0_393x302.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><em><strong>Messi</strong></em> tops yet another finishing table. His shot-placement-to-chance ratio is <strong>1.29</strong>, meaning his finishing adds <strong>29 %</strong> to the conversion probability of every shot compared with the average player in the same positions. <em>World-class</em>&#8212;as if you needed reminding.</p><p>Close behind is <strong>Heung-min Son</strong> at <strong>1.25</strong> (+25 %). Yes, Spurs really did have a world-class finisher&#8212;and that isn&#8217;t even Harry Kane. (Though Kane still makes the list at No. 8 with +10 %.)</p><p>After those two, the gap widens:</p><ul><li><p><strong>Memphis Depay</strong> closes out the top three at <strong>+17 %</strong>&#8212;proof that a Premier-League-only lens can miss La Liga/Ligue 1 excellence (I mean he did flop at United).</p></li><li><p><strong>Paulo Dybala</strong> (+14%), <strong>Iago Aspas</strong> (+12%), and <strong>Ciro Immobile</strong> (+12%) complete the top six. I knew Immobile was banging in goals in Serie A, but come on &#8212; ranking him (and Aspas, another Premier League flop) among the most efficient shooters? I wouldn&#8217;t have guessed that.</p></li><li><p>Only then do we see the usual suspects: <strong>Luis Su&#225;rez</strong> and <strong>Harry Kane</strong> (both +10 %).</p></li><li><p><strong>Serge Gnabry</strong> also posts +10 %, while <strong>Jonathan David</strong> from Lille adds +8 %. (Sneaky good&#8212;how hadn&#8217;t I noticed him sooner?)</p></li></ul><h3>Value added per shot</h3><p>Another way to look at this is through the value added per shot. The table below presents the average xGOT per shot, the average xG per shot, and the absolute difference between the two.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XhXq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XhXq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 424w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 848w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 1272w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XhXq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png" width="541" height="367.4944320712695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/febd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:305,&quot;width&quot;:449,&quot;resizeWidth&quot;:541,&quot;bytes&quot;:23612,&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.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.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_!XhXq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 424w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 848w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.png 1272w, https://substackcdn.com/image/fetch/$s_!XhXq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffebd3f2f-4df0-4b83-b337-d46606a50f88_449x305.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>Looking at xGOT &#8722; xG per shot highlights who squeezes the most extra value out of <em>each and every</em> attempt.</p><p>Messi&#8217;s average chance is already 13%, but his placement bumps it up to 17% &#8212; a 4-point boost per shot. <strong>Put differently, the best shooter in the world adds just 4 percentage points per attempt.</strong> Talk about fine margins. Of course, once you add up multiple shots, the difference becomes more noticeable.</p><p>Son adds 3 points; Memphis, Aspas, and Immobile sit around 2.</p><p>Okay, so now that we&#8217;ve covered the best shooters, let&#8217;s take a look at the underperformers.</p><div><hr></div><h1><strong>3 &#8212; The &#8216;underperformers&#8217;</strong></h1><p>At the opposite end of the spectrum, <strong>18 of the 38 high-volume scorers</strong> posted an xGOT-to-xG ratio below 1.00.</p><p>The ten lowest (who still scored more than 80 goals) appear in the table below.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CKmw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CKmw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 424w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 848w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 1272w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CKmw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png" width="589" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:300,&quot;width&quot;:465,&quot;resizeWidth&quot;:589,&quot;bytes&quot;:24058,&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.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.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_!CKmw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 424w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 848w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.png 1272w, https://substackcdn.com/image/fetch/$s_!CKmw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30a8ebba-d75b-4dac-ba7e-2a4fbad23502_465x300.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>Lautaro Mart&#237;nez tops the list with an xGOT:xG ratio of <strong>0.86</strong>. In other words, compared with an average player shooting from the same locations, his finishing <em>reduces</em> the likelihood of a goal by about 14 %.</p><h3><em><strong>How can that be, given his reputation as one of the world&#8217;s best strikers?</strong></em></h3><p>First, note that Mart&#237;nez still <strong>out-scores raw xG and xGOT</strong>: he has 115 goals from 110 xG (a figure that includes team supply, movement and shot volume but still). He beats his 96 xGOT (115 goals), so something beyond sheer shot placement is helping him.</p><p>Why, then, does his xGOT/xG lag? Three plausible explanations:</p><ol><li><p><strong>Shot mix.</strong> Many of his attempts may be missing the target. Off-target shots keep their full xG but add zero to xGOT, pulling the ratio down.</p></li><li><p><strong>Goalkeeping.</strong> Even when his placement is mediocre, the goalkeepers he faces may under-perform, conceding shots that average keepers would save.</p></li><li><p><strong>Starting quality.</strong> He shoots frequently from close range, where xG is already high. Close-range strikes leave less room to <em>add</em> value through pinpoint placement&#8212;unlike, say, Messi-style curlers from distance that can boost conversion probability by double digit percentage points.</p></li></ol><p>A surface-level read would label Mart&#237;nez &#8220;wasteful,&#8221; but context matters.</p><p>Next comes <strong>Timo Werner</strong>, whose finishing is roughly 10 % below average&#8212;no surprise given his (bad) reputation at Chelsea and Tottenham. The same trio of factors (shot mix, goalkeeping, starting shot quality) could explain his shortfall if poor ball-striking ability does not satisfy you.</p><p>Most of the remaining group cluster around 0.95, near the overall mean of 0.97.</p><p>Again, at first glance, <strong>Karim Benzema</strong> (0.95) and <strong>Cristiano Ronaldo</strong> (0.97) might look like poor finishers (purely data-wise!).</p><p>They&#8217;re not. Thank you, Captain Obvious.</p><p>They win through <strong>where and how often they shoot</strong>, not by squeezing every last drop out of each strike: execution roughly average, shot selection elite. Blend in ageing curves&#8212;our sample spans Ronaldo&#8217;s final Madrid season and his time at Juve and Man United&#8212;and any modest xGOT surplus gets diluted.</p><p>Okay so what can we make from this?</p><div><hr></div><h1>4&#8212; Implications</h1><p><strong>1. </strong><em><strong>True elite ball-strikers are unicorns</strong></em></p><p>Across 5,724 players who took 360,430 shots in eight seasons, only 20 high-volume scorers&#8212;about <strong>0.3 % of the sample</strong>&#8212;consistently <em>added</em> value with placement.</p><p>Even the very best (Messi) raise an average chance from roughly 13 % to just 17 %. Margins are razor-thin, which is why random variance can hide&#8212;or exaggerate&#8212;a short-term &#8220;hot streak.&#8221;</p><p><em><strong>2. Placement gains disappear without volume</strong></em></p><p>Because the per-shot edge is tiny, a striker needs a large sample before placement skill shows up through the noise.</p><p>Most forwards take fewer than 100 shots a season, so judging finishing quality after &#8220;a couple of matches&#8221; is wishful thinking.</p><p><em><strong>3. Under-performance &#8800; poor finisher</strong></em></p><p>Lautaro Mart&#237;nez, Benzema, and Ronaldo prove that xGOT &lt; xG can coexist with world-class goal totals.</p><p>High-frequency shooters who find <em>better</em> positions&#8212;or face shaky keepers&#8212;can still beat raw xG. Shot selection, movement, and team context remain decisive.</p><p><em><strong>4. Convergence creates edges</strong></em></p><p>Because league-wide xG and xGOT trend toward 1 over time, <em>temporary</em> gaps are where analysts may strike (so to speak):</p><ul><li><p><strong>Recruitment:</strong> Spot undervalued youngsters whose placement already outperforms xG, even if their volume is low?</p></li><li><p><strong>Risk management:</strong> Flag veterans riding unsustainable hot streaks before the market prices correction in?</p></li></ul><p>Now let&#8217;s see who the top xGOT/xG performers were during the 2024/25 season.</p><div><hr></div><h1><strong>5 &#8212; Top 24/25 Finishers</strong></h1><p>One last stop before we share the Python notebook: who actually topped the <strong>xGOT &#247; xG</strong> leaderboard in Europe&#8217;s big-five leagues last season?</p><p>I filtered for players with <strong>at least 10 league goals</strong> and then ranked them by the ratio of post-shot to pre-shot expected goals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y9fY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y9fY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 424w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 848w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 1272w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y9fY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png" width="935" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:935,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51044,&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.pythonfootball.com/i/167370520?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.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_!y9fY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 424w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 848w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.png 1272w, https://substackcdn.com/image/fetch/$s_!y9fY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1409a72-36ef-4572-a5f9-a4ffaba0c8ca_935x376.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><strong>Shuto Machino</strong> comes out of nowhere (and newly promoted Holstein Kiel) to top the table with 1.43 xGOT to xG ratio. His shot-placement turned a typical 12.7 % conversion chance into roughly a 18.2 % one. Over the whole season, he added nearly 3 extra goals if we use the Shooting Goals Added (SGA) metric of xGOT &#8722; xG (the extra goals a player&#8217;s ball-striking contributed relative to an average finisher on the same shots).</p><p><strong>Bryan Mbeumo</strong> is right behind at 1.42 xGOT to xG, with a league-best +5.2 SGA &#8212; no wonder Manchester United are googling his name.</p><p><strong>Marcus Thuram</strong> finally gives Inter a striker who <em>over-performs</em> the models (sorry, Lautaro), while <strong>Strand Larsen</strong> (Wolves) validates the &#8220;one-to-watch&#8221; tag from our earlier <a href="https://www.pythonfootball.com/p/expected-goals-on-target-xgot-101?r=5mroiq">xGOT</a> primer.</p><p>And yes, that really is <strong>Scott McTominay</strong> sneaking into the top ten. Quite the season he&#8217;s had.</p><h3><strong>Why this matters</strong></h3><p>Across roughly one-third of Messi&#8217;s career, he adds +29 % per shot. Yet in a single season we already see ten players beating that mark. The lesson of course isn&#8217;t that Shuto Machino is a better finisher than Messi. It&#8217;s that <strong>one-year leaderboards are noisy</strong>.</p><p>Treat seasonal xGOT surpluses as flags, not verdicts, until the sample size grows.</p><p>And finally, here&#8217;s how to replicate this analysis in Python.</p><div><hr></div><h1><strong>6 &#8212; The Python Corner</strong></h1><p>Interested in recreating the analysis? All you need is a Python session and the accompanying notebook.</p><p>If you&#8217;re brand-new to Python, the quickest on-ramp is <strong>Google Colab</strong>: open a new notebook in your browser, sign in with your Gmail account, and you&#8217;re ready to code&#8212;no local setup required.</p><p>Next, grab the notebook I used for this issue by clicking the button below. Inside, you&#8217;ll find step-by-step instructions on how to:</p><ul><li><p>pull eight seasons of Opta data from FBref with <code>soccerdata</code></p></li><li><p>wrangle it with <code>polars</code></p></li><li><p>replicate every insight we&#8217;ve just covered</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/roft4p7vg87hr2i/PFR_007_Shooting_Royalty.ipynb/file&quot;,&quot;text&quot;:&quot;Download Python Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/roft4p7vg87hr2i/PFR_007_Shooting_Royalty.ipynb/file"><span>Download Python Code</span></a></p><div><hr></div><p>And there you have it&#8212;football&#8217;s shooting royalty, TL;DR style.</p><p>If this issue helped you, please pass it along!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/shooting-royalty?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/shooting-royalty?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>You now know how to rank elite finishers with xGOT, quantify how much they out-shoot the average striker, spot the big names who fall short, and see what eight seasons of data reveal about over- and under-performance in front of goal.</p><p>Until next week,</p><p><strong>Martin</strong><br><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[The Myth of the Clinical Striker]]></title><description><![CDATA[Why even Robert Lewandowski does not beat his xG, why that doesn&#8217;t make him wasteful, and what 11 seasons of data reveal about true finishing outliers.]]></description><link>https://www.transferscience.com/p/the-myth-of-the-clinical-striker</link><guid isPermaLink="false">https://www.transferscience.com/p/the-myth-of-the-clinical-striker</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 26 Jun 2025 07:00:55 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0789890a-bc32-4c85-a1c0-024c0224efa3_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #006!</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Qd5q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Qd5q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Qd5q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a94d6511-a528-4603-aa4e-a00aee562ab7_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;:2780074,&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.pythonfootball.com/i/166589014?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_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_!Qd5q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Qd5q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa94d6511-a528-4603-aa4e-a00aee562ab7_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>While reading <strong>James Tippett&#8217;s <a href="https://www.amazon.co.uk/xGenius-Expected-Science-Winning-Football/dp/1399411551">xGenius</a></strong> (a brilliant book, by the way) one idea kept bugging me:</p><blockquote><p>Over the long term, only a handful of attackers outperform their expected goals (xG) tally&#8212;and when they do, it&#8217;s not by a lot.</p></blockquote><p>Wait&#8212;<em>what?</em></p><p>Aren&#8217;t elite forwards <em>supposed</em> to bury chances above expectation?</p><p>Fans, pundits, and highlight reels love the &#8220;clinical finisher&#8221; label whenever a hot streak pops up.</p><p>So I dug in.</p><p>I pulled <strong>every shot logged by Understat in Europe&#8217;s top-five leagues from 2014/15 through 2024/25</strong> (that&#8217;s 11 full seasons) and asked three simple questions:</p><ol><li><p><strong>How many high-volume scorers genuinely beat their xG?</strong></p></li><li><p><strong>By how much?</strong></p></li><li><p><strong>What&#8217;s their average xG per shot?</strong> (Are they relying on tap-ins or scoring from outside the box?)</p></li></ol><p>Join me for the answers&#8212;served, as always, in easy-to-follow steps with Python templates you can copy-paste.</p><p>Enjoy!</p><div><hr></div><h3><strong>Quick Disclaimer</strong></h3><p>Now, before we dive in, here&#8217;s a quick disclaimer. If you haven&#8217;t read my 101 posts on <strong><a href="https://www.pythonfootball.com/p/expected-goals-xg-101?r=5mroiq">xG</a></strong> and <strong><a href="https://www.pythonfootball.com/p/expected-goals-on-target-xgot-101?r=5mroiq">xGOT</a></strong>, you can catch up <strong><a href="https://www.pythonfootball.com/p/expected-goals-xg-101?r=5mroiq">here</a></strong> and <strong><a href="https://www.pythonfootball.com/p/expected-goals-on-target-xgot-101?r=5mroiq">here</a></strong>. If you have, you would probably know that:</p><ul><li><p><strong>xG</strong> measures <em>chance creation</em>&#8212;how good the opportunity was <em>before</em> the shot.</p></li><li><p><strong>xGOT</strong> measures <em>shot execution</em>&#8212;what the striker actually did with the ball <em>after</em> contact.</p></li></ul><p>So, if you want to judge a striker&#8217;s pure finishing skill, you should really compare <strong>xGOT to xG</strong>.</p><p>However, the football world is obsessed with &#8220;strikers beating their xG,&#8221; so for this Review we&#8217;ll focus on <strong>Goals vs xG</strong> instead. That comparison isn&#8217;t meaningless&#8212;it&#8217;s still a model trained on thousands of historical shots&#8212;but it blends <strong>team supply</strong>, <strong>striker movement</strong>, <em>and</em> <strong>finishing</strong> into one value.</p><p>Now to the caveats &#8230; (the Python code to replicate the analysis from scratch is at the end of this piece).</p><div><hr></div><h1><strong>1 &#8212; The Big picture</strong></h1><p>After crunching <strong>11 seasons of data</strong> (2014/15 &#8211; 2024/25) from Europe&#8217;s top-five leagues, we end up with <strong>498,324 shots</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ib3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ib3C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 424w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 848w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 1272w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ib3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png" width="820" height="152" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:152,&quot;width&quot;:820,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24126,&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.pythonfootball.com/i/166589014?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.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_!Ib3C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 424w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 848w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 1272w, https://substackcdn.com/image/fetch/$s_!Ib3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8b0b0e1-a71d-4f51-b875-dacb3652db6e_820x152.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Those shots produced <strong>53,284 goals from 55,923 xG</strong>, which works out to:</p><ul><li><p><strong>Goals &#247; xG = 0.95</strong></p></li><li><p><strong>xG per shot = 0.11</strong></p></li></ul><p>So yes&#8212;over the long term goals and xG do converge, albeit with a slight <em>under-performance</em> relative to the model.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1><strong>2 &#8212; The High Scorers</strong></h1><p>Across those 11 seasons, <strong>39 players</strong> scored <strong>100+ goals</strong>. Below are the top ten, ordered by total goals</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cdGO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cdGO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 424w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 848w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 1272w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cdGO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png" width="1112" height="570" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:570,&quot;width&quot;:1112,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114574,&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.pythonfootball.com/i/166589014?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.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_!cdGO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 424w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 848w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.png 1272w, https://substackcdn.com/image/fetch/$s_!cdGO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09462e7-727d-4153-8ee8-c03aac4dadaa_1112x570.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><em>Highlights</em>:</p><ul><li><p><strong>Lewandowski</strong> leads the raw count&#8212;307 goals from 312 xG (Goals &#247; xG = 0.98). Under the pundit logic of &#8220;must beat xG,&#8221; the Pole would be labelled an &#8216;<em>under-performer&#8217;</em>. Reality check: the metric and the man simply converge. And given his monstrous goals tally, the two percentage points are <em>roughly in line with the model.</em></p></li><li><p><strong>Kane</strong> posts the first big outlier: 272 goals from 239 xG (<strong>+13 %</strong>), hinting at a repeatable <strong>team supply</strong>, <strong>striker movement</strong>, <em>and</em> <strong>finishing</strong> edge.</p></li><li><p><strong>Messi</strong> goes one better (253 &#247; 219 xG = <strong>1.15</strong>).</p></li><li><p><strong>Ronaldo</strong> sits almost bang on expectation (1.02), while <strong>Mbapp&#233;</strong> mirrors Kane at 1.13 and <strong>Salah</strong> hovers just above par at 1.03.</p></li></ul><p>So, in the top six we have:</p><ul><li><p><strong>One &#8220;under-performer&#8221;</strong> (Lewandowski)</p></li><li><p><strong>Two basically on par</strong> (Ronaldo, Salah)</p></li><li><p><strong>Three genuine over-performers</strong> (Messi, Mbapp&#233;, Kane)</p></li></ul><p>Not quite the narrative you get from weekend sound-bites, right?</p><div><hr></div><h1><strong>3 &#8212; The Outliers</strong></h1><p>Among all 39 centurions, who <em>really</em> tops the Goals &#247; xG chart&#8212;and by how much?</p><p>Let&#8217;s sort the list by that Goals to xG ratio and see which names pop.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ShHt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ShHt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 424w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 848w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 1272w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ShHt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png" width="1038" height="566" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:1038,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109314,&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.pythonfootball.com/i/166589014?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.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_!ShHt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 424w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 848w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.png 1272w, https://substackcdn.com/image/fetch/$s_!ShHt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6c1a271-f3d2-45cd-9a41-9ce1934be72d_1038x566.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>Surprised? Which headline grabs you more:</p><ul><li><p><strong>Son Heung-min</strong> perched at No. 1 (elite was a given, but <em>this</em> screams world-class),</p></li><li><p><strong>Dries Mertens</strong> sliding into second, or</p></li><li><p>Liverpool &#8220;flop&#8221; <strong>Iago Aspas</strong> ranking as <em>more clinical</em> than Messi?</p></li></ul><p>So we can say that <strong>25 of 39</strong> hundred-plus goal scorers posted a Goals &#247; xG ratio <em>above</em> 1.00.</p><ul><li><p><strong>Son Heung-min</strong> leads the pack: <strong>138 goals from 105.3 xG</strong> across 791 shots. That&#8217;s a <strong>1.31 ratio</strong>&#8212;scoring <strong>31 % </strong>more <em>than an average player would from the same shots</em>. That&#8217;s ridiculous. As in ridiculously good.</p></li><li><p><strong>Mertens</strong> (+22 %) and <strong>Griezmann</strong> (+20 %) round out the podium.</p></li><li><p><strong>Aspas</strong> and <strong>Dybala</strong> sit at +16 %, with <strong>Messi</strong> just behind on +15 %.</p></li></ul><p>These are the rare finishers James Tippett had in mind: the tiny cohort who consistently bend the xG curve in their favour.</p><p>Notice how slim the margins are&#8212;outperforming by 9 % over a decade is enough to put you among the sport&#8217;s most efficient shooters (according to our initial definition, which of course is open to debate).</p><p>For everyone else, goals and xG converge exactly as the model expects.</p><p>Speaking of every else, what about the 14 players that scored 100+ goals but underperformed the xG?</p><div><hr></div><h1><strong>4 &#8212; The &#8216;Underperformers&#8217;</strong></h1><p>So who sits at the other end of the scale&#8212;the lads who score plenty but <em>should</em> have scored more, given the chances they had?</p><p>Among the 39 centurions, <strong>14</strong> finished below expectation. Here are the &#8220;bottom&#8221; ten:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!daqD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!daqD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 424w, https://substackcdn.com/image/fetch/$s_!daqD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 848w, https://substackcdn.com/image/fetch/$s_!daqD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 1272w, https://substackcdn.com/image/fetch/$s_!daqD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!daqD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png" width="1112" height="568" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:568,&quot;width&quot;:1112,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111567,&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.pythonfootball.com/i/166589014?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.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_!daqD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 424w, https://substackcdn.com/image/fetch/$s_!daqD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 848w, https://substackcdn.com/image/fetch/$s_!daqD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.png 1272w, https://substackcdn.com/image/fetch/$s_!daqD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24c0fd5a-0459-479b-a364-fe73f2b9d912_1112x568.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><em>Highlights</em>:</p><ul><li><p><strong>Edin D&#382;eko</strong> is the starkest outlier: 111 goals from 145 xG (Goals &#247; xG = 0.77). That&#8217;s a 23 % shortfall (compared to what the average player would score from the same shots<em>)</em>&#8212;ouch.</p></li><li><p><strong>Lautaro Mart&#237;nez</strong> (0.96) and <strong>Aubameyang</strong> (0.94) under-shoot, but only by single-digits&#8212;well within normal noise.</p></li><li><p><strong>Timo Werner</strong>&#8217;s 0.91 fits the eye test from his Premier-League spell: excellent movement and supply, finishing not quite matching the volume of chances?</p></li></ul><div><hr></div><h1><strong>5 &#8212; What does it all mean?</strong></h1><ol><li><p><strong>Goals and xG converge</strong> over multi-season samples&#8212;even for superstars. That&#8217;s exactly what a well-trained (xG) model should do actually.</p></li><li><p><strong>Short-term spikes still matter.</strong> A player running hot (Goals &#8811; xG) is probably in form, but the burst may owe as much to team supply and a bit of luck as to pure finishing.</p></li><li><p><strong>For true clinical skill, use xGOT &#8722; xG.</strong></p><ul><li><p><strong>xG</strong> = opportunity quality.</p></li><li><p><strong>xGOT</strong> = execution quality.</p></li><li><p><strong>Shooting Goals Added (xGOT &#8722; xG)</strong> strips out the noise and isolates finishing talent. We&#8217;ll tackle that metric in a future deep dive.</p></li></ul></li></ol><p><em>xG isn&#8217;t about &#8220;clinicalness.&#8221;</em></p><p>It blends <strong>team service</strong>, <strong>striker movement</strong>, and <strong>finishing edge</strong> into a single probability.</p><p>Next time you hear &#8220;he&#8217;s so clinical&#8212;look at his goals versus xG,&#8221; reach for xGOT instead.</p><p>And finally here&#8217;s how to reproduce this analysis in Python.</p><div><hr></div><h1><strong>6 &#8212; The Python Corner</strong></h1><p>So, how do you reproduce this analysis?</p><p><strong>First things first.</strong> If you&#8217;re new to Python, head to <strong><a href="https://colab.research.google.com/">Google Colab</a></strong>&#8212;the quickest, zero-setup route (all you need is a Gmail account). Open a new notebook and you&#8217;re ready to roll.</p><p>You can download the code I&#8217;m about to detail here:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/5bbfy71hp64ezqy/PFR_006_Clinical_Strikers.ipynb/file&quot;,&quot;text&quot;:&quot;Download Python Code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/5bbfy71hp64ezqy/PFR_006_Clinical_Strikers.ipynb/file"><span>Download Python Code</span></a></p><h3><strong>Install and import the packages</strong></h3><p>We&#8217;ll use <code>soccerdata</code> by <a href="https://x.com/p_robberechts">Pieter Robberechts</a> to pull <a href="https://understat.com/">Understat</a> data and <strong>Polars</strong> for lightning-fast data wrangling.</p><pre><code><code>!pip install soccerdata
import polars as pl
import soccerdata as sd</code></code></pre><h3><strong>Define the study scope</strong></h3><p>Create lists for the leagues and the seasons you want to cover.</p><pre><code><code>leagues = ['ENG-Premier League', 'ESP-La Liga', 'FRA-Ligue 1',
           'GER-Bundesliga', 'ITA-Serie A']

seasons = ['2014/2015', '2015/2016', '2016/2017', '2017/2018',
           '2018/2019', '2019/2020', '2020/2021', '2021/2022',
           '2022/2023', '2023/2024', '2024/2025']</code></code></pre><h3><strong>Collect the shot-level data</strong></h3><p><code>sd.Understat</code> and <code>understat.read_shot_events()</code> fetch every shot event for a given league-season pair. Eleven seasons across five leagues is roughly <strong>half a million shots</strong>, so expect the scrape to take up to an hour.</p><pre><code><code>dfs_shots = []
for season in seasons:
    for league in leagues:
        understat = sd.Understat(leagues=league, seasons=season)

        df_shots = understat.read_shot_events()

        df_shots = pl.from_pandas(df_shots, include_index=True)

        df_shots = df_shots.with_columns([
            pl.lit(league).alias("league"),
            pl.lit(season).alias("season")])

        dfs_shots.append(df_shots)</code></code></pre><h3><strong>Align columns and concatenate</strong></h3><p>Column sets can vary slightly from season to season, so we harmonise them before stitching everything together.</p><pre><code><code>col_order_shots = []
for df in dfs_shots:
    for c in df.columns:
        if c not in col_order_shots:
            col_order_shots.append(c)

aligned_shots = []
for df in dfs_shots:
    missing = [c for c in col_order_shots if c not in df.columns]
    if missing:
        df = df.with_columns([pl.lit(None).alias(c) for c in missing])
    aligned_shots.append(df.select(col_order_shots))

shot_events = pl.concat(aligned_shots, how="vertical")
</code></code></pre><h3><strong>Big-picture aggregates</strong></h3><p>Total goals, total xG, shots, plus the global ratios:</p><pre><code><code>(
    df_raw
    .with_columns(
        (pl.col("result") == "Goal").alias("goal"))
    .select(
        pl.col("xg").sum().alias("xg_total"),
        pl.col("goal").sum().alias("goals_total"),
        pl.col("shot_id").count().alias("shots_total"))
    .with_columns(
(pl.col("goals_total")/pl.col("xg_total")).alias("goals_to_xg"),        (pl.col("xg_total")/pl.col("shots_total")).alias("xg_per_shot"))

)</code></code></pre><h3><strong>Player-level summary</strong></h3><p>Aggregate by player and compute Goals &#247; xG and xG per shot.</p><pre><code><code>df_shots = (
    shot_events
    .with_columns(
        (pl.col("result") == "Goal").alias("goal"))
    .group_by(["player"])
    .agg(
        pl.col("xg").sum().alias("xg_total"),
        pl.col("goal").sum().alias("goals_total"),
        pl.col("shot_id").count().alias("shots_total"))
    .with_columns(
      (pl.col("goals_total")/pl.col("xg_total")).alias("goals_to_xg"),
      (pl.col("xg_total")/pl.col("shots_total")).alias("xg_per_shot"))
)</code></code></pre><h3><strong>Slice the interesting bits</strong></h3><p>Top scorers (&#8805; 100 goals):</p><pre><code><code>(
    df_shots
    .filter(pl.col("goals_total") &gt; 100)
    .sort("goals_total", descending=True)
    .head(10)
)</code></code></pre><p>Best Goal &#247; xG ratios among those centurions:</p><pre><code><code>(
    df_shots
    .filter(pl.col("goals_total") &gt; 100)
    .sort("goals_to_xg", descending=True)
    .head(10)
)</code></code></pre><p>Worst Goal &#247; xG ratios among those centurions:</p><pre><code><code>(
    df_shots
    .filter(pl.col("goals_total") &gt; 100)
    .sort("goals_to_xg")
    .head(10)
)</code></code></pre><p>Boom&#8212;that&#8217;s the myth of the &#8220;clinical&#8221; striker, reproduced in your own notebook.</p><p>If you found this issue useful, please share it!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/the-myth-of-the-clinical-striker?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/the-myth-of-the-clinical-striker?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p>You now know <strong>why even world-class forwards don&#8217;t always beat their xG, why that doesn&#8217;t make them wasteful, and what 11 seasons of data reveal about true finishing outliers.</strong></p><p>Until next week,</p><p><strong>Martin</strong></p><p><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[xGChain & xGBuildup 101]]></title><description><![CDATA[What each metric measures, which gap they fill (left by xA and xAG), which players have posted the best build-up numbers this season, and how to pull xGChain/xGBuildup data with Python]]></description><link>https://www.transferscience.com/p/xgchain-and-xgbuildup-101</link><guid isPermaLink="false">https://www.transferscience.com/p/xgchain-and-xgbuildup-101</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 19 Jun 2025 08:01:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe999ca69-23eb-48af-b52d-d971473dd907_325x325.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The Python Football Review #005!</em></p><p>Today we add two more creativity metrics to our analyst&#8217;s tool belt: <strong>xGChain</strong> and <strong>xGBuildup</strong>.</p><p>By the end of this issue you&#8217;ll know</p><ul><li><p>what each metric measures</p></li><li><p>which gap they fill (left by <strong>xA</strong> and <strong>xAG</strong>)</p></li><li><p>which deep-lying playmakers have posted the best build-up numbers this season</p></li><li><p>which wing-backs top the charts for participation in attacking sequences</p></li><li><p>how to pull xGChain and xGBuildup in Python in seconds</p></li></ul><p>Enjoy!</p><div><hr></div><h2><em>But Martin, why do we need yet another way to judge creative talent?</em></h2><p>So far we&#8217;ve covered:</p><ul><li><p><strong><a href="https://www.pythonfootball.com/p/expected-assisted-goals-xag-101?r=5mroiq&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=false">xAG</a></strong> &#8212; gives the shot&#8217;s xG to the player who plays the <em>final</em> pass.</p></li><li><p><strong><a href="https://www.pythonfootball.com/p/expected-assists-xa-101?r=5mroiq">xA</a></strong> &#8212; assigns every completed pass a probability of <em>eventually</em> becoming an assist.</p></li></ul><p>Both reward the player closest to goal but overlook the <strong>initiators</strong>:</p><ul><li><p>deep pivots who progress play (the Rodris and Jorginhos)</p></li><li><p>centre-backs who split lines (the John Stones and Virgil van Dijks)</p></li><li><p>wing-backs who join the build-up (the Cafus and Kyle Walkers)</p></li></ul><p>Because these actions start far from goal, they accrue only modest xA and almost no xAG.</p><p>That&#8217;s the gap <strong>xGChain</strong> and <strong>xGBuildup</strong> are designed to close.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to get these in your inbox every Thursday.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>1 &#8212; What are xGChain and xGBuildup?</h2><p><strong>xGChain</strong> gives every player who touches the ball in a possession the shot&#8217;s <strong><a href="https://www.pythonfootball.com/p/expected-goals-xg-101?r=5mroiq">xG</a></strong> if that possession ends in a shot.</p><p><em>Example:</em> a move ends with a 0.25-xG shot. Every participant&#8212;keeper to striker&#8212;adds <strong>0.25</strong> to their xGChain total.</p><p>Three details matter:</p><ol><li><p>The simplest touch and a forty-yard carry <em>count the same</em> if they&#8217;re in the same chain.</p></li><li><p>No shot &#8594; 0 xGChain for everyone in that possession.</p></li><li><p>Because credit is copied to each player, the squad&#8217;s summed xGChain will exceed the team&#8217;s match xG&#8212;so this is a <em>player</em> metric, not a team one (even though we can use it to analyse team structure, more on that below).</p></li></ol><p>Great for spotting who <strong>helps</strong> attacks reach the box: xAG credits <em>one</em> passer; xGChain credits <em>everyone</em> involved.</p><h3>Why xGBuildup then?</h3><p>Rank players by xGChain and advanced attackers still top the list&#8212;they finish and assist, so they appear in nearly every chain. To surface the early-phase contributors we use <strong>xGBuildup</strong>:</p><ul><li><p>Start with xGChain.</p></li><li><p><strong>Exclude</strong> the players who made the final two touches&#8212;the key pass and the shot.</p></li></ul><p>What remains is xGBuildup.</p><p>Some elite attackers still rank highly even after you strip away their shots and assists; that simply means they also contribute in the build-up&#8212;valuable context.</p><p>And yes, expect Lionel Messi to still pop up near the top (not that you needed yet another metric to remind you of this).</p><p>Okay, moving on&#8230;</p><div><hr></div><h2>2 &#8212; How analysts use xGChain &amp; xGBuildup</h2><p>There are two main applications:</p><ol><li><p><strong>Scouting and player evaluation</strong> &#8211; surfacing deep-lying contributors who rarely appear on assist charts.</p></li><li><p><strong>Tactical profiling</strong> &#8211; mapping where a team&#8217;s build-up flows without watching a single minute of video.</p></li></ol><p>Below are quick case studies from the 2024/25 season (Europe&#8217;s top five leagues). You&#8217;ll be able to reproduce the tables in Python later.</p><div><hr></div><h3>2.1 &#8212; Scouting &amp; evaluating players</h3><h3>Top xGBuildup/90, 2024-25</h3><p>Okay, so who were the players that topped the xGBuildup per 90 minutes rankings during the past season? Because xGBuildup strips out shots and key passes, the leaderboard is dominated by midfielders and defenders&#8212;exactly the roles we want to judge.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J9kU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J9kU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 424w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 848w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 1272w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J9kU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png" width="1314" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:1314,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:147194,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.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_!J9kU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 424w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 848w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.png 1272w, https://substackcdn.com/image/fetch/$s_!J9kU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a825621-0088-4e9b-a8d4-d111bdd94f6d_1314x564.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><ul><li><p><strong>Vitinha</strong> sits miles clear at <strong>1.18 xGBuildup/90</strong>&#8212;on average he takes part in attacking sequences worth 1.18 xG every match.</p></li><li><p>His midfield partner <strong>Fabi&#225;n Ruiz</strong> follows at <strong>0.97</strong>, underlining PSG&#8217;s central dominance.</p></li><li><p>Two full-backs&#8212;<strong>Nuno Mendes</strong> (0.91) and <strong>Achraf Hakimi</strong> (0.89)&#8212;both rank in the top four, suggesting PSG&#8217;s build-up is well balanced across flanks.</p></li><li><p>As expected, the list is almost entirely midfielders and defenders once key-pass credit is removed.</p></li></ul><h3>Top xGChain/90, 2024-25</h3><p>Including the shot and assist brings attackers back into view.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oviw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oviw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 424w, https://substackcdn.com/image/fetch/$s_!oviw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 848w, https://substackcdn.com/image/fetch/$s_!oviw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 1272w, https://substackcdn.com/image/fetch/$s_!oviw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oviw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png" width="1340" height="568" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:568,&quot;width&quot;:1340,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:148228,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.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_!oviw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 424w, https://substackcdn.com/image/fetch/$s_!oviw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 848w, https://substackcdn.com/image/fetch/$s_!oviw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.png 1272w, https://substackcdn.com/image/fetch/$s_!oviw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F571b7cb3-b07e-42d4-96ea-df8a2e44948d_1340x568.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><ul><li><p><strong>Ousmane Demb&#233;l&#233;</strong> tops the table at <strong>1.65 xGChain/90</strong>&#8212;fitting for a player who re-invented the false-9 role in PSG&#8217;s historic season. No wonder he is now a Ballon d&#8217;Or favourite (hands up if you predicted that last August; I certainly didn&#8217;t).</p></li><li><p><strong>Gon&#231;alo Ramos</strong> makes the list despite limited starts; his touches keep showing up in scoring moves even when he isn&#8217;t the one shooting.</p></li><li><p><strong>Bradley Barcola</strong> and <strong>Khvicha Kvaratskhelia</strong> round out the top four, underlining just how balanced PSG&#8217;s attack (and, as we saw earlier, their build-up) has been.</p></li></ul><div><hr></div><h3>2.2 &#8212; Assessing team patterns</h3><p><em>But Martin, didn&#8217;t you say xGChain and xGBuildup are player metrics?</em></p><p>I did&#8212;yet comparing a few key players can still reveal where a team&#8217;s build-up flows.</p><p>Earlier we saw <strong>Achraf Hakimi</strong> (right) and <strong>Nuno Mendes</strong> (left) posting almost identical xGBuildup figures, suggesting PSG advance play down both flanks in roughly equal measure. Let&#8217;s apply the same lens to Arsenal.</p><h3>Arsenal wide balance, 2024-25</h3><p>This season Gabriel Martinelli often looked isolated on the left. The numbers agree.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CaA5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CaA5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 424w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 848w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 1272w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CaA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png" width="1262" height="190" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:190,&quot;width&quot;:1262,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47097,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.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_!CaA5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 424w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 848w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 1272w, https://substackcdn.com/image/fetch/$s_!CaA5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06f5c423-372f-4de4-a47c-d1e2513b9e40_1262x190.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Saka is involved earlier and more often (0.31 vs 0.17 xGBuildup/90), pointing to a right-heavy build-up bias. The narrower gap in xGChain (0.84 vs 0.66 xGChain/90) shows Martinelli does contribute more in the final phases, but the attack tilts right from start to finish.</p><h3>Arsenal centre-backs</h3><p>Saliba and Gabriel drive progression from the back. When <strong>Jakub Kiwior</strong> steps in, Arsenal lose roughly 0.13 xGBuildup per 90 at centre-back&#8212;a reminder that depth matters if your system relies on ball-playing defenders to start attacks.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QHPJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QHPJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 424w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 848w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 1272w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QHPJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png" width="1242" height="240" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:240,&quot;width&quot;:1242,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56607,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.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_!QHPJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 424w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 848w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 1272w, https://substackcdn.com/image/fetch/$s_!QHPJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c8e0406-00af-405c-9496-eb116e1c28a9_1242x240.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><h3>2.3 &#8212; Things to watch out for</h3><ul><li><p><strong>Team style inflation</strong> &#8211; Possession-heavy sides naturally inflate xGBuildup (I am looking at you, Pep); always benchmark within league and pace context.</p></li><li><p><strong>Direct teams</strong> &#8211; A low xGBuildup doesn&#8217;t always mean a player is conservative; the ball might bypass midfield altogether (think Leicester&#8217;s title-winning 15/16 campaign).</p></li><li><p><strong>Double counting</strong> &#8211; Forwards with huge shot volumes can dominate xGChain leaderboards. Subtract the player&#8217;s own xG if you want non-shooting influence.</p></li><li><p><strong>Sample size</strong> &#8211; Use per-90 numbers and set a sensible minutes threshold (e.g., &gt;900 mins) to avoid noise.</p></li></ul><p>Great, now that we have covered those, let&#8217;s do some coding.</p><div><hr></div><h2><strong>3&#8212;How to Fetch xGChain and xGBuildup Data Using Python</strong></h2><p>Here&#8217;s how to pull xGChain and xGBuildup yourself.</p><p>If you&#8217;re new to Python, the quickest route is <strong>Google Colab</strong>&#8212;a free, browser-based notebook that needs zero local setup.</p><ol><li><p>Go to https://colab.research.google.com and sign in with your Google account.</p></li><li><p>In Colab, click <strong>File &#8594; New notebook</strong>.</p></li></ol><p>You can paste the snippets below or download the full notebook:</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/j2ghhc4bxtsvvrq/PFR_005_xGChain_xGBuildup.ipynb/file&quot;,&quot;text&quot;:&quot;Download Python code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/j2ghhc4bxtsvvrq/PFR_005_xGChain_xGBuildup.ipynb/file"><span>Download Python code</span></a></p><p>We&#8217;ll use two libraries:</p><ul><li><p><code>soccerdata</code>, a community wrapper by <a href="https://x.com/p_robberechts">Pieter Robberechts</a> that scrapes Understat.</p></li><li><p><code>polars</code>, our preferred dataframe engine.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3ht_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3ht_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 424w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 848w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 1272w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3ht_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png" width="316" height="238.17910447761193" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:404,&quot;width&quot;:536,&quot;resizeWidth&quot;:316,&quot;bytes&quot;:75199,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.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_!3ht_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 424w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 848w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 1272w, https://substackcdn.com/image/fetch/$s_!3ht_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5a7e04a-dada-4a13-86a8-facea38e2833_536x404.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>In the example below we pull Europe&#8217;s top-five leagues for the 2024/25 season. You can add any season from <strong>2014/15</strong> onward by extending the list.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6igo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6igo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 424w, https://substackcdn.com/image/fetch/$s_!6igo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 848w, https://substackcdn.com/image/fetch/$s_!6igo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 1272w, https://substackcdn.com/image/fetch/$s_!6igo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6igo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png" width="466" height="281.79059829059827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:566,&quot;width&quot;:936,&quot;resizeWidth&quot;:466,&quot;bytes&quot;:122166,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.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_!6igo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 424w, https://substackcdn.com/image/fetch/$s_!6igo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 848w, https://substackcdn.com/image/fetch/$s_!6igo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.png 1272w, https://substackcdn.com/image/fetch/$s_!6igo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29cbef7a-270a-4f0c-9d47-e40dda925ba5_936x566.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>Next we run a simple <code>read_player_stats()</code> to pull the player stats for the season and then transform the resulting <code>pandas</code> dataframe into a <code>polars</code> one with <code>from_polars</code>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kOQl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kOQl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 424w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 848w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 1272w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kOQl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png" width="470" height="240.1711491442543" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:418,&quot;width&quot;:818,&quot;resizeWidth&quot;:470,&quot;bytes&quot;:87938,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.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_!kOQl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 424w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 848w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.png 1272w, https://substackcdn.com/image/fetch/$s_!kOQl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcc7a79a0-1845-4452-907f-cfcd5d17b839_818x418.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>At this point you&#8217;ll see a wide table with dozens of columns&#8212;one row per player &#215; season.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rD1V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rD1V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 424w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 848w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 1272w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rD1V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png" width="1456" height="253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:253,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:161094,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.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_!rD1V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 424w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 848w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 1272w, https://substackcdn.com/image/fetch/$s_!rD1V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff39aaf10-dac1-4545-ae54-c28f33c954af_2846x494.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Next, we&#8217;ll keep only the variables we care about&#8212;season, team, player, position, minutes played, and their xGBuildup and xGChain values&#8212;and then calculate the corresponding per-90 figures.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PQd9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PQd9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 424w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 848w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 1272w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PQd9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png" width="588" height="232.9353507565337" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:576,&quot;width&quot;:1454,&quot;resizeWidth&quot;:588,&quot;bytes&quot;:138383,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.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_!PQd9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 424w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 848w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 1272w, https://substackcdn.com/image/fetch/$s_!PQd9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb48a6ba3-413f-4df6-a1ac-83abdfce2899_1454x576.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vd0V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vd0V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 424w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 848w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 1272w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vd0V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png" width="1252" height="380" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:380,&quot;width&quot;:1252,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85888,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.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_!Vd0V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 424w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 848w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.png 1272w, https://substackcdn.com/image/fetch/$s_!Vd0V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76a57884-6b12-4b86-bd0a-e45079c04b9a_1252x380.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>Next, we replicate the tables from the case studies. First, we filter for players who have appeared in at least 10 matches and return the top ten in xGBuildup per 90 minutes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PUPZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PUPZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 424w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 848w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 1272w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PUPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png" width="446" height="269.52517985611513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:504,&quot;width&quot;:834,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:98973,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.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_!PUPZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 424w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 848w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.png 1272w, https://substackcdn.com/image/fetch/$s_!PUPZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bda829b-3854-4a54-b6c2-b9a4f4b6d0c8_834x504.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 here we simply change the sorting parameter to <code>xg_chain_90</code> to order the players by that metric.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PpqA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PpqA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 424w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 848w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 1272w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PpqA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png" width="388" height="238.91169451073986" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:516,&quot;width&quot;:838,&quot;resizeWidth&quot;:388,&quot;bytes&quot;:104551,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.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_!PpqA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 424w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 848w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 1272w, https://substackcdn.com/image/fetch/$s_!PpqA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76f19ee8-c3ad-4854-b9cf-f6a9cc40f7a8_838x516.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And here&#8217;s the coding bit for focusing only on Saka and Martinelli</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!auqG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!auqG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 424w, https://substackcdn.com/image/fetch/$s_!auqG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 848w, https://substackcdn.com/image/fetch/$s_!auqG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 1272w, https://substackcdn.com/image/fetch/$s_!auqG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!auqG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png" width="440" height="230.91603053435114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:550,&quot;width&quot;:1048,&quot;resizeWidth&quot;:440,&quot;bytes&quot;:111053,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.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_!auqG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 424w, https://substackcdn.com/image/fetch/$s_!auqG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 848w, https://substackcdn.com/image/fetch/$s_!auqG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 1272w, https://substackcdn.com/image/fetch/$s_!auqG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e591422-9208-40c1-bfa0-8b643ea58c82_1048x550.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And the bit for focusing on Arsenal&#8217;s three central defenders.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7t1z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7t1z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 424w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 848w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 1272w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7t1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png" width="424" height="259.1111111111111" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:594,&quot;width&quot;:972,&quot;resizeWidth&quot;:424,&quot;bytes&quot;:117847,&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.pythonfootball.com/i/166300292?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.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_!7t1z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 424w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 848w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.png 1272w, https://substackcdn.com/image/fetch/$s_!7t1z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F072ef155-89cb-4a7f-967f-4393ac09434a_972x594.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>You can now fire up Python and explore other seasons, teams, and players to see what the underlying data reveals.</p><div><hr></div><p>Boom&#8212;that was xGChain/xGBuildup 101.</p><p>If you found this issue useful, please spread the word! </p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/xgchain-and-xgbuildup-101?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/xgchain-and-xgbuildup-101?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/xgchain-and-xgbuildup-101?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>You now know more about these two metrics than most football fans: what they measure, how to use them, why they shouldn&#8217;t be underestimated, and&#8212;crucially&#8212;how to pull extensive data with just a few lines of Python.</p><p>Until next week,</p><p><strong>Martin</strong></p><p><em>The Python Football Review</em></p>]]></content:encoded></item><item><title><![CDATA[Expected Assists (xA) 101]]></title><description><![CDATA[What xA measures, why people confuse it with xAG (and why you shouldn't), how to uncover hidden creative talent, and how to pull tons of xA data with a few lines of Python code]]></description><link>https://www.transferscience.com/p/expected-assists-xa-101</link><guid isPermaLink="false">https://www.transferscience.com/p/expected-assists-xa-101</guid><dc:creator><![CDATA[MartinOnData]]></dc:creator><pubDate>Thu, 12 Jun 2025 08:00:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe999ca69-23eb-48af-b52d-d971473dd907_325x325.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hi friend,</p><p>Welcome to <em>The&#8239;Python Football Review&#8239;#004!</em></p><p>We previously dissected <strong>Expected&#8239;Assisted&#8239;Goals (<a href="https://www.pythonfootball.com/p/expected-assisted-goals-xag-101?r=5mroiq">xAG</a>)</strong>. If you missed that issue, catch up <a href="https://www.pythonfootball.com/p/expected-assisted-goals-xag-101?r=5mroiq">here</a>.</p><p>Today we explore its first cousin <strong>Expected&#8239;Assists (xA)</strong>&#8212;and, spoiler alert, they are <em>not</em> the same metric.</p><p>By the end of this issue, you&#8217;ll know:</p><ul><li><p>what xA stands for</p></li><li><p>how it patches two of xAG&#8217;s biggest blind spots</p></li><li><p>how analysts use it&#8212;and the traps you should avoid</p></li><li><p>how to profile different types of creators</p></li><li><p>how to scrape full seasons of xA with just a few lines of Python <em>(templates included)</em></p></li></ul><p>Enjoy!</p><div><hr></div><h2><em>Wait&#8230; aren&#8217;t xA and xAG the same thing?</em></h2><p>Be honest. How many of you thought they were interchangeable? &#9995;</p><p>I certainly did.</p><p>Turns out I was wrong.</p><p>Both stats aim to value creativity, but under the hood they are somewhat distant relatives.</p><h3>Quick refresher on xAG</h3><p>xAG assigns the <strong>xG of the next shot</strong> to the passer who supplied that shot.</p><ul><li><p><strong>Blind spot #1 &#8211; The dribble tax:</strong> if the receiver slaloms past five defenders before shooting, the original passer still gets credit for the inflated xG.</p></li><li><p><strong>Blind spot #2 &#8211; The pass&#8209;before&#8209;the&#8209;pass:</strong> if the receiver decides to pass rather than shoot, the original passer receives <strong>zero</strong> credit.</p></li></ul><p>xA removes both blind spots:</p><ul><li><p><strong>Freeze&#8209;frame at reception</strong> &#8211; The passer is scored <em>the moment the ball arrives</em>, before any solo heroics inflate xG (looking at you, Leo Messi).</p></li><li><p><strong>Every completed pass counts</strong> &#8211; Even if no shot follows, each pass receives a probability of becoming a goal.</p></li></ul><p>But let&#8217;s not get ahead of ourselves.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h1>1 &#8212; So What <em>is</em> xA?</h1><p>Every completed pass is graded from <strong>0.00</strong> to <strong>1.00</strong> according to how often <em>historically similar</em> passes became goals.</p><p>For example, a diagonal through&#8209;ball completed inside the box might score 0.25&#8239;xA&#8212;meaning one in four similar passes historically became goals.</p><p>Miss the receiver entirely? xA = <strong>0</strong>. You can&#8217;t assist phantom team&#8209;mates.</p><p><em>Thank you, Captain Obvious.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c0Vv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c0Vv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 424w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 848w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 1272w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c0Vv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png" width="366" height="166.00714285714287" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:254,&quot;width&quot;:560,&quot;resizeWidth&quot;:366,&quot;bytes&quot;:34634,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.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_!c0Vv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 424w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 848w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 1272w, https://substackcdn.com/image/fetch/$s_!c0Vv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ad7efc4-43bd-4354-be0c-23e7398df359_560x254.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>What goes into the model?</h3><ol><li><p><strong>Pass context</strong></p><p>&#8226; Start &amp; end coordinates</p><p>&#8226; Pass length &amp; angle</p><p>&#8226; Delivery type (through&#8209;ball, cross, set&#8209;piece, header&#8230;)</p><p>&#8226; Phase of play (open play, free&#8209;kick, corner&#8230;)</p></li><li><p><strong>Historical outcome</strong></p><p>&#8226; Frequency with which those passes became <em>official</em> assists</p></li></ol><p>Most providers run a logistic regression (or gradient&#8209;boosted tree) to spit out the probability.</p><p><strong>Important:</strong> xA stops counting at reception. The receiver can pass backwards or dribble sideways; the passer already has his probability.</p><p>xA therefore does <strong>not</strong> tell you how many assists a player <em>should</em> have. Instead it measures the <em><strong>quality</strong></em> and <em><strong>frequency</strong></em> of passes into dangerous areas.</p><div><hr></div><h1>2 &#8212; The classic analyst pitfall</h1><p>Because <em>every</em> successful pass enters the tally, high&#8209;possession teams will naturally pile up xA. Summing an individual&#8217;s season&#8209;long xA and comparing it one&#8209;for&#8209;one with his assist total is a category error:</p><ul><li><p>xA &#8800; &#8220;deserved assists&#8221;</p></li><li><p>xA &#8594; &#8220;volume&#8209;weighted danger injected by passes&#8221;</p></li></ul><p>Always look at <strong>per&#8209;90</strong> or <strong>possession&#8209;adjusted</strong> rates and compare roles, not raw totals.</p><p>And also, be mindful of how each data provider labels its statistics.</p><p>For instance, Opta data on FBref follows the definitions we&#8217;ve used here, whereas Understat calls &#8220;xA&#8221; what we&#8217;ve previously defined as xAG.</p><p>Confusing, I know.</p><p>Bottom line: always read a provider&#8217;s documentation before using any metric.</p><div><hr></div><h1>3 &#8212; How professionals use xA</h1><ul><li><p><strong>Scouting hidden creators</strong> &#8212; Deep&#8209;lying playmakers, wing&#8209;backs, even centre&#8209;backs with a quarterback switch can rack up xA long before they register a headline&#8209;making assist.</p></li><li><p><strong>Process vs outcome audits</strong> &#8212; A winger on a cold assist streak but steady xA is probably getting let down by finishing, not suddenly running out of ideas.</p></li><li><p><strong>Tactical fingerprints</strong> &#8212; Plotting xA by pitch zone highlights which channels a team repeatedly exploits.</p></li></ul><p>Most importantly, xA is often <em>paired with </em>xAG to refine the profile of a creator. A few rules of thumb:</p><ul><li><p><strong>High xA + high xAG</strong> &#8594; elite creator who delivers plenty of dangerous final balls.</p></li><li><p><strong>High xA, low xAG</strong> &#8594; volume distributor whose team&#8209;mates often fail to shoot.</p></li><li><p><strong>Low xA, high xAG</strong> &#8594; low&#8209;touch playmaker who saves his bullets for killer passes.</p></li></ul><h2><strong>Mini&#8209;case study: the Premier League&#8217;s top 10 creators</strong></h2><p>Below are the top 10 Premier League creators for the 2024/25 season (data up to 6&#8239;May 2025). For each player you&#8217;ll see total assists, xAG, xA, minutes played, their per&#8209;90 versions, and their ranks in terms of <code>xA_90</code> and <code>xAG_90</code>. Data is sorted by the players&#8217; xA_90 rank.</p><p><em>Don&#8217;t worry&#8212;full Python code to reproduce this table appears at the end.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L1wB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L1wB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 424w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 848w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 1272w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L1wB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png" width="1456" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:149337,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.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_!L1wB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 424w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 848w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.png 1272w, https://substackcdn.com/image/fetch/$s_!L1wB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa809820a-8528-4ea6-8331-f6bcb994e238_1520x568.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>So what do we see?</p><ol><li><p><strong>Bukayo Saka</strong> <em>(High xA + High xAG):</em> Arsenal&#8217;s right&#8209;sider is both <em>busy</em> and <em>deadly</em>. He supplies lots of balls into danger (highest xA) <strong>and</strong> those balls turn into big&#8209;value shots (xAG &#8776; xA). Classic elite creator.</p></li><li><p><strong>Kevin De Bruyne</strong> <em>(Low&#8209;volume sniper):</em> xAG&#8239;/&#8239;90 is actually <strong>higher</strong> than his xA&#8239;/&#8239;90. He doesn&#8217;t spam passes; instead he waits for the killer ball that becomes a huge chance.</p></li><li><p><strong>S&#225;vio</strong> <em>(Balanced creator):</em> Very active and the shot value is almost keeping up with the volume. A reliable supply line for City.</p></li><li><p><strong>James Maddison</strong> <em>(High xA, low xAG):</em> ****Maddison keeps finding advanced receivers, but Spurs either (a) take extra touches/dribbles before shooting or (b) fail to shoot at all. The pass is dangerous in principle, but the resulting shot&#8212;if any&#8212;carries far less xG.</p></li><li><p><strong>Dwight McNeil</strong> <em>(Above&#8209;average both):</em> ****Everton&#8217;s wide creator is fairly balanced; shot quality lags volume a bit but not dramatically.</p></li><li><p><strong>Trent Alexander&#8209;Arnold</strong> <em>(Volume distributor):</em> ****Lots of probing passes (high xA), yet Liverpool&#8217;s eventual shots from those balls are middling. Typical of a high&#8209;crossing full&#8209;back.</p></li><li><p><strong>Phil Foden</strong> <em>(Volume distributor):</em> Similar story to Trent, although from more central zones. A steady stream of chances that aren&#8217;t always huge.</p></li><li><p><strong>Martin &#216;degaard</strong> <em>(Table&#8209;setting 10):</em> Like Maddison, he racks up danger in the build&#8209;up, but Arsenal often recycle or shoot from trickier angles afterward, deflating xAG.</p></li><li><p><strong>Harvey Barnes</strong> <em>(Secondary creator):</em> ****Respectable volume; the shot value lags&#8212;perhaps because many of his passes are squared across the box rather than cut&#8209;backs.</p></li><li><p><strong>Cole Palmer</strong> <em>(Selective killer passes):</em> ****The inverse of Maddison/&#216;degaard: Palmer&#8217;s passes don&#8217;t flood the box (xA rank only 10th), yet when he does supply a key ball it tends to become a high&#8209;xG shot (ranked 7th). Chelsea lean on him for the decisive action rather than general ball circulation.</p></li></ol><p>Phew! I hope I haven&#8217;t lost you.</p><p>The xA&#8202;/&#8202;xAG combination quickly highlights under&#8209;achievers (hello, James&#8239;Maddison) and selective assassins like De&#8239;Bruyne or Palmer&#8212;though you probably knew that already.</p><p>Key takeaways:</p><ul><li><p>xA&#8202;/&#8202;xAG adds the nuance needed to spot under&#8209;achievers.</p></li><li><p>It can help you track how a player&#8217;s creative profile evolves over time.</p></li><li><p>Most importantly, by applying the same analysis to less&#8209;watched leagues and players, you can uncover the next global megastar. You&#8217;re welcome. &#128522;</p></li></ul><p>And finally here&#8217;s the Python template of the day.</p><div><hr></div><h1>4 &#8212; Getting xA Data with Python</h1><p>So how do we get our hands on xA data? If you&#8217;ve followed previous issues of <em>The&#8239;Python Football Review</em>, you know the drill: Opta data freely shared on FBref.</p><p>Rather than spend hours writing your own scraper, let <a href="https://x.com/p_robberechts">Pieter Robberechts</a>&#8217; <code>soccerdata</code> library handle the heavy lifting.</p><p>Before we begin, here&#8217;s a download link to the code you are about to read.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.mediafire.com/file/vq1t1qqcgarxld4/PFR_004_xA.ipynb/file&quot;,&quot;text&quot;:&quot;Download code&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.mediafire.com/file/vq1t1qqcgarxld4/PFR_004_xA.ipynb/file"><span>Download code</span></a></p><p>So first we install <em>soccerdata</em> and import it alongside Polars.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!k8aI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!k8aI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 424w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 848w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 1272w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!k8aI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png" width="348" height="265.20446096654274" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33073cda-0590-4298-a72c-fc9b8110f371_538x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:538,&quot;resizeWidth&quot;:348,&quot;bytes&quot;:76605,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.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_!k8aI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 424w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 848w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.png 1272w, https://substackcdn.com/image/fetch/$s_!k8aI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33073cda-0590-4298-a72c-fc9b8110f371_538x410.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>Next we define the scope of our study by specifying the 2024/25 English Premier League season from FBref. We fetch the passing stats by calling <code>read_player_season_stats</code> with <code>stat_type="passing"</code> to capture both xA and xAG.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FaZM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FaZM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 424w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 848w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 1272w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FaZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png" width="552" height="169.04499274310595" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:1378,&quot;resizeWidth&quot;:552,&quot;bytes&quot;:114546,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.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_!FaZM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 424w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 848w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 1272w, https://substackcdn.com/image/fetch/$s_!FaZM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a688d1-b127-41b1-b793-b8e81ed1c03f_1378x422.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The returned DataFrame has 28 columns.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!emoV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!emoV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 424w, https://substackcdn.com/image/fetch/$s_!emoV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 848w, https://substackcdn.com/image/fetch/$s_!emoV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 1272w, https://substackcdn.com/image/fetch/$s_!emoV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!emoV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png" width="1456" height="476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:476,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:191959,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.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_!emoV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 424w, https://substackcdn.com/image/fetch/$s_!emoV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 848w, https://substackcdn.com/image/fetch/$s_!emoV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.png 1272w, https://substackcdn.com/image/fetch/$s_!emoV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd722e50-8dc5-4695-8d0f-af30d3fa373e_2194x718.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>That&#8217;s why we keep only what you need&#8212;<code>player</code>, <code>position</code>, <code>90s</code>, <code>assists</code>, <code>xAG</code>, and <code>xA</code>&#8212;then convert it to Polars for easier wrangling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9r8Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9r8Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 424w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 848w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 1272w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9r8Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png" width="528" height="268.78068410462777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:506,&quot;width&quot;:994,&quot;resizeWidth&quot;:528,&quot;bytes&quot;:109266,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.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_!9r8Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 424w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 848w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.png 1272w, https://substackcdn.com/image/fetch/$s_!9r8Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f02373e-2f11-450a-a099-17ec3ef07464_994x506.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><strong>And finally we wrangle the data to</strong></p><ul><li><p>Filter out players with fewer than 10 matches.</p></li><li><p>Create the per&#8209;90 metrics.</p></li><li><p>Rank <code>xA_90</code> and <code>xAG_90</code>.</p></li><li><p>Sort by <code>xA_90</code> in descending order.</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_!WKAf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WKAf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 424w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 848w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 1272w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WKAf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png" width="511" height="353.9148148148148" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:748,&quot;width&quot;:1080,&quot;resizeWidth&quot;:511,&quot;bytes&quot;:160897,&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.pythonfootball.com/i/165735006?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.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_!WKAf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 424w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 848w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.png 1272w, https://substackcdn.com/image/fetch/$s_!WKAf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ea90cbc-3560-441c-b4b7-69d8884f9351_1080x748.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>Et&#8239;voil&#224;&#8212;the table you just saw, ready for analysis.</p><div><hr></div><p>Boom&#8212;<strong>that&#8217;s xA 101</strong>.</p><p>If you found this issue useful, please spread the word! You now know what xA is, how it&#8217;s calculated, why so many people confuse it with xAG (and why <em>you</em> won&#8217;t), how to uncover hidden creative talent, and&#8212;most importantly&#8212;how to pull a season&#8217;s worth of data with just a few lines of Python.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/expected-assists-xa-101?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.transferscience.com/p/expected-assists-xa-101?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.transferscience.com/p/expected-assists-xa-101?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>I&#8217;m still experimenting with the newsletter&#8217;s format, so your feedback is invaluable. Would you prefer shorter bites, longer deep dives, more Python, or more case-studies? Or does this mix hit the sweet spot?</p><p>My goal is to build this newsletter <em>with</em> you.</p><p>Until next week,</p><p><strong>Martin</strong></p><p><em>The&#8239;Python Football Review</em></p>]]></content:encoded></item></channel></rss>