Gunakan data ames
pada package modeldata
.
Buatlah model regresi linear sederhana variable respon
Sale_Price
dan variabel predictor adalah selain variabel
Sale_Price
. Pilih model terbaik berdasarkan nilai adjusted
r-squared tertinggi. Nilai adjusted R squared dan variable predictor
harus berada dalam satu data.frame dengan dua kolom. Jika ada model yang
error maka nilai R-squarenya adalah NA. Untuk mengerjakan soal ini
diwajibkan menggunaka for
atau while
.
Langkah awalnya yaitu mengaktifkan package yang telah diinstall agar
dapat memanggil data yang akan digunakan.
# Memanggil package dan data
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
data("ames", package="modeldata")
DT::datatable(ames)
Selanjutnya, membuat sebuah data frame kosong yang akan digunakan
untuk menyimpan hasil.
# Membuat data frame kosong untuk menyimpan hasil
results <- data.frame(Variable = character(0), Adj_R_Squared = numeric(0))
Membuat list yang berisikan semua variabel prediktor, dimana semua
variabel merupakan variabel prediktor kecuali variabel Sale_Price.
# List semua variabel yang bukan "Sale_Price"
predictor_vars <- setdiff(names(ames), "Sale_Price") # Exclude Sale_Price
predictor_vars
## [1] "MS_SubClass" "MS_Zoning" "Lot_Frontage"
## [4] "Lot_Area" "Street" "Alley"
## [7] "Lot_Shape" "Land_Contour" "Utilities"
## [10] "Lot_Config" "Land_Slope" "Neighborhood"
## [13] "Condition_1" "Condition_2" "Bldg_Type"
## [16] "House_Style" "Overall_Cond" "Year_Built"
## [19] "Year_Remod_Add" "Roof_Style" "Roof_Matl"
## [22] "Exterior_1st" "Exterior_2nd" "Mas_Vnr_Type"
## [25] "Mas_Vnr_Area" "Exter_Cond" "Foundation"
## [28] "Bsmt_Cond" "Bsmt_Exposure" "BsmtFin_Type_1"
## [31] "BsmtFin_SF_1" "BsmtFin_Type_2" "BsmtFin_SF_2"
## [34] "Bsmt_Unf_SF" "Total_Bsmt_SF" "Heating"
## [37] "Heating_QC" "Central_Air" "Electrical"
## [40] "First_Flr_SF" "Second_Flr_SF" "Gr_Liv_Area"
## [43] "Bsmt_Full_Bath" "Bsmt_Half_Bath" "Full_Bath"
## [46] "Half_Bath" "Bedroom_AbvGr" "Kitchen_AbvGr"
## [49] "TotRms_AbvGrd" "Functional" "Fireplaces"
## [52] "Garage_Type" "Garage_Finish" "Garage_Cars"
## [55] "Garage_Area" "Garage_Cond" "Paved_Drive"
## [58] "Wood_Deck_SF" "Open_Porch_SF" "Enclosed_Porch"
## [61] "Three_season_porch" "Screen_Porch" "Pool_Area"
## [64] "Pool_QC" "Fence" "Misc_Feature"
## [67] "Misc_Val" "Mo_Sold" "Year_Sold"
## [70] "Sale_Type" "Sale_Condition" "Longitude"
## [73] "Latitude"
Dilakukan looping menggunakan fungsi for untuk semua variabel
prediktor menggunakan regresi linear sederhana. Setelah diperoleh
modelnya, dilakukan perhitungan adjusted R-Squared. Hasil adjusted
R-Squared ini nanti dan juga varibel-variabel prediktornya dimasukkan
kedalam data frame yang telah dibuat diawal sehingga data frame terdiri
dari dua kolom. Jika ada model yang error maka nilai R-squarenya adalah
NA.
# Melakukan looping melalui variabel prediktor
for (var in predictor_vars) {
# Untuk menangani eror dalam looping
tryCatch({
# Membuat formula regresi sederhana
formula <- as.formula(paste("Sale_Price ~", var))
# Membuat model
model <- lm(formula, data = ames)
# Menghitung adjusted R-squared
adj_r_squared <- summary(model)$adj.r.squared
# Menambahkan results ke data frame
results <- rbind(results, data.frame(Variable = var, Adj_R_Squared = adj_r_squared))
},
error = function(e) {
# Jika terjadi kesalahan, tambahkan NA ke data frame
results <- rbind(results, data.frame(Variable = var, Adj_R_Squared = NA))
})
}
Untuk melihat outputnya yang sudah dalam bentuk data frame, dapat
dipanggil menggunakan perintah print().
# Tampilkan hasil dalam bentuk data frame
print(results)
## Variable Adj_R_Squared
## 1 MS_SubClass 2.438949e-01
## 2 MS_Zoning 1.139898e-01
## 3 Lot_Frontage 4.042571e-02
## 4 Lot_Area 7.073122e-02
## 5 Street 3.202224e-03
## 6 Alley 2.143300e-02
## 7 Lot_Shape 9.073830e-02
## 8 Land_Contour 4.271130e-02
## 9 Utilities 3.738535e-04
## 10 Lot_Config 1.966657e-02
## 11 Land_Slope 4.020743e-03
## 12 Neighborhood 5.693070e-01
## 13 Condition_1 4.253320e-02
## 14 Condition_2 2.203140e-02
## 15 Bldg_Type 3.320744e-02
## 16 House_Style 7.522768e-02
## 17 Overall_Cond 1.479533e-01
## 18 Year_Built 3.116047e-01
## 19 Year_Remod_Add 2.838165e-01
## 20 Roof_Style 7.646668e-02
## 21 Roof_Matl 1.369118e-02
## 22 Exterior_1st 1.655553e-01
## 23 Exterior_2nd 1.648246e-01
## 24 Mas_Vnr_Type 1.901676e-01
## 25 Mas_Vnr_Area 2.519454e-01
## 26 Exter_Cond 2.569299e-02
## 27 Foundation 2.788981e-01
## 28 Bsmt_Cond 4.959543e-02
## 29 Bsmt_Exposure 1.792671e-01
## 30 BsmtFin_Type_1 2.261133e-01
## 31 BsmtFin_SF_1 1.786417e-02
## 32 BsmtFin_Type_2 2.898659e-02
## 33 BsmtFin_SF_2 -3.053066e-04
## 34 Bsmt_Unf_SF 3.327162e-02
## 35 Total_Bsmt_SF 3.998879e-01
## 36 Heating 8.028479e-03
## 37 Heating_QC 2.139935e-01
## 38 Central_Air 6.964600e-02
## 39 Electrical 5.700179e-02
## 40 First_Flr_SF 3.862716e-01
## 41 Second_Flr_SF 7.224526e-02
## 42 Gr_Liv_Area 4.993669e-01
## 43 Bsmt_Full_Bath 7.576259e-02
## 44 Bsmt_Half_Bath 9.417376e-04
## 45 Full_Bath 2.974438e-01
## 46 Half_Bath 8.094316e-02
## 47 Bedroom_AbvGr 2.037662e-02
## 48 Kitchen_AbvGr 1.401870e-02
## 49 TotRms_AbvGrd 2.452372e-01
## 50 Functional 1.521736e-02
## 51 Fireplaces 2.249408e-01
## 52 Garage_Type 2.472795e-01
## 53 Garage_Finish 3.069827e-01
## 54 Garage_Cars 4.191377e-01
## 55 Garage_Area 4.095755e-01
## 56 Garage_Cond 8.090454e-02
## 57 Paved_Drive 7.602660e-02
## 58 Wood_Deck_SF 1.067177e-01
## 59 Open_Porch_SF 9.762994e-02
## 60 Enclosed_Porch 1.625034e-02
## 61 Three_season_porch 6.972526e-04
## 62 Screen_Porch 1.224066e-02
## 63 Pool_Area 4.339072e-03
## 64 Pool_QC 1.794989e-02
## 65 Fence 3.682439e-02
## 66 Misc_Feature 3.083387e-03
## 67 Misc_Val -9.522395e-05
## 68 Mo_Sold 9.020804e-04
## 69 Year_Sold 5.932582e-04
## 70 Sale_Type 1.371611e-01
## 71 Sale_Condition 1.360941e-01
## 72 Longitude 6.288063e-02
## 73 Latitude 8.430517e-02
DT::datatable(results)
Untuk memastikan apakah hasil tersebut sudah merupakan data frame
atau bukan, digunakan perintah class().
class(results)
## [1] "data.frame"
Kemudian, memilih model terbaik berdasarkan nilai adjusted R-Squared
tertinggi dengan fungsi which.max().
# Mencari model terbaik dengan melihat adjusted R-squared tertinggi
best_model <- results[which.max(results$Adj_R_Squared), ]
print(best_model)
## Variable Adj_R_Squared
## 12 Neighborhood 0.569307
Diperoleh variabel prediktor dengan nilai adjusted R_Squared
tertinggi adalah variabel “Neighborhood” dengan adjusted R-Squared
sebesar 0.569307.
Gunakan fungsi lapply
sebagai pengganti for
dan while
untuk mengerjakan Question 1.
# Membuat list untuk menyimpan hasil
results2 <- data.frame(Variable = character(0), Adj_R_Squared = numeric(0))
Membuat list yang berisikan semua variabel prediktor, dimana semua
variabel merupakan variabel prediktor kecuali variabel Sale_Price.
# List semua variabel yang bukan "Sale_Price"
predictor_vars2 <- setdiff(names(ames), "Sale_Price") # Exclude Sale_Price
predictor_vars2
## [1] "MS_SubClass" "MS_Zoning" "Lot_Frontage"
## [4] "Lot_Area" "Street" "Alley"
## [7] "Lot_Shape" "Land_Contour" "Utilities"
## [10] "Lot_Config" "Land_Slope" "Neighborhood"
## [13] "Condition_1" "Condition_2" "Bldg_Type"
## [16] "House_Style" "Overall_Cond" "Year_Built"
## [19] "Year_Remod_Add" "Roof_Style" "Roof_Matl"
## [22] "Exterior_1st" "Exterior_2nd" "Mas_Vnr_Type"
## [25] "Mas_Vnr_Area" "Exter_Cond" "Foundation"
## [28] "Bsmt_Cond" "Bsmt_Exposure" "BsmtFin_Type_1"
## [31] "BsmtFin_SF_1" "BsmtFin_Type_2" "BsmtFin_SF_2"
## [34] "Bsmt_Unf_SF" "Total_Bsmt_SF" "Heating"
## [37] "Heating_QC" "Central_Air" "Electrical"
## [40] "First_Flr_SF" "Second_Flr_SF" "Gr_Liv_Area"
## [43] "Bsmt_Full_Bath" "Bsmt_Half_Bath" "Full_Bath"
## [46] "Half_Bath" "Bedroom_AbvGr" "Kitchen_AbvGr"
## [49] "TotRms_AbvGrd" "Functional" "Fireplaces"
## [52] "Garage_Type" "Garage_Finish" "Garage_Cars"
## [55] "Garage_Area" "Garage_Cond" "Paved_Drive"
## [58] "Wood_Deck_SF" "Open_Porch_SF" "Enclosed_Porch"
## [61] "Three_season_porch" "Screen_Porch" "Pool_Area"
## [64] "Pool_QC" "Fence" "Misc_Feature"
## [67] "Misc_Val" "Mo_Sold" "Year_Sold"
## [70] "Sale_Type" "Sale_Condition" "Longitude"
## [73] "Latitude"
Dengan menggunakan fungsi lappy, dilakukan regresi linear sederhana
untuk semua variabel prediktor. Setelah diperoleh modelnya, dilakukan
perhitungan adjusted R-Squared. Hasil adjusted R-Squared ini nanti dan
juga varibel-variabel prediktornya dimasukkan kedalam data frame yang
telah dibuat diawal sehingga data frame terdiri dari dua kolom. Jika ada
model yang error maka nilai R-squarenya adalah NA.
# Menggunakan fungsi lappy melalui variabel prediktor
results <- lapply(predictor_vars2, function(var) {
# Untuk menangani eror dalam looping
tryCatch({
# Membuat formula regresi sederhana
formula <- as.formula(paste("Sale_Price ~", var))
# Membuat model
model <- lm(formula, data = ames)
# Menghitung adjusted R-squared
adj_r_squared2 <- summary(model)$adj.r.squared
# Mengembalikan hasil sebagai list dengan menambahkan nama kolom juga
results <- rbind(results2, data.frame(Variable = var, Adj_R_Squared = adj_r_squared2))
},
error = function(e) {
# Jika terjadi kesalahan, tambahkan NA ke data frame
results <- rbind(results2, data.frame(Variable = var, Adj_R_Squared = NA))
})
})
Untuk melihat outputnya dalam bentuk data frame, perlu digabungkan
terlebih dahulu hasil kedalam data frame.
# Gabungkan daftar hasil ke dalam data frame
results_df <- do.call(rbind, results)
print(results_df)
## Variable Adj_R_Squared
## 1 MS_SubClass 2.438949e-01
## 2 MS_Zoning 1.139898e-01
## 3 Lot_Frontage 4.042571e-02
## 4 Lot_Area 7.073122e-02
## 5 Street 3.202224e-03
## 6 Alley 2.143300e-02
## 7 Lot_Shape 9.073830e-02
## 8 Land_Contour 4.271130e-02
## 9 Utilities 3.738535e-04
## 10 Lot_Config 1.966657e-02
## 11 Land_Slope 4.020743e-03
## 12 Neighborhood 5.693070e-01
## 13 Condition_1 4.253320e-02
## 14 Condition_2 2.203140e-02
## 15 Bldg_Type 3.320744e-02
## 16 House_Style 7.522768e-02
## 17 Overall_Cond 1.479533e-01
## 18 Year_Built 3.116047e-01
## 19 Year_Remod_Add 2.838165e-01
## 20 Roof_Style 7.646668e-02
## 21 Roof_Matl 1.369118e-02
## 22 Exterior_1st 1.655553e-01
## 23 Exterior_2nd 1.648246e-01
## 24 Mas_Vnr_Type 1.901676e-01
## 25 Mas_Vnr_Area 2.519454e-01
## 26 Exter_Cond 2.569299e-02
## 27 Foundation 2.788981e-01
## 28 Bsmt_Cond 4.959543e-02
## 29 Bsmt_Exposure 1.792671e-01
## 30 BsmtFin_Type_1 2.261133e-01
## 31 BsmtFin_SF_1 1.786417e-02
## 32 BsmtFin_Type_2 2.898659e-02
## 33 BsmtFin_SF_2 -3.053066e-04
## 34 Bsmt_Unf_SF 3.327162e-02
## 35 Total_Bsmt_SF 3.998879e-01
## 36 Heating 8.028479e-03
## 37 Heating_QC 2.139935e-01
## 38 Central_Air 6.964600e-02
## 39 Electrical 5.700179e-02
## 40 First_Flr_SF 3.862716e-01
## 41 Second_Flr_SF 7.224526e-02
## 42 Gr_Liv_Area 4.993669e-01
## 43 Bsmt_Full_Bath 7.576259e-02
## 44 Bsmt_Half_Bath 9.417376e-04
## 45 Full_Bath 2.974438e-01
## 46 Half_Bath 8.094316e-02
## 47 Bedroom_AbvGr 2.037662e-02
## 48 Kitchen_AbvGr 1.401870e-02
## 49 TotRms_AbvGrd 2.452372e-01
## 50 Functional 1.521736e-02
## 51 Fireplaces 2.249408e-01
## 52 Garage_Type 2.472795e-01
## 53 Garage_Finish 3.069827e-01
## 54 Garage_Cars 4.191377e-01
## 55 Garage_Area 4.095755e-01
## 56 Garage_Cond 8.090454e-02
## 57 Paved_Drive 7.602660e-02
## 58 Wood_Deck_SF 1.067177e-01
## 59 Open_Porch_SF 9.762994e-02
## 60 Enclosed_Porch 1.625034e-02
## 61 Three_season_porch 6.972526e-04
## 62 Screen_Porch 1.224066e-02
## 63 Pool_Area 4.339072e-03
## 64 Pool_QC 1.794989e-02
## 65 Fence 3.682439e-02
## 66 Misc_Feature 3.083387e-03
## 67 Misc_Val -9.522395e-05
## 68 Mo_Sold 9.020804e-04
## 69 Year_Sold 5.932582e-04
## 70 Sale_Type 1.371611e-01
## 71 Sale_Condition 1.360941e-01
## 72 Longitude 6.288063e-02
## 73 Latitude 8.430517e-02
DT::datatable(results_df)
Untuk memastikan apakah hasil tersebut sudah merupakan data frame
atau bukan, digunakan perintah class().
class(results_df)
## [1] "data.frame"
Kemudian, memilih model terbaik berdasarkan nilai adjusted R-Squared
tertinggi dengan fungsi which.max().
# Mencari model terbaik dengan melihat adjusted R-squared tertinggi
best_model2 <- results_df[which.max(results_df$Adj_R_Squared), ]
print(best_model2)
## Variable Adj_R_Squared
## 12 Neighborhood 0.569307
Diperoleh variabel prediktor dengan nilai adjusted R_Squared
tertinggi adalah variabel “Neighborhood” dengan adjusted R-Squared
sebesar 0.569307.
Gunakan fungsi for
atau while
untuk
melakukan perkalian Matriks 5×5. Silahkan buat matriksmu sendiri untuk
ilustrasi. Bandingkan hasilnya dengan perkalian matriks di r menggunakan
%*%
Langkah awalnya yaitu dengan membuat matriks berukuran 5x5 sebagai
contoh. Matriks satu berisikan bilangan 1 sampai 25 dengan panjang baris
yaitu 5, sedangkan matriks dua berisikan bilangan 26 sampai 50 dengan
panjang baris yang sama yaitu 5.
# Buat dua matriks 5x5 sebagai contoh
matrix1 <- matrix(1:25, nrow = 5)
matrix1
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 6 11 16 21
## [2,] 2 7 12 17 22
## [3,] 3 8 13 18 23
## [4,] 4 9 14 19 24
## [5,] 5 10 15 20 25
matrix2 <- matrix(26:50, nrow = 5)
matrix2
## [,1] [,2] [,3] [,4] [,5]
## [1,] 26 31 36 41 46
## [2,] 27 32 37 42 47
## [3,] 28 33 38 43 48
## [4,] 29 34 39 44 49
## [5,] 30 35 40 45 50
Melakukan inisialisasi matriks untuk menyimpan hasil perkalian
matriks tersebut.
# Inisialisasi matriks hasil dengan nol untuk fungsi for
result_matrix_for <- matrix(0, nrow = 5, ncol = 5)
Selanjutnya, dilakukan perkalian matriks menggunakan looping dengan
fungsi for.
# Perkalian matriks dengan menggunakan for loop
for (i in 1:5) {
for (j in 1:5) {
for (k in 1:5) {
result_matrix_for[i, j] <- result_matrix_for[i, j] + matrix1[i, k] * matrix2[k, j]
}
}
}
Untuk melihat perkalian matriks menggunakan for loop, dapat dipanggil
menggunakan perintah print() sehingga diperoleh hasil berikut.
print(result_matrix_for)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1590 1865 2140 2415 2690
## [2,] 1730 2030 2330 2630 2930
## [3,] 1870 2195 2520 2845 3170
## [4,] 2010 2360 2710 3060 3410
## [5,] 2150 2525 2900 3275 3650
Dilakukan perbandingan dengan melakukan perkalian matriks menggunakan
operator %*%.
# Perkalian matriks dengan menggunakan operator %*%
result_matrix_multiply <- matrix1 %*% matrix2
Untuk melihat hasilnya perkalian matriks dengan menggunakan operator
%*%, dapat dipanggil menggunakan perintah print() sehingga diperoleh
hasil berikut.
print(result_matrix_multiply)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1590 1865 2140 2415 2690
## [2,] 1730 2030 2330 2630 2930
## [3,] 1870 2195 2520 2845 3170
## [4,] 2010 2360 2710 3060 3410
## [5,] 2150 2525 2900 3275 3650
Dapat dilihat bahwa output perkalian matriks 5x5 dengan dengan
menggunakan fungsi for loop dan operator %*% menghasilkan hasil yang
sama.