1 - Introdução

Esse relatório tem como função analisar o Campeonato Brasileiro de League of Legends ou CBlol em função dos seus dados, o banco de dados utilizado são das partidas oficiais disponibilizadas pela Riot Games a criadora e dona do League of Legends, o banco de dados original é disponibilizado pela Oracles Elixir que foi tratado e minerado para essa análise.

O objetivo dessa analise é descobrir quais são as métricas que mais influenciam para a vitória de um time profissional de League of Legends ou comumente conhecido como LOL, os dados usados serão das partidas da primeira etapa do CBlol de 2024 da fase regular de pontos e das eliminatórias mais conhecidas como Playoffs.

2 - Métodos e Materiais

O CBlol é um campeonato brasileiro de Lol constituído de 10 times, sendo eles: LOUD, Pain Gaming, Vivo Keyd Stars, RED Canids, Kabum! Esports, Los Grandes, Liberty, Fluxo, Furia e INTZ. São jogadas 18 partidas na fase regular, valendo 1 ponto para cada vitória e os 6 melhor colocados avançam para os Playoffs. Cada time joga contra todos os outros times uma vez na fase regular.

Para o melhor entendimento das métricas utilizadas para essa análise farei uma explicação básica de como funciona o jogo, no Lol dois times de 5 jogadores se enfrentam tendo como objetivo destruir a base inimiga especificadamente uma estrutura chamada Nexus, cada jogador realiza funções diferentes, para conquistar a vitória e para chegar o nexus e destruir a base inimiga é necessário destruir torres que ficam no caminho e defendem a base do respectivo time, o mapa em que é jogado essa partida é dividido em 2 partes sendo a parte de baixo a azul e a parte de cima o vermelho, tendo pequenas diferenças em relação ao lado em que é jogado que vai ser explorado mais a frente.

Mas obviamente que enquanto você e seu time tentam ganhar uma partida, os oponentes também estão tentando ganhar e, ao mesmo tempo, se defender e é aqui que estão as métricas que vamos analisar em relação ao que tem mais influência no jogo e suas estratégias para ter a vitória.

Existem várias maneiras de conseguir uma vantagem em relação ao time oponente, mas uma das métricas mais importes é o outro, ouro é um recurso obtido por praticamente fazer qualquer coisa até mesmo não fazer nada já que o jogador recebe uma pequena quantidade de outro por segundo automaticamente, mas saber ganhar esse outro efetivamente além de negar ou ganhar mais que o oponente é extremamente importante. Porque o ouro é tão importante, durante o jogo para cumprir determinados objetivos explicados mais adiante e conseguir destruir torres é necessário você estar mais forte ou em pé de igualdade com seu oponente e para isso é necessário comprar itens dentro do jogo que deixam seu personagem mais forte ou que dão suporte para seu time como, por exemplo, uma sentinela que revela uma parte do mapa assim podendo descobrir onde o oponente está dando uma vantagem estratégica.

Para conseguir ouro existem diversas manerias diferentes, mas nessa analise utilizaremos algumas métricas em específica, como o dano por minuto dos times, abater um jogador oponente resulta no jogador abatido ficar incapacitado de jogar por um certo tempo determinado e o jogador que abateu recebe uma quantidade de ouro também, claro que o dano no jogo não é só exclusivo para abates, existe um lado estratégico, mas é relevante para o impacto do time.

Outra maneira de ganhar ouro é abatendo tropas, tropas são unidades que surgem do nexus de cada time a cada 30 segundos e avançam pelo mapa atacando unidades e estruturas inimigas no seu caminho. O jogador que abater uma tropa recebe uma certa quantidade de ouro e, por isso, será avaliado a quantidade de tropa abatida por minuto.

Os dados que serão analisados:

Winrate = A porcentagem de vitória de cada time. Blue_Winrate = A porcentagem de vitória de cada time no lado Azul do mapa. Red_Winrate = A porcentagem de vitória de cada time no lado Vermelho do mapa. EarnedGold/Minute = O ouro ganho do time por minuto. Difference EarnedGold/Minurto = A diferença de ouro ganho por minuto de cada time em relação aos outros. VisionScore/Minute = A pontuação de visão por minuto de cada time, que consiste no tempo de visão colocada de um time, adicionado com o tempo de visão negada do oponente. Damage/Minute = O dano causado a um time por minuto. CreepScore/Minute = A pontuação de tropas abatidas por minuto do time.

3 - Análise de Resultados

Bibliotecas utilizadas:

readxl
ggplot2
scales
tidyr
knitr
dplyr

Sumario dos dados utilizados:

##             Teams      Winrate        Blue_Winrate     Red_Winrate    
##  INTZ          :1   Min.   :0.1667   Min.   :0.2222   Min.   :0.0000  
##  FURIA         :1   1st Qu.:0.3974   1st Qu.:0.3333   1st Qu.:0.3542  
##  Fluxo         :1   Median :0.4700   Median :0.4955   Median :0.4949  
##  Liberty       :1   Mean   :0.4653   Mean   :0.4870   Mean   :0.4423  
##  Los Grandes   :1   3rd Qu.:0.5994   3rd Qu.:0.6022   3rd Qu.:0.5913  
##  KaBuM! Esports:1   Max.   :0.7241   Max.   :0.8333   Max.   :0.6842  
##  (Other)       :4                                                     
##  EarnedGold.Minute Difference.earnedgold.minute VisionScore.Minute
##  Min.   :1009      Min.   :-234.00              Min.   :8.200     
##  1st Qu.:1116      1st Qu.: -73.25              1st Qu.:8.375     
##  Median :1127      Median : -41.50              Median :8.800     
##  Mean   :1137      Mean   : -25.10              Mean   :8.760     
##  3rd Qu.:1177      3rd Qu.:  77.75              3rd Qu.:9.075     
##  Max.   :1238      Max.   : 119.00              Max.   :9.300     
##                                                                   
##  Damage.Minute  CreepScore.Minute    Dragons          Elders       
##  Min.   :2029   Min.   :30.14     Min.   :1.667   Min.   :0.03448  
##  1st Qu.:2123   1st Qu.:32.02     1st Qu.:2.222   1st Qu.:0.06839  
##  Median :2220   Median :32.27     Median :2.431   Median :0.10897  
##  Mean   :2244   Mean   :32.19     Mean   :2.438   Mean   :0.13136  
##  3rd Qu.:2416   3rd Qu.:32.55     3rd Qu.:2.694   3rd Qu.:0.15972  
##  Max.   :2454   Max.   :33.26     Max.   :3.194   Max.   :0.33333  
##                                                                    
##     Heralds           Baron            Tower      
##  Min.   :0.2222   Min.   :0.4444   Min.   :3.833  
##  1st Qu.:0.3233   1st Qu.:0.6606   1st Qu.:5.277  
##  Median :0.5019   Median :0.8683   Median :5.838  
##  Mean   :0.4742   Mean   :0.8009   Mean   :5.967  
##  3rd Qu.:0.6042   3rd Qu.:0.9583   3rd Qu.:6.947  
##  Max.   :0.7222   Max.   :1.0000   Max.   :7.774  
## 

Banco de dados que os dados foram minerados:

2024_LoL_esports_match_data_from_OraclesElixir

3.1 Gráfico de dispersão da Porcentagem de Vitória dos Times

3.1.1 Gráfico de dispersão da porcentagem de vitória dos times no lado azul

3.1.2 Gráfico de dispersão da porcentagem de vitória dos times no lado Vermelho

3.1.3 Gráfico de barras da porcentagem de vitória dos times no lado azul e vermelho

3.1.4 Análise dos gráficos da porcentagem de vitória

Antes de uma análise direta dos gráficos é importante pontuar a classificação de cada time na primeira etapa do CBlol de 2024 que ocorreu do dia 20 de janeiro até o dia 20 de abril, O campeão sendo o time LOUD e o vice A Pain Gaming e por ordem de colocação começando com o terceiro lugar: Vivo Keyd Stars, Red Canids, Kabum Esports, Los Grandes, Liberty, Fluxo, Furia e em último lugar INTZ, para a melhor visualização dos gráficos os times serão organizados da esquerda para a direita sendo do último para o primeiro. É importante pontuar que existem times que estão em uma posição menor como a Liberty, mas possui uma porcentagem de vitória maior que times a frente como Los Grandes e Kabum!, isso se dá ao fato que somente os 6 melhor colocados avançam para os Playoffs e por isso jogaram mais partidas que os demais ocasionando uma diferença na porcentagem mesmo em uma colocação de resultado melhor.

É notável a maior porcentagem de vitória dos times com melhor colocação e sendo refletida na porcentagem de vitória dos times no lado azul, sendo somente a liberty um outlier nesse sentido. O mais interessante é a porcentagem de vitória no lado vermelho onde existe uma variação maior de times com melhor porcentagem nesse lado, tendo a Loud que foi campeã com somente 54%, possível de se dizer que ha uma certa vantagem aos times que jogam no lado azul, mas não por uma melhor porcentagem de vitória e sim mais consistência, dito isso a porcentagem de vitória geral do lado azul foi de 51% e a vermelha de 49% sendo bem pequena, mas ainda, sim, relevante.

3.2 Gráfico de dispersão da quantidade de ouro ganho por minuto dos Times

3.2.1 Gráfico de dispersão da diferença de ouro ganho por minuto dos Times

3.2.2 Análise dos gráficos de ouro ganho por minuto

É perceptível a importância do ouro ganho dos times em relação ao seu desempenho, como foi dito anteriormente o ouro é importante para realizar várias ações dentro do jogo e a eficácia de como obter é extremamente relevante para levar a vitória como visto nos gráficos onde os times com as melhores colocações são os que mais obtém ouro e tem uma diferença maior e positiva em relação aos outros times. Uma colocação relevante é que se um time está ganhando ele tem mais capacidade e oportunidade de ganhar cada vez mais ouro, por isso não reflete totalmente as qualidades de um time, existindo um ponto estratégico relevante na coleta desse ouro e a sua utilização além do jogo em geral, tendo times com menos ouro e mesmo assim ganhando mesmo que isso seja raro e mais difícil.

3.3 Gráfico de dispersão e análise da Pontuação de visão por minuto dos times

É possível notar novamente uma tendência dos melhores times obterem as melhores pontuações de visão, o único outlier bem nítido é a Furia com 9.4 de pontuação se equiparando com a Pain que ficou em segundo lugar, mesmo com a demonstração desse gráfico essa pontuação não indica tanto, pois seria necessária uma análise mais profunda nos jogadores, pois a função de suporte e de caçador tem um papel muito relevante na pontuação de visão sendo mais impactante que a do time em geral fazendo esse gráfico não ter tanta relevância.

3.4 Gráfico de dispersão e análise do dano por minuto dos times

Novamente o gráfico demonstra que os melhores times são só que causam a maior quantidade de dano tendo como um outlier a INTZ que mesmo em último causou uma boa quantidade de dano em relação aos outros times, mas que não chega nem perto dos melhores, outra vez seria necessária uma análise mais profunda em quem causou esse dano no time, pois existem funções mais focadas nisso, mas é um bom indicativo para entender as qualidades de um time e o impacto na sua vitória.

3.5 Gráfico de dispersão e análise das Tropas abatidas por minuto dos times

Evidente que diferente dos outros gráficos não há uma diferença clara entre os times em relação a abate de tropas por minutos, mesmo que exista uma diferença já mostrada entre os melhores times para os piores, o CBlol é o nível mais alto dos campeonatos de Lol no Brasil, então mesmo o pior time é relativamente bom em nossa região sendo assim a quantidade de abates por tropa não muda muito sendo um impacto pequeno na porcentagem de vitória dos times, único time sendo um outlier é a INTZ com 30.1 sendo 1.9 de diferença do segundo menor.

3.6 Tabela de distribuição de frequência

Tabela de Distribuição de Frequência da Média de Baron por time com Frequência Acumulada, Relativa e Relativa (%)
Barons Frequência Frequência.Acumulada Frequência.Relativa Frequência.Relativa….
0.4444444 1 1 0.1 10
0.5555556 1 2 0.1 10
0.6400000 1 3 0.1 10
0.7222222 1 4 0.1 10
0.8333333 1 5 0.1 10
0.9032258 1 6 0.1 10
0.9487179 1 7 0.1 10
0.9615385 1 8 0.1 10
1.0000000 2 10 0.2 20

O Baron é um monstro que surge aos 20 minutos de jogo e renasce a cada 6 minutos após ser derrotado, ao ser derrotado o time que o derrotou recebe vantagens e fortalecimentos muitos relevantes para a vitória de um time e também recebe ouro, por causa disso é um objetivo muito disputado e é muito utilizado para terminar as partidas.

Mesmo tendo sua alta relevância não é possível notar uma direta correlação entre a média de Barons derrotados por um time e a sua porcentagem de vitória, isso pode acontecer pela situação de um time melhor não precisar do Baron para ganhar o jogo ou só precisar de um para garantir, enquanto outros times derrotam vários para tentar uma vitória tendo mais dificuldade de vencer.

## $Amplitude
## [1] 0.5555556
## 
## $Variancia
## [1] 0.03975472
## 
## $Desvio_Padrao
## [1] 0.1993858
## 
## $Coeficiente_de_Variacao
## [1] 24.89511

4 - Conclusão

Existem muitos fatores que influenciam no resultado de uma partida, tantos fatores que é praticamente impossível de citar todos, então as métricas escolhidas demonstram uma pequena parte da complexidade do esporte, com oque foi analisado os fatores como o lado que o time joga a partida como o azul pode dar uma pequena vantagem, a eficácia de como usar e ganhar ouro é extremamente impactante para um time, saber escolher suas lutas e otimizar o dano causado, influenciam consideravelmente para a vitória de um time. Os outros fatores ou não têm uma grande relevância, ou precisam de uma análise mais profunda, checando os jogadores de cada times e os seus impactos individuais para ter uma conclusão melhor.

Como foi dito, existem outros fatores que ocorrem em uma partida, até mesmo um que é difícil analisar com dados, como o bem-estar dos jogadores e a estratégia utilizada, mas com certeza a análise de dados tem a capacidade de potencializar a evolução dos jogadores e do esporte.

5 - Referências

Banco de dados das partidas oficiais disponibilizado pela Oracles Elixir: https://drive.google.com/drive/u/1/folders/1gLSw0RLjBbtaNy0dgnGQDAZOHIgCe-HH

6 - Código

library(readxl)
library(ggplot2)
library(scales)
library(tidyr)
library(knitr)
library(dplyr)

Dados <- read_excel("Cblol_2024.1.xlsx")

dados <- data.frame(Dados)

team_colors <- c("LOUD" = "#21C232", "paiN Gaming" = "#970000", "Vivo Keyd Stars" = "#AE00CD",
                 "RED Canids" = "#FF0000", "KaBuM! Esports" = "#FF9300", "Los Grandes" = "#E34F00",
                 "Liberty" = "#00E3E3", "Fluxo" = "#FF01AE", "FURIA" = "#000000", "INTZ" = "#9F9F9F")

desired_order <- c("INTZ","FURIA" ,"Fluxo" , "Liberty", 
                   "Los Grandes","KaBuM! Esports" , "RED Canids", "Vivo Keyd Stars", 
                   "paiN Gaming","LOUD" )

dados$Teams <- factor(dados$Teams, levels = desired_order)
dados <- dados[order(dados$Teams), ]

summary(dados)

ggplot(dados, aes(x = Teams, y = Winrate, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::percent(Winrate)), vjust = -0.5, color = "black", size = 3.5, nudge_y = 0.01) +
  theme_minimal() +
  labs(title = "Winrate por Team",
       x = "Teams",
       y = "Winrate") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = Blue_Winrate, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::percent(Blue_Winrate)), vjust = -0.5, color = "black", size = 3.5, nudge_y = 0.01) +
  theme_minimal() +
  labs(title = "Blue_Winrate por Team",
       x = "Teams",
       y = "Blue_Winrate") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = Red_Winrate, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::percent(Red_Winrate)), vjust = -0.5, color = "black", size = 3.5, nudge_y = 0.01) +
  theme_minimal() +
  labs(title = "Red_Winrate por Team",
       x = "Teams",
       y = "Blue_Winrate") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

dados_long <- pivot_longer(dados, cols = c(Blue_Winrate, Red_Winrate), names_to = "Winrate_Type", values_to = "Winrate_Value")

ggplot(dados_long, aes(x = Teams, y = Winrate_Value, fill = Winrate_Type)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  scale_fill_manual(values = c("Blue_Winrate" = "#1f77b4", "Red_Winrate" = "#ff0000")) +
  theme_minimal() +
  labs(title = "Blue Winrate e Red Winrate por Team",
       x = "Teams",
       y = "Winrate (%)",
       fill = "Winrate Type") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplot(dados, aes(x = Teams, y = EarnedGold.Minute, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = (EarnedGold.Minute)), vjust = -0.7, color = "black", size = 3.5) +
  theme_minimal() +
  labs(title = "EarnedGold/Minute por Team",
       x = "Teams",
       y = "EarnedGold/Minute") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = Difference.earnedgold.minute, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = (Difference.earnedgold.minute)), vjust = -0.7, color = "black", size = 3.5) +
  theme_minimal() +
  labs(title = "Difference earnedgold/minute por Team",
       x = "Teams",
       y = "Difference earnedgold/minute") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = VisionScore.Minute, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::number_format(accuracy = 0.1)(VisionScore.Minute)), vjust = -0.5, color = "black", size = 3.5, nudge_y = 0.01) +
  theme_minimal() +
  labs(title = "VisionScore/Minute por Team",
       x = "Teams",
       y = "VisionScore/minute") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = Damage.Minute, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::number_format(accuracy = 1)(Damage.Minute)), vjust = -0.7, color = "black", size = 3.5) +
  theme_minimal() +
  labs(title = "Damage/Minute por Team",
       x = "Teams",
       y = "Damage/Minute") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = CreepScore.Minute, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::number_format(accuracy = 0.1)(CreepScore.Minute)), vjust = -0.7, color = "black", size = 3.5) +
  theme_minimal() +
  labs(title = "CreepScore/Minute por Team",
       x = "Teams",
       y = "CreepScore/Minute") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

ggplot(dados, aes(x = Teams, y = Baron, color = Teams)) +
  geom_point(size = 5) +
  geom_text(aes(label = scales::number_format(accuracy = 0.1)(Baron)), vjust = -0.5, color = "black", size = 3.5, nudge_y = 0.01) +
  theme_minimal() +
  labs(title = "Baron por Team",
       x = "Teams",
       y = "Baron") +
  theme(axis.text.x = element_blank()) +
  scale_color_manual(values = team_colors, name = "Teams")

baron_freq <- table(dados$Baron)
baron_rel_freq <- prop.table(baron_freq)
baron_cum_freq <- cumsum(baron_freq)
baron_rel_freq_pct <- baron_rel_freq * 100

baron_freq_df <- data.frame(
  Barons = as.numeric(names(baron_freq)),
  Frequência = as.vector(baron_freq),
  `Frequência Acumulada` = as.vector(baron_cum_freq),
  `Frequência Relativa` = round(as.vector(baron_rel_freq), 2),
  `Frequência Relativa (%)` = round(as.vector(baron_rel_freq_pct), 2)
)

mean_baron <- mean(dados$Baron)

median_baron <- median(dados$Baron)

mode_baron <- as.numeric(names(sort(table(dados$Baron), decreasing = TRUE)[1]))

ggplot(dados, aes(x = Baron)) +
  geom_histogram(binwidth = 0.1, fill = "blue", color = "black", alpha = 0.7) +
  geom_vline(aes(xintercept = mean_baron), color = "red", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = median_baron), color = "green", linetype = "dashed", size = 1) +
  geom_vline(aes(xintercept = mode_baron), color = "yellow", linetype = "dashed", size = 1) +
  theme_minimal() +
  labs(title = "Histograma da Frequência da Média de Baron por time",
       x = "Baron",
       y = "Frequência") +
  annotate("text", x = mean_baron, y = 0.5, label = "Média", color = "red", angle = 90, vjust = -0.5) +
  annotate("text", x = median_baron, y = 0.5, label = "Mediana", color = "green", angle = 90, vjust = -0.5) +
  annotate("text", x = mode_baron, y = 0.5, label = "Moda", color = "yellow", angle = 90, vjust = -0.5)

kable(baron_freq_df, caption = "Tabela de Distribuição de Frequência da Média de Baron por time com Frequência Acumulada, Relativa e Relativa (%)")

range_baron <- range(dados$Baron)
amplitude_baron <- diff(range_baron)

var_baron <- var(dados$Baron)

sd_baron <- sd(dados$Baron)

cv_baron <- sd_baron / mean(dados$Baron) * 100

list(
  Amplitude = amplitude_baron,
  Variancia = var_baron,
  Desvio_Padrao = sd_baron,
  Coeficiente_de_Variacao = cv_baron
)