TAHAP 1

Penjelasan Data

Kiva (umumnya dikenal dengan nama domainnya, Kiva.org) adalah organisasi nirlaba yang berkantor pusat di San Francisco, California yang memungkinkan orang meminjamkan uang melalui Internet kepada wirausahawan berpenghasilan rendah dan siswa di 77 negara. Misi Kiva adalah “untuk memperluas akses keuangan untuk membantu komunitas yang kurang terlayani berkembang.”

Sejak 2005, Kiva telah mendanai lebih dari 1,6 juta pinjaman, dengan total lebih dari $ 1,33 miliar, dengan tingkat pembayaran antara 96 dan 97 persen. Lebih dari 1,8 juta pemberi pinjaman di seluruh dunia menggunakan platform Kiva. Pemberi pinjaman tidak menerima bunga atas uang yang mereka pinjamkan. Kiva menyertakan cerita pribadi setiap orang yang mengajukan pinjaman sehingga pemberi pinjaman dapat terhubung dengan peminjam pada tingkat manusia.

Kiva mengandalkan jaringan mitra lapangan untuk mengelola pinjaman di lapangan. Mitra lapangan ini dapat berupa lembaga keuangan mikro, bisnis berdampak sosial, sekolah, atau organisasi nirlaba. Peminjam membayar bunga atas sebagian besar pinjaman kepada mitra lapangan, dan mitra lapangan dikenai biaya kecil oleh Kiva. Kiva didukung oleh hibah, pinjaman, dan donasi dari para penggunanya, perusahaan, dan lembaga nasional.

Sumber : https://en.wikipedia.org/wiki/Kiva_(organization)

Setelah kita membaca profil tentang Kiva, kita akan mengevaluasi data Kiva yang disimpan pada file: loan_kiva.csv. Pertama Import data loan_kiva pada folder data_input kemudian diberi nama object sebagai kiva:

kiva <- read.csv("data_input/loan_kiva.csv")

Berikut ini adalah deskripsi dari variabel data kiva:

  • id: Unique ID for loan (Loan ID)
  • 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: Full country name of 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: Interval for the repayment of the loan

Cara inspect 6 data pertama

head(kiva)

Missing value

Cek kelengkapan data, apakah terdapat missing value/data kosong?

anyNA(kiva)
## [1] FALSE
colSums(is.na(kiva))
##                 id      funded_amount        loan_amount           activity 
##                  0                  0                  0                  0 
##             sector            country             region           currency 
##                  0                  0                  0                  0 
##         partner_id        posted_time        funded_time     term_in_months 
##                  0                  0                  0                  0 
##       lender_count repayment_interval 
##                  0                  0

Cek structure data

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          : chr  "Fruits & Vegetables" "Rickshaw" "Transportation" "Embroidery" ...
##  $ sector            : chr  "Food" "Transportation" "Transportation" "Arts" ...
##  $ country           : chr  "Pakistan" "Pakistan" "India" "Pakistan" ...
##  $ region            : chr  "Lahore" "Lahore" "Maynaguri" "Lahore" ...
##  $ currency          : chr  "PKR" "PKR" "INR" "PKR" ...
##  $ partner_id        : int  247 247 334 247 245 334 245 245 247 247 ...
##  $ posted_time       : chr  "2014-01-01 06:12:39" "2014-01-01 06:51:08" "2014-01-01 09:58:07" "2014-01-01 08:03:11" ...
##  $ funded_time       : chr  "2014-01-02 10:06:32" "2014-01-02 09:17:23" "2014-01-01 16:01:36" "2014-01-01 13:00:00" ...
##  $ 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: chr  "irregular" "irregular" "bullet" "irregular" ...

Perbaiki tipe data yang belum sesuai

  • posted time

  • funded time

Mengubah tipe data ke tipe date dapat menggunakan as.Date(). Pertama-tama, cek format tanggal pada variabel tersebut.

tail(kiva)

Format tanggal:

%Y: untuk tahun dengan 4 digit

%y: untuk tahun dengan 2 digit

%m: untuk bulan dengan angka

%b: untuk bulan dengan nama bulan “January”

%d: untuk tanggal 2 digit

Mengubah tipe date

kiva$posted_time <- as.Date(kiva$posted_time, format = "%Y-%m-%d %H:%M:%S")
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          : chr  "Fruits & Vegetables" "Rickshaw" "Transportation" "Embroidery" ...
##  $ sector            : chr  "Food" "Transportation" "Transportation" "Arts" ...
##  $ country           : chr  "Pakistan" "Pakistan" "India" "Pakistan" ...
##  $ region            : chr  "Lahore" "Lahore" "Maynaguri" "Lahore" ...
##  $ currency          : chr  "PKR" "PKR" "INR" "PKR" ...
##  $ partner_id        : int  247 247 334 247 245 334 245 245 247 247 ...
##  $ posted_time       : Date, format: "2014-01-01" "2014-01-01" ...
##  $ funded_time       : chr  "2014-01-02 10:06:32" "2014-01-02 09:17:23" "2014-01-01 16:01:36" "2014-01-01 13:00:00" ...
##  $ 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: chr  "irregular" "irregular" "bullet" "irregular" ...

Mengubah tipe data funded_time

kiva$funded_time <- as.Date(kiva$funded_time, format = "%Y-%m-%d %H:%M:%S")

Lakukan feature engineering, buatlah kolom baru bernama range_time yang diperoleh dari selisih funded_time dan posted_time

kiva$range_time <- kiva$funded_time - kiva$posted_time
head(kiva)

Membuat kolom funded_month dari variable funded_time

kiva$funded_month <- months(x = kiva$funded_time,abbreviate = TRUE)

Inspect data

head(kiva)

Untuk menampilkan variabel sesuai urutan

kiva[,c("loan_amount","funded_amount")]

Untuk memperoleh summary data gunakan function summary()

summary(kiva)
##        id          funded_amount       loan_amount         activity        
##  Min.   : 653047   Min.   :    25.0   Min.   :    25.0   Length:323279     
##  1st Qu.: 737420   1st Qu.:   275.0   1st Qu.:   275.0   Class :character  
##  Median : 827056   Median :   500.0   Median :   500.0   Mode  :character  
##  Mean   : 826774   Mean   :   828.8   Mean   :   828.8                     
##  3rd Qu.: 915291   3rd Qu.:  1000.0   3rd Qu.:  1000.0                     
##  Max.   :1002884   Max.   :100000.0   Max.   :100000.0                     
##     sector            country             region            currency        
##  Length:323279      Length:323279      Length:323279      Length:323279     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##    partner_id     posted_time          funded_time         term_in_months 
##  Min.   :  9.0   Min.   :2014-01-01   Min.   :2014-01-01   Min.   :  2.0  
##  1st Qu.:125.0   1st Qu.:2014-07-11   1st Qu.:2014-07-24   1st Qu.:  8.0  
##  Median :145.0   Median :2015-01-12   Median :2015-01-24   Median : 13.0  
##  Mean   :166.7   Mean   :2015-01-08   Mean   :2015-01-23   Mean   : 13.9  
##  3rd Qu.:199.0   3rd Qu.:2015-07-09   3rd Qu.:2015-07-24   3rd Qu.: 14.0  
##  Max.   :469.0   Max.   :2015-12-31   Max.   :2016-02-25   Max.   :158.0  
##   lender_count     repayment_interval  range_time       funded_month      
##  Min.   :   1.00   Length:323279      Length:323279     Length:323279     
##  1st Qu.:   8.00   Class :character   Class :difftime   Class :character  
##  Median :  15.00   Mode  :character   Mode  :numeric    Mode  :character  
##  Mean   :  22.85                                                          
##  3rd Qu.:  28.00                                                          
##  Max.   :2986.00

Mengubah tipe data funded_month menjadi factor

kiva$funded_month <- as.factor(kiva$funded_month)

Mengecek kolom funded_amount dan loan_amount memiliki data yang sama atau tidak

head(kiva)
nrow(kiva[kiva$funded_amount == kiva$loan_amount,])
## [1] 323279

Subsetting

  1. Menampilkan peminjam yang berasal dari sector retail dengan jumlah pinjaman lebih dari 1000 USD
levels(kiva$sector)
kiva[kiva$sector == "Retail" & kiva$loan_amount > 1000,]
  1. Apakah variabel funded_amount menampilkan informasi yang sama dengan variabel loan_amount untuk semua observasi?
nrow(kiva[kiva$funded_amount == kiva$loan_amount,])
## [1] 323279
  1. Menampilkan pinjaman yang memiliki waktu tunggu selama lebih dari 30 hari dengan nilai loan_amount lebih rendah dari 500 USD
kiva[kiva$range_time > 30 & kiva$loan_amount < 500,]
  1. Menampilkan variabel sector dan country yang memilih repayment_interval bullet
kiva[kiva$repayment_interval == "bullet", c("sector","country")]
  1. Menampilkan untuk peminjam yang berasal dari tipe activity fnb sebagai berikut
fnb <- c("Beverages","Cafe","Catering","Food", "Restaurant")
data2 <- kiva[kiva$activity %in% fnb,]
data3 <- droplevels(data2) #untuk membuang level yang jumlah observasinya 0
data3$activity <- as.factor(data3$activity)
levels(data3$activity)
## [1] "Beverages"  "Cafe"       "Catering"   "Food"       "Restaurant"

Ingin mengambil activity yang mengandung kata “Food” menggunakan function str_detect()

library(stringr)
kiva[str_detect(string = kiva$activity,pattern = "Food"),]

Sampling

Contoh cara membuat sampling:

dat <- c("Wisma Asia","BLI Sentul","Menara BCA", "Pondok Indah", "Bekasi")
set.seed(1)
sample(dat,2)
## [1] "Wisma Asia"   "Pondok Indah"

Kemudian kita lakukan sampling untuk 5 observasi data kiva

set.seed(1)
data_5 <- kiva[sample(nrow(kiva),5),]
data_5

Cara untuk menyimpan file .csv

write.csv(x = data_5,file = "data_input/datakiva5.csv",row.names = F)

Kemudian cara untuk import data

datakiva5 <- read.csv("data_input/datakiva5.csv")
datakiva5

Data Aggregation

Table

table() akan menampilkan frekuensi tiap kategori dari data

Menampilkan banyaknya pinjaman pada data kiva dari masing-masing sector

table(kiva$sector)
## 
##    Agriculture           Arts       Clothing   Construction      Education 
##          86509           5324          15840           3377          15752 
##  Entertainment           Food         Health        Housing  Manufacturing 
##            373          68752           3686          16318           3656 
##   Personal Use         Retail       Services Transportation      Wholesale 
##          12836          62118          20550           7831            357

Menampilkan proporsi dari masing-masing sector dan bulatkan dua angka dibelakang koma

round(prop.table(table(kiva$sector)),2)
## 
##    Agriculture           Arts       Clothing   Construction      Education 
##           0.27           0.02           0.05           0.01           0.05 
##  Entertainment           Food         Health        Housing  Manufacturing 
##           0.00           0.21           0.01           0.05           0.01 
##   Personal Use         Retail       Services Transportation      Wholesale 
##           0.04           0.19           0.06           0.02           0.00

Menampilkan proporsi tipe pembayaran yang dipilih peminjam

round(prop.table(table(kiva$repayment_interval)),2)
## 
##    bullet irregular   monthly 
##       0.1       0.4       0.5

Additional:

-Mengurutkan table dari yang paling besar hingga terkecil

Cara 1 Menggunakan sort

sort(round(prop.table(table(kiva$sector)),2), decreasing = T)
## 
##    Agriculture           Food         Retail       Services       Clothing 
##           0.27           0.21           0.19           0.06           0.05 
##      Education        Housing   Personal Use           Arts Transportation 
##           0.05           0.05           0.04           0.02           0.02 
##   Construction         Health  Manufacturing  Entertainment      Wholesale 
##           0.01           0.01           0.01           0.00           0.00

Cara2 Menggunakan order

sector <- round(prop.table(table(kiva$sector)),2)
table_sector <- data.frame(sector)
table_sector[order(table_sector$Freq,decreasing = T),]

Menampilkan 3 sector dengan frequency terbesar

head(table_sector[order(table_sector$Freq,decreasing = T),],3)

Menampilkan banyaknya peminjam berdasarkan sector dan bulan diberikan pinjaman

table(kiva$funded_month, kiva$sector)
##      
##       Agriculture Arts Clothing Construction Education Entertainment Food
##   Agu        7809  492     1249          247      1279            40 5338
##   Apr        6340  396     1214          262       917            18 5010
##   Des        8486  570     1623          322      2145            40 6800
##   Feb        5521  365     1118          262      1226            32 5233
##   Jan        5906  319     1341          254      1112            30 5344
##   Jul        8391  383     1477          315      1296            25 6168
##   Jun        7878  426     1166          299      1142            21 5274
##   Mar        8091  491     1425          335      1227            27 6703
##   Mei        7464  441     1342          288      1029            28 5400
##   Nov        6612  511     1305          237      1438            36 5936
##   Okt        7190  434     1367          277      1552            31 5953
##   Sep        6821  496     1213          279      1389            45 5593
##      
##       Health Housing Manufacturing Personal Use Retail Services Transportation
##   Agu    311    1278           277          935   4860     1615            533
##   Apr    197    1147           316          639   4487     1541            578
##   Des    583    1529           350         2412   5785     1965            721
##   Feb    239    1089           333          554   4333     1551            620
##   Jan    297    1089           234          857   4721     1690            676
##   Jul    335    1708           270          927   5972     1926            679
##   Jun    243    1497           303          633   4896     1707            625
##   Mar    299    1596           347          825   6077     2018            841
##   Mei    298    1433           288          574   4898     1790            635
##   Nov    293    1286           296         1821   5436     1560            646
##   Okt    317    1408           320         1387   5669     1639            664
##   Sep    274    1258           322         1272   4984     1548            613
##      
##       Wholesale
##   Agu        21
##   Apr        29
##   Des        34
##   Feb        30
##   Jan        20
##   Jul        30
##   Jun        40
##   Mar        34
##   Mei        27
##   Nov        30
##   Okt        42
##   Sep        20

Cross Tabulation

xtab() menampilkan jumlah variabel numerik untuk tiap kategori.

xtab(formula=..., data=...)

Ket:

  • formula = numerik ~ kategorik

  • data = data yang digunakan

  • Menampilkan loan_amount berdasarkan sector dan repayment_interval

xtabs(formula =  loan_amount ~ sector + repayment_interval,data = kiva)
##                 repayment_interval
## sector             bullet irregular  monthly
##   Agriculture    17032775  13625400 37422300
##   Arts             817925   1715400  3090800
##   Clothing         265100   7640325  9891725
##   Construction      82225    730000  2655725
##   Education        925125   2967025 11616425
##   Entertainment     30425     66075   307350
##   Food            1544775  28533200 28181500
##   Health            62525   1473250  2764825
##   Housing          299300   1185175  9972950
##   Manufacturing    217375    987525  2015125
##   Personal Use    1130575    757100  4566300
##   Retail          1559975  24151100 21039750
##   Services        1522500   5781500 13531175
##   Transportation   117550   1731575  3384825
##   Wholesale         57325    153225   336950
  • Menampilkan secara visual crosstab yang telat dibuat
plot(xtabs(formula =  loan_amount ~ sector + repayment_interval,data = kiva))

  • Menampilkan visualisasi dengan heatmap
heatmap(xtabs(formula =  loan_amount ~ sector + repayment_interval,data = kiva), 
        Rowv = NA, Colv = NA, cexCol = 0.8)

Aggregate

Gunakan fungsi aggregate() untuk aggregasi data lebih fleksibel, dapat menggunakan beragam nilai statistik.

aggreagete(formula=..., data=..., FUN=...)

Ket:

  • formula = numerik ~ kategorik
  • data = data yang ingin digunakan
  • FUN (function)= nilai statistik tertentu:
    • sum = jumlah
    • min = nilai min
    • max = nilai max
    • mean = rata rata
    • length = frequency
    • median = nilai tengah

Menampilkan rata-rata pinjaman berdasarkan sector dan repayment_interval

aggregate(loan_amount ~ sector + repayment_interval,data = kiva,FUN = mean)

Urutkan loan_amount dari yang paling besar hingga paling kecil

agg_sector <- aggregate(loan_amount ~ sector + repayment_interval,data = kiva,FUN = mean)
agg_sector[order(agg_sector$loan_amount,decreasing = T),]

Contoh Soal

1.Menampilkan rata rata pinjaman yang diberikan oleh kiva dari masing-masing sector

# assign <- 
mean_pinjaman <-  aggregate(loan_amount ~ sector, data = kiva, FUN = mean)
mean_pinjaman
  1. Urutkan nilai rata-rata pinjaman terbesar hingga terkecil dari setiap sector
sort_mean_pinj <-  mean_pinjaman[order(mean_pinjaman$loan_amount, decreasing = T), ]
sort_mean_pinj
  1. Menampilkan 3 sector yang memiliki rata-rata pinjaman terbesar dibandingkan sector lainnya
top3 <-  head(sort_mean_pinj,3)
top3
  1. Menampilkan jumlah pinjaman untuk sector Arts di setiap activity. Kemudian menampilkan 5 activity yang memiliki jumlah pinjaman paling besar
  • filter observasi sector == “Arts”
data_arts <- kiva[kiva$sector == "Arts",]
  • aggregate
data_arts_agg <- aggregate(loan_amount ~ activity,data = data_arts,FUN = sum)
  • urutkan
head(data_arts_agg[order(data_arts_agg$loan_amount, decreasing = T),],5)
  1. Dibulan apa kiva memberikan jumlah pinjaman paling besar?

-aggregate

data_loan <- aggregate(loan_amount ~ funded_month,data = kiva,FUN = sum)

-urutkan

head(data_loan[order(data_loan$loan_amount, decreasing = T),],1)
  1. Menampilkan 5 sector yang membutuhkan rata rata waktu tunggu paling lama dibandingkan sector lainnya untuk mendapatkan pinjaman
  • aggregate
waktu_tunggu <- aggregate(range_time ~ sector,data = kiva,FUN = mean)
  • Urutkan
head(waktu_tunggu[order(waktu_tunggu$range_time, decreasing = T),],5)
loan <- read.csv("data_input/loan.csv")
head(loan)

Buatlah 3 pertanyaan dari data loan, kemudian berikan insight dari output tersebut

  1. kelompok job yang paling banyak gagal bayar berdasarkan total_amount
  • filter untuk customer yg tipe default nya no
loan_no <- loan[loan$default == "no",]
  • aggregate jumlah amount berdasarkan job
loan_agg <- aggregate( amount ~ job,data = loan_no,FUN = sum)
  • urutkan dari amount terbesar
loan_agg[order(loan_agg$amount, decreasing = T),]
  1. Berapa banyak yang memiliki history nya critical dan purpose nya car
levels(loan$credit_history)
loan_critical <- loan[loan$credit_history == "critical" & loan$purpose == "car",]
loan_critical
mean(loan_critical$amount)
## [1] 3592.974
  1. Berapa jumlah pinjaman yang lebih dari 4 tahun, dan usia debitur > 50 tahun berdasarkan purpose nya

filter kondisi months_loan_duration > 48, age > 50

loan_3 <- loan[ loan$months_loan_duration > 48 & loan$age > 50,]
loan_3
aggregate(amount ~ purpose,data = loan_3,FUN = sum)

Ketika ingin mengubah isi purpose car0 menjadi car

library(stringr)
loan$purpose <- str_replace(string = loan$purpose,pattern = "car0", replacement = "car")
loan$purpose <- as.factor(loan$purpose)
levels(loan$purpose)
## [1] "business"             "car"                  "education"           
## [4] "furniture/appliances" "renovations"

TAHAP 2

Kita sudah sampai pada tahap akhir dalam evaluasi data KIVA. Sebagai tambahan, untuk menjalankan chunk bisa gunakan shortcut: ctrl + alt + p.

Membuat function

Membuat function head dan tail

headtail <- function(x){
  dat_head <- head(x)
  dat_tail <- tail(x)
  
  rbind(dat_head, dat_tail)
}
headtail(x = kiva)

Membuat daily report

dailyreport <- function(){
  kiva <- read.csv("data_input/loan_kiva.csv")
  
  kiva$posted_time <- as.Date(kiva$posted_time, format = "%Y-%m-%d %H:%M:%S")
  
  kiva$funded_time <- as.Date(kiva$funded_time, format = "%Y-%m-%d %H:%M:%S")
  
  kiva$range_time <- kiva$funded_time - kiva$posted_time
  
  result <- aggregate(range_time ~ sector,data = kiva,FUN = mean)
  
  head(result[order(result$range_time, decreasing = T),],5)
  
}

dailyreport()

Menjalankan function dari rscript

source("dailyreport.R")
dailyreport()

parameter pada chunk:

  • echo:TRUE, maka chunk akan dijalankan namun tidak ditampilkan pada html.

  • warning: FALSE, tidak akan memunculkan warning messages.

  • include: TRUE, chunk akan menjalankan dan menampilkan outputnya pada html.

  • eval: FALSE, tidak akan menjalankan chunk tersebut.

Custom RMarkdown

Setelah melakukan evaluasi pada data KIVA seperti yang dilakukan di atas, perlu juga dilakukan custom RMarkdown untuk mempercantik laporan yang akan ditampikan. Untuk custom RMarkdown, bisa lihat petunjuknya di :
Help - Cheatsheets - RMarkdown Cheatsheet

Sebagai tambahan, berikut link buku untuk lebih memperdalam mengenai RMarkdown

Reference:
1. https://bookdown.org/ndphillips/YaRrr/
2. https://r4ds.had.co.nz/
3. Date Formats in R
4. foragoodstrftime
5. RMarkdown
6. Template Reporting