Pendahuluan

Setelah melakukan visualisasi data kategorik pada pertemuan sebelumnya, analisis ini akan berfokus pada visualisasi data kontinu menggunakan dataset diamonds dari paket ggplot2 dalam R. Data kontinu adalah data numerik yang nilainya dapat mengambil nilai apa pun dalam suatu rentang. Dataset diamonds memiliki 53.940 berlian dengan 10 variabel berbeda, yang meliputi atribut fisik seperti ukuran karat (carat), harga (price), kedalaman (depth), lebar bidang atas (table), serta dimensi fisik (x, y, z).

Analisis ini fokus pada dua variabel kontinu utama yaitu price (harga berlian dalam USD) dan carat (berat berlian). Keempat visualisasi yang digunakan adalah histogram untuk melihat distribusi frekuensi, density plot untuk melihat distribusi probabilitas yang halus, boxplot untuk membandingkan distribusi harga antar kategori potongan, dan violin plot sebagai kombinasi boxplot dan density plot untuk visualisasi yang lebih informatif.

Visualisasi ini bertujuan untuk memahami karakteristik distribusi harga dan berat berlian, membandingkan pola distribusi antar kelompok, serta mengidentifikasi adanya outlier atau pola menarik lainnya yang dapat memberikan insight bagi konsumen maupun pelaku industri berlian.

# Tampilkan struktur data
head(diamonds)
## # A tibble: 6 × 10
##   carat cut       color clarity depth table price     x     y     z
##   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
## 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
## 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
## 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
## 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
## 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
print(names(diamonds))
##  [1] "carat"   "cut"     "color"   "clarity" "depth"   "table"   "price"  
##  [8] "x"       "y"       "z"

Visualisasi Histogram

Histogram Harga Berlian

ggplot(diamonds, aes(x = price)) +
  geom_histogram(bins = 50, fill = "#3498db", color = "white", alpha = 0.85) +
  labs(
    title = "HISTOGRAM DISTRIBUSI HARGA BERLIAN",
    subtitle = "Frekuensi harga dari 53.940 berlian",
    x = "Harga (USD)",
    y = "Frekuensi",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  scale_x_continuous(labels = dollar_format()) +
  scale_y_continuous(labels = comma) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1)
  )

Histogram pertama di atas menunjukkan pola distribusi harga berlian yang menjulur ke kanan (right-skewed). Terlihat bahwa sebagian besar harga berlian di kisaran USD 500-2.000 dengan ekor panjang ke kanan yang menunjukkan keberadaan berlian dengan harga sangat tinggi (hingga lebih USD 15.000) meskipun jumlahnya sedikit. Hal ini menunjukkan bahwa pasar didominasi oleh berlian dengan harga menengah ke bawah.

Histogram Berat Berlian

ggplot(diamonds, aes(x = carat)) +
  geom_histogram(bins = 50, fill = "#e74c3c", color = "white", alpha = 0.85) +
  labs(
    title = "HISTOGRAM DISTRIBUSI BERAT BERLIAN (CARAT)",
    subtitle = "Frekuensi berat dari 53.940 berlian",
    x = "Berat (Carat)",
    y = "Frekuensi",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  scale_x_continuous(breaks = seq(0, 5, by = 0.5)) +
  scale_y_continuous(labels = comma) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1)
  )

Pada histogram berat, terlihat puncak-puncak (peaks) yang jelas pada sekitar ukuran 0.3, 0.5, 0.7, dan 1.0 carat. Puncak-puncak ini membuktikan bahwa konsumen menyukai beberapa berat carat sehingga menjadi yang populer. Mayoritas berlian memiliki berat di bawah 1.5 carat, sementara berlian dengan berat di atas 2 carat cukup jarang ditemukan. Pola distribusi seperti ini penting dipahami karena mempengaruhi strategi dalam memberikan harga berlian dan ketersediaan stok di pasar.


Visualisasi Density Plot

Density Plot Harga Berlian

ggplot(diamonds, aes(x = price)) +
  geom_density(fill = "#3498db", alpha = 0.6, color = "#2c3e50", linewidth = 1) +
  labs(
    title = "DENSITY PLOT DISTRIBUSI HARGA BERLIAN",
    subtitle = "Kurva kepadatan probabilitas harga",
    x = "Harga (USD)",
    y = "Density",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  scale_x_continuous(labels = dollar_format()) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1)
  )

Selanjutnya kita lihat Density plot ini yang memperhalus histogram sehingga pola distribusi lebih mudah dilihat. Pada kurva harga, terlihat puncak utama di sekitar USD 1.000 dengan penurunan yang landai ke kanan. Luas area di bawah kurva mewakili probabilitas, sehingga kita dapat memperkirakan bahwa sekitar 70% berlian memiliki harga di bawah USD 3.000. Bentuk kurva yang tidak simetris membuktikan bahwa data harga tidak berdistribusi normal.

Density Plot Berat Berlian

ggplot(diamonds, aes(x = carat)) +
  geom_density(fill = "#e74c3c", alpha = 0.6, color = "#2c3e50", linewidth = 1) +
  labs(
    title = "DENSITY PLOT: DISTRIBUSI BERAT BERLIAN",
    subtitle = "Kurva kepadatan probabilitas berat",
    x = "Berat (Carat)",
    y = "Density",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1)
  )

Pada kurva berat, terlihat jelas beberapa puncak (multimodal) yang sesuai dengan ukuran-ukuran populer sekitar 0.3, 0.5, 0.7, 1.0 carat. Ini menunjukkan bahwa distribusi berat tidak mengikuti pola normal sederhana, melainkan memiliki pilihan tertentu di pasar. Fenomena ini penting bagi produsen dan penjual dalam menentukan ukuran apa yang paling banyak diproduksi dan distok.


Visualisasi Boxplot

ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "BOXPLOT DISTRIBUSI HARGA PER KUALITAS POTONGAN",
    subtitle = "Perbandingan median, kuartil, dan outlier",
    x = "Kualitas Potongan",
    y = "Harga (USD)",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  scale_y_continuous(labels = dollar_format()) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    axis.text.x = element_text(angle = 0),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1),
    legend.position = "none"
  )

Selain itu, visualisasi Boxplot ini dapat memberikan ringkasan statistik lima angka (minimum, kuartil 1, median, kuartil 3, maksimum) serta mendeteksi outlier. Pada boxplot berdasarkan kualitas potongan, terlihat pola menarik dimana potongan Premium memiliki median harga tertinggi sementara potongan Ideal justru memiliki median terendah. Fenomena ini menunjukkan fenomena dalam industri berlian, di mana label “Premium” mungkin dipasarkan sebagai produk dengan nilai lebih tinggi meskipun kualitas potongannya di bawah Ideal.


Visualisasi Violin Plot

ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
  geom_violin(alpha = 0.7, trim = TRUE, draw_quantiles = c(0.25, 0.5, 0.75)) +
  labs(
    title = "VIOLIN PLOT DISTRIBUSI HARGA PER KUALITAS POTONGAN",
    subtitle = "Bentuk violin menunjukkan kepadatan data dengan garis kuartil",
    x = "Kualitas Potongan",
    y = "Harga (USD)",
    caption = "Sumber: Dataset diamonds | ggplot2"
  ) +
  scale_y_continuous(labels = dollar_format()) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 18, hjust = 0.5, color = "#2c3e50"),
    plot.subtitle = element_text(size = 12, hjust = 0.5, color = "#7f8c8d", margin = margin(b = 15)),
    axis.title = element_text(face = "bold", size = 12),
    axis.text = element_text(size = 11),
    axis.text.x = element_text(angle = 0),
    panel.grid.major = element_line(color = "#ecf0f1", linewidth = 0.5),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(color = "#95a5a6", size = 10, hjust = 1),
    legend.position = "none"
  )

Violin plot ini menggabungkan kelebihan boxplot dan density plot, memberikan informasi lebih detail tentang distribusi data. Pada violin plot berdasarkan kualitas potongan, terlihat bahwa potongan Ideal memiliki bentuk yang gemuk di bagian bawah (harga rendah), menunjukkan data di rentang harga rendah lebih mendominasi. Sebaliknya, potongan Fair memiliki bentuk lebih ramping di bagian bawah dan lebih lebar di tengah, mengindikasikan distribusi yang berbeda dengan lebih banyak data di rentang harga menengah.


Kesimpulan

Berdasarkan analisis visualisasi data kontinu pada dataset diamonds menggunakan histogram, density plot, boxplot, dan violin plot, diperoleh beberapa kesimpulan penting. Pertama, distribusi harga dan berat berlian tidak mengikuti distribusi normal, melainkan condong ke kanan dengan didominasi data pada nilai rendah hingga menengah. Hal ini menunjukkan bahwa pasar didominasi oleh berlian dengan spesifikasi standar, sementara produk premium relatif langka.

Kedua, terdapat pola tertentu pada distribusi berat dengan puncak-puncak pada ukuran sekitar 0.3, 0.5, 0.7, dan 1.0 carat, yang mencerminkan ukuran-ukuran populer di pasar. Ketiga, ditemukan fenomena harga di mana potongan “Premium” memiliki harga rata-rata tertinggi sementara potongan “Ideal” justru terendah, menunjukkan bahwa label kualitas tidak selalu meningkat seiring dengan harga berlian di pasar.

Visualisasi data kontinu terbukti efektif dalam mengungkap pola-pola tersembunyi dalam dataset diamonds yang tidak akan terlihat jika hanya mengandalkan statistik deskriptif saja. Informasi ini dapat menjadi dasar pengambilan keputusan yang lebih baik dalam industri berlian, baik dari sisi produsen, penjual, maupun konsumen.