Dosen Pengampu : Prof.Dr.Suhartono, M.Kom.

UIN Maulana Malik Ibrahim Malang

Berikut ini Kami akan melakukan prediksi curah hujan di wilayah Kab. Nganjuk dengan menggunakan data iklim Kab. Nganjuk yang tersedia selama 4 tahun, yaitu tahun 2015 hingga 2018 berupa data rata-rata suhu udara, kecepatan angin, tekanan udara, kelembaban udara, dan jumlah curah hujan bulanan.

Data Iklim diperoleh dari BMKG Stasiun Geofisika Nganjuk

library(readxl)
data_iklim = read_excel("data_iklim.xlsx")
summary(data_iklim)
##      Bulan                          Suhu         Kec.Angin     Tekanan.Udara 
##  Min.   :2015-01-01 00:00:00   Min.   :22.70   Min.   :1.000   Min.   :1011  
##  1st Qu.:2015-12-24 06:00:00   1st Qu.:23.50   1st Qu.:2.000   1st Qu.:1014  
##  Median :2016-12-16 12:00:00   Median :23.80   Median :2.000   Median :1015  
##  Mean   :2016-12-15 17:00:00   Mean   :24.07   Mean   :2.312   Mean   :1015  
##  3rd Qu.:2017-12-08 18:00:00   3rd Qu.:24.32   3rd Qu.:3.000   3rd Qu.:1016  
##  Max.   :2018-12-01 00:00:00   Max.   :26.30   Max.   :4.000   Max.   :1018  
##  Kelembaban.Udara  Curah.Hujan   
##  Min.   :61.30    Min.   :  0.0  
##  1st Qu.:79.35    1st Qu.: 33.0  
##  Median :86.00    Median :204.0  
##  Mean   :82.72    Mean   :251.3  
##  3rd Qu.:88.12    3rd Qu.:427.8  
##  Max.   :92.90    Max.   :834.1

Mengelompokkan setiap variabel data dalam data iklim ke dalam sebuah variabel

suhu.udara <- data_iklim$Suhu
kec.angin <- data_iklim$Kec.Angin
tekanan.udara <- data_iklim$Tekanan.Udara
kelembaban.udara <- data_iklim$Kelembaban.Udara
curah.hujan <- data_iklim$Curah.Hujan

Regresi Linear Berganda (Multiple Linear Regression)

adalah model regresi linear dengan melibatkan lebih dari satu variabel bebas atau predictor, dengan persamaan sbb:

Y = a + b1x1 + b2x2 + …. +bnxn

dimana :

Y = variabel terikat

x = variabel bebas atau predictor

a = konstanta (intersept)

b = koefisien regresi pada masing-masing variabel bebas

Menyusun Model Linear Berganda

model linear berganda yang akan digunakan untuk menguji linearitas, normalitas, dan akan digunakan untuk mencari prediksi data

model <- lm(curah.hujan ~ suhu.udara + kec.angin + tekanan.udara + kelembaban.udara , data = data_iklim)

Melakukan Uji Setiap Asumsi Regresi Linear

Uji asumsi regresi linear dilakukan untuk menguji beberapa pengujian di antaranya menguji Normalitas, Multikolinearitas, Heterokesdastisitas, Autokorelasi dan Linearitas dari sebuah model regresi

Uji asumsi Normalitas, pengujian residual dari model regresi dilakukan untuk menentukan apakah model regresi berdistribusi normal atau tidak

Menampilkan Plot hasil pengujian

par(mfrow = c(2,2))
plot(model)

pada grafik Normal Q-Q menunjukkan point-point data berada disekitar garis putus-putus, berarti data terebut dikatakan data terdistribusi normal, sehingga dapat dikatakan model regresi memenuhi asumsi Normalitas.

Uji asumsi Multikolinieritas

pengujian korelasi antar variabel independent untuk melihat ada tidaknya korelasi erat antar variabel independent dapat dilakukan dengan melihat nilai VIF menggunakan perintah vif() dalam package car

library(car)
## Loading required package: carData
vif(model)
##       suhu.udara        kec.angin    tekanan.udara kelembaban.udara 
##         1.429743         1.359557         1.547636         1.765646

Nilai VIF untuk Variabel suhu.udara, kec.angin, tekanan.udara, dan kelembaban.udara berada dibawah 10 yang berarti tidak terjadi multikolinieritas dalam variabel sehingga model tersebut terjadi hubungan yang linear.

Uji asumsi Heteroskedastisitas

mengukur apakah terjadi ketidaksamaan varians residual(Heteroskedastisitas) dari data-data pengukuran dengan melihat sebaran pada grafik Residual vs Vitted menggunakan perintah yang sama dengan Uji Normalitas.

menampilkan grafik uji heteroskedastisitas

par(mfrow = c(2,2))
plot(model)

pada grafik Residual vs Fitted menunjukan data tersebar dan tidak membuat satu pola tertentu dan tidak terjadi perbedaan varians residual dan pengujian model memenuhi uji asumsi heteroskedastisitas.

Uji asumsi Autokorelasi

melakukan uji autokorelasi untuk mengetahui apakah ada pengaruh dari data terdahulu kepada data yang baru, uji dilakukan karena data iklim berbentu time series, uji dilakukan dengan menggunakan perintah dwtest() dalam package lmtest.

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
dwtest(model)
## 
##  Durbin-Watson test
## 
## data:  model
## DW = 1.193, p-value = 0.0004641
## alternative hypothesis: true autocorrelation is greater than 0

hasil uji diatas menunjukan nilai durbin-watson test p-value kurang dari 0.05 yang berarti terjadi pengaruh antar data sebelum dan terbaru dan terdapat asumsi autokorelasi yang terpenuhi antar data model.

Uji asumsi Linieritas

Menguji hubungan linier antara variabel dependent dan independent untuk memenuhi asumsi adanya hubungan linier antar variabel tersebut dengan perintah crPlots() dari package library conf.

library(conf)
crPlots(model)

dari grafik diatas posisi dua garis dengan warna berbeda(ungu dan biru) (garis putus-putus dan garis sambung) berada pada posisi yang hampir berdempetan, artinya variabel independent memiliki linieritas dengan variabel dependent sehingga dapat dikatakan asumsi linieritas model regresi terpenuhi.

Hasil Regresi Linier Berganda

summary(model)
## 
## Call:
## lm(formula = curah.hujan ~ suhu.udara + kec.angin + tekanan.udara + 
##     kelembaban.udara, data = data_iklim)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -266.17 -122.45  -19.64  102.38  407.35 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      21341.620  23959.333   0.891    0.378    
## suhu.udara          11.374     34.058   0.334    0.740    
## kec.angin           39.312     38.973   1.009    0.319    
## tekanan.udara      -22.876     23.385  -0.978    0.333    
## kelembaban.udara    21.296      4.153   5.128 6.64e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 164.8 on 43 degrees of freedom
## Multiple R-squared:  0.5473, Adjusted R-squared:  0.5052 
## F-statistic: 12.99 on 4 and 43 DF,  p-value: 5.089e-07

dari hasil uji diatas didapat hasil dari model persamaan regresi linear berganda dimana nilai persamaannya yaitu curah.hujan = 213141.620 + (11.374)suhu.udara + (39.312)kecepatan.angin + (-22.876)tekanan.udara + (21.296)kelembaban.udara + e

melihat dari hasil pengujian di atas dapat dinyatakan bahwa pengaruh kelembaban_udara terhadap curah_hujan adalah signifikan dengan nilai p-value pada kolom Pr(>|t|) lebih kecil dari 0.05.

anova(model)
## Analysis of Variance Table
## 
## Response: curah.hujan
##                  Df  Sum Sq Mean Sq F value    Pr(>F)    
## suhu.udara        1  355005  355005 13.0700 0.0007821 ***
## kec.angin         1    7097    7097  0.2613 0.6118441    
## tekanan.udara     1  335389  335389 12.3478 0.0010530 ** 
## kelembaban.udara  1  714371  714371 26.3005 6.641e-06 ***
## Residuals        43 1167961   27162                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(model)

Mencari Data Prediksi Curah Hujan

predict(model);
##           1           2           3           4           5           6 
##  386.107673  399.044756  426.747302  393.911305  263.051435  219.370567 
##           7           8           9          10          11          12 
##  148.227349  113.147958   64.731549    1.070381  186.848324  336.746741 
##          13          14          15          16          17          18 
##  302.717990  401.364996  381.816542  294.697978  369.771580  319.924761 
##          19          20          21          22          23          24 
##  298.957257  293.560601  235.358286  286.583400  316.728494  398.209978 
##          25          26          27          28          29          30 
##  502.977242  411.620346  431.278340  353.305515  176.000127  155.753128 
##          31          32          33          34          35          36 
##   69.948410  -23.439740   86.560828  131.181883  323.628334  417.230383 
##          37          38          39          40          41          42 
##  498.914116  491.981679  416.423143  384.475569  268.166744  244.020718 
##          43          44          45          46          47          48 
##   -6.258749  -83.026652 -176.562168 -176.007496   33.843145  293.387951
prediksi_data = data.frame(suhu.udara,kec.angin,tekanan.udara,kelembaban.udara,curah.hujan,prediksi_curah.hujan=predict(model));

Mencari selisih antara data prediksi curah hujan dengan data curah hujan

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
## 
##     recode
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
prediksi_data = prediksi_data%>% mutate(selisih=abs(curah.hujan-predict(model)));
head(prediksi_data)
##   suhu.udara kec.angin tekanan.udara kelembaban.udara curah.hujan
## 1       23.1         3        1014.5             87.9       225.0
## 2       23.2         2        1014.5             90.3       495.0
## 3       23.4         3        1015.2             90.4       834.1
## 4       23.8         3        1014.6             88.0       491.0
## 5       22.7         2        1016.1             85.9       142.0
## 6       23.7         2        1015.9             83.1         3.0
##   prediksi_curah.hujan   selisih
## 1             386.1077 161.10767
## 2             399.0448  95.95524
## 3             426.7473 407.35270
## 4             393.9113  97.08869
## 5             263.0514 121.05143
## 6             219.3706 216.37057
head((prediksi_data), n = 48)
##    suhu.udara kec.angin tekanan.udara kelembaban.udara curah.hujan
## 1        23.1         3        1014.5             87.9       225.0
## 2        23.2         2        1014.5             90.3       495.0
## 3        23.4         3        1015.2             90.4       834.1
## 4        23.8         3        1014.6             88.0       491.0
## 5        22.7         2        1016.1             85.9       142.0
## 6        23.7         2        1015.9             83.1         3.0
## 7        23.0         2        1016.8             81.1         0.0
## 8        23.3         2        1016.9             79.4         2.0
## 9        26.2         2        1017.2             75.9         0.0
## 10       25.7         2        1017.5             73.5         0.0
## 11       26.0         2        1015.3             79.7        75.0
## 12       24.2         2        1015.3             87.7       409.0
## 13       24.2         1        1016.0             88.7       445.0
## 14       23.4         1        1015.2             92.9       726.0
## 15       24.3         2        1015.8             90.3       598.0
## 16       23.7         2        1015.4             86.1       422.0
## 17       24.6         2        1014.8             88.5       225.0
## 18       23.9         2        1015.7             87.5       259.0
## 19       23.7         2        1015.4             86.3        70.0
## 20       23.6         2        1015.4             86.1       102.0
## 21       24.1         2        1015.4             83.1       334.0
## 22       24.2         2        1014.7             84.7       216.0
## 23       24.1         1        1014.5             87.8       405.0
## 24       24.0         2        1012.7             87.9       180.0
## 25       23.4         4        1013.4             90.2       748.0
## 26       23.3         2        1014.0             90.3       614.0
## 27       23.5         3        1014.4             89.7       299.0
## 28       23.8         1        1014.8             90.0       327.0
## 29       24.2         2        1014.6             79.4       128.0
## 30       23.8         2        1015.1             79.2        92.0
## 31       23.6         2        1015.4             75.6        75.0
## 32       23.6         2        1015.2             71.0        33.0
## 33       24.7         2        1015.5             75.9        33.0
## 34       25.1         2        1014.4             76.6        43.0
## 35       24.1         2        1012.1             83.7       197.0
## 36       23.7         3        1012.6             87.0       498.0
## 37       23.5         4        1011.3             87.7       420.0
## 38       23.3         4        1012.9             89.2       479.0
## 39       23.5         2        1012.4             88.7       530.0
## 40       24.6         3        1014.2             86.7       197.0
## 41       24.7         3        1014.4             81.4         2.0
## 42       24.2         3        1015.3             81.5        18.0
## 43       23.7         3        1015.1             69.8         0.0
## 44       23.4         3        1015.7             67.0         0.0
## 45       25.1         3        1015.7             61.7         0.0
## 46       26.3         3        1015.9             61.3         0.0
## 47       25.8         2        1015.0             72.3       211.0
## 48       24.4         3        1013.8             82.1       462.0
##    prediksi_curah.hujan    selisih
## 1            386.107673 161.107673
## 2            399.044756  95.955244
## 3            426.747302 407.352698
## 4            393.911305  97.088695
## 5            263.051435 121.051435
## 6            219.370567 216.370567
## 7            148.227349 148.227349
## 8            113.147958 111.147958
## 9             64.731549  64.731549
## 10             1.070381   1.070381
## 11           186.848324 111.848324
## 12           336.746741  72.253259
## 13           302.717990 142.282010
## 14           401.364996 324.635004
## 15           381.816542 216.183458
## 16           294.697978 127.302022
## 17           369.771580 144.771580
## 18           319.924761  60.924761
## 19           298.957257 228.957257
## 20           293.560601 191.560601
## 21           235.358286  98.641714
## 22           286.583400  70.583400
## 23           316.728494  88.271506
## 24           398.209978 218.209978
## 25           502.977242 245.022758
## 26           411.620346 202.379654
## 27           431.278340 132.278340
## 28           353.305515  26.305515
## 29           176.000127  48.000127
## 30           155.753128  63.753128
## 31            69.948410   5.051590
## 32           -23.439740  56.439740
## 33            86.560828  53.560828
## 34           131.181883  88.181883
## 35           323.628334 126.628334
## 36           417.230383  80.769617
## 37           498.914116  78.914116
## 38           491.981679  12.981679
## 39           416.423143 113.576857
## 40           384.475569 187.475569
## 41           268.166744 266.166744
## 42           244.020718 226.020718
## 43            -6.258749   6.258749
## 44           -83.026652  83.026652
## 45          -176.562168 176.562168
## 46          -176.007496 176.007496
## 47            33.843145 177.156855
## 48           293.387951 168.612049
head(resid(model), n = 48)
##           1           2           3           4           5           6 
## -161.107673   95.955244  407.352698   97.088695 -121.051435 -216.370567 
##           7           8           9          10          11          12 
## -148.227349 -111.147958  -64.731549   -1.070381 -111.848324   72.253259 
##          13          14          15          16          17          18 
##  142.282010  324.635004  216.183458  127.302022 -144.771580  -60.924761 
##          19          20          21          22          23          24 
## -228.957257 -191.560601   98.641714  -70.583400   88.271506 -218.209978 
##          25          26          27          28          29          30 
##  245.022758  202.379654 -132.278340  -26.305515  -48.000127  -63.753128 
##          31          32          33          34          35          36 
##    5.051590   56.439740  -53.560828  -88.181883 -126.628334   80.769617 
##          37          38          39          40          41          42 
##  -78.914116  -12.981679  113.576857 -187.475569 -266.166744 -226.020718 
##          43          44          45          46          47          48 
##    6.258749   83.026652  176.562168  176.007496  177.156855  168.612049
data_iklim$residuals <- model$residuals

data_iklim$predicted <- model$fitted.values

data_iklim
## # A tibble: 48 × 8
##    Bulan                Suhu Kec.Angin Tekanan.Udara Kelembaban.Udara
##    <dttm>              <dbl>     <dbl>         <dbl>            <dbl>
##  1 2015-01-01 00:00:00  23.1         3         1014.             87.9
##  2 2015-02-01 00:00:00  23.2         2         1014.             90.3
##  3 2015-03-01 00:00:00  23.4         3         1015.             90.4
##  4 2015-04-01 00:00:00  23.8         3         1015.             88  
##  5 2015-05-01 00:00:00  22.7         2         1016.             85.9
##  6 2015-06-01 00:00:00  23.7         2         1016.             83.1
##  7 2015-07-01 00:00:00  23           2         1017.             81.1
##  8 2015-08-01 00:00:00  23.3         2         1017.             79.4
##  9 2015-09-01 00:00:00  26.2         2         1017.             75.9
## 10 2015-10-01 00:00:00  25.7         2         1018.             73.5
## # … with 38 more rows, and 3 more variables: Curah.Hujan <dbl>,
## #   residuals <dbl>, predicted <dbl>
scatter.smooth(x=data_iklim$Bulan, y=data_iklim$Curah.Hujan, main="Bulan ~ Curah.Hujan")