Video Game pada konsol saat ini masih menjadi pilihan sebagai hiburan selain Smartphone atau PC. Hal itu dikarenakan adanya sensasi yang berbeda saat bermain game konsol. Dikabarkan juga akan beredar konsol baru berupa Xbox series X/S dan juga PS5, maka sebagai developer harus melakukan analisis terhadap data yang telah dikumpulkan dan memberikan solusi untuk mengembangkan sebuah game.
Dalam penelitan ini akan menganalisa data penjualan video game dengan menggunakan decision tree dan memprediksi penjualan untuk membuat keputusan tertentu sebagai pihak developer game yang baru ataupun sudah berada di dalam pasar game.
Data diperoleh dari Kaggle dan juga dari vgchart
library(knitr)
library(dplyr)
library(tidyr)
library(tidyverse)
library(ggplot2)
library(e1071)
library(tree)
library(MASS)
library(readr)
library(forecast)
library(corrgram)
library(corrplot)
library(ggcorrplot)
library(plotly)
library(gridExtra)
library(grid)
library(kableExtra)
library(cowplot)
library(formattable)
library(gridExtra)
library(RColorBrewer)
library(scales)
library(tidyverse)
library(dplyr)
library(GGally)
library(lubridate)
library(grid)
library(MLmetrics)
library(caTools)
library(scales)
library(nortest)
library(knitr)
library(funModeling)
library(Hmisc)
library(ROCR)
library(rsample) # Initial Split
library(rpart) # Decision Tree
library(rpart.plot) # Decision Tree
library(partykit)
library(magrittr)
library(party)
library(mboost)
library(psych)## Rank Name Platform Year Genre Publisher NA_Sales
## 1 1 Wii Sports Wii 2006 Sports Nintendo 41.49
## 2 2 Super Mario Bros. NES 1985 Platform Nintendo 29.08
## 3 3 Mario Kart Wii Wii 2008 Racing Nintendo 15.85
## 4 4 Wii Sports Resort Wii 2009 Sports Nintendo 15.75
## 5 5 Pokemon Red/Pokemon Blue GB 1996 Role-Playing Nintendo 11.27
## 6 6 Tetris GB 1989 Puzzle Nintendo 23.20
## EU_Sales JP_Sales Other_Sales Global_Sales
## 1 29.02 3.77 8.46 82.74
## 2 3.58 6.81 0.77 40.24
## 3 12.88 3.79 3.31 35.82
## 4 11.01 3.28 2.96 33.00
## 5 8.89 10.22 1.00 31.37
## 6 2.26 4.22 0.58 30.26
Dataset Video Game Sales:
## 'data.frame': 16598 obs. of 11 variables:
## $ Rank : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Name : chr "Wii Sports" "Super Mario Bros." "Mario Kart Wii" "Wii Sports Resort" ...
## $ Platform : chr "Wii" "NES" "Wii" "Wii" ...
## $ Year : chr "2006" "1985" "2008" "2009" ...
## $ Genre : chr "Sports" "Platform" "Racing" "Sports" ...
## $ Publisher : chr "Nintendo" "Nintendo" "Nintendo" "Nintendo" ...
## $ NA_Sales : num 41.5 29.1 15.8 15.8 11.3 ...
## $ EU_Sales : num 29.02 3.58 12.88 11.01 8.89 ...
## $ JP_Sales : num 3.77 6.81 3.79 3.28 10.22 ...
## $ Other_Sales : num 8.46 0.77 3.31 2.96 1 0.58 2.9 2.85 2.26 0.47 ...
## $ Global_Sales: num 82.7 40.2 35.8 33 31.4 ...
# Restucture the data
attach(vgsales)
vgsales$Name <- as.factor(as.character(vgsales$Name))
vgsales$Platform <- as.factor(as.character(vgsales$Platform))
vgsales$Year <- as.numeric(as.character(vgsales$Year))## Warning: NAs introduced by coercion
vgsales$Genre <- as.factor(as.character(vgsales$Genre))
vgsales$Publisher <- as.factor(as.character(vgsales$Publisher))
max(vgsales$Year, na.rm = T)## [1] 2020
## jumlah.seluruh.data jumlah.data.unik
## 1 16598 16598
Tidak ada data duplikat pada dataset tersebut.
num_Sales <- vgsales[,c("NA_Sales","EU_Sales","JP_Sales","Other_Sales","Global_Sales")]
ggcorr(num_Sales,label = T, size=5, label_size = 5, hjust=0.95)+
labs(
title="Korelasi"
)+
theme_minimal()+
theme(
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=3,face="bold"),
axis.text.y=element_blank()
)Dari hasil korelasi diatas, dapat dilihat sebagian besar penjualan global dipengaruhi dari Amerika Utara dan Eropa. Maka sebagai developer, dapat menargetkan pasar yang berada di Amerika Utara dan Eropa sesuai dengan Genre yang sedang trending dan paling laku.
## Rank Name Platform
## Min. : 1 Need for Speed: Most Wanted: 12 DS :2163
## 1st Qu.: 4151 FIFA 14 : 9 PS2 :2161
## Median : 8300 LEGO Marvel Super Heroes : 9 PS3 :1329
## Mean : 8301 Madden NFL 07 : 9 Wii :1325
## 3rd Qu.:12450 Ratatouille : 9 X360 :1265
## Max. :16600 Angry Birds Star Wars : 8 PSP :1213
## (Other) :16542 (Other):7142
## Year Genre Publisher
## Min. :1980 Action :3316 Electronic Arts : 1351
## 1st Qu.:2003 Sports :2346 Activision : 975
## Median :2007 Misc :1739 Namco Bandai Games : 932
## Mean :2006 Role-Playing:1488 Ubisoft : 921
## 3rd Qu.:2010 Shooter :1310 Konami Digital Entertainment: 832
## Max. :2020 Adventure :1286 THQ : 715
## NA's :271 (Other) :5113 (Other) :10872
## NA_Sales EU_Sales JP_Sales Other_Sales
## Min. : 0.0000 Min. : 0.0000 Min. : 0.00000 Min. : 0.00000
## 1st Qu.: 0.0000 1st Qu.: 0.0000 1st Qu.: 0.00000 1st Qu.: 0.00000
## Median : 0.0800 Median : 0.0200 Median : 0.00000 Median : 0.01000
## Mean : 0.2647 Mean : 0.1467 Mean : 0.07778 Mean : 0.04806
## 3rd Qu.: 0.2400 3rd Qu.: 0.1100 3rd Qu.: 0.04000 3rd Qu.: 0.04000
## Max. :41.4900 Max. :29.0200 Max. :10.22000 Max. :10.57000
##
## Global_Sales
## Min. : 0.0100
## 1st Qu.: 0.0600
## Median : 0.1700
## Mean : 0.5374
## 3rd Qu.: 0.4700
## Max. :82.7400
##
Kesimpulan diatas masih kurang detail dalam tiap kategorinya, maka akan ditunjukkan dengan beberapa visualisasi.
# Histogram of frequency of the game by year
hist(vgsales$Year,col = "darkred", xlab = "Year", ylab = "Frequency of the game", main = "Frekuensi Game Tiap Tahun")Game yang maksimum terdapat pada tahun 2008 dan 2009. Ini dapat dikarenakan oleh munculnya konsol baru dan game dari publisher maupun developer terkenal.
#Histogram of Global sales of the game by year
aggregate_revenue <- aggregate(Global_Sales~Year, vgsales, sum)
plot(aggregate_revenue,
type = 'h',
xlab = "Year",
ylab = "Global Sales",
col = "darkgreen",
lwd = 8,
main = "Global Sales Tiap Tahun")Total pendapatan meningkat sampai tahun 2008 lalu menurun setelahnya. Puncak pendapatan berada pada 2008 dan 2009.
#Histogram of Global sales of the game by genre
revenue_by_Genre <- aggregate(Global_Sales~Genre, vgsales, sum)
arrange_by_Genre <- arrange(revenue_by_Genre, desc(Global_Sales))
arrange_by_Genre$Genre <- factor(arrange_by_Genre$Genre, levels = arrange_by_Genre$Genre)
Global_sales_by_genre <- ggplot(arrange_by_Genre, aes(Genre, Global_Sales, fill = Genre)) +
geom_bar(stat = "identity") +
ggtitle("Global Sales Berdasarkan Genre")
ggplotly(Global_sales_by_genre)Genre yang paling populer adalah Action, hal itu juga yang menghasilkan pendapatan tertinggi. Lalu genre Sport pada peringkat kedua, diikuti dengan Shooter, Role-Playing, Platform, Misc, Racing, Fighting, Simulation, Puzzle, Adventure, dan Strategy.
Sebagai Developer, ada baiknya untuk membuat game dengan Genre Action karena untuk saat ini paling laris.
#Histogram of top 10 Publisher by revenue
revenue_of_Publisher <- aggregate(Global_Sales~Publisher, vgsales, sum)
arrange_Revenue_of_Publisher_by_Global_Sales <- arrange(revenue_of_Publisher, desc(Global_Sales))
top_10 <- arrange_Revenue_of_Publisher_by_Global_Sales[1:10,]
#plot(factor(top_10$Publisher),top_10$Global_Sales,type='h',lwd = 8,xlab="Publisher",ylab="Global Sales",col = "red",main = "Top 10 Publishers by Revenue")
top_10_rev <- ggplot(top_10, aes(Publisher, Global_Sales, fill = Publisher)) +
geom_bar(stat = "identity") +
ggtitle("Top 10 Publisher by Revenue") +
theme(legend.position = "top")
ggplotly(top_10_rev)Nintendo merupakan publisher tertinggi diikuti dengan Electronic Arts, Activision, Sony Computer Entertainment, Ubisoft, Take-Two Interactive, THQ, Konami Digital Entertainment, Sega dan Namco Bandai Games.
Dengan begitu, sebagai developer sebaiknya mempublikasikan game dengan yang terkenal yaitu Nintendo.
# Prediction : Support Vector Machines
# Linear classification
y.train <- ifelse(vgsales.train$Global_Sales>10.0,1,-1)
dat <- data.frame(x = vgsales.train$NA_Sales + vgsales.train$EU_Sales, y = as.factor(y.train))
svmfit <- svm(y~., data=dat, kernel="linear", cost=10, scale = FALSE)
#summary(svmfit)
table(Model = svmfit$fitted, Truth = dat$y)## Truth
## Model -1 1
## -1 14176 5
## 1 6 50
## Model Error = 0.07726347 %
y.test <- ifelse(vgsales.test$Global_Sales>10.0,1,-1)
dat.te <- data.frame(x=vgsales.test$NA_Sales + vgsales.test$EU_Sales, y = as.factor(y.test))
pred.te <- predict(svmfit, newdata = dat.te)
table(Predict = pred.te, Truth = dat.te$y)## Truth
## Predict -1 1
## -1 2353 1
## 1 1 6
## Prediction Error = 0.08470987 %
SVM Linier - Error Prediksi 0.085% untuk Global Sales lebih dari 10 Juta Dolar menggunakan North American Sales dan European Sales.
# Radial classification
svmfit <- svm(y~., data = dat, kernel = "radial", cost = 10, gamma = 1)
table(Model = svmfit$fitted , Truth = dat$y)## Truth
## Model -1 1
## -1 14176 4
## 1 6 51
## Model Error = 0.07023952 %
y.test <- ifelse(vgsales.test$Global_Sales>10.0,1,-1)
dat.te <- data.frame(x = vgsales.test$NA_Sales + vgsales.test$EU_Sales, y = as.factor(y.test))
pred.te <- predict(svmfit, newdata = dat.te)
table(predict = pred.te, truth = dat.te$y)## truth
## predict -1 1
## -1 2353 1
## 1 1 6
## Prediction Error = 0.08470987 %
SVM Radial Classification - Error prediksi 0.085% untuk Global Sales lebih dari 10 Juta Dolar menggunakan North American Sales dan European Sales.
#Prediction through Decision Trees
num_fact <- vgsales[,c("NA_Sales","EU_Sales","Global_Sales")]
High <- ifelse(Global_Sales <=10.0,"No","Yes")
dat <- data.frame(num_fact,High)
dat$High <- as.factor(dat$High)
tree.dat <- tree(High~.-Global_Sales ,dat,subset=train)
summary(tree.dat)##
## Classification tree:
## tree(formula = High ~ . - Global_Sales, data = dat, subset = train)
## Number of terminal nodes: 8
## Residual mean deviance: 0.002139 = 30.43 / 14230
## Misclassification error rate: 0.0004917 = 7 / 14237
dat.test <- vgsales[!train,]
High.test <- High[!train]
tree.pred <- predict(tree.dat, dat.test, type = "class")
table(Predict = tree.pred ,Truth = High.test)## Truth
## Predict No Yes
## No 2351 1
## Yes 3 6
## Prediction Error = 0.1694197 %
#Prediction through Linear Regression
train =( Year <= 2012)
num_fact <- vgsales[,c("NA_Sales","EU_Sales","Global_Sales")]
High <- ifelse(Global_Sales <=10.0,"No","Yes")
dat <- data.frame(num_fact,High)
dat$High <- as.factor(dat$High)
glm.fit <- glm(High~.-Global_Sales, dat, subset = train, family = binomial)## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
##
## Call:
## glm(formula = High ~ . - Global_Sales, family = binomial, data = dat,
## subset = train)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.6609 -0.0042 -0.0035 -0.0033 4.0087
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -12.1855 1.5951 -7.639 2.18e-14 ***
## NA_Sales 1.3732 0.2089 6.573 4.92e-11 ***
## EU_Sales 1.7672 0.2996 5.899 3.66e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 720.977 on 14236 degrees of freedom
## Residual deviance: 62.469 on 14234 degrees of freedom
## AIC: 68.469
##
## Number of Fisher Scoring iterations: 13
## (Intercept) NA_Sales EU_Sales
## -12.185517 1.373167 1.767243
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -12.185517 1.5950837 -7.639422 2.181996e-14
## NA_Sales 1.373167 0.2088986 6.573370 4.918913e-11
## EU_Sales 1.767243 0.2995789 5.899089 3.655132e-09
dat.test <- vgsales[!train,]
High.test <- High[!train]
glm.prob <- predict(glm.fit,dat.test,type = "response")
glm.pred <-rep("No",dim(dat.test)[1])
glm.pred[glm.prob >.5]="Yes"
table(Predict=glm.pred ,Truth=High.test)## Truth
## Predict No Yes
## No 2351 1
## Yes 3 6
## Prediction Error = 0.1694197 %
#Linear Discriminant Analysis
lda.fit <- lda(High~.-Global_Sales, dat, subset = train)
summary(lda.fit)## Length Class Mode
## prior 2 -none- numeric
## counts 2 -none- numeric
## means 4 -none- numeric
## scaling 2 -none- numeric
## lev 2 -none- character
## svd 1 -none- numeric
## N 1 -none- numeric
## call 4 -none- call
## terms 3 terms call
## xlevels 0 -none- list
dat.test <- vgsales[!train,]
High.test <- High[!train]
lda.pred <- predict(lda.fit,dat.test)
names(lda.pred)## [1] "class" "posterior" "x"
## Truth
## Predict No Yes
## No 2352 1
## Yes 2 6
## Prediction Error = 0.1270648 %
Linear Regression oleh Linear Discriminant Analysis - Error prediksi 0,13% dimana Global Sales akan lebih dari 10 juta dolar, menggunakan data North American Sales dan European Sales.
Dengan pemodelan yang telah dilakukan diketahui bahwa error untuk prediksi cukup kecil untuk digunakan yang artinya cocok untuk digunakan dan sebagai developer sebaiknya memperhatikan berbagai faktor lain yang dapat berpengaruh seperti keluarnya konsol baru ataupun adanya saingan yang menawarkan game yang mirip.