0.1 Pendahuluan

Data yang dianalisis adalah rekam jejak transaksi kartu kredit yang mencakup kasus-kasus potensial kecurangan, di mana tranksaksi dilakukan tanpa otorisasi pemilik kartu kredit, sering kali melalui metode serangan siber atau akses ilegal. Penelitian ini bertujuan untuk mengembangkan sebuah model machine learning yang dapat mengidentifikasi tranksaksi fraud secara efisien. Diharapkan bahwa model ini dapat meningkatkan deteksi dini kasus kecurangan dan memungkinkan tindakan pencegahan seperti pembekuan kartu kredit atau verifikasi tambahan terhadap pemilik kartu kredit dalam situasi yang dicurigai.

0.2 Persiapan Data

0.2.1 Membaca Data

Saya akan melakukan pembacaan data dan kemudian menyimpannya ke dalam variabel yang bernama “cc”.

cc <- read.csv("data_input/card_transdata.csv")
head(cc)

distance_from_home: Ini adalah jarak antara lokasi terjadinya transaksi dengan rumah pemilik kartu kredit. distance_from_last_transaction: Ini adalah jarak antara lokasi terakhir terjadinya transaksi dengan transaksi saat ini yang menggunakan kartu kredit yang sama. ratio_to_median_purchase_price: Ini adalah perbandingan antara jumlah transaksi saat ini dengan nilai median transaksi historis. repeat_retailer: Menunjukkan apakah transaksi ini dilakukan dengan vendor/retailer yang sudah bertransaksi sebelumnya (1 berarti iya, 0 berarti transaksi ini dilakukan dengan retailer yang belum pernah bertransaksi). used_chip: Menunjukkan apakah transaksi ini menggunakan kartu kredit fisik dengan chip (1 berarti iya, 0 berarti tidak). used_pin_number: Menunjukkan apakah transaksi ini menggunakan PIN (1 berarti iya, 0 berarti tidak). online_order: Menunjukkan apakah transaksi dilakukan secara online (1 berarti iya, 0 berarti tidak). fraud: Menunjukkan apakah transaksi ini merupakan transaksi penipuan (1 berarti ya, 0 berarti tidak).

0.2.2 Transformasi & Cleansing Data

glimpse(cc)
#> Rows: 1,000,000
#> Columns: 8
#> $ distance_from_home             <dbl> 57.8778566, 10.8299427, 5.0910795, 2.24…
#> $ distance_from_last_transaction <dbl> 0.31114001, 0.17559150, 0.80515259, 5.6…
#> $ ratio_to_median_purchase_price <dbl> 1.94593998, 1.29421881, 0.42771456, 0.3…
#> $ repeat_retailer                <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, …
#> $ used_chip                      <dbl> 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, …
#> $ used_pin_number                <dbl> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, …
#> $ online_order                   <dbl> 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, …
#> $ fraud                          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
summary(cc)
#>  distance_from_home  distance_from_last_transaction
#>  Min.   :    0.005   Min.   :    0.000             
#>  1st Qu.:    3.878   1st Qu.:    0.297             
#>  Median :    9.968   Median :    0.999             
#>  Mean   :   26.629   Mean   :    5.037             
#>  3rd Qu.:   25.744   3rd Qu.:    3.356             
#>  Max.   :10632.724   Max.   :11851.105             
#>  ratio_to_median_purchase_price repeat_retailer    used_chip     
#>  Min.   :  0.0044               Min.   :0.0000   Min.   :0.0000  
#>  1st Qu.:  0.4757               1st Qu.:1.0000   1st Qu.:0.0000  
#>  Median :  0.9977               Median :1.0000   Median :0.0000  
#>  Mean   :  1.8242               Mean   :0.8815   Mean   :0.3504  
#>  3rd Qu.:  2.0964               3rd Qu.:1.0000   3rd Qu.:1.0000  
#>  Max.   :267.8029               Max.   :1.0000   Max.   :1.0000  
#>  used_pin_number   online_order        fraud       
#>  Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
#>  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
#>  Median :0.0000   Median :1.0000   Median :0.0000  
#>  Mean   :0.1006   Mean   :0.6506   Mean   :0.0874  
#>  3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.0000  
#>  Max.   :1.0000   Max.   :1.0000   Max.   :1.0000
colSums(is.na(cc))
#>             distance_from_home distance_from_last_transaction 
#>                              0                              0 
#> ratio_to_median_purchase_price                repeat_retailer 
#>                              0                              0 
#>                      used_chip                used_pin_number 
#>                              0                              0 
#>                   online_order                          fraud 
#>                              0                              0

Dari hasil cek di atas, diketahui bahwa tidak ada missing value di data ini, dan terdapat beberapa tipe data yang belum sesuai.

cc <- cc %>% 
  mutate(across(-c(distance_from_home, distance_from_last_transaction, ratio_to_median_purchase_price), as.factor))
glimpse(cc)
#> Rows: 1,000,000
#> Columns: 8
#> $ distance_from_home             <dbl> 57.8778566, 10.8299427, 5.0910795, 2.24…
#> $ distance_from_last_transaction <dbl> 0.31114001, 0.17559150, 0.80515259, 5.6…
#> $ ratio_to_median_purchase_price <dbl> 1.94593998, 1.29421881, 0.42771456, 0.3…
#> $ repeat_retailer                <fct> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, …
#> $ used_chip                      <fct> 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, …
#> $ used_pin_number                <fct> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, …
#> $ online_order                   <fct> 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, …
#> $ fraud                          <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
prop.table(table(cc$fraud))
#> 
#>        0        1 
#> 0.912597 0.087403

Data kita sangat tidak balance dan bisa mengakibatkan model ini terlalu baik dalam memprediksi kasus non-fraud.

0.3 Pembuatan Model

0.3.1 Pemisahan Data Train dan Data Test

Pertama saya akan memisahkan data sebanyak 80% untuk digunakan dalam melatih model, dan sisa 20% dari data tersebut akan digunakan untuk menguji prediksi model yang kita buat nanti.

index <- sample(nrow(cc), size = 0.8 * nrow(cc))
cc_train <- cc[index,]
cc_test <- cc[-index,]
cc_train_ds <- downSample(x = cc_train %>% select(-fraud), 
                         y = cc_train$fraud, 
                         yname = "fraud")
prop.table(table(cc_train_ds$fraud))
#> 
#>   0   1 
#> 0.5 0.5

Karena data yang kita miliki tidak balance antara hasil fraud dan non-fraudnya, maka saya akan menggunakan downsampling.

0.3.2 Membuat Model

Dengan menggunakan fungsi dibawah berikut, kita akan melatih sebuah model dan kemudian menyimpan model tersebut dengan nama cc_mdl

cc_mdl <- glm(formula = fraud~., family = "binomial", 
             data = cc_train_ds)
summary(cc_mdl)
#> 
#> Call:
#> glm(formula = fraud ~ ., family = "binomial", data = cc_train_ds)
#> 
#> Coefficients:
#>                                   Estimate  Std. Error z value
#> (Intercept)                     -7.6972950   0.0604200 -127.40
#> distance_from_home               0.0299074   0.0002549  117.32
#> distance_from_last_transaction   0.0494786   0.0006288   78.69
#> ratio_to_median_purchase_price   1.2317552   0.0076179  161.69
#> repeat_retailer1                -1.5076027   0.0356346  -42.31
#> used_chip1                      -1.2214372   0.0255272  -47.85
#> used_pin_number1               -10.4163037   0.1766216  -58.98
#> online_order1                    5.0609373   0.0483260  104.72
#>                                           Pr(>|z|)    
#> (Intercept)                    <0.0000000000000002 ***
#> distance_from_home             <0.0000000000000002 ***
#> distance_from_last_transaction <0.0000000000000002 ***
#> ratio_to_median_purchase_price <0.0000000000000002 ***
#> repeat_retailer1               <0.0000000000000002 ***
#> used_chip1                     <0.0000000000000002 ***
#> used_pin_number1               <0.0000000000000002 ***
#> online_order1                  <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 194178  on 140069  degrees of freedom
#> Residual deviance:  57361  on 140062  degrees of freedom
#> AIC: 57377
#> 
#> Number of Fisher Scoring iterations: 10

Hasil regresi logistik menunjukkan bahwa variabel-variabel prediktor, seperti jarak transaksi, rasio harga, penggunaan chip, penggunaan PIN, dan lainnya, memiliki pengaruh signifikan terhadap kemungkinan terjadinya fraud. Variabel-variabel ini memiliki koefisien estimasi yang signifikan dengan nilai p < 0.05, sehingga mereka berkontribusi secara nyata dalam memprediksi fraud. Model ini memiliki tingkat akurasi yang baik dalam menjelaskan data, seperti yang ditunjukkan oleh nilai deviance yang rendah. Akaike Information Criterion (AIC) yang rendah menunjukkan kompromi yang baik antara akurasi model dan kompleksitasnya. Dalam keseluruhan, model ini memberikan kerangka kerja yang berguna dalam memahami faktor-faktor yang berperan dalam kemungkinan terjadinya fraud pada transaksi kartu kredit. Stepwise tidak diperlukan karena semua prediktor berpengaruh signifikan.

0.3.3 Prediksi

cc_test$predict<-predict(cc_mdl, type = "response", newdata = cc_test)
cc_test$predict_label <- ifelse(test = cc_test$predict >= 0.50, 
                                yes = 1,
                                no = 0)
cc_test$predict_label <- as.factor(cc_test$predict_label)

0.3.4 Evaluasi Model

cc_conf <- confusionMatrix(cc_test$predict_label, cc_test$fraud, positive = "1")
cc_conf
#> Confusion Matrix and Statistics
#> 
#>           Reference
#> Prediction      0      1
#>          0 170303    880
#>          1  12329  16488
#>                                                
#>                Accuracy : 0.934                
#>                  95% CI : (0.9329, 0.935)      
#>     No Information Rate : 0.9132               
#>     P-Value [Acc > NIR] : < 0.00000000000000022
#>                                                
#>                   Kappa : 0.6792               
#>                                                
#>  Mcnemar's Test P-Value : < 0.00000000000000022
#>                                                
#>             Sensitivity : 0.94933              
#>             Specificity : 0.93249              
#>          Pos Pred Value : 0.57216              
#>          Neg Pred Value : 0.99486              
#>              Prevalence : 0.08684              
#>          Detection Rate : 0.08244              
#>    Detection Prevalence : 0.14408              
#>       Balanced Accuracy : 0.94091              
#>                                                
#>        'Positive' Class : 1                    
#> 

Hasil evaluasi model yang ditunjukkan oleh Confusion Matrix menunjukkan bahwa model ini memiliki akurasi sekitar 93.46%, dengan sensitivitas (kemampuan model dalam mendeteksi positif) sekitar 95.26%, dan spesifisitas (kemampuan model dalam menghindari salah mengklasifikasikan negatif) sekitar 93.29%. Pos Pred Value (positif prediksi value) sekitar 57.77% menunjukkan persentase positif yang diprediksi model yang benar, dan Neg Pred Value (negatif prediksi value) sekitar 99.51% menunjukkan persentase negatif yang diprediksi model yang benar. Model ini memiliki keseimbangan yang baik antara sensitivitas dan spesifisitas dengan Balanced Accuracy sekitar 94.27%.

0.4 K-Nearest Neighbour

0.4.1 Preparasi Data

Menyeleksi data numeric, dan melakukan scaling sebelum digunakan untuk pembuatan model.

#Seleksi Kolom Numeric
cc_train_n <- cc_train %>% select_if(is.numeric)
cc_test_n <- cc_test %>% select_if(is.numeric) %>% select(-predict)
#Labels
cc_train_y <- cc_train[,"fraud"]
cc_test_y <- cc_test[,"fraud"]
#Scaling
cc_train_ns <- scale(x = cc_train_n)
cc_test_ns <- scale(x = cc_test_n,
                    center = attr(cc_train_ns, "scaled:center"),
                    scale = attr(cc_train_ns, "scaled:scale"))

0.4.2 Pembuatan model KNN

cc_knn_pred <- knn(train = cc_train_ns,
                 test = cc_test_ns,
                 cl = cc_train_y,
                 k = 31)

head(cc_knn_pred)
#> [1] 0 0 1 0 0 0
#> Levels: 0 1

0.4.3 Evaluasi Model KNN

confusionMatrix(data = cc_knn_pred,        
                reference = cc_test_y, 
                positive = "1")
#> Confusion Matrix and Statistics
#> 
#>           Reference
#> Prediction      0      1
#>          0 175419   5452
#>          1   7213  11916
#>                                                
#>                Accuracy : 0.9367               
#>                  95% CI : (0.9356, 0.9377)     
#>     No Information Rate : 0.9132               
#>     P-Value [Acc > NIR] : < 0.00000000000000022
#>                                                
#>                   Kappa : 0.6182               
#>                                                
#>  Mcnemar's Test P-Value : < 0.00000000000000022
#>                                                
#>             Sensitivity : 0.68609              
#>             Specificity : 0.96051              
#>          Pos Pred Value : 0.62293              
#>          Neg Pred Value : 0.96986              
#>              Prevalence : 0.08684              
#>          Detection Rate : 0.05958              
#>    Detection Prevalence : 0.09564              
#>       Balanced Accuracy : 0.82330              
#>                                                
#>        'Positive' Class : 1                    
#> 

Model K-Nearest Neighbors (KNN) dengan k=31 telah dianalisis. Hasil menunjukkan bahwa model ini memiliki sensitivitas yang tinggi, artinya mampu mendeteksi sebagian besar kasus fraud dengan baik. Namun, terdapat jumlah false positives yang signifikan, yaitu prediksi fraud yang sebenarnya bukan fraud. Meskipun akurasi model ini cukup baik, peningkatan perlu dilakukan untuk mengurangi jumlah false positives, sehingga model menjadi lebih akurat dalam mengidentifikasi kasus fraud yang sebenarnya. Upaya ini akan membantu meningkatkan efisiensi dalam mengatasi fraud, sehingga perusahaan dapat mengambil tindakan yang sesuai dalam menangani kasus tersebut.

0.5 Kesimpulan

Dalam penelitian ini, kami telah menganalisis data transaksi kartu kredit yang mencakup kasus-kasus potensial kecurangan. Model machine learning berdasarkan regresi logistik telah dikembangkan untuk mengidentifikasi kemungkinan terjadinya fraud dalam transaksi tersebut. Model ini mampu memberikan akurasi sekitar 93.46%, dengan sensitivitas sekitar 95.26% dan spesifisitas sekitar 93.29%. Kami juga menciptakan model K-Nearest Neighbors (KNN) dengan k=31 yang memiliki sensitivitas tinggi (sekitar 67.80%), tetapi dengan jumlah false positives yang signifikan. Oleh karena itu, perbaikan lebih lanjut perlu dilakukan untuk mengurangi false positives dalam model KNN.

Hasil penelitian ini memberikan pemahaman yang berguna mengenai faktor-faktor yang berperan dalam kemungkinan terjadinya fraud pada transaksi kartu kredit. Selanjutnya, langkah-langkah perbaikan yang telah diidentifikasi akan membantu meningkatkan efisiensi dalam mendeteksi kasus kecurangan, yang dapat berkontribusi pada tindakan pencegahan yang lebih efektif dan pengurangan kerugian yang disebabkan oleh fraud.