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):

Carregando as Bibliotecas

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)

Base de Dados

## 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  
##                    
##                    
##                    
## 

Limpandos os campos

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.

1.Vendas totais ao redor do mundo para Publisher

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.

2.Vendas totais ao redor do mundo para cada classificação etária

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.

3.Vendas totais dos jogos através dos anos

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.

4.Qual o gênero com com a maior quantidade de jogos publicados?

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.

5.Influência nas vendas pelo gênero de jogos

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.

6.Publisher com o maior número de jogos produzidos

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.

7.Os jogos mais bem avaliados

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.

8.Uma boa avaliação influencia nas vendas?

Novamente o critério de somente Critic_Score entrou na avaliação por conta de ter mais um avaliador, diferente do User_Score.

9. Qual a plataforma com a maior quantidade de venda?

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.

Extras - Parte 4 - Regressão & Random Forest

Mapa de correlação dos dados, nesse gráfico, tentamos encontrar variáveis que tenham uma correlação.

Modelo de Treino

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.

Regressão Linear

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

Random Forest

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.

Plotando no ggplot os dois modelos

Como podemos ver, o modelo random forest foi o que melhor se adaptou ao nosso modelo.