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
## ── 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
##
## 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==