DATA SCIENCE PROGRAMMING

DESCRIPTIVE VISUALITAZIONS

1 Dataset vizualitasions

library(dplyr)
library(DT)
# Membaca file data_sales.csv
data_sales <- read.csv("C:/Users/NABILA ASWA HIDAYATI/Downloads/8 Descriptive Visualizations – Data Science Programming.csv", stringsAsFactors = FALSE)
# Menampilkan data sebagai tabel interaktif
datatable(
  data_sales,
  options = list(
    pageLength = 10,
    scrollCollapse = TRUE,
    autoWidth = TRUE
  ),
  rownames = FALSE,
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: left;
             font-size: 18px; font-weight: bold;',
    'Data Sales: Tabel Interaktif dari File CSV'
  ),
  class = 'stripe hover compact'
)

2 Heatmap

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(reshape2)
## 
## Attaching package: 'reshape2'
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
data_sales <- read.csv("C:/Users/NABILA ASWA HIDAYATI/Downloads/8 Descriptive Visualizations – Data Science Programming.csv", stringsAsFactors = FALSE)

# Buat data agregasi
heatmap_data <- data_sales %>%
  group_by(Region, Product_Category) %>%
  summarise(Total_Sales = sum(Total_Price, na.rm = TRUE)) %>%
  ungroup()
## `summarise()` has grouped output by 'Region'. You can override using the
## `.groups` argument.
# Tidak perlu reshape2: pakai pivot_wider dan ubah jadi matrix
heatmap_matrix <- heatmap_data %>%
  pivot_wider(names_from = Product_Category, values_from = Total_Sales, values_fill = 0) %>%
  column_to_rownames("Region") %>%
  as.matrix()

# Visualisasi
ggplot(as.data.frame(as.table(heatmap_matrix)), aes(Var2, Var1, fill = Freq)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "lightyellow", high = "red") +
  labs(
    title = "Heatmap Total Penjualan per Region dan Kategori Produk",
    x = "Kategori Produk",
    y = "Region",
    fill = "Total Penjualan"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

3 Relationship

3.1 scatter plot

ggplot(data_sales, aes(x = Unit_Price, y = Discount)) +
  geom_point(color = "red", alpha = 0.5) +
  labs(title = "Relationship: Unit Price vs Discount",
       x = "Unit Price",
       y = "Discount") +
  theme_minimal()

3.2 bubble chart

library(ggplot2)

ggplot(data_sales, aes(x = Quantity, 
                       y = Total_Price, 
                       size = Discount, 
                       color = Product_Category)) +
  geom_point(alpha = 0.6) +
  labs(title = "Bubble Chart: Quantity vs Total Price (Bubble Size = Discount)",
       x = "Quantity",
       y = "Total Price",
       size = "Discount",
       color = "Product Category") +
  theme_minimal()

3.3 correlation matrix

# Install dan load ggcorrplot
if (!require(ggcorrplot)) install.packages("ggcorrplot")
library(ggcorrplot)

# Ambil kolom numerik dari dataset
numeric_data <- data_sales[sapply(data_sales, is.numeric)]

# Hitung matriks korelasi
cor_matrix <- cor(numeric_data, use = "complete.obs")

# Visualisasi korelasi TANPA clustering (aman dari error)
ggcorrplot(cor_matrix,
           hc.order = FALSE,         # Tidak pakai clustering (menghindari error)
           type = "lower",           
           lab = TRUE,               
           lab_size = 3,             
           colors = c("red", "white", "blue"),
           title = "Correlation Matrix: Numerical Variables in data_sales")

4 time series

4.1 line chart time series

# Load library
library(ggplot2)
library(dplyr)
library(lubridate)

# Ubah Transaction_Date jadi format Date
data_sales$Transaction_Date <- as.Date(data_sales$Transaction_Date)

# Agregasi: total penjualan per bulan
sales_by_month <- data_sales %>%
  mutate(Month = floor_date(Transaction_Date, "month")) %>%
  group_by(Month) %>%
  summarise(Total_Sales = sum(Total_Price, na.rm = TRUE))

# Buat line chart
ggplot(sales_by_month, aes(x = Month, y = Total_Sales)) +
  geom_line(color = "steelblue", size = 1) +
  geom_point(color = "darkred") +
  labs(title = "Time Series: Total Sales per Month",
       x = "Month",
       y = "Total Sales") +
  theme_minimal()

4.2 Area chart

# Load library
library(ggplot2)
library(dplyr)
library(lubridate)

# Pastikan Transaction_Date dalam format Date
data_sales$Transaction_Date <- as.Date(data_sales$Transaction_Date)

# Agregasi data penjualan per bulan
sales_by_month <- data_sales %>%
  mutate(Month = floor_date(Transaction_Date, "month")) %>%
  group_by(Month) %>%
  summarise(Total_Sales = sum(Total_Price, na.rm = TRUE))

# Buat area chart
ggplot(sales_by_month, aes(x = Month, y = Total_Sales)) +
  geom_area(fill = "skyblue", alpha = 0.6) +
  geom_line(color = "steelblue", size = 1) +
  labs(title = "Time Series Area Chart: Total Sales per Month",
       x = "Month",
       y = "Total Sales") +
  theme_minimal()

LS0tDQp0aXRsZTogIkRBVEEgU0NJRU5DRSBQUk9HUkFNTUlORyINCnN1YnRpdGxlOiAiREVTQ1JJUFRJVkUgVklTVUFMSVRBWklPTlMiDQphdXRob3I6IA0KICAtICJOYWJpbGEgQXN3YSAoNTIyNDAwMTIpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCi0tLQ0KDQojIERhdGFzZXQgdml6dWFsaXRhc2lvbnMNCg0KYGBge3IsIGVjaG89IFRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShEVCkNCiMgTWVtYmFjYSBmaWxlIGRhdGFfc2FsZXMuY3N2DQpkYXRhX3NhbGVzIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9OQUJJTEEgQVNXQSBISURBWUFUSS9Eb3dubG9hZHMvOCBEZXNjcmlwdGl2ZSBWaXN1YWxpemF0aW9ucyDigJMgRGF0YSBTY2llbmNlIFByb2dyYW1taW5nLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCiMgTWVuYW1waWxrYW4gZGF0YSBzZWJhZ2FpIHRhYmVsIGludGVyYWt0aWYNCmRhdGF0YWJsZSgNCiAgZGF0YV9zYWxlcywNCiAgb3B0aW9ucyA9IGxpc3QoDQogICAgcGFnZUxlbmd0aCA9IDEwLA0KICAgIHNjcm9sbENvbGxhcHNlID0gVFJVRSwNCiAgICBhdXRvV2lkdGggPSBUUlVFDQogICksDQogIHJvd25hbWVzID0gRkFMU0UsDQogIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbigNCiAgICBzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgdGV4dC1hbGlnbjogbGVmdDsNCiAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOycsDQogICAgJ0RhdGEgU2FsZXM6IFRhYmVsIEludGVyYWt0aWYgZGFyaSBGaWxlIENTVicNCiAgKSwNCiAgY2xhc3MgPSAnc3RyaXBlIGhvdmVyIGNvbXBhY3QnDQopDQoNCg0KDQpgYGANCg0KIyBIZWF0bWFwDQpgYGB7ciwgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVzaGFwZTIpDQoNCmRhdGFfc2FsZXMgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL05BQklMQSBBU1dBIEhJREFZQVRJL0Rvd25sb2Fkcy84IERlc2NyaXB0aXZlIFZpc3VhbGl6YXRpb25zIOKAkyBEYXRhIFNjaWVuY2UgUHJvZ3JhbW1pbmcuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KDQojIEJ1YXQgZGF0YSBhZ3JlZ2FzaQ0KaGVhdG1hcF9kYXRhIDwtIGRhdGFfc2FsZXMgJT4lDQogIGdyb3VwX2J5KFJlZ2lvbiwgUHJvZHVjdF9DYXRlZ29yeSkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9TYWxlcyA9IHN1bShUb3RhbF9QcmljZSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQojIFRpZGFrIHBlcmx1IHJlc2hhcGUyOiBwYWthaSBwaXZvdF93aWRlciBkYW4gdWJhaCBqYWRpIG1hdHJpeA0KaGVhdG1hcF9tYXRyaXggPC0gaGVhdG1hcF9kYXRhICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gUHJvZHVjdF9DYXRlZ29yeSwgdmFsdWVzX2Zyb20gPSBUb3RhbF9TYWxlcywgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJSZWdpb24iKSAlPiUNCiAgYXMubWF0cml4KCkNCg0KIyBWaXN1YWxpc2FzaQ0KZ2dwbG90KGFzLmRhdGEuZnJhbWUoYXMudGFibGUoaGVhdG1hcF9tYXRyaXgpKSwgYWVzKFZhcjIsIFZhcjEsIGZpbGwgPSBGcmVxKSkgKw0KICBnZW9tX3RpbGUoY29sb3IgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImxpZ2h0eWVsbG93IiwgaGlnaCA9ICJyZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSGVhdG1hcCBUb3RhbCBQZW5qdWFsYW4gcGVyIFJlZ2lvbiBkYW4gS2F0ZWdvcmkgUHJvZHVrIiwNCiAgICB4ID0gIkthdGVnb3JpIFByb2R1ayIsDQogICAgeSA9ICJSZWdpb24iLA0KICAgIGZpbGwgPSAiVG90YWwgUGVuanVhbGFuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCg0KDQojIFJlbGF0aW9uc2hpcA0KDQojIyBzY2F0dGVyIHBsb3QNCmBgYHtyLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCmdncGxvdChkYXRhX3NhbGVzLCBhZXMoeCA9IFVuaXRfUHJpY2UsIHkgPSBEaXNjb3VudCkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcDogVW5pdCBQcmljZSB2cyBEaXNjb3VudCIsDQogICAgICAgeCA9ICJVbml0IFByaWNlIiwNCiAgICAgICB5ID0gIkRpc2NvdW50IikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyBidWJibGUgY2hhcnQNCmBgYHtyIGJ1YmJsZS1jaGFydCwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QoZGF0YV9zYWxlcywgYWVzKHggPSBRdWFudGl0eSwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSBUb3RhbF9QcmljZSwgDQogICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBEaXNjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gUHJvZHVjdF9DYXRlZ29yeSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNikgKw0KICBsYWJzKHRpdGxlID0gIkJ1YmJsZSBDaGFydDogUXVhbnRpdHkgdnMgVG90YWwgUHJpY2UgKEJ1YmJsZSBTaXplID0gRGlzY291bnQpIiwNCiAgICAgICB4ID0gIlF1YW50aXR5IiwNCiAgICAgICB5ID0gIlRvdGFsIFByaWNlIiwNCiAgICAgICBzaXplID0gIkRpc2NvdW50IiwNCiAgICAgICBjb2xvciA9ICJQcm9kdWN0IENhdGVnb3J5IikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyBjb3JyZWxhdGlvbiBtYXRyaXgNCmBgYHtyIGNvcnJlbGF0aW9uLW1hdHJpeCwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQ0KIyBJbnN0YWxsIGRhbiBsb2FkIGdnY29ycnBsb3QNCmlmICghcmVxdWlyZShnZ2NvcnJwbG90KSkgaW5zdGFsbC5wYWNrYWdlcygiZ2djb3JycGxvdCIpDQpsaWJyYXJ5KGdnY29ycnBsb3QpDQoNCiMgQW1iaWwga29sb20gbnVtZXJpayBkYXJpIGRhdGFzZXQNCm51bWVyaWNfZGF0YSA8LSBkYXRhX3NhbGVzW3NhcHBseShkYXRhX3NhbGVzLCBpcy5udW1lcmljKV0NCg0KIyBIaXR1bmcgbWF0cmlrcyBrb3JlbGFzaQ0KY29yX21hdHJpeCA8LSBjb3IobnVtZXJpY19kYXRhLCB1c2UgPSAiY29tcGxldGUub2JzIikNCg0KIyBWaXN1YWxpc2FzaSBrb3JlbGFzaSBUQU5QQSBjbHVzdGVyaW5nIChhbWFuIGRhcmkgZXJyb3IpDQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsDQogICAgICAgICAgIGhjLm9yZGVyID0gRkFMU0UsICAgICAgICAgIyBUaWRhayBwYWthaSBjbHVzdGVyaW5nIChtZW5naGluZGFyaSBlcnJvcikNCiAgICAgICAgICAgdHlwZSA9ICJsb3dlciIsICAgICAgICAgICANCiAgICAgICAgICAgbGFiID0gVFJVRSwgICAgICAgICAgICAgICANCiAgICAgICAgICAgbGFiX3NpemUgPSAzLCAgICAgICAgICAgICANCiAgICAgICAgICAgY29sb3JzID0gYygicmVkIiwgIndoaXRlIiwgImJsdWUiKSwNCiAgICAgICAgICAgdGl0bGUgPSAiQ29ycmVsYXRpb24gTWF0cml4OiBOdW1lcmljYWwgVmFyaWFibGVzIGluIGRhdGFfc2FsZXMiKQ0KYGBgDQoNCiMgdGltZSBzZXJpZXMNCg0KIyMgbGluZSBjaGFydCB0aW1lIHNlcmllcw0KYGBge3IgdGltZS1zZXJpZXMtbGluZWNoYXJ0LCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTV9DQojIExvYWQgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIFViYWggVHJhbnNhY3Rpb25fRGF0ZSBqYWRpIGZvcm1hdCBEYXRlDQpkYXRhX3NhbGVzJFRyYW5zYWN0aW9uX0RhdGUgPC0gYXMuRGF0ZShkYXRhX3NhbGVzJFRyYW5zYWN0aW9uX0RhdGUpDQoNCiMgQWdyZWdhc2k6IHRvdGFsIHBlbmp1YWxhbiBwZXIgYnVsYW4NCnNhbGVzX2J5X21vbnRoIDwtIGRhdGFfc2FsZXMgJT4lDQogIG11dGF0ZShNb250aCA9IGZsb29yX2RhdGUoVHJhbnNhY3Rpb25fRGF0ZSwgIm1vbnRoIikpICU+JQ0KICBncm91cF9ieShNb250aCkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9TYWxlcyA9IHN1bShUb3RhbF9QcmljZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBCdWF0IGxpbmUgY2hhcnQNCmdncGxvdChzYWxlc19ieV9tb250aCwgYWVzKHggPSBNb250aCwgeSA9IFRvdGFsX1NhbGVzKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAic3RlZWxibHVlIiwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrcmVkIikgKw0KICBsYWJzKHRpdGxlID0gIlRpbWUgU2VyaWVzOiBUb3RhbCBTYWxlcyBwZXIgTW9udGgiLA0KICAgICAgIHggPSAiTW9udGgiLA0KICAgICAgIHkgPSAiVG90YWwgU2FsZXMiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIEFyZWEgY2hhcnQgDQpgYGB7ciB0aW1lLXNlcmllcy1hcmVhLWNoYXJ0LCBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTV9DQojIExvYWQgbGlicmFyeQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIFBhc3Rpa2FuIFRyYW5zYWN0aW9uX0RhdGUgZGFsYW0gZm9ybWF0IERhdGUNCmRhdGFfc2FsZXMkVHJhbnNhY3Rpb25fRGF0ZSA8LSBhcy5EYXRlKGRhdGFfc2FsZXMkVHJhbnNhY3Rpb25fRGF0ZSkNCg0KIyBBZ3JlZ2FzaSBkYXRhIHBlbmp1YWxhbiBwZXIgYnVsYW4NCnNhbGVzX2J5X21vbnRoIDwtIGRhdGFfc2FsZXMgJT4lDQogIG11dGF0ZShNb250aCA9IGZsb29yX2RhdGUoVHJhbnNhY3Rpb25fRGF0ZSwgIm1vbnRoIikpICU+JQ0KICBncm91cF9ieShNb250aCkgJT4lDQogIHN1bW1hcmlzZShUb3RhbF9TYWxlcyA9IHN1bShUb3RhbF9QcmljZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBCdWF0IGFyZWEgY2hhcnQNCmdncGxvdChzYWxlc19ieV9tb250aCwgYWVzKHggPSBNb250aCwgeSA9IFRvdGFsX1NhbGVzKSkgKw0KICBnZW9tX2FyZWEoZmlsbCA9ICJza3libHVlIiwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiVGltZSBTZXJpZXMgQXJlYSBDaGFydDogVG90YWwgU2FsZXMgcGVyIE1vbnRoIiwNCiAgICAgICB4ID0gIk1vbnRoIiwNCiAgICAgICB5ID0gIlRvdGFsIFNhbGVzIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg==