League of Legends (abreviado como LoL) é um jogo eletrônico online gratuito, do gênero MOBA com conceitos de Tower Defense, desenvolvido e publicado pela Riot Games em 2009. No modo mais popular do jogo, em um modo multiplayer no formato 5x5, o objetivo de cada time é destruir o Nexus da equipe adversária, uma construção localizada na base e protegida por outras estruturas.
League of Legends foi bem recebido desde o seu lançamento e sua popularidade cresceu ao decorrer dos anos. Em julho de 2012, foi o jogo para computador mais jogado na América do Norte e Europa em termos de número de horas jogadas.Até janeiro de 2014, mais de 67 milhões de pessoas jogavam League of Legends por mês, 27 milhões por dia e mais de 7,5 milhões durante o horário de pico.
“Welcome to Summoner’s Rift”
O modo mais popular do jogo se passa no mapa Summoner’s Rift, onde cada partida dura em média 30 minutos, o time Azul e Vermelho se enfrentam sem chance de empate, dividido em 3 rotas (Topo, Meio e Inferior), o objetivo é destruir o Nexus Inimigo localizado nas extremidades do mapa. Cada partida é única e possui diversas fatores que influenciam na vitória, como diversidade de campões com habilidades únicas, primeira torre destruída, número de abates, wards posionadas (ferramenta de permite visão e controle de mapa), além de objetivos neutros como Dragão e Baron.
Através de uma base de dados de jogos do elo Challenger (classificação dos melhores 0,01% jogadores do servidor), foram analisados dados de uma pespectiva do time azul.
Através da base de dados de partidas do rank Challenger, o foco do estudo será analisar a interferência de vários pequenos objetivos no resultado final da partida.
O primeiro abate influencia no vencedor da partida?
A primeira torre influencia no primeiro dragão?
Existe relação entre Abates e Total de Ouro?
Existe relação entre Wards colocadas e Abates?
Destruir Wards influencia na destruição de Torres?
A base pode ser encontrada através do link: https://www.kaggle.com/gyejr95/league-of-legends-challenger-ranked-games2020?select=Challenger_Ranked_Games.csv e a amostra utilizada é dos jogos do rank Challenger, sendo analisado os jogos de mais alto nível
library(readr)
Challenger <- read_csv("C:/Users/ferna/Desktop/Challenger.csv")
##
## -- Column specification --------------------------------------------------------
## cols(
## .default = col_double()
## )
## i Use `spec()` for the full column specifications.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.4 v stringr 1.4.0
## v tidyr 1.1.2 v forcats 0.5.0
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
A seguir foram aplicadas mudanças nos tipos das variáveis para trata-las qualitativas para “factor”, além de mudanças em suas nomenclaturas, anteriormente descritas como “0” e “1”, foram postas como texto para uma melhor visualização.
#Alterar tipo de variáveis
Challenger$blueWins <- as.factor(Challenger$blueWins)
Challenger$blueFirstBlood <- as.factor(Challenger$blueFirstBlood)
Challenger$blueFirstBaron <- as.factor (Challenger$blueFirstBaron)
Challenger$blueFirstTower <- as.factor (Challenger$blueFirstTower)
Challenger$blueFirstDragon <- as.factor (Challenger$blueFirstDragon)
#Alterar nome das variáveis qualitativas
Challenger$blueWins<-gsub(0, "Lose", Challenger$blueWins)
Challenger$blueWins<-gsub(1, "Win", Challenger$blueWins)
Challenger$blueFirstTower<-gsub(0, "Red Tower", Challenger$blueFirstTower)
Challenger$blueFirstTower<-gsub(1, "Blue Tower", Challenger$blueFirstTower)
Challenger$blueFirstBaron<-gsub(0, "Blue Baron", Challenger$blueFirstBaron)
Challenger$blueFirstBaron<-gsub(1, "Red Baron", Challenger$blueFirstBaron)
Challenger$blueFirstBlood<-gsub(0, "No", Challenger$blueFirstBlood)
Challenger$blueFirstBlood<-gsub(1, "Yes", Challenger$blueFirstBlood)
Challenger$blueFirstDragon<-gsub(0, "Red Dragon", Challenger$blueFirstDragon)
Challenger$blueFirstDragon<-gsub(1, "Blue Dragon", Challenger$blueFirstDragon)
library(DT)
datatable(Challenger)
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html
Vamos observar a seguir algumas peculiaridades em relaçaõ aos objetivos e ao lado de cada mapa.
par(mfrow = c (1, 2))
tabpizza<-table(Challenger$blueWins)
pie(tabpizza)
tab_ft<-table(Challenger$blueFirstTower)
barplot(tab_ft,
ylim = c(0,15000),
col = c("#0080FF", "#B40404"))
tab_drag<-table(Challenger$blueFirstDragon)
barplot(tab_drag,
ylim = c(0,20000),
col = c("#0080FF", "#B40404"))
tab_baron<-table(Challenger$blueFirstBaron)
barplot(tab_baron,
ylim = c(0,20000),
col = c("#0080FF", "#B40404"))
Notamos algumas particularidade em relação à distruição de objetivos pelo mapa. Percebemos que a amostra tem distruições equivalentes de Vitórias e Derrotas, e pouca vantagem do Azul em relação ao vermelho no que diz respeito à destruição da primeira torre. Contudo, notamos uma vantagem mais significante do time Vermelho no que diz respeito ao primeiro Dragão, e uma larga vantagem do Azul no quis respeito ao primeiro Dragão. Isto se deve em função, principalmente, do design do mapa de Summoners Rif’t, que apesar de quase espelhado, a localização e execução se torna mais segura pra um time ou outro.
A seguir vamos realizar o teste qui-quadrado de Pearson, para verificar se a hipótese é verdadeira para o caso destas duas variávies qualitativas.
H0: NÃO EXISTE ASSOCIAÇÃO ENTRE AS DUAS VARIÁVEIS
H1: EXISTE ASSOCIAÇÃO
VALOR ESPERADO MAIOR QUE 5
ALPHA = 0,05
SE pvalor <= alpha, rejeito H0
SE pvalor -> alpha, não rejeito H0
teste_qui1 <- chisq.test(Challenger$blueFirstBlood, Challenger$blueWins)
teste_qui1$expected
## Challenger$blueWins
## Challenger$blueFirstBlood Lose Win
## No 6677.507 6679.493
## Yes 6772.493 6774.507
options(scipen = 999)
teste_qui1$p.value
## [1] 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003716634
Como observado, os valores esperados são maiores que 5, condição para a utilização do teste de Pearson, então seguimos com o teste e encontramos o pvalor = 0,0000…37, valor menor que o nosso Alpha, ou seja, rejeitamos a hipótese H0, e ficamos com H1, sendo assim, concluímos que existe relação entre as essas 2 variáveis.
Vamos executar um segundo teste de hipóteses para duas variáveis qualitativas. Neste caso tentaremos verificar se há relação entre destruir a primeira torre e executar o primeiro dragão.
teste_qui2 <- chisq.test(Challenger$blueFirstTower, Challenger$blueFirstDragon)
teste_qui2$expected
## Challenger$blueFirstDragon
## Challenger$blueFirstTower Blue Dragon Red Dragon
## Blue Tower 5745.964 8395.036
## Red Tower 5186.036 7576.964
teste_qui2$p.value
## [1] 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008085141
Assim como no exemplo anterior, os valores esperados do teste de Pearson são maiores que 5, viabilizando o teste, o pvalor=0,000…808541, valor inferior ao Alpha, ou seja, rejeita-se H0, ficando com H1, confirmando a relação entre as duas variáveis.
Algumas variáveis quantitativas são mostradas a seguir.
summary(Challenger$gameDuraton)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 190 1152 1435 1449 1738 3301
summary(Challenger$blueKills)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 15.00 23.00 24.19 32.00 99.00
summary(Challenger$redKills)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 15.0 23.0 24.1 32.0 102.0
summary(Challenger$blueAssist)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 20.00 36.00 39.99 53.00 238.00
summary(Challenger$redAssist)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 20.0 35.0 39.8 53.0 229.0
summary(Challenger$blueTotalGold)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3704 37191 48104 48169 58657 121920
summary(Challenger$redTotalGold)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 3340 37127 48037 48208 58719 135299
Acima vejos algumas informações estatísticas a respeito de alguns aspectos do jogo. Notamos que em praticamente todos os casos a média se encontra bem próxima da mediana, o que signica que temos poucas presentas de outliers. Também notamos informações importantes acerca dos dados do jogo. Percebemos o tempo médio de jogo é de 1449 segundos, cerca de 24minutos, a média de Abates é 24.1, a média de Assistências é de 39.9, e a média total de Ouro por equipe é de aproximadamente 48k.
Notamos variações muito pequenas nos valores médios do time azul e vermelho, evidenciando mais uma vez o equilíbrio entre as amostras representado no começo deste estudo.
Como vimos anteriormente, podemos ver as concentrações de valores estão de acordo com as estatísticas apresentadas anteriormente.
par(mfrow = c (1, 2))
hist(Challenger$gameDuraton,
main = "Duração do jogo",
col = "#8A0886",
sub = "Maior concentração na altura de 1500",
ylim = c(0,6000),
xlim = c(0,3000))
hist(Challenger$blueTotalGold,
col = "#FF8000",
main = "Gold Total",
sub = "Maior concentração altura de 50k",
ylim = c(0,6000))
A seguir reprentada a igualdade das amostras da variável Abates entre os dois times.
par(mfrow = c (1, 2))
hist(Challenger$blueKills,
main = "Abates Azul",
col = "#5858FA",
sub = "")
hist(Challenger$redKills,
col = "#FE2E64",
main = "Abates Vermelho",
sub = "")
plot(Challenger$blueTotalGold, Challenger$blueKills,
col = "#64FE2E",
pch = 20)
abline(lsfit(Challenger$blueTotalGold, Challenger$blueKills))
cor(Challenger$blueTotalGold, Challenger$blueKills)
## [1] 0.8195338
Notamos pela inclinação da reta que existe uma relação linear positiva forte e que quanto maior o número de abates, maior a quantidade de Ouro, o que é esperado uma vez que os Abates concedem uma quantidade de Ouro dentro do jogo. Também é possível ver o Coeficiente de correlação de 0.819, numa escala que vai de -1 a +1.
plot(Challenger$blueWardPlaced, Challenger$blueKills,
col = "#F781D8",
pch = 20)
abline(lsfit(Challenger$blueWardPlaced, Challenger$blueKills))
cor(Challenger$blueWardPlaced, Challenger$blueKills)
## [1] 0.1045194
Neste caso, vemos que a reta possui uma inclinação bem modesta, pelo coeficiente de correlação de 0.104 podemos constatar que a relação entre essas duas variáveis é bem fraca. Constatamos que o número de Wards colocadas praticamente não interere na quantitade de abates totais.
plot(Challenger$blueTowerKills, Challenger$blueWardkills,
col = "#A5DF00",
pch = 20)
abline(lsfit(Challenger$blueTowerKills,Challenger$blueWardkills))
cor(Challenger$blueTowerKills,Challenger$blueWardkills)
## [1] 0.3969612
Notamos que pelo gráfico e pelo coeficiente de 0.39 que existe uma correlação alternada de fraca para moderada. Logo, destruir wards interfere na destruição de torres.
Challenger %>%
group_by(blueWins) %>%
summarize(media=mean(blueWardPlaced, na.rm = T),
mediana=median(blueWardPlaced, na.rm = T),
desvio_padrao=sd(blueWardPlaced))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 2 x 4
## blueWins media mediana desvio_padrao
## <chr> <dbl> <dbl> <dbl>
## 1 Lose 57.5 57 31.4
## 2 Win 59.8 59 31.3
Challenger %>%
group_by(blueWins) %>%
summarize(media=mean(blueKills, na.rm = T),
mediana=median(blueKills, na.rm = T),
desvio_padrao=sd(blueKills))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 2 x 4
## blueWins media mediana desvio_padrao
## <chr> <dbl> <dbl> <dbl>
## 1 Lose 18.3 16 11.7
## 2 Win 30.1 29 11.4
Challenger %>%
group_by(blueWins) %>%
summarize(media=mean(blueTowerKills, na.rm = T),
mediana=median(blueTowerKills, na.rm = T),
desvio_padrao=sd(blueTowerKills))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 2 x 4
## blueWins media mediana desvio_padrao
## <chr> <dbl> <dbl> <dbl>
## 1 Lose 2.04 2 2.00
## 2 Win 6.75 7 2.65
Observamos um impacto menos signicativo das Wards para a vitória, e uma relevância maior dos Abates e das Torres para este grupo.
par(mfrow = c (1, 2))
boxplot(Challenger$blueWardPlaced~Challenger$blueWins,
col = c("#F79F81", "#088A08"))
boxplot(Challenger$blueKills~Challenger$blueWins,
col = c("#D7DF01", "#04B4AE"))
Através do uso do boxplot é possível notar de maneira mais clara o impacto que esses atributos tem nos grupo vitorioso. A caixa acima evidencia uma média maior deste atributo em relação ao grupo concorrente.
shapiro.test(Challenger$blueWardPlaced[0:5000])
##
## Shapiro-Wilk normality test
##
## data: Challenger$blueWardPlaced[0:5000]
## W = 0.97953, p-value < 0.00000000000000022
shapiro.test(Challenger$blueKills[0:5000])
##
## Shapiro-Wilk normality test
##
## data: Challenger$blueKills[0:5000]
## W = 0.96474, p-value < 0.00000000000000022
shapiro.test(Challenger$blueTowerKills[0:5000])
##
## Shapiro-Wilk normality test
##
## data: Challenger$blueTowerKills[0:5000]
## W = 0.92812, p-value < 0.00000000000000022
Foi aplicado o teste de Normalidade de Shapiro nas 3 variáveis quantitativas que usamos anteriormente. Como em todos os casos o pvlor encontrado foi inferior a 0.05, usaremos o teste Wilcox a seguir para analisar essas amostras.
H0: Os dois tem a mesma distruição
H1: Os dois tem distruições diferentes
alpha: 0.05
Se pvalor menor que alpha, rej H0
Se pvalor maior que alpha, não rej H0
wilcox.test(Challenger$blueWardPlaced~Challenger$blueWins)
##
## Wilcoxon rank sum test with continuity correction
##
## data: Challenger$blueWardPlaced by Challenger$blueWins
## W = 86153156, p-value = 0.00000000001109
## alternative hypothesis: true location shift is not equal to 0
wilcox.test(Challenger$blueKills~Challenger$blueWins)
##
## Wilcoxon rank sum test with continuity correction
##
## data: Challenger$blueKills by Challenger$blueWins
## W = 37460292, p-value < 0.00000000000000022
## alternative hypothesis: true location shift is not equal to 0
wilcox.test(Challenger$blueTowerKills~Challenger$blueWins)
##
## Wilcoxon rank sum test with continuity correction
##
## data: Challenger$blueTowerKills by Challenger$blueWins
## W = 16084341, p-value < 0.00000000000000022
## alternative hypothesis: true location shift is not equal to 0
Como observamos, todas as hipóteses tem rejeitam H0, logo, concluímos que nos 3 casos os grupos Vitória e Derrota tem distruições diferentes.
Observamos diversas variáveis que fazem referências a mini objetivos dentro de um complexo jogo de estratégias. Como é de se imaginar, a grande maioria das variáveis colaboram para o desenvolvimento das demais, haja vista a dominação parcial do mapa, culminando mais facilmente na vitória. Notamos que algumas variáveis tem maior impacto que outras no objetivo final, como é o caso dos “Abates” e outras menos impacto, como é o caso das “Wards”. Além disso, neste estudo focamos predominantemente nos dados do time Azul, pois entendemos que apenas as variáveis “Primeiro Baron” e “Primeiro Dragon” tinham impacto signativo entre os times Azul e Vermelho, enquanto as demais apresentam desempenho semelhante, sem prejuízos para os resultados do estudo.