Berikut adalah analisis mengenai Data Kriminalitas. Data crime merupakan data sosio-ekonomi dari 47 negara bagian US di tahun 1960. Nilai pada variable tampaknya telah diskalakan.

Kita akan menggunakan linear regression analysis, akan dibuat suatu model untuk memprediksi faktor - faktor yang menjadikan faktor- faktor yang yang menjadikan tingkat kriminalitas di dalam masyarakat.

pertama kita akan melakukan persiapan data dengan mengimport package

library(tidyverse)
library(caret)
library(plotly)
library(data.table)
library(GGally)
library(tidymodels)
library(car)
library(scales)
library(lmtest)
library(dplyr)

1 LOAD DATA

crime <- read.csv("crime.csv") %>% 
  select(-X)
rmarkdown::paged_table(head(crime,10))

2 EXPLANATORY DATA ANALYSIS

mengecek struktur data

glimpse(crime)
#> Rows: 47
#> Columns: 16
#> $ M    <int> 151, 143, 142, 136, 141, 121, 127, 131, 157, 140, 124, 134, 128, …
#> $ So   <int> 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1,…
#> $ Ed   <int> 91, 113, 89, 121, 121, 110, 111, 109, 90, 118, 105, 108, 113, 117…
#> $ Po1  <int> 58, 103, 45, 149, 109, 118, 82, 115, 65, 71, 121, 75, 67, 62, 57,…
#> $ Po2  <int> 56, 95, 44, 141, 101, 115, 79, 109, 62, 68, 116, 71, 60, 61, 53, …
#> $ LF   <int> 510, 583, 533, 577, 591, 547, 519, 542, 553, 632, 580, 595, 624, …
#> $ M.F  <int> 950, 1012, 969, 994, 985, 964, 982, 969, 955, 1029, 966, 972, 972…
#> $ Pop  <int> 33, 13, 18, 157, 18, 25, 4, 50, 39, 7, 101, 47, 28, 22, 30, 33, 1…
#> $ NW   <int> 301, 102, 219, 80, 30, 44, 139, 179, 286, 15, 106, 59, 10, 46, 72…
#> $ U1   <int> 108, 96, 94, 102, 91, 84, 97, 79, 81, 100, 77, 83, 77, 77, 92, 11…
#> $ U2   <int> 41, 36, 33, 39, 20, 29, 38, 35, 28, 24, 35, 31, 25, 27, 43, 47, 3…
#> $ GDP  <int> 394, 557, 318, 673, 578, 689, 620, 472, 421, 526, 657, 580, 507, …
#> $ Ineq <int> 261, 194, 250, 167, 174, 126, 168, 206, 239, 174, 170, 172, 206, …
#> $ Prob <dbl> 0.084602, 0.029599, 0.083401, 0.015801, 0.041399, 0.034201, 0.042…
#> $ Time <dbl> 26.2011, 25.2999, 24.3006, 29.9012, 21.2998, 20.9995, 20.6993, 24…
#> $ y    <int> 791, 1635, 578, 1969, 1234, 682, 963, 1555, 856, 705, 1674, 849, …

ada beberapa data yang belum sesuai.

Mengubah nama kolom

names(crime) <- c("percent_m", "is_south", "mean_education", "police_exp60", "police_exp59", "labour_participation", "m_per1000f", "state_pop", "nonwhites_per1000", "unemploy_m24", "unemploy_m39", "gdp", "inequality", "prob_prison", "time_prison", "crime_rate")
head(crime)
#>   percent_m is_south mean_education police_exp60 police_exp59
#> 1       151        1             91           58           56
#> 2       143        0            113          103           95
#> 3       142        1             89           45           44
#> 4       136        0            121          149          141
#> 5       141        0            121          109          101
#> 6       121        0            110          118          115
#>   labour_participation m_per1000f state_pop nonwhites_per1000 unemploy_m24
#> 1                  510        950        33               301          108
#> 2                  583       1012        13               102           96
#> 3                  533        969        18               219           94
#> 4                  577        994       157                80          102
#> 5                  591        985        18                30           91
#> 6                  547        964        25                44           84
#>   unemploy_m39 gdp inequality prob_prison time_prison crime_rate
#> 1           41 394        261    0.084602     26.2011        791
#> 2           36 557        194    0.029599     25.2999       1635
#> 3           33 318        250    0.083401     24.3006        578
#> 4           39 673        167    0.015801     29.9012       1969
#> 5           20 578        174    0.041399     21.2998       1234
#> 6           29 689        126    0.034201     20.9995        682

Deskripsi kolom:

  • percent_m: number of males aged 14-24 per 1000 population
  • is_south: whether it is in a Southern state. 1 for Yes, 0 for No -> binnary variable
  • mean_education: mean years of schooling times 10
  • police_exp60: police expenditure in 1960
  • police_exp59: police expenditure in 1959
  • labour_participation: labour force participation rate
  • m_per1000f: number of males per 1000 females
  • state_pop: state population (in hundred thousands)
  • nonwhites_per1000: number of non-whites resident per 1000 people
  • unemploy_m24: unemployment rate of urban males aged 14-24
  • unemploy_m39: unemployment rate of urban males aged 35-39
  • gdp: gross domestic product per head
  • inequality: income inequality -> kesenjangan sosial
  • prob_prison: probability of imprisonment
  • time_prison: avg time served in prisons
  • crime_rate: crime rate in an unspecified category

kemudian mengubah tipe data

Mengubah kolom is_south menjadi factor

crime <- crime %>% 
  mutate(is_south = as.factor(is_south))
glimpse(crime)
#> Rows: 47
#> Columns: 16
#> $ percent_m            <int> 151, 143, 142, 136, 141, 121, 127, 131, 157, 140,…
#> $ is_south             <fct> 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0…
#> $ mean_education       <int> 91, 113, 89, 121, 121, 110, 111, 109, 90, 118, 10…
#> $ police_exp60         <int> 58, 103, 45, 149, 109, 118, 82, 115, 65, 71, 121,…
#> $ police_exp59         <int> 56, 95, 44, 141, 101, 115, 79, 109, 62, 68, 116, …
#> $ labour_participation <int> 510, 583, 533, 577, 591, 547, 519, 542, 553, 632,…
#> $ m_per1000f           <int> 950, 1012, 969, 994, 985, 964, 982, 969, 955, 102…
#> $ state_pop            <int> 33, 13, 18, 157, 18, 25, 4, 50, 39, 7, 101, 47, 2…
#> $ nonwhites_per1000    <int> 301, 102, 219, 80, 30, 44, 139, 179, 286, 15, 106…
#> $ unemploy_m24         <int> 108, 96, 94, 102, 91, 84, 97, 79, 81, 100, 77, 83…
#> $ unemploy_m39         <int> 41, 36, 33, 39, 20, 29, 38, 35, 28, 24, 35, 31, 2…
#> $ gdp                  <int> 394, 557, 318, 673, 578, 689, 620, 472, 421, 526,…
#> $ inequality           <int> 261, 194, 250, 167, 174, 126, 168, 206, 239, 174,…
#> $ prob_prison          <dbl> 0.084602, 0.029599, 0.083401, 0.015801, 0.041399,…
#> $ time_prison          <dbl> 26.2011, 25.2999, 24.3006, 29.9012, 21.2998, 20.9…
#> $ crime_rate           <int> 791, 1635, 578, 1969, 1234, 682, 963, 1555, 856, …

Untuk memilih variabel yang potensial untuk dijadikan prediktor pada model regresi maka akan dipilih variabel prediktor yang memiliki korelasi kuat dengan variabel target crime_rate kita dapat menggunakan package GGally dan fungsi cor

pada grafik korelasi terlihat bahwa variabel yang memiliki korelasi tinggi (0,7) terhadap crime_rate adalah police_exp60, police_exp59

Berikut adalah distribusi nilai dari masing masing variabel

boxplot(crime)

Berdasarkan visualisasi boxplot, ditemukan outlier di percent_m , police_exp59 , m_per1000f, state_pop , nonwhites_per1000, unemploy_m24 , unemploy_m39, prob_prison, time_prison

sedang data target crime_rate ada outlier

3 PEMBUATAN MODEL REGRSI LINEAR

Kita akan membuat model regresi linear dengan semua variabel prediktor y = crime_rate

model_all <- lm(formula = crime_rate ~. , data = crime)
summary(model_all)
#> 
#> Call:
#> lm(formula = crime_rate ~ ., data = crime)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -395.74  -98.09   -6.69  112.99  512.67 
#> 
#> Coefficients:
#>                        Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)          -5984.2876  1628.3184  -3.675 0.000893 ***
#> percent_m                8.7830     4.1714   2.106 0.043443 *  
#> is_south1               -3.8035   148.7551  -0.026 0.979765    
#> mean_education          18.8324     6.2088   3.033 0.004861 ** 
#> police_exp60            19.2804    10.6110   1.817 0.078892 .  
#> police_exp59           -10.9422    11.7478  -0.931 0.358830    
#> labour_participation    -0.6638     1.4697  -0.452 0.654654    
#> m_per1000f               1.7407     2.0354   0.855 0.398995    
#> state_pop               -0.7330     1.2896  -0.568 0.573845    
#> nonwhites_per1000        0.4204     0.6481   0.649 0.521279    
#> unemploy_m24            -5.8271     4.2103  -1.384 0.176238    
#> unemploy_m39            16.7800     8.2336   2.038 0.050161 .  
#> gdp                      0.9617     1.0367   0.928 0.360754    
#> inequality               7.0672     2.2717   3.111 0.003983 ** 
#> prob_prison          -4855.2658  2272.3746  -2.137 0.040627 *  
#> time_prison             -3.4790     7.1653  -0.486 0.630708    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 209.1 on 31 degrees of freedom
#> Multiple R-squared:  0.8031, Adjusted R-squared:  0.7078 
#> F-statistic: 8.429 on 15 and 31 DF,  p-value: 0.0000003539

kita akan melihat Pr(>|t|) pada summary diatas dimana Signifikansi Prediktor: mengetahui apakah setiap prediktor berpengaruh signifikan terhadap variabel targetnya. Variabel prediktor dikatakan signifikan ketika p-values < 0.05 (alpha) prediktor yang signifikan mempengaruhi yaitu : - percent_m - mean_education - inequality - prob_prison interpretasi pada signifikan prediktor dapat diliat pada nilai estimated /b1 pada model_crime_all : - percent_m -> apabila variabel percent_m naik 1 satuan, maka akan menaikkan nilai variabel crime_rate sebesar 8.7830 - mean_education -> apabila variabel mean_education naik 1 satuan, maka akan menaikkan nilai variabel crime_rate sebesar 18.8324 - inequality -> apabila variabel inequality naik 1 satuan, maka akan menaikkan nilai variabel crime_rate sebesar 7.067 - prob_prison -> apabila variabel prob_prison naik 1 satuan, maka akan menurunkan nilai variabel crime_rate sebesar 4855.2658

nilai R - squared model diatas adalah 0.7078 atau 70,78% model mampu menjelaskan variansi dari variabel target/ crime_rate

Selanjutnya kita dapat membuat model regresi linear dengan variabel prediktor yang memiliki korelasi tinggi (>0.7) yaitu police_exp60, police59

model_crime <- lm(formula = crime_rate ~ police_exp59 + police_exp60, data = crime)
summary(model_crime)
#> 
#> Call:
#> lm(formula = crime_rate ~ police_exp59 + police_exp60, data = crime)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -636.09 -168.62   35.44  141.80  532.10 
#> 
#> Coefficients:
#>              Estimate Std. Error t value Pr(>|t|)  
#> (Intercept)    158.26     125.93   1.257   0.2155  
#> police_exp59   -17.83      13.12  -1.359   0.1810  
#> police_exp60    25.62      12.34   2.076   0.0438 *
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 281.3 on 44 degrees of freedom
#> Multiple R-squared:  0.494,  Adjusted R-squared:  0.471 
#> F-statistic: 21.48 on 2 and 44 DF,  p-value: 0.0000003094

berdasarkan summary diatas signifikansi prediktor ketika p- value < 0.05 sehingga dapat berpengaruh signifkan terhadap target (crime_rate). pada model_crime yang berpengaruh adalah police_exp60 dengan nilai 0.0438 sehingga bila variabel police_exp60 naik 1 satuan maka akan menaikkan target crime rate sebesar 25.62. Pada model ini hasil feature selection hasil R-squared: 0.471 sehingga bila dibandingkan dengan model_all, hasil R-squared yang lebih baik adalah model_all yang menghasilkan nilai 70,78%.

Selanjutnya akan dicoba pemilihan variabel prediktor secara otomatis menggunakan step-wise regression dengan metode backward elimination

model_backward <- stats::step(object = model_all, direction = "backward" )
#> Start:  AIC=514.65
#> crime_rate ~ percent_m + is_south + mean_education + police_exp60 + 
#>     police_exp59 + labour_participation + m_per1000f + state_pop + 
#>     nonwhites_per1000 + unemploy_m24 + unemploy_m39 + gdp + inequality + 
#>     prob_prison + time_prison
#> 
#>                        Df Sum of Sq     RSS    AIC
#> - is_south              1        29 1354974 512.65
#> - labour_participation  1      8917 1363862 512.96
#> - time_prison           1     10304 1365250 513.00
#> - state_pop             1     14122 1369068 513.14
#> - nonwhites_per1000     1     18395 1373341 513.28
#> - m_per1000f            1     31967 1386913 513.74
#> - gdp                   1     37613 1392558 513.94
#> - police_exp59          1     37919 1392865 513.95
#> <none>                              1354946 514.65
#> - unemploy_m24          1     83722 1438668 515.47
#> - police_exp60          1    144306 1499252 517.41
#> - unemploy_m39          1    181536 1536482 518.56
#> - percent_m             1    193770 1548716 518.93
#> - prob_prison           1    199538 1554484 519.11
#> - mean_education        1    402117 1757063 524.86
#> - inequality            1    423031 1777977 525.42
#> 
#> Step:  AIC=512.65
#> crime_rate ~ percent_m + mean_education + police_exp60 + police_exp59 + 
#>     labour_participation + m_per1000f + state_pop + nonwhites_per1000 + 
#>     unemploy_m24 + unemploy_m39 + gdp + inequality + prob_prison + 
#>     time_prison
#> 
#>                        Df Sum of Sq     RSS    AIC
#> - time_prison           1     10341 1365315 511.01
#> - labour_participation  1     10878 1365852 511.03
#> - state_pop             1     14127 1369101 511.14
#> - nonwhites_per1000     1     21626 1376600 511.39
#> - m_per1000f            1     32449 1387423 511.76
#> - police_exp59          1     37954 1392929 511.95
#> - gdp                   1     39223 1394197 511.99
#> <none>                              1354974 512.65
#> - unemploy_m24          1     96420 1451395 513.88
#> - police_exp60          1    144302 1499277 515.41
#> - unemploy_m39          1    189859 1544834 516.81
#> - percent_m             1    195084 1550059 516.97
#> - prob_prison           1    204463 1559437 517.26
#> - mean_education        1    403140 1758114 522.89
#> - inequality            1    488834 1843808 525.13
#> 
#> Step:  AIC=511.01
#> crime_rate ~ percent_m + mean_education + police_exp60 + police_exp59 + 
#>     labour_participation + m_per1000f + state_pop + nonwhites_per1000 + 
#>     unemploy_m24 + unemploy_m39 + gdp + inequality + prob_prison
#> 
#>                        Df Sum of Sq     RSS    AIC
#> - labour_participation  1     10533 1375848 509.37
#> - nonwhites_per1000     1     15482 1380797 509.54
#> - state_pop             1     21846 1387161 509.75
#> - police_exp59          1     28932 1394247 509.99
#> - gdp                   1     36070 1401385 510.23
#> - m_per1000f            1     41784 1407099 510.42
#> <none>                              1365315 511.01
#> - unemploy_m24          1     91420 1456735 512.05
#> - police_exp60          1    134137 1499452 513.41
#> - unemploy_m39          1    184143 1549458 514.95
#> - percent_m             1    186110 1551425 515.01
#> - prob_prison           1    237493 1602808 516.54
#> - mean_education        1    409448 1774763 521.33
#> - inequality            1    502909 1868224 523.75
#> 
#> Step:  AIC=509.37
#> crime_rate ~ percent_m + mean_education + police_exp60 + police_exp59 + 
#>     m_per1000f + state_pop + nonwhites_per1000 + unemploy_m24 + 
#>     unemploy_m39 + gdp + inequality + prob_prison
#> 
#>                     Df Sum of Sq     RSS    AIC
#> - nonwhites_per1000  1     11675 1387523 507.77
#> - police_exp59       1     21418 1397266 508.09
#> - state_pop          1     27803 1403651 508.31
#> - m_per1000f         1     31252 1407100 508.42
#> - gdp                1     35035 1410883 508.55
#> <none>                           1375848 509.37
#> - unemploy_m24       1     80954 1456802 510.06
#> - police_exp60       1    123896 1499744 511.42
#> - unemploy_m39       1    190746 1566594 513.47
#> - percent_m          1    217716 1593564 514.27
#> - prob_prison        1    226971 1602819 514.54
#> - mean_education     1    413254 1789103 519.71
#> - inequality         1    500944 1876792 521.96
#> 
#> Step:  AIC=507.77
#> crime_rate ~ percent_m + mean_education + police_exp60 + police_exp59 + 
#>     m_per1000f + state_pop + unemploy_m24 + unemploy_m39 + gdp + 
#>     inequality + prob_prison
#> 
#>                  Df Sum of Sq     RSS    AIC
#> - police_exp59    1     16706 1404229 506.33
#> - state_pop       1     25793 1413315 506.63
#> - m_per1000f      1     26785 1414308 506.66
#> - gdp             1     31551 1419073 506.82
#> <none>                        1387523 507.77
#> - unemploy_m24    1     83881 1471404 508.52
#> - police_exp60    1    118348 1505871 509.61
#> - unemploy_m39    1    201453 1588976 512.14
#> - prob_prison     1    216760 1604282 512.59
#> - percent_m       1    309214 1696737 515.22
#> - mean_education  1    402754 1790276 517.74
#> - inequality      1    589736 1977259 522.41
#> 
#> Step:  AIC=506.33
#> crime_rate ~ percent_m + mean_education + police_exp60 + m_per1000f + 
#>     state_pop + unemploy_m24 + unemploy_m39 + gdp + inequality + 
#>     prob_prison
#> 
#>                  Df Sum of Sq     RSS    AIC
#> - state_pop       1     22345 1426575 505.07
#> - gdp             1     32142 1436371 505.39
#> - m_per1000f      1     36808 1441037 505.54
#> <none>                        1404229 506.33
#> - unemploy_m24    1     86373 1490602 507.13
#> - unemploy_m39    1    205814 1610043 510.76
#> - prob_prison     1    218607 1622836 511.13
#> - percent_m       1    307001 1711230 513.62
#> - mean_education  1    389502 1793731 515.83
#> - inequality      1    608627 2012856 521.25
#> - police_exp60    1   1050202 2454432 530.57
#> 
#> Step:  AIC=505.07
#> crime_rate ~ percent_m + mean_education + police_exp60 + m_per1000f + 
#>     unemploy_m24 + unemploy_m39 + gdp + inequality + prob_prison
#> 
#>                  Df Sum of Sq     RSS    AIC
#> - gdp             1     26493 1453068 503.93
#> <none>                        1426575 505.07
#> - m_per1000f      1     84491 1511065 505.77
#> - unemploy_m24    1     99463 1526037 506.24
#> - prob_prison     1    198571 1625145 509.20
#> - unemploy_m39    1    208880 1635455 509.49
#> - percent_m       1    320926 1747501 512.61
#> - mean_education  1    386773 1813348 514.35
#> - inequality      1    594779 2021354 519.45
#> - police_exp60    1   1127277 2553852 530.44
#> 
#> Step:  AIC=503.93
#> crime_rate ~ percent_m + mean_education + police_exp60 + m_per1000f + 
#>     unemploy_m24 + unemploy_m39 + inequality + prob_prison
#> 
#>                  Df Sum of Sq     RSS    AIC
#> <none>                        1453068 503.93
#> - m_per1000f      1    103159 1556227 505.16
#> - unemploy_m24    1    127044 1580112 505.87
#> - prob_prison     1    247978 1701046 509.34
#> - unemploy_m39    1    255443 1708511 509.55
#> - percent_m       1    296790 1749858 510.67
#> - mean_education  1    445788 1898855 514.51
#> - inequality      1    738244 2191312 521.24
#> - police_exp60    1   1672038 3125105 537.93
summary(model_backward)
#> 
#> Call:
#> lm(formula = crime_rate ~ percent_m + mean_education + police_exp60 + 
#>     m_per1000f + unemploy_m24 + unemploy_m39 + inequality + prob_prison, 
#>     data = crime)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -444.70 -111.07    3.03  122.15  483.30 
#> 
#> Coefficients:
#>                 Estimate Std. Error t value     Pr(>|t|)    
#> (Intercept)    -6426.101   1194.611  -5.379 0.0000040395 ***
#> percent_m          9.332      3.350   2.786      0.00828 ** 
#> mean_education    18.012      5.275   3.414      0.00153 ** 
#> police_exp60      10.265      1.552   6.613 0.0000000826 ***
#> m_per1000f         2.234      1.360   1.642      0.10874    
#> unemploy_m24      -6.087      3.339  -1.823      0.07622 .  
#> unemploy_m39      18.735      7.248   2.585      0.01371 *  
#> inequality         6.133      1.396   4.394 0.0000863344 ***
#> prob_prison    -3796.032   1490.646  -2.547      0.01505 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 195.5 on 38 degrees of freedom
#> Multiple R-squared:  0.7888, Adjusted R-squared:  0.7444 
#> F-statistic: 17.74 on 8 and 38 DF,  p-value: 0.0000000001159
# atau bisa pake model dibawah
#model_backward <- step(object = model_all, direction = "backward")

Metode step wise regression ini model akan menghasilkan formula optimum berdasarkan nilai AIC yang terendah, dimana semakin rendah nilai AIC tersebut, maka nilai observasi tidak tertangkap semakin kecil. nilai AIC 503.93

Bila dibandingkan dengan model yang menggunakan prediktor police_exp60, model regresi step backward yang menggunakan variable prediktor .percent_m + mean_education + police_exp60 + m_per1000f + unemploy_m24 + unemploy_m39 + inequality + prob_prisonmemiliki R- squared 0.7444/74% lebih tinggi dibanding model sebelumnya model dengan corelasi yang R- squared adalah 0.471 /47%

4 PREDIKSI MODEL & EROR

kita akan melakukan prediksi data crime menggunakan beberapa model yang sudah dibuat.

  1. model_all: semua prediktor (ada numerik, ada kategorik)
  2. model_crime: prediktor hasil feature selection
# simpan hasil prediksi ke kolom baru 
crime_pred <- crime

#hasil prediksi keseluruhan variabel
crime_pred$pred_crime_all <- predict(model_all, newdata = crime)
# hasil prediksi model korelasi
crime_pred$pred_crime_corr <- predict(model_crime, newdata = crime)
# hasil prediksi model backward
crime_pred$pred_crime_backward<- predict(model_backward, newdata = crime)
rmarkdown::paged_table(head(crime_pred,10))

Berdasarkan nilai R-Squared, model terbaik adalah model_backward disusul model_all, sehingga yang dimasukan ke dalam perhitungan evaluasi adalah model_backward kemudian model_all. Selanjutnya kita menghitung rata-rata dari nilai absolut error atau MAE. MAE bisa diinterpretasikan sebagai seberapa besar penyimpangan hasil prediksi terhadap nilai aktualnya

# Menghitung MAE menggunakan library MLmetrics pada hasil prediksi model_crime_all
library(MLmetrics)
#MAE model_all
MAE(y_pred = crime_pred$pred_crime_all, y_true = crime_pred$crime_rate)
#> [1] 129.9152
#MAE model_backward
MAE(y_pred = crime_pred$pred_crime_backward, y_true = crime_pred$crime_rate)
#> [1] 138.6674

Untuk mengetahui apakah nilai MAE yang diperoleh cukup besar/tidak maka perlu dibandingkan dengan range dari target variabelnya.

range(crime$crime_rate)
#> [1]  342 1993

Jika nilai MAE relatif cukup kecil dibandingkan range data, maka model memiliki error yang cukup kecil

MAPE(y_pred = crime_pred$pred_crime_all, y_true = crime_pred$crime_rate)*100
#> [1] 16.65317
MAPE(y_pred = crime_pred$pred_crime_backward, y_true = crime_pred$crime_rate)*100
#> [1] 17.48751

semakin kecil nilai MAPE, semakin bagus model yang kita miliki, MAPE memiliki range sebesar 16,65% -> model_all

Kita akan menghitung MSE menghitung berapa selisih kuadrat dari hasil prediksi dan nilai aktual kemudian dirata-rata. MSE sensitif terhadap perubahan atau selisih hasil prediksi yang besar sehingga meskipun sulit diinterpretasikan tetapi menjadi lebih baik dalam mendeteksi selisih yang besar.serta RMSE adalah bentuk akar kuadrat dari MSE. Karena sudah diakarkan, maka interpretasinya kurang lebih sama dengan MAE. RMSE dapat digunakan jika kita lebih concern dengan error yang sangat besar

range(crime$crime_rate)
#> [1]  342 1993
library(MLmetrics)
#model all
MSE(y_pred = crime_pred$pred_crime_all, y_true = crime_pred$crime_rate)
#> [1] 28828.63
RMSE(y_pred = crime_pred$pred_crime_all, y_true = crime_pred$crime_rate)
#> [1] 169.79
#modelbackward
MSE(y_pred = crime_pred$pred_crime_backward, y_true = crime_pred$crime_rate)
#> [1] 30916.34
RMSE(y_pred = crime_pred$pred_crime_backward, y_true = crime_pred$crime_rate)
#> [1] 175.8304

prediksi model_all dengan model_backward memiliki nilai RMSE yang berbeda jauh. untuk nilai RSME selisih dari hasil prediksi dan nilai aktual untuk model_all adalah 169.79 sedangkan model_backward 175.8304

kita akan cek uji statistiknya 1. Test Shapiro

 shapiro.test(model_backward$residuals)
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  model_backward$residuals
#> W = 0.98511, p-value = 0.8051

nilai p-value = 0.8051 > 0.05 (alpha), kesimpulannya eror/residual kita berdistribusi normal

  1. Uji statistik dengan bptest()
# bptest dari model
library(lmtest)
#instal package lm test
bptest(model_backward)
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  model_backward
#> BP = 13.51, df = 8, p-value = 0.09546

nilai p value 0.09546 > alpha : 0,05 sehingga eror kita menyebar konstan. asumsi terpenuhi

  1. VIF
# vif dari model
library(car)
vif(model_backward)
#>      percent_m mean_education   police_exp60     m_per1000f   unemploy_m24 
#>       2.131963       4.189684       2.560496       1.932367       4.360038 
#>   unemploy_m39     inequality    prob_prison 
#>       4.508106       3.731074       1.381879

Uji VIF (Variance Inflation Factor) dengan fungsi vif() dari package car: * nilai VIF > 10: terjadi multicollinearity pada model * nilai VIF < 10: tidak terjadi multicollinearity pada model

dari output vif, model kita bebas multikolinearity (hubungan korelasi kuat antar prediktor)

5 SIMPULAN DAN SARAN

  1. Model_Backward yang didapatkan memiliki R-quared 0.7444/74%, Metode step wise regression ini model akan menghasilkan formula optimum berdasarkan nilai AIC yang terendah, dimana semakin rendah nilai AIC tersebut, maka nilai observasi tidak tertangkap semakin kecil. nilai AIC 503.93

  2. Bila dibandingkan dengan model sebelumnya, model regresi step backward yang variable prediktor yang berpengaruh :

    • percent_m
    • mean_education
    • police_exp60
    • m_per1000f
    • unemploy_m39
    • inequality
    • prob_prison
  3. nilai RSME selisih dari hasil prediksi dan nilai aktual model_backward 175.8304

  4. Berdasarkan uji statistik model backward berdistribusi normal dan hasil dari vif hubungan korelasi kuat antar prediktor