VISUALISASI MENGGUNAKAN DATASET DIAMONDS

ADELA MAHIDA PUTRI

18 FEBRUARI 2026


TUJUAN

Dataset diamonds merupakan data yang berisi informasi mengenai karakteristik berlian dan harga jualnya. Dataset ini terdiri dari 53.940 observasi dan 10 variabel, dimana setiap baris merepresentasikan satu berlian. Dataset ini sering digunakan untuk eksplorasi dan visualisasi data karena memuat berbagai aspek kualitas berlian yang dapat dianalisis secara deskriptif.

Dalam industri berlian, carat (ukuran) dan price (harga) merupakan dua aspek penting yang sering menjadi perhatian utama. Pada variabel carat, analisis ini bertujuan untuk mengetahui pola distribusi ukuran berlian, kecenderungan nilai pusat, tingkat variasi data, serta potensi adanya pencilan (outlier). Melalui analisis ini, dapat diperoleh gambaran umum mengenai ukuran berlian yang paling dominan dalam dataset.

Sementara itu, pada variabel price, analisis dilakukan untuk menggambarkan distribusi harga berlian, nilai pusat data (mean dan median), tingkat penyebaran, serta kemungkinan adanya pencilan. Dengan demikian, analisis ini diharapkan mampu memberikan pemahaman yang lebih jelas mengenai karakteristik harga berlian dalam dataset.


PANGGIL DATA

library (ggplot2)
library(tidyverse)
library(dplyr)
library(scales)
str(diamonds)
## tibble [53,940 × 10] (S3: tbl_df/tbl/data.frame)
##  $ carat  : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
##  $ depth  : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
##  $ table  : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
##  $ price  : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
##  $ x      : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
##  $ y      : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
##  $ z      : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...


VISUALISASI 1: HISTOGRAM

HISTOGRAM CARAT DENGAN DENSITY DAN MEAN


Perhitungan Interval Kelas, Frekuensi, Kepadatan (Density), dan Rata-rata (Mean) pada Variabel Carat

gg <- ggplot(diamonds, aes(x = carat)) +
  geom_histogram(aes(y = ..density..), bins = 30)
hist_data <- ggplot_build(gg)$data[[1]]
hist_table <- hist_data %>%
  select(
    xmin,
    xmax,
    count,
    density
  )
hist_table
##         xmin      xmax count      density
## 1  0.1170690 0.2829310  1469 0.1641964545
## 2  0.2829310 0.4487931 15710 1.7559743366
## 3  0.4487931 0.6146552  7473 0.8352893837
## 4  0.6146552 0.7805172  6320 0.7064136096
## 5  0.7805172 0.9463793  3627 0.4054054054
## 6  0.9463793 1.1122414  8157 0.9117430085
## 7  1.1122414 1.2781034  3784 0.4229539713
## 8  1.2781034 1.4439655  1093 0.1221693157
## 9  1.4439655 1.6098276  3059 0.3419176000
## 10 1.6098276 1.7756897   926 0.1035030067
## 11 1.7756897 1.9415517   149 0.0166543715
## 12 1.9415517 2.1074138  1424 0.1591666108
## 13 2.1074138 2.2732759   411 0.0459392395
## 14 2.2732759 2.4391379   169 0.0188898576
## 15 2.4391379 2.6050000   102 0.0114009791
## 16 2.6050000 2.7708621    25 0.0027943576
## 17 2.7708621 2.9367241     2 0.0002235486
## 18 2.9367241 3.1025862    26 0.0029061319
## 19 3.1025862 3.2684483     3 0.0003353229
## 20 3.2684483 3.4343103     1 0.0001117743
## 21 3.4343103 3.6001724     2 0.0002235486
## 22 3.6001724 3.7660345     2 0.0002235486
## 23 3.7660345 3.9318966     0 0.0000000000
## 24 3.9318966 4.0977586     3 0.0003353229
## 25 4.0977586 4.2636207     1 0.0001117743
## 26 4.2636207 4.4294828     0 0.0000000000
## 27 4.4294828 4.5953448     1 0.0001117743
## 28 4.5953448 4.7612069     0 0.0000000000
## 29 4.7612069 4.9270690     0 0.0000000000
## 30 4.9270690 5.0929310     1 0.0001117743
mean(diamonds$carat, na.rm = TRUE)
## [1] 0.7979397

Visualisasi

ggplot(diamonds, aes(x = carat)) +
  geom_histogram(aes(y = ..density..),
                 bins = 30,
                 fill = "pink",
                 color = "black",
                 alpha = 0.6) +
  geom_vline(aes(xintercept = mean(carat)),
             color = "black",
             linetype = "dashed",
             size = 1) +
  
  scale_x_continuous(
    breaks = seq(0, 6, by = 0.2)
  ) +
  scale_y_continuous(
    breaks = seq(0, 2.5, by = 0.2)
  ) +
  coord_cartesian(xlim = c(0, 5.5), ylim = c(0, 2.0)) +
  
  labs(
    title = "Histogram Carat dengan Density dan Mean",
    caption = "Sumber: Dataset Diamonds",
    x = "Carat",
    y = "Density"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      hjust = 0.5,         
      face = "bold",        
      size = 16,            
      margin = margin(b = 15)  
    ),
    plot.caption = element_text(
      hjust = 1,
      size = 9,            
      margin = margin(t = 10)
    ),
    axis.title.x = element_text(
      margin = margin(t = 12),
      size = 12
    ),
    axis.title.y = element_text(
      margin = margin(r = 12),
      size = 12
    )
  )

Visualisasi ini menunjukkan distribusi berat berlian (carat) dalam dataset diamonds. Sumbu X merepresentasikan berat berlian dalam satuan karat, sedangkan sumbu Y menunjukkan density atau tingkat kepadatan distribusi berat dalam setiap kelompok interval.

Berdasarkan histogram, mayoritas berlian memiliki berat di bawah 1 carat. Hal ini ditunjukkan oleh tingginya batang histogram pada rentang tersebut, yang berarti jumlah berlian berukuran kecil jauh lebih banyak dibandingkan berlian berukuran besar.

Seiring meningkatnya nilai carat, frekuensi berlian cenderung menurun. Berlian dengan berat di atas 2 atau 3 carat jumlahnya jauh lebih sedikit. Pola ini menunjukkan bahwa distribusi carat bersifat miring ke kanan (right-skewed), dimana sebagian besar data terkonsentrasi pada nilai kecil, sementara terdapat sedikit berlian dengan berat sangat besar yang membentuk ekor di sisi kanan grafik.

Garis putus-putus pada histogram menunjukkan nilai rata-rata (mean) berat berlian. Posisi mean yang sedikit bergeser ke kanan dari puncak distribusi mengindikasikan bahwa adanya beberapa berlian berukuran besar memengaruhi nilai rata-rata sehingga menjadi lebih tinggi.

Secara keseluruhan, visualisasi ini memperlihatkan bahwa dalam dataset diamonds, berlian dengan ukuran kecil hingga menengah lebih mendominasi dibandingkan berlian berukuran besar. Pola distribusi ini mencerminkan bahwa berlian berukuran besar relatif lebih jarang ditemukan, sehingga sebagian besar observasi terkonsentrasi pada berat yang lebih rendah.


VISUALISASI 2: DENSITY PLOT

DENSITY PLOT PRICE DENGAN MEAN


Perhitungan Interval Kelas, Frekuensi, Kepadatan (Density), dan Rata-rata (Mean) pada Variabel Price

breaks_price <- seq(0, 20000, by = 2000)
h <- hist(diamonds$price,
          breaks = breaks_price,
          plot = FALSE)
n <- length(diamonds$price)
class_width <- diff(h$breaks)[1]
hist_table <- data.frame(
  interval = paste0(h$breaks[-length(h$breaks)],
                    " - ",
                    h$breaks[-1]),
  frequency = h$counts,
  density = h$counts / (n * class_width)
)
hist_table
##         interval frequency      density
## 1       0 - 2000     24207 2.243882e-04
## 2    2000 - 4000     10354 9.597701e-05
## 3    4000 - 6000      7828 7.256211e-05
## 4    6000 - 8000      3946 3.657768e-05
## 5   8000 - 10000      2383 2.208936e-05
## 6  10000 - 12000      1759 1.630515e-05
## 7  12000 - 14000      1304 1.208750e-05
## 8  14000 - 16000      1017 9.427141e-06
## 9  16000 - 18000       830 7.693734e-06
## 10 18000 - 20000       312 2.892102e-06
mean(diamonds$price, na.rm = TRUE)
## [1] 3932.8

Visualisasi

ggplot(diamonds, aes(x = price)) +
  geom_density(
    fill = "#A8D8EA",
    color = "black",
    alpha = 0.6,
    size = 1
  ) +
  geom_vline(
    xintercept = mean(diamonds$price),
    color = "black",
    linetype = "dashed",
    size = 1
  ) +
  
  scale_x_continuous(
    breaks = seq(0, 20000, by = 2000)
  ) +
  scale_y_continuous(
    labels = label_scientific()
  ) +
  coord_cartesian(
    xlim = c(0, 20000)
  ) +
  
  labs(
    title = "Density Plot Price dengan Mean",
    caption = "Sumber: Dataset Diamonds",
    x = "Price",
    y = "Density"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      hjust = 0.5,         
      face = "bold",     
      size = 16,           
      margin = margin(b = 15)
    ),
    plot.caption = element_text(
      hjust = 1,
      size = 9,             
      margin = margin(t = 10)
    ),
    axis.title.x = element_text(
      margin = margin(t = 12),
      size = 12
    ),
    axis.title.y = element_text(
      margin = margin(r = 12),
      size = 12
    )
  )

Visualisasi ini menunjukkan distribusi harga berlian (price) dalam dataset diamonds. Sumbu X merepresentasikan harga berlian, sedangkan sumbu Y menunjukkan density atau kepadatan probabilitas.

Dari grafik terlihat bahwa kurva memiliki puncak tertinggi pada kisaran harga rendah, sekitar 500 hingga 2.000. Hal ini menunjukkan bahwa sebagian besar berlian dalam dataset memiliki harga relatif rendah hingga menengah.

Seiring meningkatnya harga, kurva semakin menurun dan membentuk ekor panjang ke arah kanan. Pola ini menunjukkan bahwa distribusi harga bersifat miring ke kanan (positively skewed), artinya hanya sebagian kecil berlian yang memiliki harga sangat tinggi, namun nilainya cukup ekstrem sehingga memperpanjang ekor distribusi.

Garis vertikal putus-putus yang menunjukkan nilai rata-rata (mean) berada di sebelah kanan puncak kurva. Ini mengindikasikan bahwa rata-rata harga lebih tinggi dibandingkan nilai yang paling sering muncul (modus), karena dipengaruhi oleh beberapa berlian dengan harga sangat tinggi.


VISUALISASI 3: BOXPLOT

BOXPLOT CARAT DAN PRICE


Perhitungan Nilai Tengah (Median) pada Variabel Carat

median(diamonds$carat, na.rm = TRUE)
## [1] 0.7

Visualisasi

ggplot(diamonds, aes(y = carat)) +
  geom_boxplot(
    fill = "pink",
    color = "black",
    alpha = 0.7
  ) +

  scale_y_continuous(
    breaks = seq(0, 6, by = 0.5)
  ) +
  coord_cartesian(
    ylim = c(0, 6)
  ) +
  
  labs(
    title = "Boxplot Carat",
    caption = "Sumber: Dataset Diamonds",
    y = "Carat"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      hjust = 0.5,
      face = "bold",
      size = 16,
      margin = margin(b = 15)
    ),
    plot.caption = element_text(
      hjust = 1,
      size = 9,
      margin = margin(t = 10)
    ),
    axis.title.y = element_text(
      margin = margin(r = 12),
      size = 12
    ),
    axis.title.x = element_blank()
  )

Visualisasi boxplot ini menunjukkan distribusi berat berlian (carat) dalam dataset diamonds. Garis di tengah kotak menunjukkan nilai tengah (median) pada carat. Terlihat bahwa median berada di kisaran 0.7 carat, yang berarti setengah dari berlian dalam dataset memiliki berat di bawah nilai tersebut dan setengah lainnya di atasnya.

Box merepresentasikan 50% data tengah (IQR). Dari grafik terlihat bahwa sebagian besar berlian berada pada kisaran sekitar 0,4 hingga 1,0 carat. Ini menunjukkan bahwa berlian dengan ukuran kecil hingga sedang lebih dominan dalam dataset.

Bagian ekor menunjukkan rentang data utama dan titik-titik di atasnya merupakan outlier. Boxplot menunjukkan adanya sejumlah outlier pada rentang carat yang tinggi, khususnya di atas 2 hingga sekitar 5 carat. Ini menunjukkan bahwa berlian berukuran besar memang ada, tetapi jumlahnya relatif sedikit dibandingkan berlian berukuran kecil dan menengah.

Secara keseluruhan, distribusi carat cenderung miring ke kanan (positively skewed), karena terdapat banyak nilai ekstrem di sisi kanan. Artinya, sebagian besar berlian memiliki berat kecil, sementara berlian dengan berat besar jumlahnya jauh lebih sedikit.


Perhitungan Nilai Tengah (Median) pada Variabel Price

median(diamonds$price, na.rm = TRUE)
## [1] 2401

Visualisasi

ggplot(diamonds, aes(y = price)) +
  geom_boxplot(
    fill = "lightblue",
    color = "black",
    alpha = 0.7
  ) +
  
  scale_y_continuous(
    breaks = seq(0, 20000, by = 2000)
  ) +
  coord_cartesian(
    ylim = c(0, 20000)
  ) +
  
  labs(
    title = "Boxplot Price",
    caption = "Sumber: Dataset Diamonds ",
    y = "Price"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(
      hjust = 0.5,       
      face = "bold",     
      size = 16,        
      margin = margin(b = 15)
    ),
    plot.caption = element_text(
      hjust = 1,
      size = 9,       
      margin = margin(t = 10)
    ),
    axis.title.y = element_text(
      margin = margin(r = 12),
      size = 12
    ),
    axis.title.x = element_blank()
  )

Visualisasi boxplot ini menunjukkan distribusi harga (price) berlian dalam dataset. Garis tebal di tengah kotak menunjukkan median harga, yang berada di kisaran sekitar 2.400–2.500 USD. Artinya, setengah dari berlian dalam dataset memiliki harga di bawah nilai tersebut dan setengah lainnya di atasnya.

Box merepresentasikan 50% data tengah (IQR). Dari grafik terlihat bahwa sebagian besar harga berlian berada pada kisaran sekitar 1.000 hingga 5.000 USD. Ini menunjukkan bahwa mayoritas berlian dalam dataset memiliki harga menengah, bukan harga yang sangat murah maupun sangat mahal.

Bagian garis memanjang ke atas (whisker) dan titik-titik di atasnya menunjukkan adanya outlier, yaitu berlian dengan harga yang jauh lebih tinggi dibandingkan mayoritas data. Terlihat cukup banyak outlier di atas 12.000 USD, bahkan mendekati 20.000 USD. Ini berarti memang ada berlian yang sangat mahal, tetapi jumlahnya relatif sedikit.

Secara keseluruhan, distribusi harga tampak miring ke kanan (positively skewed). Artinya, sebagian besar berlian memiliki harga relatif lebih rendah hingga menengah, sementara hanya sebagian kecil yang memiliki harga sangat tinggi sehingga menarik rata-rata ke arah kanan.


KESIMPULAN

Secara umum, hasil eksplorasi univariat pada variabel carat dan price dalam dataset diamonds menunjukkan bahwa kedua variabel tidak berdistribusi normal dan sama-sama menceng ke kanan (right-skewed), dengan tingkat kemencengan yang lebih kuat pada variabel price. Sebagian besar berlian memiliki berat di bawah 1 carat dan harga pada rentang rendah hingga menengah, sementara hanya sebagian kecil observasi yang memiliki ukuran dan harga sangat tinggi. Keberadaan nilai-nilai ekstrem ini tampak sebagai outlier pada boxplot, terutama pada harga di atas kisaran tinggi, dan berkontribusi terhadap meningkatnya nilai rata-rata dibandingkan median. Meskipun outlier tersebut masih masuk akal secara konteks industri (berlian besar dan mahal memang ada, hanya jarang), namun secara statistik hal ini menyebabkan variabilitas yang tinggi dan potensi pelanggaran asumsi normalitas serta homogenitas varians apabila data digunakan langsung dalam analisis parametrik. Oleh karena itu, transformasi log atau metode estimasi yang tahan terhadap outlier sangat direkomendasikan agar model analisis yang dibangun menjadi lebih stabil, akurat, dan tidak bias terhadap nilai ekstrem.