Question 1

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.

Question 2

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.

Question 3

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.