Dataset Bank Marketing berisi informasi tentang kampanye pemasaran langsung dari sebuah institusi perbankan di Portugal. Tujuan dari analisis ini adalah untuk memahami karakteristik nasabah dan faktor-faktor yang mempengaruhi keberhasilan kampanye pemasaran deposito berjangka.
library(tidyverse)
library(scales)
library(RColorBrewer)
library(corrplot)
# Import dataset
bank_data <- read.csv("bank-full.csv", sep=";")
# Melihat struktur data
str(bank_data)
## 'data.frame': 45211 obs. of 17 variables:
## $ age : int 58 44 33 47 33 35 28 42 58 43 ...
## $ job : chr "management" "technician" "entrepreneur" "blue-collar" ...
## $ marital : chr "married" "single" "married" "married" ...
## $ education: chr "tertiary" "secondary" "secondary" "unknown" ...
## $ default : chr "no" "no" "no" "no" ...
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ housing : chr "yes" "yes" "yes" "yes" ...
## $ loan : chr "no" "no" "yes" "no" ...
## $ contact : chr "unknown" "unknown" "unknown" "unknown" ...
## $ day : int 5 5 5 5 5 5 5 5 5 5 ...
## $ month : chr "may" "may" "may" "may" ...
## $ duration : int 261 151 76 92 198 139 217 380 50 55 ...
## $ campaign : int 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : int -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 ...
## $ previous : int 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "unknown" "unknown" "unknown" "unknown" ...
## $ y : chr "no" "no" "no" "no" ...
# Melihat ringkasan statistik
summary(bank_data)
## age job marital education
## Min. :18.00 Length:45211 Length:45211 Length:45211
## 1st Qu.:33.00 Class :character Class :character Class :character
## Median :39.00 Mode :character Mode :character Mode :character
## Mean :40.94
## 3rd Qu.:48.00
## Max. :95.00
## default balance housing loan
## Length:45211 Min. : -8019 Length:45211 Length:45211
## Class :character 1st Qu.: 72 Class :character Class :character
## Mode :character Median : 448 Mode :character Mode :character
## Mean : 1362
## 3rd Qu.: 1428
## Max. :102127
## contact day month duration
## Length:45211 Min. : 1.00 Length:45211 Min. : 0.0
## Class :character 1st Qu.: 8.00 Class :character 1st Qu.: 103.0
## Mode :character Median :16.00 Mode :character Median : 180.0
## Mean :15.81 Mean : 258.2
## 3rd Qu.:21.00 3rd Qu.: 319.0
## Max. :31.00 Max. :4918.0
## campaign pdays previous poutcome
## Min. : 1.000 Min. : -1.0 Min. : 0.0000 Length:45211
## 1st Qu.: 1.000 1st Qu.: -1.0 1st Qu.: 0.0000 Class :character
## Median : 2.000 Median : -1.0 Median : 0.0000 Mode :character
## Mean : 2.764 Mean : 40.2 Mean : 0.5803
## 3rd Qu.: 3.000 3rd Qu.: -1.0 3rd Qu.: 0.0000
## Max. :63.000 Max. :871.0 Max. :275.0000
## y
## Length:45211
## Class :character
## Mode :character
##
##
##
# Memeriksa missing values
colSums(is.na(bank_data))
## age job marital education default balance housing loan
## 0 0 0 0 0 0 0 0
## contact day month duration campaign pdays previous poutcome
## 0 0 0 0 0 0 0 0
## y
## 0
# Mengubah "unknown" menjadi NA
bank_data[bank_data == "unknown"] <- NA
# Mengubah variabel kategorik menjadi factor
categorical_vars <- c("job", "marital", "education", "default", "housing",
"loan", "contact", "month", "poutcome", "y")
bank_data[categorical_vars] <- lapply(bank_data[categorical_vars], as.factor)
ggplot(bank_data, aes(x = y, fill = y)) +
geom_bar() +
scale_fill_brewer(palette = "Set2") +
labs(title = "Distribusi Hasil Kampanye Marketing",
subtitle = "Perbandingan antara nasabah yang berlangganan deposito dan tidak",
x = "Keputusan Berlangganan",
y = "Jumlah Nasabah") +
theme_minimal() +
theme(legend.position = "none")
Insight: Visualisasi ini menunjukkan ketidakseimbangan kelas pada target variable, dimana lebih banyak nasabah yang tidak berlangganan deposito dibandingkan yang berlangganan.
ggplot(bank_data, aes(x = age, fill = y)) +
geom_density(alpha = 0.5) +
scale_fill_brewer(palette = "Set2",
labels = c("Tidak Berlangganan", "Berlangganan")) +
labs(title = "Distribusi Usia Nasabah",
subtitle = "Berdasarkan Status Berlangganan Deposito",
x = "Usia",
y = "Densitas",
fill = "Status Berlangganan") +
theme_minimal()
Insight: Grafik density plot ini memperlihatkan pola distribusi usia nasabah dan bagaimana kecenderungan berlangganan deposito berdasarkan kelompok usia.
ggplot(bank_data, aes(x = reorder(job, table(job)[job]),
fill = y)) +
geom_bar(position = "fill") +
coord_flip() +
scale_fill_brewer(palette = "Set2",
labels = c("Tidak Berlangganan", "Berlangganan")) +
labs(title = "Proporsi Berlangganan Berdasarkan Pekerjaan",
subtitle = "Persentase nasabah yang berlangganan untuk setiap jenis pekerjaan",
x = "Jenis Pekerjaan",
y = "Proporsi",
fill = "Status Berlangganan") +
theme_minimal()
Insight: Visualisasi ini menunjukkan proporsi nasabah yang berlangganan deposito untuk setiap jenis pekerjaan, membantu mengidentifikasi segmen pekerjaan yang memiliki tingkat konversi lebih tinggi.
ggplot(bank_data, aes(x = y, y = balance, fill = y)) +
geom_boxplot() +
scale_fill_brewer(palette = "Set2") +
labs(title = "Distribusi Balance Berdasarkan Status Berlangganan",
subtitle = "Perbandingan saldo nasabah yang berlangganan dan tidak",
x = "Status Berlangganan",
y = "Balance (Euro)",
fill = "Status Berlangganan") +
theme_minimal() +
scale_y_continuous(labels = scales::comma)
Insight: Box plot ini memperlihatkan hubungan antara saldo nasabah dengan keputusan berlangganan deposito.
ggplot(bank_data, aes(x = housing, fill = y)) +
geom_bar(position = "fill") +
facet_wrap(~loan) +
scale_fill_brewer(palette = "Set2",
labels = c("Tidak Berlangganan", "Berlangganan")) +
labs(title = "Proporsi Berlangganan Berdasarkan Status Pinjaman",
subtitle = "Analisis pinjaman rumah dan personal",
x = "Pinjaman Rumah",
y = "Proporsi",
fill = "Status Berlangganan") +
theme_minimal()
Insight: Visualisasi ini menunjukkan bagaimana status pinjaman (rumah dan personal) mempengaruhi keputusan nasabah untuk berlangganan deposito.
Dari hasil analisis dan visualisasi data di atas, kita dapat menyimpulkan beberapa hal penting:
Visualisasi yang digunakan telah dipilih dengan mempertimbangkan: - Kesesuaian jenis plot dengan tipe data dan tujuan analisis - Penggunaan warna yang konsisten dan mudah dibedakan - Pemberian label yang informatif dan jelas - Penggunaan tema yang bersih dan profesional