UTS
Data Science Programming
SOAL 1
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
# 1. Menerima input dua bilangan (pakai readline())
num1 <- as.numeric(readline(prompt = "Masukkan bilangan pertama: "))
## Masukkan bilangan pertama:
## Masukkan bilangan kedua:
# 2. Operasi matematika
penjumlahan <- num1 + num2
perkalian <- num1 * num2
pembagian <- num1 / num2
pangkat <- num1 ^ num2 # atau num1 ** num2
# 3. Menampilkan hasil + tipe data
cat("\nHasil Operasi:\n")
##
## Hasil Operasi:
## Penjumlahan: NA (Tipe: numeric )
## Perkalian: NA (Tipe: numeric )
## Pembagian: NA (Tipe: numeric )
## Pangkat: NA (Tipe: numeric )
SOAL 2
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”
# 1. Menerima input nilai (0-100)
nilai <- as.numeric(readline(prompt = "Masukkan nilai ujian (0-100): "))
## Masukkan nilai ujian (0-100):
# 2. Validasi input (0-100)
if (is.na(nilai)) { # Handle jika input bukan angka
cat("Error: Input harus angka!\n")
} else if (nilai < 0 | nilai > 100) {
cat("Error: Nilai harus antara 0-100!\n")
} else {
# 3. Cek kategori nilai
if (nilai >= 85) {
keterangan <- "Sangat Baik"
} else if (nilai >= 70) {
keterangan <- "Baik"
} else if (nilai >= 60) {
keterangan <- "Cukup"
} else {
keterangan <- "Perlu Perbaikan"
}
# 4. Output hasil
cat("Kategori nilai:", keterangan, "\n")
}
## Error: Input harus angka!
SOAL 3
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) {
# Fungsi untuk mencetak bilangan genap kelipatan 4 dari 1 hingga n.
# Args:
# n (integer): Batas atas range.
hasil <- c() # Vektor untuk menyimpan hasil
for (i in 1:n) { # Loop dari 1 sampai n
if (i %% 4 == 0) { # Cek apakah i kelipatan 4
hasil <- c(hasil, i) # Tambahkan ke vektor hasil
}
}
# Gabungkan hasil dengan koma dan print
cat(paste(hasil, collapse = ", "), "\n")
}
# Contoh pemanggilan
kelipatan_genap(20) # Output: 4, 8, 12, 16, 20
## 4, 8, 12, 16, 20
SOAL 4:Data Wrangling & Analisis Penjualan E-Commerce
1. Data Collection
Pada tahap awal, dilakukan proses penggabungan data dari tiga file transaksi penjualan yang terpisah, yaitu data bulan Januari, Februari, dan Maret. Setiap file dibaca menggunakan fungsi read_csv() dari library readr, kemudian digabung menjadi satu dataset utuh menggunakan fungsi bind_rows() dari dplyr. Hasil penggabungan ini membentuk dataset yang lebih komprehensif, mencakup seluruh transaksi selama kuartal pertama. Setelah penggabungan, dilakukan pengecekan jumlah baris dan kolom untuk memastikan bahwa seluruh data telah berhasil diintegrasikan dengan baik.
##
## 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
## Warning: package 'readr' was built under R version 4.4.3
## 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.
## [1] 150 9
2. Data Cleaning
Setelah pengumpulan data, tahap berikutnya adalah pembersihan data. Pembersihan ini bertujuan untuk memastikan data dalam format yang sesuai dan siap untuk dianalisis. Beberapa langkah yang dilakukan termasuk mengubah format tanggal, memastikan kolom numerik benar, serta menghapus data yang tidak valid atau kosong.
## 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.
# Gabungkan
data <- bind_rows(jan, feb, mar)
# 1. Ubah format tanggal ke YYYY-MM-DD
data <- data %>%
mutate(Tanggal = dmy(Tanggal))
# 2. Ubah Harga & Jumlah ke numeric
data <- data %>%
mutate(
Harga = parse_number(Harga),
Jumlah = parse_number(Jumlah)
)
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `Jumlah = parse_number(Jumlah)`.
## Caused by warning:
## ! 57 parsing failures.
## row col expected actual
## 1 -- a number empat
## 4 -- a number dua
## 6 -- a number empat
## 8 -- a number dua
## 9 -- a number empat
## ... ... ........ ......
## See problems(...) for more details.
# 3. Hitung ulang kolom Total
data <- data %>%
mutate(Total = Harga * Jumlah)
# 4. Bersihkan nilai tidak valid
nilai_tidak_valid <- c("-", "dua", "Rp", "_anonymous_", "", NA)
data <- data %>%
mutate(
Produk = ifelse(Produk %in% nilai_tidak_valid, NA, Produk),
Kategori = ifelse(Kategori %in% nilai_tidak_valid, NA, Kategori),
Kota = ifelse(Kota %in% nilai_tidak_valid, NA, Kota)
)
# 5. Hapus baris tanpa nama produk
data <- data %>%
filter(!is.na(Produk) & Produk != "")
# Cek hasil akhir
glimpse(data)
## Rows: 122
## Columns: 9
## $ OrderID <dbl> 1001, 1002, 1003, 1004, 1006, 1007, 1009, 1010, 1012, 1013, 1…
## $ Tanggal <date> 2024-01-01, 2024-01-02, 2024-01-03, 2024-01-04, 2024-01-06, …
## $ Produk <chr> "Laptop A", "Tas Branded", "Tas Branded", "Kemeja", "Smartpho…
## $ Kategori <chr> NA, "Fashion", "Aksesoris", NA, "Fashion", "Elektronik", "Ele…
## $ Harga <dbl> 1.5e+07, 1.5e+07, 1.5e+07, 1.5e+07, 1.5e+07, 1.2e+00, 1.5e+07…
## $ Jumlah <dbl> NA, 2, 3, NA, NA, 3, NA, 2, NA, 2, NA, 2, NA, NA, NA, 1, 1, 2…
## $ Total <dbl> NA, 3.00e+07, 4.50e+07, NA, NA, 3.60e+00, NA, 1.50e+03, NA, 1…
## $ Pembeli <chr> "Budi@", "Budi@", "_anonymous_", "Andi123", "Sinta99", "_anon…
## $ Kota <chr> "Bandung", "Surabaya", "Bandung", "Bandung", "Bandung", "Band…
3. Data Transformation
Tujuan:
Setelah data dibersihkan, kita bisa mulai melakukan transformasi untuk menyiapkan data ke tahap analisis. Di tahap ini, kita akan:
- Menambahkan kolom bulan transaksi
- Mengelompokkan total penjualan per kategori
- Mengelompokkan jumlah transaksi per kota
- Meringkas total penjualan per bulan
Transformasi Data
library(lubridate)
library(dplyr)
# Transformasi data
data <- data %>%
mutate(Bulan = month(Tanggal, label = TRUE, abbr = FALSE)) # Tambahkan kolom Bulan
# Total penjualan per kategori
penjualan_per_kategori <- data %>%
group_by(Kategori) %>%
summarise(Total_Penjualan = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total_Penjualan))
# Jumlah transaksi per kota
transaksi_per_kota <- data %>%
group_by(Kota) %>%
summarise(Jumlah_Transaksi = n()) %>%
arrange(desc(Jumlah_Transaksi))
Visualisasi Data
1. Total Penjualan per Bulan
Grafik ini menunjukkan total penjualan dari masing-masing kategori produk berdasarkan data penjualan gabungan dari bulan Januari sampai Maret.
Setiap batang mewakili satu kategori, dan panjangnya menunjukkan seberapa besar total penjualan dari kategori tersebut. Kategori dengan batang paling panjang berarti memiliki jumlah penjualan tertinggi selama kuartal pertama.
Dengan tampilan horizontal dan warna yang berbeda, grafik ini memudahkan kita untuk melihat dan membandingkan kategori mana yang paling laris dan mana yang penjualannya masih rendah.
# Muat library yang dibutuhkan
# Pastikan library ggplot2 telah dimuat
library(ggplot2)
# Visualisasi total penjualan per kategori
ggplot(penjualan_per_kategori, aes(x = reorder(Kategori, Total_Penjualan),
y = Total_Penjualan, fill = Kategori)) +
geom_bar(stat = "identity", width = 0.6) +
coord_flip() +
scale_fill_brewer(palette = "Set2") +
labs(title = "Total Penjualan per Kategori",
subtitle = "Gabungan Data Penjualan Januari–Maret",
x = "Kategori Produk",
y = "Total Penjualan (Rp)") +
theme_minimal(base_size = 16) +
theme(
plot.title = element_text(face = "bold", size = 22),
plot.subtitle = element_text(size = 16, margin = margin(b = 10)),
axis.title = element_text(face = "bold", size = 16),
legend.position = "none"
)