Valorant

Rodrigues Neto

2022-05-02

Introdução

Valorant é um jogo tático de tiro em primeira pessoa desenvolvido pela Riot Games que foi lançado oficialmente em 2 de junho de 2020. Possui um estilo parecido com Counter-Strike, é um jogo 5x5, possuindo 2 times, o time atacante e o defensor, o objetivo do time atacante é plantar uma bomba num local determinado, e o do time defensor é impedir o time atacante de cumprir seu objetivo, ou desabilitar a bomba caso plantada, caso um dos times mate completamente os jogadores do outro, também é considerado vitória desse time. Uma partida é dividida em 25 rounds, é sorteado um time e os 12 primeiros rounds esse time fica do lado atacante, enquanto o outro é o defensor, depois é trocado os lados. O primeiro time a fazer 13 pontos, vence.

Um mês após seu lançamento, a Riot Games também lançou uma API Valorant, que foi distribuída apenas para alguns desenvolvedores de produtos e a maioria dos dados não é acessível ao público. No entanto, ainda temos uma maneira de obter dados de partidas oficiais, e isso é graças ao vlr.gg, um site que registra partidas oficiais e estatísticas de jogadores, fazendo o scrapping dos dados em tempo real.

Com esse dataset podemos gerar análises, tanto de jogadores, como de times ou até mesmo de agentes (personagens) do jogo. Gerando um relatório e podendo ser, até mesmo, procurado padrões de agentes em determinadas partidas, ou a correlação entre os agentes e número de mortes, abates, etc.

Conteúdo

O conjunto de dados consiste em dados dos resultados da partida e estatísticas do jogador de vlr.gg extraídos em 24 de dezembro de 2021. Os dados de partida mais antigos que puderam ser extraídos com sucesso foram em 14 de junho de 2020. A API original criada pode ser encontrada em https://github.com/axsddlr/vlrggapi, enquanto a versão editada para gerar esse dataset pode ser encontrada em https://github.com/fnurrahmadi/data-science-portfolio/tree/main/vlrgg%20Unofficial%20REST%20API%20-%20updated.

Explicação das colunas:

GameID - Identificador único da partida
PlayerID - Identificador único do jogador
PlayerName - Nome do jogador
TeamAbbreviation - Sigla do time ao qual o jogador pertence
Agent - Agente (personagem) escolhido pelo jogador naquela partida
ACS - Average Combat Score (Pontuação média de combate), uma pontuação dada pelo jogo baseado nos seus combates, quanto maior, melhor
Kills - Número de vezes que abateou outros jogadores
Deaths - Número de mortes do jogador
PlusMinus - abates menos mortes (Saldo)
KAST_Percent - Percentual de rounds que o jogador abateou, deu assistência, sobreviveu ou “foi trocado”. (Kill, Assist, Survived or Traded) (“Ser trocado” é o conceito de assim que o jogador foi morto por alguém, imediatamente outro jogador matou o inimigo)
ADR - Dano médio por round (Average Damage per Round)
HS_Percent - Percentagem de tiros na cabeça (HeadShot)
FirstKills - Número de rounds da partida o qual o jogador foi responsavel pelo primeiro abate
FirstDeaths - Número de rounds da partida o qual o jogador foi o primeiro morto
FKFD_PlusMinus - FirstKills menos FirstDeaths (Saldo)
Num_2Ks - Número de rounds o qual o jogador foi responsavel por 2 abates no mesmo round
Num_3Ks - Número de rounds o qual o jogador foi responsavel por 3 abates no mesmo round
Num_4Ks - Número de rounds o qual o jogador foi responsavel por 3 abates no mesmo round
Num_5Ks - Número de rounds o qual o jogador foi responsavel por 5 abates no mesmo round
OnevOne - Número de round que o jogador ficou na situação 1 contra 1 (apenas 2 jogadores vivos, um de cada lado)
OnevTwo - Número de round que o jogador ficou na situação 1 contra 2 (apenas 3 jogadores vivos, ele contra 2)
OnevThree - Número de round que o jogador ficou na situação 1 contra 3 ( 4 jogadores vivos, ele contra 3)
OnevFour - Número de round que o jogador ficou na situação 1 contra 4 ( 5 jogadores vivos, ele contra 4)
OnevFive - Número de round que o jogador ficou na situação 1 contra 5 ( 6 jogadores vivos, ele contra 5)
Econ - Nota de economia dada automaticamente pelo jogo, quanto maior melhor
Plants - Número de vezes que o jogador plantou a spike (bomba)
Defuses - Número de vezes que o jogador defusou (desativou) a spike (bomba)

Pacotes requeridos

library(dplyr)
library(plotly)      
library(tidyr)
library(DT)

Preparação de dados

# Os dados foram tratados e tirados de um SQLITE, possivel encontrar ele na aba "Conteúdo"
df<-drop_na(read.csv("https://raw.githubusercontent.com/MrRodrix/VisaoComputacional2021.1/main/Game_Scoreboard.csv"))
datatable(head(df))

Análise de Jogadores

df_grp_region = df %>% group_by(PlayerName)  %>%
                    summarise(mean_ACS = mean(ACS),
                              total_kills = sum(Kills),
                              mean_kils = mean(Kills),
                              total_deaths = sum(Deaths),
                              mean_deaths = mean(Deaths),
                              total_assists = sum(Assists),
                              mean_assists = mean(Assists),
                              mean_hs = mean(HS_Percent),
                              .groups = 'drop')

datatable(head(df_grp_region))

Análise de Personagens

df_agents = df %>% group_by(Agent)  %>%
                    summarise(mean_ACS = mean(ACS),
                              total_kills = sum(Kills),
                              mean_kils = mean(Kills),
                              total_deaths = sum(Deaths),
                              mean_deaths = mean(Deaths),
                              total_assists = sum(Assists),
                              mean_assists = mean(Assists),
                              mean_hs = mean(HS_Percent),
                              n_games = n(),
                              .groups = 'drop')
datatable(head(df_agents))

Análise de Times

df_teams = df %>% group_by(TeamAbbreviation)  %>%
                    summarise(players = sum(PlayerID),
                              mean_ACS = mean(ACS),
                              total_kills = sum(Kills),
                              mean_kils = mean(Kills),
                              total_deaths = sum(Deaths),
                              mean_deaths = mean(Deaths),
                              total_assists = sum(Assists),
                              mean_assists = mean(Assists),
                              mean_hs = mean(HS_Percent),
                              n_games = n(),
                              .groups = 'drop')
df_teams['player_count'] = 1
datatable(head(df_teams))

Análise Exploratória

Jogadores

KDA

First Kills/Deaths

Spike (Bomba)

Agentes

ACS Médio
df_agents = df_agents[order(df_agents$mean_ACS, decreasing = T), ]
df_agents['Agent'] = factor(df_agents$Agent, unique(df_agents$Agent))

plot_ly(y=df_agents$mean_ACS, x=df_agents$Agent, type='bar')%>%
        layout(title = 'Média de pontuação de combate por agente', plot_bgcolor = "#e5ecf6")
Média de kills
df_agents = df_agents[order(df_agents$mean_kils, decreasing = T), ]
df_agents['Agent'] = factor(df_agents$Agent, unique(df_agents$Agent))
plot_ly(y=df_agents$mean_kils, x=df_agents$Agent, type='bar', name = 'Média de abates por agente')%>%
        layout(title = 'Média de abates por agente', plot_bgcolor = "#e5ecf6")
Média de deaths
df_agents = df_agents[order(df_agents$mean_deaths, decreasing = T), ]
df_agents['Agent'] = factor(df_agents$Agent, unique(df_agents$Agent))

plot_ly(y=df_agents$mean_deaths, x=df_agents$Agent, type='bar',name = 'Média de mortes por agente')%>%
        layout(title = 'Média de pontuação de mortes por agente', plot_bgcolor = "#e5ecf6")
Média de assists
df_agents = df_agents[order(df_agents$mean_assists, decreasing = T), ]
df_agents['Agent'] = factor(df_agents$Agent, unique(df_agents$Agent))

plot_ly(y=df_agents$mean_assists, x=df_agents$Agent, type='bar', name = 'Média de assistências por agente')%>%
        layout(title = 'Média de assistencias por agente', plot_bgcolor = "#e5ecf6")
Média de headshots
df_agents = df_agents[order(df_agents$mean_hs, decreasing = T), ]
df_agents['Agent'] = factor(df_agents$Agent, unique(df_agents$Agent))

plot_ly(y=df_agents$mean_hs, x=df_agents$Agent, type='bar', name = 'Média de headshots por agente')%>%
        layout(title = 'Média de headshots por agente', plot_bgcolor = "#e5ecf6")
Uso em jogos
plot_ly(values=df_agents$n_games, labels=df_agents$Agent, type='pie', title = 'Uso de agentes em partidas')

Times

KAST

ACS

Economia

Conclusões

Pode-se constatar através dos gráficos a distribuição dos desempenhos dos jogadores dos times, assim como os desempenhos individuais, além da escolha de personagens feito pelos jogadores profissionais. Esses dados puderam ser analisados e obtidos através de uma análise tanto comparativa quanto descritiva dos dados.
Alguns dados importantes que foram extraídos, por exemplo, foi o dado que: Mesmo o jogo tendo 16 agentes, a distribuição da escolha dos jogadores profissionais está focada em 5 principais que concentram 65.88% das escolhas dos pro-players. Outra análise interessante foi a discrepancia do número de assistências do agente Kaio para com os demais, isso pode se dar pelo fato de todas as habilidades do personagem possuirem caracteristicas que são mais puxadas para a assitência que o abate em si, porém ainda é um fato interessante pois a Skye, possui somente habilidades de assistencia, não chegou nesse valor, mas é a mais escolhida dentre os pro-players.
A análise ficou limitada até o ano de 2021, podendo ser expandida até os dias atuais, também pode ser enriquecida com dados de vitórias/perdas de jogos e ou/rodadas, além do uso de quais armas os jogadores compraram em cada round e como foi sua movimentação no mapa ao longo do game.