O primeiro jogo foi lançado em agosto de 1972, jogos da primeira geração eram desenvolvidos para um único console e o primeiro pertencia ao Magnavox Odyssey criado por Ralph Baer, o console ficou conhecido como Brown Box e o jogo consistia em um simples jogo de ping pong.
O projeto final da disciplina de Tecnologia da Informação realizado por Fabrício Cavalcante Costa de Souza é fundamentado em uma base que contém dados de jogos exclusivos de consoles desde de 1980 até 2016, chamada de Vídeo Game Sales, com informações sobre seu; ano de estreia no mercado, empresa desenvolvedora e editora, plataforma, gênero, vendas na América do Norte, Europa, Japão e o resto do mundo, vendas globais, nota que o jogo recebeu por críticos, nota que o jogo recebeu pelos jogadores, números de críticos e jogadores que colaboraram para a formação das notas, respectivamente, e classificação etária.
Estas características se encontram da seguinte maneira na base de dados (acompanhadas de seus resumos):
if(!require(tidyverse)){
install.packages("tidyverse")
library(tidyverse)
}
if(!require(ggrepel)){
install.packages("ggrepel")
library(ggrepel)
}
if(!require(gridExtra)){
install.packages("gridExtra")
library(gridExtra)
}
if(!require(plyr)){
install.packages("plyr")
library(plyr)
}
library(readr)
library(dplyr)
library(tidyr)
library(data.table)
library(stringr)
library(magrittr)
library(ggplot2)
library(DataExplorer)
library(plotly)
library(caret)
library(randomForest)
## apagar para exibir
df <- read.csv(file.choose(),stringsAsFactors = FALSE, sep =",")
#df <- read.csv(link, stringsAsFactors = FALSE, sep =",")
Essas são as primeiras 6 linhas de 16.719 da base de dados utilizada.
head(df)
## Name Platform Year_of_Release Genre Publisher
## 1 Wii Sports Wii 2006 Sports Nintendo
## 2 Super Mario Bros. NES 1985 Platform Nintendo
## 3 Mario Kart Wii Wii 2008 Racing Nintendo
## 4 Wii Sports Resort Wii 2009 Sports Nintendo
## 5 Pokemon Red/Pokemon Blue GB 1996 Role-Playing Nintendo
## 6 Tetris GB 1989 Puzzle Nintendo
## NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales Critic_Score
## 1 41.36 28.96 3.77 8.45 82.53 76
## 2 29.08 3.58 6.81 0.77 40.24 NA
## 3 15.68 12.76 3.79 3.29 35.52 82
## 4 15.61 10.93 3.28 2.95 32.77 80
## 5 11.27 8.89 10.22 1.00 31.37 NA
## 6 23.20 2.26 4.22 0.58 30.26 NA
## Critic_Count User_Score User_Count Developer Rating
## 1 51 8 322 Nintendo E
## 2 NA NA
## 3 73 8.3 709 Nintendo E
## 4 73 8 192 Nintendo E
## 5 NA NA
## 6 NA NA
glimpse(df)
## Observations: 16,719
## Variables: 16
## $ Name <chr> "Wii Sports", "Super Mario Bros.", "Mario Kart...
## $ Platform <chr> "Wii", "NES", "Wii", "Wii", "GB", "GB", "DS", ...
## $ Year_of_Release <chr> "2006", "1985", "2008", "2009", "1996", "1989"...
## $ Genre <chr> "Sports", "Platform", "Racing", "Sports", "Rol...
## $ Publisher <chr> "Nintendo", "Nintendo", "Nintendo", "Nintendo"...
## $ NA_Sales <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.2...
## $ EU_Sales <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9...
## $ JP_Sales <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.9...
## $ Other_Sales <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84...
## $ Global_Sales <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.8...
## $ Critic_Score <int> 76, NA, 82, 80, NA, NA, 89, 58, 87, NA, NA, 91...
## $ Critic_Count <int> 51, NA, 73, 73, NA, NA, 65, 41, 80, NA, NA, 64...
## $ User_Score <chr> "8", "", "8.3", "8", "", "", "8.5", "6.6", "8....
## $ User_Count <int> 322, NA, 709, 192, NA, NA, 431, 129, 594, NA, ...
## $ Developer <chr> "Nintendo", "", "Nintendo", "Nintendo", "", ""...
## $ Rating <chr> "E", "", "E", "E", "", "", "E", "E", "E", "", ...
summary(df)
## Name Platform Year_of_Release
## Length:16719 Length:16719 Length:16719
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## Genre Publisher NA_Sales EU_Sales
## Length:16719 Length:16719 Min. : 0.0000 Min. : 0.000
## Class :character Class :character 1st Qu.: 0.0000 1st Qu.: 0.000
## Mode :character Mode :character Median : 0.0800 Median : 0.020
## Mean : 0.2633 Mean : 0.145
## 3rd Qu.: 0.2400 3rd Qu.: 0.110
## Max. :41.3600 Max. :28.960
##
## JP_Sales Other_Sales Global_Sales Critic_Score
## Min. : 0.0000 Min. : 0.00000 Min. : 0.0100 Min. :13.00
## 1st Qu.: 0.0000 1st Qu.: 0.00000 1st Qu.: 0.0600 1st Qu.:60.00
## Median : 0.0000 Median : 0.01000 Median : 0.1700 Median :71.00
## Mean : 0.0776 Mean : 0.04733 Mean : 0.5335 Mean :68.97
## 3rd Qu.: 0.0400 3rd Qu.: 0.03000 3rd Qu.: 0.4700 3rd Qu.:79.00
## Max. :10.2200 Max. :10.57000 Max. :82.5300 Max. :98.00
## NA's :8582
## Critic_Count User_Score User_Count Developer
## Min. : 3.00 Length:16719 Min. : 4.0 Length:16719
## 1st Qu.: 12.00 Class :character 1st Qu.: 10.0 Class :character
## Median : 21.00 Mode :character Median : 24.0 Mode :character
## Mean : 26.36 Mean : 162.2
## 3rd Qu.: 36.00 3rd Qu.: 81.0
## Max. :113.00 Max. :10665.0
## NA's :8582 NA's :9129
## Rating
## Length:16719
## Class :character
## Mode :character
##
##
##
##
ind <- which(is.na(df$Critic_Score))
df$Critic_Score[ind] <- 0
ind <- which(is.na(df$Critic_Count))
df$Critic_Count[ind] <- 0
df$User_Score[df$User_Score == 'tbd' & !is.na(df$User_Score)] <- NA
df$User_Score <- as.numeric(as.character(df$User_Score))
df$User_Score[is.na(df$User_Score)] <- 0
ind <- which(is.na(df$User_Count))
df$User_Count[ind] <- 0
x3 <- sample(2000:2016, 269,replace = TRUE)
x3 <- as.vector(x3)
df$Year_of_Release[df$Year_of_Release == 'N/A'] <- NA
ind <- which(is.na(df$Year_of_Release))
df$Year_of_Release[ind] <- x3
df$Developer[df$Developer == ''] <- NA
ind <- which(is.na(df$Developer))
df$Rating[df$Rating == ''] <- NA
df$Critic_Score <- df$Critic_Score/10
df$Year_of_Release <- as.integer(df$Year_of_Release)
glimpse(df)
## Observations: 16,719
## Variables: 16
## $ Name <chr> "Wii Sports", "Super Mario Bros.", "Mario Kart...
## $ Platform <chr> "Wii", "NES", "Wii", "Wii", "GB", "GB", "DS", ...
## $ Year_of_Release <int> 2006, 1985, 2008, 2009, 1996, 1989, 2006, 2006...
## $ Genre <chr> "Sports", "Platform", "Racing", "Sports", "Rol...
## $ Publisher <chr> "Nintendo", "Nintendo", "Nintendo", "Nintendo"...
## $ NA_Sales <dbl> 41.36, 29.08, 15.68, 15.61, 11.27, 23.20, 11.2...
## $ EU_Sales <dbl> 28.96, 3.58, 12.76, 10.93, 8.89, 2.26, 9.14, 9...
## $ JP_Sales <dbl> 3.77, 6.81, 3.79, 3.28, 10.22, 4.22, 6.50, 2.9...
## $ Other_Sales <dbl> 8.45, 0.77, 3.29, 2.95, 1.00, 0.58, 2.88, 2.84...
## $ Global_Sales <dbl> 82.53, 40.24, 35.52, 32.77, 31.37, 30.26, 29.8...
## $ Critic_Score <dbl> 7.6, 0.0, 8.2, 8.0, 0.0, 0.0, 8.9, 5.8, 8.7, 0...
## $ Critic_Count <dbl> 51, 0, 73, 73, 0, 0, 65, 41, 80, 0, 0, 64, 0, ...
## $ User_Score <dbl> 8.0, 0.0, 8.3, 8.0, 0.0, 0.0, 8.5, 6.6, 8.4, 0...
## $ User_Count <dbl> 322, 0, 709, 192, 0, 0, 431, 129, 594, 0, 0, 4...
## $ Developer <chr> "Nintendo", NA, "Nintendo", "Nintendo", NA, NA...
## $ Rating <chr> "E", NA, "E", "E", NA, NA, "E", "E", "E", NA, ...
Nessa parte realizamos a limpeza do dados, transformando os espaços vazios em NAs (falta de dado), preenchendo o campo dos anos e modificando a coluna de Critic_Score para ficar compatível com User_Score.
Como são mais de 500 Publisher, somente os Publisher com vendas totais superiores à 100 milhões de unidades foram analisados. Vemos aqui que a Nintendo é umas da que mais fatura.
As classificações etárias são os dados com maior número de NAs, tornando o NA campeã das vendas totais. A análise novamente foi feita com mais de 100 milhões de unidades por conta de algumas classificações não possuir sequer 10 milhões de unidades.
Por erro de digitação o ano 2020 aparece entre os jogos, sendo assim ele foi eliminado na análise, assim como 2017 por não conter dados completos do ano. Na análise os dados de anos foi modificado para númerico já que na base de dados ele veio como caracter. É possivel notar que no periodo de 1995 até 2015 houve uma crescente nas vendas.
O único gênero não nomeado é o gênero sem classificação determinada que veio na base de dados.Verificamos aqui que jogos de ação, sport e variados possuem a maior quantidade de títulos.
Como na pergunta anterior, o gênero que está com o espaço vazio é o gênero sem classificação. Vemos aqui que o campeão em vendas são os jogos de Plataforma, mesmo tendo a quantidade de jogos menor que os jogos de ação.
Seguindo à lógica de tornar à análise menos extensa, somente os Publisher com número de jogos feitos maior do que 100 entraram na avaliação. Aqui Eletronic Arts sai em primeiro lugar, ja que ela é uma das principais no desenvolvimento de jogos de sports, ação e shooter.
A avaliação se baseou somente no Critic_Score maior que 9,5 por conta da quantidade de jogos que aparecem e também por conta do número de avaliadores, com o User_Score, alguns jogos recebe nota alta, porém só tem um único avaliador, por conta disso esta avaliação foi descartada.
Novamente o critério de somente Critic_Score entrou na avaliação por conta de ter mais um avaliador, diferente do User_Score.
Os jogos possuem dados desde 1980, então é normal ter plataforma antigas, para uma análise melhor foi retirado todas as plataformas com menos de 100 milhões de unidades, tornando o gráfico bem menos denso. Aqui podemos notar que o PS2 teve uma quantidade enorme de vendas, ultrapassando até mesmo seu sucessor o PS3 e superando um outro console com poder de processamento superior Xbox 360.
Mapa de correlação dos dados, nesse gráfico, tentamos encontrar variáveis que tenham uma correlação.
set.seed(123)
ps3set <- subset(df, Platform=="PS3")
index <- sample(1:nrow(ps3set),size = 0.7*nrow(ps3set))
ps3set.train <- ps3set[index,]
ps3set.test <- ps3set[-index,]
Vamos dividir a base em um modelo de teste e treino e tentar prever algo relevante com base nas nossas variáveis, para tentarmos ser mais precisos, usamos a Plataforma “PS3” e vamos utilizar dois algortimos de machine learning, regressão linear e random forest para tentar verificar se os resultados permanecem iguais no fim.
ps3.lm <- lm(formula= NA_Sales ~ User_Count +
User_Score + Critic_Count + Critic_Score +
Year_of_Release, data=ps3set.train)
summary(ps3.lm)
##
## Call:
## lm(formula = NA_Sales ~ User_Count + User_Score + Critic_Count +
## Critic_Score + Year_of_Release, data = ps3set.train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.6213 -0.1554 -0.0594 0.0182 4.0553
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.466e+01 1.163e+01 2.119 0.034350 *
## User_Count 7.059e-04 2.886e-05 24.458 < 2e-16 ***
## User_Score -5.020e-03 7.293e-03 -0.688 0.491425
## Critic_Count 1.249e-03 1.113e-03 1.123 0.261672
## Critic_Score 2.777e-02 7.971e-03 3.484 0.000517 ***
## Year_of_Release -1.223e-02 5.784e-03 -2.114 0.034770 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4043 on 925 degrees of freedom
## Multiple R-squared: 0.5309, Adjusted R-squared: 0.5284
## F-statistic: 209.4 on 5 and 925 DF, p-value: < 2.2e-16
Tivemos que usar mais de uma variável para que nosso modelo tivesse relevância e para que pudessemos ajustar o R-Squared para um valor aceitável.
ps3.lmimp <- varImp(ps3.lm)
ps3.lmimp <- ps3.lmimp[order(-ps3.lmimp$Overall),, drop=FALSE]
ps3set.test.predlm <- exp(predict(ps3.lm,ps3set.test))-1
Criamos uma tabela de importância para o modelo linear e realizamos a previsão através do predict
ps3.rf <- randomForest(NA_Sales ~ User_Count + User_Score + Critic_Count + Critic_Score +
Year_of_Release, data = ps3set.train, importance = TRUE)
Usamos um outro algoritmo chamado random forest que através de nossas variáveis passada, faz diversas combinações para que consiga encontrar o modelo com a maior acurácia e mais precisão.
ps3.rfimp <- as.data.frame(sort(importance(ps3.rf)[,1],decreasing = TRUE),optional = T)
names(ps3.rfimp) <- "PS3 %"
Realizamos o mesmo processo de construção das tabelas de importância, mas agora para o modelo de random forest.
ps3set.test.predrf <- predict(ps3.rf,ps3set.test)
Realizamos a previsão chamando a função predict para o random forest.
ps3set.allpred <- data.frame(Atual = ps3set.test$NA_Sales,
linear.regression = ps3set.test.predlm,
random.forest = ps3set.test.predrf)
ps3set.allpred <- gather(ps3set.allpred,key = model,value = Previsoes,2:3)
Realizamos a união dos modelos de regressão linear e random forest com base na variável NA_Sales e também para que possamos plotar no ggplot de forma mais clara.
Como podemos ver, o modelo random forest foi o que melhor se adaptou ao nosso modelo.