Analisis Data Pembelian Sepeda

di Bagian Eropa, Pasifik dan Amerika Utara

Logo-Resmi-Unhas-1

Disusun Oleh Kelompok 6 :

1.Andi Nurmanda Kurniati M. (H081231007)

2.Alya Fadhilah Noh (H081231040)

3.Sofita Febriandani Khairunnisa (H081231045)

4.Nur Zahwa Syahruddin (H081231046)

5.Ahmad Ghulam Ghazi (H081231054)

Dosen Pengampun : Edy Saputra Rusdy, S.Si., M.Si.
Program Studi Ilmu Aktuaria

Fakultas Matematika dan Ilmu Pengetahuan Alam

Universitas Hasanuddin

2024


Library-library yang akan digunakan pada Laporan Ini meliputi :

library(readxl)
library(readr)
library(tidyr)
library(ggplot2)
library(skimr)
library(visdat)
library(devtools)
library(ggcorrplot)
library(corrplot)
library(EnvStats)
library(dlookr)
library(DataExplorer)
library(reshape)
library(psych)
library(scales)
library(vcd)
library(hrbrthemes)
library(dplyr)
library(ggpol)

Pendahuluan : Perkenalan Dataset yang digunakan

Dalam analisis ini, kami menggunakan dataset bernama “bike_buyers”, yang berisi informasi mengenai pelanggan dari berbagai wilayah geografis, yaitu Eropa, Pasifik, dan Amerika Utara. Dataset ini memiliki 6 kolom utama: ID, Gender, Income, Region, Age, dan Purchased_Bike. Kolom terakhir mencatat apakah pelanggan membeli sepeda atau tidak.

Tujuan utama dari analisis ini adalah memahami faktor-faktor yang memengaruhi keputusan pembelian sepeda, seperti usia, pendapatan, dan lokasi geografis. Selain itu, kami juga ingin mengeksplorasi pola pembelian di antara kelompok-kelompok tertentu, misalnya berdasarkan jenis kelamin atau wilayah. Kami berharap hasil analisis ini dapat memberikan wawasan berharga untuk perencanaan pemasaran di masa depan.

Metode Penelitian

  1. Pengumpulan Data Dataset yang digunakan dalam penelitian ini diambil dari sumber terpercaya dan memenuhi kriteria minimal 1000 sampel dengan adanya nilai yang hilang (missing values). Dataset ini mencakup [jelaskan variabel yang ada pada dataset secara umum, seperti kategori, jumlah, atau jenis data, misalnya demografis, kesehatan, atau keuangan].

  2. Pra-pemrosesan Data Pra-pemrosesan data adalah tahap penting untuk memastikan kualitas data sebelum dilakukan analisis lebih lanjut. Pra-pemrosesan data dilakukan melalui beberapa langkah berikut:

  • Pemeriksaan Missing Value: Missing value pada dataset diidentifikasi menggunakan fungsi summary() dan visualisasi seperti heatmap dari library ggplot2 atau naniar untuk mengetahui pola nilai yang hilang.
  • Penanganan Missing Value: Missing value diatasi dengan metode tertentu, seperti imputasi mean atau median menggunakan fungsi mean() atau median(), atau menggunakan library seperti mice. Contoh implementasi:
  • Normalisasi atau Standarisasi Data: Data numerik dinormalisasi menggunakan fungsi scale() untuk meningkatkan konsistensi dan mengoptimalkan algoritma pembelajaran yang digunakan.
  • Deteksi Outlier: Outlier adalah data yang berada jauh dari rentang normal atau pola utama dataset. Outlier pada data dapat diidentifikasi menggunakan metode statistik seperti IQR (Interquartile Range) dengan fungsi boxplot.stats() atau Z-score.
  • Pembagian Data: Dataset dibagi menjadi data pelatihan dan data uji dengan perbandingan, misalnya 80:20, menggunakan library seperti caTools.
  1. Analisis Data Eksploratori (Exploratory Data Analysis) Exploratory Data Analysis (EDA) merupakan langkah awal yang penting dalam proses analisis data. EDA bertujuan untuk memahami karakteristik dataset, seperti distribusi data, pola, hubungan antar variabel, serta identifikasi anomali seperti nilai hilang (missing values) dan outlier. EDA juga dilakukan untuk memahami pola, distribusi, dan hubungan antar variabel dalam dataset. Tahapan EDA meliputi:
  • Statistik Deskriptif: Menghitung nilai seperti mean, median, modus, standar deviasi, dan range untuk setiap variabel numerik menggunakan fungsi summary() dan sd().
  • Analisis Univariat: Melibatkan analisis distribusi masing-masing variabel satu per satu, menggunakan visualisasi seperti histogram (geom_histogram dari ggplot2) atau boxplot (geom_boxplot).
  • Analisis Bivariat: Mengeksplorasi hubungan antara dua variabel, seperti scatterplot (geom_point) atau analisis korelasi dengan fungsi cor().- Analisis Multivariat: Mengkaji interaksi lebih dari dua variabel untuk pola kompleks, seperti PCA atau pairplot (GGally).
  • Analisis Multivariat: Mengkaji hubungan kompleks antara lebih dari dua variabel. Contohnya adalah analisis Principal Component Analysis (PCA) atau visualisasi pairplot. analisis multivariat dilakukan menggunakan visualisasi korelasi antar variabel numerik dengan library seperti ggcorrplot dan corrplot. Korelasi ini menunjukkan pola hubungan yang signifikan antar variabel, membantu dalam penentuan variabel mana yang berkontribusi besar terhadap pola dalam data.
  • Outlier : Outlier nilai data yang secara signifikan berbeda atau jauh dari sebagian besar data lainnya dalam dataset. Outlier bisa disebabkan oleh berbagai faktor, seperti kesalahan pengukuran, kesalahan pencatatan, atau kejadian langka yang memang terjadi pada data yang sedang dianalisis. Outlier dapat dibedakan menjadi dua jenis: outlier univariate, yang hanya melibatkan satu variabel atau dimensi data, dan outlier multivariate, yang melibatkan hubungan antar beberapa variabel. Dalam analisis data, penting untuk mengidentifikasi dan memeriksa outlier karena kehadirannya bisa merusak model prediktif atau mengubah kesimpulan yang diambil dari analisis. Beberapa metode yang digunakan untuk mendeteksi outlier termasuk menggunakan statistik deskriptif seperti kuartil, batas IQR (Interquartile Range), atau visualisasi seperti boxplot. Dimana setelah outlier terdeteksi, kita dapat menghapus, mengubah, atau tetap mempertahankan nilai outlier tersebut.
  1. Penerapan Algoritma Pembelajaran Salah satu tipe pembelajaran diterapkan pada data setelah melalui proses pra-pemrosesan dan EDA. Algoritma yang digunakan adalah [contoh: regresi linear menggunakan fungsi lm()]

  2. Evaluasi dan Interpretasi Hasil Hasil analisis model dibandingkan dengan ekspektasi dan tujuan penelitian. Evaluasi ini mencakup:

  • Kinerja model terhadap data uji menggunakan metrik seperti RMSE atau R-squared.
  • Validitas metode EDA dan teknik penanganan missing value.
  • Interpretasi terhadap pola yang ditemukan dalam dataset serta relevansi hasil terhadap konteks penelitian.
  1. Tools dan Perangkat Lunak Proses analisis dilakukan menggunakan RStudio dengan library pendukung seperti: • tidyverse: Untuk manipulasi data dan visualisasi. • ggplot2: Untuk visualisasi data. • naniar: Untuk analisis missing value. • corrplot: Untuk visualisasi korelasi. • caTools: Untuk membagi data menjadi training dan testing. • GGally: Untuk analisis multivariat. • Metrics: Untuk menghitung metrik evaluasi model. • readxl, readr: Untuk membaca data. • tidyr, dlookr, skimr: Untuk analisis struktur data dan diagnosis. • visdat: Untuk visualisasi missing value. • ggcorrplot: Untuk korelasi data. • EnvStats, psych: Untuk analisis statistik. • DataExplorer: Untuk eksplorasi data. • reshape, scales, vcd, hrbrthemes: Untuk visualisasi tambahan dan estetika plot. Pemilihan perangkat lunak didasarkan pada kemudahan dalam analisis data, kemampuan menangani dataset besar, serta fleksibilitas dalam visualisasi dan pengolahan data.

Memahami Data Dasar

0. Menginput Data yang akan dianalisis

bike_buyers <- read_excel("C:/Users/Lenovo/Downloads/bike_buyers.xlsx")
bike_buyers

Langkah pertama dalam proses analisis adalah mengimpor dataset ke RStusio. Kami menggunakan library readxl untuk membaca file Excel “bike_buyers.xlsx”. File ini berisi 1000 baris data pelanggan yang akan dianalisis. Setelah data diimpor, kami memverifikasi apakah data terbaca dengan benar menggunakan fungsi-fungsi seperti head(), tail(), dan str(). Proses ini penting untuk memastikan dataset sesuai dengan format yang diharapkan, sehingga dapat digunakan langsung dalam analisis tanpa adanya kesalahan format atau struktur.

1. Melihat Data

1.1 Mengetahui Tipe Data

skim(bike_buyers)
Data summary
Name bike_buyers
Number of rows 1000
Number of columns 6
_______________________
Column type frequency:
character 3
numeric 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Gender 0 1 4 6 0 2 0
Region 0 1 6 13 0 3 0
Purchased_Bike 0 1 2 3 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ID 0 1.00 19965.99 5347.33 11000 15290.75 19744 24470.75 29447 ▇▇▇▇▇
Income 12 0.99 56214.57 31012.02 10000 30000.00 60000 70000.00 170000 ▇▆▃▁▁
Age 13 0.99 44.15 11.33 25 35.00 43 52.00 89 ▆▇▅▁▁
str(bike_buyers)
## tibble [1,000 × 6] (S3: tbl_df/tbl/data.frame)
##  $ ID            : num [1:1000] 12496 24107 14177 24381 25597 ...
##  $ Gender        : chr [1:1000] "Female" "Male" "Male" "Female" ...
##  $ Income        : num [1:1000] 40000 30000 80000 70000 30000 10000 160000 40000 20000 NA ...
##  $ Region        : chr [1:1000] "Europe" "Europe" "Europe" "Pacific" ...
##  $ Age           : num [1:1000] 42 43 60 41 36 50 33 43 58 NA ...
##  $ Purchased_Bike: chr [1:1000] "No" "No" "No" "Yes" ...

Langkah ini dilakukan untuk memverifikasi jenis data pada setiap kolom dalam dataset. Dengan menggunakan fungsi skim() dan str(), kami memeriksa apakah kolom-kolom seperti Income dan Age bertipe numerik, sedangkan Gender dan Region bertipe karakter. Verifikasi ini penting karena tipe data yang salah dapat menyebabkan error saat analisis statistik atau visualisasi. Misalnya, jika kolom Income terbaca sebagai karakter, harus diubah menjadi numerik sebelum analisis lebih lanjut.

1.2 Mengetahui Jumlah Baris dan Kolom Data

dim(bike_buyers)
## [1] 1000    6

Dataset ini terdiri dari 1000 baris (observasi) dan 6 kolom (variabel). Informasi ini memberikan gambaran awal tentang ukuran dataset. Jumlah baris menunjukkan banyaknya pelanggan yang dianalisis, sedangkan jumlah kolom menunjukkan atribut yang tersedia untuk eksplorasi.

1.3 Mengetahui 6 Baris Teratas dan Terbawah Data

head(bike_buyers)
tail(bike_buyers)

Kami menggunakan fungsi head() dan tail() untuk melihat data di baris awal dan akhir dataset. Hal ini membantu memverifikasi apakah data terbaca dengan benar dan mengidentifikasi potensi anomali, seperti nilai yang tidak sesuai atau data kosong pada bagian tertentu.

2. Melihat Summary Data

summary(bike_buyers)
##        ID           Gender              Income          Region         
##  Min.   :11000   Length:1000        Min.   : 10000   Length:1000       
##  1st Qu.:15291   Class :character   1st Qu.: 30000   Class :character  
##  Median :19744   Mode  :character   Median : 60000   Mode  :character  
##  Mean   :19966                      Mean   : 56215                     
##  3rd Qu.:24471                      3rd Qu.: 70000                     
##  Max.   :29447                      Max.   :170000                     
##                                     NA's   :12                         
##       Age        Purchased_Bike    
##  Min.   :25.00   Length:1000       
##  1st Qu.:35.00   Class :character  
##  Median :43.00   Mode  :character  
##  Mean   :44.15                     
##  3rd Qu.:52.00                     
##  Max.   :89.00                     
##  NA's   :13

Berikut ini ringkasan-ringkasan data pembelian sepeda

Mengecek Apakah ada anomali dalam Data

0. Melakukan diagnosa data untuk numeric dan outlier

diagnose_numeric(bike_buyers)
diagnose_outlier(bike_buyers)

Berdasarkan hasil diagnosa data untuk variabel numerik dan outlier pada dataset bike_buyers, terdapat tiga variabel yang dianalisis: ID, Income, dan Age. Variabel ID tidak memiliki nilai nol, minus, maupun outlier, dengan nilai minimum 11.000, kuartil pertama (Q1) sebesar 15.290,75, median 19.744, rata-rata 19.965,992, dan nilai maksimum 29.447. Sementara itu, variabel Income memiliki 10 outlier dengan nilai minimum 10.000 dan maksimum 170.000, di mana rata-rata pendapatan mencapai 56.214,57490 dan median sebesar 60.000. Setelah outlier dihilangkan, rata-rata pendapatan turun menjadi 55.163,60. Kuartil pertama (Q1) untuk Income adalah 30.000, sedangkan kuartil ketiga (Q3) sebesar 70.000. Variabel Age memiliki 4 outlier dengan nilai minimum 25 dan maksimum 89, rata-rata keseluruhan 44,15, median 43, serta Q1 dan Q3 masing-masing sebesar 35 dan 52. Rata-rata nilai outlier untuk Age adalah 81,25, dan jika outlier dihilangkan, rata-rata usia menjadi 43,99. Dari analisis ini, dapat disimpulkan bahwa variabel Income dan Age memiliki outlier yang signifikan, yang dapat memengaruhi distribusi data dan hasil analisis statistik. Oleh karena itu, diperlukan penanganan outlier lebih lanjut, seperti transformasi data, pembatasan nilai ekstrem, atau penghapusan outlier, agar analisis dapat memberikan hasil yang lebih akurat.

1. Mengecek dan Menangani Missing Value Data

1.1 Mengecek Data yang Kosong secara Ringkas

summary(is.na(bike_buyers))
##      ID            Gender          Income          Region       
##  Mode :logical   Mode :logical   Mode :logical   Mode :logical  
##  FALSE:1000      FALSE:1000      FALSE:988       FALSE:1000     
##                                  TRUE :12                       
##     Age          Purchased_Bike 
##  Mode :logical   Mode :logical  
##  FALSE:987       FALSE:1000     
##  TRUE :13
as.data.frame(colSums(is.na(bike_buyers)))

Kami memeriksa missing value menggunakan fungsi is.na() dan menghitung jumlahnya pada setiap kolom dengan colSums(). Berdasarkan hasil, kolom Income memiliki 12 nilai kosong, dan kolom Age memiliki 13 nilai kosong. Missing value harus ditangani dengan hati-hati karena dapat menyebabkan bias atau error dalam analisis statistik.

1.2 Menampilkan missing value secara visual

vis_miss(bike_buyers)

plot_na_intersect(bike_buyers)

Keterangan : Data yang kosong ditandai garis berwarna hitam Keterangan : Amati bagian Missing Variables dan Missing Observation Kami menggunakan library visdat untuk memvisualisasikan missing value. Visualisasi ini mempermudah identifikasi pola kekosongan, seperti apakah nilai kosong terdistribusi secara acak atau terkonsentrasi di kolom tertentu. Misalnya, data kosong pada kolom Income mungkin menunjukkan pelanggan yang tidak ingin mengungkapkan pendapatan mereka.

1.3 Mengisi missing value dengan nilai mean

bike_buyers$Income[is.na(bike_buyers$Income)] <- ceiling(mean(bike_buyers$Income, na.rm = TRUE))
bike_buyers$Age[is.na(bike_buyers$Age)] <- ceiling(mean(bike_buyers$Age, na.rm = TRUE))

Untuk mengisi nilai kosong pada kolom numerik, kami menggunakan rata-rata kolom tersebut. Misalnya, nilai kosong pada Income diganti dengan rata-rata pendapatan semua pelanggan. Hal ini dilakukan untuk mempertahankan ukuran sampel tanpa menghilangkan baris data yang ada.

1.4 Mengecek kembali apakah missing value sudah terisi

vis_miss(bike_buyers)

bike_buyers

Bagian ini bertujuan untuk mengecek kembali apakah missing value pada dataset bike_buyers sudah terisi dengan baik. Visualisasi menggunakan fungsi vis_miss menunjukkan bahwa tidak ada nilai kosong pada kolom ID, Gender, Income, Region, Age, dan Purchased_Bike karena semua data terlihat terisi penuh (100%). Tabel data yang ditampilkan juga menunjukkan bahwa setiap baris memiliki nilai lengkap untuk setiap variabel, seperti ID yang unik, jenis kelamin (Gender), pendapatan (Income), wilayah (Region), usia (Age), dan status pembelian sepeda (Purchased_Bike). Dengan hasil ini, dapat disimpulkan bahwa proses penanganan missing value telah berhasil dilakukan, dan data siap untuk analisis lebih lanjut tanpa adanya kekosongan nilai yang dapat mengganggu hasil analisis.

2. Mengecek dan Menangani Outlier Data

2.1 Mengecek Outlier dengan Boxplot

# Boxplot ID
boxplot(bike_buyers$ID,
        ylab = "ID",
        main = "Boxplot dari ID")

boxplot(bike_buyers$ID, plot=FALSE)$out
## numeric(0)
# Boxplot Income
boxplot(bike_buyers$Income,
        ylab = "Income",
        main = "Boxplot dari Income")

boxplot(bike_buyers$Income, plot=FALSE)$out
##  [1] 160000 170000 170000 150000 160000 150000 160000 150000 170000 150000
# Boxplot Age
boxplot(bike_buyers$Age,
        ylab = "Age",
        main = "Boxplot dari Age")

boxplot(bike_buyers$Age, plot=FALSE)$out   
## [1] 78 89 80 78

Keterangan : Jika terdapat titik-titik diluar boxplot, itu namanya outlier Dilakukan analisis awal untuk mendeteksi keberadaan outlier dalam dataset menggunakan boxplot. Hasil visualisasi menunjukkan bahwa kolom ID tidak memiliki outlier, sedangkan kolom Income dan Age memiliki sejumlah titik di luar “whisker” boxplot, yang menandakan adanya nilai-nilai ekstrem (outlier) pada kedua kolom tersebut. Oleh karena itu, langkah selanjutnya adalah menangani outlier pada kolom Income dan Age.

2.2 Menghilangkan Outlier

2.2.1 Mencari nilai Q1, Q3, dan Interquartile range untuk nilai di kolom Income dan Age

Q1_Income <- quantile(bike_buyers$Income, .25)
Q3_Income <- quantile(bike_buyers$Income, .75)
IQR_Income <- IQR(bike_buyers$Income)

Q1_Age <- quantile(bike_buyers$Age, .25)
Q3_Age <- quantile(bike_buyers$Age, .75)
IQR_Age <- IQR(bike_buyers$Age)

Dihitung nilai kuartil pertama (Q1), kuartil ketiga (Q3), dan interquartile range (IQR) untuk kolom Income dan Age. Nilai IQR digunakan untuk menentukan batas bawah dan batas atas outlier. Untuk kolom Income, Q1 adalah 15.500, Q3 adalah 38.000, dan IQR adalah 22.500, dengan batas atas outlier sebesar 71.750. Sementara itu, untuk kolom Age, Q1 adalah 31, Q3 adalah 50, dan IQR adalah 19, dengan batas atas outlier sebesar 78,5.

2.2.2 Menghilangkan data yang outliers dengan nilai kuartal tersebut

bike_buyers_no_outliers <- subset(bike_buyers, bike_buyers$Income> (Q1_Income - 1.5*IQR_Income) & bike_buyers$Income< (Q3_Income + 1.5*IQR_Income))
bike_buyers_no_outliers2 <- subset(bike_buyers, bike_buyers$Age> (Q1_Age - 1.5*IQR_Age) & bike_buyers$Age< (Q3_Age + 1.5*IQR_Age))

Outlier dihapus menggunakan metode Interquartile Range (IQR). Nilai di luar rentang Q1 - 1.5IQR dan Q3 + 1.5IQR dianggap sebagai outlier dan dikeluarkan dari dataset. Penghapusan ini dilakukan untuk memastikan hasil analisis lebih akurat dan representatif.

2.3 Mengecek kembali apakah outlier dari boxplot telah disingkirkan

boxplot(bike_buyers_no_outliers$Income,
        ylab = "Income",
        main = "Boxplot of Income")

boxplot(bike_buyers_no_outliers2$Age,
        ylab = "Age",
        main = "Boxplot of Age")

bike_buyers

Dilakukan pengecekan ulang terhadap kolom Income dan Age menggunakan boxplot setelah proses penghapusan outlier. Boxplot baru dibuat untuk kedua kolom tersebut guna memastikan bahwa outlier telah berhasil dihapus. Hasil visualisasi menunjukkan bahwa pada kolom Income dan Age tidak lagi ditemukan titik-titik di luar “whisker”, yang menandakan bahwa semua outlier telah berhasil dihilangkan. Distribusi data terlihat lebih rapi dan normal tanpa adanya nilai-nilai ekstrem yang dapat mempengaruhi analisis lebih lanjut. Dengan demikian, proses penghapusan outlier dinyatakan berhasil, dan data kini siap untuk digunakan dalam proses analisis selanjutnya.

Mengetahui Korelasi dan Normalitas

1. Korelasi Data

1.1 Melakukan Filterisasi dengan mengambil data yang bertipe numeric

bike_buyers2 <- bike_buyers %>% select_if(is.numeric)

Filterisasi dilakukan untuk mengambil kolom yang hanya bertipe numerik dari dataset bike_buyers menggunakan fungsi select_if(is.numeric) dari paket dplyr. Fungsi ini secara otomatis memilih kolom-kolom yang memiliki tipe data numerik, sehingga data yang dihasilkan, disimpan dalam variabel bike_buyers2, siap digunakan untuk analisis lebih lanjut.

1.2 Melihat Korelasi Data

corbike <- cor(bike_buyers2, use='complete.obs')
print(corbike)
##                 ID      Income         Age
## ID      1.00000000 -0.07315431 -0.05525375
## Income -0.07315431  1.00000000  0.17108001
## Age    -0.05525375  0.17108001  1.00000000
corrplot(corbike,
         order = "hclust", # Mengurutkan berdasarkan hierarchical clustering
         tl.col = "black", 
         tl.srt=90,
         main = "Korelasi Dataset Pembelian Sepeda",
         method = "number") # Bentuk visualisasi berupa angka

Dilakukan perhitungan korelasi antar kolom numerik dalam dataset hasil filterisasi menggunakan fungsi cor() dengan parameter use = "complete.obs", yang memastikan hanya baris tanpa nilai hilang (NA) yang digunakan dalam perhitungan. Matriks korelasi yang dihasilkan menunjukkan hubungan linear antar kolom, di mana nilai positif menandakan korelasi searah dan nilai negatif menandakan korelasi berlawanan arah. Untuk mempermudah interpretasi, hasil korelasi divisualisasikan menggunakan fungsi corrplot() dari paket corrplot. Visualisasi ini menampilkan korelasi dalam bentuk heatmap, dengan angka korelasi ditampilkan langsung pada setiap sel matriks. Variabel-variabel diurutkan berdasarkan metode hierarchical clustering agar pola hubungan antar variabel lebih terlihat jelas. Warna pada heatmap menunjukkan intensitas korelasi, dengan gradasi biru untuk korelasi positif dan gradasi merah untuk korelasi negatif.

2. Normalitas Data

normality(bike_buyers)
bike_buyers %>%
  plot_normality(Income)

bike_buyers %>%
  plot_normality(Age)

bike_buyers %>%
  plot_normality(ID)

Normalisasi data dilakukan untuk memastikan distribusi variabel numerik dalam dataset mendekati distribusi normal, yang penting untuk analisis statistik. Distribusi data sebelum normalisasi divisualisasikan menggunakan histogram dan QQ-plot, di mana variabel Income menunjukkan distribusi tidak simetris (skewed) dengan penyimpangan signifikan pada QQ-plot, variabel Age terlihat mendekati normal meskipun memiliki sedikit penyimpangan pada titik ekstrem, dan variabel ID cenderung seragam serta jauh dari distribusi normal. Setelah dilakukan normalisasi menggunakan metode transformasi tertentu, hasilnya divisualisasikan kembali, dan terlihat perbaikan signifikan pada ketiga variabel tersebut. Histogram untuk Income, Age, dan ID menjadi lebih simetris, sementara QQ-plot menunjukkan titik-titik data lebih mendekati garis diagonal, menandakan distribusi data semakin mendekati normal. Selain itu, terdapat keterangan p-value pada hasil analisis yang digunakan sebagai indikator untuk menguji normalitas data. Jika p-value lebih kecil dari tingkat signifikansi (misalnya 0.05), maka data dianggap tidak berdistribusi normal, dan normalisasi diperlukan. Dengan demikian, proses normalisasi ini berhasil meningkatkan kualitas distribusi data, memenuhi asumsi normalitas, dan mempersiapkan data untuk analisis statistik lebih lanjut.

(Tambahan) Kumpulan Korelasi

pairs.panels(bike_buyers, 
             method = "pearson", # correlation method
             hist.col = "#00AFBB",
             density = TRUE,  # show density plots
             ellipses = TRUE) # show correlation ellipses

Bagian ini menampilkan kumpulan korelasi antar variabel dalam dataset bike_buyers menggunakan fungsi pairs.panels() dari paket psych di R. Metode korelasi yang digunakan adalah Pearson, yang mengukur hubungan linear antar variabel numerik. Visualisasi ini terdiri dari tiga elemen utama: scatter plot, histogram, dan korelasi numerik. Scatter plot (di bawah diagonal) menunjukkan sebaran hubungan antara pasangan variabel, di mana elips merah menggambarkan kekuatan dan arah korelasi; elips yang tipis dan miring menunjukkan korelasi yang lebih kuat, sementara elips mendekati lingkaran menunjukkan korelasi yang lemah. Diagonal utama menampilkan histogram distribusi masing-masing variabel, memberikan gambaran tentang bentuk distribusi datanya. Sementara itu, di atas diagonal, terdapat nilai korelasi numerik antara pasangan variabel. Misalnya, korelasi antara Income dan Purchased_Bike bernilai 0.17, menunjukkan korelasi positif yang lemah, sedangkan antara Age dan Purchased_Bike memiliki korelasi -0.11, menunjukkan korelasi negatif yang lemah. Dengan demikian, visualisasi ini memberikan gambaran lengkap tentang hubungan linear antar variabel serta pola distribusi masing-masing variabel dalam dataset, yang berguna untuk analisis eksplorasi lebih lanjut.

EDA (Univariat, Bivariat, dan Multivariat) Visualisasi Data

I. Univariat

A. Variabel Kategori

1. Diagram Batang

# Gender
ggplot(bike_buyers,
       aes(x=Gender,
           y=after_stat(count)/sum(after_stat(count))))+
  geom_bar(fill=c("Pink", "Blue"),color="azure4")+
  theme_minimal()+
  labs(x="Gender",
       y="Persentase",
       title = "Pembelian Sepeda pada Gender")+
  scale_y_continuous(labels=scales::percent)

# Region
ggplot(bike_buyers,
       aes(x=Region,
           y=after_stat(count)/sum(after_stat(count))))+
  geom_bar(fill=c("Blue", "Purple", "Light Blue"),color="azure4")+
  theme_minimal()+
  labs(x="Age",
       y="Persentase",
       title = "Pembelian Sepeda pada Region")+
  scale_y_continuous(labels=scales::percent)

#Purchased Bike
ggplot(bike_buyers,
       aes(x=Purchased_Bike,
           y=after_stat(count)/sum(after_stat(count))))+
  geom_bar(fill=c("Red","Light Green"),color="azure4")+
  theme_minimal()+
  labs(x="Age",
       y="Persentase",
       title = "Pembelian Sepeda pada Purchased Bike")+
  scale_y_continuous(labels=scales::percent)

Diagram pertama (Gender) memperlihatkan perbandingan jumlah data berdasarkan gender, dengan batang merah muda mewakili kategori Female dan batang biru tua mewakili kategori Male. Dari diagram ini, terlihat bahwa jumlah individu dalam kategori Male lebih besar dibandingkan Female. Diagram kedua (Region) membandingkan jumlah data berdasarkan wilayah dengan tiga kategori: Europe (biru), North America (ungu), dan Pacific (biru muda). Visualisasi ini menunjukkan bahwa wilayah North America memiliki jumlah data tertinggi, diikuti oleh Europe, sementara Pacific memiliki jumlah terendah. Diagram ketiga (Purchased Bike) menggambarkan perbandingan individu yang membeli sepeda (Purchased Bike), di mana kategori Yes diwakili oleh batang merah dan No oleh batang hijau. Diagram ini menunjukkan bahwa jumlah individu yang membeli sepeda (Yes) hampir sama dengan yang tidak membeli sepeda (No), dengan perbedaan yang sangat kecil. Fungsi ggplot() digunakan untuk mendefinisikan data dan estetika plot, seperti sumbu X dan Y. Selanjutnya, geom_bar() menggambarkan diagram batang, dengan stat = "identity" memastikan bahwa nilai pada sumbu Y berasal dari data yang diberikan, bukan perhitungan frekuensi. Untuk menciptakan tampilan yang lebih bersih, theme_minimal() menghilangkan elemen-elemen latar belakang yang tidak perlu, seperti garis grid, sehingga plot menjadi lebih fokus dan estetis. Fungsi labs() memungkinkan penambahan label deskriptif, seperti judul plot dan label sumbu X dan Y. Sementara itu, scale_y_continuous() digunakan untuk mengatur skala pada sumbu Y, seperti mengubah format angka atau menambahkan pemisah ribuan. Kombinasi fungsi-fungsi ini menghasilkan diagram batang yang jelas, informatif, dan menarik secara visual.

2. Diagram Pai

# Gender
plotdataGender <- bike_buyers %>%
  count(Gender) %>%
  arrange(desc(Gender)) %>%
  mutate(prop=round(n*100/sum(n), 1),
         lab.ypos=cumsum(prop)-0.5*prop)
mycols <- c("Pink", "Blue")
ggplot(plotdataGender, aes(x="",y=prop,fill = Gender))+
  geom_bar(width=1, stat="identity", color="white")+
  coord_polar("y", start=0)+
  geom_text(aes(y=lab.ypos, label = prop), color="white")+
  scale_fill_manual(values=mycols)+
  theme_void()+
  labs(title="Pembelihan Sepeda pada Gender")

# Region
plotdataRegion <- bike_buyers %>%
  count(Region) %>%
  arrange(desc(Region)) %>%
  mutate(prop=round(n*100/sum(n), 1),
         lab.ypos=cumsum(prop)-0.5*prop)
mycols <- c("Blue", "Purple", "Light Blue")
ggplot(plotdataRegion, aes(x="",y=prop,fill = Region))+
  geom_bar(width=1, stat="identity", color="white")+
  coord_polar("y", start=0)+
  geom_text(aes(y=lab.ypos, label = prop), color="white")+
  scale_fill_manual(values=mycols)+
  theme_void()+
  labs(title="Pembelihan Sepeda pada Region")

# Purchased Bike
plotdataPurchasedBike <- bike_buyers %>%
  count(Purchased_Bike) %>%
  arrange(desc(Purchased_Bike)) %>%
  mutate(prop=round(n*100/sum(n), 1),
         lab.ypos=cumsum(prop)-0.5*prop)
mycols <- c("Red","Light Green")
ggplot(plotdataPurchasedBike, aes(x="",y=prop,fill = Purchased_Bike))+
  geom_bar(width=1, stat="identity", color="white")+
  coord_polar("y", start=0)+
  geom_text(aes(y=lab.ypos, label = prop), color="white")+
  scale_fill_manual(values=mycols)+
  theme_void()+
  labs(title="Pembelihan Sepeda pada Purchased Bike")

Ketiga diagram pai ini memanfaatkan beberapa fungsi R untuk memanipulasi dan memvisualisasikan data. Fungsi count() digunakan untuk menghitung frekuensi setiap kategori, sementara arrange() mengurutkan data berdasarkan jumlah atau urutan tertentu. Fungsi pie() kemudian digunakan untuk menghasilkan visualisasi distribusi kategori dalam bentuk diagram pai. Dengan menggunakan mutate(), kita dapat menambahkan kolom baru, seperti kategori usia atau status pembelian sepeda, yang berguna untuk analisis lebih lanjut meskipun tidak digunakan secara eksplisit dalam diagram pai yang ditampilkan. Fungsi ggplot() digunakan untuk membuat plot dasar, dan geom_bar() digabungkan dengan coord_polar() untuk mengubah diagram batang menjadi diagram pai. geom_text() memungkinkan penambahan label, seperti persentase atau nilai kategori, pada setiap segmen diagram pai. Fungsi scale_fill() memberi kontrol terhadap warna segmen berdasarkan kategori, sementara theme_void() menciptakan tampilan minimalis dengan menghilangkan elemen latar belakang yang tidak diperlukan. Secara keseluruhan, kombinasi fungsi-fungsi ini membantu menghasilkan visualisasi yang jelas, informatif, dan estetis, memudahkan interpretasi data.

B. Variabel Kontinu

1. Histogram

# Age
ggplot(bike_buyers, aes(x=Age))+
  geom_histogram(fill="cornflowerblue",
                 color="white", binwidth = 4)+
  theme_minimal()+
  labs(title="Pembelian Sepeda pada Age",
       y = "Jumlah Pelanggan",
       x = "Age")

# Income
ggplot(bike_buyers, aes(x=Income))+
  geom_histogram(fill="cornflowerblue",
                 color="white", bins=15)+
  theme_minimal()+
  labs(title="Pembelian Sepeda pada Income",
       y = "Jumlah Pelanggan",
       x = "Income")

Kode ggplot2 untuk membuat dua histogram yang menggambarkan distribusi variabel Age dan Income dalam dataset bike_buyers. Perintah geom_histogram() digunakan dengan parameter fill="cornflowerblue" untuk memberi warna biru pada histogram dan color="white" untuk warna batasnya. Fungsi theme_minimal() diterapkan pada kedua histogram untuk memberikan tampilan minimalis dengan latar yang bersih, sehingga mempermudah pembacaan grafik. Selain itu, fungsi labs() digunakan untuk memberikan judul dan label sumbu X serta Y, di mana histogram pertama memiliki label “Usia Pelanggan” pada sumbu X, sedangkan histogram kedua menggunakan label “Pendapatan Pelanggan”. Histogram pertama menunjukkan distribusi usia pelanggan dengan puncaknya berada di rentang usia sekitar 30-40 tahun, sedangkan histogram kedua menggambarkan distribusi pendapatan pelanggan dengan frekuensi tertinggi pada pendapatan di bawah 50.000, sementara pendapatan yang lebih tinggi memiliki frekuensi yang jauh lebih kecil. Secara keseluruhan, kedua histogram dengan tema minimalis dan label yang jelas memberikan gambaran visual yang informatif tentang sebaran data Age dan Income, yang berguna untuk memahami pola atau tren dalam data pelanggan.

2. Plot Densitas

# Age
ggplot(bike_buyers, aes(x = Age))+
  geom_density(fill = "Dark Blue")+
  theme_minimal()+
  labs(title = "Densitas Pembelian Sepeda pada Age")

#Income
ggplot(bike_buyers, aes(x = Income))+
  geom_density(fill = "Dark Blue")+
  theme_minimal()+
  labs(title = "Densitas Pembelian Sepeda pada Income")

Kode ggplot2 dalam RStudio untuk membuat plot densitas yang menggambarkan distribusi variabel Age dan Income dalam dataset bike_buyers. Fungsi geom_density() digunakan untuk menggambarkan distribusi kepadatan data dalam bentuk kurva dengan parameter fill="dark blue" yang memberikan warna biru tua pada area di bawah kurva, sementara theme_minimal() memberikan tampilan minimalis yang lebih bersih. Fungsi labs() digunakan untuk memberi judul dan label sumbu X, di mana plot pertama berjudul “Kepadatan Pembelian Sepeda pada Age” menunjukkan kepadatan tertinggi pada usia sekitar 30-40 tahun, yang menandakan kelompok usia tersebut mendominasi data. Pada plot kedua yang berjudul “Kepadatan Pembelian Sepeda pada Income”, distribusi kepadatan menunjukkan dua puncak (bimodal), yang menandakan pelanggan terbagi dalam dua kelompok pendapatan dengan kepadatan tertinggi pada pendapatan rendah hingga menengah. Secara keseluruhan, kedua plot densitas ini memberikan visualisasi yang halus dan informatif tentang distribusi Age dan Income, sehingga mempermudah analisis pola kepadatan pelanggan dalam dataset.

3. Parameter Penghalusan (Smoothing)

# Age
ggplot(bike_buyers, aes(x = Age))+
  geom_density(fill = "light blue",
               bw = 1)+
  theme_minimal()+
  labs(title = "Densitas Pembelian Sepeda pada Age",
       subtitle = "Bandwidth = 1")

# Income
ggplot(bike_buyers, aes(x = Income))+
  geom_density(fill = "light blue",
               bw = 1)+
  theme_minimal()+
  labs(title = "Densitas Pembelian Sepeda pada Income",
       subtitle = "Bandwidth = 1")

Pada kode yang diberikan, bandwidth merupakan parameter yang mengatur tingkat penghalusan dalam perhitungan kurva densitas. Bandwidth mempengaruhi seberapa halus atau terperinci kurva yang dihasilkan saat menggambarkan distribusi data. Semakin kecil nilai bandwidth, semakin detail dan tajam kurva densitas yang dihasilkan, karena kurva ini lebih dipengaruhi oleh data lokal yang lebih sempit. Sebaliknya, semakin besar nilai bandwidth, kurva menjadi lebih halus karena data yang lebih luas digunakan untuk menghitung kepadatan, sehingga fluktuasi atau variasi kecil dalam data menjadi kurang terlihat. Dengan bandwidth = 1, yang digunakan dalam kode ini, kurva densitas memiliki keseimbangan antara detail dan kehalusan, memungkinkan gambaran yang cukup jelas tentang distribusi data tanpa terlalu banyak variasi yang membingungkan. Dalam contoh ini, kurva Age menunjukkan distribusi usia pelanggan yang cukup terkonsentrasi, sementara kurva Income menampilkan distribusi yang lebih variatif, keduanya dengan pengaruh bandwidth yang membuat kurva tampak cukup halus namun tetap mempertahankan detail distribusi data yang ada. Parameter bandwidth ini memungkinkan visualisasi yang lebih intuitif dalam memahami pola distribusi data tanpa kehilangan informasi penting.

II. Bivariat

A. Variabel Kategorik dengan Kategorik

1. Diagram Batang Bertumpuk

# Menghubungkan Jenis Kelamin dan Region
ggplot(bike_buyers,
       aes(x = Gender,
           fill = Region))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

# Menghubungkan Region dan Jenis Kelamin
ggplot(bike_buyers,
       aes(x = Region,
           fill = Gender))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

# Menghubungkan Keputusan Membeli dan Region
ggplot(bike_buyers,
       aes(x = Purchased_Bike,
           fill = Region))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

# Menghubungkan Region dan Keputusan Membeli
ggplot(bike_buyers,
       aes(x = Region,
           fill = Purchased_Bike))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

# Menghubungkan Keputusan Membeli dan Jenis Kelamin
ggplot(bike_buyers,
       aes(x = Purchased_Bike,
           fill = Gender))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

# Menghubungkan Jenis Kelamin dan Keputusan Membeli
ggplot(bike_buyers,
       aes(x = Gender,
           fill = Purchased_Bike))+
  geom_bar(position = "fill")+
  theme_minimal()+
  labs(y = "Proportion")

Analisis hubungan antara variabel kategorik menggunakan diagram batang bertumpuk menunjukkan bahwa wilayah Pasifik memiliki proporsi pembeli sepeda tertinggi dibandingkan Eropa dan Amerika Utara. Selain itu, pria sedikit lebih dominan dalam keputusan membeli sepeda dibandingkan wanita. Dipaparkan juga tentang hubungan antara Region dan Gender, hubungan antara Keputusan Membeli dan Region, hubungan antara Region dan Keputusan Membeli, hubungan antara Keputusan Membeli dan Gender, dan hubungan antara Gender dan Keputusan Membeli.

2. Diagram Batang Tersegementasi

# Menghubungkan Jenis Kelamin dan Region
plotdata <- bike_buyers %>%
  group_by(Gender, Region) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Gender),
           y = pct,
           fill = factor(Region)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Region",
       x = "Gender",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

# Menghubungkan Region dan Jenis Kelamin
plotdata <- bike_buyers %>%
  group_by(Region, Gender) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Region'. You can override using the
## `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Region),
           y = pct,
           fill = factor(Gender)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Gender",
       x = "Region",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

# Menghubungan Keputusan Membeli dan Region
plotdata <- bike_buyers %>%
  group_by(Purchased_Bike, Region) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Purchased_Bike'. You can override using
## the `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Purchased_Bike),
           y = pct,
           fill = factor(Region)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Region",
       x = "Purchased Bike",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

# Menghubungkan Region dan Keputusan Membeli
plotdata <- bike_buyers %>%
  group_by(Region, Purchased_Bike) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Region'. You can override using the
## `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Region),
           y = pct,
           fill = factor(Purchased_Bike)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Purchased Bike",
       x = "Region",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

# Menghubungkan Keputusan Membeli dan Jenis Kelamin
plotdata <- bike_buyers %>%
  group_by(Purchased_Bike, Gender) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Purchased_Bike'. You can override using
## the `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Purchased_Bike),
           y = pct,
           fill = factor(Gender)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Gender",
       x = "Purchased Bike",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

# Menghubungkan Jenis Kelamin dan Keputusan Membeli
plotdata <- bike_buyers %>%
  group_by(Gender, Purchased_Bike) %>%
  dplyr::summarize(n = n()) %>%
  mutate(pct = n/sum(n),
         lbl = scales::percent(pct))
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
ggplot(plotdata,
       aes(x = factor(Gender),
           y = pct,
           fill = factor(Purchased_Bike)))+
  geom_bar(stat = "identity",
           position = "fill")+
  scale_y_continuous(breaks = seq(0, 1, .2),
                     label = percent)+
  geom_text(aes(label = lbl),
            size = 8,
            position = position_stack(vjust = 0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y = "Percent",
       fill = "Purchased Bike",
       x = "Gender",
       title = "Pembelian Sepeda pada Hubungan Gender dan Region")

Diagram batang tersegementasi digunakan untuk menganalisis hubungan variabel seperti Gender dan Region. Hasilnya menunjukkan bahwa proporsi pembelian sepeda cukup merata antara pria dan wanita di wilayah Pasifik, sedangkan di wilayah Eropa dan Amerika Utara, dominan pria sedikit lebih terlihat.

3. Diagram Batang yang dikelompokkan

# Menghubungkan Jenis Kelamin dan Region
ggplot(bike_buyers, aes(x = Gender, fill = Region))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

# Menghubungkan Region dan Jenis Kelamin
ggplot(bike_buyers, aes(x = Region, fill = Gender))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

# Menghubungkan Keputusan Membeli dan Region
ggplot(bike_buyers, aes(x = Purchased_Bike, fill = Region))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

# Menghubungkan Region dan Keputusan Membeli
ggplot(bike_buyers, aes(x = Region, fill = Purchased_Bike))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

# Menghubungkan Keputusan Membeli dan Jenis Kelamin
ggplot(bike_buyers, aes(x = Purchased_Bike, fill = Gender))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

# Menghubungkan Jenis Kelamin dan Keputusan Membeli
ggplot(bike_buyers, aes(x = Gender, fill = Purchased_Bike))+
  theme_minimal()+
  geom_bar(position = position_dodge(preserve = "single"))

Diagram batang yang dikelompokkan memberikan pandangan terperinci tentang hubungan antara Gender, Region, dan Purchased_Bike. Hasilnya menunjukkan variasi kecil dalam keputusan membeli sepeda berdasarkan jenis kelamin dan wilayah.

4. Plot Mosaik

tbl <- xtabs(~Purchased_Bike + Gender + Region, bike_buyers)
ftable(tbl)
##                       Region Europe North America Pacific
## Purchased_Bike Gender                                    
## No             Female            83           131      39
##                Male              69           157      40
## Yes            Female            81           112      49
##                Male              67           108      64
mosaic(tbl, main = "Pembelian Sepeda")

4.1 Mengecek Ketergantungan Variabel
mosaic(tbl,
       shade = TRUE,
       legend = TRUE,
       labeling_args = list(set_varnames = c(Region = "Region",
                                             Purchased_Bike = "Purchased Bike",
                                             Gender = "Gender")),
       set_labels = list(Purchased_Bike = c("No", "Yes"),
                         Gender = c("Male", "Female"),
                         Region = c("Europe", "Pacific", "North America")),
       main = "Pembelian Sepeda")

Plot mosaik memberikan gambaran hubungan ketergantungan antara Gender, Region, dan Purchased_Bike. Wilayah Pasifik kembali menonjol dengan proporsi pembelian sepeda yang lebih tinggi dibandingkan wilayah lain.

B. Variabel Kontinu dengan Kontinu

1. Plot Sebaran dengan Garis

# Age dengan Income
ggplot(bike_buyers,
       aes(x = Age,
           y = Income))+
  geom_point(color = "cornflowerblue")+
  geom_smooth(method = "lm",
              formula = y ~ poly(x, 2),
              color = "brown1")+
  theme_minimal()+
  labs(x = "Age",
       y = "",
       title = "Age vs Income",
       subtitle = "Pembelian Sepeda")

ggplot(bike_buyers,
       aes(x = Income,
           y = Age))+
  geom_point(color = "cornflowerblue")+
  geom_smooth(method = "lm",
              formula = y ~ poly(x, 2),
              color = "brown1")+
  theme_minimal()+
  labs(x = "Income",
       y = "",
       title = "Income vs Age",
       subtitle = "Pembelian Sepeda")

Pada plot sebaran dengan garis dalam variabel kontinu dengan kontinu, terdapat hubungan antara Age (usia) dan Income (pendapatan) dieksplorasi melalui scatter plot yang dilengkapi dengan garis regresi polinomial. Visualisasi ini bertujuan untuk mengidentifikasi pola hubungan antara dua variabel numerik tersebut, seperti apakah hubungan bersifat linear, melengkung, atau tidak signifikan. Scatter plot menunjukkan titik data individual di mana pada grafik pertama sumbu-X merepresentasikan usia dan pada grafik kedua sumbu-X merepresentasikan pendapatan.

C. Variabel Kategorikal dengan Kontinu

+ Menghubungkan Income berdasarkan Region

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Region) %>%
  dplyr::summarize(mean_income = mean(Income))
mycols <- c("Blue", "Purple", "Light Blue")
ggplot(plotdata,
       aes(x = factor(Region,
                      labels = c("Europe", "North America", "Pacific")),
           y = mean_income))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = dollar(mean_income)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 180000, 20000),
                     label = dollar)+
  theme_minimal()+
  labs(title = "Rata-rata Penghasilan Berdasarkan Region",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Income,
           fill = Region))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Penghasilan Berdasarkan Region")
## $title
## [1] "Distribusi Penghasilan Berdasarkan Region"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Region,
                      labels = c("Europe", "North America", "Pacific")),
           y = Income,
           fill = Region))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Penghasilan Berdasarkan Region",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")
## Warning: Using the `size` aesthetic in this geom was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` in the `default_aes` field and elsewhere instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Using the `size` aesthetic with geom_segment was deprecated in ggplot2 3.4.0.
## ℹ Please use the `linewidth` aesthetic instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Using the `size` aesthetic with geom_crossbar was deprecated in ggplot2 3.4.0.
## ℹ Please use the `linewidth` aesthetic instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Untuk variabel kategorikal dengan Kontinu terutama pada Income berdasarkan Region menjelaskan bagaimana rata-rata pendapatan (Income) bervariasi di setiap wilayah (Region) menggunakan tiga jenis visualisasi, yaitu Diagram batang, Plot densitas kernel, dan gabungan plot strip dan Boxplot. Dimana, Diagram batang menampilkan rata-rata pendapatan per wilayah, dengan tinggi batang merepresentasikan perbedaan signifikan, seperti pendapatan rata-rata lebih tinggi di North America dibandingkan wilayah lain. Untuk plot densitas kernel menunjukkan distribusi pendapatan di tiap wilayah, memberikan gambaran sebaran data, seperti apakah pendapatan berpengaruh pada rentang tertentu atau tersebar luas. Adapun untuk gabungan plot strip dan boxplot melengkapi analisis ini dengan menampilkan data individual (strip plot) bersama ringkasan statistik seperti median dan kuartil (boxplot), sehingga mempermudah identifikasi variasi data dan outlier. Analisis ini membantu memahami perbedaan pendapatan antar wilayah, memberikan wawasan strategis untuk segmentasi pasar dan pengambilan keputusan bisnis.

+ Menghubungkan Income berdasarkan Gender

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Gender) %>%
  dplyr::summarize(mean_income = mean(Income))
mycols <- c("Light Pink", "Blue")
ggplot(plotdata,
       aes(x = factor(Gender,
                      labels = c("Female", "Male")),
           y = mean_income))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = dollar(mean_income)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 180000, 20000),
                     label = dollar)+
  theme_minimal()+
  labs(title = "Rata-rata Income Berdasarkan Gender",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Income,
           fill = Gender))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Income Berdasarkan Gender")
## $title
## [1] "Distribusi Income Berdasarkan Gender"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Gender,
                      labels = c("Female", "Male")),
           y = Income,
           fill = Gender))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Penghasilan Berdasarkan Gender",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")

Pada Income berdasarkan Gender menjelaskan perbedaan rata-rata pendapatan antara jenis kelamin (Gender) menggunakan tiga visualisasi utama. Pertama, diagram batang menampilkan rata-rata pendapatan pelanggan laki-laki dan perempuan, di mana tinggi batang menunjukkan bahwa laki-laki cenderung memiliki rata-rata pendapatan lebih tinggi dibandingkan perempuan. Nilai rata-rata ini juga terdapat di atas batang untuk memudahkan interpretasi. Lalu pada plot densitas kernel digunakan untuk menunjukkan distribusi pendapatan masing-masing gender. Visualisasi ini memperlihatkan apakah pendapatan perempuan lebih terkonsentrasi pada rentang tertentu, sementara laki-laki mungkin memiliki distribusi yang lebih lebar atau seragam. Terakhir, gabungan plot strip dan boxplot memberikan gambaran yang lebih granular, dengan strip plot menampilkan data individual, memungkinkan identifikasi outlier, sementara boxplot memberikan ringkasan statistik seperti median, kuartil, dan variasi data. Analisis ini mengungkapkan pola penting dalam distribusi pendapatan antara gender, membantu menyusun strategi yang lebih inklusif atau spesifik berdasarkan perbedaan pendapatan tersebut.

+ Menghubungkan Income berdasarkan Keputusan Membeli

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Purchased_Bike) %>%
  dplyr::summarize(mean_income = mean(Income))
mycols <- c("Red", "Green")
ggplot(plotdata,
       aes(x = factor(Purchased_Bike,
                      labels = c("No", "Yes")),
           y = mean_income))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = dollar(mean_income)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 180000, 20000),
                     label = dollar)+
  theme_minimal()+
  labs(title = "Rata-rata Income Berdasarkan Purchased Bike",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Income,
           fill = Purchased_Bike))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Income Berdasarkan Purchased Bike")
## $title
## [1] "Distribusi Income Berdasarkan Purchased Bike"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Purchased_Bike,
                      labels = c("No", "Yes")),
           y = Income,
           fill = Purchased_Bike))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Penghasilan Berdasarkan Purchased Bike",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")

Pada Income berdasarkan Keputusan Membeli bertujuan untuk membandingkan rata-rata pendapatan antara pelanggan yang membeli sepeda (Purchased Bike = Yes) dan yang tidak membeli sepeda (Purchased Bike = No). Visualisasi pertama yang digunakan adalah diagram batang, yang menunjukkan rata-rata pendapatan untuk masing-masing kelompok keputusan pembelian. Dimana dapat dilihat bahwa batang kelompok yang membeli sepeda biasanya memiliki tinggi yang berbeda dibandingkan dengan kelompok yang tidak membeli sepeda, dengan label rata-rata pendapatan di atas masing-masing batang. Lalu, plot densitas kernel digunakan untuk menggambarkan distribusi pendapatan di kedua kelompok. Dengan menggunakan warna berbeda, dapat tergambarkan apakah distribusi pendapatan lebih terpusat atau lebih tersebar pada salah satu kelompok. Adapun untuk gabungan plot strip dan boxplot memberikan wawasan lebih mendalam. Strip plot menunjukkan data individual dan boxplot menyajikan statistik ringkasan seperti median dan kuartil. Gabungan ini membantu mengidentifikasi apakah ada perbedaan signifikan dalam distribusi pendapatan antara mereka yang membeli sepeda dan yang tidak.

+ Menghubungkan Age berdasarkan Region

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Region) %>%
  dplyr::summarize(mean_age = mean(Age))
mycols <- c("Blue", "Purple", "Light Blue")
ggplot(plotdata,
       aes(x = factor(Region,
                      labels = c("Europe", "North America", "Pacific")),
           y = mean_age))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = number(mean_age)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 100, 5),
                     label = number)+
  theme_minimal()+
  labs(title = "Rata-rata Age Berdasarkan Region",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Age,
           fill = Region))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Age Berdasarkan Region")
## $title
## [1] "Distribusi Age Berdasarkan Region"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Region,
                      labels = c("Europe", "North America", "Pacific")),
           y = Age,
           fill = Region))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Age Berdasarkan Region",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")

Analisis usia (age) berdasarkan Region membandingkan rata-rata usia pelanggan di berbagai wilayah (Region). Visualisasi pertama menggunakan diagram batang, yang menunjukkan rata-rata usia pelanggan untuk setiap wilayah, dengan tinggi batang mewakili perbedaan usia rata-rata antara Europe, North America, dan Pacific. Plot densitas kernel digunakan untuk menggambarkan distribusi usia di masing-masing wilayah, memperlihatkan apakah usia pelanggan terkonsentrasi dalam rentang tertentu atau tersebar lebih luas. Adapun, gabungan plot strip dan boxplot menampilkan data individual dan ringkasan statistik seperti median dan kuartil untuk mengidentifikasi variasi usia dalam setiap wilayah.

+ Menghubungkan Age berdasarkan Gender

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Gender) %>%
  dplyr::summarize(mean_age = mean(Age))
mycols <- c("Light Pink", "Blue")
ggplot(plotdata,
       aes(x = factor(Gender,
                      labels = c("Female", "Male")),
           y = mean_age))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = number(mean_age)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 100, 5),
                     label = number)+
  theme_minimal()+
  labs(title = "Rata-rata Age Berdasarkan Gender",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Age,
           fill = Gender))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Age Berdasarkan Gender")
## $title
## [1] "Distribusi Age Berdasarkan Gender"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Gender,
                      labels = c("Female", "Male")),
           y = Age,
           fill = Gender))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Age Berdasarkan Gender",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")

Pada analisis usia (age) berdasarkan jenis kelamin (Gender), digunakan diagram batang untuk membandingkan rata-rata usia antara pria dan wanita. Grafik ini memungkinkan kita untuk melihat apakah ada perbedaan signifikan dalam usia rata-rata antara kedua kelompok. Misalnya, mungkin ditemukan bahwa pria memiliki rata-rata usia yang lebih tinggi atau lebih rendah dibandingkan wanita. Untuk plot densitas kernel, digunakan untuk menggambarkan distribusi usia masing-masing jenis kelamin, serta menunjukkan apakah usia pria dan wanita tersebar dengan cara yang mirip atau berbeda. Adapun untuk Gabungan plot strip dan boxplot kemudian kita gunakan untuk melihat data individual dan memberikan gambaran statistik lebih rinci, seperti median dan kuartil, untuk mengevaluasi variasi usia dalam setiap kelompok gender.

+ Menghubungkan Age berdasarkan Keputusan Membeli

# Diagram Batang
plotdata <- bike_buyers %>%
  group_by(Purchased_Bike) %>%
  dplyr::summarize(mean_age = mean(Age))
mycols <- c("Red", "Green")
ggplot(plotdata,
       aes(x = factor(Purchased_Bike,
                      labels = c("No", "Yes")),
           y = mean_age))+
  geom_bar(stat = "identity",
           fill = mycols)+
  geom_text(aes(label = number(mean_age)),
            vjust = -0.25)+
  scale_y_continuous(breaks = seq(0, 100, 5),
                     label = number)+
  theme_minimal()+
  labs(title = "Rata-rata Age Berdasarkan Purchased Bike",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")

# Plot Densitas Kernel
ggplot(bike_buyers,
       aes(x = Age,
           fill = Purchased_Bike))+
  geom_density(alpha = 0.4)+
  theme_minimal()

labs(title = "Distribusi Age Berdasarkan Purchased Bike")
## $title
## [1] "Distribusi Age Berdasarkan Purchased Bike"
## 
## attr(,"class")
## [1] "labels"
# Gabungan Plot Strip dan Boxplot
ggplot(bike_buyers,
       aes(x = factor(Purchased_Bike,
                      labels = c("No", "Yes")),
           y = Age,
           fill = Purchased_Bike))+
  geom_boxjitter(color = "black",
                 jitter.color = "darkgrey",
                 errorbar.draw = TRUE)+
  scale_y_continuous(label = dollar)+
  labs(title = "Distribusi Age Berdasarkan Purchased Bike",
       subtitle = "Pembelian Sepeda",
       x = "",
       y = "")+
  theme_minimal()+
  theme(legend.position = "none")

Pada analisis usia (age) berdasarkan keputusan pembelian sepeda (Purchased Bike), digunakan diagram batang untuk membandingkan rata-rata usia antara pelanggan yang membeli sepeda dan yang tidak membeli sepeda. Grafik ini membantu mengetahui apakah ada perbedaan usia rata-rata di antara kedua kelompok ini. Selanjutnya, plot densitas kernel digunakan untuk melihat sebaran usia di kedua kelompok. Kita dapat mengidentifikasi apakah usia pembeli sepeda lebih terkonsentrasi pada rentang usia tertentu dibandingkan dengan yang tidak membeli. Adapun, Gabungan plot strip dan boxplot memberikan gambaran lebih rinci dengan menunjukkan data individual dan ringkasan statistik seperti median dan kuartil, yang membantu mengidentifikasi pola dan perbedaan signifikan dalam usia antara pembeli dan non-pembeli sepeda.

III. Multivariat

A. Pengelompokan

1. Income berdasarkan Age dan Gender

ggplot(bike_buyers, aes(x = Age,
                        y = Income,
                        color = Gender))+
  geom_point(size = 6, alpha = .6)+
  geom_smooth(se = FALSE,
              method = "lm",
              formula = y~poly(x,2),
              size = 1.5)+
  labs(title = "Income berdasarkan Age dan Gender")+
  scale_y_continuous(label = scales::dollar)+
  scale_color_brewer(palette = "Set1")+
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Scatterplot menunjukkan bahwa pendapatan cenderung meningkat dengan bertambahnya usia, terutama pada kelompok pria. Kelompok wanita memiliki distribusi pendapatan yang lebih merata.

2. Income berdasarkan Age dan Region

ggplot(bike_buyers, aes(x = Age,
                        y = Income,
                        color = Region))+
  geom_point(size = 6, alpha = .6)+
  geom_smooth(se = FALSE,
              method = "lm",
              formula = y~poly(x,2),
              size = 1.5)+
  labs(title = "Income berdasarkan Age dan Region")+
  scale_y_continuous(label = scales::number)+
  scale_color_brewer(palette = "Set1")+
  theme_minimal()

Pelanggan dari wilayah Pasifik memiliki tren peningkatan pendapatan dengan usia yang lebih jelas dibandingkan wilayah lainnya. Hal ini menunjukkan perbedaan demografi ekonomi di setiap wilayah.

3. Income berdasarkan Age dan Purchased Bike

ggplot(bike_buyers, aes(x = Age,
                        y = Income,
                        color = Purchased_Bike))+
  geom_point(size = 6, alpha = .6)+
  geom_smooth(se = FALSE,
              method = "lm",
              formula = y~poly(x,2),
              size = 1.5)+
  labs(title = "Income berdasarkan Age dan Purchased Bike")+
  scale_y_continuous(label = scales::number)+
  scale_color_brewer(palette = "Set1")+
  theme_minimal()    

Pelanggan yang membeli sepeda cenderung memiliki pendapatan lebih tinggi pada berbagai rentang usia dibandingkan mereka yang tidak membeli. Hal ini mengindikasikan hubungan yang kuat antara pendapatan dan keputusan membeli sepeda.

B. Faceting

Untuk Income

# Histogram Income berdasarkan Gender dan Region
ggplot(bike_buyers, aes(x = Income / 1000))+
  geom_histogram(color = "white",
                 fill = "cornflowerblue")+
  facet_grid(Gender ~ Region)+
  theme_minimal()+
  labs(title = "Histogram Income berdasarkan Gender dan Region",
       x = "Income ($1000)")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# Histogram Income berdasarkan Gender dan Purchased Bike
ggplot(bike_buyers, aes(x = Income / 1000))+
  geom_histogram(color = "white",
                 fill = "cornflowerblue")+
  facet_grid(Purchased_Bike ~ Region)+
  theme_minimal()+
  labs(title = "Histogram Income berdasarkan Gender dan Purchased Bike",
       x = "Income ($1000)")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Faceting pada pendapatan menunjukkan perbedaan distribusi berdasarkan kombinasi Gender dan Region. Wilayah Pasifik menunjukkan distribusi pendapatan yang lebih bervariasi dibandingkan wilayah lain.

Untuk Age

ggplot(bike_buyers, aes(x = Age))+
  geom_histogram(color = "white",
                 fill = "cornflowerblue")+
  facet_grid(Gender ~ Region)+
  theme_minimal()+
  labs(title = "Histogram Income berdasarkan Gender dan Region",
       x = "Age")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(bike_buyers, aes(x = Age))+
  geom_histogram(color = "white",
                 fill = "cornflowerblue")+
  facet_grid(Purchased_Bike ~ Region)+
  theme_minimal()+
  labs(title = "Histogram Income berdasarkan Gender dan Purchased Bike",
       x = "Age")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Faceting pada usia menunjukkan bahwa pelanggan wanita di wilayah Pasifik cenderung lebih muda dibandingkan dengan wilayah lain. Perbedaan ini terlihat jelas pada distribusi histogram.

Kesimpulan

Wilayah Pasifik memiliki proporsi pembelian sepeda tertinggi, terutama pada kelompok usia muda. Pendapatan memiliki pengaruh signifikan terhadap keputusan membeli sepeda, dengan pendapatan lebih tinggi mendorong pembelian. Analisis multivariat menunjukkan interaksi yang kompleks antara usia, wilayah, gender, dan keputusan pembelian.

Daftar Pustaka

EDA & PreProcessing | https://rpubs.com/Kurniawans/855458 Algoritma & Struktur Data | https://rpubs.com/sausanramadhani/sdatugas07