Midterm Exam

Statistik

Nama Kelompok


Video Presentasi

Video Presentasi Analisis



🔗 Link Video YouTube: TUGAS UTS ESTATISTIKA KELOMPOK 1

1 Pendahuluan

Pada analisis ini, digunakan sebuah dataset penjualan yang berisi informasi terkait karakteristik region, product category, sales channel, adbudget, price, store size, experince, customer satisfaction, dan sales. Dataset tersebut mencakup beberapa variabel numerik dan kategorik yang akan dianalisis untuk memahami pola dan kecenderungan penjualan.

  • Variabel numerik yang menjadi fokus analisis meliputi:

  • AdBudget — anggaran iklan

  • Sales — penjualan

  • StoreSize — ukuran toko

  • Experience — penilaian kepuasan pelanggan terhadap layanan atau produk

Selain itu, terdapat informasi kategorikal yang juga dianalisis untuk melihat proporsi dan distribusi kelompok pelanggan, yaitu:

  • Region — wilayah

  • ProductCategory — kategori produk yang paling sering dibeli

  • SalesChannel - saluran penjualan

Melalui analisis statistik deskriptif dan visualisasi data seperti histogram, boxplot, violin plot, scatter plot, density plot, bar chart, studi ini bertujuan memberikan gambaran menyeluruh mengenai kinerja bisnis serta membantu untuk membuat keputusan strategi bsinis.

Link Video: TGQpH2glpZM


1.1 Persiapan data

library(DT)                    # Untuk membuat tabel interaktif
library(ggplot2)               # Untuk visualisasi grafik
library(dplyr)                 # Untuk manipulasi data



# Load data
dataset <- read.csv("https://raw.githubusercontent.com/Raihaniaputri/Sales_DataSet/647d0b6cefa1347d3248393c314b8c75bad45eff/Midterm_Exam.csv")
View(dataset)


# Mengahapus kolom x yang tidak perlu
if ("X" %in% colnames(dataset)) dataset <- dataset %>% select(-X)
  
# Tabel Utama; preview data 10 baris
DT::datatable(
  dataset,
  caption = "Main Data: Sales dataset",
  rownames = TRUE,
  options = list(pageLength = 10)
)

2 Visualisasi

2.1 BoxPlot

library(dplyr)
library(ggplot2)
library(DT)
library(knitr)
library(patchwork)
library(tidyr)

# Load dataset
data <- read.csv("https://raw.githubusercontent.com/Raihaniaputri/Sales_DataSet/647d0b6cefa1347d3248393c314b8c75bad45eff/Midterm_Exam.csv")

if ("X" %in% colnames(data)) {
  data <- data %>% select(-X)
}


# HITUNG SUMMARY_STATS
summary_stats <- dataset %>%
  group_by(SalesChannel) %>%
  summarise(
    Min = min(Sales, na.rm = TRUE),
    Q1 = quantile(Sales, 0.25, na.rm = TRUE),
    Median = median(Sales, na.rm = TRUE),
    Mean = mean(Sales, na.rm = TRUE),
    Q3 = quantile(Sales, 0.75, na.rm = TRUE),
    Max = max(Sales, na.rm = TRUE)
  )

# Buat Boxplot
p <- ggplot(dataset, aes(x = SalesChannel, y = Sales, fill = SalesChannel)) +
  geom_boxplot(alpha = 0.6, color = "black", width = 0.5) +
  stat_summary(fun = mean, geom = "point", shape = 18, size = 3, color = "black") +
  labs(
    title = "Total Sales by SalesChannel",
    x = "Sales Channel",
    y = "Sales"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "none"
  )

# Tambahkan label statistik di samping boxplot
p + geom_text(
  data = summary_stats,
  aes(
    x = SalesChannel, y = Q3,
    label = paste("Q3:", round(Q3))
  ),
  hjust = -0.1, vjust = -0.3, size = 3.5
) +
  geom_text(
    data = summary_stats,
    aes(x = SalesChannel, y = Median,
        label = paste("Median:", round(Median))),
    hjust = -0.1, vjust = -0.3, size = 3.5
  ) +
  geom_text(
    data = summary_stats,
    aes(x = SalesChannel, y = Mean,
        label = paste("Mean:", round(Mean))),
    hjust = -0.1, vjust = 1.5, size = 3.5
  ) +
  geom_text(
    data = summary_stats,
    aes(x = SalesChannel, y = Q1,
        label = paste("Q1:", round(Q1))),
    hjust = -0.1, vjust = 1.2, size = 3.5
  ) +
  geom_text(
    data = summary_stats,
    aes(x = SalesChannel, y = Min,
        label = paste("Min:", round(Min))),
    hjust = -0.1, vjust = 1.5, size = 3.5
  ) +
  geom_text(
    data = summary_stats,
    aes(x = SalesChannel, y = Max,
        label = paste("Max:", round(Max))),
    hjust = -0.1, vjust = -0.8, size = 3.5
  ) +
  coord_cartesian(clip = "off")  # supaya label di luar area tetap tampil


2.1.0.1 Interpretasi

kinerja penjualan antara saluran offline dan onlien sangat sebanding, baik dari sisi rata-rata maupun sebaran. ini menunjukkan bahwa kedua saluran memiliki potensi yang setara dalam menghasilkan penjualan.


2.2 Scatter Plot

# Scatter Plot Kategori Sales berdasarkan StoreSize & Experience
data$Sales_Category <- cut(data$Sales, 
                          breaks = quantile(data$Sales), 
                          labels = c("Rendah", "Sedang", "Tinggi", "Tinggi Sekali"))

# Cari titik dengan sales tinggi, rendah, dan sedang
titik_tinggi <- data %>% 
  filter(Sales_Category %in% c("Tinggi", "Tinggi Sekali")) %>%
  arrange(desc(Experience), desc(StoreSize)) %>%
  slice(1)

lowest_sales <- data[which.min(data$Sales), ]
median_sales <- data[which.min(abs(data$Sales - median(data$Sales))), ]

ggplot(data, aes(x = StoreSize, y = Experience)) +
  geom_point(aes(color = Sales_Category, size = Sales), alpha = 0.7) +
  scale_color_manual(values = c("#D6EAF8", "#5499C7", "#2471A3", "#1B4F72")) +
  scale_size_continuous(range = c(2, 8)) +

# Annotasi titik tinggi
geom_point(data = titik_tinggi, color = "red", size = 5, shape = 1, stroke = 2) +
geom_text(data = titik_tinggi,
          aes(label = paste("Tinggi\nSales:", Sales, "\nExperience:", Experience, "\nSize:", StoreSize)),
          vjust = 1.2, hjust = 0.5, size = 3, fontface = "bold") +

  # Annotasi titik terendah
  geom_point(data = lowest_sales, color = "blue", size = 5, shape = 1, stroke = 2) +
  geom_text(data = lowest_sales, 
            aes(label = paste("Terendah\nSales:", Sales, "\nExperience:", Experience, "\nSize:", StoreSize)),
            vjust = 1.2, size = 3, fontface = "bold") +

  # Annotasi titik median
  geom_point(data = median_sales, color = "green", size = 5, shape = 1, stroke = 2) +
  geom_text(data = median_sales, 
            aes(label = paste("Sedang\nSales:", Sales, "\nExperience:", Experience, "\nSize:", StoreSize)),
            vjust = -0.5, hjust = 1.1, size = 3, fontface = "bold") +
  
  labs(title = "Kategori Sales berdasarkan StoreSize & Experience",
       x = "Store Size", y = "Experience",
       color = "Kategori Sales", size = "Sales")


2.2.1 Interpretasi

berdasarkan visualisasi tersebut, hubungan antara Store Size dan Experience memiliki hubunngan yang positif. semakin besar ukuran toko dan semakin tinggi pengalaman, maka akan menghasilkan penjualan yang lebih tinggi


2.3 Bar Chart

2.3.1 Rata-rata Sales per Region dan ProductCategory

library(ggplot2)
library(dplyr)

# Load dataset
dataset <- read.csv("https://raw.githubusercontent.com/Raihaniaputri/Sales_DataSet/647d0b6cefa1347d3248393c314b8c75bad45eff/Midterm_Exam.csv")

# Hitung rata-rata sales per kategori produk
category_sales <- dataset %>%
  group_by(ProductCategory) %>%
  summarise(AverageSales = mean(Sales, na.rm = TRUE))

# --- Visualization ---
ggplot(category_sales, aes(x = ProductCategory, y = AverageSales, fill = ProductCategory)) +
  geom_col(alpha = 0.8, color = "gray30", width = 0.7) +
  # Tambah nilai di atas bar
  geom_text(
    aes(label = round(AverageSales, 1)),
    vjust = -0.5, size = 4, fontface = "bold"
  ) +
  labs(
    title = "Average Sales by Product Category",
    subtitle = "Comparison of average sales performance across product categories",
    x = "Product Category",
    y = "Average Sales"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "none",
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  # Atur skala y agar ada ruang untuk teks
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)))


2.3.1.1 Interpretasi

Berdasarkan barchart average sales by product category, dapat dilihat perbandingan kinerja penjualan rata-rata untuk setiap kategori produk:

Electronics merupakan kategori dengan penjualan tertinggi sebesar 1526.9, menunjukkan bahwa produk elektronik memiliki performa terbaik. Diikuti oleh Clothing dengan rata-rata penjualan 1480.3 yang cukup mendekati Electronics.

Kategori Home berada di posisi tengah dengan penjualan 1443.9, sementara Beauty dan Sports memiliki penjualan yang lebih rendah masing-masing sebesar 1399.9 dan 1389.5.

Perbedaan angka ini mengindikasikan bahwa kategori Electronics dan Clothing merupakan produk unggulan dengan permintaan pasar yang tinggi, sedangkan kategori Beauty dan Sports mungkin memerlukan strategi pemasaran lebih agresif untuk meningkatkan penjualannya.


2.4 Histogram - Central Tendency

library(ggplot2)
library(dplyr)
library(patchwork)

# --- Sales Histogram ---
mean_sales <- mean(data$Sales)
median_sales <- median(data$Sales)
mode_sales <- as.numeric(names(sort(table(round(data$Sales, 0)), decreasing = TRUE)[1]))

# --- Sales Histogram ---
p_sales <- ggplot(data, aes(x = Sales)) +
  geom_histogram(aes(y = after_stat(density)), 
                 bins = 100, 
                 fill = "#5ab4ac", 
                 color = "white", 
                 alpha = 1) +
  geom_density(color = "#2b8cbe", linewidth = 1.3, alpha = 0.9) +
  geom_vline(aes(xintercept = mean_sales, color = "Mean"), linewidth = 1.2) +
  geom_vline(aes(xintercept = median_sales, color = "Median"), 
             linewidth = 1.2, linetype = "dashed") +
  geom_vline(aes(xintercept = mode_sales, color = "Mode"), 
             linewidth = 1.2, linetype = "dotdash") +
  scale_color_manual(values = c("Mean" = "red", "Median" = "blue", "Mode" = "green")) +
  labs(
    title = "Distribusi Sales dengan Central Tendency",
    subtitle = paste("Mean:", round(mean_sales,1), "| Median:", round(median_sales,1), "| Mode:", mode_sales),
    x = "Sales",
    y = "Density"
  ) +
  theme_minimal() +
  theme(legend.position = "none",
        plot.subtitle = element_text(size = 11, face = "bold"))

# --- AdBudget Histogram ---
mean_adbudget <- mean(data$AdBudget)
median_adbudget <- median(data$AdBudget)
mode_adbudget <- as.numeric(names(sort(table(round(data$AdBudget, 0)), decreasing = TRUE)[1]))

p_adbudget <- ggplot(data, aes(x = AdBudget)) +
  geom_histogram(aes(y = after_stat(density)), 
                 bins = 100, 
                 fill = "#d8b365", 
                 color = "white", 
                 alpha = 1) +
  geom_density(color = "#8c510a", linewidth = 1.3, alpha = 0.9) +
  geom_vline(aes(xintercept = mean_adbudget, color = "Mean"), linewidth = 1.2) +
  geom_vline(aes(xintercept = median_adbudget, color = "Median"), 
             linewidth = 1.2, linetype = "dashed") +
  geom_vline(aes(xintercept = mode_adbudget, color = "Mode"), 
             linewidth = 1.2, linetype = "dotdash") +
  scale_color_manual(values = c("Mean" = "red", "Median" = "blue", "Mode" = "green")) +
  labs(
    title = "Distribusi AdBudget dengan Central Tendency", 
    subtitle = paste("Mean:", round(mean_adbudget,1), "| Median:", round(median_adbudget,1), "| Mode:", mode_adbudget),
    x = "AdBudget",
    y = "Density"
  ) +
  theme_minimal() +
  theme(legend.position = "none",
        plot.subtitle = element_text(size = 11, face = "bold"))

# Combine plots
p_sales / p_adbudget


2.4.1 Penjelasan

Histogram adalah grafik distribusi frekuensi untuk data numerik yang dibagi ke dalam interval (bins). Tinggi batang menunjukkan banyaknya observasi pada setiap interval. Histogram digunakan untuk melihat pola distribusi data, seperti apakah data cenderung berbentuk simetris, miring (skewed), atau memiliki banyak puncak (multimodal).

Perhitungan statistik dasar ini menggunakan konsep:

  • Mean (Rata-rata): jumlah seluruh nilai dibagi banyaknya data

X ¯ = X i n

Dimana:

X ¯ : Mean (Rata-rata)

X i : Setiap nilai data

n : Jumlah Observasi

  • Median: nilai tengah setelah data diurutkan

Perhitungan Median (jika data ganjil) :

Median = x ( n 2 +1)

Perhitungan Median (jika data genap) :

Median = x ( n2 ) + x ( n+22 ) 2

  • Mode (modus): nilai yang paling sering muncul dalam dataset


2.4.2 Kesimpulan

Untuk data Sales, ketiga nilai (mean, median, modus) berdekatan, ini menunjukkan distribusi yang mendekati normal. kemudian, nilai mode yang lebih tinggi dari mean dan median menunjukkan adanya kecenderungan ke kiri (Left skewness) tetapi tidak terlalu signifikan. sedangkan data AdBudget, nilai mode lebih tinggi dibandikan mean dan median. ini menunjukkan disribusi condong ke kanan (right skeweness)


2.5 Density Plot - Measures of Dispersion

# Plot: All Regions in One Frame 
library(dplyr)
library(ggplot2)

# Load data
data <- read.csv("https://raw.githubusercontent.com/Raihaniaputri/Sales_DataSet/647d0b6cefa1347d3248393c314b8c75bad45eff/Midterm_Exam.csv")

# Hitung mean sales per region
region_summary <- data %>%
  group_by(Region) %>%
  summarise(Mean = mean(Sales, na.rm = TRUE))

# Gabungkan mean + density peak
density_peaks <- data %>%
  group_by(Region) %>%
  summarise(PeakY = max(density(Sales, na.rm = TRUE)$y))

label_data <- left_join(region_summary, density_peaks, by = "Region")

# Atur posisi y untuk setiap label agar tidak nabrak
label_data <- label_data %>%
  arrange(Mean) %>%
  mutate(
    LabelY = PeakY + 0.003 + (row_number() * 0.003)  # Beri jarak bertingkat
  )

ggplot(data, aes(x = Sales, fill = Region, color = Region)) +
  # Histogram density-normalized
  geom_histogram(aes(y = after_stat(density)), 
                 position = "identity", bins = 30, alpha = 0.35) +
  # Density curve
  geom_density(alpha = 0.3, linewidth = 1) +
  # Mean line
  geom_vline(data = region_summary, 
             aes(xintercept = Mean, color = Region),
             linetype = "dashed", linewidth = 1) +
  # Mean label dengan posisi yang tidak nabrak
  geom_text(
    data = label_data,
    aes(x = Mean, y = LabelY,
        label = paste0("Mean = ", formatC(Mean, digits = 2, format = "f")),
        color = Region),
    size = 3.5, fontface = "bold", show.legend = FALSE
  ) +
  labs(
    title = "Distribution of Sales Across All Regions",
    subtitle = "Comparison of sales distribution patterns for different regions",
    x = "Sales",
    y = "Density",
    fill = "Region",
    color = "Region"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "top",
    plot.title = element_text(face = "bold")
  )

## Hitung statistik dispersi untuk Sales per Region
region_dispersion <- data %>%
  group_by(Region) %>%
  summarise(
    Mean = mean(Sales, na.rm = TRUE),
    Min = min(Sales, na.rm = TRUE),
    Max = max(Sales, na.rm = TRUE),
    Range = Max - Min,
    Variance = var(Sales, na.rm = TRUE),
    SD = sd(Sales, na.rm = TRUE)
  )

## Tampilkan sebagai tabel interaktif
datatable(
  region_dispersion %>%
    mutate(across(where(is.numeric), round, 2)), # bulatkan angka
  options = list(
    dom = 'tip',
    paging = FALSE,
    ordering = FALSE
  ),
  rownames = FALSE,
  caption = "Measures of Dispersion - Sales per Region"
)

2.5.1 Interpretasi

Berdasarkan tabel summary statistic of Sales by Region, diperoleh nilai menggunakan rumus statistik;

1. Mean (Rata-rata):
X ¯ = X i n

Dimana:

X ¯ : Mean (Rata-rata)

X i : Setiap nilai data

n : Jumlah Observasi

2. Range (Rentang):
Range = Max - Min


3. Variance (Ragam):
σ 2 = i=1 n ( x i x ¯ ) 2 n



4. Standard Deviation (Simpangan Baku):
σ = σ 2

Berdasarkan grafik distribusi sales untuk semua region, Region Central memiliki rata-rata sales tertinggi sebesar 1522.93 dengan distribusi yang cukup simetris dan terkonsentrasi di sekitar nilai tersebut. Region East berada di posisi kedua dengan rata-rata 1448.00, menunjukkan distribusi yang agak miring ke kanan. Region South memiliki rata-rata 1408.47 dengan distribusi yang lebih melebar, sementara Region West memiliki rata-rata terendah sebesar 1357.60 dengan distribusi yang paling menyebar dan variasi sales terbesar.

Dari bentuk kurva density, Region Central (merah) memiliki puncak tertinggi yang menunjukkan konsistensi sales di sekitar rata-ratanya, sedangkan Region West (hijau) memiliki puncak terendah yang mengindikasikan variasi performance sales yang sangat beragam antar tokonya.


3 Kesimpulan


Berdasarkan visualisasi yang telah dibuat, dapat disimpulkan bahwa

  • SalesChannel (Boxplot) Median sales keduanya identik, yaitu 145 tetapi online memiliki sedikit rentang yang lebih lebar dan rentang interquartil yang hampir mirip, ini juga menandakan bahwa SalesChannel adalah variable yang paling konstan sehingga tidak menjadi faktor utama dalam variasi penjualan

  • StoreSize & Experience (ScatterPlot) Dari visual tersebut menunjukkan bahwa penjualan (sales) meningkat seiring dengan bertambahnya store size dan experience. semakin tinggi ukuran toko dan pengalaman, maka penjualan akan semakin tinggi. ini berarti hubungan antara StoreSize dan Experience itu positif terhadap sales.

  • Rata-rata Sales per Product category (Bar Chart) Jika dilihat dari grafik, electronics memiliki rata-rata penjualan tertinggi, sementara clothing terendah dan home serta sports identik. ini menandakan bahwa kategori produk mempengaruhi rata-rata sales meskipun tida seperti storeSize dan Experience.

  • Distribusi Sales dan Adbuget (Histogram) Grafik data Sales, menunjukan distribusi simetris karena mean ~ median, sedangkan grafik data AdBudget menunjukan distribusi yang sedikit condong kekanan karena mode jauh lebih tinggi dari mean dan modus. Variasi dari AdBUdget pun lebih besar dibandinngkan Sales

  • Distribusi Sales per Region (Density Plot) Disribusi penjualan berdasarkan wilaayh menunjukann bahwa wilayah East memiliki rata-rata penjualan tertinggi, kemudiaan North dan South, dan West terendah, ini mengidentifikasi bahwa adanya perbedaan performa antar region yang cukup signifikan.

secara keseluruhan data, sales adalah variabel yang paling stabil. ssedangkan StoreSize dan experience adalah variabel yang paling menjanjikan untuk meningkatkan penjualan, dan AdBudget perlu dipertimbangkan ulang karena distribusinya yang tidak seimbang antar toko. Strategi yang bisa dilakukan dalam penjualan bisa dengan memfokuskan pada pengembangan toko dan pengalaman, serta pemilihan produk (terutama Electronic) dan mengoptimalkan anggaran iklan (AdBudget) pada region yang sesuai