Semen adalah salah satu bahan baku yang digunakan dalam pembuatan beton dengan campuran bahan-bahan lainnya. Setiap beton memiliki kekuatan yang dipengaruhi oleh komponen dalam pembuatannya. Kualitas beton dapat dipengaruhi oleh kualitas bahan dasar yang digunakan. Sehingga dibutuhkan model untuk memprediksi kualitas beton tersebut. Untuk mendapatkan model yang terbaik dilakukan analisis data semen.
Library yang akan digunakan pada analisis data sebanyak 8 diantaranya sebagai berikut :
library(dplyr)##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(GGally)## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(car)## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(ggplot2)
library(lmtest)## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(caret)## Warning: package 'caret' was built under R version 4.1.2
## Loading required package: lattice
library(MLmetrics)## Warning: package 'MLmetrics' was built under R version 4.1.2
##
## Attaching package: 'MLmetrics'
## The following objects are masked from 'package:caret':
##
## MAE, RMSE
## The following object is masked from 'package:base':
##
## Recall
library(rsample)## Warning: package 'rsample' was built under R version 4.1.2
Pada bagian ini data yang akan digunakan adalah data train semen dan data test semen, dimana data train semen akan digunakan untuk melatih model dan data test semen akan digunakan untuk memprediksi model.
train.semen<-read.csv("data_train_semen.csv")
head(train.semen)test.semen<-read.csv("data_test_semen.csv")
head(test.semen)
Data preprocessing adalah teknik yang digunakan untuk mengubah data mentah menjadi format yang lebih efisien dan bermanfaat. Berikut tahapan yang digunakan dalam data preprocessing :
Pada data preprocessing, langkah pertama yang dapat kita lakukan adalah mengecek tipe data. Untuk mengetahui tipe data tersebut dapat menggunakan function “str(data)” sebagai berikut :
str(train.semen)## 'data.frame': 825 obs. of 10 variables:
## $ id : chr "S1" "S2" "S3" "S4" ...
## $ cement : num 540 540 332 332 199 ...
## $ slag : num 0 0 142 142 132 ...
## $ flyash : num 0 0 0 0 0 0 0 0 0 0 ...
## $ water : num 162 162 228 228 192 228 228 228 192 192 ...
## $ super_plast: num 2.5 2.5 0 0 0 0 0 0 0 0 ...
## $ coarse_agg : num 1040 1055 932 932 978 ...
## $ fine_agg : num 676 676 594 594 826 ...
## $ age : int 28 28 270 365 360 365 28 28 90 28 ...
## $ strength : num 80 61.9 40.3 41 44.3 ...
Dapat dilihat, bahwa tipe data tersebut sudah benar.
Missing Value adalah hilangnya beberapa data yang telah diperoleh. Untuk mengetahui apakah tedapat data yang “hilang”, maka dapat dilakukan cek Missing Value sebagai berikut :
summary(is.na(train.semen))## id cement slag flyash
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:825 FALSE:825 FALSE:825 FALSE:825
## water super_plast coarse_agg fine_agg
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:825 FALSE:825 FALSE:825 FALSE:825
## age strength
## Mode :logical Mode :logical
## FALSE:825 FALSE:825
Pada hasil cek missing value, dapat dilihat bahwa dari setiap kolom tidak ada yang bernilai TRUE berarti tidak ada missing value.
Outlier adalah suatu data yang jauh berbeda dibandingkan dengan keseluruhan data. Outlier dapat di cek dengan menggunakan boxplot.
boxplot(train.semen %>% select(-1))Berdasarkan boxplot di atas dapat dilihat bahwa Outlier terdapat pada variabel slag, water, coarse_agg, age, dan strenght.
summary(train.semen)## id cement slag flyash
## Length:825 Min. :102.0 Min. : 0.00 Min. : 0.00
## Class :character 1st Qu.:194.7 1st Qu.: 0.00 1st Qu.: 0.00
## Mode :character Median :275.1 Median : 20.00 Median : 0.00
## Mean :280.9 Mean : 73.18 Mean : 54.03
## 3rd Qu.:350.0 3rd Qu.:141.30 3rd Qu.:118.20
## Max. :540.0 Max. :359.40 Max. :200.10
## water super_plast coarse_agg fine_agg
## Min. :121.8 Min. : 0.000 Min. : 801.0 Min. :594.0
## 1st Qu.:164.9 1st Qu.: 0.000 1st Qu.: 932.0 1st Qu.:734.0
## Median :184.0 Median : 6.500 Median : 968.0 Median :780.1
## Mean :181.1 Mean : 6.266 Mean : 972.8 Mean :775.6
## 3rd Qu.:192.0 3rd Qu.:10.100 3rd Qu.:1028.4 3rd Qu.:826.8
## Max. :247.0 Max. :32.200 Max. :1145.0 Max. :992.6
## age strength
## Min. : 1.00 Min. : 2.33
## 1st Qu.: 7.00 1st Qu.:23.64
## Median : 28.00 Median :34.57
## Mean : 45.14 Mean :35.79
## 3rd Qu.: 56.00 3rd Qu.:45.94
## Max. :365.00 Max. :82.60
Berdasarkan hasil summary dari data di atas diperoleh nilai minimal, quartil 1, median, mean, quartil 3, dan nilai maksimal dari setiap variabel kecuali variabel id, karena termasuk tipe data karakter.
Korelasi data adalah nilai kekuatan dan arah hubungan linier antara 2 variabel atau lebih. Korelasi dibagi menjadi 2 yaitu korelasi positif dan korelasi negatif. - Korelasi positif artinya hubungan antara 2 variabel atau lebih menunjukkan arah yang sama, dimana apabila terjadi penambahan nilai pada variabel yang satu maka akan diikuti dengan penambahan nilai variabel lainnya. - Korelasi negatif artinya hubungan antara 2 variabel atau lebih menunjukkan arah yang berlawanan, dimana apabila terjadi penambahan nilai pada variabel yang satu maka variabel lainnya mengalami penurunan.
ggcorr(train.semen, label = TRUE, label_size=3.3, hjust = 1, layout.exp = 1)## Warning in ggcorr(train.semen, label = TRUE, label_size = 3.3, hjust = 1, : data
## in column(s) 'id' are not numeric and were ignored
Berdasarkan tangga korelasi tiap atribut data diperoleh :
Data cleansing adalah proses menyiapkan data untuk dilakukan analisis dengan cara menghapus atau memodifikasi data yang tidak relevan, duplikat, dan tidak terformat.
Pada tahap sebelumnya, kita telah mengecek data outlier dari setiap variabel kecuali variabel id. Setelah itu, kita dapat menghapus data outlier tersebur agar data yang dihasilkan lebih akurat. Menghapus data outlier dapat dilakukan sebagai berikut :
semen_without_id<-train.semen%>%
select(-1)semen.scale <- semen_without_id %>%
filter(strength<79.9) %>%
as.matrix() %>%
scale() %>%
as.data.frame()
head(semen.scale)
Cross validation adalah suatu metode tambahan dari teknik data yang bertujuan untuk memperoleh hasil akurasi yang maksimal. Cross validation dapat diperoleh sebagai berikut :
set.seed(800)
idx <- initial_split(semen.scale,prop = 0.85,strata = "strength")
semen.train <- training(idx)
semen.test <- testing(idx)Fungsi set.seed() digunakan untuk mengambil argumen.
Data modelling adalah proses menganalisis objek data dan hubungannya dengan objek lain.
Pada tahap sebelumnya, kita telah mengecek data outlier dari setiap variabel kecuali variabel id. Setelah itu, kita dapat menghapus data outlier tersebur agar data yang dihasilkan lebih akurat. Menghapus data outlier dapat dilakukan sebagai berikut :
model_linear <- lm(formula= strength ~.,semen.train)
model_linear.step <- step(object = model_linear, direction = "both")## Start: AIC=-631.86
## strength ~ cement + slag + flyash + water + super_plast + coarse_agg +
## fine_agg + age
##
## Df Sum of Sq RSS AIC
## <none> 274.35 -631.86
## - water 1 1.049 275.40 -631.20
## - fine_agg 1 1.862 276.21 -629.15
## - coarse_agg 1 2.748 277.10 -626.92
## - super_plast 1 6.136 280.49 -618.45
## - flyash 1 14.778 289.13 -597.29
## - slag 1 29.200 303.55 -563.37
## - cement 1 55.325 329.68 -505.82
## - age 1 124.814 399.17 -372.51
Dari model di atas, diperoleh nilai AIC sebesar -637.87
summary(model_linear.step)##
## Call:
## lm(formula = strength ~ cement + slag + flyash + water + super_plast +
## coarse_agg + fine_agg + age, data = semen.train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.68027 -0.38915 0.03948 0.43353 1.98941
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.001695 0.023953 0.071 0.94360
## cement 0.767126 0.065128 11.779 < 2e-16 ***
## slag 0.539418 0.063037 8.557 < 2e-16 ***
## flyash 0.361630 0.059403 6.088 1.90e-09 ***
## water -0.101176 0.062372 -1.622 0.10523
## super_plast 0.159167 0.040577 3.923 9.64e-05 ***
## coarse_agg 0.137020 0.052195 2.625 0.00885 **
## fine_agg 0.137363 0.063570 2.161 0.03105 *
## age 0.437945 0.024754 17.692 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6315 on 688 degrees of freedom
## Multiple R-squared: 0.6053, Adjusted R-squared: 0.6008
## F-statistic: 131.9 on 8 and 688 DF, p-value: < 2.2e-16
Dari model tunning dari Handle Outlier with Scalling diperoleh nilai Adjusted R-squared sebesar 0,6124 atau 61.24%.
Model Evalution adalah bagian tambahan dari proses pengembangan model.
prediction_test <- predict(object = model_linear.step,newdata = semen.test, interval = "confidence", level = 0.95)
MAE (Mean Absolute Error) adalah salah satu metode yang digunakan untuk mengukur tingkat keakuratan model peramalan. Tujuan dari MAE adalah untuk menunjukkan rata-rata kesalahan (error) absolut antara hasil peramalan/prediksi dengan nilai riil. Untuk menghitung MAE sebagai berikut:
MAE<-mean(abs(prediction_test - semen.test$strength))
MAE## [1] 0.483399
Sehingga diperoleh MAE dari data test sebesar 0.5001675
prediction_train <- predict(object = model_linear.step,newdata = semen.train, interval = "confidence", level = 0.95)Computing MAE from the Data Train
MAE<-mean(abs(prediction_train - semen.train$strength))
MAE## [1] 0.5099814
Sehingga diperoleh MAE dari data test sebesar 0.5079778
Assumption Checking dapat dilakukan dengan:
#Normality Test
shapiro.test(model_linear$residuals)##
## Shapiro-Wilk normality test
##
## data: model_linear$residuals
## W = 0.99539, p-value = 0.03571
Nilai p-value dari uji normalitas di atas sebesar 0.001638 sehingga kurang dari 0.05. Jadi nilai errornya tidak berdistribusi normal.
#Heteroskedasticity assumption
bptest(formula = model_linear)##
## studentized Breusch-Pagan test
##
## data: model_linear
## BP = 102.32, df = 8, p-value < 2.2e-16
Jadi, data tersebut adalah Heteroscedasticity
#Variance Inflation Factor assumption
vif(model_linear)## cement slag flyash water super_plast coarse_agg
## 7.627366 7.016333 6.112774 6.864843 2.943924 4.856046
## fine_agg age
## 7.221076 1.101765
Jadi, tidak ada multikolinearitas karena semua variabel mempunyai nilai VIF kurang dari 10.
Log Transforming adalah metode transformasi data yang menggantikan setiap variabel x dengan log (x).Log Transforming berguna untuk memperbaiki data yang terdistribusi Positive Skew dan Unequal Variances.
Log Transforming
train.log <- log1p(semen_without_id)
test.log <- log1p(semen_without_id)semen.log3<- lm(data = train.log, formula = strength ~ .)
summary(semen.log3)##
## Call:
## lm(formula = strength ~ ., data = train.log)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.9458 -0.1311 0.0201 0.1552 0.5682
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.482578 2.471153 1.409 0.15913
## cement 0.771994 0.034998 22.058 < 2e-16 ***
## slag 0.065494 0.005653 11.585 < 2e-16 ***
## flyash 0.024491 0.005864 4.176 3.28e-05 ***
## water -0.846822 0.131538 -6.438 2.07e-10 ***
## super_plast 0.082210 0.013247 6.206 8.63e-10 ***
## coarse_agg 0.168115 0.162380 1.035 0.30083
## fine_agg -0.356007 0.128062 -2.780 0.00556 **
## age 0.301523 0.007392 40.793 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2335 on 816 degrees of freedom
## Multiple R-squared: 0.8066, Adjusted R-squared: 0.8047
## F-statistic: 425.3 on 8 and 816 DF, p-value: < 2.2e-16
Dengan menggunakan log transforming diperoleh nilai Adjusted R-Squared sebesar 0.8047 atau 80.47%.
Predict
pred_test<-predict(object = semen.log3,newdata = test.log, interval = "confidence", level = 0.95)Seperti yang telah dijelaskan pada model tuning pertama, kita dapat memperoleh MAE sebagai berikut:
MAE<-mean(abs(pred_test - test.log$strength))
MAE## [1] 0.1841183
Sehingga diperoleh nilai MAE dari data test sebesar 0.1841183.
pred_train3<-predict(object = semen.log3,newdata = train.log, interval = "confidence", level = 0.95)Computing MAE from the Data Train
MAE<-mean(abs(pred_train3 - train.log$strength))
MAE## [1] 0.1841183
Sehingga diperoleh nilai MAE dari data train sebesar 0.1841183.
Prediction Model adalah metode untuk memprediksi future outcomes dengan menggunakan pemodelan data. Prediction Model dapat diperoleh sebagai berikut:
final.model<-lm(data= train.log, formula = strength ~ .)
summary(final.model)##
## Call:
## lm(formula = strength ~ ., data = train.log)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.9458 -0.1311 0.0201 0.1552 0.5682
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.482578 2.471153 1.409 0.15913
## cement 0.771994 0.034998 22.058 < 2e-16 ***
## slag 0.065494 0.005653 11.585 < 2e-16 ***
## flyash 0.024491 0.005864 4.176 3.28e-05 ***
## water -0.846822 0.131538 -6.438 2.07e-10 ***
## super_plast 0.082210 0.013247 6.206 8.63e-10 ***
## coarse_agg 0.168115 0.162380 1.035 0.30083
## fine_agg -0.356007 0.128062 -2.780 0.00556 **
## age 0.301523 0.007392 40.793 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2335 on 816 degrees of freedom
## Multiple R-squared: 0.8066, Adjusted R-squared: 0.8047
## F-statistic: 425.3 on 8 and 816 DF, p-value: < 2.2e-16
predict.semen<- predict(object = final.model, newdata = test.semen
%>% select(-strength))
head(predict.semen)## 1 2 3 4 5 6
## -31.48038 -50.17478 170.17190 -85.17437 103.33468 97.20342
Asumsi
test.linearirty<- data.frame(residual = final.model$residuals, fitted = final.model$fitted.values)
test.linearirty %>% ggplot(aes(fitted, residual)) + geom_point() + geom_hline(aes(yintercept = 0)) +
geom_smooth() + theme(panel.grid = element_blank(), panel.background = element_blank())## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Berdasarkan ilustrasi tersebut, mengindikasikan bahwa asumsi linearitas telah terpenuhi karena titik-titik observasi tersebar merata dan tidak membentuk pola tertentu.
hist(final.model$residuals)shapiro.test(final.model$residuals)##
## Shapiro-Wilk normality test
##
## data: final.model$residuals
## W = 0.98243, p-value = 2.133e-08
Asumsi normalitas dari residuals tidak terpenuhi karena nilai p-value sebesar 2.133e-08 kurang dari 0.05. Sehingga dapat disimpulkan bahwa residual memiliki distribusi yang tidak normal.
Kesimpulan yang didapatkan dari pemodelan Regresi Linier data Semen adalah sebagai berikut:
Jadi, dari kedua model multiple linear regression tersebut dapat disimpulkan bahwa model terbaik adalah model Log Transforming karena memiliki nilai Adjusted R-Squared lebih besar daripada model Handle Outlier with Scaling. Pada Log Transforming diperoleh Adjusted R-Squared sebesar 80.47% dan nilai MAE kurang dari 4.