UTS Pemrograman Sains Data

1. Operasi dan Tipe Data Dasar

A. Menerima dua bilangan dari pengguna

# Bilangan1 <- as.numeric(readline(prompt = "Masukkan bilangan pertama: "))
# Bilangan2 <- as.numeric(readline(prompt = "Masukkan bilangan kedua: "))

Bilangan1 <- 2
Bilangan2 <- 9

B. Menghitung dan menampilkan hasil operasi

# Mendefinisikan variabel
a <- 2
b <- 9

# Penjumlahan
jumlah <- a + b # Menambahkan dua bilangan

# Perkalian
perkalian <- a * b # Mengalikan dua bilangan

# Pembagian
pembagian <- a / b # Membagi satu bilangan dengan bilangan yang lainnya

# Pangkat
pangkat <- a ^ b  # bilangan pertama pangkat bilangan kedua

# Menampilkan hasil
cat("Hasil Penjumlahan:", jumlah, "\n")
## Hasil Penjumlahan: 11
cat("Hasil Perkalian:", perkalian, "\n")
## Hasil Perkalian: 18
cat("Hasil Pembagian:", pembagian, "\n")
## Hasil Pembagian: 0.2222222
cat("Hasil bilangan pertama pangkat bilangan kedua:", pangkat, "\n")
## Hasil bilangan pertama pangkat bilangan kedua: 512

C. Menampilkan tipe data masing-masing hasil operasi

cat("Hasil Penjumlahan:", jumlah, "| Tipe data:", class(jumlah), "\n")
## Hasil Penjumlahan: 11 | Tipe data: numeric
cat("Hasil Perkalian:", perkalian, "| Tipe data:", class(perkalian), "\n")
## Hasil Perkalian: 18 | Tipe data: numeric
cat("Hasil Pembagian:", pembagian, "| Tipe data:", class(pembagian), "\n")
## Hasil Pembagian: 0.2222222 | Tipe data: numeric
cat("Hasil Pangkat:", pangkat, "| Tipe data:", class(pangkat), "\n")
## Hasil Pangkat: 512 | Tipe data: numeric

2. Struktur Kendali (Control Flow)

A. Menerima input nilai ujian dari pengguna (0–100)

# Menentukan nilai ujian langsung (tanpa input)
nilai <- 100

# Menampilkan nilai yang ditentukan
cat("Nilai ujian:", nilai, "\n")
## Nilai ujian: 100

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 n

# A <- as.numeric(readline(prompt = "N: "))

n <- 20

print(paste("n :", n))
## [1] "n : 20"

B. Menggunakan loop untuk mencetak semua bilangan genap kelipatan 4 dari 1 hingga n

# Fungsi untuk mencetak bilangan genap kelipatan 4 dari 1 hingga n
kelipatan_genap <- function(n) {
  hasil <- c()
  for (i in 1:n) {
    if (i %% 4 == 0) {
      hasil <- c(hasil, i)
    }
  }
  cat(paste(hasil, collapse = ", "), "\n")
}

# Menentukan nilai n langsung
n <- 20

# Menampilkan hasil
cat("Bilangan genap kelipatan 4 dari 1 hingga", n, ":\n")
## Bilangan genap kelipatan 4 dari 1 hingga 20 :
kelipatan_genap(n)
## 4, 8, 12, 16, 20

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.

Bagian 1: Data Collection

1. Menggabungkan ketiga file menjadi satu dataset.

2. Menampilkan jumlah total baris dan kolom setelah digabung.

library(readr)
## Warning: package 'readr' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Membaca file CSV
data_jan <- read_csv("januari.csv")
## 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_feb <- read_csv("februari.csv")
## 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_mar <- read_csv("maret.csv")
## 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.
# Menampilkan isi masing-masing file
cat(" Data Januari:\n")
##  Data Januari:
print(head(data_jan))
## # 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…
cat("\n")
cat(" Data Februari:\n")
##  Data Februari:
print(head(data_feb))
## # 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…
cat("\n")
cat(" Data Maret:\n")
##  Data Maret:
print(head(data_mar))
## # 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…
cat("\n")
# Menggabungkan ketiga data frame menjadi satu
data_all <- rbind(data_jan, data_feb, data_mar)

# Menampilkan jumlah baris dan kolom setelah penggabungan
cat("Total baris:", nrow(data_all), "\n")
## Total baris: 150
cat("Total kolom:", ncol(data_all), "\n")
## Total kolom: 9

Bagian 2: Data Cleaning

1. Standarkan format tanggal ke bentuk YYYY-MM-DD.

2. Mengubah kolom Harga dan Jumlah menjadi format numerik.

3. Menghitung ulang nilai kolom Total = Harga * Jumlah.

4. Mengganti nilai yang tidak valid (contoh: -, “dua”, “Rp”, “anonymous”) dengan nilai yang sesuai atau NA.

5. Menghapus baris yang tidak memiliki nama produk (Produk kosong atau -).

library(dplyr)
library(stringr)
library(readr)
library(lubridate)

# Membaca 3 file CSV
data_jan <- read_csv("januari.csv")
data_feb <- read_csv("februari.csv")
data_mar <- read_csv("maret.csv")

# Menggabungkan ketiga dataset
data_all <- bind_rows(data_jan, data_feb, data_mar)

# Menyalin data untuk pembersihan
data <- data_all

# 1. Standarkan format Tanggal ke YYYY-MM-DD
data$Tanggal <- dmy(data$Tanggal)  # Mengubah format tanggal dengan lubridate

# 2. Membersihkan kolom Harga dan Jumlah
# Hilangkan simbol dan teks seperti "Rp", titik, koma
data$Harga <- str_replace_all(as.character(data$Harga), "[^0-9]", "")
data$Harga <- as.numeric(data$Harga)

# Konversi kata-kata ke angka
kata_ke_angka <- c("satu" = 1, "dua" = 2, "tiga" = 3, "empat" = 4, "lima" = 5)
data$Jumlah <- recode(data$Jumlah, !!!kata_ke_angka)
data$Jumlah <- as.numeric(data$Jumlah)

# 3. Menghitung ulang nilai kolom Total
data$Total <- data$Harga * data$Jumlah

# 4. Mengganti nilai tidak valid menjadi NA
invalid_values <- c("-", "Rp", "_anonymous_")

data <- data %>%
  mutate(across(where(is.character), ~replace(.x, .x %in% invalid_values, NA)))

# 5. Menghapus baris yang tidak memiliki nama produk
data <- data %>% filter(!is.na(Produk))

# Menampilkan data hasil pembersihan
cat("Jumlah baris setelah dibersihkan:", nrow(data), "\n")
## Jumlah baris setelah dibersihkan: 122
head(data)
## # A tibble: 6 × 9
##   OrderID Tanggal    Produk        Kategori     Harga Jumlah Total Pembeli Kota 
##     <dbl> <date>     <chr>         <chr>        <dbl>  <dbl> <dbl> <chr>   <chr>
## 1    1001 2024-01-01 Laptop A      <NA>        1.5 e7      4   6e7 Budi@   Band…
## 2    1002 2024-01-02 Tas Branded   Fashion     1.5 e7     NA  NA   Budi@   Sura…
## 3    1003 2024-01-03 Tas Branded   Aksesoris   1.5 e7     NA  NA   <NA>    Band…
## 4    1004 2024-01-04 Kemeja        <NA>        1.5 e7      2   3e7 Andi123 Band…
## 5    1006 2024-01-06 Smartphone X  Fashion     1.5 e7      4   6e7 Sinta99 Band…
## 6    1007 2024-01-07 Sepatu 'Nike' Elektronik  1.20e6     NA  NA   <NA>    Band…
library(dplyr)
library(readr)
library(stringr)
library(lubridate)

# Salin data
data <- data_all

# Konversi tanggal
data <- data %>%
  mutate(Tanggal = dmy(Tanggal))

# Bersihkan kolom Harga
data <- data %>%
  mutate(
    Harga = str_remove_all(as.character(Harga), "[^0-9]"),
    Harga = as.numeric(Harga)
  )

# Konversi teks ke angka di kolom Jumlah
data <- data %>%
  mutate(
    Jumlah = recode(Jumlah,
                    "satu" = "1",
                    "dua" = "2",
                    "tiga" = "3",
                    "empat" = "4",
                    "lima" = "5",
                    .default = as.character(Jumlah)),
    Jumlah = as.numeric(Jumlah)
  )

# Hitung Total
data <- data %>%
  mutate(Total = Harga * Jumlah)

# Ganti nilai invalid di kolom karakter
invalid_values <- c("-", "Rp", "anonymous")
data <- data %>%
  mutate(across(where(is.character), ~replace(., . %in% invalid_values, NA)))

# Hapus baris dengan Produk kosong
data <- data %>%
  filter(!is.na(Produk))

# Tampilkan hasil akhir
cat("Data setelah cleaning:\n")
## Data setelah cleaning:
print(head(data))
## # A tibble: 6 × 9
##   OrderID Tanggal    Produk        Kategori    Harga Jumlah  Total Pembeli Kota 
##     <dbl> <date>     <chr>         <chr>       <dbl>  <dbl>  <dbl> <chr>   <chr>
## 1    1001 2024-01-01 Laptop A      <NA>       1.5 e7      4 6   e7 Budi@   Band…
## 2    1002 2024-01-02 Tas Branded   Fashion    1.5 e7      2 3   e7 Budi@   Sura…
## 3    1003 2024-01-03 Tas Branded   Aksesoris  1.5 e7      3 4.50e7 _anony… Band…
## 4    1004 2024-01-04 Kemeja        <NA>       1.5 e7      2 3   e7 Andi123 Band…
## 5    1006 2024-01-06 Smartphone X  Fashion    1.5 e7      4 6   e7 Sinta99 Band…
## 6    1007 2024-01-07 Sepatu 'Nike' Elektronik 1.20e6      3 3.60e6 _anony… Band…

Bagian 3: Data Transformation

1. Membuat kolom baru Bulan berdasarkan tanggal transaksi.

2. Menghitung total penjualan (Total) per kategori produk.

3. Menghitung jumlah transaksi dari setiap kota.

4. Membuat ringkasan jumlah total penjualan per bulan.

library(dplyr)
library(lubridate)

# 1. Menambahkan kolom Bulan berdasarkan tanggal transaksi
bulan_map <- c("Januari", "Februari", "Maret")
data <- data %>%
  mutate(Bulan = factor(month(Tanggal), levels = 1:3, labels = bulan_map))

# 2. Menghitung total penjualan per kategori produk
penjualan_per_kategori <- data %>%
  group_by(Kategori) %>%
  summarise(Total = sum(Total, na.rm = TRUE)) %>%
  arrange(desc(Total))

# 3. Menghitung jumlah transaksi per kota
penjualan_per_kota <- data %>%
  group_by(Kota) %>%
  summarise(Total = sum(Total, na.rm = TRUE)) %>%
  arrange(desc(Total))

# 4. Membuat ringkasan jumlah total penjualan per bulan
penjualan_per_bulan <- data %>%
  group_by(Bulan) %>%
  summarise(Total = sum(Total, na.rm = TRUE)) %>%
  arrange(desc(Total))

# Menampilkan hasil
cat("Total Penjualan per Kategori Produk:\n")
## Total Penjualan per Kategori Produk:
print(penjualan_per_kategori)
## # A tibble: 4 × 2
##   Kategori       Total
##   <chr>          <dbl>
## 1 Fashion    440150000
## 2 Elektronik 419350000
## 3 <NA>       393350000
## 4 Aksesoris  380850000
cat("\nTotal Penjualan per Kota:\n")
## 
## Total Penjualan per Kota:
print(penjualan_per_kota)
## # A tibble: 4 × 2
##   Kota         Total
##   <chr>        <dbl>
## 1 Bandung  583750000
## 2 Jakarta  392050000
## 3 Surabaya 384500000
## 4 <NA>     273400000
cat("\nTotal Penjualan per Bulan:\n")
## 
## Total Penjualan per Bulan:
print(penjualan_per_bulan)
## # A tibble: 4 × 2
##   Bulan        Total
##   <fct>        <dbl>
## 1 Februari 494400000
## 2 Januari  489150000
## 3 Maret    458950000
## 4 <NA>     191200000

Bagian 4:Data Visualization

library(ggplot2)

# 1. Visualisasi total penjualan berdasarkan kategori produk
ggplot(penjualan_per_kategori, aes(x = reorder(Kategori, Total), y = Total)) +
  geom_bar(stat = "identity", fill = "#F1948A") +
  coord_flip() +
  labs(title = "Total Penjualan Berdasarkan Kategori Produk",
       x = "Kategori Produk", y = "Total Penjualan") +
  theme_minimal()

# 2. Visualisasi total penjualan dari setiap kota
ggplot(penjualan_per_kota, aes(x = reorder(Kota, Total), y = Total)) +
  geom_bar(stat = "identity", fill = "#D2B4DE") +
  coord_flip() +
  labs(title = "Total Penjualan Berdasarkan Kota",
       x = "Kota", y = "Total Penjualan") +
  theme_minimal()

# 3. Visualisasi ringkasan penjualan bulanan
penjualan_per_bulan$Bulan <- factor(penjualan_per_bulan$Bulan,
                                    levels = c("Januari", "Februari", "Maret"))

ggplot(penjualan_per_bulan, aes(x = Bulan, y = Total, group = 1)) +
  geom_line(color = "#C39BD3", size = 1.2) +
  geom_point(color = "#C39BD3", size = 3) +
  labs(title = "Ringkasan Total Penjualan per Bulan",
       x = "Bulan", y = "Total Penjualan") +
  theme_minimal()

Interpretasi

1. Data Collection:

  • Menggabungkan data Januari–Maret: total 150 baris, 9 kolom.
  • Tujuan: memudahkan analisis tren lintas waktu.

2. Data Cleaning:

  • Menghapus simbol “Rp”, titik, dan karakter tidak valid.
  • Mengubah kata seperti “dua” jadi angka.
  • Tujuan: memastikan data bersih, konsisten, dan siap dianalisis.

3. Data Transformation:

  • Menambahkan kolom bulan, menghitung total pembelian, dan mengelompokkan data.
  • Tujuan: mengungkap pola penjualan dari berbagai sudut.

4. Data Visualization:
Bar chart & line chart digunakan untuk memperjelas tren dan perbandingan.

Hasil yang diperoleh:

  • Penjualan tertinggi per bulan: Februari > Januari > Maret.
  • Urutan Tertinggi Kota terlaris: Bandung, Jakarta, Surabaya.
  • Urutan Tertinggi Produk paling laku: Fashion, Elektronik, Aksesoris.

Perbandingan Python vs R:

  • Python unggul untuk fleksibilitas dan scripting analitik dengan pandas dan seaborn.
  • R unggul dalam sintaks ringkas dan visualisasi statistik via ggplot2.
    Keduanya efektif—pilihan tergantung kebutuhan dan preferensi pengguna.