UTS Pemrograman Sains Data
May 05, 2025
1 Soal 1 - Operasi dan Tipe Data Dasar
Buat program sederhana dalam R dan Python yang melakukan hal berikut:
- Menerima dua bilangan dari pengguna
- Menghitung dan menampilkan hasil:
- Penjumlahan
- Perkalian
- Pembagian
- Bilangan pertama pangkat bilangan kedua
- Menampilkan tipe data masing-masing hasil operasi
# Bilangan pertama dan kedua
a <- 5
b <- 2
# Operasi dasar
penjumlahan <- a + b
perkalian <- a * b
pembagian <- a / b
pangkat <- a ^ b
# Menampilkan hasil
cat("Hasil Penjumlahan:", penjumlahan, "\n")## Hasil Penjumlahan: 7
## Hasil Perkalian: 10
## Hasil Pembagian: 2.5
## Hasil Pangkat: 25
## Tipe Data Penjumlahan: double
## Tipe Data Perkalian: double
## Tipe Data Pembagian: double
## Tipe Data Pangkat: double
2 Soal 2 - Struktur Kendali (Control Flow)
Tulislah program dalam R dan Python yang:
- Menerima input nilai ujian dari pengguna (0–100)
- Menampilkan keterangan berdasarkan ketentuan berikut:
- Nilai ≥ 85: “Sangat Baik”
- Nilai 70–84: “Baik”
- Nilai 60–69: “Cukup”
- Nilai < 60: “Perlu Perbaikan”
# Gunakan nilai tetap agar bisa di-knit (misalnya: 72)
nilai <- 72
# Struktur kendali if-else
if (nilai >= 85) {
cat("Nilai:", nilai, "- Sangat Baik\n")
} else if (nilai >= 70) {
cat("Nilai:", nilai, "- Baik\n")
} else if (nilai >= 60) {
cat("Nilai:", nilai, "- Cukup\n")
} else {
cat("Nilai:", nilai, "- Perlu Perbaikan\n")
}## Nilai: 72 - Baik
3 Soal 3 - Fungsi dan Perulangan
Buatlah fungsi dalam R dan Python bernama kelipatan_genap(n) yang:
- Menerima input integer
n
- Menggunakan loop untuk mencetak semua bilangan genap kelipatan 4 dari 1 hingga n
- Contoh output jika
n = 20: 4, 8, 12, 16, 20
kelipatan_genap <- function(n) {
for (i in 1:n) {
if (i %% 2 == 0 && i %% 4 == 0) {
cat(i, " ")
}
}
}
# Contoh pemanggilan fungsi
kelipatan_genap(20)## 4 8 12 16 20
4 Soal 4 - Studi Kasus: Analisis Penjualan
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.
4.1 Bagian 1: Data Collection
- Menggabungkan ketiga file menjadi satu dataset.
- Menampilkan jumlah total baris dan kolom setelah digabung.
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
##
## 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
## 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.
## # 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…
## # 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…
## # 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…
## [1] 150 9
4.2 Bagian 2: Data Cleaning
## 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
library(dplyr)
# Standarkan tanggal
data$Tanggal <- as.Date(data$Tanggal)
# Konversi Harga: hapus Rp, koma, spasi
data$Harga <- gsub("Rp", "", data$Harga)
data$Harga <- gsub(",", "", data$Harga)
data$Harga <- gsub(" ", "", data$Harga)
data$Harga <- as.numeric(data$Harga)## Warning: NAs introduced by coercion
## Warning: NAs introduced by coercion
# Hitung ulang kolom Total
data <- data %>% mutate(Total = Harga * Jumlah)
# Ganti nilai tidak valid di seluruh kolom karakter
data <- data %>%
mutate(across(where(is.character), ~na_if(., "-"))) %>%
mutate(across(where(is.character), ~na_if(., "dua"))) %>%
mutate(across(where(is.character), ~na_if(., "_anonymous_")))
# Hapus baris dengan Produk kosong
data <- data %>% filter(!is.na(Produk))
# Tampilkan data yang sudah dibersihkan
library(knitr)
kable(head(data, 10), caption = "Tabel: 10 Data Pertama Setelah Pembersihan")| OrderID | Tanggal | Produk | Kategori | Harga | Jumlah | Total | Pembeli | Kota |
|---|---|---|---|---|---|---|---|---|
| 1001 | 0001-01-20 | Laptop A | NA | 1.5e+07 | NA | NA | Budi@ | Bandung |
| 1002 | 0002-01-20 | Tas Branded | Fashion | 1.5e+07 | 2 | 3.0e+07 | Budi@ | Surabaya |
| 1003 | 0003-01-20 | Tas Branded | Aksesoris | 1.5e+07 | 3 | 4.5e+07 | NA | Bandung |
| 1004 | 0004-01-20 | Kemeja | NA | 1.5e+07 | NA | NA | Andi123 | Bandung |
| 1006 | 0006-01-20 | Smartphone X | Fashion | 1.5e+07 | NA | NA | Sinta99 | Bandung |
| 1007 | 0007-01-20 | Sepatu ‘Nike’ | Elektronik | NA | 3 | NA | NA | Bandung |
| 1009 | 0009-01-20 | Smartphone X | Elektronik | 1.5e+07 | NA | NA | NA | NA |
| 1010 | 0010-01-20 | Sepatu ‘Nike’ | Aksesoris | 7.5e+02 | 2 | 1.5e+03 | Sinta99 | Surabaya |
| 1012 | 0012-01-20 | Tas Branded | Aksesoris | 2.5e+05 | NA | NA | Andi123 | Surabaya |
| 1013 | 0013-01-20 | Laptop A | Aksesoris | 7.5e+02 | 2 | 1.5e+03 | Sinta99 | Surabaya |
4.3 Bagian 3: Data Transformation
# Buat kolom Bulan
data$Bulan <- month.name[month(data$Tanggal)]
# Agregasi
penjualan_per_kategori <- data %>% group_by(Kategori) %>% summarise(Total_Penjualan = sum(Total, na.rm = TRUE))
penjualan_per_kota <- data %>% count(Kota)
penjualan_per_bulan <- data %>% group_by(Bulan) %>% summarise(Total_Penjualan = sum(Total, na.rm = TRUE))
penjualan_per_kategori## # A tibble: 4 × 2
## Kategori Total_Penjualan
## <chr> <dbl>
## 1 Aksesoris 331762000
## 2 Elektronik 167006750
## 3 Fashion 225006750
## 4 <NA> 123009750
## # A tibble: 4 × 2
## Kota n
## <chr> <int>
## 1 Bandung 33
## 2 Jakarta 29
## 3 Surabaya 30
## 4 <NA> 30
## # A tibble: 4 × 2
## Bulan Total_Penjualan
## <chr> <dbl>
## 1 April 46258250
## 2 February 286761250
## 3 January 195757500
## 4 March 318008250
4.4 Visualisasi
## Warning: package 'ggplot2' was built under R version 4.4.2
## Warning: package 'plotly' was built under R version 4.4.3
# Grafik batang interaktif: Penjualan per kategori
p1 <- ggplot(penjualan_per_kategori, aes(x = Kategori, y = Total_Penjualan, fill = Kategori)) +
geom_bar(stat = "identity") +
labs(title = "Total Penjualan per Kategori", y = "Total Penjualan") +
theme_minimal()
ggplotly(p1)# Grafik batang interaktif: Penjualan per bulan
p2 <- ggplot(penjualan_per_bulan, aes(x = Bulan, y = Total_Penjualan, fill = Bulan)) +
geom_col() +
labs(title = "Total Penjualan per Bulan", y = "Total Penjualan") +
theme_minimal()
ggplotly(p2)## # A tibble: 6 × 10
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli Kota Bulan
## <dbl> <date> <chr> <chr> <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 1001 0001-01-20 Laptop A <NA> 1.5e7 NA NA Budi@ Band… Janu…
## 2 1002 0002-01-20 Tas Bra… Fashion 1.5e7 2 3 e7 Budi@ Sura… Janu…
## 3 1003 0003-01-20 Tas Bra… Aksesor… 1.5e7 3 4.50e7 <NA> Band… Janu…
## 4 1004 0004-01-20 Kemeja <NA> 1.5e7 NA NA Andi123 Band… Janu…
## 5 1006 0006-01-20 Smartph… Fashion 1.5e7 NA NA Sinta99 Band… Janu…
## 6 1007 0007-01-20 Sepatu … Elektro… NA 3 NA <NA> Band… Janu…
4.5 Kesimpulan
Dari hasil analisis penjualan 3 bulan terakhir:
- Kategori produk tertentu menunjukkan performa penjualan yang tinggi dan konsisten.
- Kota dengan jumlah transaksi terbanyak dapat menjadi target pemasaran.
- Tren penjualan bulanan membantu merancang strategi stok dan promosi.
Rekomendasi:
- Fokus pada kategori dengan penjualan tinggi.
- Tingkatkan promosi di kota dengan volume transaksi tinggi.
- Siapkan stok lebih banyak pada bulan dengan puncak penjualan.