HI

Latar Belakang

Traveling merupakan sebuah gaya hidup dan kini bukan lagi hal mewah beberapa tahun belakangan ini.Ada yang menjadikan kegiatan travelling sebagai hobi atau juga program wajib pada sebuah komunitas atau organisasi. Bahkan pada beberapa orang, traveling adalah sebuah pekerjaan. Namun, tetap saja masih ada sebagian orang yang menganggap sebelah mata hobi ini. Tetapi kadang bagi kita yang ingin traviling akan sedikit kebingungan untuk menemukan destinasi yang tepat untuk kita kunjungi, terlebih lagi menyangkut keamanan dan biaya hidup yang akan dikeluarkan selama berada di kota tersebut.

Data yang digunakan kali ini adalah data dari kota-kota di asia dengan Index Kriminal dan Index biaya hidup sebagai acuan. Beberapa yang visualisasi yang mungkin dapat membantu para traveller untuk memilih destinasi yang tepat:

  • Kota dengan index kriminal tertinggi
  • Kota dengan index kriminal terendah
  • Kota dengan index biaya hidup tertinggi
  • kota dengan index biaya hidup terendah
  • Visualisasi perbandingan Index biaya hidup dengan tingkat kriminal

Sumber data:

Setting Up

Load library yang akan kita gunakan menggunakan function library() function:

library("dplyr")
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library("ggplot2")
library("tidyr")

Jika library belum di unduh makan gunakan function install.packages() untuk install package yang dibutuhkan

Data Explanatory

Scrapping data

Data didapatkan pada situs numbeo.com dengan metode scrapping data menggunakan tools web scrapper

Import data

Data yang kita gunakan adalah data Crime Index Ranking dan Cost of Living Index pada kota-kota di asia tahun 2020 (terbaru), yang sudah kita dapatkan pada file regionranking.csv dan numbeocostlivin.csv

# Import data
crimeranking <- read.csv(file = "regionranking.csv")
costlivingranking <- read.csv(file = "numbeocostliving.csv")

# Cek structure data crimeranking hasil import
str(crimeranking)
## 'data.frame':    87 obs. of  6 variables:
##  $ web.scraper.order    : Factor w/ 87 levels "1579856826-103",..: 50 87 64 80 52 38 46 65 67 22 ...
##  $ web.scraper.start.url: Factor w/ 1 level "https://www.numbeo.com/crime/region_rankings.jsp?title=2020&region=142": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Rank                 : int  50 87 64 80 52 38 46 65 67 22 ...
##  $ City                 : Factor w/ 87 levels "Abu Dhabi, United Arab Emirates",..: 13 1 64 87 47 83 53 37 74 16 ...
##  $ Crime.Index          : num  34.5 11.3 29.9 22 34.1 ...
##  $ Safety.Index         : num  65.5 88.7 70.1 78 65.9 ...
# Cek structure data costlivingranking hasil import
str(costlivingranking)
## 'data.frame':    100 obs. of  10 variables:
##  $ web.scraper.order             : Factor w/ 100 levels "1579856569-10",..: 58 17 15 42 26 12 71 63 69 10 ...
##  $ web.scraper.start.url         : Factor w/ 1 level "https://www.numbeo.com/cost-of-living/region_rankings.jsp?title=2020&region=142": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Rank                          : int  58 21 19 44 29 16 70 63 68 14 ...
##  $ City                          : Factor w/ 100 levels "Abu Dhabi, United Arab Emirates",..: 8 56 72 62 80 60 19 63 70 69 ...
##  $ Cost.of.Living.Index          : num  32.2 52.1 53.4 39 48.2 ...
##  $ Rent.Index                    : num  5.76 30.9 14.28 21.33 13.21 ...
##  $ Cost.of.Living.Plus.Rent.Index: num  19.6 42 34.7 30.5 31.4 ...
##  $ Groceries.Index               : num  29.5 36.5 43.2 33.3 37.7 ...
##  $ Restaurant.Price.Index        : num  21.2 51.7 51 25.6 34.8 ...
##  $ Local.Purchasing.Power.Index  : num  42.4 73.7 56.9 25.1 90 ...

Eliminiasi kolom

Dari hasil pengamatan struktur data frame terdapat beberapa kolom di kedua data frame yang tidak kita gunakan dalam Data Processing ataupun Visulasisasi, sebagai berikut:

  • web.scraper.order
  • web.scraper.start.url
# take out some of unusual column

crimeranking <- subset(crimeranking,select = -c(Rank, web.scraper.order, web.scraper.start.url));
costlivingranking <- subset(costlivingranking, select = -c(Rank, web.scraper.order, web.scraper.start.url))

Memastikan bahwa subsetin data.frame berjalan dengan seharusny

str(crimeranking)
## 'data.frame':    87 obs. of  3 variables:
##  $ City        : Factor w/ 87 levels "Abu Dhabi, United Arab Emirates",..: 13 1 64 87 47 83 53 37 74 16 ...
##  $ Crime.Index : num  34.5 11.3 29.9 22 34.1 ...
##  $ Safety.Index: num  65.5 88.7 70.1 78 65.9 ...
str(costlivingranking)
## 'data.frame':    100 obs. of  7 variables:
##  $ City                          : Factor w/ 100 levels "Abu Dhabi, United Arab Emirates",..: 8 56 72 62 80 60 19 63 70 69 ...
##  $ Cost.of.Living.Index          : num  32.2 52.1 53.4 39 48.2 ...
##  $ Rent.Index                    : num  5.76 30.9 14.28 21.33 13.21 ...
##  $ Cost.of.Living.Plus.Rent.Index: num  19.6 42 34.7 30.5 31.4 ...
##  $ Groceries.Index               : num  29.5 36.5 43.2 33.3 37.7 ...
##  $ Restaurant.Price.Index        : num  21.2 51.7 51 25.6 34.8 ...
##  $ Local.Purchasing.Power.Index  : num  42.4 73.7 56.9 25.1 90 ...

Transformation Tipe Data

Pada data frame crimeranking dan costlivingranking kita dapat melihat kolom City memliki type data Factor. Kolom City pada kedua data frame tersebut adalah sebuah keterangan kota beserta negara dan bukan leveling, maka tipe data yang cocok dengan kolom City adalah tipe data Character. Gunakan function as.character untuk merubah tipe data menjadi character

crimeranking$City <- as.character(crimeranking$City);
costlivingranking$City <- as.character(costlivingranking$City);

Mutasi Data

Pada kolom City sebenarnya tidak hanya menjelaskan kota pada kolom tersebeut, tetapi juga menunjukkan keterangan negara. Agar nantinya kita dapat menggabungkan kedua data frame ini alangkah baiknya kita memishakan hal tersebut. Selain itu tujuan dari pemisahan ini meminimalisir kesalahan saat merging karena kesalahan pengetikan atau saat penarikan data. Fungsi yang akan digunakan adalah strsplit dan mutate

crimeranking.clean <- mutate(crimeranking,
                      Country = strsplit(crimeranking$City, ", ") %>% sapply(tail, 1),
                      City = strsplit(crimeranking$City,", ") %>% sapply(head, 1)
                      )
costlivingranking.clean <- mutate(costlivingranking,
                                  Country = strsplit(costlivingranking$City, ", ") %>% sapply(tail, 1),
                                  City = strsplit(costlivingranking$City, ", ") %>% sapply(head, 1)
                                  )

Merging Data Frame

Tujuan awal kita adalah mengetahui dan memberi saran kepada para traveller dengan membandingkan data Crime.Index dengan Cost.Of.Living. Maka setiap kota harus memiliki dua Index tersebut agar kita dapat membandingkan dan memvisualisasikan dengan baik. Maka kita menggunakan fungsi inner_join karena dengan fungsi ini kota yang tidak memiliki kolom di keduanya akan sendirinya tereliminiasi:

crimecostlivingranking <- inner_join(crimeranking.clean, costlivingranking.clean)
## Joining, by = c("City", "Country")
crimecostlivingranking <- crimecostlivingranking[order(crimecostlivingranking$Crime.Index, decreasing = F),]

Cek kembali hasil join dataframe sesuai dengan yang kita inginkan

head(crimecostlivingranking)
##         City Crime.Index Safety.Index              Country Cost.of.Living.Index
## 2  Abu Dhabi       11.33        88.67 United Arab Emirates                62.75
## 51      Doha       11.48        88.52                Qatar                63.96
## 70    Taipei       14.20        85.80               Taiwan                64.30
## 37     Dubai       17.05        82.95 United Arab Emirates                66.81
## 60   Tbilisi       20.49        79.51              Georgia                28.27
## 63 Hong Kong       20.70        79.30            Hong Kong                77.22
##    Rent.Index Cost.of.Living.Plus.Rent.Index Groceries.Index
## 2       45.33                          54.42           51.44
## 51      47.31                          56.00           53.73
## 70      19.41                          42.83           75.63
## 37      50.76                          59.14           51.39
## 60      10.83                          19.92           22.19
## 63      79.57                          78.35           75.94
##    Restaurant.Price.Index Local.Purchasing.Power.Index
## 2                   63.57                        93.34
## 51                  65.70                       107.64
## 70                  30.71                        67.10
## 37                  67.34                        92.69
## 60                  26.46                        26.69
## 63                  54.36                        65.32

Data Processing dan Visualisasi

Korelasi antara Crime Index dan Cost Of Living

Melihat korelasi antara crime Index dan Cost Of Living

cor(crimecostlivingranking$Crime.Index, crimecostlivingranking$Cost.of.Living.Index)
## [1] -0.4226089
sd(crimecostlivingranking$Crime.Index)
## [1] 13.92117
ggplot(data = crimecostlivingranking, mapping = aes(x = Cost.of.Living.Index, y = Crime.Index)) +
  geom_jitter(aes(col = Cost.of.Living.Index), alpha = 0.7) +
  theme_minimal() +
  theme(legend.position = "nonte") + 
  labs(title = "Crime Index to Cost of Living Index Cities In Asia",
       x = "Cost Of Living",
       y = "Crime Index")

Dilihat dari dari data korelasi antara Crime Index dengan Cost of Living kita mendapatkan insight sebagai berikut:

  • Index di dapat nilai -0.4 dengan kecenderungan Crime Index meningkat makan Cost Of living Index menurun
  • Dari plot persebaran dengan bias terlihat weak negative correlation antara Crime Index dan Cost Of living Index

Visualisasi 20 Kota dengan Crime Index Tertinggi

Dari dataframe yang sudah persiapkan sebelumnya akan di visualisasikan 20 Kota Di Asia yang memiliki Crime Index tertinggi

# Arrange dengan data Crime.Index Tertinggi hingga terendah
crimecostlivingranking.arrange <- arrange(crimecostlivingranking, desc(Crime.Index))

# Rata-rata Crime Index kota di Asia
crimecostlivingranking.average <- as.integer(mean(crimecostlivingranking$Crime.Index))

# Subset data 20 data teratas dan 1 sample perbandingan 1 data Crime Index Terendah 
crimecostlivingranking.arrange.crimeindex <- rbind(head(crimecostlivingranking.arrange, 20), tail(crimecostlivingranking.arrange, 1))


ggplot(data = crimecostlivingranking.arrange.crimeindex , mapping = aes(x = reorder(paste(City,"-",Country), Crime.Index), y = Crime.Index)) +
  geom_col(mapping = aes(fill = Crime.Index), width = 0.5) +
  geom_col(data = tail(crimecostlivingranking.arrange.crimeindex, 1), fill = "green", width = 0.5) +
  scale_fill_gradient(low = "lightyellow",
                      high = "orange") +
  geom_hline(yintercept = crimecostlivingranking.average, linetype = "dashed") +
  coord_flip() +
  theme_minimal() + 
  theme(panel.grid = element_blank(),
        legend.position = "") +
  labs(
    title = "Top 20 Highest Crime Index in ASIA",
    subtitle = "based in numbeo.com",
    x = "",
    y = "Crime Index"
  ) 

Interpretasi Grafik menunjukkan tingkat Kriminal tertinggi adalah kota Almaty di negara Kazakhstan, di susul Damascus di negara Syria yang memang sedang terjadi konflik, akan tetapi yang menarik Kuala Lumpur malaysia memiliki tingkat Crime Index yang tinggi berada di posisi ke 3. Terlihat garis putus warna hitam membelah bar adalah garis rata-rata tingkat Crime Index untuk kota-kota diasia dan 20 kota teratas memiliki tingkat Crime Index diatas rata-rata kota di asia

Visualisasi 20 Kota dengan Crime Index Terendah

Sebagai informasi pendukung kita juga perlu mengetahui kota mana saja yang memiliki tingkat Crime Index terendah

# Arrange dengan data Crime.Index Terendah hingga Tertinggi
crimecostlivingranking.arrange <- arrange(crimecostlivingranking, Crime.Index)

# Subset data 20 data teratas dan 1 sample perbandingan 1 data Crime Index Terendah 
crimecostlivingranking.arrange.crimeindex <- rbind(head(crimecostlivingranking.arrange, 20), tail(crimecostlivingranking.arrange, 1))

ggplot(data = crimecostlivingranking.arrange.crimeindex , mapping = aes(x = reorder(paste(City,"-",Country), -Crime.Index), y = Crime.Index)) +
  geom_col(mapping = aes(fill = Crime.Index), width = 0.5) +
  geom_col(data = tail(crimecostlivingranking.arrange.crimeindex, 1), fill = "orange", width = 0.5) +
  scale_fill_gradient(low = "green",
                      high = "darkgreen") +
  geom_hline(aes(yintercept = crimecostlivingranking.average),linetype = "dashed", color = "orange") +
  coord_flip() +
  theme_minimal() + 
  theme(panel.grid = element_blank(),
        legend.position = "") +
  labs(
    title = "Top 20 City With Lowest Crime Index in ASIA",
    subtitle = "based in numbeo.com",
    x = "",
    y = "Crime Index"
  ) 

Interpretasi: Grafik menunjukkan kota dengan Crime Index terendah adalah Abu Dhabi di negara United Arab emirates, Doha di Negara Qatar, serta Taipei di negara taiwan. 20 Negara dengan crime index terendah semua berada di bawah rata-rata dari Crime Index kota-kota di Asia. Dari visualisasi diatas kita dapat menjadikan sebuah refrensi untuk memilih destinasi travelling dengan tingkat kejahatan rendah yang membuat kita lebih nyaman dalam travelling

Visualisasi 20 Kota dengan Crime Index Terendah dengan Cost Of Living Index

Travelling bukan hanya kenyamanan yang diutamakan, tetapi kita juga harus memastikan bahwa budget yang kita miliki sesuai saat kita menuju kota destinasi. Maka akan kita coba visualisasikan kombinasi 20 kota di asia dengan Crime Index terendah dengan Cost of Living Index. Berikut langkah yang kita lakukan

# Eliminasi kolom tidak terkait dengan visualisasi data
crimecostlivingranking.sum <- subset(crimecostlivingranking, select = c(City,Country,Crime.Index,Cost.of.Living.Index))

# Arrange dengan data Crime.Index Terendah hingga Tertinggi
crimecostlivingranking.sum <- arrange(crimecostlivingranking.sum, Crime.Index)

# Subset 20 data teratas kota dengan Crime Index Terendah
crimecostlivingranking.sum <- head(crimecostlivingranking.sum, 20)

# Pivot data frame 
crimecostlivingranking.sum <- pivot_longer(crimecostlivingranking.sum,
             cols = c( "Cost.of.Living.Index", "Crime.Index"))


# Visualisasi 
ggplot(data = crimecostlivingranking.sum, mapping = aes(x = reorder(paste(City,"-",Country), -value), y = value)) +
  geom_col(mapping = aes(fill = name)) +
  coord_flip() +
  theme_minimal() +
  geom_hline(aes(yintercept = crimecostlivingranking.average),linetype = "dashed", color = "black") +
  scale_fill_discrete(name = "Index", labels = c("Cost Of Living", "Crime")) +
  theme(panel.grid = element_blank(),
        legend.position = "bottom") +
  labs(
    title = "Top 20 Suggest City to visit in ASIA",
    subtitle = "based on Lowest crime index compared living cost index",
    x = "",
    y = "",
    fill = "Index"
)

Interpretasi: Dapat kita lihat dari visualisasi Mangalore India menjadi salah satu tujuan dengan tingkat crime Index dibawah rata-rata dan jika di kombinasikan denga Cost Of Living menjadi kota dengan Crime Index dan Cost Of Living terendah.

Visualisasi 20 Kota dengan Cost Of Living Index terendah

Tidak ada salahnya jika saat melakukan travelling kita lebih mengutamakan Cost Of Living index paling rendah. dan kita juga tetap melihat tingkat kriminal atau Crime Index. Kita coba visualisasikan

crimecostlivingranking.sum <- subset(crimecostlivingranking, select = c(City,Country,Crime.Index,Cost.of.Living.Index))
crimecostlivingranking.sum <- arrange(crimecostlivingranking.sum, Cost.of.Living.Index)
crimecostlivingranking.sum <- head(crimecostlivingranking.sum, 20)
crimecostlivingranking.sum <- pivot_longer(crimecostlivingranking.sum,
             cols = c( "Cost.of.Living.Index", "Crime.Index"))

ggplot(data = crimecostlivingranking.sum, mapping = aes(x = reorder(paste(City,"-",Country), -value), y = value)) +
  geom_col(mapping = aes(fill = name)) +
  coord_flip() + 
  theme_minimal() + 
  scale_fill_discrete(name = "Index", labels = c("Cost Of Living", "Crime")) +
  geom_hline(aes(yintercept = crimecostlivingranking.average),linetype = "dashed", color = "black") +
  theme(panel.grid = element_blank(),
        legend.position = "bottom") +
  labs(
    title = "Top 20 Suggest City to visit in ASIA",
    subtitle = "based on Lowest living cost index compare crime Index",
    x = "",
    y = "",
    fill = "Index"
  ) 

Interpretasi: Mangalore India tetap menjadi pilihan tempat wisata dengan Cost Living Index dan Crime Index paling rendah

Kesimpulan Akhir

  • Dari plot persebaran dengan bias terlihat weak negative correlation antara Crime Index dan Cost Of living Index, jadi belum tentu tingkat Crime Index rendah maka Cost Of Living Index meningkat
  • Top 20 kota dengan Crime Index Terendah memiliki Crime Index di bawah rata-rata bisa menjadi pilihan destinasi travelling yang mengutamakan keamanan dan menurunkan tingkat ke khawatiran akan kriminal di kota tersebut
  • Top 20 Kota dengan Crime Index Tertinggi kesemuanya memiliki tingkat Crime Index diatas rata-rata, yang dapat di jadikan refrensi kota dengan tingkat kriminal cukuop tinggi dan kita harus tingkatkan kewaspadaan saat travelling ke Kota tersebut
  • Kota Mangalore menjadi kota dengan Crime Index cukup rendah dan Living cost cukup rendah dapat dijadikan tujuan destinasi bagi yang ingin travelling dengan budget minimal dan tingkat kriminal cukup rendah
  • Kota Mangalore juga menjadi destinasi yang disarankan jika di bandingkan 20 Kota Cost living terendah karena di banding 20 kota lain, Crime Index kota mangalore paling rendah di banding kota lain yang masih dalam 20 Kota dengan Cost Living Index terendah

notes Author use this analyse for education purpose at Algoritma Data Science @ Jakarta Some of code will looks very bad and doest show best