HI
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:
Sumber data:
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 didapatkan pada situs numbeo.com dengan metode scrapping data menggunakan tools web scrapper
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®ion=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®ion=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 ...
Dari hasil pengamatan struktur data frame terdapat beberapa kolom di kedua data frame yang tidak kita gunakan dalam Data Processing ataupun Visulasisasi, sebagai berikut:
# 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 ...
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);
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)
)
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
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:
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
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
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.
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
notes Author use this analyse for education purpose at Algoritma Data Science @ Jakarta Some of code will looks very bad and doest show best