# ==============================================================================
# PROYEK DATA DENGAN R! (CLO-6) - WAWASAN GLOBAL TIK
# TOPIK: ANALISIS PREDIKSI KUAT TEKAN BETON MENGGUNAKAN REGRESI LINEAR BERGANDA
# ==============================================================================
# Anggota Kelompok:
# 1. Nashwa Aqeela Irtisa Rudin (103102400006)
# 2. Nisrina Hibatullah (103102400013)
# 3. Auliya Nisa' Nur Rohmah (103102400056)
# ==============================================================================
# ------------------------------------------------------------------------------
# 1. PREPARASI & PEMBACAAN DATA
# ------------------------------------------------------------------------------
# Mengaktifkan library yang diperlukan untuk visualisasi data
# (Pastikan instalasi dahulu jika belum ada menggunakan: install.packages("ggplot2") dan install.packages("corrplot"))
library(ggplot2)
library(corrplot)
## corrplot 0.95 loaded
# Membaca data dari file CSV (Sesuaikan path file dengan direktori Anda)
# Di dalam R, kita membaca file CSV menggunakan fungsi bawaan read.csv()
data_beton <- read.csv("Concrete_Data.csv")
# Menampilkan struktur awal data untuk memastikan file terbaca dengan benar
cat("--- Struktur Awal Dataset ---\n")
## --- Struktur Awal Dataset ---
str(data_beton)
## 'data.frame': 1030 obs. of 9 variables:
## $ Cement..component.1..kg.in.a.m.3.mixture. : num 540 540 332 332 199 ...
## $ Blast.Furnace.Slag..component.2..kg.in.a.m.3.mixture.: num 0 0 142 142 132 ...
## $ Fly.Ash..component.3..kg.in.a.m.3.mixture. : num 0 0 0 0 0 0 0 0 0 0 ...
## $ Water...component.4..kg.in.a.m.3.mixture. : num 162 162 228 228 192 228 228 228 228 228 ...
## $ Superplasticizer..component.5..kg.in.a.m.3.mixture. : num 2.5 2.5 0 0 0 0 0 0 0 0 ...
## $ Coarse.Aggregate...component.6..kg.in.a.m.3.mixture. : num 1040 1055 932 932 978 ...
## $ Fine.Aggregate..component.7..kg.in.a.m.3.mixture. : num 676 676 594 594 826 ...
## $ Age..day. : num 28 28 270 365 360 90 365 28 28 28 ...
## $ Concrete.compressive.strength.MPa..megapascals.. : num 80 61.9 40.3 41 44.3 ...
# Sesuai dengan spesifikasi variabel pada Bab 3 Laporan Anda:
# X1: Cement, X2: Blast Furnace Slag, X3: Fly Ash, X4: Water, X5: Superplasticizer, Y: Strength
# Di bawah ini kita memilih 5 variabel prediktor dan 1 variabel respons secara eksplisit
df_analisis <- data_beton[, c(1, 2, 3, 4, 5, 9)]
# Mengubah nama kolom agar lebih mudah dipahami dan sesuai dengan kode laporan
colnames(df_analisis) <- c("Semen", "Slag", "FlyAsh", "Air", "Superplasticizer", "KuatTekan")
# Menampilkan ringkasan statistik deskriptif dari dataset (Mencakup Min, Mean, Max, dll.)
cat("\n--- Statistik Deskriptif Dataset Analisis ---\n")
##
## --- Statistik Deskriptif Dataset Analisis ---
summary(df_analisis)
## Semen Slag FlyAsh Air
## Min. :102.0 Min. : 0.0 Min. : 0.00 Min. :121.8
## 1st Qu.:192.4 1st Qu.: 0.0 1st Qu.: 0.00 1st Qu.:164.9
## Median :272.9 Median : 22.0 Median : 0.00 Median :185.0
## Mean :281.2 Mean : 73.9 Mean : 54.19 Mean :181.6
## 3rd Qu.:350.0 3rd Qu.:142.9 3rd Qu.:118.30 3rd Qu.:192.0
## Max. :540.0 Max. :359.4 Max. :200.10 Max. :247.0
## Superplasticizer KuatTekan
## Min. : 0.000 Min. : 2.33
## 1st Qu.: 0.000 1st Qu.:23.71
## Median : 6.400 Median :34.45
## Mean : 6.205 Mean :35.82
## 3rd Qu.:10.200 3rd Qu.:46.13
## Max. :32.200 Max. :82.60
# ------------------------------------------------------------------------------
# 2. EKSPLORASI DATA & ANALISIS KORELASI PEARSON
# ------------------------------------------------------------------------------
# Perhitungan Matriks Korelasi Pearson secara bivariat
matriks_korelasi <- cor(df_analisis)
cat("\n--- Matriks Korelasi Pearson ---\n")
##
## --- Matriks Korelasi Pearson ---
print(matriks_korelasi)
## Semen Slag FlyAsh Air
## Semen 1.00000000 -0.27521591 -0.3974673 -0.08158675
## Slag -0.27521591 1.00000000 -0.3235799 0.10725203
## FlyAsh -0.39746734 -0.32357990 1.0000000 -0.25698402
## Air -0.08158675 0.10725203 -0.2569840 1.00000000
## Superplasticizer 0.09238617 0.04327042 0.3775031 -0.65753291
## KuatTekan 0.49783192 0.13482926 -0.1057549 -0.28963338
## Superplasticizer KuatTekan
## Semen 0.09238617 0.4978319
## Slag 0.04327042 0.1348293
## FlyAsh 0.37750315 -0.1057549
## Air -0.65753291 -0.2896334
## Superplasticizer 1.00000000 0.3660788
## KuatTekan 0.36607883 1.0000000
# Visualisasi Heatmap Matriks Korelasi untuk mendeteksi multikolinearitas awal
# Sesuai pembahasan laporan mengenai hubungan substitutif X1-X2, X1-X3, dan X4-X5
corrplot(matriks_korelasi, method = "color", type = "upper",
addCoef.col = "black", tl.col = "black", tl.srt = 45,
title = "Heatmap Matriks Korelasi Pearson", mar = c(0,0,2,0))

# Visualisasi Scatter Plot hubungan salah satu komponen dominan (Semen) vs Kuat Tekan
ggplot(df_analisis, aes(x = Semen, y = KuatTekan)) +
geom_point(color = "darkblue", alpha = 0.6) +
geom_smooth(method = "lm", color = "red", se = TRUE) +
labs(title = "Scatter Plot Hubungan Kandungan Semen (X1) vs Kuat Tekan Beton (Y)",
x = "Semen (kg/m³)", y = "Kuat Tekan Beton (MPa)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

# ------------------------------------------------------------------------------
# 3. PEMODELAN REGRESI LINEAR BERGANDA (MANUAL OLS & FUNGSI BAWAAN)
# ------------------------------------------------------------------------------
# Laporan Anda menekankan pendekatan dari dasar (from scratch) menggunakan Aljabar Matriks.
# Berikut adalah replikasi matematis rumus OLS: Beta = (X^T * X)^-1 * X^T * Y
# Menyiapkan Vektor Respons Y
Y <- as.matrix(df_analisis$KuatTekan)
# Menyiapkan Matriks Desain X dan menambahkan kolom konstanta 1 di posisi pertama untuk Intercept
X <- as.matrix(df_analisis[, 1:5])
X_matriks <- cbind(Intercept = 1, X)
# Menghitung Transpose X (X^T)
X_transpose <- t(X_matriks)
# Perhitungan Perkalian Matriks (X^T * X) dan Invers Matriks menggunakan fungsi solve()
X_inv <- solve(X_transpose %*% X_matriks)
# Menghitung nilai Koefisien Regresi (Beta) secara manual
beta_manual <- X_inv %*% X_transpose %*% Y
cat("\n--- Hasil Koefisien Regresi OLS Manual (Aljabar Matriks) ---\n")
##
## --- Hasil Koefisien Regresi OLS Manual (Aljabar Matriks) ---
print(beta_manual)
## [,1]
## Intercept 17.12076384
## Semen 0.10671324
## Slag 0.07700989
## FlyAsh 0.05434425
## Air -0.12012291
## Superplasticizer 0.30101892
# Validasi menggunakan fungsi bawaan RStudio 'lm' (Linear Model) untuk menghasilkan ringkasan pengujian statistik
model_regresi <- lm(KuatTekan ~ Semen + Slag + FlyAsh + Air + Superplasticizer, data = df_analisis)
# Menampilkan hasil komprehensif (Koefisien, Std. Error, nilai uji-t, p-value, dan R-squared)
cat("\n--- Ringkasan Hasil Model Regresi (Fungsi lm RStudio) ---\n")
##
## --- Ringkasan Hasil Model Regresi (Fungsi lm RStudio) ---
summary(model_regresi)
##
## Call:
## lm(formula = KuatTekan ~ Semen + Slag + FlyAsh + Air + Superplasticizer,
## data = df_analisis)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.813 -8.998 -0.178 8.626 36.106
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 17.120764 4.991235 3.430 0.000627 ***
## Semen 0.106713 0.005076 21.024 < 2e-16 ***
## Slag 0.077010 0.005922 13.005 < 2e-16 ***
## FlyAsh 0.054344 0.009211 5.900 4.94e-09 ***
## Air -0.120123 0.024636 -4.876 1.25e-06 ***
## Superplasticizer 0.301019 0.101040 2.979 0.002958 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12.44 on 1024 degrees of freedom
## Multiple R-squared: 0.4478, Adjusted R-squared: 0.4451
## F-statistic: 166.1 on 5 and 1024 DF, p-value: < 2.2e-16
# ------------------------------------------------------------------------------
# 4. SISTEM PREDIKSI KOMPOSISI CAMPURAN BARU
# ------------------------------------------------------------------------------
# Membuat data dummy pengujian dengan komposisi campuran beton baru yang ingin diprediksi
# Format: Semen, Slag, FlyAsh, Air, Superplasticizer
data_baru <- data.frame(
Semen = 280,
Slag = 50,
FlyAsh = 0,
Air = 180,
Superplasticizer = 8
)
# Melakukan prediksi kuat tekan beton berdasarkan model regresi yang telah dibangun
prediksi_y <- predict(model_regresi, newdata = data_baru)
cat("\n--- Sistem Prediksi Komposisi Baru ---\n")
##
## --- Sistem Prediksi Komposisi Baru ---
cat("Komposisi Input:\n")
## Komposisi Input:
print(data_baru)
## Semen Slag FlyAsh Air Superplasticizer
## 1 280 50 0 180 8
cat(paste("Hasil Prediksi Kuat Tekan Beton adalah:", round(prediksi_y, 4), "MPa\n"))
## Hasil Prediksi Kuat Tekan Beton adalah: 31.637 MPa