UTS PEMOGRAMAN SAINS DATA
UTS PEMOGRAMAN SAINS DATA
1. Operasi dan Tipe Data Dasar
a. Menerima dua bilangan dari pengguna
b. Menghitung dan menampilkan hasil
angka1 <- 7
angka2 <- 3
penjumlahan <- angka1 + angka2
perkalian <- angka1 * angka2
pembagian <- angka1 / angka2
pangkat <- angka1 ^ angka2
cat("Penjumlahan:", penjumlahan)## Penjumlahan: 10
## Perkalian: 21
## Pembagian: 2.333333
## Pangkat: 343
c. Menampilkan hasil dan tipe data masing-masing
## Tipe data: numeric
## Tipe data: numeric
## Tipe data: numeric
## Tipe data: numeric
2. Struktur Kendali (Control Flow)
a. Menerima input nilai ujian dari pengguna (0-100)
# a. Menentukan nilai ujian
nilai <- 92
# Menampilkan nilai yang ditentukan
cat("Nilai ujian:", nilai, "\n")## Nilai ujian: 92
b. Menampilkan keterangan berdasarkan ketentuan berikut:
Nilai ≥ 85: “Sangat Baik”
Nilai 70–84: “Baik”
Nilai 60–69: “Cukup”
Nilai < 60: “Perlu Perbaikan”
if (nilai >= 85) {
cat("Sangat Baik (A)\n")
} else if (nilai >= 70) {
cat("Baik (B)\n")
} else if (nilai >= 60) {
cat("Cukup (C)\n")
} else {
cat("Nilai Perlu Perbaikan\n")
}## Sangat Baik (A)
3. Fungsi dan Perulangan
a. Menerima input integer
# a. Menentukan nilai integer n
n <- 40
# Menampilkan nilai n
cat("Nilai n yang ditentukan adalah:", n, "\n")## Nilai n yang ditentukan adalah: 40
4.Studi Kasus
Sebuah perusahaan e-commerce ingin menganalisis performa penjualannya berdasarkan data transaksi selama 3 bulan terakhir. Namun, data yang tersedia berasal dari berbagai sumber dan memiliki kualitas yang beragam. Anda diminta untuk melakukan Data Wrangling sebelum dianalisis lebih lanjut.
# suppress message and warning
suppressMessages({
suppressWarnings({
# Load library
library(dplyr)
library(ggplot2)
# Set seed untuk konsistensi
set.seed(42)
# Simulasi data
tanggal_range <- seq(as.Date("2025-01-01"), as.Date("2025-03-31"), by = "day")
kategori_list <- c("Elektronik", "Fashion", "Makanan", "Kecantikan", "Olahraga")
# Generate data acak
sales_data <- data.frame(
Tanggal = sample(tanggal_range, 300, replace = TRUE),
Kategori = sample(kategori_list, 300, replace = TRUE),
Jumlah = sample(1:4, 300, replace = TRUE),
Harga = sample(50000:1000000, 300, replace = TRUE)
)
# Hitung total penjualan
sales_data <- sales_data %>%
mutate(Total_Penjualan = Jumlah * Harga)
# Statistik Data Numerik
cat("=== Statistik Data Numerik ===\n")
print(summary(select(sales_data, Jumlah, Harga, Total_Penjualan)))
# Statistik Data Kategorikal
cat("\n=== Statistik Data Kategorikal ===\n")
print(summary(select(sales_data, Tanggal, Kategori)))
# Penjualan per kategori
total_per_kategori <- sales_data %>%
group_by(Kategori) %>%
summarise(Total_Penjualan = sum(Total_Penjualan)) %>%
arrange(desc(Total_Penjualan))
cat("\n=== Total Penjualan per Kategori ===\n")
print(total_per_kategori)
# Visualisasi
ggplot(total_per_kategori, aes(x = reorder(Kategori, -Total_Penjualan), y = Total_Penjualan)) +
geom_bar(stat = "identity", fill = "pink", color = "black") +
labs(title = "Total Penjualan per Kategori",
x = "Kategori", y = "Total Penjualan (Rp)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
geom_hline(yintercept = seq(0, max(total_per_kategori$Total_Penjualan), by = 1e7),
linetype = "dashed", color = "gray", alpha = 0.6)
})
})## === Statistik Data Numerik ===
## Jumlah Harga Total_Penjualan
## Min. :1.00 Min. : 50526 Min. : 51371
## 1st Qu.:2.00 1st Qu.:271014 1st Qu.: 577458
## Median :3.00 Median :502273 Median :1017678
## Mean :2.51 Mean :506415 Mean :1283365
## 3rd Qu.:3.00 3rd Qu.:710250 3rd Qu.:1849141
## Max. :4.00 Max. :996852 Max. :3976072
##
## === Statistik Data Kategorikal ===
## Tanggal Kategori
## Min. :2025-01-01 Length:300
## 1st Qu.:2025-01-24 Class :character
## Median :2025-02-11 Mode :character
## Mean :2025-02-12
## 3rd Qu.:2025-03-05
## Max. :2025-03-31
##
## === Total Penjualan per Kategori ===
## # A tibble: 5 × 2
## Kategori Total_Penjualan
## <chr> <int>
## 1 Fashion 98922741
## 2 Makanan 80346424
## 3 Kecantikan 72366578
## 4 Olahraga 69648647
## 5 Elektronik 63725054
1. Data Collection
Asumsikan data berasal dari 3 file CSV berbeda (januari.csv, februari.csv,maret.csv). Tugas anda:
a. Gabungkan ketiga file menjadi satu dataset.
b.Tampilkan jumlah total baris dan kolom setelah digabung.
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Data Januari:
## # A tibble: 6 × 9
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli Kota
## <dbl> <chr> <chr> <chr> <chr> <chr> <lgl> <chr> <chr>
## 1 1001 01-01-2024 Laptop A <NA> 15000000 empat NA Budi@ Band…
## 2 1002 02-01-2024 Tas Branded Fashion 15000000 2 NA Budi@ Sura…
## 3 1003 03-01-2024 Tas Branded Aksesoris 15000000 3 NA _anony… Band…
## 4 1004 04-01-2024 Kemeja <NA> 15000000 dua NA Andi123 Band…
## 5 1005 05-01-2024 - Fashion Rp750.000 3 NA _anony… Jaka…
## 6 1006 06-01-2024 Smartphone X Fashion 15000000 empat NA Sinta99 Band…
## Data Februari:
## # A tibble: 6 × 9
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli Kota
## <dbl> <chr> <chr> <chr> <chr> <chr> <lgl> <chr> <chr>
## 1 1101 01-02-2024 Tas Branded Aksesoris 1.200.000 dua NA Budi@ Band…
## 2 1102 02-02-2024 Smartphone X Fashion Rp750.000 2 NA _anony… -
## 3 1103 03-02-2024 Kemeja Fashion 15000000 1 NA Budi@ Sura…
## 4 1104 04-02-2024 Kemeja Fashion 15000000 empat NA _anony… Band…
## 5 1105 05-02-2024 Smartphone X <NA> 15000000 empat NA _anony… Sura…
## 6 1106 06-02-2024 - Aksesoris Rp750.000 3 NA _anony… Band…
## Data Maret:
## # A tibble: 6 × 9
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli Kota
## <dbl> <chr> <chr> <chr> <chr> <chr> <lgl> <chr> <chr>
## 1 1201 01-03-2024 Sepatu 'Nike' Fashion 1.200.… empat NA Andi123 Sura…
## 2 1202 02-03-2024 - Elektronik 150000… 3 NA _anony… Jaka…
## 3 1203 03-03-2024 - Fashion 1.200.… dua NA Sinta99 Sura…
## 4 1204 04-03-2024 - <NA> Rp750.… 3 NA Budi@ Sura…
## 5 1205 05-03-2024 Tas Branded <NA> Rp750.… dua NA Andi123 Jaka…
## 6 1206 06-03-2024 Kemeja Aksesoris 150000… 2 NA Andi123 Sura…
# Pastikan kamu sudah install dan load package yang diperlukan
# install.packages("dplyr") # jika belum terinstall
library(dplyr)
# Baca data
df_jan <- read.csv("januari.csv")
df_feb <- read.csv("februari.csv")
df_mar <- read.csv("maret.csv")
# Gabung data
df_all <- bind_rows(df_jan, df_feb, df_mar)
# Tampilkan data sebagai tabel
cat("Contoh Tabel Gabungan (10 Baris Acak):\n")## Contoh Tabel Gabungan (10 Baris Acak):
## OrderID Tanggal Produk Kategori Harga Jumlah Total
## 1 1141 12-03-2024 Smartphone X Elektronik Rp750.000 empat NA
## 2 1032 01-02-2024 - Fashion 250000 1 NA
## 3 1001 01-01-2024 Laptop A 15000000 empat NA
## 4 1249 18-04-2024 Sepatu 'Nike' Fashion 15000000 empat NA
## 5 1128 28-02-2024 Kemeja Fashion Rp750.000 3 NA
## 6 1134 05-03-2024 Kemeja Aksesoris 15000000 3 NA
## 7 1231 31-03-2024 Laptop A Fashion Rp750.000 1 NA
## 8 1219 19-03-2024 Kemeja 15000000 2 NA
## 9 1003 03-01-2024 Tas Branded Aksesoris 15000000 3 NA
## 10 1243 12-04-2024 Laptop A Fashion 1.200.000 2 NA
## Pembeli Kota
## 1 Budi@ Bandung
## 2 _anonymous_ Jakarta
## 3 Budi@ Bandung
## 4 Sinta99 Jakarta
## 5 Andi123 Surabaya
## 6 Sinta99 Jakarta
## 7 _anonymous_ Bandung
## 8 _anonymous_ -
## 9 _anonymous_ Bandung
## 10 Andi123 -
# Menggabungkan tiga data frame menjadi satu
df_all <- bind_rows(df_jan, df_feb, df_mar)
# Menampilkan jumlah baris dan kolom
cat("Jumlah total baris:", nrow(df_all), "\n")## Jumlah total baris: 150
## Jumlah total kolom: 9
2. Data Cleaning
Lakukan pembersihan data berikut:
Standarkan format tanggal ke bentuk YYYY-MM-DD.
Ubah kolom Harga dan Jumlah menjadi format numerik.
Hitung ulang nilai kolom Total = Harga * Jumlah.
Ganti nilai yang tidak valid (contoh: -, “dua”, “Rp”, “anonymous”) dengan nilai yang sesuai atau NA.
Hapus baris yang tidak memiliki nama produk (Produk kosong atau -).
## Warning: package 'lubridate' was built under R version 4.4.3
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 50 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Tanggal, Produk, Kategori, Harga, Jumlah, Pembeli, Kota
## dbl (1): OrderID
## lgl (1): Total
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# 2. Gabungkan ketiga dataset
df_all <- bind_rows(df_jan, df_feb, df_mar)
# 3. Salin data untuk cleaning
df <- df_all
# 4. Format Tanggal jadi YYYY-MM-DD
df$Tanggal <- dmy(df$Tanggal) # day-month-year
# 5. Bersihkan kolom Harga
# - Hilangkan simbol dan teks seperti "Rp", titik, koma
df$Harga <- gsub("[^0-9]", "", as.character(df$Harga))
df$Harga <- as.numeric(df$Harga)
# 6. Bersihkan kolom Jumlah
# - Konversi kata-kata ke angka
kata_ke_angka <- c("satu" = 1, "dua" = 2, "tiga" = 3, "empat" = 4, "lima" = 5)
df$Jumlah <- recode(df$Jumlah, !!!kata_ke_angka)## Warning: Unreplaced values treated as NA as `.x` is not compatible.
## Please specify replacements exhaustively or supply `.default`.
df$Jumlah <- as.numeric(df$Jumlah)
# 7. Hitung ulang kolom Total
df$Total <- df$Harga * df$Jumlah
# 8. Ganti nilai tidak valid menjadi NA
invalid_values <- c("-", "Rp", "anonymous")
df <- df %>%
mutate(across(where(is.character), ~replace(.x, .x %in% invalid_values, NA)))
# 9. Hapus baris yang tidak memiliki nama produk
df <- df %>% filter(!is.na(Produk))
# 10. Tampilkan data hasil cleaning
cat("Jumlah baris setelah dibersihkan:", nrow(df), "\n")## Jumlah baris setelah dibersihkan: 122
3. Data Transformation
Lakukan transformasi data sebagai berikut:
Buat kolom baru Bulan berdasarkan tanggal transaksi.
Hitung total penjualan (Total) per kategori produk.
Hitung jumlah transaksi dari setiap kota.
Buat ringkasan jumlah total penjualan per bulan.
library(dplyr)
library(lubridate)
# Tambahkan kolom Bulan
bulan_dict <- c("Januari", "Februari", "Maret")
df <- df %>%
mutate(Bulan = bulan_dict[month(Tanggal)])
# Total Penjualan per Kategori Produk
penjualan_kategori <- df %>%
group_by(Kategori) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total))
# Total Penjualan per Kota
penjualan_kota <- df %>%
group_by(Kota) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total))
# Total Penjualan per Bulan
penjualan_bulan <- df %>%
group_by(Bulan) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total))
# Ubah ke dataframe biasa & reset rownames jadi 0,1,2 (seperti pandas)
rownames(penjualan_kategori) <- 0:(nrow(penjualan_kategori) - 1)## Warning: Setting row names on a tibble is deprecated.
## Warning: Setting row names on a tibble is deprecated.
## Warning: Setting row names on a tibble is deprecated.
## Total Penjualan per Kategori Produk:
## Kategori Total
## 1 <NA> 251000000
## 2 Elektronik 227600000
## 3 Fashion 192800000
## 4 Aksesoris 31100000
##
## Total Penjualan per Kota:
## Kota Total
## 1 Bandung 344200000
## 2 <NA> 142100000
## 3 Jakarta 135300000
## 4 Surabaya 80900000
##
## Total Penjualan per Bulan:
## Bulan Total
## 1 Januari 277500000
## 2 Februari 183200000
## 3 <NA> 133100000
## 4 Maret 108700000
Visualisasi
library(ggplot2)
library(dplyr)
# Pastikan urutan bulan benar
penjualan_bulan$Bulan <- factor(penjualan_bulan$Bulan,
levels = c("Januari", "Februari", "Maret"))
# Grafik 1: Penjualan per Kategori (palet soft biru - pastel)
ggplot(penjualan_kategori, aes(x = Total, y = reorder(Kategori, Total))) +
geom_bar(stat = "identity", fill = "#A3C4DC") +
labs(title = "Grafik Penjualan per Kategori",
x = "Jumlah Penjualan", y = "Kategori") +
theme_minimal() # Grafik 2: Penjualan per Kota (palet hijau-biru kalem)
ggplot(penjualan_kota, aes(x = Total, y = reorder(Kota, Total))) +
geom_bar(stat = "identity", fill = "#A1D99B") +
labs(title = "Grafik Penjualan per Kota",
x = "Jumlah Penjualan", y = "Kota") +
theme_minimal() # Grafik 3: Penjualan per Bulan (ungu pastel)
ggplot(penjualan_bulan, aes(x = Bulan, y = Total, group = 1)) +
geom_line(color = "#BAA5D3", size = 1.2) +
geom_point(color = "#BAA5D3", size = 3) +
labs(title = "Tren Penjualan Bulanan",
x = "Bulan", y = "Total Penjualan") +
theme_minimal()## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.