Data Preparation

data<-read.csv("D:/STIS/SMT 6/Datmin/Pert 2/bank latih.csv", sep = ";")
# a. Perbaiki nilai yang tidak konsisten dari setiap kolom kategorik
columns_to_check <- c("job", "marital", "education", "default", "housing", "loan", "contact", "month", "poutcome", "y")
lapply(data[columns_to_check], unique)
## $job
##  [1] "unemployed"    "services"      "management"    "blue-collar"  
##  [5] "self-employed" "technician"    "entrepreneur"  "admin."       
##  [9] "student"       "housemaid"     "retired"       "unknown"      
## 
## $marital
## [1] "married"  "single"   "menikah"  "divorced"
## 
## $education
## [1] "primary"   "secondary" "tertiary"  "tertier"   "sekunder"  "unknown"  
## 
## $default
## [1] "no"  "yes"
## 
## $housing
## [1] "no"    "yes"   "tidak"
## 
## $loan
## [1] "no"    "yes"   "tidak"
## 
## $contact
## [1] "cellular"  "unknown"   "seluler"   "telephone"
## 
## $month
##  [1] "10"  "may" "apr" "jun" "feb" "aug" "jan" "7"   "nov" "jul" "oct" "sep"
## [13] "mar" "dec"
## 
## $poutcome
## [1] "unknown" "failure" "other"   "success"
## 
## $y
## [1] "no"  "iya" "yes"

Terlihat bahwa ada beberapa nilai yang tidak konsisten dan ada nilai yang hilang

# 1. Menangani Kolom 'job' (perbaiki 'admin.')
data$job <- gsub("admin\\.", "admin", data$job)  # Menghapus titik di akhir 'admin.'

# 2. Menangani Kolom 'marital' (ganti 'menikah' dengan 'married')
data$marital <- gsub("menikah", "married", data$marital)

# 3. Menangani Kolom 'education' (ganti 'tertier' dengan 'tertiary', dan 'sekunder' dengan 'secondary')
data$education <- gsub("tertier", "tertiary", data$education)
data$education <- gsub("sekunder", "secondary", data$education)

# 4. Menangani Kolom 'housing' dan 'loan' (ganti 'tidak' dengan 'no')
data$housing <- gsub("tidak", "no", data$housing)
data$loan <- gsub("tidak", "no", data$loan)

# 5. Menangani Kolom 'contact' (ganti 'seluler' dengan 'cellular')
data$contact <- gsub("seluler", "cellular", data$contact)

# 6. Menangani Kolom 'month' (ubah angka bulan menjadi nama bulan dan pastikan dalam huruf kecil)
data$month <- gsub("10", "oct", data$month)
data$month <- gsub("7", "jul", data$month)
data$month <- tolower(data$month)  # Pastikan semua bulan dalam huruf kecil

# 7. Menangani Kolom 'y' (ganti 'iya' dengan 'yes')
data$y <- gsub("iya", "yes", data$y)

columns_to_check <- c("job", "marital", "education", "default", "housing", "loan", "contact", "month", "poutcome", "y")
lapply(data[columns_to_check], unique)
## $job
##  [1] "unemployed"    "services"      "management"    "blue-collar"  
##  [5] "self-employed" "technician"    "entrepreneur"  "admin"        
##  [9] "student"       "housemaid"     "retired"       "unknown"      
## 
## $marital
## [1] "married"  "single"   "divorced"
## 
## $education
## [1] "primary"   "secondary" "tertiary"  "unknown"  
## 
## $default
## [1] "no"  "yes"
## 
## $housing
## [1] "no"  "yes"
## 
## $loan
## [1] "no"  "yes"
## 
## $contact
## [1] "cellular"  "unknown"   "telephone"
## 
## $month
##  [1] "oct" "may" "apr" "jun" "feb" "aug" "jan" "jul" "nov" "sep" "mar" "dec"
## 
## $poutcome
## [1] "unknown" "failure" "other"   "success"
## 
## $y
## [1] "no"  "yes"
# b. Imputasi nilai negatif dan unknown dengan median
data$Age[data$Age == "unknown"] <- NA
data$balance[data$balance == "unknown"] <- NA
data$day[data$day == "unknown"] <- NA
data$duration[data$duration == "unknown"] <- NA
data$campaign[data$campaign == "unknown"] <- NA
data$previous[data$previous == "unknown"] <- NA

data$Age <- as.numeric(data$Age)
data$balance <- as.numeric(data$balance)
data$day <- as.numeric(data$day)
data$duration <- as.numeric(data$duration)
data$campaign <- as.numeric(data$campaign)
data$previous <- as.numeric(data$previous)

impute_negative <- function(x) {
  # Menghitung median hanya dari nilai yang valid (non-negative dan bukan "unknown")
  median_value <- median(x[x >= 0 & !is.na(x)], na.rm = TRUE)
  
  # Mengganti nilai negatif dan "unknown" dengan median
  x[x < 0 | is.na(x)] <- median_value
  
  return(x)
}

data$Age <- impute_negative(data$Age)
data$balance <- impute_negative(data$balance)
data$day <- impute_negative(data$day)
data$duration <- impute_negative(data$duration)
data$campaign <- impute_negative(data$campaign)
data$previous <- impute_negative(data$previous)
# c. Imputasi pada kolom kategorik dengan nilai modus
impute_unknown <- function(column) {
  # Menghitung modus (nilai yang paling sering muncul)
  modus <- names(sort(table(column), decreasing = TRUE))[1]
  # Mengganti 'unknown' dengan modus
  column[column == "unknown"] <- modus
  return(column)
}

data$job <- impute_unknown(data$job)
data$marital <- impute_unknown(data$marital)
data$education <- impute_unknown(data$education)
data$default <- impute_unknown(data$default)
data$housing <- impute_unknown(data$housing)
data$loan <- impute_unknown(data$loan)
data$contact <- impute_unknown(data$contact)
data$month <- impute_unknown(data$month)
data$y <- impute_unknown(data$y)

columns_to_check <- c("job", "marital", "education", "default", "housing", "loan", "contact", "month", "y")
lapply(data[columns_to_check], unique)
## $job
##  [1] "unemployed"    "services"      "management"    "blue-collar"  
##  [5] "self-employed" "technician"    "entrepreneur"  "admin"        
##  [9] "student"       "housemaid"     "retired"      
## 
## $marital
## [1] "married"  "single"   "divorced"
## 
## $education
## [1] "primary"   "secondary" "tertiary" 
## 
## $default
## [1] "no"  "yes"
## 
## $housing
## [1] "no"  "yes"
## 
## $loan
## [1] "no"  "yes"
## 
## $contact
## [1] "cellular"  "telephone"
## 
## $month
##  [1] "oct" "may" "apr" "jun" "feb" "aug" "jan" "jul" "nov" "sep" "mar" "dec"
## 
## $y
## [1] "no"  "yes"
# d. Cek korelasi untuk melihat apakah ada duplikasi antar kolom
cor_matrix <- cor(data[, sapply(data, is.numeric)])
print(cor_matrix)
##                   Age      balance          day     duration     campaign
## Age       1.000000000  0.082689225 -0.017852632 -0.002366889 -0.005147905
## balance   0.082689225  1.000000000 -0.006765607 -0.015221195 -0.011403114
## day      -0.017852632 -0.006765607  1.000000000 -0.024629306  0.160706069
## duration -0.002366889 -0.015221195 -0.024629306  1.000000000 -0.068382000
## campaign -0.005147905 -0.011403114  0.160706069 -0.068382000  1.000000000
## pdays    -0.008893530  0.007117500 -0.094351520  0.010380242 -0.093136818
## previous -0.003510917  0.024767821 -0.059114394  0.018080317 -0.067832630
##                pdays     previous
## Age      -0.00889353 -0.003510917
## balance   0.00711750  0.024767821
## day      -0.09435152 -0.059114394
## duration  0.01038024  0.018080317
## campaign -0.09313682 -0.067832630
## pdays     1.00000000  0.577561827
## previous  0.57756183  1.000000000

Interpretasi: Tidak ada korelasi yang kuat antara variabel numerik di dataset. Artinya, antar kolom numerik tidak ada duplikasi

# e. Melihat apakah ada duplikat antar baris
duplicated_rows <- data[duplicated(data), ]
duplicated_rows
##  [1] Age       job       marital   education default   balance   housing  
##  [8] loan      contact   day       month     duration  campaign  pdays    
## [15] previous  poutcome  y        
## <0 rows> (or 0-length row.names)

Tidak terdapat baris yang duplikat