Data

Aplikasi jejak karbon EcoTrack mencatat menit penggunaan harian dari 15 pengguna aktif dalam satu minggu.

menit <- c(22, 25, 19, 30, 24, 21, 45, 23, 20, 26, 24, 22, 18, 27, 23)
n <- length(menit)
sort(menit)
##  [1] 18 19 20 21 22 22 23 23 24 24 25 26 27 30 45

Poin 1: Mean, Median, dan Modus

mean(menit)
## [1] 24.6
median(menit)
## [1] 23
modus <- function(x) {
  u <- unique(x)
  u[which.max(tabulate(match(x, u)))]
}
modus(menit)
## [1] 22
# Cek semua nilai yang sama
table(menit)
## menit
## 18 19 20 21 22 23 24 25 26 27 30 45 
##  1  1  1  1  2  2  2  1  1  1  1  1
freq <- as.data.frame(table(menit))
freq$menit <- as.numeric(as.character(freq$menit))
freq$Keterangan <- ifelse(freq$Freq == max(freq$Freq), "Modus", "Lainnya")

ggplot(freq, aes(x = menit, y = Freq, fill = Keterangan)) +
  geom_col(width = 0.8) +
  geom_vline(xintercept = mean(menit), color = "#E63946", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = median(menit), color = "#2A9D8F", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean(menit) + 0.4, y = 2.4, label = "Mean = 24,6",
           color = "#E63946", hjust = 0, fontface = "bold") +
  annotate("text", x = median(menit) - 0.4, y = 2.4, label = "Median = 23",
           color = "#2A9D8F", hjust = 1, fontface = "bold") +
  scale_fill_manual(values = c("Modus" = "#F4A261", "Lainnya" = "#A8DADC")) +
  scale_y_continuous(breaks = 0:2, limits = c(0, 2.6)) +
  labs(title = "Frekuensi Menit Penggunaan Harian EcoTrack",
       subtitle = "Batang oranye adalah nilai yang paling sering muncul",
       x = "Menit Penggunaan", y = "Frekuensi", fill = NULL) +
  tema

Interpretasi: Menurut saya, median (23 menit) lebih mewakili pusat data dibanding mean (24,6 menit), karena mean tertarik ke atas oleh satu pengguna yang mencapai 45 menit. Fungsi modus() hanya menampilkan 22, padahal dari tabel frekuensi terlihat 22, 23, dan 24 sama-sama muncul dua kali, jadi data ini sebenarnya memiliki tiga modus.


Poin 2: Q1, Q3, dan IQR

quantile(menit, probs = c(0.25, 0.75), type = 6)
## 25% 75% 
##  21  26
IQR(menit, type = 6)
## [1] 5
q <- quantile(menit, probs = c(0.25, 0.5, 0.75), type = 6)
batas_atas <- q[3] + 1.5 * IQR(menit, type = 6)

set.seed(1)
df2 <- data.frame(menit = menit, y = runif(n, -0.2, 0.2))
df2$Status <- ifelse(df2$menit > batas_atas, "Outlier", "Normal")

ggplot(df2, aes(x = menit, y = y)) +
  annotate("rect", xmin = q[1], xmax = q[3], ymin = -0.45, ymax = 0.45,
           fill = "#A8DADC", alpha = 0.5) +
  geom_vline(xintercept = q, color = c("#457B9D", "#1D3557", "#457B9D"), linewidth = 1) +
  geom_point(aes(color = Status), size = 4, alpha = 0.85) +
  annotate("text", x = q[1], y = 0.55, label = "Q1 = 21", fontface = "bold", color = "#457B9D") +
  annotate("text", x = q[3], y = 0.55, label = "Q3 = 26", fontface = "bold", color = "#457B9D") +
  scale_color_manual(values = c("Normal" = "#1D3557", "Outlier" = "#E63946")) +
  scale_y_continuous(limits = c(-0.6, 0.7)) +
  labs(title = "Sebaran Pengguna dan Rentang Antar Kuartil (IQR)",
       subtitle = "Area biru muda adalah 50% data di tengah",
       x = "Menit Penggunaan", y = NULL, color = NULL) +
  tema +
  theme(axis.text.y = element_blank(), panel.grid.major.y = element_blank())

Interpretasi: Menurut saya, IQR sebesar 5 menit menunjukkan bahwa separuh pengguna EcoTrack di tengah distribusi memakai aplikasi dalam rentang yang sempit, yaitu 21 sampai 26 menit. Artinya pola penggunaan mayoritas pengguna cukup seragam. Pengguna dengan 45 menit berada jauh di luar rentang itu dan terlihat sebagai titik merah di grafik.


Poin 3: Varians dan Standar Deviasi

var(menit)
## [1] 41.54286
sd(menit)
## [1] 6.445375
df3 <- data.frame(
  Pengguna = factor(1:n),
  Kuadrat = (menit - mean(menit))^2
)
df3$Keterangan <- ifelse(df3$Kuadrat == max(df3$Kuadrat), "Kontribusi terbesar", "Lainnya")

ggplot(df3, aes(x = Pengguna, y = Kuadrat, fill = Keterangan)) +
  geom_col(width = 0.75) +
  geom_text(aes(label = round(Kuadrat, 1)), vjust = -0.5, size = 3.3) +
  scale_fill_manual(values = c("Kontribusi terbesar" = "#E63946", "Lainnya" = "#A8DADC")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Kontribusi Tiap Pengguna terhadap Varians",
       subtitle = "Nilai (xi - mean)^2 untuk setiap pengguna",
       x = "Pengguna ke-", y = "(xi - mean)^2", fill = NULL) +
  tema

Interpretasi: Menurut saya, data ini memiliki variasi yang cukup tinggi karena standar deviasinya sebesar 6,45 menit. Sebagian besar data berada di sekitar 18-30 menit, tetapi ada satu pengguna yang mencapai 45 menit sehingga penyebaran data menjadi lebih besar. Grafik di atas memperlihatkan pengguna ke-7 menyumbang sekitar 416 dari total sekitar 582 jumlah kuadrat selisih, jadi hampir semua variasi berasal dari satu orang itu.


Poin 4: Skewness Pearson

sk_pearson <- 3 * (mean(menit) - median(menit)) / sd(menit)
sk_pearson
## [1] 0.7447201
# Verifikasi dengan fungsi skewness() dari package moments
skewness(menit)
## [1] 2.212573
kurtosis(menit)
## [1] 7.879086
ggplot(data.frame(menit), aes(x = menit)) +
  geom_histogram(aes(y = after_stat(density)), binwidth = 3,
                 fill = "#A8DADC", color = "white", boundary = 15) +
  geom_density(color = "#1D3557", linewidth = 1.2) +
  stat_function(fun = dnorm, args = list(mean = mean(menit), sd = sd(menit)),
                color = "grey40", linetype = "dotted", linewidth = 1) +
  geom_vline(xintercept = mean(menit), color = "#E63946", linetype = "dashed", linewidth = 1) +
  geom_vline(xintercept = median(menit), color = "#2A9D8F", linetype = "dashed", linewidth = 1) +
  annotate("text", x = mean(menit) + 0.5, y = 0.115, label = "Mean", color = "#E63946",
           hjust = 0, fontface = "bold") +
  annotate("text", x = median(menit) - 0.5, y = 0.115, label = "Median", color = "#2A9D8F",
           hjust = 1, fontface = "bold") +
  labs(title = "Bentuk Distribusi Menit Penggunaan EcoTrack",
       subtitle = "Garis biru tua: kurva densitas data | Garis titik abu-abu: kurva normal pembanding",
       x = "Menit Penggunaan", y = "Densitas") +
  tema

Interpretasi: Menurut saya, distribusi data ini menceng ke kanan karena koefisien skewness Pearson bernilai positif, yaitu sekitar 0,74. Hal ini terlihat di grafik, di mana ekor kurva memanjang ke kanan akibat pengguna dengan 45 menit, dan garis mean berada di sebelah kanan garis median. Nilai skewness dari skewness() (sekitar 2,21) berbeda dari koefisien Pearson karena rumusnya berbeda (berbasis momen ke-3), tetapi arahnya sama-sama positif.


Ringkasan Hasil

ringkasan <- data.frame(
  Ukuran = c("Mean", "Median", "Modus", "Q1", "Q3", "IQR", "Varians", "Standar Deviasi", "Skewness Pearson"),
  Nilai = c(mean(menit), median(menit), "22, 23, 24",
            quantile(menit, 0.25, type = 6), quantile(menit, 0.75, type = 6),
            IQR(menit, type = 6), var(menit), sd(menit), sk_pearson)
)
ringkasan$Nilai <- ifelse(suppressWarnings(!is.na(as.numeric(ringkasan$Nilai))),
                          round(suppressWarnings(as.numeric(ringkasan$Nilai)), 2),
                          ringkasan$Nilai)
kable(ringkasan, row.names = FALSE)
Ukuran Nilai
Mean 24.6
Median 23
Modus 22, 23, 24
Q1 21
Q3 26
IQR 5
Varians 41.54
Standar Deviasi 6.45
Skewness Pearson 0.74