Video-juegos y Estadistica

La industria de los videojuegos ha crecido exponencialmente, se han creado nuevos géneros de juegos, nuevos modelos de negocios, nuevos tipos de gamers y nuevos dispositivos para jugar, pero lo que no cambia es que siguen existiendo los llamados juegos triple A. Los juegos triple A se caracterizan por pertenecer a empresas con un grán presupuesto para invertir en juegos, los cuales tienen que vender muchas copias para hacerlos rentables.

Hablamos de juegos que cuestan ente 10 y 60 millones de dolares, por lo que las empresas utilizan distintas (y cuestionadas técnicas) técnicas para rentabilizarlos, por ejemplo los DLC, season-pass, expansiones, comprar “ayudas” y por ultimo se preocupan de que existan reviews que hablen de sus juegos. Obviamente, necesitan reviews que hablen bien de sus juegos, por lo que siempre he creído que los reviews no son de fiar.

Hoy decidido revisar si esto es cierto y lo realizaré con la información disponible en www.metacritic.com, esta página es muy interesante por que compila todos los reviews hechos por reviewers y genera un “puntaje promedio” llamado “metascore” además de permitir a los usuarios dar su evaluación de cada juego, el cual al promediarse lo llaman “userscore”. Todos la información sobre estos puntajes están disponibles con todo el detalle necesario para hacer un análisis y revisar que tan de fiar son los reviews.

Nuestro supuesto fundamental es que el userscore es la evaluación real de los videojuegos, mientras que el metascore, es el puntaje alterado por las influencias de las mega corporaciones que hacen juegos, en este articulo mostraremos como obtuvimos la información de metacritic y luego mostraremos como evaluamos testeamos estadisticamente la “generosidad de los reviewers”.

Los Datos Disponibles

Como dije antes, el sitio tiene los puntajes promedio y el detalle, para nuestros fines descargaremos para los juegos de PS4 los siguientes datos:

  • MetaScore
  • UserScrore
  • Empresa que publica el juego
  • Detalle del MetaScore (Nota que puso cada reviewer)

Por ejemplo para el caso de Fifa 17, veríamos algo de este estilo en la pagina:

Generando para cada juego un registro con esta información (oculté la llave con la que cruzaré con la tabla de detalles):

Por otro lado a continuación podemos ver, el detalle de los reviews contiene el puntaje que puso cada reviewer a un juego en particular. En este caso, todos los reviews de Fifa 2017:

Extracción de Datos

Para extraer los datos utilizaremos selenium a través de python. Selenium es un controlador que permite manejar un navegador ya sea Firerox, Chorme o PhantomJS a través de código escrito en algún lenguaje como python.

Para simplificar las cosas, extraeremos los datos a un set de archivos .csv, conde cada uno contendrá la información disponible para 100 juegos.

El código es el siguiente:


import pandas as pd
import time
import sys

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
#driver = webdriver.PhantomJS()

url_generica = "http://www.metacritic.com/browse/games/score/metascore/all/ps4/filtered?sort=desc&page={}"

def get_game(url):
 print("GoTo " + url)
 driver.get(url)
 game = driver.find_element_by_xpath('//h1[@class="product_title"]/a[@class="hover_none"]/span[@itemprop="name"]').text
 print(game)
 registro = pd.DataFrame({"game" : [game],
 "publisher" : [driver.find_element_by_xpath('//*[@itemprop="publisher"]/span[@class="data"]').text],
 "devel" : [driver.find_element_by_xpath('//*[@class="summary_detail developer"]/span[@class="data"]').text],
 "metascore" : [driver.find_element_by_xpath('//*[@itemprop="ratingValue"]').text],
 "userscrore" : [driver.find_element_by_xpath('//div[@class="userscore_wrap feature_userscore"]/a[@class="metascore_anchor"]/div').text],
 "metascore_url" : [url + "/critic-reviews"],
 "userscore_url" : [url + "/user-reviews" ], 
 "game_url" : [url]
 })
 print("Metascore Scrapped")
 return(registro)
 
def get_metascore_detail(url):
 driver.get(url)
 print("Scrapping Details")
 registro = pd.DataFrame({
 "detail_metascore_value" : [x.text for x in driver.find_elements_by_xpath('//div[@class = "module reviews_module critic_reviews_module"]//div[@class = "review_grade"]')],
 "detail_metascore_source" : [x.text for x in driver.find_elements_by_xpath('//div[@class = "review_critic"]/div[@class="source"]')] 
 })
 registro["metascore_url"] = url
 print("Details Scrapped")
 return(registro)
 
paginas = [x for x in range(8)]
while len(paginas) > 0:
 p_num = paginas.pop()
 url = url_generica.format(p_num)
 print(url)
 driver.get(url)
 games_urls = driver.find_elements_by_xpath('//*[@class="product_item product_title"]/a')
 games_urls = [l.get_attribute("href") for l in games_urls]
 
 compiled_metacritic = pd.DataFrame()
 compiled_detail = pd.DataFrame()
 while len(games_urls) > 0:
 print("********* NEW SCRAP ********")
 url = games_urls.pop()
 compiled_metacritic = compiled_metacritic.append(get_game(url))
 compiled_detail = compiled_detail.append(get_metascore_detail(url + "/critic-reviews"))
 print("********* END SCRAP ********")
 compiled_metacritic.to_csv("metacritic/metacritic_" + str(p_num) + ".csv",index =False)
 compiled_detail.to_csv("detail/metacritic_detail" + str(p_num) + ".csv",index =False)

Análisis

Lo primero es ver los datos en general, lo que primero haremos será ver a nivel agregado los userscore versus los metascore, como se puede ver en la tabla a continuación, en promedio el userscore es 4,26 mayor que el metascrore lo que significa que en general hay una tendencia de los usuarios a ser más exigentes que los reviewers

promedio metascrore promedio userscore diferencia
71,53 67,27 4,26

Al hacer un test t, obtenemos un p-value que nos permite estadisticamente rechazar la hipótesis nula de que los promedios son iguales, en otras palabras, existen agumentos estadísticos para afirmar que el userscore es menor que el metascore:

Ahora realizaremos el mismo test pero para cada publisher utilizando R el codigo queda del siguiente modo:


options(stringsAsFactors = FALSE)
Sys.setenv(TZ='GMT')
library(plyr)
library(reshape2)
library(xtable)

read_csv_folder = function(folder){
 files = dir(folder)
 ldply(files, function(x) read.csv(paste0(folder,"/",x)),.progress = "text")
}

metacritic = read_csv_folder("metacritic")
metacritic = transform(metacritic, metascore = as.numeric(metascore), userscrore = 10*as.numeric(userscrore))
metacritic = metacritic[complete.cases(metacritic),]
head(metacritic[,c("game","publisher","metascore","userscrore")])

details = read_csv_folder("detail")
details = transform(details, detail_metascore_value = as.numeric(detail_metascore_value))
details = details[complete.cases(details),]

#Gral
gral = data.frame(promedio_metascrore = round(mean(metacritic$metascore),2),
 promedio_userscore = round(mean(metacritic$userscrore),2),
 diferencia = round(mean(metacritic$metascore),2) - round(mean(metacritic$userscrore),2)
 )
write.csv2(gral,"clipboard")

#Publicador
metacritic_stats = ddply(metacritic,"publisher",function(x) data.frame(metascrore = mean(x$metascore),
 userscore = mean(x$userscrore),
 diferecia = mean(x$metascore-x$userscrore),
 p_value = tryCatch(t.test(x$metascore,x$userscrore, alternative = "two.sided")$p.value,error = function(e) NA),
 cases = nrow(x)))
metacritic_stats = subset(metacritic_stats, cases > 5)
nrow(metacritic_stats)
metacritic_stats = subset(metacritic_stats, p_value <= 0.05)
metacritic_stats = metacritic_stats[order(metacritic_stats$p_value,decreasing = T),]
print(metacritic_stats)

En la siguiente tabla podemos ver que al realizar el mismo test t anterior para los publishers con al menos de 5 juegos, de los 26 que cumplen con la condición, 7 tienen un p-valor significativo, lo cual nos permite concluir que sus juegos tienen estadisticamente un metascore mayor al userscore o en otras palabras, algo hacen que estos juegos les gustan más a los que hacen reseñas que los que los juegan… ¿extraño tal vez los juegos beta son mejores que las versiones finales? jajjaa.

Que publishers tienen más reviewers “generosos”, para ello vamos a comparar la diferencia entre el metascore y el userscore para cada publisher-reviewer, testeando que el valor sea 0, si se rechaza la hipotesis nula, podemos afirmar que el valor es distinto que 0. Luego veremos para cada empresa, que porcentaje de reviewers son generoso. El resultado en la tabla a continuación, muestra que las empresas de la lista de arriba tienen muy buena relación con los reviewers, por ejemplo, el 100% de las empresas  que hacen reviews de EA Sports y Konami dan puntajes estaditicamente más altos a los juegos que los usuarios.

comp = merge(metacritic,details, by = "metascore_url",all.x = T)

#Reviewer con mayor error
reviewer_stats = ddply(comp,c("publisher","detail_metascore_source"),function(x) data.frame(error = mean(x$metascore-x$userscrore),
 p_value = tryCatch(t.test(x$metascore-x$userscrore)$p.value,error = function(e) NA),
 cases = nrow(x)))
reviewer_stats = subset(reviewer_stats, cases >= 5)
reviewer_stats_numero_evaluado = ddply(reviewer_stats,"publisher", function(x) data.frame(total_reviewers = nrow(x)))
reviewer_stats = subset(reviewer_stats, p_value <= 0.05 & error > 0)
reviewer_stats_numero_afectado = ddply(reviewer_stats,"publisher", function(x) data.frame(reviewers_generosos = nrow(x)))
reviewer_stats = merge(reviewer_stats_numero_evaluado,reviewer_stats_numero_afectado, all.x=T)
reviewer_stats[is.na(reviewer_stats)] = 0
reviewer_stats$porcentaje_generoso = round(100*reviewer_stats$reviewers_generosos/reviewer_stats$total_reviewers)
arrange(reviewer_stats,-porcentaje_generoso)

Conclusiones

Podemos concluir que efectivamente existe una relación entre los reviewers y los publishers la cual puede llegar a confundirnos al momento de elegir juegos. Considerando que los juegos valen aproximadamente 60 dolares, recomendaría esperar a ver que dicen los otros usuarios antes de comprar un juego, en especial para las grandes empresas como:  Sierra Games, Konami, Ubisoft,  Electronic Arts, EA Sports,  Zen Studios y Activision.

Espero que les halla gustado y compartan! Saludos!

Adjuntos: bd_juegos

 

Print Friendly, PDF & Email

2 comments

Leave a Reply

Tu dirección de correo electrónico no será publicada.