Tugas Individu
Ujian Tengah Semester - Pemrograman Sains Data
1.Operasi dan Tipe Data Dasar
a.) Menerima dua bilangan dari pengguna
b.) Menghitung dan menampilkan hasil:
Penjumlahan
Perkalian
Pembagian
Bilangan pertama pangkat bilangan kedua
# Misalnya Pengguna Memasukan 2 variable x=1 dan y=2
X<-1
Y<-2
# Penjumlahan
penjumlahan <- X + Y
cat("Hasil penjumlahan:", penjumlahan, "\n")
## Hasil penjumlahan: 3
## Hasil perkalian: 2
## Hasil pembagian: 0.5
## Hasil pangkat: 1
c.) Menampilkan tipe data masing-masing hasil operasi
# Menampilkan tipe data dari hasil operasi
cat("Tipe data hasil penjumlahan:", class(penjumlahan), "\n")
## Tipe data hasil penjumlahan: numeric
## Tipe data hasil perkalian: numeric
## Tipe data hasil pembagian: numeric
## Tipe data hasil pangkat: numeric
2.Struktur Kendali (Control Flow)
a.) Menerima input nilai ujian dari pengguna (0-100)
b.) Menampilkan keterangan berdasarkan ketentuan berikut:
# Misalnya Pengguna Memasukan nilai ujian dengan nilai 82
nilai <-82
# Menampilkan keterangan berdasarkan ketentuan
if (nilai >= 85) {
cat("Sangat Baik\n")
} else if (nilai >= 70 && nilai <= 84) {
cat("Baik\n")
} else if (nilai >= 60 && nilai <= 69) {
cat("Cukup\n")
} else {
cat("Perlu Perbaikan\n")
}
## Baik
3.Fungsi dan Perulangan
a.) Menerima input integer n dari pengguna
b.) Menggunakan loop untuk mencetak semua bilangan genap kelipatan 4 dari 1 hingga n
# Misal menerima input dari pengguna 30
n <-30
# Fungsi untuk mencetak bilangan genap kelipatan 4
kelipatan_genap <- function(n) {
cat("Bilangan genap kelipatan 4 dari 1 sampai", n, ":\n")
for (i in 1:n) {
if (i %% 4 == 0) {
cat(i, "\n")
}
}
}
# Memanggil fungsi
kelipatan_genap(n)
## Bilangan genap kelipatan 4 dari 1 sampai 30 :
## 4
## 8
## 12
## 16
## 20
## 24
## 28
4. Simulasi dan Analisis Penjualan E-Commerce 3 Bulan Terakhir
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.
a.) Data Collection
Gabungkan ketiga file menjadi satu dataset.
Tampilkan jumlah total baris dan kolom setelah digabung.
# 1. Baca (ambil) data dari file CSV untuk bulan Januari, Februari, dan Maret
data_jan <- read.csv("data_penjualan_kuartal1_full - Januari.csv")
data_feb <- read.csv("data_penjualan_kuartal1_full - Februari.csv")
data_mar <- read.csv("data_penjualan_kuartal1_full - Maret.csv")
# 2. Tampilkan 5 data teratas dari masing-masing bulan, untuk melihat isi datanya
# Menampilkan isi masing-masing file
cat(" Data Januari:\n")
## Data Januari:
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli
## 1 1001 01-01-2024 Laptop A 15000000 empat NA Budi@
## 2 1002 02-01-2024 Tas Branded Fashion 15000000 2 NA Budi@
## 3 1003 03-01-2024 Tas Branded Aksesoris 15000000 3 NA _anonymous_
## 4 1004 04-01-2024 Kemeja 15000000 dua NA Andi123
## 5 1005 05-01-2024 - Fashion Rp750.000 3 NA _anonymous_
## 6 1006 06-01-2024 Smartphone X Fashion 15000000 empat NA Sinta99
## Kota
## 1 Bandung
## 2 Surabaya
## 3 Bandung
## 4 Bandung
## 5 Jakarta
## 6 Bandung
## Data Februari:
## OrderID Tanggal Produk Kategori Harga Jumlah Total Pembeli
## 1 1101 01-02-2024 Tas Branded Aksesoris 1.200.000 dua NA Budi@
## 2 1102 02-02-2024 Smartphone X Fashion Rp750.000 2 NA _anonymous_
## 3 1103 03-02-2024 Kemeja Fashion 15000000 1 NA Budi@
## 4 1104 04-02-2024 Kemeja Fashion 15000000 empat NA _anonymous_
## 5 1105 05-02-2024 Smartphone X 15000000 empat NA _anonymous_
## 6 1106 06-02-2024 - Aksesoris Rp750.000 3 NA _anonymous_
## Kota
## 1 Bandung
## 2 -
## 3 Surabaya
## 4 Bandung
## 5 Surabaya
## 6 Bandung
## Data Maret:
## OrderID Tanggal Produk Kategori Harga Jumlah Total
## 1 1201 01-03-2024 Sepatu 'Nike' Fashion 1.200.000 empat NA
## 2 1202 02-03-2024 - Elektronik 15000000 3 NA
## 3 1203 03-03-2024 - Fashion 1.200.000 dua NA
## 4 1204 04-03-2024 - Rp750.000 3 NA
## 5 1205 05-03-2024 Tas Branded Rp750.000 dua NA
## 6 1206 06-03-2024 Kemeja Aksesoris 15000000 2 NA
## Pembeli Kota
## 1 Andi123 Surabaya
## 2 _anonymous_ Jakarta
## 3 Sinta99 Surabaya
## 4 Budi@ Surabaya
## 5 Andi123 Jakarta
## 6 Andi123 Surabaya
##
## 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
# 1. Baca data
data_januari <- read_csv("data_penjualan_kuartal1_full - Januari.csv", show_col_types = FALSE)
data_februari <- read_csv("data_penjualan_kuartal1_full - Februari.csv", show_col_types = FALSE)
data_maret <- read_csv("data_penjualan_kuartal1_full - Maret.csv", show_col_types = FALSE)
# 2. Samakan nama & urutan kolom berdasarkan Januari
kolom_standar <- names(data_januari)
data_februari <- data_februari %>% select(all_of(kolom_standar))
data_maret <- data_maret %>% select(all_of(kolom_standar))
# 3. Gabungkan data
data_penjualan_kuartal1 <- bind_rows(data_januari, data_februari, data_maret)
# 4. Cek jumlah baris dan kolom
data_penjualan_kuartal1 %>%
summarise(
total_baris = n(),
total_kolom = ncol(.)
) %>%
print()
## # A tibble: 1 × 2
## total_baris total_kolom
## <int> <int>
## 1 150 9
b.) Data Cleaning
Melakukan 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
# Menggunakan data hasil penggabungan
df <- data_penjualan_kuartal1
# a,Konversi tanggal ke format YYYY-MM-DD
df <- df %>%
mutate(Tanggal = dmy(Tanggal))
# b1,Bersihkan kolom Harga (hapus simbol selain angka)
df <- df %>%
mutate(
Harga = str_remove_all(as.character(Harga), "[^0-9]"),
Harga = as.numeric(Harga)
)
# b2,Ubah teks menjadi angka di kolom Jumlah
df <- df %>%
mutate(
Jumlah = tolower(Jumlah),
Jumlah = recode(Jumlah,
"satu" = "1",
"dua" = "2",
"tiga" = "3",
"empat" = "4",
"lima" = "5",
.default = as.character(Jumlah)),
Jumlah = as.numeric(Jumlah)
)
# c,Hitung kolom Total
df <- df %>%
mutate(Total = Harga * Jumlah)
# d,Ganti nilai tidak valid di semua kolom karakter
invalid_values <- c("-", "Rp", "anonymous", "anonymous")
df <- df %>%
mutate(across(where(is.character), ~replace(., . %in% invalid_values, NA)))
# e,Hapus baris yang tidak memiliki nama produk
df <- df %>%
filter(!is.na(Produk), Produk != "")
# Tampilkan hasil akhir
cat("Data setelah dibersihkan:\n")
## Data setelah dibersihkan:
## # 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…
c.) Data Transformation
Lakukan transformasi data sebagai berikut: a. Buat kolom baru Bulan berdasarkan tanggal transaksi. b. Hitung total penjualan (Total) per kategori produk. c. Hitung jumlah transaksi dari setiap kota. d. Buat ringkasan jumlah total penjualan per bulan.
library(dplyr)
library(lubridate)
# a. Buat kolom baru bernama 'Bulan' berdasarkan tanggal transaksi
bulan_map <- c("Januari", "Februari", "Maret")
df$Bulan <- bulan_map[month(df$Tanggal)]
# b. Hitung total penjualan untuk setiap kategori produk
penjualan_per_kategori <- df %>%
group_by(Kategori) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total))
# c. Hitung jumlah transaksi dari setiap kota
penjualan_per_kota <- df %>%
count(Kota, name = "Jumlah_Transaksi") %>%
arrange(desc(Jumlah_Transaksi))
# d. Buat ringkasan total penjualan per bulan
penjualan_per_bulan <- df %>%
group_by(Bulan) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(desc(Total))
# Tampilkan hasil
cat("Total Penjualan per Kategori Produk:\n")
## Total Penjualan per Kategori Produk:
## # A tibble: 4 × 2
## Kategori Total
## <chr> <dbl>
## 1 Fashion 440150000
## 2 Elektronik 419350000
## 3 <NA> 393350000
## 4 Aksesoris 380850000
##
## Jumlah Transaksi per Kota:
## # A tibble: 4 × 2
## Kota Jumlah_Transaksi
## <chr> <int>
## 1 Bandung 33
## 2 Surabaya 30
## 3 <NA> 30
## 4 Jakarta 29
##
## Total Penjualan per Bulan:
## # A tibble: 4 × 2
## Bulan Total
## <chr> <dbl>
## 1 Februari 494400000
## 2 Januari 489150000
## 3 Maret 458950000
## 4 <NA> 191200000
d.) Visualisasi
Grafik Total Penjualan per Kategori
# Pastikan library ggplot2 sudah dipanggil
library(ggplot2)
# 1. Urutkan data dari yang totalnya paling besar ke paling kecil
penjualan_per_kategori <- penjualan_per_kategori %>%
arrange(desc(Total))
# 2. Buat grafik batang horizontal
ggplot(penjualan_per_kategori, aes(x = reorder(Kategori, Total), y = Total)) +
# 3. Buat batangnya
geom_bar(stat = "identity", fill = "darkolivegreen3") +
# 4. Bikin sumbu Y jadi Kategori dan sumbu X jadi Total (dengan posisi horizontal)
coord_flip() +
# 5. Tambahkan judul grafik
labs(title = "Total Penjualan per Kategori",
x = "Kategori Produk",
y = "Total Penjualan") +
# 6. Bikin tampilan grafik jadi rapi dan simpel
theme_minimal()
# Jumlah transaksi per kota sesuai data kamu
bandung <- 33
surabaya <- 30
jakarta <- 29
# Total seluruh transaksi
total <- bandung + surabaya + jakarta
# Hitung persentasenya (dibulatkan 1 angka desimal)
persen_bandung <- round(bandung / total * 100, 1)
persen_surabaya <- round(surabaya / total * 100, 1)
persen_jakarta <- round(jakarta / total * 100, 1)
# Tampilkan hasil
cat("Persentase Bandung :", persen_bandung, "%\n")
## Persentase Bandung : 35.9 %
## Persentase Surabaya: 32.6 %
## Persentase Jakarta : 31.5 %
# Data transaksi per kota
kota_transaksi <- c(33, 30, 29)
kota_nama <- c("Bandung", "Surabaya", "Jakarta")
# Hitung total transaksi
total_transaksi <- sum(kota_transaksi)
# Hitung persentase untuk masing-masing kota
persen_bandung <- round(kota_transaksi[1] / total_transaksi * 100, 1)
persen_surabaya <- round(kota_transaksi[2] / total_transaksi * 100, 1)
persen_jakarta <- round(kota_transaksi[3] / total_transaksi * 100, 1)
# Buat vector persentase
persen <- c(persen_bandung, persen_surabaya, persen_jakarta)
# Visualisasi dengan pie chart
pie(kota_transaksi,
labels = paste(kota_nama, "\n", persen, "%"), # Menambahkan label dengan nama kota dan persentase
col = c("lightblue", "lightgreen", "lightcoral"), # Warna pie chart
main = "Persentase Transaksi per Kota", # Judul grafik
radius = 1) # Ukuran pie chart
# Pastikan kolom Tanggal dalam format Date
df$Tanggal <- as.Date(df$Tanggal, format="%Y-%m-%d")
# Buat kolom BulanAngka dan BulanNama dari kolom Tanggal
df$BulanAngka <- as.numeric(format(df$Tanggal, "%m"))
df$BulanNama <- format(df$Tanggal, "%B")
# Filter hanya untuk bulan Januari (1), Februari (2), dan Maret (3)
df_bulan123 <- df[df$BulanAngka %in% c(1, 2, 3), ]
# Hitung total penjualan per bulan
library(dplyr)
penjualan_bulanan <- df_bulan123 %>%
group_by(BulanAngka, BulanNama) %>%
summarise(Total = sum(Total, na.rm = TRUE)) %>%
arrange(BulanAngka)
## `summarise()` has grouped output by 'BulanAngka'. You can override using the
## `.groups` argument.
# Plot grafik garis
library(ggplot2)
ggplot(penjualan_bulanan, aes(x=BulanNama, y=Total, group=1)) +
geom_line(color='red', size=1) +
geom_point(color='red', size=3) +
ggtitle("Total Penjualan per Bulan (Jan - Mar)") +
xlab("Bulan") +
ylab("Total Penjualan") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## 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.