Seiring berkembangnya E-Sport saat ini, baik di Indonesia maupun Internasional, analisis terkait E-Sport menjadi hal yang menarik untuk dieksplorasi. Banyak jenis dari E-Sport, salah satunya adalah game PlayerUnknown’s Battlegrounds (PUBG)– berdasarkan wikipedia, PUBG merupakan sebuah game populer yang telah diunduh sebanyak lebih dari 200 juta kali sejak peluncurannya pada tahun 2017. Sejak peluncurannya, tercatat dalam 4 bulan, sudah ada lebih dari 100 juta pengguna yang telah mendaftar di game ini. Tak aneh jika games ini menjadi nominasi dalam Best Mobil Game di The Game Awards 2018. PUBG merupakan online game yang dikembangkan dan dirilis oleh perusahaan PUBG–sebuah anak perusahaan video game bernama Bluehole yang berpusat di Korea Selatan. PUBG merupakan sebuah game tentang bagaimana cara bertahan, artinya pemain yang paling agresif akan menang, namun hal ini bukanlah kasus yang sering terjadi.
Dalam Analisis ini, akan disajikan beberapa visualisasi terkait faktor-faktor yang mempengaruhi pemilihan strategi dalam permainan ini berdasarkan dataset yang didapat dari Kaggle, antara lain senjata apa saja yang paling banyak berhasil membunuh musuh, daerah mana saja di peta erangel maupun miramar yang paling banyak memakan korban, dll.
Adapun analisis ini dilakukan dengan bahasa pemrograman R.
library(dplyr) #untuk memanipulasi data
library(magrittr) #untuk manipulasi data dengan rapih
library(ggplot2) #untuk membuat visualisasi
library(ggrepel) #untuk menambahkan teks pada grafik
library(data.table)
library(jpeg) #untuk membaca gambar dalam format jpeg
library(png) #untuk membaca gambar dalam format png
library(grid)
library(leaflet) #untuk membuat heatmap
library(RWordPress) #untuk upload Rmd ke Wordpress
library(knitr)
library(XMLRPC)Dari 5 data yang disediakan, analisis ini menggunakan data kill_match_stats_final_0.csv.
## killed_by killer_name killer_placement killer_position_x
## 1: Grenade KrazyPortuguese 5 657725.10
## 2: SCAR-L nide2Bxiaojiejie 31 93091.37
## 3: S686 Ascholes 43 366921.40
## 4: Down and Out Weirdo7777 9 472014.20
## 5: M416 Solayuki1 9 473357.80
## 6: Punch xuezhiqian717 26 721944.40
## killer_position_y map
## 1: 146275.2 MIRAMAR
## 2: 722236.4 MIRAMAR
## 3: 421623.9 MIRAMAR
## 4: 313274.8 MIRAMAR
## 5: 318340.5 MIRAMAR
## 6: 359575.3 MIRAMAR
## match_id time
## 1: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 823
## 2: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 194
## 3: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 103
## 4: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 1018
## 5: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 1018
## 6: 2U4GBNA0YmnLSqvEycnTjo-KT000vfUnhSA2vfVhVPe1QBwCTNTBJ5B_1Ocel6nY 123
## victim_name victim_placement victim_position_x victim_position_y
## 1: KrazyPortuguese 5 657725.10 146275.2
## 2: X3evolution 33 92238.68 723375.1
## 3: CtrlZee 46 367304.50 421216.1
## 4: BlackDpre 13 476645.90 316758.4
## 5: Vjolt 13 473588.50 318418.8
## 6: PurplePenguin9 47 0.00 0.0
Pada tahap ini, kami memilih beberapa atribut, yaitu:
killer_name : Nama pemain yang berhasil membunuh musuh
killed_by : Senjata yang digunakan untuk membunuh musuh
killer_position_x : Koordinat x dari pemain yang berhasil membunuh
killer_position_y : Koordinat y dari pemain yang berhasil membunuh
victim_position_x : Koordinat x dari korban
victim_position_y : Koordinat y dari korban
map : Peta yang digunakan
Tujuh atribut ini kami pilih karena dapat memberikan informasi mengenai pemilihan senjata yang efektif untuk membunuh musuh dalam games PUBG ini.
pubg %<>%
select(killer_name, killed_by, killer_position_x, killer_position_y, victim_position_x, victim_position_y, map)
getwd()## [1] "D:/PUBG_Baru"
Untuk melihat apakah terdapat missing value pada dataset, digunakan fungsi colSums(is.na()).
## killer_name killed_by killer_position_x killer_position_y
## 928630 0 928630 928630
## victim_position_x victim_position_y map
## 0 0 162729
Dari cuplikan di atas dapat dilihat bahwa jumlah missing value pada atribut killer_name, killer_position_x, dan killer_position_y memiliki jumlah yang sama. Hal ini cukup mencurigakan. Sehingga, kami memeriksa data-data yang mengandung NA untuk mendapatkan informasi lebih jauh.
## killer_name killed_by killer_position_x killer_position_y
## 1 <NA> Bluezone NA NA
## 2 <NA> Bluezone NA NA
## 3 <NA> Down and Out NA NA
## 4 <NA> Falling NA NA
## 5 <NA> Down and Out NA NA
## 6 <NA> Bluezone NA NA
## victim_position_x victim_position_y map
## 1 0.0 0.0 MIRAMAR
## 2 0.0 0.0 MIRAMAR
## 3 0.0 0.0 MIRAMAR
## 4 308988.8 397375.0 MIRAMAR
## 5 475198.1 426731.2 ERANGEL
## 6 468805.0 430984.8 ERANGEL
Dari cuplikan data di atas didapatkan bahwa atribut killer_name, killer_position_x, dan killer_position_y yang mengandung NA (missing value), merupakan data-data yang memiliki data dari atribut killed_by yakni Bluezone, Falling, Down and Out, etc. Untuk itu, kami menginvestigasinya lebih lanjut apa saja yang menyebabkan data tidak memiliki killer_name.
## killed_by
## 1 Bluezone
## 3 Down and Out
## 4 Falling
## 56 Drown
## 74 RedZone
## 92 Uaz
## 164 Punch
## 297 Buggy
## 442 Dacia
## 938 Hit by Car
## 1039 Motorbike (SideCar)
## 1043 Motorbike
## 1826 Pickup Truck
## 2932 Grenade
## 4578 death.RedZoneBomb_C
## 9628 death.Buff_FireDOT_C
## 16259 Boat
## 19430 death.ProjMolotov_DamageField_C
## 29622 Van
## 444529 SCAR-L
## 555541 Aquarail
## 872416 S686
Dapat dilihat dari macam-macam data dari killed_by dengan killer_name = NA, terdapat Bluezone, Down and Out, Falling, etc yang menjadi penyebab seorang pemain gugur dari permainan. Sehingga, dapat diambil kesimpulan bahwa yang memiliki killer_name = NA merupakan pemain yang gugur karena bunuh diri maupun mati seketika.
pubgmir <- pubg %>%
filter(map == "MIRAMAR" & !is.na(killer_name)) %>%
select (victim_position_x, victim_position_y, killer_position_x, killer_position_y, killer_name, killed_by)
pubger <- pubg %>%
filter(map == "ERANGEL" & !is.na(killer_name)) %>%
select (victim_position_x, victim_position_y, killer_position_x, killer_position_y, killer_name, killed_by)Dalam atribut “killed_by” terdapat beberapa alasan seorang korban terbunuh, dari 50 alasan seorang korban terbunuh, karena pada Rmd ini kami akan menganalisis jenis-jenis senjata yang terdapat dalam game PUBG, maka jenis-jenis senjata tersebut dikelompokkan dalam obyek weapon. Data yang akan digunakan pun akan difilter hanya yang mengandung jenis-jenis senjata dalam obyek weapon.
#Weapon glossary
weapon <- c("AKM", "AUG", "Grenade","M16A4", "M249", "Machete", "Mini 14", "P18C", "P92", "R45", "S12K", "S686", "Sickle", "Tommy Gun", "VSS", "AWM", "Crowbar", "Groza", "Kar98K", "M24", "M416", "Micro UZI", "Mk14", "P1911", "Pan", "S1897", "SCAR-L", "SKS", "UMP9", "Vector", "Win94", "Crossbow")
pubgmir %<>%
filter(killed_by %in% weapon) %>%
mutate(killed_by = as.factor(killed_by),
pos_x = victim_position_x*1000/800000,
pos_y = victim_position_y*1000/800000)
head(pubgmir)## victim_position_x victim_position_y killer_position_x killer_position_y
## 1 657725.10 146275.2 657725.10 146275.2
## 2 92238.68 723375.1 93091.37 722236.4
## 3 367304.50 421216.1 366921.40 421623.9
## 4 473588.50 318418.8 473357.80 318340.5
## 5 372808.30 297124.2 376333.80 317858.9
## 6 373125.80 433608.8 373125.30 433540.6
## killer_name killed_by pos_x pos_y
## 1 KrazyPortuguese Grenade 822.1564 182.8440
## 2 nide2Bxiaojiejie SCAR-L 115.2983 904.2189
## 3 Ascholes S686 459.1306 526.5201
## 4 Solayuki1 M416 591.9856 398.0235
## 5 pdfjkkvjk AKM 466.0104 371.4053
## 6 xiaogao13 S686 466.4072 542.0110
pubger %<>%
filter(killed_by %in% weapon) %>%
mutate(killed_by = as.factor(killed_by),
pos_x = victim_position_x*1000/800000,
pos_y = victim_position_y*1000/800000)
head(pubger)## victim_position_x victim_position_y killer_position_x killer_position_y
## 1 497819.4 331981.3 496989.8 312569.7
## 2 459817.9 414426.3 460416.7 414748.8
## 3 487444.2 347651.0 488034.1 347220.3
## 4 493043.4 434458.1 501062.9 425078.6
## 5 495755.7 438322.0 495501.2 429826.2
## 6 509867.3 437920.8 512029.6 450259.2
## killer_name killed_by pos_x pos_y
## 1 Malcolm_x M16A4 622.2743 414.9766
## 2 G_Berg AKM 574.7724 518.0329
## 3 Lukesnake17 AKM 609.3053 434.5638
## 4 AlooGobi SKS 616.3043 543.0726
## 5 Powfa M416 619.6946 547.9025
## 6 DevilBlood35 M416 637.3341 547.4010
options(scipen = 999)
p <- ggplot(kel1, aes(x = reorder(killed_by, -n), y = n)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = scales::comma(n), angle = 90), hjust = -0.1, size = 3) +
xlab("Jenis Senjata") +
ylab("Jumlah Korban") +
theme_classic() +
scale_y_discrete(expand = expand_scale(mult = c(0.01, 0.25)), labels = scales::comma) +
labs(title = "Jumlah Korban berdasarkan Jenis Senjata yang digunakan pada Peta Miramar") +
theme(axis.line = element_blank(),
axis.ticks= element_blank(),
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.2),
panel.grid.major.y = element_line(size = 1)
)
pDari visualisasi di atas, didapat bahwa M416, SCAR-L, dan M16A4 merupakan jenis senjata yang paling efektif membunuh korban dengan jumlah korban lebih dari 200.000. Sedangkan, Machete, Sickle, dan Crowbar merupakan senjata-senjata yang kurang efektif karena hanya berhasil membunuh sedikit pemain. Untuk keefektifan senjatanya, akan dianalisis pada Analisis Klatestering di bawah.
options(scipen = 999)
p1 <- ggplot(kel2, aes(x = reorder(killed_by, -n), y = n)) +
geom_col(fill = "steelblue") +
geom_text(aes(label = scales::comma(n), angle = 90), hjust = -0.1, size = 3) +
xlab("Jenis Senjata") +
ylab("Jumlah Korban") +
theme_classic()+
theme(axis.line = element_blank(),
axis.ticks= element_blank(),
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 1)) +
labs(title = "Jumlah Korban berdasarkan Jenis Senjata yang digunakan pada Peta Erangel") +
scale_y_discrete(expand = expand_scale(mult = c(0.01, 0.25)), labels = scales::comma)
p1Sama seperti peta miramar, di erangel pun M416, M16A4, dan SCAR-L pun menjadi senjata yang paling efektif untuk membunuh musuh. Hal ini dapat dilihat dari jumlah korban yang dihasilkan oleh ketiga senjata tersebut merupakan 3 terbanyak.
img <- readJPEG("miramar.jpeg")
h1 <- ggplot(pubgmir, aes(x = pos_x, y = pos_y)) +
annotation_custom(rasterGrob(img, width=unit(1,"npc"),
height=unit(1,"npc")),
-Inf, Inf, -Inf, Inf) +
stat_bin2d(alpha = 0.4, bins = 120) +
scale_x_continuous(expand = c(0,0)) +
scale_y_reverse(expand = c(0,0)) +
scale_fill_gradient(low = "yellow", high = "red", name = "log 10 dari Jumlah Korban"
,labels = scales::comma, trans = "log10"
) +
labs(title="Analisis titik jatuhnya korban peta miramar", caption="sumber: https://www.kaggle.com/skihikingkevin",x="Posisi x korban",y="Posisi y korban")
h1Berdasarkan gambar di atas, dapat dilihat bahwa semakin banyak korban berjatuhan di titik tertentu ditunjukkan dengan warna yang semakin kemerahan. Berdasarkan peta miramar, banya korban berjatuhan di tengah. Hal ini dikarenakan lingkaran akan semakin mengecil dan mengarah ke tengah, sehingga semakin lama, pemain akan menuju ke arah tengah, sehingga banyak pemain gugur di area tengah peta. Sedangkan pemain banyak gugur di daerah power grid dan dekat San Martin.
img <- readJPEG("erangel.jpg")
h <- ggplot(pubger, aes(x = pos_x, y = pos_y)) +
annotation_custom(rasterGrob(img, width=unit(1,"npc"), height=unit(1,"npc")),
-Inf, Inf, -Inf, Inf) +
stat_bin2d(alpha = 0.4, bins = 100) +
scale_x_continuous(expand = c(0,0)) +
scale_y_reverse(expand = c(0,0)) +
scale_fill_gradient(low = "yellow", high = "red", name = "log 10 dari Jumlah Korban", labels = scales::comma, trans = "log10") +
labs(title="Analisis titik jatuhnya korban peta erangel", caption="sumber: https://www.kaggle.com/skihikingkevin",
x="Posisi x korban",y= "Posisi y korban")
hBerdasarkan peta Erangel di atas, dapat terlihat bahwa berdasarkan dataset yang digunakan, korban banyak berguguran di sekitar jalur penghubung antar pulau.
Pengklasteran merupakan sebuah kegiatan dalam mengelompokkan data (atau membuat subkelompok) dalam suatu dataset - dan kelompok yang dihasilkan biasanya disebut klaster. Tujuannya adalah untuk memiliki sejumlah partisi di mana pengamatan yang jatuh ke masing-masing partisi mirip dengan data yang lain dalam kelompok itu, sedangkan partisi berbeda satu sama lain.
Pada analisis ini, algoritme pengklasteran yang digunakan adalah K-means. K-means adalah algoritma pengelompokan berbasis centroid (menemukan titik pusat) yang mengikuti prosedur sederhana untuk mengklasifikasikan dataset yang diberikan ke dalam jumlah klaster yang ditentukan sebelumnya, dilambangkan sebagai “k”. Prosedur ini pada dasarnya adalah serangkaian interaksi di mana kita: 1. Temukan pusat klaster 2. Hitung jarak antara setiap titik ke setiap pusat klaster 3. Tetapkan / tetapkan kembali keanggotaan klaster
## n rerata
## AKM 199808 14155.185
## AUG 6562 8491.865
## AWM 5621 18580.762
## Crossbow 2819 49251.581
## Crowbar 744 84993.434
## Grenade 45940 23321.444
## n rerata
## 1 -0.3485618 -0.2969558
## 2 2.0526226 -0.5963066
## 3 -0.6486886 2.3786401
## [1] 2
## n rerata
## 1 -0.7046332 2.2980347
## 2 1.9623285 -0.5551989
## 3 -0.3496555 -0.3208072
## [1] 2
wss <- function(data, maxCluster = 9) {
# Initialize within sum of squares
SSw <- (nrow(data) - 1) * sum(apply(data, 2, var))
SSw <- vector()
for (i in 2:maxCluster) {
SSw[i] <- sum(kmeans(data, centers = i)$withinss)
}
plot(1:maxCluster, SSw, type = "o",
xlab = "Jumlah Klaster",
ylab = "Jumlah Kuadrat Error",
pch=19)
}
wss(mir_scale)Plot di atas merupakan elbow plot untuk menentukan jumlah klaster yang optimal. Klaster yang optimal berdasarkan metode elbow ini terletak pada elbow (sikunya). Berdasarkan plot di atas, jumlah klaster optimal adalah 3. Semakin banyak jumlah klaster mungkin akan memperkecil eror, namun semakin banyak jumlah klaster tidak terlalu baik secara waktu komputasi. Sehingga, dipilih jumlah klasternya 3.
wss <- function(data, maxCluster = 9) {
# Initialize within sum of squares
SSw <- (nrow(data) - 1) * sum(apply(data, 2, var))
SSw <- vector()
for (i in 2:maxCluster) {
SSw[i] <- sum(kmeans(data, centers = i)$withinss)
}
plot(1:maxCluster, SSw, type = "o",
xlab = "Jumlah Klaster",
ylab = "Jumlah Kuadrat Error",
pch=19)
}
wss(er_scale)Sedangkan untuk peta Erangel, berdasarkan plot di atas, jumlah klaster optimal juga 3. ## Klaster pada peta Miramar
scar <- readPNG("weapon/SCAR-L.png")
m416 <- readPNG("weapon/M416.png")
m16a4 <- readPNG("weapon/M16A4.png")
labelpoint <- c("M16A4", "M249","P92", "R45","S686", "Tommy Gun", "VSS", "Kar98K", "M24", "M416", "Mk14", "P1911", "S1897", "SCAR-L", "SKS", "UMP9", "Win94", "Crossbow")
a <- ggplot(mirgab1, aes(x = n,y = rerata)) + geom_point(col = mirgab1$clus)+
scale_x_continuous()+
scale_y_continuous()+theme_bw()+
geom_text_repel(data = subset(mirgab1, weapon %in% labelpoint), aes(label = weapon), color = "grey20", hjust = 1, vjust = 0.5)+
xlab("Jumlah Pengguna")+ ylab("Rata-rata jarak")+ labs (title = "Analisis Jarak Efektif Senjata pada peta Miramar PUBG") + theme_classic()
a1 <- a + annotation_custom(rasterGrob(scar, width=unit(1,"npc"), height=unit(1,"npc")),
240000, 270000, 14000, 22000) +
annotation_custom(rasterGrob(m416, width=unit(1,"npc"), height=unit(1,"npc")),
290000, 320000, 16000, 24000) +
annotation_custom(rasterGrob(m16a4, width=unit(1,"npc"), height=unit(1,"npc")),
200000, 230000, 17000, 25000)
a1Plot di atas merupakan analisis rata-rata jarak (dalam meter) efektif sebuah senjata dalam membunuh musuh terhadap jumlah penggunanya pada peta Miramar.Terdapat 3 klaster di atas, yakni klaster hijau menunjukkan senjata-senjata dengan jarak efektif terjauh namun peminatnya sedikit, klaster hitam merupakan senjata-senjata yang efektif membunuh dalam jarak dekat dengan jumlah pengguna sedikit-sedang, dan klaster merah menunjukkan senjata-senjata yang efektif dalam jarak dekat (< 100000 meter) dan memiliki banyak peminat. Dapat dilihat bahwa M416,SCAR-L, dan M16A4 sangat populer untuk digunakan di peta Miramar.
b <- ggplot(ergab1, aes(x = n,y = rerata)) + geom_point(col = ergab1$clus)+
scale_x_continuous()+
scale_y_continuous()+theme_bw()+
geom_text_repel(data = subset(ergab1, weapon %in% labelpoint), aes(label = weapon), color = "grey20", hjust = 1, vjust = 0.5)+
xlab("Jumlah Pengguna")+ ylab("Rata-rata jarak")+ labs (title = "Analisis Jarak Efektif Senjata pada peta Erangel PUBG") + theme_classic()
b1 <- b + annotation_custom(rasterGrob(scar, width=unit(1,"npc"), height=unit(1,"npc")),
810000, 910000, 5000, 13000) +
annotation_custom(rasterGrob(m416, width=unit(1,"npc"), height=unit(1,"npc")),
1135000, 1235000, 17000, 25000) +
annotation_custom(rasterGrob(m16a4, width=unit(1,"npc"), height=unit(1,"npc")),
950000, 1050000, 21000, 29000)
b1Klaster di atas terbagi atas 3, yakni klaster hitam merupakan klaster dengan senjata yang efektif digunakan untuk jarak jauh, namun sangat sedikit pemain yang menggunakannya. Selain itu, klaster hijau merupakan klaster dengan pengguna sedikit yang mana penggunaannya untuk membunuh musuh dalam jarak dekat. Terakhir, klater merah merupakan klater yang paling banyak digunakan oleh para pemain PUBG, senjata - senjata tersebut efektif digunakan untuk jarak dekat.
ERANGEL Daerah jatuhnya korban pada peta Erangel menyebar di seluruh daratan. Namun, banyak pemain memperjuangkan final circle, dapat dilihat dari tingginya jumlah korban di sekitar daerah pochinski. Sedangkan, SCAR-L, M16A4, dan M416 merupakan senjata-senjata yang paling efektif dalam membunuh musuh, sehingga banyak digunakan oleh para PUBGers.
MIRAMAR Pada peta Miramar, daerah jatuhnya korban tidak merata pada seluruh daratan. Pada peta ini, titik jatuhnya korban terfokus pada daratan yang terletak di tengah. Untuk senjata yang paling efektif dalam membunuh musuh, SCAR-L, M16A4, dan M416 tetap menjadi senjata yang banyak membunuh musuh.