<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: remi foures</title>
    <description>The latest articles on DEV Community by remi foures (@remi_foures_036456c35af85).</description>
    <link>https://dev.to/remi_foures_036456c35af85</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3974481%2F93cb73aa-f876-48c7-8202-298e6ade5055.png</url>
      <title>DEV Community: remi foures</title>
      <link>https://dev.to/remi_foures_036456c35af85</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/remi_foures_036456c35af85"/>
    <language>en</language>
    <item>
      <title>Does Early Dragon Control Help Scaling Compositions? A Big Data Analysis of League of Legends</title>
      <dc:creator>remi foures</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:05:51 +0000</pubDate>
      <link>https://dev.to/remi_foures_036456c35af85/does-early-dragon-control-help-scaling-compositions-a-big-data-analysis-of-league-of-legends-3f87</link>
      <guid>https://dev.to/remi_foures_036456c35af85/does-early-dragon-control-help-scaling-compositions-a-big-data-analysis-of-league-of-legends-3f87</guid>
      <description>&lt;h1&gt;
  
  
  Does the First Dragon Help Scaling Compositions Win?
&lt;/h1&gt;

&lt;p&gt;Every &lt;strong&gt;League of Legends&lt;/strong&gt; player has heard some version of this argument:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We're a scaling comp, just don't feed and we win late game."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But what actually accelerates that scaling?&lt;/p&gt;

&lt;p&gt;Is the &lt;strong&gt;first dragon&lt;/strong&gt; one of those levers?&lt;/p&gt;

&lt;p&gt;My hypothesis was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Does securing the first dragon before 10 minutes improve the win rate of scaling compositions more than it improves early-game compositions—and does this effect vary by ELO?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project was built as part of a &lt;strong&gt;Big Data school project&lt;/strong&gt;, where I had complete freedom to choose the topic. Since Riot provides an exceptionally rich API with timestamped events, League of Legends became the perfect dataset.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Pipeline
&lt;/h1&gt;

&lt;p&gt;The entire stack runs locally using &lt;strong&gt;Docker Compose&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apache Airflow 2.8&lt;/li&gt;
&lt;li&gt;LocalStack (S3 emulation)&lt;/li&gt;
&lt;li&gt;Pandas&lt;/li&gt;
&lt;li&gt;PyArrow&lt;/li&gt;
&lt;li&gt;Elasticsearch 8.11&lt;/li&gt;
&lt;li&gt;Kibana 8.11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Riot Games API v5&lt;/li&gt;
&lt;li&gt;Data Dragon CDN&lt;/li&gt;
&lt;li&gt;Leaguepedia API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The DAG executes 9 tasks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ingest_riot_kr, ingest_riot_euw,
 ingest_data_dragon, ingest_leaguepedia]

            ↓

[format_matches,
 format_champions,
 format_pro_matches]

            ↓

combine_dragon_kpi

            ↓

index_elasticsearch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The data lake follows a three-layer architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data/raw/lol/matches/{elo}/date={date}/

↓

data/formatted/lol/matches/date={date}/

↓

data/usage/lol/dragon_kpi/date={date}/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Defining "Scaling"
&lt;/h1&gt;

&lt;p&gt;Simply saying that a composition is "scaling" is subjective.&lt;/p&gt;

&lt;p&gt;Instead, I computed a &lt;strong&gt;scaling score&lt;/strong&gt; between 0 and 1 using champion growth statistics from Data Dragon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;hp_growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hpperlevel&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ad_growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attackdamageperlevel&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;as_growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attackspeedperlevel&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;stat_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;hp_growth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ad_growth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;as_growth&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="err"&gt;∩&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Mage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Marksman&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Support&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="n"&gt;tag_bonus&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="err"&gt;∩&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Fighter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tank&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Assassin&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="n"&gt;tag_bonus&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;

&lt;span class="n"&gt;scaling_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stat_score&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tag_bonus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manual overrides were added for champions whose late-game identity isn't fully captured by raw stats (Kassadin, Veigar, Vayne, Jinx, Kog'Maw...).&lt;/p&gt;




&lt;h1&gt;
  
  
  Three-Tier Classification
&lt;/h1&gt;

&lt;p&gt;Instead of using a binary scaling/non-scaling label, I used percentile bucketing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;low_scaling&lt;/td&gt;
&lt;td&gt;score &amp;lt; P25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mid_scaling&lt;/td&gt;
&lt;td&gt;P25 ≤ score &amp;lt; P75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;high_scaling&lt;/td&gt;
&lt;td&gt;score ≥ P75&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This produced a balanced distribution across the dataset.&lt;/p&gt;




&lt;h1&gt;
  
  
  KDA Style Score
&lt;/h1&gt;

&lt;p&gt;I also wanted to characterize individual play style.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tank_ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalDamageTaken&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;totalDamageDealtToChampions&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;obj_ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;damageDealtToObjectives&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;totalDamageDealtToChampions&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;death_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;deaths&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timePlayed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;kda_style_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tank_ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj_ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.35&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;death_rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Score near &lt;strong&gt;1&lt;/strong&gt; → KDA player&lt;/li&gt;
&lt;li&gt;Score near &lt;strong&gt;0&lt;/strong&gt; → Win-oriented player&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Dataset
&lt;/h1&gt;

&lt;p&gt;Final dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1,124 matches&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Challenger&lt;/li&gt;
&lt;li&gt;Gold&lt;/li&gt;
&lt;li&gt;EUW&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexed into Elasticsearch and visualized through Kibana.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dashboard
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Capture%2520d%25E2%2580%2599%25C3%25A9cran%25202026-06-08%2520133626.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Capture%2520d%25E2%2580%2599%25C3%25A9cran%25202026-06-08%2520133626.png" alt="Kibana Dashboard" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  First Dragon = Higher Win Rate
&lt;/h1&gt;

&lt;p&gt;The clearest result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;First Dragon&lt;/th&gt;
&lt;th&gt;Win Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;~55%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;~43%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's roughly a &lt;strong&gt;12 percentage point improvement&lt;/strong&gt;, regardless of composition.&lt;/p&gt;

&lt;p&gt;So the first dragon is much more than a simple tempo objective.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Main Finding
&lt;/h1&gt;

&lt;p&gt;When crossing &lt;strong&gt;composition type&lt;/strong&gt; with &lt;strong&gt;first dragon ownership&lt;/strong&gt;, the results become even more interesting.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composition&lt;/th&gt;
&lt;th&gt;With First Dragon&lt;/th&gt;
&lt;th&gt;Without&lt;/th&gt;
&lt;th&gt;Gain&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;High Scaling&lt;/td&gt;
&lt;td&gt;~60%&lt;/td&gt;
&lt;td&gt;~40%&lt;/td&gt;
&lt;td&gt;+20 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid Scaling&lt;/td&gt;
&lt;td&gt;~57%&lt;/td&gt;
&lt;td&gt;~40%&lt;/td&gt;
&lt;td&gt;+17 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low Scaling&lt;/td&gt;
&lt;td&gt;~55%&lt;/td&gt;
&lt;td&gt;~43%&lt;/td&gt;
&lt;td&gt;+12 pts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;High-scaling compositions benefit significantly more from obtaining the first dragon.&lt;/p&gt;

&lt;p&gt;The dragon appears to provide enough tempo and resources to safely reach their late-game power spike.&lt;/p&gt;




&lt;h1&gt;
  
  
  Visualization
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Capture%2520d%25E2%2580%2599%25C3%25A9cran%25202026-06-08%2520133518.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/Capture%2520d%25E2%2580%2599%25C3%25A9cran%25202026-06-08%2520133518.png" alt="Scaling Analysis" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Challenger vs Gold
&lt;/h1&gt;

&lt;p&gt;One particularly interesting result concerns early gold differences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenger
&lt;/h2&gt;

&lt;p&gt;High-scaling compositions have approximately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-430 gold at 15 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They consistently lose the early game before eventually scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gold
&lt;/h2&gt;

&lt;p&gt;High-scaling compositions are actually around:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;+110 gold at 15 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meaning lower ELO players punish scaling compositions much less efficiently.&lt;/p&gt;

&lt;p&gt;Therefore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gold players can often farm safely&lt;/li&gt;
&lt;li&gt;Challenger players force advantages much earlier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the first dragon even more valuable at higher levels.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dragon Type
&lt;/h1&gt;

&lt;p&gt;Not every dragon provides the same impact.&lt;/p&gt;

&lt;p&gt;Observed win rates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 Earth Dragon ≈ 60%&lt;/li&gt;
&lt;li&gt;🟢 Air Dragon ≈ 60%&lt;/li&gt;
&lt;li&gt;🟡 Hextech Dragon ≈ 52%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, regardless of dragon type, the advantage is consistently larger for scaling compositions.&lt;/p&gt;




&lt;h1&gt;
  
  
  Game Duration
&lt;/h1&gt;

&lt;p&gt;Median duration:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Challenger&lt;/td&gt;
&lt;td&gt;~28 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;td&gt;~31 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Better players convert early leads into victories faster, reducing the available scaling window.&lt;/p&gt;

&lt;p&gt;Again, this reinforces the value of securing the first dragon.&lt;/p&gt;




&lt;h1&gt;
  
  
  Limitations
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Sample size
&lt;/h2&gt;

&lt;p&gt;Some subgroups contain only 30–40 matches.&lt;/p&gt;

&lt;p&gt;More games would improve statistical confidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  No KR vs EUW comparison
&lt;/h2&gt;

&lt;p&gt;The original goal was to compare Korean and European servers.&lt;/p&gt;

&lt;p&gt;Unfortunately, Riot's free development API key does not provide KR access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Static scaling scores
&lt;/h2&gt;

&lt;p&gt;Data Dragon growth stats don't perfectly capture the current meta.&lt;/p&gt;

&lt;p&gt;Manual overrides reduce this issue but don't eliminate it.&lt;/p&gt;




&lt;h1&gt;
  
  
  What Players Can Learn
&lt;/h1&gt;

&lt;p&gt;If you play scaling champions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kassadin&lt;/li&gt;
&lt;li&gt;Veigar&lt;/li&gt;
&lt;li&gt;Kayle&lt;/li&gt;
&lt;li&gt;Late-game ADCs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contest the first dragon aggressively.&lt;/li&gt;
&lt;li&gt;The timing matters more than the dragon type.&lt;/li&gt;
&lt;li&gt;The higher the ELO, the more valuable this early objective becomes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Tech Stack
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8&lt;/li&gt;
&lt;li&gt;Apache Airflow 2.8&lt;/li&gt;
&lt;li&gt;Pandas&lt;/li&gt;
&lt;li&gt;PyArrow&lt;/li&gt;
&lt;li&gt;Elasticsearch 8.11&lt;/li&gt;
&lt;li&gt;Kibana 8.11&lt;/li&gt;
&lt;li&gt;LocalStack 2.3&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The DAG runs daily, ingests fresh Riot data, computes KPIs, and automatically indexes Elasticsearch.&lt;/p&gt;




&lt;h1&gt;
  
  
  Future Work
&lt;/h1&gt;

&lt;p&gt;The next step would be collecting several months of matches using a production Riot API key.&lt;/p&gt;

&lt;p&gt;With a larger dataset, it would become possible to analyze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patch-to-patch dragon impact&lt;/li&gt;
&lt;li&gt;KR vs EUW differences&lt;/li&gt;
&lt;li&gt;Meta evolution over time&lt;/li&gt;
&lt;li&gt;Champion-specific scaling interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If anyone has access to a production Riot API key and wants to run this pipeline at scale, I'd love to collaborate.&lt;/p&gt;




&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>leagueoflegende</category>
      <category>python</category>
      <category>karmincorp</category>
    </item>
  </channel>
</rss>
