Pada pertemuan ini, kita akan melakukan Exploratory Data Analysis (EDA) untuk memahami karakteristik data sebelum masuk ke analisis lebih lanjut.
Setelah praktikum, mahasiswa diharapkan mampu:
Alur utama yang digunakan:
Pertanyaan → Data → Visualisasi → Interpretasi
Pada praktikum ini kita menggunakan dplyr untuk
pengolahan/ringkasan data dan ggplot2 untuk
visualisasi.
Jika package belum terpasang, jalankan satu kali:
install.packages("dplyr")
install.packages("ggplot2")
Kemudian aktifkan package:
library(dplyr)
library(ggplot2)
options(scipen = 999)
Dataset yang digunakan adalah Mall Customer Segmentation Data dengan lima peubah:
CustomerID: ID pelanggan;Gender: jenis kelamin pelanggan;Age: umur pelanggan;AnnualIncome: pendapatan tahunan dalam ribuan
dolar;SpendingScore: skor perilaku/pengeluaran pelanggan
(1–100).Simpan file Mall_Customers.csv pada folder yang sama
dengan file R Markdown ini.
Sumber dataset: Customer Segmentation Tutorial in Python (Kaggle).
customer <- read.csv("C:\\Nedi\\backip\\Magister\\R\\Mall_Customers.csv")
names(customer) <- c(
"CustomerID",
"Gender",
"Age",
"AnnualIncome",
"SpendingScore"
)
head(customer)
## CustomerID Gender Age AnnualIncome SpendingScore
## 1 1 Male 19 15 39
## 2 2 Male 21 15 81
## 3 3 Female 20 16 6
## 4 4 Female 23 16 77
## 5 5 Female 31 17 40
## 6 6 Female 22 17 76
Perhatikan:
CustomerID layak dianalisis sebagai peubah
numerik?
CustomerIDmemang disimpan sebagai angka, tetapi fungsinya hanya sebagai identifier, bukan ukuran kuantitatif yang perlu dianalisis distribusinya.
dim(customer)
## [1] 200 5
Output yang diharapkan: 200 observasi dan 5 peubah.
names(customer)
## [1] "CustomerID" "Gender" "Age" "AnnualIncome"
## [5] "SpendingScore"
str(customer)
## 'data.frame': 200 obs. of 5 variables:
## $ CustomerID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Gender : chr "Male" "Male" "Female" "Female" ...
## $ Age : int 19 21 20 23 31 22 35 23 64 30 ...
## $ AnnualIncome : int 15 15 16 16 17 17 18 18 19 19 ...
## $ SpendingScore: int 39 81 6 77 40 76 6 94 3 72 ...
Hal yang perlu diperhatikan:
Tipe penyimpanan data tidak selalu sama dengan makna analitis peubah. Sebuah ID dapat disimpan sebagai integer, tetapi tidak berarti ID tersebut harus diperlakukan sebagai peubah numerik untuk analisis.
summary(customer)
## CustomerID Gender Age AnnualIncome
## Min. : 1.00 Length:200 Min. :18.00 Min. : 15.00
## 1st Qu.: 50.75 Class :character 1st Qu.:28.75 1st Qu.: 41.50
## Median :100.50 Mode :character Median :36.00 Median : 61.50
## Mean :100.50 Mean :38.85 Mean : 60.56
## 3rd Qu.:150.25 3rd Qu.:49.00 3rd Qu.: 78.00
## Max. :200.00 Max. :70.00 Max. :137.00
## SpendingScore
## Min. : 1.00
## 1st Qu.:34.75
## Median :50.00
## Mean :50.20
## 3rd Qu.:73.00
## Max. :99.00
Dari summary() kita dapat melihat informasi awal
seperti:
Pertanyaan:
Apakah angka-angka tersebut sudah cukup untuk mengetahui bentuk distribusi data?
Belum. Untuk itu kita memerlukan visualisasi.
Sebelum membuat analisis lebih lanjut, kita perlu memastikan kondisi dasar dataset.
colSums(is.na(customer))
## CustomerID Gender Age AnnualIncome SpendingScore
## 0 0 0 0 0
Total missing value:
sum(is.na(customer))
## [1] 0
Interpretasi yang diharapkan: dataset ini tidak memiliki missing value.
Jika suatu dataset memiliki missing value, jangan langsung menghapusnya. Kita perlu mempertimbangkan jumlah, proporsi, pola missing, variabel yang terdampak, dan tujuan analisis.
sum(duplicated(customer))
## [1] 0
Interpretasi yang diharapkan: tidak terdapat baris yang terduplikasi secara keseluruhan.
Eksplorasi univariate mempelajari satu peubah untuk memahami distribusi atau karakteristiknya.
Kita akan memfokuskan eksplorasi numerik pada:
Age;AnnualIncome;SpendingScore.CustomerID tidak dimasukkan karena hanya berfungsi
sebagai identifier.
data_sebaran <- stack(
customer[c(
"Age",
"AnnualIncome",
"SpendingScore"
)]
)
names(data_sebaran) <- c(
"Nilai",
"Peubah"
)
head(data_sebaran)
## Nilai Peubah
## 1 19 Age
## 2 21 Age
## 3 20 Age
## 4 23 Age
## 5 31 Age
## 6 22 Age
Histogram digunakan untuk melihat:
ggplot(
data_sebaran,
aes(x = Nilai)
) +
geom_histogram(
bins = 10,
fill = "steelblue",
color = "white"
) +
facet_wrap(
~ Peubah,
scales = "free",
nrow = 1
) +
labs(
title = "Distribusi Peubah Numerik",
x = "Nilai",
y = "Frekuensi"
) +
theme_minimal()
Boxplot memberikan ringkasan visual mengenai:
ggplot(
data_sebaran,
aes(
x = Peubah,
y = Nilai
)
) +
geom_boxplot(
fill = "lightblue"
) +
facet_wrap(
~ Peubah,
scales = "free_y",
nrow = 1
) +
labs(
title = "Boxplot Peubah Numerik",
x = NULL,
y = "Nilai"
) +
theme_minimal()
Pertanyaan:
Peubah mana yang tampak memiliki kandidat pencilan?
Density plot memberikan representasi distribusi yang lebih halus dibandingkan histogram.
ggplot(
data_sebaran,
aes(x = Nilai)
) +
geom_density(
fill = "steelblue",
alpha = 0.4
) +
facet_wrap(
~ Peubah,
scales = "free",
nrow = 1
) +
labs(
title = "Kernel Density Peubah Numerik",
x = "Nilai",
y = "Density"
) +
theme_minimal()
Histogram dan density plot sama-sama membantu memahami distribusi. Perbedaannya terutama terletak pada cara distribusi tersebut direpresentasikan.
Untuk peubah kategorik seperti Gender, salah satu
visualisasi sederhana adalah bar chart.
ggplot(
customer,
aes(
x = Gender,
fill = Gender
)
) +
geom_bar() +
labs(
title = "Jumlah Pelanggan Berdasarkan Gender",
x = "Gender",
y = "Jumlah Pelanggan"
) +
guides(fill = "none") +
theme_minimal()
Sekarang pertanyaannya berubah dari:
Bagaimana distribusi Spending Score?
menjadi:
Apakah Spending Score berbeda antara kelompok Gender?
customer %>%
group_by(Gender) %>%
summarise(
Jumlah = n(),
Rata_rata = mean(SpendingScore),
Median = median(SpendingScore),
SD = sd(SpendingScore),
.groups = "drop"
)
## # A tibble: 2 × 5
## Gender Jumlah Rata_rata Median SD
## <chr> <int> <dbl> <dbl> <dbl>
## 1 Female 112 51.5 50 24.1
## 2 Male 88 48.5 50 27.9
Hal yang perlu diperhatikan:
Perbedaan rata-rata saja belum cukup untuk menyimpulkan bahwa dua kelompok benar-benar memiliki pola yang berbeda. Kita juga perlu melihat distribusinya.
ggplot(
customer,
aes(
x = Gender,
y = SpendingScore,
fill = Gender
)
) +
geom_boxplot() +
labs(
title = "Spending Score Berdasarkan Gender",
x = "Gender",
y = "Spending Score"
) +
guides(fill = "none") +
theme_minimal()
Boxplot menggunakan konsep IQR untuk membantu mengidentifikasi kandidat pencilan.
Kita gunakan AnnualIncome.
ggplot(
customer,
aes(y = AnnualIncome)
) +
geom_boxplot(
fill = "lightblue"
) +
labs(
title = "Outlier Detection pada Annual Income",
x = NULL,
y = "Annual Income"
) +
theme_minimal()
Q1 <- quantile(
customer$AnnualIncome,
0.25
)
Q3 <- quantile(
customer$AnnualIncome,
0.75
)
IQR_income <- IQR(
customer$AnnualIncome
)
batas_bawah <- Q1 - 1.5 * IQR_income
batas_atas <- Q3 + 1.5 * IQR_income
Q1
## 25%
## 41.5
Q3
## 75%
## 78
IQR_income
## [1] 36.5
batas_bawah
## 25%
## -13.25
batas_atas
## 75%
## 132.75
Batas yang diharapkan:
-13.25;132.75.customer %>%
filter(
AnnualIncome < batas_bawah |
AnnualIncome > batas_atas
)
## CustomerID Gender Age AnnualIncome SpendingScore
## 1 199 Male 32 137 18
## 2 200 Male 30 137 83
Dataset ini menghasilkan dua kandidat pencilan pada
AnnualIncome = 137.
Penting: outlier tidak otomatis berarti data salah. Pencilan harus diperiksa berdasarkan konteks, proses pengumpulan data, dan tujuan analisis sebelum diputuskan untuk dipertahankan, ditransformasi, atau dikeluarkan.
Eksplorasi bivariate mempelajari dua peubah secara bersamaan.
Pertanyaan kita:
Apakah pelanggan dengan Annual Income yang lebih tinggi cenderung memiliki Spending Score yang lebih tinggi?
ggplot(
customer,
aes(
x = AnnualIncome,
y = SpendingScore
)
) +
geom_point(
size = 2,
alpha = 0.7
) +
labs(
title = "Annual Income dan Spending Score",
x = "Annual Income",
y = "Spending Score"
) +
theme_minimal()
Koefisien korelasi Pearson digunakan untuk mengukur hubungan linear antara dua peubah numerik.
cor(
customer$AnnualIncome,
customer$SpendingScore
)
## [1] 0.009902848
Nilai yang diharapkan sekitar:
0.0099
Nilai tersebut sangat dekat dengan nol.
Interpretasi yang tepat:
Tidak terlihat hubungan linear yang kuat antara
AnnualIncomedanSpendingScore.
Hindari pernyataan:
“Tidak ada hubungan sama sekali.”
Koefisien korelasi yang mendekati nol hanya menunjukkan bahwa hubungan linear lemah. Scatterplot tetap diperlukan untuk memeriksa bentuk pola data.
Kita dapat menambahkan informasi kelompok ke dalam scatterplot.
ggplot(
customer,
aes(
x = AnnualIncome,
y = SpendingScore,
color = Gender,
shape = Gender
)
) +
geom_point(
size = 2.5,
alpha = 0.8
) +
labs(
title = "Annual Income dan Spending Score Berdasarkan Gender",
x = "Annual Income",
y = "Spending Score"
) +
theme_minimal()
Pertanyaan:
Apakah penambahan informasi Gender membantu kita
menemukan pola tambahan?
Menambahkan lebih banyak estetika tidak selalu membuat grafik lebih baik. Gunakan warna, bentuk, atau ukuran hanya jika membantu menjawab pertanyaan analisis.
Tanpa melihat kode, tentukan visualisasi yang menurut kalian paling tepat.
Bagaimana distribusi umur pelanggan?
Pilihan yang masuk akal: histogram atau density plot.
Apakah terdapat Annual Income yang ekstrem?
Pilihan yang masuk akal: boxplot.
Apakah Spending Score berbeda berdasarkan Gender?
Pilihan yang masuk akal: boxplot antar kelompok.
Apakah Annual Income berhubungan dengan Spending Score?
Pilihan yang masuk akal: scatterplot.
Berapa jumlah pelanggan Male dan Female?
Pilihan yang masuk akal: bar chart.
EDA pada pertemuan ini dapat diringkas sebagai:
DATA
│
├── Kenali Struktur
│ ├── dim()
│ ├── names()
│ ├── str()
│ └── summary()
│
├── Periksa Kualitas
│ ├── Missing value
│ └── Duplicate
│
├── Univariate
│ ├── Histogram
│ ├── Boxplot
│ └── Density plot
│
├── Perbandingan Antar Kelompok
│ ├── Statistik ringkasan
│ └── Boxplot
│
└── Bivariate
├── Scatterplot
└── Correlation
Prinsip utama:
Jangan berhenti ketika grafik berhasil dibuat. Tanyakan: grafik ini memberi tahu kita apa tentang data?
Gunakan dataset hasil pengumpulan/web scraping kelompok masing-masing.
Minimal tampilkan:
dim(data)
names(data)
str(data)
summary(data)
colSums(is.na(data))
sum(duplicated(data))
Buat minimal 3 visualisasi yang relevan dengan karakteristik dataset.
Tidak semua kelompok harus menggunakan jenis grafik yang sama.
Panduan:
| Kondisi/Pertanyaan | Visualisasi yang dapat digunakan |
|---|---|
| Distribusi satu peubah numerik | Histogram, density, boxplot |
| Frekuensi satu peubah kategorik | Bar chart |
| Numerik dibandingkan antar kategori | Boxplot antar kelompok |
| Hubungan dua peubah numerik | Scatterplot |
| Perubahan nilai menurut waktu | Line plot |
| Proporsi beberapa kategori | Bar chart / pie chart |
| Data teks | Word frequency / word cloud jika relevan |
Di bawah setiap visualisasi, tuliskan 2–3 kalimat yang menjelaskan:
Interpretasikan data, bukan dekorasi grafik.
Contoh yang kurang tepat:
“Grafik di atas menggunakan warna biru dan memiliki beberapa batang.”
Contoh yang lebih tepat:
“Sebagian besar observasi terkonsentrasi pada rentang tertentu, sedangkan hanya sedikit observasi berada pada nilai yang sangat tinggi. Pola ini menunjukkan distribusi yang tidak simetris dan perlu diperiksa lebih lanjut.”
Tuliskan 3 temuan utama dari hasil eksplorasi dataset kelompok.
Kumpulkan satu file ZIP dengan struktur:
Kelompok_X_Tugas4.zip
│
├── Kelompok_X_Tugas4.Rmd
├── Kelompok_X_Tugas4.html
├── data.csv
└── script.R # opsional jika kode sudah lengkap di Rmd
Minimal isi laporan HTML:
Pada pertemuan ini fokus utama bukan menghafal syntax
ggplot2, tetapi belajar menentukan:
Apa pertanyaannya? → Data apa yang dibutuhkan? → Visualisasi apa yang sesuai? → Apa interpretasinya?