email             :
ntraktir          : https://trakteer.id/contekansial
nyawer          : https://saweria.co/contekansial
github            : https://bit.ly/origin-AL-GitHub
youtube         : https://bit.ly/origin-AL-youtube



1 Pendahuluan

1.1 Pengantar

Perusahaan AL.Loan merupakan perusahaan yang bergerak di bidang layanan pinjaman usaha bagi sektor UMKM. Karena adanya pandemik ini, perusahaan berusaha memberikan pelayanan berupa keringanan pinjaman bagi pelanggan yang disebut sebagai rekomendasi tindak lanjut. Pemberian rekomendasi tindak lanjut pada pelanggan ini didasari pada kriteria tertentu, dan perlu ditentukan faktor-faktor apa saja yang berpengaruh sehingga pelanggan mendapatkan treatment tertentu yang masuk dalam rekomendasi tindak lanjut program dari perusahaan.

Tujuan Project:

  • Klasifikasi nasabah yang akan dimasukkan pada rekomendasi tindak lanjut. Pada kelas target rekomendasi tindak lanjut ini sendiri terdiri dari beberapa kelas seperti restrukturisasi dan angsuran biasa.

Model:

  • Regresi multinomial.

Referensi model (Ref):

  • Kelas pada rekomendasi tindak lanjut yang memiliki banyak pelanggan.

Data:

  • Data yang digunakan terdiri dari 1000 baris.

Tujuan Pembelajaran dari Project ini:

  • Memahami dasar-dasar syntax R untuk keperluan statistika dasar dan dasar-dasar machine learning.
  • Memberikan gambaran secara umum pemodelan dengan menggunakan R.

Catatan : Apabila ingin melakukan eksplorasi pada R yang terpasang pada komputer, dapat ditambahkan perintah setwd("path file tempat kamu bekerja") pada tiap baris pertama editor di R-Studio kamu.

1.2 Membaca Data External

Hal yang pertama dilakukan adalah membaca dataset yang telah dipersiapkan. Dengan menggunakan fungsi bawaan R bacalah dataset yang berformat csv tersebut !

Begini :

#membuat variabel dataset
AL.Loan = read.csv("https://storage.googleapis.com/dqlab-dataset/project.csv")

1.3 Inspeksi Data

Setelah data berhasil di import, cobalah kamu untuk menginspeksi dataset dengan jalan:

  1. Melihat beberapa baris pertama data tersebut, apa saja yang ditunjukkannya dan
  2. Tampilkan tipe data dari setiap kolom.

Begini :

# Enam baris teratas data
head(AL.Loan, 9)
  X              NAMA_NASABAH NOMOR_KONTRAK        DOMISILI         KARAKTER
1 0    YOLI SEPINA NAINGGOLAN             0     MASIH TETAP       KOOPERATIF
2 1            ERWIN NASUTION             1     MASIH TETAP TIDAK KOOPERATIF
3 2                     HUSIN             2     MASIH TETAP TIDAK KOOPERATIF
4 3                 HARITSYAH             3 PINDAH PERMANEN       KOOPERATIF
5 4         HARIRI PANGGABEAN             4     MASIH TETAP TIDAK KOOPERATIF
6 5     JHON PREDDY HUTABARAT             5     MASIH TETAP       KOOPERATIF
7 6          NURDINA BATUBARA             6     MASIH TETAP       KOOPERATIF
8 7 SAUT PARDAMEAN HUTAGALUNG             7     MASIH TETAP       KOOPERATIF
9 8          SANTYO HUTABARAT             8     MASIH TETAP       KOOPERATIF
               PROFESI KONDISI_USAHA KONDISI_JAMINAN STATUS PRODUK       PYD
1     IBU RUMAH TANGGA             2            Baik      2      3  30000000
2              NELAYAN             3           Rusak      8      3  10000000
3              LAINNYA             3            Baik      8      3  60000000
4                  PNS             1           Rusak      7      3  90000000
5 WIRAUSAHA / PEDAGANG             1            Baik      8      3 150000000
6 WIRAUSAHA / PEDAGANG             1            Baik      7      3  40000000
7              LAINNYA             3            Baik      7      3  60000000
8              LAINNYA             2            Baik      7      3   7500000
9              LAINNYA             2            Baik      7      3  45000000
  TENOR      OSL KEWAJIBAN          KOLEKTIBILITAS COUNT_SURVEY
1    24 28750000   4896841 DALAM PENGAWASAN KHUSUS            1
2    12  2040693         0                   MACET            1
3    24        0         0                   MACET            1
4    18        0         0                   MACET            1
5    18 19844807         0                   MACET            1
6    36 27298726   2208516 DALAM PENGAWASAN KHUSUS            1
7    36 19999200   6946592 DALAM PENGAWASAN KHUSUS            2
8     4  7500000         0                  LANCAR            2
9    24 45000000         0                  LANCAR            1
  REKOMENDASI_TINDAK_LANJUT
1            Angsuran Biasa
2                 Penarikan
3                 Penarikan
4            Angsuran Biasa
5                 Penarikan
6           Restrukturisasi
7           Restrukturisasi
8           Restrukturisasi
9           Restrukturisasi
# Tampilkan tipe data setiap kolomnya
str(AL.Loan)
'data.frame':   1000 obs. of  17 variables:
 $ X                        : int  0 1 2 3 4 5 6 7 8 9 ...
 $ NAMA_NASABAH             : chr  "YOLI SEPINA NAINGGOLAN" "ERWIN NASUTION" "HUSIN" "HARITSYAH" ...
 $ NOMOR_KONTRAK            : int  0 1 2 3 4 5 6 7 8 9 ...
 $ DOMISILI                 : chr  "MASIH TETAP" "MASIH TETAP" "MASIH TETAP" "PINDAH PERMANEN" ...
 $ KARAKTER                 : chr  "KOOPERATIF" "TIDAK KOOPERATIF" "TIDAK KOOPERATIF" "KOOPERATIF" ...
 $ PROFESI                  : chr  "IBU RUMAH TANGGA" "NELAYAN" "LAINNYA" "PNS" ...
 $ KONDISI_USAHA            : int  2 3 3 1 1 1 3 2 2 3 ...
 $ KONDISI_JAMINAN          : chr  "Baik" "Rusak" "Baik" "Rusak" ...
 $ STATUS                   : int  2 8 8 7 8 7 7 7 7 3 ...
 $ PRODUK                   : int  3 3 3 3 3 3 3 3 3 3 ...
 $ PYD                      : int  30000000 10000000 60000000 90000000 150000000 40000000 60000000 7500000 45000000 50000000 ...
 $ TENOR                    : int  24 12 24 18 18 36 36 4 24 36 ...
 $ OSL                      : int  28750000 2040693 0 0 19844807 27298726 19999200 7500000 45000000 6944100 ...
 $ KEWAJIBAN                : int  4896841 0 0 0 0 2208516 6946592 0 0 7730984 ...
 $ KOLEKTIBILITAS           : chr  "DALAM PENGAWASAN KHUSUS" "MACET" "MACET" "MACET" ...
 $ COUNT_SURVEY             : int  1 1 1 1 1 1 2 2 1 1 ...
 $ REKOMENDASI_TINDAK_LANJUT: chr  "Angsuran Biasa" "Penarikan" "Penarikan" "Angsuran Biasa" ...

1.4 Statistik Deskriptif Data

Melalui R kita dapat menampilkan statistik deskriptif pada data yang dimiliki. Jika diinginkan lebih spesifik maka dapat dilakukan pada kolom tertentu pada tabel data yang kita punya. Tentunya kita dapat menggunakan accessor $ untuk memilih kolom yang diinginkan dari data.

Begini :

summary(AL.Loan$OSL)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
        0   3999950   8687350  26562373  32082900 440932336 

Kamu ingin menampilkan statistik deskriptif untuk seluruh kolom.

Begini :

summary(AL.Loan)
       X         NAMA_NASABAH       NOMOR_KONTRAK     DOMISILI        
 Min.   :  0.0   Length:1000        Min.   :  0.0   Length:1000       
 1st Qu.:249.8   Class :character   1st Qu.:249.8   Class :character  
 Median :499.5   Mode  :character   Median :499.5   Mode  :character  
 Mean   :499.5                      Mean   :499.5                     
 3rd Qu.:749.2                      3rd Qu.:749.2                     
 Max.   :999.0                      Max.   :999.0                     
   KARAKTER           PROFESI          KONDISI_USAHA   KONDISI_JAMINAN   
 Length:1000        Length:1000        Min.   :1.000   Length:1000       
 Class :character   Class :character   1st Qu.:2.000   Class :character  
 Mode  :character   Mode  :character   Median :2.000   Mode  :character  
                                       Mean   :2.273                     
                                       3rd Qu.:3.000                     
                                       Max.   :3.000                     
     STATUS          PRODUK           PYD                TENOR      
 Min.   :2.000   Min.   : 3.00   Min.   :   500000   Min.   : 3.00  
 1st Qu.:3.000   1st Qu.: 3.00   1st Qu.:  8000000   1st Qu.:12.00  
 Median :7.000   Median : 3.00   Median : 15000000   Median :18.00  
 Mean   :5.379   Mean   :12.45   Mean   : 38537508   Mean   :20.75  
 3rd Qu.:7.000   3rd Qu.: 7.00   3rd Qu.: 50000000   3rd Qu.:24.00  
 Max.   :8.000   Max.   :77.00   Max.   :500000000   Max.   :48.00  
      OSL              KEWAJIBAN         KOLEKTIBILITAS      COUNT_SURVEY  
 Min.   :        0   Min.   :        0   Length:1000        Min.   :1.000  
 1st Qu.:  3999950   1st Qu.:   687487   Class :character   1st Qu.:1.000  
 Median :  8687350   Median :  2008974   Mode  :character   Median :1.000  
 Mean   : 26562373   Mean   :  5663981                      Mean   :1.036  
 3rd Qu.: 32082900   3rd Qu.:  4823198                      3rd Qu.:1.000  
 Max.   :440932336   Max.   :400900000                      Max.   :2.000  
 REKOMENDASI_TINDAK_LANJUT
 Length:1000              
 Class :character         
 Mode  :character         
                          
                          
                          

1.5 Menghapus Kolom

Pada data yang kamu miliki, sebenarnya kamu tidak memerlukan NAMA_NASABAH untuk diberikan rekomendasi. Atau dengan kata lain penanda pelanggan untuk diberikan rekomendasi cukup dengan melihat NOMOR_KONTRAK pelanggan itu saja.

Hapuslah kolom X dan NAMA_NASABAH pada data yang kamu miliki dan cetak kembali nama kolom yang tersedia pada data.

Begini :

#menghapus kolom yang tidak diperlukan
data.guna = AL.Loan[-c(1,2)]

#menampilkan nama kolom
colnames(data.guna)
 [1] "NOMOR_KONTRAK"             "DOMISILI"                 
 [3] "KARAKTER"                  "PROFESI"                  
 [5] "KONDISI_USAHA"             "KONDISI_JAMINAN"          
 [7] "STATUS"                    "PRODUK"                   
 [9] "PYD"                       "TENOR"                    
[11] "OSL"                       "KEWAJIBAN"                
[13] "KOLEKTIBILITAS"            "COUNT_SURVEY"             
[15] "REKOMENDASI_TINDAK_LANJUT"

1.6 Konversi Data

Seperti yang diketahui ketika data ditarik dari suatu sumber terkadang ada kondisi tipe data tidak dengan tepat direpresentasikan. Misalkan semua record/baris pada suatu kolom berisi seharusnya data numerik akan tetapi disajikan didalam suatu karakter angka.

R sendiri memiliki fungsi sapply yang dapat digunakan untuk mengkoversi tipe data. Dalam hal ini fungsi sapply menerima input/argumen fungsi berupa list, vector, atau data.frame dan mengembalikan/menghasilkan output berupa vector atau matrix.

Cobalah untuk meninjau kembali kolom PRODUK, PYD, TENOR, dan OSL apakah perlu dikonversikan menjadi bertipe numerik atau tidak.

Begini :

cek.1 <- data.guna[, 8:11]
head(cek.1, 9)
  PRODUK       PYD TENOR      OSL
1      3  30000000    24 28750000
2      3  10000000    12  2040693
3      3  60000000    24        0
4      3  90000000    18        0
5      3 150000000    18 19844807
6      3  40000000    36 27298726
7      3  60000000    36 19999200
8      3   7500000     4  7500000
9      3  45000000    24 45000000

1.7 Pemilihan Data Kategorik

Tentu saja kamu menyadari bahwa data yang dimiliki ada yang bersifat kategorik. Data kategorik dapat dipilih melalui kolom-kolom KONDISI_USAHA, KONDISI_JAMINAN, REKOMENDASI_TINDAK_LANJUT.

Begini :

AL.Loan_kategorik = data.guna[,c("KONDISI_USAHA", "KONDISI_JAMINAN", "REKOMENDASI_TINDAK_LANJUT")]
head(AL.Loan_kategorik, 9)
  KONDISI_USAHA KONDISI_JAMINAN REKOMENDASI_TINDAK_LANJUT
1             2            Baik            Angsuran Biasa
2             3           Rusak                 Penarikan
3             3            Baik                 Penarikan
4             1           Rusak            Angsuran Biasa
5             1            Baik                 Penarikan
6             1            Baik           Restrukturisasi
7             3            Baik           Restrukturisasi
8             2            Baik           Restrukturisasi
9             2            Baik           Restrukturisasi

Mengubah kolom REKOMENDASI_TINDAK_LANJUT sebagai faktor (menggunakan as.factor)

Begini :

data.guna$REKOMENDASI_TINDAK_LANJUT = as.factor(data.guna$REKOMENDASI_TINDAK_LANJUT)

str(data.guna$REKOMENDASI_TINDAK_LANJUT)
 Factor w/ 4 levels "Angsuran Biasa",..: 1 3 3 1 3 4 4 4 4 1 ...

Uji chi-square dapat digunakan untuk melihat hubungan antar variabel kategorik.

Begini :

#melihat hubungan KONDISI_USAHA dengan REKOMENDASI_TINDAK_LANJUT
chisq.test(AL.Loan_kategorik$KONDISI_USAHA, AL.Loan_kategorik$REKOMENDASI_TINDAK_LANJUT)

    Pearson's Chi-squared test

data:  AL.Loan_kategorik$KONDISI_USAHA and AL.Loan_kategorik$REKOMENDASI_TINDAK_LANJUT
X-squared = 129.82, df = 6, p-value < 2.2e-16
#melihat hubungan KONDISI_JAMINAN dengan REKOMENDASI_TINDAK_LANJUT
chisq.test(AL.Loan_kategorik$KONDISI_JAMINAN, AL.Loan_kategorik$REKOMENDASI_TINDAK_LANJUT)

    Pearson's Chi-squared test

data:  AL.Loan_kategorik$KONDISI_JAMINAN and AL.Loan_kategorik$REKOMENDASI_TINDAK_LANJUT
X-squared = 162.87, df = 9, p-value < 2.2e-16

Jika nilai p < 0.05, maka tolak H0 (tidak ada hubungan antar variabel). Tampak dari hasil kalau nilai p < 0.05, artinya ada hubungan antara kedua kolom dengan REKOMENDASI_TINDAK_LANJUT

1.8 Korelasi antar Variabel Data

Selain melihat hubungan pada data yang bersifat kategorikal, kita juga bisa melihat hubungan antar variabel numerikal. Ya. Kita akan menggunakan korelasi.

Begini :

library("corrplot")
library("ggcorrplot")

M = data.guna[,8:11]

# Library corrplot
# -- Pearson correlation
par(mfrow=c(1,1))
corrplot(cor(M), type="upper", order="hclust")

corrplot(cor(M), method="square", type="upper")

corrplot(cor(M), method="number", type="lower")

corrplot(cor(M), method="ellipse")

# -- Kendall correlation
par(mfrow=c(1,1))
corrplot(cor(M, method="kendall"), type="upper", order="hclust")

corrplot(cor(M, method="kendall"), method="square", type="upper")

corrplot(cor(M, method="kendall"), method="number", type="lower")

corrplot(cor(M, method="kendall"), method="ellipse")

# Library ggcorrplot
corr = round(cor(M), 1) # Pearson correlation
ggcorrplot(round(cor(M), 1),
             hc.order = TRUE,
             type = "lower",
             lab = TRUE,
             lab_size = 3,
             method="circle",
             colors = c("tomato2", "white", "springgreen3"),
             title="Correlogram of Data Nasabah",
             ggtheme=theme_bw)


2 Pemilihan Variabel

2.1 Pemilihan Fitur (Independent Variable/Input)

Dalam melakukan pemodelan tentu kita perlu meninjau variabel-variabel apa saja yang berpengaruh pada model kita, khususnya pada klasifikasi. Pada kesempatan ini kita menggunakan model Regresi Multinomial.

Lalu bagaimana menentukan variabel apa saja yang berpengaruh tersebut?

Ada banyak alternatif, salah satunya ialah Information Gain. Melalui information gain diambil nilai importance variable yang lebih dari 0.02 (kamu dapat eksplorasi apa yang terjadi apabila kita mengambil nilai yang kurang dari 0.02).

Berikut hasil dari information gain:

                  attr_importance
KONDISI_JAMINAN     0.038889946
STATUS              0.109539204
KEWAJIBAN           0.002414449
OSL                 0.006693011
KOLEKTIBILITAS      0.084934084

Lakukanlah syntax untuk memilih kolom-kolom yang akan diproses !

Begini :

colnames(data.guna)
 [1] "NOMOR_KONTRAK"             "DOMISILI"                 
 [3] "KARAKTER"                  "PROFESI"                  
 [5] "KONDISI_USAHA"             "KONDISI_JAMINAN"          
 [7] "STATUS"                    "PRODUK"                   
 [9] "PYD"                       "TENOR"                    
[11] "OSL"                       "KEWAJIBAN"                
[13] "KOLEKTIBILITAS"            "COUNT_SURVEY"             
[15] "REKOMENDASI_TINDAK_LANJUT"
#memilih kolom yang akan diproses
data.pilih =
data.guna[,c("KARAKTER","KONDISI_USAHA","KONDISI_JAMINAN","STATUS","KEWAJIBAN","OSL","KOLEKTIBILITAS","REKOMENDASI_TINDAK_LANJUT")]

Jika pada data terdapat NA value, nilai tersebut dapat pula untuk dipangkas.

Begini :

data.non.na = na.omit(data.pilih)
head(data.non.na, 9)
          KARAKTER KONDISI_USAHA KONDISI_JAMINAN STATUS KEWAJIBAN      OSL
1       KOOPERATIF             2            Baik      2   4896841 28750000
2 TIDAK KOOPERATIF             3           Rusak      8         0  2040693
3 TIDAK KOOPERATIF             3            Baik      8         0        0
4       KOOPERATIF             1           Rusak      7         0        0
5 TIDAK KOOPERATIF             1            Baik      8         0 19844807
6       KOOPERATIF             1            Baik      7   2208516 27298726
7       KOOPERATIF             3            Baik      7   6946592 19999200
8       KOOPERATIF             2            Baik      7         0  7500000
9       KOOPERATIF             2            Baik      7         0 45000000
           KOLEKTIBILITAS REKOMENDASI_TINDAK_LANJUT
1 DALAM PENGAWASAN KHUSUS            Angsuran Biasa
2                   MACET                 Penarikan
3                   MACET                 Penarikan
4                   MACET            Angsuran Biasa
5                   MACET                 Penarikan
6 DALAM PENGAWASAN KHUSUS           Restrukturisasi
7 DALAM PENGAWASAN KHUSUS           Restrukturisasi
8                  LANCAR           Restrukturisasi
9                  LANCAR           Restrukturisasi

2.2 Transformasi Data

Untuk memberikan performa model yang baik, maka pada data kita perlu dilakukan treatment tertentu, misalnya dilakukan scalling atau dilakukan pengelompokan data atau disebut juga bucketing.

Begini :

data.pilih.baru = data.pilih
data.pilih.baru$KEWAJIBAN = scale(data.pilih.baru$KEWAJIBAN)[, 1]
data.pilih.baru$OSL = scale(data.pilih.baru$OSL)[, 1]
data.pilih.baru$KEWAJIBAN = cut(data.pilih.baru$KEWAJIBAN, breaks = c(-0.354107,5,15,30))
data.pilih.baru$KEWAJIBAN = as.factor(data.pilih.baru$KEWAJIBAN)
data.pilih.baru$OSL = cut(data.pilih.baru$OSL, breaks = c(-0.60383,3,10,15))
data.pilih.baru$OSL = as.factor(data.pilih.baru$OSL)
data.pilih.baru = na.omit(data.pilih.baru)

head(data.pilih.baru, 9)
          KARAKTER KONDISI_USAHA KONDISI_JAMINAN STATUS  KEWAJIBAN        OSL
1       KOOPERATIF             2            Baik      2 (-0.354,5] (-0.604,3]
2 TIDAK KOOPERATIF             3           Rusak      8 (-0.354,5] (-0.604,3]
3 TIDAK KOOPERATIF             3            Baik      8 (-0.354,5] (-0.604,3]
4       KOOPERATIF             1           Rusak      7 (-0.354,5] (-0.604,3]
5 TIDAK KOOPERATIF             1            Baik      8 (-0.354,5] (-0.604,3]
6       KOOPERATIF             1            Baik      7 (-0.354,5] (-0.604,3]
7       KOOPERATIF             3            Baik      7 (-0.354,5] (-0.604,3]
8       KOOPERATIF             2            Baik      7 (-0.354,5] (-0.604,3]
9       KOOPERATIF             2            Baik      7 (-0.354,5] (-0.604,3]
           KOLEKTIBILITAS REKOMENDASI_TINDAK_LANJUT
1 DALAM PENGAWASAN KHUSUS            Angsuran Biasa
2                   MACET                 Penarikan
3                   MACET                 Penarikan
4                   MACET            Angsuran Biasa
5                   MACET                 Penarikan
6 DALAM PENGAWASAN KHUSUS           Restrukturisasi
7 DALAM PENGAWASAN KHUSUS           Restrukturisasi
8                  LANCAR           Restrukturisasi
9                  LANCAR           Restrukturisasi

2.3 Training Data

Sebelum masuk pada pemodelan, kita perlu memisahkan data kita menjadi training dan testing (ada pula yang membaginya menjadi training, testing, dan validasi).

Tujuan dari pemisahan data ini ialah untuk melihat kemampuan model kita untuk melakukan prediksi sebagaimana tujuan dari pemodelan kita.

Begini :

library("caret")
library("lattice")

index = createDataPartition(data.pilih.baru$REKOMENDASI_TINDAK_LANJUT, p = .95, list = FALSE)
training = data.pilih.baru[index, ]
testing = data.pilih.baru[-index, ]

dim(training)
[1] 952   8
dim(testing)
[1] 48  8

2.4 Pemodelan (Modelling)

Sekarang kita siap untuk masuk pada pemodelan.

Ingat bahwa kita menggunakan Model Regresi Multinomial, dimana kita perlu menentukan referensi dari kelas target.

Referensi kelas target ini ialah kelas yang memiliki jumlah anggota terbanyak.

Begini :

train2 = training
# Setting the reference
train2$REKOMENDASI_TINDAK_LANJUT = relevel(train2$REKOMENDASI_TINDAK_LANJUT, ref = "Angsuran Biasa")
# training the model
require(nnet)
# Training the multinomial model
multinom_model = multinom(REKOMENDASI_TINDAK_LANJUT ~ ., data = train2)
# weights:  64 (45 variable)
initial  value 1319.752232 
iter  10 value 746.668519
iter  20 value 619.362692
iter  30 value 614.634633
iter  40 value 614.357939
iter  50 value 614.348164
iter  60 value 614.347802
final  value 614.347776 
converged
# Checking the model
summary(multinom_model)
Call:
multinom(formula = REKOMENDASI_TINDAK_LANJUT ~ ., data = train2)

Coefficients:
                 (Intercept) KARAKTERTIDAK KOOPERATIF KONDISI_USAHA
Diskon Pelunasan   -3.241859                 1.836693    -0.7802720
Penarikan          -7.073783                 3.981080     0.6797721
Restrukturisasi    -4.134044                -2.150295     0.9704772
                 KONDISI_JAMINANHilang KONDISI_JAMINANPindah Tangan
Diskon Pelunasan           -18.8535350                  -27.7138938
Penarikan                    2.0789853                    0.4989398
Restrukturisasi              0.6096445                  -13.6938543
                 KONDISI_JAMINANRusak     STATUS KEWAJIBAN(5,15]
Diskon Pelunasan          -28.1213391 0.10191636               0
Penarikan                  -2.1864719 0.07743757               0
Restrukturisasi             0.1452639 0.32804571               0
                 KEWAJIBAN(15,30]   OSL(3,10] OSL(10,15]
Diskon Pelunasan        -3.511732   2.9695155          0
Penarikan                0.666806 -25.0833604          0
Restrukturisasi         26.498000   0.3203163          0
                 KOLEKTIBILITASDIRAGUKAN KOLEKTIBILITASKURANG LANCAR
Diskon Pelunasan               2.8933707                   0.2966154
Penarikan                      4.2629206                   0.9533702
Restrukturisasi               -0.5107179                  -0.1327158
                 KOLEKTIBILITASLANCAR KOLEKTIBILITASMACET
Diskon Pelunasan            0.1820101            0.541061
Penarikan                 -35.1136677            1.239402
Restrukturisasi             0.8900466           -3.300281

Std. Errors:
                 (Intercept) KARAKTERTIDAK KOOPERATIF KONDISI_USAHA
Diskon Pelunasan   1.0969389                0.9093564     0.3860147
Penarikan          1.1972329                0.6393468     0.3754234
Restrukturisasi    0.3551196                0.7868614     0.1036833
                 KONDISI_JAMINANHilang KONDISI_JAMINANPindah Tangan
Diskon Pelunasan          5.897717e-10                 1.965332e-13
Penarikan                 1.462610e+00                 6.570442e-01
Restrukturisasi           1.197129e+00                 6.208012e-07
                 KONDISI_JAMINANRusak     STATUS KEWAJIBAN(5,15]
Diskon Pelunasan         3.991998e-13 0.14095662    4.655031e-16
Penarikan                1.726863e+00 0.10292567             NaN
Restrukturisasi          1.197202e+00 0.03728375    0.000000e+00
                 KEWAJIBAN(15,30]    OSL(3,10]   OSL(10,15]
Diskon Pelunasan     7.245841e-15 1.044097e+00          NaN
Penarikan            4.073940e-16 2.614797e-13 4.249707e-16
Restrukturisasi      5.946145e-13 6.303926e-01 0.000000e+00
                 KOLEKTIBILITASDIRAGUKAN KOLEKTIBILITASKURANG LANCAR
Diskon Pelunasan               0.9318819                   0.7405701
Penarikan                      0.8644920                   0.6687520
Restrukturisasi                0.6175803                   0.1917806
                 KOLEKTIBILITASLANCAR KOLEKTIBILITASMACET
Diskon Pelunasan         9.489292e-01           1.2312144
Penarikan                2.467085e-16           0.7158318
Restrukturisasi          2.159505e-01           1.0786995

Residual Deviance: 1228.696 
AIC: 1306.696 
#converting the coefficients to odds by taking the exponential of the coefficients.
exp(coef(multinom_model))
                  (Intercept) KARAKTERTIDAK KOOPERATIF KONDISI_USAHA
Diskon Pelunasan 0.0390911716                6.2757472     0.4582813
Penarikan        0.0008470231               53.5748651     1.9734279
Restrukturisasi  0.0160179680                0.1164497     2.6392037
                 KONDISI_JAMINANHilang KONDISI_JAMINANPindah Tangan
Diskon Pelunasan          6.486550e-09                 9.204683e-13
Penarikan                 7.996351e+00                 1.646974e+00
Restrukturisasi           1.839777e+00                 1.129366e-06
                 KONDISI_JAMINANRusak   STATUS KEWAJIBAN(5,15] KEWAJIBAN(15,30]
Diskon Pelunasan         6.124316e-13 1.107291               1     2.984518e-02
Penarikan                1.123123e-01 1.080515               1     1.948006e+00
Restrukturisasi          1.156345e+00 1.388252               1     3.220589e+11
                    OSL(3,10] OSL(10,15] KOLEKTIBILITASDIRAGUKAN
Diskon Pelunasan 1.948248e+01          1              18.0540616
Penarikan        1.277718e-11          1              71.0170917
Restrukturisasi  1.377563e+00          1               0.6000647
                 KOLEKTIBILITASKURANG LANCAR KOLEKTIBILITASLANCAR
Diskon Pelunasan                    1.345298         1.199626e+00
Penarikan                           2.594439         5.627660e-16
Restrukturisasi                     0.875714         2.435243e+00
                 KOLEKTIBILITASMACET
Diskon Pelunasan          1.71782853
Penarikan                 3.45354662
Restrukturisasi           0.03687282
head(round(fitted(multinom_model), 2))
  Angsuran Biasa Diskon Pelunasan Penarikan Restrukturisasi
1           0.81             0.01      0.00            0.17
2           0.79             0.00      0.20            0.02
3           0.30             0.03      0.67            0.01
4           0.98             0.00      0.00            0.02
5           0.50             0.22      0.29            0.00
6           0.69             0.03      0.00            0.29
# Predicting the values for train dataset
train2$ClassPredicted = predict(multinom_model, newdata = train2, "class")
train_prob = predict(multinom_model, newdata = train2, "probs")
df = train_prob
df$max=apply(df,1, max)
train2$score = df$max
test_prob = predict(multinom_model, newdata = testing, "probs")
df2 = test_prob
df2$max=apply(df2,1, max)

Untuk keperluan tertentu, kita perlu mengetahui peluang dari tiap baris data (perwakilan dari pelanggan) untuk masuk pada kelas target tertentu.

Tujuannya ialah untuk melihat seberapa pengaruh model untuk melakukan klasifikasi. Selain itu bisa juga dari sudut pandang bisnis, dalam kasus real penentuan threshold pada nilai peluang juga dikaitkan dengan beberapa faktor, misalnya revenue pelanggan.

Cobalah lihat nilai peluang bahwa suatu pelanggan masuk pada kelas target tertentu !

Begini :

#membuat tabel klasifikasi
tab_train = table(train2$REKOMENDASI_TINDAK_LANJUT, train2$ClassPredicted)
round((sum(diag(tab_train))/sum(tab_train))*100,4)
[1] 66.9118
testing$ClassPredicted = predict(multinom_model, newdata = testing, "class")
testing$score = df2$max
tab_test = table(testing$REKOMENDASI_TINDAK_LANJUT, testing$ClassPredicted)
round((sum(diag(tab_test))/sum(tab_test))*100,4)
[1] 68.75

3 Kuis

3.1 I

Misalkan kamu diberikan vektor A = c(4, 6, 9, 13) dan B = c(5, 6, 7, 8).

Pilihlah kode di bawah ini untuk menunjukkan entry yang ada pada vektor A tidak terdapat pada vektor B.

Pilihan

  • unique(A, B)
  • diff(A, B)
  • x setdiff(A, B)
  • tidak ada yang benar

Gini :

A = c(4, 6, 9, 13)
B = c(5, 6, 7, 8)

unique(A, B)
[1]  4  6  9 13
setdiff(A, B)
[1]  4  9 13

3.2 II

Diberikan data frame berikut:

user_id Jenis.Kelamin Pekerjaan Pendidikan
1893468 Laki -laki Dosen S2
1893763 Perempuan Buruh SMA
1793624 Laki -laki Dosen S3
1657829 Laki -laki Guru S1

Manakah kode pada pilihan jawaban berikut yang dapat digunakan untuk memilih data di atas dengan Jenis.Kelamin “Lak-laki” dan dan Pekerjaan “Dosen” ?

Pilihan

  • subset(df, Jenis.Kelamin == "Laki-laki" & Pekerjaan == "Dosen")
  • filter(df, Jenis.Kelamin == "Laki-laki", Pekerjaan == "Dosen")
  • Hanya A saja
  • x A dan B benar

3.3 III

Kamu memiliki vektor A = c(4, "NA", 9).

Apakah output dari sum(is.na(A)) ?

Pilihan

  • 5
  • 1
  • x 0
  • tidak ada yang benar

Gini :

A = c(4, "NA", 9)

sum(is.na(A))
[1] 0

3.4 IV

Ukuran keragaman 2 peubah/variabel/feature pada suatu dataset dapat ditinjau dengan cara :

Pilihan

  • Melihat grafik boxplot
  • x Melihat grafik kovariansi
  • Melihat grafik variansi
  • Melihat grafik biplot

3.5 V

Ukuran variabilitas dari suatu data dapat ditinjau melalui :

Pilihan

  • Variansi dan standar deviasi
  • Jangkauan dan jangkauan antar kuartil
  • Jangkauan, jangkauan antar kuartil, variansi, standar deviasi, koefisien variasi, dan korelasi
  • x Jangkauan, jangkauan antar kuartil, variansi, standar deviasi, dan koefisien variasi

3.6 VI

Misalkan kamu memiliki dataframe A = data.frame(kolom1 = 1:2) dan B = data.frame(kolom2 = 3).

Pilihlah jawaban yang tepat untuk membentuk dataframe seperti berikut:

kolom1
1
2
3

Pilihan

  • join(A, B, on = "kolom1")
  • A + B
  • x rbind(A, B)
  • c(A, B)

Gini :

A = data.frame(kolom1 = 1:2)
B = data.frame(kolom1 = 3)

rbind(A, B)
  kolom1
1      1
2      2
3      3
c(A, B)
$kolom1
[1] 1 2

$kolom1
[1] 3

3.7 VII

Coba dilakukan pengecekan untuk hasil dari keluaran berikut :

angka <- seq(1, 10)
for (nilai in angka) {
    if (nilai %% 2){
        print(nilai)
    }
}

Apakah merupakan bilangan ganjil dari 1-10 ?

Pilihan

  • tidak
  • input is error
  • x ya
  • no output can be showed

Gini :

angka <- seq(1, 10)
for (nilai in angka) {
    if (nilai %% 2){
        print(nilai)
    }
}
[1] 1
[1] 3
[1] 5
[1] 7
[1] 9

3.8 VIII

Manakah metode berikut ini yang menjadikan vektor memiliki nilai berulang ?

Pilihan

  • reserve()
  • x rep()
  • repeal()
  • view()

3.9 IX

Manakah pilihan berikut ini yang digunakan untuk mendapatkan quantil dari suatu dataset ?

Pilihan

  • x quantile()
  • plot()
  • barchart()
  • barplot()

3.10 X

Perintah apakah yang digunakan untuk menampilkan visualisasi boxplot pada vektor A yang bernilai numerik ?

Pilihan

  • boxplot(A, color = "BLUE")
  • boxplot(A, color_names = "blue")
  • boxplot(A, color = "blue")
  • x boxplot(A, col = "blue")