#Tugas1 ### Checking the data
Source Code untuk Melihat Data pada Table:
#setwd("C:\Users\LENOVO\Documents\Metode Statistika\UTSSTATIS")
tr <- read.csv('train.csv', header = TRUE)
head(tr)
## Loan_ID Gender Married Dependents Education Self_Employed ApplicantIncome
## 1 LP001002 Male No 0 Graduate No 5849
## 2 LP001003 Male Yes 1 Graduate No 4583
## 3 LP001005 Male Yes 0 Graduate Yes 3000
## 4 LP001006 Male Yes 0 Not Graduate No 2583
## 5 LP001008 Male No 0 Graduate No 6000
## 6 LP001011 Male Yes 2 Graduate Yes 5417
## CoapplicantIncome LoanAmount Loan_Amount_Term Credit_History Property_Area
## 1 0 NA 360 1 Urban
## 2 1508 128 360 1 Rural
## 3 0 66 360 1 Urban
## 4 2358 120 360 1 Urban
## 5 0 141 360 1 Urban
## 6 4196 267 360 1 Urban
## Loan_Status
## 1 Y
## 2 N
## 3 Y
## 4 Y
## 5 Y
## 6 Y
Baris pertama dalam kumpulan data mendefinisikan tajuk kolom. Masing-masing header ini dijelaskan dalam tabel di atas. Sekarang, kita akan menjalankan fungsi ringkasan untuk melihat statistik dengan cepat:
summary(tr)
## Loan_ID Gender Married Dependents
## Length:614 Length:614 Length:614 Length:614
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Education Self_Employed ApplicantIncome CoapplicantIncome
## Length:614 Length:614 Min. : 150 Min. : 0
## Class :character Class :character 1st Qu.: 2878 1st Qu.: 0
## Mode :character Mode :character Median : 3812 Median : 1188
## Mean : 5403 Mean : 1621
## 3rd Qu.: 5795 3rd Qu.: 2297
## Max. :81000 Max. :41667
##
## LoanAmount Loan_Amount_Term Credit_History Property_Area
## Min. : 9.0 Min. : 12 Min. :0.0000 Length:614
## 1st Qu.:100.0 1st Qu.:360 1st Qu.:1.0000 Class :character
## Median :128.0 Median :360 Median :1.0000 Mode :character
## Mean :146.4 Mean :342 Mean :0.8422
## 3rd Qu.:168.0 3rd Qu.:360 3rd Qu.:1.0000
## Max. :700.0 Max. :480 Max. :1.0000
## NA's :22 NA's :14 NA's :50
## Loan_Status
## Length:614
## Class :character
## Mode :character
##
##
##
##
Sekarang mari kita lakukan perbaikan cepat pada beberapa variabel:
#setwd("C:\Users\LENOVO\Documents\Metode Statistika\UTSSTATIS")
tr <- read.csv(file="train.csv", na.strings=c("", "NA"), header=TRUE)
library(plyr)
tr$Dependents <- revalue(tr$Dependents, c("3+"="3"))
Sekarang, mari kita lihat lebih dekat data yang hilang:
## Loan_ID Gender Married Dependents
## 0 13 3 15
## Education Self_Employed ApplicantIncome CoapplicantIncome
## 0 32 0 0
## LoanAmount Loan_Amount_Term Credit_History Property_Area
## 22 14 50 0
## Loan_Status
## 0
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
## Loading required package: colorspace
## Loading required package: grid
## VIM is ready to use.
## Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
##
## Variables sorted by number of missings:
## Variable Count
## Credit_History 0.081433225
## Self_Employed 0.052117264
## LoanAmount 0.035830619
## Dependents 0.024429967
## Loan_Amount_Term 0.022801303
## Gender 0.021172638
## Married 0.004885993
## Loan_ID 0.000000000
## Education 0.000000000
## ApplicantIncome 0.000000000
## CoapplicantIncome 0.000000000
## Property_Area 0.000000000
## Loan_Status 0.000000000
Dari grafik dan tabel, ada tujuh variabel yang datanya hilang. Sekarang, saatnya untuk melihat distribusi data. Kita akan mulai dengan variabel numerik: Jumlah Pinjaman dan Pendapatan Pemohon: Di bawah ini adalah histogram dan boxplot dari jumlah pinjaman dan variabel pendapatan pemohon:
## null device
## 1
##Tugas2 ##Univariate Di sini kita melihat bahwa ada beberapa nilai ekstrim di kedua variabel. Mari kita periksa juga apakah distribusi jumlah pinjaman pemohon dipengaruhi oleh tingkat pendidikan mereka:
## Warning in data(tr, package = "lattice"): data set 'tr' not found
## Warning: Removed 22 rows containing non-finite values (stat_density).
##Bivarite
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## `summarise()` has grouped output by 'class'. You can override using the `.groups` argument.
Kami mencatat bahwa lulusan memiliki lebih banyak outlier dan distribusi jumlah pinjaman mereka lebih luas. Sekarang mari kita lihat variabel kategori dalam dataset:
## null device
## 1
Jika kita melihat grafik Gender, kita melihat bahwa laki-laki memiliki lebih banyak catatan dan lebih dari setengah dari aplikasi pelamar telah disetujui. Ada lebih sedikit pelamar perempuan tetapi masih lebih dari setengah dari aplikasi mereka telah disetujui. Kami melihat grafik lain dengan pandangan yang sama untuk mengevaluasi kinerja masing-masing kategori dalam hal persetujuan aplikasi pinjaman.
Sekarang kami telah mengidentifikasi beberapa kesalahan dalam kumpulan data, kami perlu memperbaikinya sebelum melanjutkan analisis kami. Mari kita tinjau masalah:
Ada nilai yang hilang di beberapa variabel. Berdasarkan pentingnya variabel, kami akan memutuskan metode yang akan digunakan.
Melihat distribusi data, kami melihat bahwa ApplicantIncome dan LoanAmount memiliki outlier.
Memperbaiki outlier bisa jadi rumit. Sulit untuk mengetahui apakah itu disebabkan oleh kesalahan pengukuran, kesalahan saat merekam, atau jika outlier adalah anomali nyata. Jika kami memutuskan untuk menghapus catatan, kami harus mendokumentasikan alasan di balik keputusan ini.
Dalam kumpulan data ini, kita akan mengasumsikan bahwa nilai yang hilang adalah sistematis karena data yang hilang datang dalam variabel tertentu secara acak. Juga, kami mencatat bahwa nilai yang hilang ada pada data numerik dan kategorikal, oleh karena itu, kami akan menggunakan paket mouse di R. Paket ini membantu dalam memasukkan nilai yang hilang dengan nilai data yang masuk akal. Nilai-nilai ini disimpulkan dari distribusi yang dirancang untuk setiap titik data yang hilang. Dalam plot data yang hilang di atas, kami mencatat bahwa 0,78 data tidak kehilangan informasi apa pun, 0,07 tidak memiliki nilai Credit_History, dan sisanya menunjukkan pola lain yang hilang.
The mice() function takes care of the imputing process:
##
## iter imp variable
## 1 1 LoanAmount Loan_Amount_Term Credit_History
## 1 2 LoanAmount Loan_Amount_Term Credit_History
## 2 1 LoanAmount Loan_Amount_Term Credit_History
## 2 2 LoanAmount Loan_Amount_Term Credit_History
## Warning: Number of logged events: 8
Penting untuk disebutkan bahwa tikus adalah singkatan dari beberapa imputasi dengan persamaan berantai. Argumen ‘m’ dalam fungsi menunjukkan berapa putaran imputasi yang ingin kita lakukan. Untuk kesederhanaan, saya akan memilih 2. Argumen ‘metode’ menunjukkan yang mana dari banyak metode untuk imputasi yang ingin kita gunakan. Saya memilih CART yang merupakan singkatan dari klasifikasi dan pohon regresi. Metode ini bekerja dengan semua tipe variabel, dan itulah mengapa saya memilihnya. Sekarang mari kita gabungkan data yang diperhitungkan ke dalam dataset asli kita. Kita dapat melakukan ini dengan menggunakan fungsi complete() :
tr <- complete(imputed_Data,2) #here I chose the second round of data imputation
Periksa data yang hilang lagi, kami perhatikan bahwa tidak ada data yang hilang setelah imputasi:
sapply(tr, function(x) sum(is.na(x)))
## Loan_ID Gender Married Dependents
## 0 13 3 15
## Education Self_Employed ApplicantIncome CoapplicantIncome
## 0 32 0 0
## LoanAmount Loan_Amount_Term Credit_History Property_Area
## 0 0 0 0
## Loan_Status
## 0
Saatnya memperlakukan nilai-nilai ekstrem. Melihat variabel LoanAmount, kami menduga bahwa nilai ekstrim dimungkinkan karena beberapa pelanggan, untuk beberapa alasan, mungkin ingin mengajukan jumlah pinjaman yang lebih tinggi. Kami akan melakukan transformasi log untuk menormalkan data:
## null device
## 1
Sekarang distribusi terlihat lebih dekat ke normal dan efek nilai ekstrim telah berkurang secara signifikan.
Datang ke ApplicantIncome, sebaiknya gabungkan ApplicantIncome dan Co-applicant sebagai pendapatan total dan kemudian lakukan transformasi log dari variabel gabungan.
kita akan menggunakan metode imputasi CART. Jika kita mengetahui bahwa nilai untuk suatu pengukuran berada dalam rentang tertentu, kita dapat mengisi nilai kosong dengan rata-rata pengukuran tersebut.
## null device
## 1
Kita melihat bahwa distribusinya lebih baik dan mendekati distribusi normal.
Sekarang saatnya untuk membuat langkah besar berikutnya dalam analisis kami yaitu membagi data menjadi set pelatihan dan pengujian.
Training set adalah subset dari data yang kita gunakan untuk melatih model kita tetapi test set adalah subset acak dari data yang diturunkan dari training set. Kami akan menggunakan set pengujian untuk memvalidasi model kami sebagai data yang tidak terduga.
Dalam data yang jarang seperti milik kami, mudah untuk menyesuaikan data. Overfit dalam istilah sederhana berarti bahwa model akan mempelajari set pelatihan yang tidak akan mampu menangani sebagian besar kasus yang belum pernah dilihat sebelumnya. Oleh karena itu, kami akan menilai data menggunakan set pengujian kami. Setelah kami membagi data, kami akan memperlakukan set pengujian seperti tidak ada lagi. Mari kita pisahkan datanya:
set.seed(42)
sample <- sample.int(n = nrow(tr), size = floor(.70*nrow(tr)), replace = F)
trainnew <- tr[sample, ]
testnew <- tr[-sample, ]
Sekarang kita akan mulai dengan model regresi logistik pertama kita. Kami tidak akan mengambil semua variabel dalam model karena ini dapat menyebabkan kelebihan data. Untuk memilih variabel kita, mari kita periksa pentingnya variabel secara logis. Kemungkinan aplikasi pemohon akan disetujui lebih tinggi jika:
Applicants took a loan before. Credit history is the variable which answers that.
Applicants with higher incomes. So, we might look at the income variable which we created.
Applicants with higher education.
Applicants who have stable jobs.
Kami akan menggunakan variabel Credit_History dalam model regresi logistik pertama kami.
## Error in eval(family$initialize): y values must be 0 <= y <= 1
## Error in summary(logistic1): object 'logistic1' not found
## Error in predict(logistic1, newdata = trainnew, type = "response"): object 'logistic1' not found
## Error in table(trainnew$Loan_Status, my_prediction_tr1 > 0.5): object 'my_prediction_tr1' not found
## Error in eval(family$initialize): y values must be 0 <= y <= 1
## Error in summary(logistic_test1): object 'logistic_test1' not found
## Error in predict(logistic_test1, newdata = testnew, type = "response"): object 'logistic_test1' not found
## Error in table(testnew$Loan_Status, my_prediction_te1 > 0.5): object 'my_prediction_te1' not found
Regresi Logistik, secara sederhana, memprediksi kemungkinan terjadinya suatu peristiwa dengan menyesuaikan data ke fungsi logit. Koefisien regresi mewakili perubahan rata-rata dalam variabel respons untuk satu unit perubahan dalam variabel prediktor sambil mempertahankan prediktor lain dalam model konstan. Jenis model ini adalah bagian dari kelas algoritma yang lebih besar yang dikenal sebagai Generalized Linear Model atau GLM. Persamaan regresi logistik adalah:
TPeran fungsi link adalah untuk menghubungkan ekspektasi ‘y’ dengan prediktor linier. Regresi logistik memiliki asumsi sebagai berikut:
GLM tidak mengasumsikan hubungan linier antara variabel dependen dan independen.
Variabel terikat tidak perlu berdistribusi normal.
Ini menggunakan estimasi kemungkinan maksimum (MLE).
Kesalahan harus independen tetapi tidak terdistribusi secara normal.
Pada output, hal pertama yang kita lihat adalah panggilan, ini adalah R yang mengingatkan kita tentang model yang telah kita jalankan. Selanjutnya, kita melihat deviance residual yang merupakan ukuran dari model fit. Bagian ini menunjukkan distribusi residual deviance untuk kasus-kasus individual yang digunakan dalam model. Bagian selanjutnya menunjukkan koefisien, kesalahan standarnya, statistik-z, dan nilai-p yang terkait. Nilai p untuk setiap istilah menguji hipotesis nol bahwa koefisiennya sama dengan nol (tidak berpengaruh). Nilai p yang rendah (<0,05) menunjukkan bahwa kita dapat menolak hipotesis nol dan prediktor bermakna bagi model. Sebaliknya, nilai p yang lebih besar menunjukkan bahwa perubahan pada prediktor tidak terkait dengan perubahan pada variabel dependen dan tidak signifikan. Nilai p untuk Credit_History sangat kecil dan oleh karena itu, signifikan.
Kami juga telah membuat tabel kebingungan untuk memeriksa keakuratan model pada kereta dan data uji: Train data: 81.12%
Mari tambahkan variabel lain dan periksa akurasinya:
## Error in eval(family$initialize): y values must be 0 <= y <= 1
## Error in summary(logistic2): object 'logistic2' not found
## Error in predict(logistic2, newdata = trainnew, type = "response"): object 'logistic2' not found
## Error in table(trainnew$Loan_Status, my_prediction_tr2 > 0.5): object 'my_prediction_tr2' not found
## Error in eval(family$initialize): y values must be 0 <= y <= 1
## Error in summary(logistic_test2): object 'logistic_test2' not found
## Error in predict(logistic_test2, newdata = testnew, type = "response"): object 'logistic_test2' not found
## Error in table(testnew$Loan_Status, my_prediction_te2 > 0.5): object 'my_prediction_te2' not found
Train data: 81.11% Kami mencatat bahwa menambahkan variabel meningkatkan akurasi set tes.
Pohon keputusan membuat satu set pemisahan biner pada variabel prediktor untuk membuat pohon yang dapat digunakan untuk mengklasifikasikan pengamatan baru ke dalam salah satu dari dua kelompok. Di sini, kita akan menggunakan pohon klasik. Algoritma model ini adalah sebagai berikut:
Pilih variabel prediktor yang paling baik membagi data menjadi dua kelompok;
Pisahkan data ke dalam dua kelompok ini;
Ulangi langkah-langkah ini sampai subkelompok berisi kurang dari jumlah minimum pengamatan;
Untuk mengklasifikasikan kasus, jalankan ke bawah pohon ke simpul terminal, dan tetapkan nilai hasil model yang ditetapkan pada langkah sebelumnya.
library(rpart)
# grow tree
dtree <- rpart(Loan_Status ~ Credit_History+Education+Self_Employed+Property_Area+LogLoanAmount+
LogIncome,method="class", data=trainnew,parms=list(split="information"))
dtree$cptable
## CP nsplit rel error xerror xstd
## 1 0.35507246 0 1.0000000 1.0000000 0.07010973
## 2 0.01811594 1 0.6449275 0.6449275 0.06085927
## 3 0.01086957 3 0.6086957 0.7028986 0.06278374
## 4 0.01000000 7 0.5507246 0.6811594 0.06208384
plotcp(dtree)
dtree.pruned <- prune(dtree, cp=.02290076)
library(rpart.plot)
prp(dtree.pruned, type = 2, extra = 104,
fallen.leaves = TRUE, main="Decision Tree")
dtree.pred <- predict(dtree.pruned, trainnew, type="class")
dtree.perf <- table(trainnew$Loan_Status, dtree.pred,
dnn=c("Actual", "Predicted"))
dtree.perf
## Predicted
## Actual N Y
## N 59 79
## Y 10 281
Di R, pohon keputusan dapat ditumbuhkan dan dipangkas menggunakan fungsi rpart() dan fungsi prune() dalam paket rpart. Pertama, pohon ditumbuhkan menggunakan fungsi rpart(). Kami mencetak pohon dan ringkasan untuk memeriksa model yang dipasang. Pohon itu mungkin terlalu besar dan perlu dipangkas. Untuk memilih ukuran pohon akhir, periksa cptable dari daftar yang dikembalikan oleh rpart(). Ini berisi data tentang kesalahan prediksi untuk ukuran pohon yang berbeda. Parameter kompleksitas (cp) digunakan untuk menghukum pohon yang lebih besar. Ukuran pohon ditentukan oleh jumlah cabang yang terbelah (nsplit). Sebuah pohon dengan n split memiliki n + 1 simpul terminal. (Kesalahan rel) berisi tingkat kesalahan untuk pohon dengan ukuran tertentu dalam sampel pelatihan. Kesalahan validasi silang (xerror) didasarkan pada validasi silang 10 kali lipat, menggunakan sampel pelatihan. (xstd) berisi kesalahan standar dari kesalahan validasi silang.
Fungsi plotcp() memplot kesalahan yang divalidasi silang terhadap parameter kompleksitas. Untuk memilih ukuran pohon akhir, kita perlu memilih pohon terkecil yang kesalahan validasi silangnya berada dalam satu kesalahan standar dari nilai kesalahan validasi silang minimum. Dalam kasus kami, kesalahan validasi silang minimum adalah 0,618 dengan kesalahan standar 0,0618. Jadi, pohon terkecil dengan kesalahan validasi silang berada dalam 0,618 ? 0,0618 yaitu antara 0,56 dan 0,68 dipilih. Dari tabel, pohon dengan satu pemisahan (kesalahan validasi silang = 0,618) memenuhi persyaratan.
Dari cptable, pohon dengan satu pemisahan memiliki parameter kompleksitas 0,02290076, sehingga pernyataan prune(dtree, cp=0,2290076) mengembalikan pohon dengan ukuran yang diinginkan. Kami kemudian memplot pohon: pohon yang dipangkas untuk memprediksi status pinjaman. Kami melihat pohon di bagian atas bergerak ke kiri jika kondisinya benar atau ke kanan sebaliknya. Ketika sebuah pengamatan mengenai simpul terminal, itu diklasifikasikan. Setiap node berisi probabilitas kelas di node itu, bersama dengan persentase sampel.
Akhirnya, kami menjalankan tabel kebingungan untuk mengetahui keakuratan model. PS: Kami mengikuti langkah yang sama dalam data uji.
dtree_test <- rpart(Loan_Status ~ Credit_History+Education+Self_Employed+Property_Area+LogLoanAmount+
LogIncome,method="class", data=testnew,parms=list(split="information"))
dtree_test$cptable
## CP nsplit rel error xerror xstd
## 1 0.35185185 0 1.0000000 1.0000000 0.11451250
## 2 0.01234568 1 0.6481481 0.6481481 0.09865067
## 3 0.01000000 7 0.5740741 0.6481481 0.09865067
plotcp(dtree_test)
dtree_test.pruned <- prune(dtree_test, cp=.01639344)
prp(dtree_test.pruned, type = 2, extra = 104,
fallen.leaves = TRUE, main="Decision Tree")
dtree_test.pred <- predict(dtree_test.pruned, testnew, type="class")
dtree_test.perf <- table(testnew$Loan_Status, dtree_test.pred,
dnn=c("Actual", "Predicted"))
dtree_test.perf
## Predicted
## Actual N Y
## N 25 29
## Y 6 125