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