Mencari Senjata Paling Ampuh di Game PUBG dengan Data Science
By Yaumil Sitta | February 20, 2019
1. Pengantar—Tentang PUBG
Sejak pertama kali diluncurkan pada bulan Desember 2017, game PlayerUnknown’s Battleground atau yang sering disebut PUBG,telah dimainkan oleh 400 juta orang di seluruh dunia. Bahkan, PUBG juga masuk ke daftar nominasi untuk kategori Best Mobile Game di ajang The Game Awards 2018.
Game ini dikembangkan dan dirilis oleh perusahaan PUBG, anak perusahaan studio game Bluehole yang berpusat di Korea Selatan. PUBG merupakan sebuah game tentang bagaimana cara bertahan dalam sebuah pertempuran.
Kebanyakan orang berpikir, pemain yang paling agresif lah yang akan menang. Tapi ternyata, dalam beberapa kasus, pemenang justru adalah orang-orang yang mampu bertahan dari serangan musuh karena kemampuan berlindung mereka.
Kami mengolah dataset yang didapat dari Kaggle dengan menggunakan bahasa pemrograman R. Hasilnya, kamu bisa melihat senjata apa saja yang paling ampuh membunuh musuh, daerah mana saja di peta Erangel maupun Miramar yang paling banyak memakan korban, dan lain sebagainya
1.1 Memilih atribut yang dibutuhkan
Berdasarkan hasil cuplikan data, kami memilih beberapa atribut untuk proses analisa ini, atribut-atribut tersebut 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
Adapun tujuh atribut ini dipilih karena dapat memberikan informasi mengenai pemilihan senjata yang efektif untuk membunuh musuh dalam game PUBG.
Untuk melihat apakah terdapat missing value pada dataset, digunakan fungsi colSums(is.na())
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 dengan value NA untuk mendapatkan informasi lebih spesifik.
## killer_name killed_by killer_position_x killer_position_y
## 1 Bluezone NA NA
## 2 Bluezone NA NA
## 3 Down and Out NA NA
## 4 Falling NA NA
## 5 Down and Out NA NA
## 6 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
Berdasarkan info yang di atas, atribut “killer_name”, “killer_position_x”, dan “killer_position_y” yang memiliki NA (missing value), adalah data-data yang memiliki data dari atribut “killed_by” yakni Bluezone, Falling, Down and Out, dan lainnya. Untuk itu, kami melakukan investigasi lebih lanjut tentang apa saja yang menyebabkan data tidak memiliki atribut “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
Pada data dengan atribut “killed_by” yang memilki “killer_name = NA”, dapat dilihat bahwa Bluezone, Down and Out, Falling, dan semacamnya, menjadi penyebab seorang pemain gugur dari permainan.
Dapat diambil kesimpulan bahwa yang memiliki “killer_name = NA” merupakan pemain yang gugur karena bunuh diri maupun mati seketika.
1.2 Pemilihan Data pada Peta Miramar dan Erangel
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)
Memilih data yang termasuk senjata PUBG dalam atribut killed_by
Dalam atribut “killed_by”, terdapat 50 alasan terbunuhnya korban. Pada Rmd ini, kami akan menganalisis jenis-jenis senjata yang terdapat dalam game PUBG. Jenis-jenis senjata tersebut dikelompokkan dalam obyek “weapon”. Data yang akan digunakan pun akan difilter hanya yang mengandung jenis-jenis senjata PUBG 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
2. ANALISIS KEEFEKTIFAN JENIS SENJATA DALAM MENGEKSEKUSI MUSUH
2.1 Pada Peta Miramar
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)
)
p
Dari visualisasi di atas, didapat bahwa M416, SCAR-L, dan M16A4 adalah jenis senjata PUBG yang paling efektif membunuh korban dengan jumlah korban lebih dari 200.000.
Sedangkan senjata-senjata PUBG seperti Machete, Sickle, dan Crowbar, tergolong kurang efektif karena hanya berhasil membunuh sedikit pemain. Untuk keefektifan senjatanya, akan diteliti pada Analisis Klastering di bawah ini.
2.2 Pada Peta Erangel
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)
p1
Sama seperti peta Miramar, di Erangel pun M416, M16A4, dan SCAR-L pun menjadi senjata PUBG yang paling efektif untuk membunuh musuh. Hal ini dapat dilihat dari jumlah korban yang dihasilkan oleh ketiga senjata tersebut merupakan tiga terbanyak.
3. ANALISIS TITIK JATUH KORBAN
3.1. Analisis titik jatuh korban pada peta Miramar
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")
h1
Berdasarkan gambar di atas, konsentrasi korban yang berjatuhan terbanyak di titik tertentu ditunjukkan dengan warna yang semakin kemerahan. Pada peta Miramar pada game PUBG, banyak korban yang berjatuhan di tengah.
Lingkaran area akan semakin mengecil dan mengarah ke tengah, sehingga semakin lama, pemain akan menuju ke arah tengah, dan banyak pemain gugur di area tengah peta. Darah lainnya dengan jumlah pemain yang cukup banyak gugur adalah di daerah Power Grid dan dekat San Martin.
3.2 Analisis Titik Jatuhnya Korban pada Peta Erangel
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")
h
Berdasarkan dataset yang digunakan dari peta Erangel, terlihat bahwa korban banyak berguguran di sekitar jalur penghubung antar pulau.
4. ANALISIS KLASTER PUBG
Clustering atau Pengklasteran adalah sebuah kegiatan mengelompokkan data (atau membuat subkelompok) dalam suatu dataset. Kelompok yang dihasilkan biasanya disebut klaster atau cluster.
Tujuan clustering adalah untuk memberikan sejumlah partisi di mana pengamatan yang jatuh ke masing-masing partisi mirip dengan data lain dalam kelompok itu, dengan partisi yang berbeda satu dengan lainnya.
Pada analisis ini, algoritme clustering 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”.
Interaksi yang dilakukan dalam prosedur ini adalah:
1. Temukan pusat klaster
2. Hitung jarak antara setiap titik ke setiap pusat klaster
3. Tetapkan / tetapkan kembali keanggotaan klaster
4.1 Membuat Variabel Jarak pada kedua peta
## 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
4.2 Menentukan Jumlah Klaster Optimal
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)
Digunakan elbow plot untuk menentukan jumlah klaster yang optimal. Klaster yang optimal berdasarkan metode elbow ini terletak pada elbow (sikunya). Berdasarkan metode ini, jumlah klaster yang optimal adalah tiga.
Semakin banyak jumlah klaster mungkin akan memperkecil eror, namun semakin banyak jumlah klaster tidak terlalu baik secara waktu komputasi. Sehingga, dipilih tiga jumlah klaster.
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)
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)
a1
Plot di atas merupakan analisis rata-rata jarak (dalam meter) efektif sebuah senjata PUBG dalam membunuh musuh terhadap jumlah penggunanya pada peta Miramar. Ada tiga klaster yang bisa kita lihat:
- 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
- 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.
4.3 Klaster pada Peta Erangel
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)
b1
Klaster di atas terbagi atas 3:
- Klaster hitam: klaster dengan senjata yang efektif digunakan untuk jarak jauh, namun sangat sedikit pemain yang menggunakannya.
- Klaster hijau: klaster dengan pengguna sedikit, penggunaannya untuk membunuh musuh dalam jarak dekat.
- Klaster merah: klaster yang paling banyak digunakan, efektif digunakan untuk jarak dekat.
KESIMPULAN:
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 PUBG yang paling efektif dalam membunuh korban, 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.
(Diedit oleh Prahariezka Arfienda, ilustrasi oleh Tommy Wijaya)
Yaumil Sitta
Data Science Trainee
An observant, full-time learner, half time teacher who loves watching movies. Bisa disapa di sitta@algorit.ma
No sanhok area with AKM as a weapon?
mantap ,,,lah
next, dota2!