Han empeorado los videojuegos?

Introducción / Abstract

Un data scientist es aquel que logra hacer que los datos le hablen, es básicamente una converzación, donde les haces preguntas y los datos de responden.

En este notebook quiero compartir mi ultima converzación con este dataset con las notas que le han puesto a distintos videojuegos, el objetivo es ir mostrando como se va desarrollando el trabajo como data scientist.

Inicialmente tuve una idea de que últimamente, a pesar de que la industria de video-juegos crece y crece, la calidad de los juegos a ido bajando, por lo que decidí medir este efecto. De ahí viene la pregunta numero 1… ¿De donde consigo datos?, la respuesta fue metacritic, la cual es una pagina web que tiene las notas promedio de la critica (metascore) para cada juego de cada consola y también la nota que le ponen las personas que usan la pagina (userscore).

para trabajar realicé un web-scraping de metacritic (que tomó mucho más tiempo que realizar este analisis), donde extraje todos los reviews disponibles disponibles al 23 de marzo del 2018, pero no incluí PC master race, por que tenía mas juegos que todas las consolas juntas.

Descriptivos iniciales

El objetivo es familiarizarse con los datos más que buscar una respuesta a la pregunta inicial. Personalmente prefiero dejar la pregunta inicial para el final, así tener una idea más completa antes de ver los números.

Descripción del Dataset

se extrajeron 11548 registro completos desde metacritic, se considerarán solo los juegos que tengan userscore y metascore, básicamente por que los juegos que no tienen esto valores, son juegos de mala calidad que nadie les prestó atención, son en general shovelware o poco relevantes.

Desde Metacritic se extrajeros los siguientes datos:

  • platform: consola (Xbox One, PlayStation 4, PlayStation 3, Xbox 360, Dreamcast, GameCube, PlayStation, DS, Wii, Game Boy Advance, Xbox, Wii U, PlayStation 2, PlayStation Vita, 3DS, PSP, Switch, Nintendo 64).
  • product_title: Nombre del juego.
  • release_date: Fecha en que salió el juego.
  • metascore: Nota promedio asignada por la critica.
  • userscore: Nota promedio asignada por los usuarios.

la cual fue enriquecida con los siguientes campos calculados:

  • playscore: promedio ente userscore y playscore, es una métrica utilizada en algunos canales de youtube.
  • critic_love: puntos extras entregados por la critica (metascore – userscore).
  • from_first_release: diferencia en días entre la fecha de lanzamiento y la fecha del primer juego de la consola.

Numero de juegos

Número de juegos por sistema

los 11548 juegos evaluados de distribuyen del siguiente modo:

Las consolas mas viejas, claramente no tienen toda la historia

ggplot(dataset,aes(platform)) + 
geom_histogram(stat="count") + 
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Series Temporales

Numero de juegos lanzados mensualmente

Como no están todos los juegos para consolas viejas, trabajaremos con la zona dentro del rectángulo celeste, la cual corresponde al periodo entre el 2000 y el 2017 (incluido).

Podemos ver que hay un peak en el numero de juegos y una estacionalidad

aux = mutate(dataset,release_month = release_date - day(release_date) + 1) %>%
      group_by(release_month) %>% 
      summarise(numero_releases = n())
ggplot(aux,aes(release_month,numero_releases)) + 
  annotate("rect",xmin = as.Date("2000-01-01"), xmax = as.Date("2017-12-31"), ymin = 0, ymax=Inf, fill = "blue", alpha = .3,) + 
  geom_line() +
  geom_vline(xintercept = as.Date(c("1995-01-01","2000-03-04","2006-11-11","2017-02-22") )) + 
  annotate("text",x=as.Date(c("1995-01-01","2000-03-04","2006-11-11","2017-02-22") ) + 180, y = 150, label = c("ps1","ps2","ps3","ps4"))

dataset = filter(dataset, release_date >= as.Date("2000-01-01") & release_date <= as.Date("2017-12-31")) %>% 
          mutate(playscore = (userscore+metascore)/2,
                 critic_love = metascore - userscore) %>%
          group_by(platform) %>%
          mutate(from_first_release = as.numeric(release_date - min(release_date))) %>%
          ungroup()

Promedio de juegos por mes

Como es las estacionalidad detectada? midamos cuantos releases más que el promedio anual hay en cada mes. Lo anterior se realiza con una regresión lineal con variables dummy del tipo: releases ~ month + year -1.

Hay un aumento considerable en el numero de releases a fin de año, seguramente para captar mayores ventas navideñas, luego diciembre y enero son los meses con menos releases.

aux = mutate(dataset,month = str_pad(month(release_date),2,pad="0"), year=as.character(year(release_date))) %>%
      group_by(month,year) %>% 
      summarise(releases = n())
fit = lm(releases ~ month + year -1, aux)
aux = data.frame(month = str_extract(names(coef(fit)[1:12]),"[0-9]+$"), releases = coef(fit)[1:12] - min(coef(fit)[1:12]) )
ggplot(aux, aes(month,releases)) + 
  geom_bar(stat ="identity")

Vida de cada Consola

En que fechas tuvo releases cada consola y cuantos fueron?

PS4 por lejos tuvo el mayor numero de releases año el 2016 y 2017, por otro lado SWITCH (solo un punto) tuvo más releases en su primer año que PS4 en su segundo año.

colors = brewer.pal(8, "Dark2")
colors = brewer.pal(8, "Dark2")
color_generator <- colorRampPalette(colors)
aux = mutate(dataset, release_year = as.character(year(release_date))) %>%
  group_by(platform,release_year) %>%
  summarise(releases = n())
ggplot(aux,
    aes(release_year,releases,color = platform, group = platform)) + 
    scale_color_manual(values = color_generator(length(unique(aux$platform)))) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_line(size=2) + 
  geom_point(size = 2)

Vida de las consolas, numero de releases acumulado por años de la consola

El ps4 el lejos la consola que logró mas juegos en los primeros años, por otro lado wiiU es la consola con menos juegos.

El comportamiento de los releases no sigue una curva S, seguramente por que se necesitan mucho juegos el inicio para que la consola sea atractiva.

aux = mutate(dataset, release_year = cut(from_first_release, seq(from = 0, to = 30*12*10, by = 360), include.lowest = T, labels = as.character(1:10) )) %>%
  group_by(platform,release_year) %>%
  summarise(releases = n()) %>% 
  arrange(platform,release_year) %>% 
  mutate(cum_releases = cumsum(releases))
seleccionadas = filter(aux, release_year == "4") #Que tengan 4 años de juegos
ggplot(subset(aux, platform %in% seleccionadas$platform),
       aes(release_year,cum_releases,color = platform, group = platform)) + 
    scale_color_manual(values = color_generator(length(unique(aux$platform)))) +
  geom_line(size=2) + 
  geom_point(size=2)

Releases Anuales

Cuantos releases hay anualmente en total?

el peak corresponde al año 2009, pero no es el año con más juegos, solo donde se concentraron más en la estacionalidad, posiblemente corresponde a un cambio de estrategia. Si salen muchos juegos juntos, eso canaliza las ventas.

Luego del peak en 2009 hay una recesión que comienza a recuperarse el 2013.

El lanzamiento de Nintendo SWITCH por un lado explica el peak del 2016 y también le quitó presencia el líder Playstation 4. Por otro lao el primer año del SWITCH tuvo más releases que el primer año de PS4, por lo que en 4 años más debería batir el récord de releases de PS4.

aux = mutate(dataset,release_year = as.character(year(release_date)))
ggplot(aux,aes(release_year, fill = platform)) + 
  geom_bar(stat="count") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_fill_manual(values = color_generator(length(unique(dataset$platform)))) + 
  ylab("Nuero de Releases")

Market share de releases por sistema

Cual es el market share en numero de releases por sistema?

Al comparar el primer año de marketshare del Switch, se ve más grande que el del PS4, por lo que en 3 años más debería tener tantos releases como ps4 el 2016.

Nintendo Wii a pesar de haber tenido muchas ventas, no tuvo tantos juegos, seguramente por la forma de los controles

ggplot(aux,aes(release_year, fill = platform)) + 
  geom_bar(position="fill") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_fill_manual(values = color_generator(length(unique(dataset$platform)))) + 
  ylab("Market Share")

Numero ports de cada juego

Para cuantos sistemas sale cada juego?

La mayoría de los juegos son exclusivos.

aux = group_by(dataset,product_title) %>% summarise(sistemas = as.character(n()))
ggplot(aux,aes(sistemas)) + geom_histogram(stat="count")

Evolución del numero de juegos con ports

Ha aumentado el numero de juegos con ports a medida que las consolas se vuelven mas potente y hay mas APIS, permitiendo así hacer desarrollos multi-plataforma?

Si ha aumentado, pero desde los tiempos del PS2, en especial en los juegos que salen para 2 sistemas, seguramente por que siempre hay 2 consolas similares en el mercado.

aux = mutate(dataset, year = year(release_date)) %>% 
  group_by(year,product_title) %>% 
  summarise(sistemas = as.character(n()))
ggplot(aux,aes(year, fill = sistemas)) + 
  geom_bar(position="stack") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_vline(xintercept = c(2001,2007,2014) ) + 
  ylab("Numero de releases") +
  annotate("text",x=c(2001,2007,2014)+.5, y = .9, label = c("ps2","ps3","ps4"))

Análisis de Puntajes (metascore y userscore)

Analisis de las consolas

Notas Promedio por Consola

Son los juegos de ciertas consolas mejor evaluados por los usuarios o la critica?

Podemos ver que las consolas con los mejores juegos son las viejas (Dreamcast, Nintendo 64 y Playstation 1), en metacritic solo hay nota para los juegos más buenos y populares de estos sistemas, para balancear esto, trabajaremos con los 50 mejores juegos de cada sistema. Lo anterior tiene sentido, por que seguramente la gente al momento de elegirá dentro de esa lista, el resto de los juegos son desconocidos para el consumidor promedio.

dataset = readRDS("scores.rds")
aux = rbind(group_by(dataset,platform) %>% summarise(mean_value = mean(metascore), score = "metascore"),
            group_by(dataset,platform) %>% summarise(mean_value = mean(userscore), score = "userscore"))
ggplot(aux,aes(platform,mean_value, fill=score)) + 
  geom_bar(stat="identity", position = "dodge") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+ 
  scale_y_continuous(limits = c(60, 80),oob=rescale_none)

Scores de los 50 mejores juegos por consola

Podemos ver que en general, los metascore son más altos que los userscore, esto solo no se cumple en gameboy Advance y PSP, potr otro lado en wii, wiiU y 3DS el userscore está muy cercano al metascore.

Por otro lado, las consolas de ultima generación (Ps4 y Xbox One) son las peor evaluadas por los usuarios, mientras que la critica se mantiene constante.

dataset50 = group_by(dataset, platform) %>% top_n(50,playscore)
aux = rbind(group_by(dataset50,platform) %>% summarise(mean_value = mean(metascore), score = "metascore"),
            group_by(dataset,platform) %>% summarise(mean_value = mean(userscore), score = "userscore"))
ggplot(aux,aes(platform,mean_value, fill=score)) + 
  geom_bar(stat="identity", position = "dodge") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_y_continuous(limits = c(60, 95),oob=rescale_none)

Correlación entre userscore y metascore

Existe correlación entre el userscore y el metascore?

la correlación entre los dos para los 50 mejores juegos por consola es de 0.076, a continuación presentamos la correlación por sistema, donde detectamos que en general hay una correlación negativa entre userscore y metascore.

aux = group_by(dataset50,platform) %>% 
  summarise(correlacion_ms_us = cor(userscore,metascore))
ggplot(aux,aes(platform,correlacion_ms_us)) + 
  geom_bar(stat="identity", position = "dodge") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

critic_love por sistema

Hay preferencia al momento de evaluar los juego de un sistema?

El critic_love es la cantidad de puntos extra que extrega la critica con respecto a los usuarios.

Es interesante ver que el critic_love es similar para: nintendo 64 con playstation, playstation2 con xbox con GameCube, playstation 3 con xbox 360 y playstation 4 con xbox One, correspondiente a consolas de las mismas generaciones, esto podría deberse a los juegos multi plataforma que generan correlación o simplemente a una tendencia estacional.

aux = group_by(dataset50,platform) %>% 
  summarise(mean_critic_love = mean(critic_love))
ggplot(aux,aes(platform,mean_critic_love)) + geom_bar(stat="identity") + theme(axis.text.x = element_text(angle = 45, hjust = 1))

Cual es la mejor consola?

Es una pregunta dificil, hay varias formas de comparar las consolas, puede ser precio, numero de juegos o calidad de estos.

userscore promedio para los n mejores juegos

Si miramos los n primeros juegos, que consola tiene mejores notas?

Si vas a tener 1 solo juego, las mejores consolas son gamecube y ps4, Si eres un poco más gamer y vas a tener unos 5 juegos, un psone es la opción, después de eso, el rey es Ps2.
Aunque cabe destacar que también hay otros factores como que tan antigua es la consola en cuestión, por ejemplo, un PS1 puede ser un poco decepcionante en la gráfica.

Por el lado contrario, Nintendo 64 parece ser lejos la peor consola para los gamers mas intensivos, seguramente por eso PSX logro destronar a nintendo.

aux = group_by(dataset, platform) %>% 
  arrange(-userscore) %>% 
  summarise("01" = mean(userscore[1]),
            "02" = mean(userscore[1:2]),
            "03" = mean(userscore[1:3]),
            "05" = mean(userscore[1:5]),
            "10" = mean(userscore[1:10]),
            "15" = mean(userscore[1:15]),
            "20" = mean(userscore[1:20]),
            "30" = mean(userscore[1:30]),
            "40" = mean(userscore[1:40]),
            "50" = mean(userscore[1:50])) %>% 
  gather(numero_juegos,userscore,-platform)
ggplot(aux,aes(platform,userscore, fill = numero_juegos)) + 
  geom_bar(stat = "identity",position="nudge") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_fill_manual(values = color_generator(10)) + 
    scale_y_continuous(limits = c(min(aux$userscore), 95),oob=rescale_none)

Diferencia en userscore para el mismo juego

Hay alguna diferencia en los userscore para el mismo juego en distintas consolas? Lo anterior es interesante por que podría significar que es mas fácil programar en una consola que en otra.

Nos enfocaremos en los juegos que están en al menos 3 sistemas. Donde veremos en promedio la diferencia (premio o castigo) que tienen los userscore de cada consola con respecto al promedio del juego, filtraremos las consolas que no tengan al menos 30 juegos para comparar.

Podemos ver que las más perjudicadas son las consolas portatiles de nintendo, DS y 3DS, seguramente por que tienden a ser versiones reducidas de los otros juegos, Por otro lado las consolas con los mejores port son la wiiU, luego el playstation 2 y PS Vita.

multisistema = group_by(dataset,product_title) %>% summarise(sistemas = n()) %>% filter(sistemas >= 3) 
aux = filter(dataset, product_title %in% multisistema$product_title) %>% 
  group_by(product_title) %>% 
  mutate(userscore_premium = userscore-mean(userscore)) %>% 
  group_by(platform) %>% 
  summarise(userscore_premium = mean(userscore_premium), numero = n()) %>% 
  filter(numero > 30)
ggplot(aux,aes(platform,userscore_premium)) + geom_bar(stat="identity") + theme(axis.text.x = element_text(angle = 45, hjust = 1))

Analisis temporal de los scores

Evolución del userscore promedio para los n mejores juegos

Existe un cambio en el userscore promedio de los juegos a lo largo del tiempo? (la pregunta inicial)

Para realizar este análisis, agruparemos los ports en un solo juego con la nota promedio de ellos.

Vemos que los juegos top del año mantienen una nota sin aparente tendencia, pero para los juegos desde el numero 15, se detecta que el userscore a disminuir año a año.

aux = filter(dataset, release_date >= as.Date("2001-01-01") & release_date <= as.Date("2017-12-31")) %>% 
  mutate(release_year = year(release_date)) %>% 
  group_by(release_year, product_title) %>% 
  summarise(userscore = mean(userscore)) %>% 
  group_by(release_year) %>% 
  arrange(-userscore) %>% 
  summarise("01" = mean(userscore[1]),
            "02" = mean(userscore[1:2]),
            "03" = mean(userscore[1:3]),
            "05" = mean(userscore[1:5]),
            "10" = mean(userscore[1:10]),
            "15" = mean(userscore[1:15]),
            "20" = mean(userscore[1:20]),
            "30" = mean(userscore[1:30]),
            "40" = mean(userscore[1:40]),
            "50" = mean(userscore[1:50])) %>% 
  gather(nth_score,userscore,-release_year)
ggplot(aux,aes(release_year,userscore, fill = nth_score, group = nth_score)) + 
  geom_area(size = 1.5, position = "nudge") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_fill_manual(values = color_generator(10)) + 
  scale_y_continuous(limits = c(min(aux$userscore), 95),oob=rescale_none) +  
  geom_vline(xintercept = c(2001,2007,2014) ) + 
  annotate("text",x=c(2001,2007,2014)+1, y = 95, label = c("ps2","ps3","ps4"))

Evolución del metascore promedio para los n mejores juegos

El cambio en los userscore se extrapola a lo metascore?

No, el metascore se ha mantenido relativamente contante y sin tendencia en el tiempo.

aux = filter(dataset, release_date >= as.Date("2001-01-01") & release_date <= as.Date("2017-12-31")) %>% 
  mutate(release_year = year(release_date)) %>% 
  group_by(release_year, product_title) %>% 
  summarise(metascore = mean(metascore)) %>% 
  group_by(release_year) %>% 
  arrange(-metascore) %>% 
summarise("01" = mean(metascore[1]),
            "02" = mean(metascore[1:2]),
            "03" = mean(metascore[1:3]),
            "05" = mean(metascore[1:5]),
            "10" = mean(metascore[1:10]),
            "15" = mean(metascore[1:15]),
            "20" = mean(metascore[1:20]),
            "30" = mean(metascore[1:30]),
            "40" = mean(metascore[1:40]),
            "50" = mean(metascore[1:50])) %>% 
  gather(nth_score,metascore,-release_year)
ggplot(aux,aes(release_year,metascore, fill = nth_score, group = nth_score)) + 
  geom_area(size = 1.5, position = "nudge") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  scale_fill_manual(values = color_generator(10)) + 
  scale_y_continuous(limits = c(min(aux$metascore), 100),oob=rescale_none) + 
    geom_vline(xintercept = c(2001,2007,2014) ) + 
  annotate("text",x=c(2001,2007,2014)+1, y = 100, label = c("ps2","ps3","ps4"))

Evolución de critic_love para los 100 mejores juegos de cada año

Entonces la critica está siendo menos critica?

Se tomaron los 100 mejores juegos y los multi-plataforma se agruparon en uno solo, para así evitar sobre ponderación.

Podemos ver que desde que salió el Playstation 3, la critica ha vuelto menos critica con respecto a los jugadores.

dataset100 = filter(dataset, release_date >= as.Date("2001-01-01") & release_date <= as.Date("2017-12-31")) %>% 
  mutate(release_year = year(release_date)) %>%
  group_by(product_title,release_year) %>% 
  summarize(critic_love = mean(critic_love), userscore = mean(userscore), metascore = mean(metascore)) %>% 
  group_by(release_year) %>% 
  top_n(100,userscore)
aux = group_by(dataset100,release_year) %>%
  summarise(mean_critic_love = mean(critic_love))
ggplot(aux,aes(release_year,mean_critic_love)) + 
  geom_line()  + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_vline(xintercept = c(2001,2007,2014) ) + 
  annotate("text",x=c(2001,2007,2014)+1, y = 5, label = c("ps2","ps3","ps4"))

Evolución de la correlación userscore y metascore para los 100 mejores juegos

Existió algún momento en el que la critica estaba alineada a los consumidores?

No, la correlación siempre ha sido baja…

aux = group_by(dataset100,release_year) %>% 
  summarise(correlacion_ms_us = cor(userscore,metascore))
ggplot(aux,aes(release_year,correlacion_ms_us)) + 
  geom_line()  + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  geom_vline(xintercept = c(2001,2007,2014) ) + 
  annotate("text",x=c(2001,2007,2014)+1, y = 1, label = c("ps2","ps3","ps4"))

Conclusiones

Efectivamente la evaluación de promedio de los usuarios en promedio ha bajado, pero para los mejores juegos del año se ha mantenido constante. En otras palabras si eres una persona que juega muchos juegos, seguramente sientes que el pasado fue mejor, mientras que si eres una persona que juega 2 o 3 juegos al año no has notado un cambio.

Esto nos deja varias hipotesis, una de ellas es que posiblemente los jugadores se están aburriendo de las series de juegos o que los desarrolladores están gastando mas recursos en favores a la critica que en sus juegos, también puede ser que dado lo caros que son hoy en dia los desarrollos, las empresas no se atreven a innovar mucho.

A alguien se le ocurren más hipotesis o formas de responderlas?

Saludos!

Y como de costumbre, les comparto el dataset y el notebook para R en el siguiente link: metacritic

Print Friendly, PDF & Email