Categoría: Data

Sale Counter!!!

Marzo 2020, empieza la pandemía, incertidumbre, confinamiento y Counter Strike…. Resulta que pocos días de dictarse el confinamiento en Argentina, se organizaron unas partidas de Counter Strike Global Offensive. Lo que empezó con un rato de distracción derivo en un nivel de manija importante. Jugamos casi todos los días a las 19hs durante 7 meses seguidos de dos a tres horas sumando miles de mensaje en el grupo de wasap discutiendo las partidas (Estudio Counter se llamó off the record).

El punto es que en algún momento se investigo sobre la posibilidad de obtener estadísticas de cada partida, se armaron tablas para completar manual pero nada de eso prospero.

library(CSGo)

Julio 2021, en una de tantas noches de insonmio veo que existe una API de CSGO para utilizar con R Studio (Gracias Adson Costanzi Filho). A partir de eso, la manija se apoderó de mi y decidí armar una shiny app… un poco para fogonear en el grupo, otro poco para practicar un poco de shiny y no oxidarme.

Por si no les interesa, el código, el link a la app está acá. Sino acá va un poco del esqueleto de la APP…

Tres cosas importantes:

  • necesitamos credenciales para usar la api . Si escribimos en r vignette("auth", package = "CSGo")nos aparece el paso a paso para conseguir la credencial de la api
  • necesitamos nuestro user id, o el user id de algún amigo. Para ésto debemos ir a nuestro perfil de steam y desde ahí vamos a ver que la url tiene un formato similar a este: ‘https://steamcommunity.com/profiles/76561198263364899/’ En este caso, el user id son todos esos números que aparecen en la URL.
  • Por último tenemos que poner la configuración de nuestro perfil en “público” de lo contrario no vamos a obtener ningún dato cuando utilicemos la API. Para eso último debemos ir a Editar Perfil dentro de Steam y dejar configurado el perfil cómo aparece en la imagen

Luego de todo ésto arrancamos en R. La idea de la APP era tener una parte de gráficos comparativos (siempre jugamos los mismos y esto servía para picantear quienes eran los mejores rankeados o los peores) y otra parte con estadísticas individuales utilizando un filtro reactivo con los jugadores.

# Instalamos el paquete y lo cargamos
install.packages("CSGo")
library(tidyverse) #para no perder la costumbre
library(CSGo)

Con el código get_stats_friends

csgo_stats <- get_stats_friends(api_key = 'tuAPI, user_id = 'tuID')  #el resultado es una lista
df <- as.data.frame(csgo_stats$friends_stats) #lo pasamos a df para trabajar más cómodo
view(df)

Vamos a ver que el data frame que creamos tiene un formato long. En name podemos ver algunos de los indicadores que arroja la API. Realmente es muy variada la info que da y puede llegar a marear. En mi caso, creo que me costo más sintetizar lo que quería mostrar que armar el código. El formato long lo cambie con pivot_wider.

stat <- df %>%  filter(type=='stat' & category=='stats') %>% select(c(1,2,7)) %>% pivot_wider(names_from = name, values_from = value)

Indicadores

Para el dashboard arme dos tabItems: “Estadísticas individuales” y “Comparativo”.

Dentro de estadísticas individuales use:

  • hits_efficiency, hits_to_kill, kills_efficiency (éstos tres fueron copiados textual del blog de Adson ) visualizados con highcharter

UI SIDE

        fluidRow(
        box(
            title = "Efectividad según arma", status = "primary", solidHeader = TRUE,
            collapsible = FALSE,
            width = 12,
            height = 8,
            highchartOutput("plot1", height = 600)
        )
        )
SERVER SIDE
output$plot1 <- renderHighchart({
      eficiencia %>% filter(player_name==input$nombresset) %>% hchart( "line", hcaes(name_match, valores, group = estadisticas))
      
    })

Si bien el gráfico lo hice crudo, sin personalizar nada en la línea de código podemos ver que hay un filtro por player filter(player_name==input$nombresset) y por otro lado, si van a utilizar gráficos de ésta librería hay que usar la función renderHighchart.

Por otro lado, el resto de los indicadores de esa slide los hice con renderInfoBox tambien utilizando el filtro por player filter(player_name == input$nombresset)

  • Matchs jugados (total_matches_played)
  • Headshots (total_kills_headshot)
  • Ganados (total_wins)
  • Defuse (total_defused_bombs)
  • Kills (total_kills)
  • Muertes (total_deaths)
  • MVPs (total_mvps)
  • Kills con faca (total_kills_knife)

Un ejemplo de esto:

UI SIDE

        fluidRow(
            
            infoBoxOutput("kills", width = 3),
            infoBoxOutput("muertes", width = 3),
            infoBoxOutput("mvp", width = 3),
            infoBoxOutput("facas", width = 3)
            
        ),

SERVER SIDE

      #FACAS 
        output$facas <- renderInfoBox({
          a <- df %>%
            filter(player_name == input$nombresset)
          a <- a %>% filter(name=='total_kills_knife')  
          a<- sum(a$value)
        infoBox(
            "Kills con Faca", a, icon = icon("list"),
            color = "purple", fill = TRUE
        )
    })

Para el otro tabItem use:

  • Tiempo jugado
  • Ganados/Jugados
  • Kills/Shots
  • Headshot/Kills
  • Kills/Rounds
  • MVP/Matches
  • Deads por match
  • Puntos contribuidos por match

UI SIDE

              fluidRow(
                box(
                  title = "Deads por match", status = "primary", solidHeader = TRUE,
                  collapsible = TRUE, width = 6,
                  highchartOutput("plot8")
                ),

SERVER SIDE

    #DEADS/MATCHS
    output$plot8 <- renderHighchart({
      stat %>%  mutate(dead=as.integer(total_deaths)/as.integer(total_matches_played)) %>% arrange(dead) %>% 
              hchart("column", hcaes(x = player_name, y = round(dead,2)))%>% 
        hc_xAxis(title = NULL) %>% hc_yAxis(title= NA)
          })
    

Acá el código completo aquí

Links útiles: