TOPIC: 1. DATA WRANGLING 2. DATA VISUALIZATION

1 Study Case: Kiva Loan Data

1.1 About the data

Kiva.org adalah sebuah platform crowdfunding online non-profit internasional yang didirikan pada tahun 2005 di San Fransisco. Crowdfunding (urun dana) adalah kegiatan penggalangan dana modal dari beberapa individu untuk membiayai usaha bisnis baru. Misi dari Kiva adalah untuk menghubungkan masyarakat melalui pemberian pinjaman dan meningkatkan kesejahteraan warga marginal (terutama pengusaha berpenghasilan rendah maupun pelajar).

# Please run code down below
kiva <- read.csv("loan_kiva.csv", stringsAsFactors = T)

Additional: Pada fungsi read.csv() terdapat paramater stringsAsFactors = yang dapat kita manfaatkan untuk mengubah tipe data pada setiap kolom yang sifatnya memiliki pengulangan menjadi tipe data factor.

Deskripsi kolom:

  • id: Unique ID for loan
  • funded_amount: The amount disbursed by Kiva to the field agent (USD)
  • loan_amount: The amount disbursed by the field agent to the borrower (USD)
  • activity: More granular category
  • sector: High level category
  • country: Country in which loan was disbursed
  • region: Full region name within the country
  • currency: The currency in which the loan was disbursed
  • partner_id: ID of partner organization
  • posted_time: The time at which the loan is posted on Kiva by the field agent
  • funded_time: The time at which the loan posted to Kiva gets funded by lenders completely
  • term_in_months: The duration for which the loan was disbursed in months
  • lender_count: The total number of lenders that contributed to this loan
  • repayment_interval: Types of repayment from a lender in accordance with a loan’s terms
    • irregular: no equally spaced interval
    • bullet: lump sum payment, paid at maturity
    • monthly: regular payment at each month

1.2 Data Wrangling/Data Cleansing

1.2.1 Inspect data type

Setelah melakukan import dataframe yang ingin digunakan jangan lupa untuk melakukan inspeksi tipe data, untuk memastikan tipe data sudah sesuai.

# Please run code down below
str(kiva)
#> 'data.frame':    323279 obs. of  14 variables:
#>  $ id                : int  653051 653053 653068 653063 653084 653067 653078 653082 653048 653060 ...
#>  $ funded_amount     : num  300 575 150 200 400 200 400 475 625 200 ...
#>  $ loan_amount       : num  300 575 150 200 400 200 400 475 625 200 ...
#>  $ activity          : Factor w/ 154 levels "Adult Care","Agriculture",..: 62 127 140 50 90 42 11 87 60 127 ...
#>  $ sector            : Factor w/ 15 levels "Agriculture",..: 7 14 14 2 7 1 13 10 7 14 ...
#>  $ country           : Factor w/ 82 levels "Afghanistan",..: 52 52 27 52 52 27 52 52 52 52 ...
#>  $ region            : Factor w/ 9204 levels "","\"\"The first May\"\" village",..: 4375 4375 5170 4375 114 5170 2645 4375 4375 4375 ...
#>  $ currency          : Factor w/ 66 levels "ALL","AMD","AZN",..: 44 44 22 44 44 22 44 44 44 44 ...
#>  $ partner_id        : int  247 247 334 247 245 334 245 245 247 247 ...
#>  $ posted_time       : Factor w/ 322089 levels "2014-01-01 04:49:26",..: 5 7 22 17 38 21 32 36 2 14 ...
#>  $ funded_time       : Factor w/ 261846 levels "2014-01-01 12:18:55",..: 63 60 7 3 18 11 1138 15 204 1 ...
#>  $ term_in_months    : int  12 11 43 11 14 43 14 14 11 11 ...
#>  $ lender_count      : int  12 14 6 8 16 8 8 19 24 3 ...
#>  $ repayment_interval: Factor w/ 3 levels "bullet","irregular",..: 2 2 1 2 3 1 3 3 2 2 ...

Apa saja kolom yang tipe datanya belum sesuai?

  • posted_time -> datetime
  • funded_time -> datetime

Notes: Kenapa melakukan inspeksi tipe data itu penting sebelum melanjutkan ke tahap selanjutnya? Untuk memastikan bahwa semua tipe data yang ada pada dataframe tersebut sudah sesuai dan bisa diolah lebih lanjut.

1.2.2 Mengubah tipe data waktu dengan library lubridate

# Please run code down below
#install.packages("lubridate")
library(lubridate)

Penggunaan lubridate secara singkat dapat dilihat di cheatsheet: https://raw.githubusercontent.com/rstudio/cheatsheets/main/lubridate.pdf

  • Kolom posted_time & funded_time:

Format waktu dari kolom posted_time & funded_time: Year-Month-Day Hour-Minute-Second

Cara as.Date()/as.POSIXct

  • YEAR
    • %Y = tahun empat digit, contoh: 2022
    • %y = tahun dua digit, contoh: 22
  • MONTH
    • %B = nama bulan, contoh: January
    • %b = nama bulan singkatan, contoh: Jan
    • %m = bulan dua digit, contoh: 01
  • DAY
    • %A = nama hari, contoh: Monday
    • %d = tanggal, contoh: 01 sampai 31
  • TIME
    • %H: Untuk jam
    • %M: Untuk menit
    • %S: Untuk Detik
# Please run the code for column posted_time
head(as.POSIXct(kiva$posted_time, format = "%Y-%m-%d %H:%M:%S"))
#> [1] "2014-01-01 06:12:39 +07" "2014-01-01 06:51:08 +07"
#> [3] "2014-01-01 09:58:07 +07" "2014-01-01 08:03:11 +07"
#> [5] "2014-01-01 11:53:19 +07" "2014-01-01 09:51:02 +07"
class(as.POSIXct(kiva$posted_time, format = "%Y-%m-%d %H:%M:%S"))
#> [1] "POSIXct" "POSIXt"

Cara Lubridate

# Please type your code 
head(ymd_hms(kiva$posted_time))
#> [1] "2014-01-01 06:12:39 UTC" "2014-01-01 06:51:08 UTC"
#> [3] "2014-01-01 09:58:07 UTC" "2014-01-01 08:03:11 UTC"
#> [5] "2014-01-01 11:53:19 UTC" "2014-01-01 09:51:02 UTC"
class(ymd_hms(kiva$posted_time))
#> [1] "POSIXct" "POSIXt"

Additional: Merubah timezone (zona waktu)

List time zone: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

# Change into Jakarata timezone
head(ymd_hms(kiva$posted_time, tz = "Asia/Jakarta"))
#> [1] "2014-01-01 06:12:39 WIB" "2014-01-01 06:51:08 WIB"
#> [3] "2014-01-01 09:58:07 WIB" "2014-01-01 08:03:11 WIB"
#> [5] "2014-01-01 11:53:19 WIB" "2014-01-01 09:51:02 WIB"
# Change into New York timezone
head(ymd_hms(kiva$posted_time, tz = "America/New_York"))
#> [1] "2014-01-01 06:12:39 EST" "2014-01-01 06:51:08 EST"
#> [3] "2014-01-01 09:58:07 EST" "2014-01-01 08:03:11 EST"
#> [5] "2014-01-01 11:53:19 EST" "2014-01-01 09:51:02 EST"

1.2.2.1 Implementasi lubridate

Mari kita coba implementasikan fungsi dari library lubridate yang sudah kita tahu.

Opsi 1: Mengubah satu-per-satu

# Please type your code
kiva$posted_time <- ymd_hms(kiva$posted_time)
kiva$funded_time <- ymd_hms(kiva$funded_time)

Opsi 2: Mengubah bersamaan

Ketika kita ingin merubah beberapa kolom sekaligus, kita bisa menggunakan function lapply().

# Please type your code
kiva[ , c("posted_time", "funded_time")] <- lapply(kiva[ , c("posted_time", "funded_time")], ymd_hms)

class(kiva$posted_time)
#> [1] "POSIXct" "POSIXt"
class(kiva$funded_time)
#> [1] "POSIXct" "POSIXt"

1.2.3 Feature Engineering

Feature engineering adalah membuat kolom/variabel baru berdasarkan data yang ada. Hal ini berguna untuk mengekstrak informasi tambahan yang bisa digunakan untuk eksplorasi data dan modeling.

  • Membuat kolom range_time yaitu selisih dari funded_time dan posted_time
# Please run the code
kiva$range_time <- difftime(time1 = kiva$funded_time, # time akhir
                            time2 = kiva$posted_time, # time awal
                            units = "days")

kiva$range_time <- round(as.numeric(kiva$range_time)) # round & ubah menjadi numeric

head(kiva)

1.2.3.1 Feature Engineering dengan library lubridate

  • Meng-ekstrak nama hari

Kita akan mencoba untuk mengambil nama hari dari kolom posted_time & funded_time, lalu kita akan coba simpan ke kolom baru dengan nama day_posted & day_funded.

# Please type your code
kiva$day_posted <- wday(kiva$posted_time, label = T, abbr = F)
kiva$day_funded <- wday(kiva$funded_time, label = T, abbr = F)

Note: pada fungsi wday(),

  • argumen label untuk menampilkan nama hari

  • argumen abbr untuk menyingkat nama hari

  • Meng-ekstrak informasi bulan

Sekarang kita akan mencoba mengambil informasi bulan dari kolom posted_time dan kita akan simpan kedalam sebuah kolom month_posted.

# Please type your code
kiva$month_posted <- month(kiva$posted_time, label = T, abbr = F)
  • Meng-ekstrak informasi jam

Terakhir, kita akan mencoba menambahkan informasi jam dari pinjaman tersebut dipost dan kita akan menyimpannya ke kolom posted_hour.

# Please type your code
kiva$posted_hour <- hour(kiva$posted_time)
head(kiva)

1.3 Basic plotting in R

Exploratory Data Analysis Bertujuan untuk mendapat informasi dari data (explorasi). EDA biasa dilakukan menggunakan base plot.

Fungsi yang akan digunakan untuk melakukan base plot adalah plot(), jenis plot yang dihasilkan berubah sesuai tipe data yang dimasukkan, jika:

  • 1 variabel, x kategori: bar chart
  • 1 variabel, x numerik: histogram plot
    • Opsional function: hist()
  • 2 variabel, x dan y adalah numerik: scatter plot
  • 2 variabel, x kategori, y numerik: boxplot
    • Opsional function: boxplot()
  • 2 variabel, x date, y numerik: line plot
    • Additional parameter: type = “l”

General Business Case:

Kita sebagai tim analisis Kiva, ktia diminta untuk melakukan analisa dari beberapa pertanyaan yang ditanyakan oleh atasan kita, untuk data pinjaman yang berasal dari negara Indonesia & Vietnam.

# Please run the code
kiva_ind_vie <- kiva[kiva$country %in% c("Indonesia", "Vietnam"),]
unique(kiva_ind_vie$country)
#> [1] Vietnam   Indonesia
#> 82 Levels: Afghanistan Albania Armenia Azerbaijan Belize Benin ... Zimbabwe
  • Buesiness Question 1

Berapa kisaran/distribusi loan_amount yang berasal dari kedua negara tersebut?

Untuk melihat secara general secara distribusi dari kedua negara tersebut, kita dapat memanfaatkan plot histogram.

# Histogram
hist(kiva_ind_vie$loan_amount)

Insight:

Sedangkan ketika kita ingin melihatnya lebih detail lagi, untuk masing-masing negara, kita bisa mencoba untuk memanfaatkan plot boxplot.

# Boxplot
plot(x = kiva_ind_vie$country, y = kiva_ind_vie$loan_amount)

Dikarenakan level dari unique valuenya masih ada, kita dapat menghilangkannya dengan menggunakan fungsi droplevels()

# Boxplot
kiva_ind_vie$country <- droplevels(kiva_ind_vie$country)
unique(kiva_ind_vie$country)
#> [1] Vietnam   Indonesia
#> Levels: Indonesia Vietnam
plot(x = kiva_ind_vie$country, y = kiva_ind_vie$loan_amount)

Insight:

  • Buesiness Question 2

Sector mana yang memiliki jumlah peminjam paling banyak dari kedua negara tersebut?

Untuk melihat rangking dari setiap sector yang melakukan peminjaman paling banyak, mari kita coba manfaatkan bar plot.

# Bar plot
plot(x = kiva_ind_vie$sector, las = 2)

Insight:

  • Buesiness Question 3

Apakah jumlah pemberi pinjaman (lender_count) berhubungan dengan besaran dana yang akan dipinjam (loan_amount)?

Dalam mencari tahu hubungan antara 2 numerik variabel, kita dapat memanfaatkan scatter plot.

# Scatter plot
plot(kiva_ind_vie$loan_amount, kiva_ind_vie$lender_count)

Plot sudah terbentuk tapi kita kekurangan informasi kita tidak tahu titik mana yang mewakili negara Indonesia & Philippines. Kita juga ingin menambahkan garis tren hubungan antara 2 variabel.

Additional Step: Menambahkan Legend

Untuk memberikan lagenda pada scatter plot kita bisa menambahkan fungsi legend(), pada fungsi tersebut nantinya kita bisa mengisi beberapa parameter + x = mengatur posisi legend + legend = unique value dari kolom yang ingin ditampilkan + fill = untuk memberikan warna, sesuai dengan jumlah unique value dari kolom yang ingin ditampilkan

# Menambahkan legend
plot(kiva_ind_vie$loan_amount, kiva_ind_vie$lender_count,
     col = kiva_ind_vie$country,
     pch = 13)
legend(x = "right",
       legend = levels(kiva_ind_vie$country), 
       fill = 1:2)

Additional Step: Menambahkan garis tren

Untuk memberikan garis yang menunjukan apakah ada tren positif ataupun negatif kita bisa menambahkan fungsi abline() + Pada fungsi tersebut nantinya bisa di isi dengan fungsi lm() yang akan membuat garis linear berdasarkan perhitungan linear model, dengan mengisi beberapa parameter berikut ini - formula = parameter ini bisa diisi dengan numerik sumbu y ~ numerik sumbu x - data = dataframe yang digunakan

# Menambahkan garis trenn
plot(kiva_ind_vie$loan_amount, kiva_ind_vie$lender_count,
     col = kiva_ind_vie$country,
     pch = 13)
legend(x = "right",
       legend = levels(kiva_ind_vie$country), 
       fill = 1:2)
abline(lm(lender_count ~ loan_amount, 
          data = kiva_ind_vie))

Insight:

  • Buesiness Question 4

Bagaimana tren rata-rata pinjaman (loan_amount) setiap bulannya (month_posted) untuk negara Indonesia saja?

# Conditional subseting
kiva_indo <- kiva[kiva$country %in% "Indonesia",]

# Menghitung rata-rata pinjaman
loan_trend_indo <- aggregate(loan_amount ~ month_posted, data = kiva_indo, FUN = mean)
# Line Plot
plot(loan_trend_indo$loan_amount, type = "l")

Insight:

Kapan menggunakan base plot:

  • Ketika ingin membuat plot sederhana
  • Ketika ingin melakukan analisis secara cepat
  • Ketika grafik yang dihasilkan tidak untuk publikasi

1.4 Grammar of Graphics with ggplot2

Base plot amat berguna untuk melakukan eksplorasi data di awal dimana codingannya cukup sederhana. Ia dapat menyampaikan informasi mengenai data (distribusi/pola data) dan hubungan antar data secara cepat.

Sistem grammar yang digunakan pada base plot adalah membuat fungsi secara berurutan dan harus dijalankan bersamaan sehingga tidak begitu fleksibel dalam kostumisasi plot.

1.4.1 What is ggplot

#install.packages("ggplot2")
library(ggplot2)

Apa itu ggplot2? ggplot2 adalah sebuah libary yang akan menyediakan sebuah kanvas kosong yang dapat digunakan untuk membuat visualisasi. Sistem pembuatannya akan berdasarkan grammar formula of visualization dan layer by layer. Kedua sistem pembuatannya sangat bisa untuk dikutomisasi sehingga plot yang disajikan nantinya sangat cocok jika ingin ditampilkan kepada audiens.

Grammar formula of ggplot2 ggplot(data = ..., mapping = aes(x=..., y=...)) + geom_... + ...

ggplot(data = , mapping = aes(x=, y=))

Untuk lebih kenal dengan library ggplot2 mari kita coba melakukan visualisasi!

Contoh: Visualisasikan distribusi nilai loan_amount untuk sector Agriculture & Education dari negara Indonesia.

# Conditonal subseting
indo_agri_edu <- kiva[kiva$country %in% "Indonesia" & kiva$sector %in% c("Agriculture", "Education"), ]

# Menghilangkan level
indo_agri_edu$country <- droplevels(indo_agri_edu$country) 
indo_agri_edu$sector <- droplevels(indo_agri_edu$sector)

unique(indo_agri_edu$country)
#> [1] Indonesia
#> Levels: Indonesia
unique(indo_agri_edu$sector)
#> [1] Agriculture Education  
#> Levels: Agriculture Education
  • Step 1: Masukan parameter yang diperlukan untuk fungsi ggplot()

  • data = dataframe yang ingin digunakan

  • mapping = parameter ini akan di isi dengan Aesthetic / aes(), aes() adalah fungsi yang bisa diisi dengan elemen-elemen yang penting dalam grafik, meliputi sumbu x, sumbu y.

# Please Type Your Code Down Below
# Main layer
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount))

  • Step 2: Menambahkan layer

Layer 1 - Boxplot

Untuk menambahkan layer pada main layer, kita bisa menggunakan simbol +

# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount)) +
  geom_boxplot()

Layer 2- scatterplot

geom_point

# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount)) +
  geom_boxplot() +
  geom_point()

geom_jitter

# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount)) +
  geom_boxplot() +
  geom_jitter()

Notes: geom_jitter: scatterplot dengan titik yang random bergeser ke kiri/kanan, agar tidak tumpang tindih

  • Step 2.1: Ubah urutan layer 1 dan 2
# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount)) +
  geom_jitter() +
  geom_boxplot()

  • Step 3: Menambahkan warna pada plot

Untuk memberikan warna pada plot kita, kita bisa memanfaatkan parameter color atau fill pada fungsi aes()

  • Menggunakan parameter fill
# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount, fill = sector)) +
  geom_boxplot() +
  geom_jitter()

  • Menggunakan parameter color
# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount, color = sector)) +
  geom_boxplot() +
  geom_jitter()

  • Pengaruh penempatan parameter pada fungsi aes()

Ditempatkan pada fungsi salah satu geom_

# Please Type Your Code Down Below
ggplot(data = indo_agri_edu, mapping = aes(x = sector, y = loan_amount)) +
  geom_boxplot(mapping = aes(color = sector)) +
  geom_jitter()

1.4.2 Ranking Plot - Bar plot

Business Case: Sebagai seorang Analyst kita ingin menganalisa 10 Sektor yang memiliki jumlah pinjaman paling banyak dari negara Indonesia.

  • Step 1: Persiapan data
# Melakukan agregasi data
agg_sector <- aggregate(loan_amount ~ sector, kiva_indo, FUN = sum)

# Mengurutkan dari yang paling banyak ke rendah
agg_sector <- agg_sector[order(agg_sector$loan_amount, decreasing = T),]

# Mengambil top 10
agg_sector <- head(agg_sector, 10)

agg_sector
  • Step 2: Visualisasikan dengan geom_col
# Please type your code down below
ggplot(data = agg_sector, mapping = aes(x = sector, y = loan_amount)) +
  geom_col() +
  scale_x_discrete(guide = guide_axis(angle = 45))

  • Step 3: Coba tukar posisi kolom x & y pada parameter aes()
# Please type your code down below
ggplot(data = agg_sector, mapping = aes(y = sector, x = loan_amount)) +
  geom_col()

  • Step 4: Menambahkan parameter reorder() disumbu y

  • reorder() adalah sebuh parameter yang dapat dimanfaatkan untuk mengurutkan freq

# Please type your code down below
ggplot(data = agg_sector, mapping = aes(y = reorder(sector, loan_amount), x = loan_amount)) +
  geom_col()

  • Step 5: Mengubah warna dalam plot dengan menabahkan fungsi scale_fill_gradient()

  • scale_fill_gradient() adalah sebuah fungsi untuk meberikan gradasi warna pada setiap bar dalam geom_col(), parameter yang dapat digunakan adalah

    • low = parameter untuk warna yang paling bawah
    • high = parameter untuk warna yang paling atas
# Please type your code down below
ggplot(data = agg_sector, mapping = aes(y = reorder(sector, loan_amount), x = loan_amount)) +
  geom_col(aes(fill = loan_amount)) +
  scale_fill_gradient(low = "orange", high = "red")

  • Step 6: Menambahkan geom_text()

  • geom_text() adalah sebuah fungsi untuk memberikan keteragan angka didalam bar plot

    • color = Untuk memberikan warna ke text
    • size = untuk mengatur ukuran text
# Please type your code down below
library(scales)


ggplot(data = agg_sector, mapping = aes(y = reorder(sector, loan_amount), x = loan_amount)) +
  geom_col(aes(fill = loan_amount)) +
  geom_text(mapping = aes(label = paste("$", comma(loan_amount))), 
                          color = "black", 
                          size = 2,
                          nudge_x = 1)+
  scale_fill_gradient(low = "orange", high = "red") 

  • Step 7: Mengatur legend position & background plot
# Please Type Your Code Down Below
ggplot(data = agg_sector, mapping = aes(y = reorder(sector, loan_amount), x = loan_amount)) +
  geom_col(aes(fill = loan_amount)) +
  scale_fill_gradient(low = "orange", high = "red") +
  geom_text(mapping = aes(label = paste("$", comma(loan_amount))),
            hjust = "left", size = 2.5)+
  theme_bw() +
  theme(legend.position = "none") +
  scale_x_continuous(labels = dollar_format(prefix = "$", big.mark = ","))

Insight:

1.4.3 Trend Plot - Line Plot

Bussines Case: Bagaimana tren frekuensi pengajuan pinjaman setiap harinya untuk negara Indonesia saja, pada bulan Januari 2014?

  • Step 1: Persiapan data
# Menambahkan kolom baru 
kiva$posted_date <- date(kiva$posted_time)

# Conditional subseting
kiva_indo_jan <- kiva[kiva$country %in% "Indonesia" & kiva$posted_date <= "2014-01-31",]

# Menghitung frekuensi pinjaman
trend_freq <- as.data.frame(table(kiva_indo_jan$posted_date))

head(trend_freq)
# Mengubah tipe data Var1 menjadi date

trend_freq$Var1 <- ymd(trend_freq$Var1)
class(trend_freq$Var1)
#> [1] "Date"
  • Step 2: Mari kita buat plotnya dengan menggunakan geom_line()
# Please type your code down below
ggplot(data = trend_freq, mapping = aes(x = Var1, y = Freq)) +
  geom_line(group = 1)

  • Step 3: Mari kita tambahkan plotnya dengan menggunakan geom_point()
# Please type your code down below
ggplot(data = trend_freq, mapping = aes(x = Var1, y = Freq)) +
  geom_line(group = 1) +
  geom_point()

Note: gunakan argumen group = 1 saat menggunakan geom_line -> hanya membuat 1 line

  • Step 4: Mengatur sumbu X dengan menggunakan fungsi scale_x_date()

Parameter yang dapat digunakan: - date breaks = ...days ... week ...month - date_labels = format tanggal

Contoh: scale_x_date(date_breaks = "1 week", date_labels = "%m-%d")

# Please type your code down below
ggplot(data = trend_freq, mapping = aes(x = Var1, y = Freq)) +
  geom_line(group = 1) +
  geom_point() +
  scale_x_date(date_breaks = "3 days", date_labels = "%m-%d")

  • Step 5: Mengatur sumbu X dengan menggunakan fungsi scale_y_continous()

Parameter yang dapat digunakan: - breaks(seq(..,..,..))

Contoh: scale_y_continuous(breaks = seq(3, 27, 3))

# Please type your code down below
ggplot(data = trend_freq, mapping = aes(x = Var1, y = Freq)) +
  geom_line(group = 1) +
  geom_point() +
  scale_x_date(date_breaks = "3 days", date_labels = "%m-%d")+
  scale_y_continuous(breaks = seq(3, 20, 3))

  • Step 6: Menambahkan keterangan title, subtitle, legends, dan label sumbu x dan y dengan menggunakan fungsi labs()
# Please type your code down below
ggplot(data = trend_freq, mapping = aes(x = Var1, y = Freq)) +
  geom_line(group = 1) +
  geom_point(color = "red") +
  scale_x_date(date_breaks = "3 days", date_labels = "%m-%d")+
  scale_y_continuous(breaks = seq(3, 20, 3)) +
  labs(x = "Date",
       y = "Freq",
       title = "Trend",
       subtitle = "...")

1.4.4 Dive Deeper!

Business Case 1: Kita diminta untuk menunjukan 5 sector yang memiliki jumlah partisipasi peminjam (lender_count) paling sedikit dari keseluruhan data kita.

# Persiapan Data
# Melakukan perhitungan jumlah pinjaman
total_lender <- aggregate(lender_count ~ sector, data = kiva, FUN = sum)

# Mengurutkan hasil penjumlahan
total_lender <- total_lender[order(total_lender$lender_count, decreasing = T),]

# Mengambil 5 sector paling bawah
bottom_5_sector <- tail(total_lender, 5)
# Membuat visual

ggplot(data = bottom_5_sector, aes(x = lender_count, y = reorder(sector, lender_count))) +
  geom_col()

Business Case 2: Kita diminta untuk melihat trend pengajuan pinjam setiap harinya pada bulan Januari 2014, untuk negara Philippines dan Vietnam.

# Persiapan Data
# Conditional Subseting
kiva_ipv <- kiva[kiva$country %in% c("Indonesia", "Philippines", "Vietnam") & kiva$posted_date <= "2014-01-31", ]

# Melakukan perhitungan freq
freq_loan_ipv <- aggregate(x = id ~ posted_date +country, data = kiva_ipv, FUN = length)

# Mengubah tipe data menjadi date
freq_loan_ipv$posted_date <- ymd(freq_loan_ipv$posted_date)
# Membuat visual

ggplot(data = freq_loan_ipv, aes(x = posted_date, y = id)) +
  geom_line(aes(col = country))+
  geom_point()

1.4.5 Multivariate Plot

Multivariate plot adalah sebuah plot yang digunakan untuk menampilkan nilai dari beragam variabel secara bersamaan.

Business Case: Kita diminta untuk melakukan analisa tipe repayment_interval apakah yang paling sering dipilih oleh para peminjam dari negara Indonesia, Philippines & Vietnam.

  • Step 1: Mari kita persiapkan datanya
# Melakukan aggregasi
agg_kiva_ind_vie <- aggregate(id ~ country + repayment_interval,
                              data = kiva_ind_vie, 
                              FUN = length)
agg_kiva_ind_vie
  • Step 2: Visualisasikan dengan geom_col()

Pada fungsi geom_col() ada sebuah parameter yang bernama position dan didalam postion itu bisa memasukan sebuah value bernama dodge.

# Please Type Your Code Down Below
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
    scale_fill_manual(values = c("yellow", "orange", "red"), 
                    labe = c("Bullet", "Irregular", "Monthly")) +
      geom_text(aes(label = id, group = repayment_interval),
            position = position_dodge(width = 1),
            size = 3,
            hjust = -0.05)

Pada fungsi geom_col() ada sebuah parameter yang bernama position dan didalam postion itu bisa memasukan sebuah value bernama fill.

# Please Type Your Code Down Below
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "fill")

  • Step 3: Mengubah warna dalam plot dengan menabahkan fungsi scale_fill_manual()

  • scale_fill_manual() adalah sebuah fungsi untuk meberikan gradasi warna pada setiap bar dalam geom_col(), parameter yang dapat digunakan adalah

    • values = parameter untuk menentukan warna apa saja yang akan digunakan

Contoh: scale_fill_manual(values = c("yellow", "orange", "red"))

# Please Type Your Code Down Below
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
      geom_text(aes(label = id, group = repayment_interval),
            position = position_dodge(width = 1),
            size = 3,
            hjust = -0.05)

1.4.6 Faceting

Memplotkan variabel di panel terpisah, sehingga visual menjadi lebih jelas. Fungsi yang dapat digunakan adalah facet_wrap()

Parameter yang bisa digunakan pada fungsi facet_wrap()

  • facets = parameter yang menentukan kolom apa yang mau dipisah
  • scales = ada 3 value yang bisa diisi pada parameter ini yaiut free_x, free_y & free

Contoh: facet_wrap(facets = ~ name, scales = "free_x")

# Tambahkan facet untuk scales = free_x
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
  facet_wrap(facets = ~ country, scales = "free_x")

# Tambahkan facet untuk scales = free_y
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
  facet_wrap(facets = ~ country, scales = "free_y")

# Tambahkan facet untuk scales = free
ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
  facet_wrap(facets = ~ country, scales = "free")

ggplot(data = agg_kiva_ind_vie, mapping = aes(x = id, y = country)) +
  geom_col(aes(fill = repayment_interval), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
  facet_wrap(facets = repayment_interval ~ country, scales = "free")

1.4.7 Additional: Scatter plot

  1. Indonesia merupakan salah satu negara yang mendapatkan pinjaman dari Kiva. Di Indonesia sektor pertanian (Agriculture) merupakan sektor dengan peminjam terbanyak. Sebagai seorang analis coba cek keterhubungan antara jumlah uang yang dipinjamkan (loan_amount) dengan jumlah orang yang memberikan pinjaman (lender_count) pada sektor pertanian di Indonesia.

Hint:

  • lakukan subset data dan simpan kedalam objek kiva_indo_agri
  • gunakan geom_smooth untuk membuat garis hubungan antar x dan y
  • Berikan keterangan/label pada plot
  • berikan format dollar pada loan_amount
  • percantik sesuai keinginan Anda
# preparasi data
kiva_indo_agri <- kiva_indo[kiva_indo$sector == "Agriculture",]

# visualisasi
ggplot(kiva_indo_agri, aes(x = loan_amount, y = lender_count)) +
  geom_smooth(col = "navy", fill = "skyblue") +
  geom_point() +
  labs(title = "Correlation of Loan Amount vs Lender Count", 
       subtitle = "Country: Indonesia",
       x = "Loan Amount (in USD)",
       y = "Lender Count",
       caption = "Source: Kiva Database") +
  scale_x_continuous(labels = dollar_format())

1.4.8 Additional Dive Deeper

Business Case: Kita diminta untuk melakukan analisa jumlah loan_amount untuk sector Education dan Health, untuk negara Philippines, Indiadan Vietnam. Hasil dari analisa kita, akan ditampilkan dengan Multivariate Bar plot.

Hint:

  • Lakukan conditional subseting untuk setiap sector dan negara yang diminta
  • Lakukan aggregasi data untuk melihat nilai rata-rata dari setiap negara untuk setiap sector yang diminta.
  • Lakukan visualisasi
cond_subseting <- kiva[kiva$country %in% c("Philippines", "India", "Vietnam") & kiva$sector %in% c("Education", "Health"), ]

agg_dd <- aggregate(loan_amount ~ country + sector,
                              data = cond_subseting, 
                              FUN = sum)
agg_dd
ggplot(data = agg_dd, mapping = aes(x = loan_amount, y = reorder(country, loan_amount, FUN = sum))) +
  geom_col(aes(fill = sector), position = "dodge") +
  scale_fill_manual(values = c("yellow", "orange", "red")) +
      geom_text(aes(label = loan_amount, group = sector),
            position = position_dodge(width = 1),
            size = 3,
            hjust = -0.05)

2 [Opt] Interactive Map with leaflet

Kita dapat membuat interactive map dengan bantuan package leaflet. Leaflet sendiri adalah open-source JavaScript library untuk pembuatan interactive maps.

Contoh sederhana:

# install.packages("leaflet")
library(leaflet)

# get icon
ico <- makeIcon(
    iconUrl = "https://algorit.ma/wp-content/uploads/2017/07/logo_light_trans.png",
    iconWidth=177/2, iconHeight=41/2
)

# make dummy data
set.seed(418)
loca <- data.frame(lat=runif(5, min = -6.24, max=-6.23),
                   lng=runif(5, min=106.835, max=106.85))

# check data
loca
# create a leaflet map widget
map1 <- leaflet()

# add tiles from open street map
map1 <- addTiles(map1)

# add markers
map1 <- addMarkers(map1, data = loca, icon=ico)

map1
# prepare pop-up
pops <- c(
    "<h3>Algoritma Main HQ</h3><p>Visit us here!</p>",
    "<strong>Algoritma Business Campus</strong>", 
    "<h3>In-Construction</h3><p>New Secondary Campus</p>",
    "<strong>Secondary Campus</strong>",
    "<strong>The Basecamp (business-school)</strong>"
)
# make new leaflet
map2 <- leaflet()
map2 <- addTiles(map2)
map2 <- addMarkers(map2, data = loca, icon=ico, popup = pops)

map2

Berikut adalah website dan referensi yang dapat mempermudah pemahaman kita mengenai leaflet:

3 Further Readings

Berikut adalah referensi-referensi lain dan website yang dapat memudahkan kita untuk mengekplorasi seputar data visualisasi di R: