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")