TMDB Box Office Prediction

In a world… where movies made an estimated $41.7 billion in 2018, the film industry is more popular than ever. But what movies make the most money at the box office? How much does a director matter? Or the budget? For some movies, it’s “You had me at ‘Hello.’” For others, the trailer falls short of expectations and you think “What we have here is a failure to communicate.” In this competition, you’re presented with metadata on over 7,000 past films from The Movie Database to try and predict their overall worldwide box office revenue. Data points provided include cast, crew, plot keywords, budget, posters, release dates, languages, production companies, and countries. You can collect other publicly available data to use in your model predictions, but in the spirit of this competition, use only data that would have been available before a movie’s release.

O objetivo do trabalho é construir um modelo adequado para o conjunto de dados sobre os filmes fornecido na plataforma Kaggle, que consiga prever a receita de cada filme baseado em suas informações. Um conjunto de treinamento foi fornecido com as receitas dos filmes incluidas, e usaremos esse conjunto para construir e validar um modelo que usaremos para prever as receitas dos filmes do conjunto de testes, que não possui o valor das receitas indicado.
Este modelo terá como variável resposta a receita (revenue) dos filmes, e usaremos as outras informações a respeito dos filmes como as variáveis explicativas. Usaremos a plataforma R para a construção do modelo, assim como para a manipulação dos dados. O primeiro passo será carregar os dados com os quais iremos trabalhar e verificar quantos filmes e quais variáveis estão incluidas no banco, como pode ser visto a seguir:


train <- read_csv("train.csv")
attach(train)
names(train)
##  [1] "id"                    "belongs_to_collection"
##  [3] "budget"                "genres"               
##  [5] "homepage"              "imdb_id"              
##  [7] "original_language"     "original_title"       
##  [9] "overview"              "popularity"           
## [11] "poster_path"           "production_companies" 
## [13] "production_countries"  "release_date"         
## [15] "runtime"               "spoken_languages"     
## [17] "status"                "tagline"              
## [19] "title"                 "Keywords"             
## [21] "cast"                  "crew"                 
## [23] "revenue"
nrow(train)
## [1] 3000


Observamos acima que o banco possui 3000 observações e 23 variáveis. A partir destas variáveis, iremos selecionar aquelas que nos ajudem a obter informações sobre o valor da receita do filme. A variável imdb_id, por exemplo, não é uma variável que usaremos no modelo, uma vez que ela é apenas uma identificação do filme para um site de crítica, logo possui os 3000 valores distintos.
A seguir iremos filtrar e recategorizar algumas variáveis, pois elas estão apresentadas no banco de dados de uma maneira que seus valores não ficam fáceis de serem lidos pelo R para a construção do modelo e também para agrupar/simplificar algumas informações fornecidas pelos dados.

### VARIAVEL GENEROS ###

generos = c()
for(i in 1:nrow(train)) {
  aux = substr(genres[i],1+str_locate(genres[i], pattern = "'name': '")[2],str_locate(genres[i], pattern = "'\\}")[2]-2)
  generos[i] = aux
}  

generos
unique(generos)

train = cbind(train,generos)


### VARIAVEL PRODUCTION COMPANIES ###

prodcomp = c()
for(i in 1:nrow(train)) {
  aux = substr(production_companies[i],1+str_locate(production_companies[i], pattern = "'name': '")[2],str_locate(production_companies[i], pattern = "',")[2]-2)
  prodcomp[i] = aux
}  

prodcomp
unique(prodcomp) # Mais de 1000 companies

train = cbind(train,prodcomp)

modepc = as.data.frame(table(prodcomp))
modepc = modepc[order(modepc$Freq,decreasing=TRUE),]
modepc[1,1] #Universal Pictures


### VARIAVEL PRODUCTION COUNTRIES ###

prodpais = c()
for(i in 1:nrow(train)) {
  aux = substr(production_countries[i],1+str_locate(production_countries[i], pattern = "'iso_3166_1': '")[2],str_locate(production_countries[i], pattern = "',")[2]-2)
  prodpais[i] = aux
}  

prodpais
unique(prodpais)

train = cbind(train,prodpais)



### VARIAVEL RELEASE DATE ###


datalanc = c()

for(i in 1:nrow(train)) {
  aux = substr(release_date[i],nchar(release_date[i])-1,nchar(release_date[i]))
  datalanc[i] = aux
}  

datalanc
datalanc = as.numeric(datalanc)

for (i in 1:length(datalanc)) {
  if(datalanc[i] < 20) {
    datalanc[i] = 19 - datalanc[i]
  }else{
    datalanc[i] = 119 - datalanc[i]
  }
}

datalanc
unique(datalanc)
which(datalanc == 95)

train = cbind(train,datalanc)


### VARIAVEL SPOKEN LANGUAGES ###

linguas = c()
for(i in 1:nrow(train)) {
  aux = substr(spoken_languages[i],1+str_locate(spoken_languages[i], pattern = "'iso_639_1': '")[2],str_locate(spoken_languages[i], pattern = "',")[2]-2)
  linguas[i] = aux
}  

linguas
unique(linguas)

train = cbind(train,linguas)


### VARIAVEL HOMEPAGE ###

homepg = c()

for(i in 1:nrow(train)) {
 homepg[i] = ifelse(is.na(homepage[i]),0,1)
}

homepg = as.factor(homepg)
train = cbind(train,homepg)



### MES DE LANÇAMENTO ###

meslanc = c()

for(i in 1:nrow(train)) {
  aux = substr(release_date[i],1,str_locate(release_date[i],"/")[2]-1)
  meslanc[i] = aux
}  

meslanc
unique(meslanc)
train = cbind(train,meslanc)



### DIA DA SEMANA DE LANÇAMENTO ###

dialanc = c()


for(i in 1:nrow(train)) {
  
  if(mdy(release_date[i]) > mdy("12/31/2018")) {
    d = as.character(mdy(release_date[i]))
    d = paste("19",substring(d,3,nchar(d)),sep="")
    dialanc[i] = weekdays(ymd(d))
    
  }else{
    dialanc[i] = weekdays(mdy(release_date[i]))
  }
}

dialanc
unique(dialanc)
train = cbind(train,dialanc)





# As variáveis generos, linguas e prodpais e prodcomp apresentam os seguintes valores com a maior frequência(moda):

generos <- ifelse(generos != "Drama", "Others",generos)
linguas <- ifelse(linguas != "en", "Others",linguas)
prodpais <- ifelse(prodpais != "US", "Others",prodpais)
prodcomp <- ifelse(prodcomp != "Universal Pictures","Others",prodcomp)


#######
is_Drama = generos
is_Drama[is_Drama=="Drama"] = 1
is_Drama[is_Drama=="Others"] = 0
train$is_Drama=is_Drama

is_en = linguas
is_en[is_en=="en"] = 1
is_en[is_en=="Others"] = 0
train$is_en=is_en


is_us = prodpais
is_us[is_us=="US"] = 1
is_us[is_us=="Others"] = 0
train$is_us=is_us


is_UP = prodcomp
is_UP[is_UP=="Universal Pictures"] = 1
is_UP[is_UP=="Others"] = 0
train$is_UP=is_UP
##########


select_var = c("budget","popularity","runtime","revenue","datalanc","homepg","meslanc","dialanc","is_Drama","is_us","is_en","is_UP")
train = train[,select_var]
train = train[complete.cases(train),]


Agora, selecionamos e transformamos as variáveis que farão parte, a princípio, do modelo. Também removemos os filmes que continham informações não preenchidas em relação a essas variáveis. E será com esses dados que trabalharemos na construção do modelo. A seguir, iremos explorar os dados e fazer uma análise com o intuito de verificar se existe algum modelo que pode se adequar aos dados em questão.

attach(train)
## The following objects are masked _by_ .GlobalEnv:
## 
##     datalanc, dialanc, homepg, is_Drama, is_en, is_UP, is_us,
##     meslanc
## The following objects are masked from train (pos = 3):
## 
##     budget, popularity, revenue, runtime


nrow(train)  #Número de filmes na base de dados
## [1] 2823
names(train) #Variáveis utilizadas
##  [1] "budget"     "popularity" "runtime"    "revenue"    "datalanc"  
##  [6] "homepg"     "meslanc"    "dialanc"    "is_Drama"   "is_us"     
## [11] "is_en"      "is_UP"



describe(revenue)
##    vars    n     mean        sd   median  trimmed      mad min        max
## X1    1 2823 70662563 140830757 19054534 38379818 27472379   1 1519557910
##         range skew kurtosis      se
## X1 1519557909 4.41    26.19 2650587
hist(revenue)

boxplot(revenue)

shapiro.test(revenue)
## 
##  Shapiro-Wilk normality test
## 
## data:  revenue
## W = 0.51584, p-value < 2.2e-16


meslanc_tb = table(meslanc)
dialanc_tb = table(dialanc)



barplot(meslanc_tb[order(as.numeric(names(meslanc_tb)))],xlab="Mês",ylab="Frequência",main="Mês de lançamento dos filmes",col=c(1:12))

barplot(dialanc_tb,ylab="Frequência",main="Dia da semana de lançamento dos filmes",col=c(1:7),las=2)



table(homepg)
## homepg
##    0    1 
## 2054  946
table(is_Drama)
## is_Drama
##    0    1 
## 2208  785
table(is_en)
## is_en
##    0    1 
##  605 2375
table(is_us)
## is_us
##    0    1 
## 1127 1818
table(is_UP)
## is_UP
##    0    1 
## 2676  167

summary(budget)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##         0         0  10000000  23825239  30000000 380000000
summary(popularity)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##   0.00058   4.67364   7.66656   8.88159  11.10834 294.33704
summary(runtime)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    95.0   105.0   108.3   118.0   338.0
summary(datalanc)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    8.00   15.00   19.29   26.00   98.00


Através da análise dos gráficos acima e das medidas estatísticas calculadas, vemos que a variável revenue não apresenta distribuição aproximadamente normal, o que pode ser bem observado no histograma, onde vemos uma distribuição dos dados muito assimétrica. Sendo assim, iremos aplicar o log na variável revenue. Algumas das variáveis explicativas são dicotômicas, o que sugere o uso de variáveis dummy no modelo.
O primeiro modelo que iremos aplicar é um dos modelos mais simples e conhecidos na Estatística: Regressão Linear Múltipla. Na construção desse modelo, usaremos 80% do nosso conjunto de dados como treinamento e 20% como teste, para validar a previsão realizada feita através do modelo de regressão construído.

train$revenue = log(train$revenue)
hist(train$revenue)



set.seed(555)

smp_size <- floor(0.8 * nrow(train))
train_ind <- sample(seq_len(nrow(train)), size = smp_size)


train_2 = train[train_ind,]
test  = train[-train_ind,]




model = lm(revenue~.,data=train_2)
step(model)
## Start:  AIC=3990.94
## revenue ~ budget + popularity + runtime + datalanc + homepg + 
##     meslanc + dialanc + is_Drama + is_us + is_en + is_UP
## 
##              Df Sum of Sq   RSS    AIC
## <none>                    12910 3990.9
## - is_en       1     38.63 12949 3995.7
## - homepg      1     58.52 12969 3999.2
## - meslanc    11    176.84 13087 3999.7
## - is_Drama    1     85.17 12996 4003.8
## - datalanc    1     87.73 12998 4004.2
## - runtime     1    108.21 13019 4007.8
## - dialanc     6    178.00 13088 4009.9
## - is_us       1    123.12 13034 4010.4
## - is_UP       1    126.77 13037 4011.0
## - popularity  1    217.56 13128 4026.7
## - budget      1   2071.84 14982 4325.0
## 
## Call:
## lm(formula = revenue ~ budget + popularity + runtime + datalanc + 
##     homepg + meslanc + dialanc + is_Drama + is_us + is_en + is_UP, 
##     data = train_2)
## 
## Coefficients:
##          (Intercept)                budget            popularity  
##            1.241e+01             2.946e-08             2.641e-02  
##              runtime              datalanc               homepg1  
##            1.099e-02             1.471e-02             3.842e-01  
##            meslanc10             meslanc11             meslanc12  
##           -9.026e-02             5.088e-02             8.140e-01  
##             meslanc2              meslanc3              meslanc4  
##            8.446e-02             2.241e-01             1.408e-01  
##             meslanc5              meslanc6              meslanc7  
##           -1.469e-02             2.195e-01             6.465e-01  
##             meslanc8              meslanc9   dialancquarta-feira  
##            3.117e-01            -1.567e-01             4.914e-01  
##  dialancquinta-feira         dialancsábado  dialancsegunda-feira  
##            5.895e-01            -4.882e-01             2.458e-01  
##   dialancsexta-feira    dialancterça-feira             is_Drama1  
##            6.528e-01             1.134e-01            -4.653e-01  
##               is_us1                is_en1                is_UP1  
##            5.400e-01             3.668e-01             1.030e+00

summary(model)
## 
## Call:
## lm(formula = revenue ~ ., data = train_2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -14.4786  -0.9157   0.4729   1.4826   4.9577 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           1.241e+01  4.230e-01  29.343  < 2e-16 ***
## budget                2.946e-08  1.557e-09  18.922  < 2e-16 ***
## popularity            2.641e-02  4.308e-03   6.132 1.03e-09 ***
## runtime               1.099e-02  2.541e-03   4.324 1.60e-05 ***
## datalanc              1.471e-02  3.778e-03   3.894 0.000102 ***
## homepg1               3.842e-01  1.208e-01   3.180 0.001492 ** 
## meslanc10            -9.026e-02  2.538e-01  -0.356 0.722200    
## meslanc11             5.088e-02  2.683e-01   0.190 0.849597    
## meslanc12             8.140e-01  2.641e-01   3.082 0.002082 ** 
## meslanc2              8.446e-02  2.769e-01   0.305 0.760333    
## meslanc3              2.241e-01  2.647e-01   0.847 0.397239    
## meslanc4              1.408e-01  2.666e-01   0.528 0.597481    
## meslanc5             -1.469e-02  2.673e-01  -0.055 0.956157    
## meslanc6              2.195e-01  2.700e-01   0.813 0.416342    
## meslanc7              6.465e-01  2.737e-01   2.363 0.018234 *  
## meslanc8              3.117e-01  2.603e-01   1.198 0.231235    
## meslanc9             -1.567e-01  2.446e-01  -0.640 0.521942    
## dialancquarta-feira   4.914e-01  2.880e-01   1.707 0.088025 .  
## dialancquinta-feira   5.895e-01  2.801e-01   2.105 0.035428 *  
## dialancsábado        -4.882e-01  3.440e-01  -1.419 0.155961    
## dialancsegunda-feira  2.458e-01  3.553e-01   0.692 0.489112    
## dialancsexta-feira    6.528e-01  2.678e-01   2.437 0.014868 *  
## dialancterça-feira    1.134e-01  3.224e-01   0.352 0.725004    
## is_Drama1            -4.653e-01  1.213e-01  -3.836 0.000128 ***
## is_us1                5.400e-01  1.171e-01   4.613 4.20e-06 ***
## is_en1                3.668e-01  1.420e-01   2.584 0.009839 ** 
## is_UP1                1.030e+00  2.200e-01   4.680 3.03e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.406 on 2231 degrees of freedom
## Multiple R-squared:  0.3157, Adjusted R-squared:  0.3077 
## F-statistic: 39.58 on 26 and 2231 DF,  p-value: < 2.2e-16
plot(model)






model_pred = predict(model,test)


test$predicted = model_pred
summary(test$predicted)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   13.13   15.26   15.97   16.21   16.93   23.36
summary(test$revenue)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.099  15.400  16.834  16.250  18.095  20.751


Como podemos ver, o modelo sugerido não teve um resultado satisfatório. As suposições do modelo de regressão linear foram violadas: o modelo é heterocedástico e os resíduos não são normalmente distribuídos. Além desses problemas, que invalidam o uso do modelo. A próxima etapa será a de desenvolver um modelo mais complexo e que gere um melhor ajuste dos dados, o modelo trabalhado será o Random Forest, como pode ser visto abaixo.

rf = randomForest(revenue ~ . , data = train_2, mtry=3,importance = TRUE)
rf
## 
## Call:
##  randomForest(formula = revenue ~ ., data = train_2, mtry = 3,      importance = TRUE) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##           Mean of squared residuals: 4.341984
##                     % Var explained: 48.03
plot(rf)

rf$importance
##               %IncMSE IncNodePurity
## budget     3.33988252    5027.00476
## popularity 1.72119327    4424.58244
## runtime    0.17484671    1661.97035
## datalanc   0.84381334    1932.58305
## homepg     0.23410269     296.90694
## meslanc    0.14566354    1928.39376
## dialanc    0.05648859    1138.46148
## is_Drama   0.07961595     272.31957
## is_us      0.13321013     329.12059
## is_en      0.05330021     267.11073
## is_UP      0.02465345      92.47838
varImpPlot(rf)

predrf = predict(rf,test)
summary(predrf)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   11.03   15.12   16.51   16.30   17.67   20.17
library(Metrics)
## 
## Attaching package: 'Metrics'
## The following objects are masked from 'package:caret':
## 
##     precision, recall
rmse(test$revenue,predrf)                #Random Forest
## [1] 2.20045
rmse(test$revenue,test$predicted)        #Regressão Linear
## [1] 2.483379


O ajuste obtido utilizando RandomForest gerou um resultado melhor que o modelo de Regressão Linear Múltipla. o EQM é uma das métricas que nos ajudam a visualizar essa diferença no ajuste. Porém, para previsões em banco de dados como este que estamos trabalhando, métodos como gradient boosting produzem resultados mais satisfatórios. Por fim iremos construir mais 2 modelos para previsão neste conjunto de dados: Gradient Boosting e Extreme Gradient Boosting e vamos comparar os resultados para selecionar um modelo final.

train_2$budget = as.numeric(train_2$budget)
test$budget = as.numeric(test$budget)
cols = c("is_Drama","is_en","is_us","is_UP")
train_2[cols] <- lapply(train_2[cols], factor)
test[cols] <- lapply(test[cols], factor)

gradient =gbm(revenue ~ . ,data = train_2,distribution = "gaussian",n.trees = 10000,
                 shrinkage = 0.01, interaction.depth = 2)
gradient
## gbm(formula = revenue ~ ., distribution = "gaussian", data = train_2, 
##     n.trees = 10000, interaction.depth = 2, shrinkage = 0.01)
## A gradient boosted model with gaussian loss function.
## 10000 iterations were performed.
## There were 11 predictors of which 11 had non-zero influence.
summary(gradient)

##                   var    rel.inf
## budget         budget 30.1670821
## popularity popularity 26.9984688
## meslanc       meslanc 17.8922492
## datalanc     datalanc  9.5961794
## dialanc       dialanc  6.9566302
## runtime       runtime  5.5527716
## is_en           is_en  0.9295074
## is_us           is_us  0.7445286
## homepg         homepg  0.5021329
## is_Drama     is_Drama  0.4550542
## is_UP           is_UP  0.2053955
n.trees = seq(from=100 ,to=10000, by=100) 

predmatrix = predict(gradient,test,n.trees = n.trees)
dim(predmatrix)
## [1] 565 100
test.error<-with(test,apply( (predmatrix-test$revenue)^2,2,mean))
plot(n.trees , test.error , pch=19,col="blue",xlab="Number of Trees",ylab="Test Error", main = "Perfomance of Boosting on Test Set")


abline(h = min(test.error),col="red")  #Erro minimo através das arvores geradas

min(test.error)  #EQM OBTIDO
## [1] 4.710506


Agora iremos rodar o Extreme Boosting Gradient:

model <- train(
  revenue ~., data = train_2, method = "xgbTree",
  trControl = trainControl("cv", number = 10)
)

model$bestTune
##     nrounds max_depth eta gamma colsample_bytree min_child_weight
## 106      50         3 0.4     0              0.8                1
##     subsample
## 106         1
model
## eXtreme Gradient Boosting 
## 
## 2258 samples
##   11 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 2033, 2033, 2032, 2033, 2032, 2033, ... 
## Resampling results across tuning parameters:
## 
##   eta  max_depth  colsample_bytree  subsample  nrounds  RMSE    
##   0.3  1          0.6               0.50        50      2.135708
##   0.3  1          0.6               0.50       100      2.134199
##   0.3  1          0.6               0.50       150      2.132537
##   0.3  1          0.6               0.75        50      2.127308
##   0.3  1          0.6               0.75       100      2.121631
##   0.3  1          0.6               0.75       150      2.126155
##   0.3  1          0.6               1.00        50      2.124639
##   0.3  1          0.6               1.00       100      2.113812
##   0.3  1          0.6               1.00       150      2.114298
##   0.3  1          0.8               0.50        50      2.128458
##   0.3  1          0.8               0.50       100      2.119584
##   0.3  1          0.8               0.50       150      2.127833
##   0.3  1          0.8               0.75        50      2.118479
##   0.3  1          0.8               0.75       100      2.115907
##   0.3  1          0.8               0.75       150      2.119562
##   0.3  1          0.8               1.00        50      2.123609
##   0.3  1          0.8               1.00       100      2.114199
##   0.3  1          0.8               1.00       150      2.115347
##   0.3  2          0.6               0.50        50      2.086392
##   0.3  2          0.6               0.50       100      2.089459
##   0.3  2          0.6               0.50       150      2.116332
##   0.3  2          0.6               0.75        50      2.053382
##   0.3  2          0.6               0.75       100      2.049950
##   0.3  2          0.6               0.75       150      2.080468
##   0.3  2          0.6               1.00        50      2.088499
##   0.3  2          0.6               1.00       100      2.076554
##   0.3  2          0.6               1.00       150      2.078453
##   0.3  2          0.8               0.50        50      2.102577
##   0.3  2          0.8               0.50       100      2.119313
##   0.3  2          0.8               0.50       150      2.141201
##   0.3  2          0.8               0.75        50      2.067068
##   0.3  2          0.8               0.75       100      2.093483
##   0.3  2          0.8               0.75       150      2.105354
##   0.3  2          0.8               1.00        50      2.080139
##   0.3  2          0.8               1.00       100      2.072159
##   0.3  2          0.8               1.00       150      2.085904
##   0.3  3          0.6               0.50        50      2.114923
##   0.3  3          0.6               0.50       100      2.170928
##   0.3  3          0.6               0.50       150      2.227976
##   0.3  3          0.6               0.75        50      2.077639
##   0.3  3          0.6               0.75       100      2.098733
##   0.3  3          0.6               0.75       150      2.135842
##   0.3  3          0.6               1.00        50      2.051472
##   0.3  3          0.6               1.00       100      2.067006
##   0.3  3          0.6               1.00       150      2.098016
##   0.3  3          0.8               0.50        50      2.123376
##   0.3  3          0.8               0.50       100      2.159789
##   0.3  3          0.8               0.50       150      2.199735
##   0.3  3          0.8               0.75        50      2.061760
##   0.3  3          0.8               0.75       100      2.105666
##   0.3  3          0.8               0.75       150      2.145536
##   0.3  3          0.8               1.00        50      2.047071
##   0.3  3          0.8               1.00       100      2.048169
##   0.3  3          0.8               1.00       150      2.072030
##   0.4  1          0.6               0.50        50      2.140278
##   0.4  1          0.6               0.50       100      2.142372
##   0.4  1          0.6               0.50       150      2.145911
##   0.4  1          0.6               0.75        50      2.130558
##   0.4  1          0.6               0.75       100      2.122626
##   0.4  1          0.6               0.75       150      2.126641
##   0.4  1          0.6               1.00        50      2.126049
##   0.4  1          0.6               1.00       100      2.120738
##   0.4  1          0.6               1.00       150      2.123499
##   0.4  1          0.8               0.50        50      2.134348
##   0.4  1          0.8               0.50       100      2.143286
##   0.4  1          0.8               0.50       150      2.147857
##   0.4  1          0.8               0.75        50      2.121564
##   0.4  1          0.8               0.75       100      2.117420
##   0.4  1          0.8               0.75       150      2.123158
##   0.4  1          0.8               1.00        50      2.126103
##   0.4  1          0.8               1.00       100      2.119077
##   0.4  1          0.8               1.00       150      2.119976
##   0.4  2          0.6               0.50        50      2.102010
##   0.4  2          0.6               0.50       100      2.135322
##   0.4  2          0.6               0.50       150      2.152640
##   0.4  2          0.6               0.75        50      2.097457
##   0.4  2          0.6               0.75       100      2.114720
##   0.4  2          0.6               0.75       150      2.146980
##   0.4  2          0.6               1.00        50      2.069699
##   0.4  2          0.6               1.00       100      2.059995
##   0.4  2          0.6               1.00       150      2.068351
##   0.4  2          0.8               0.50        50      2.142864
##   0.4  2          0.8               0.50       100      2.149480
##   0.4  2          0.8               0.50       150      2.167803
##   0.4  2          0.8               0.75        50      2.097038
##   0.4  2          0.8               0.75       100      2.102903
##   0.4  2          0.8               0.75       150      2.115095
##   0.4  2          0.8               1.00        50      2.069134
##   0.4  2          0.8               1.00       100      2.080925
##   0.4  2          0.8               1.00       150      2.097170
##   0.4  3          0.6               0.50        50      2.127731
##   0.4  3          0.6               0.50       100      2.194311
##   0.4  3          0.6               0.50       150      2.243840
##   0.4  3          0.6               0.75        50      2.136343
##   0.4  3          0.6               0.75       100      2.175959
##   0.4  3          0.6               0.75       150      2.206702
##   0.4  3          0.6               1.00        50      2.068139
##   0.4  3          0.6               1.00       100      2.116118
##   0.4  3          0.6               1.00       150      2.142831
##   0.4  3          0.8               0.50        50      2.184114
##   0.4  3          0.8               0.50       100      2.232026
##   0.4  3          0.8               0.50       150      2.311248
##   0.4  3          0.8               0.75        50      2.150620
##   0.4  3          0.8               0.75       100      2.197271
##   0.4  3          0.8               0.75       150      2.238764
##   0.4  3          0.8               1.00        50      2.044353
##   0.4  3          0.8               1.00       100      2.072292
##   0.4  3          0.8               1.00       150      2.103356
##   Rsquared   MAE     
##   0.4545530  1.445798
##   0.4564648  1.449233
##   0.4572496  1.449883
##   0.4597915  1.439996
##   0.4622217  1.442299
##   0.4609773  1.444937
##   0.4606378  1.431585
##   0.4658091  1.426182
##   0.4656016  1.428375
##   0.4589042  1.440428
##   0.4638957  1.439091
##   0.4597608  1.448153
##   0.4638705  1.428711
##   0.4645708  1.429908
##   0.4638659  1.432089
##   0.4615880  1.427621
##   0.4658928  1.425743
##   0.4651921  1.428041
##   0.4808885  1.408753
##   0.4814012  1.421536
##   0.4704444  1.440067
##   0.4960888  1.382649
##   0.4981286  1.384326
##   0.4849789  1.398570
##   0.4786049  1.392483
##   0.4851990  1.387884
##   0.4854458  1.395772
##   0.4733164  1.395645
##   0.4671641  1.422410
##   0.4597741  1.432010
##   0.4894359  1.388603
##   0.4778137  1.399846
##   0.4742000  1.406791
##   0.4827431  1.395010
##   0.4874156  1.397724
##   0.4816432  1.406501
##   0.4680074  1.414113
##   0.4477197  1.445415
##   0.4270781  1.481424
##   0.4870750  1.401020
##   0.4788513  1.415875
##   0.4638763  1.438241
##   0.4977744  1.374637
##   0.4923773  1.390373
##   0.4802493  1.411837
##   0.4663615  1.425940
##   0.4548413  1.455388
##   0.4416307  1.483815
##   0.4934565  1.384901
##   0.4769210  1.421067
##   0.4612989  1.450523
##   0.4993936  1.376810
##   0.4995611  1.377689
##   0.4903675  1.392822
##   0.4528712  1.453887
##   0.4525595  1.461424
##   0.4519374  1.467959
##   0.4579990  1.449253
##   0.4616891  1.447654
##   0.4605223  1.453076
##   0.4600214  1.433417
##   0.4628381  1.432354
##   0.4616053  1.435465
##   0.4558705  1.456752
##   0.4522425  1.466326
##   0.4509905  1.468595
##   0.4621559  1.439210
##   0.4640855  1.435974
##   0.4622564  1.441784
##   0.4597962  1.436183
##   0.4637600  1.431524
##   0.4631708  1.435751
##   0.4744549  1.425679
##   0.4627453  1.447657
##   0.4565259  1.447899
##   0.4755649  1.413986
##   0.4697657  1.426789
##   0.4569459  1.457281
##   0.4882818  1.397217
##   0.4937337  1.394055
##   0.4911047  1.396209
##   0.4571282  1.438623
##   0.4584940  1.457679
##   0.4536331  1.475774
##   0.4765468  1.413100
##   0.4758664  1.414009
##   0.4719231  1.427083
##   0.4890315  1.391478
##   0.4842830  1.403011
##   0.4772540  1.414988
##   0.4688216  1.442596
##   0.4465162  1.481182
##   0.4324079  1.523185
##   0.4600306  1.427067
##   0.4474749  1.463336
##   0.4365471  1.494077
##   0.4902382  1.400037
##   0.4728705  1.434013
##   0.4645544  1.460580
##   0.4449535  1.466976
##   0.4311753  1.503762
##   0.4050572  1.563547
##   0.4552410  1.434759
##   0.4404553  1.464213
##   0.4288417  1.506267
##   0.5021597  1.376100
##   0.4924971  1.395456
##   0.4812557  1.421995
## 
## Tuning parameter 'gamma' was held constant at a value of 0
## 
## Tuning parameter 'min_child_weight' was held constant at a value of 1
## RMSE was used to select the optimal model using the smallest value.
## The final values used for the model were nrounds = 50, max_depth = 3,
##  eta = 0.4, gamma = 0, colsample_bytree = 0.8, min_child_weight = 1
##  and subsample = 1.
predictions <- model %>% predict(test)
rmse(predictions, test$revenue)
## [1] 2.179394

Conclusão:

Por fim, após aplicar 4 modelos para realizar as previsões desejadas pelo problema proposto no Kaggle, concluimos que o Extreme Gradient Boosting gerou o melhor resultado, retornando um EQM de 2.179394.