\(\text{1. Introduction}\)

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.

\(\text{2. Library dan Setup}\)

Library yang akan digunakan pada analisis data sebanyak 8 diantaranya sebagai berikut :

  1. library(dplyr) digunakan untuk memanipulasi data.
  1. library(GGally) digunakan untuk visualisai sebaran data, scatter plot dan menentukan korelasi antar peubah dalam satu frame.
  1. library(car) digunakan untuk melakukan pengujian regresi, membuat visualisasi, dan mengubah data.
  1. library(ggplot2) digunakan untuk membuat grafik yang merepresentasikan data numerik dan kategorik.
  1. library(lmtest) digunakan untuk memeriksa diagnostik dalam model regresi linier.
  1. library(caret) digunakan untuk mempersingkat proses training model dalam regresi.
  1. library (MLmetrics) digunakan untuk mengevaluasi metrik dan fungsi utilitas yang mengukur kinerja regresi.
  1. library (rsample) digunakan untuk membuat dan meringkas berbagai jenis objek rsampling.
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

\(\text{3. Import Data}\)

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)

\(\text{4. Data Preprocessing}\)

Data preprocessing adalah teknik yang digunakan untuk mengubah data mentah menjadi format yang lebih efisien dan bermanfaat. Berikut tahapan yang digunakan dalam data preprocessing :

\(\text{4.1 Cek Tipe Data}\)

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.

\(\text{4.2 Check Missing Value}\)

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.

\(\text{4.3 Check Outlier}\)

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.

\(\text{4.4 Cek Korelasi Data}\)

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 :

  1. Variabel strength mempunyai korelasi yang kuat dengan variabel cement.
  1. Variabel strength mempunyai korelasi yang negatif dengan variabel flyash, water, coarse_agg, dan fine_agg.
  1. Variabel strength mempunyai korelasi yang positif dengan variabel slag, super_plast, dan age.

\(\text{5. Data Cleansing}\)

Data cleansing adalah proses menyiapkan data untuk dilakukan analisis dengan cara menghapus atau memodifikasi data yang tidak relevan, duplikat, dan tidak terformat.

\(\text{5.1 Menghapus Data Kolom}\)

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)

\(\text{6. Cross Validation}\)

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.

\(\text{7. Data Modelling}\)

Data modelling adalah proses menganalisis objek data dan hubungannya dengan objek lain.

\(\text{7.1 Model Tuning 1 : Handle Outlier with scaling}\)

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 Evaluation

Model Evalution adalah bagian tambahan dari proses pengembangan model.

prediction_test <- predict(object = model_linear.step,newdata = semen.test, interval = "confidence", level = 0.95)
Computing MAE from the Data Test

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

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.

\(\text{7.2 Model Tuning 2 : Log transforming the Variabel}\)

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)
Computing MAE from the Data Test

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.

\(\text{8. Prediction Model}\)

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
  • Linearitas
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.

  • Normalitas
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.

\(\text{9. Kesimpulan}\)

Kesimpulan yang didapatkan dari pemodelan Regresi Linier data Semen adalah sebagai berikut:

\(\text{9.1 Handle Outlier with Scaling}\)

  • Adjusted R-squared : 0.6124 atau 61.24%
  • MAE test : 0.5001675
  • MAE train : 0.5079778

\(\text{9.2 Log Transforming}\)

  • Adjusted R-squared : 0.8047 atau 80.47%
  • MAE test : 0.1841183
  • MAE train : 0.1841183

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.