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.

pubg %<>%
  select(killer_name, killed_by, killer_position_x, killer_position_y, victim_position_x, victim_position_y, map)

Untuk melihat apakah terdapat missing value pada dataset, digunakan fungsi colSums(is.na())

colSums(is.na(pubg))
##       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 dengan value NA untuk mendapatkan informasi lebih spesifik.

pubg %>% 
  filter(is.na(killer_name)) %>% 
  head()
##   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”.

pubg %>% 
  filter(is.na(killer_name)) %>% 
  select(killed_by) %>% 
  unique()
##                              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 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 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 yang paling efektif membunuh korban dengan jumlah korban lebih dari 200.000.

Sedangkan senjata-senjata 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 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, 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)
Sedangkan untuk peta Erangel, berdasarkan plot di atas, jumlah klaster optimal juga tiga.
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 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 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

Yuk belajar data science di Algoritma Data Science Education Center! Kamu bisa ikut berbagai kelas data science untuk pemula, salah satunya di program Academy kami.

Daftar Data Science Academy di Sini!

0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *