::include_graphics("assets/RStudio_UI.PNG") knitr
Bagian putih dari R Markdown (.Rmd) berguna untuk menulis narasi.
Pada bagian ini dapat ditambahkan heading dengan menambahkan hashtag
#
sebelum kalimat. Narasi yang tidak ditambahkan
#
sebelum kalimat akan menjadi paragraf biasa.
#hahaaha
Bagian abu-abu dari Rmarkdown adalah chunk
. Chunk
berguna untuk menulis code.
# code di sini
1+1
#> [1] 2
Untuk pengolahan data di R, data atau sebuah value dapat
disimpan/diassign ke dalam objek. Untuk assign objek dapat menggunakan
<-
dan hasilnya akan tersimpan pada environment.
# melakukan assignment
<- "Algoritma"
nama
# print isi objek
nama
#> [1] "Algoritma"
# kota <- "Jakarta"
"Algoritma" == "algoritma"
#> [1] FALSE
"Algoritma" == "Algoritma"
#> [1] TRUE
"Algoritma" != "algoritma"
#> [1] TRUE
Untuk memasukkan narasi dalam chunk dapat menggunakan
comment dengan menambahkan #
sebelum
narasi tersebut. Bagian code yang diberi comment tidak akan
dieksekusi.
# ini adalah comment
1+1 # operasi matematika
#> [1] 2
Nilai yang disimpan adalah nilai terakhir yang dieksekusi.
<- "Jakarta"
kota <- "Bandung"
kota <- "Denpasar"
kota <- "Palembang"
kota
<- "Jakarta"
Kota
# ini adalah nilai yang akan disimpan
Panduan untuk penamaan objek:
# contoh penamaan objek sesuai ketentuan R
<- 2018 sales_2018
Buatlah 3 buah object sebagai berikut:
nama
: nama lengkap Andapekerjaan
: pekerjaan Anda saat inikota
: domisili AndaGunakan komentar untuk memperjelas code yang diketikkan
# code here
<- "Fafilia"
nama <- "Instructor DS"
pekerjaan <- "Jakarta Selatan" kota
Sebelum membahas tentang tipe data apa saja yang terdapat di R. Ada 2 fungsi yang akan kita bahas terlebih dahulu, dengan tujuan untuk mempermudah kita dalam berkenalan dengan tipe-tipe data di R.
Fungsi c()
-> combine nilai untuk menyimpan lebih
dari satu nilai
<- c("Rangga", "Mulatua","Gimin","Purwanto","Peter","Fikri") student
Funcsi class()
-> melihat tipe data pada sebuat
object
class(student)
#> [1] "character"
Tipe data yang berisi huruf/karakter.
<- c("Bandung", "Jakarta", "Bogor") tempat
Contoh lain data yang memiliki tipe character:
Tipe data berisi angka yang dapat berupa angka kontinu (ada koma/pecahan), maupun diskrit (bilangan bulat tanpa koma).
<- c(170.5, 165, 168.5)
tinggi class(tinggi)
#> [1] "numeric"
Contoh lain data yang memiliki tipe numeric:
Tipe data berisi angka yang berupa angka diskrit (bilangan bulat tanpa koma). Untuk memaksa numeric menjadi integer, dapat gunakan L dibelakang angka.
<- c(25L, 34L, 27L, 17L)
umur class(umur)
#> [1] "integer"
Contoh lain data yang memiliki tipe integer:
Tipe data yang hanya berisi TRUE
atau
FALSE
. Penulisan TRUE/FALSE dapat disingkat menjadi
T/F.
<- c(TRUE, FALSE, T, F)
status class(status)
#> [1] "logical"
Contoh lain data yang memiliki tipe logical:
Lalu, apa yang akan terjadi jika dalam satu data memiliki beberapa tipe data yang berbeda seperti chunk dibawah ini?
<- c("Algoritma", 2022, TRUE)
mix class(mix)
#> [1] "character"
Bila Anda perhatikan setiap nilai pada object mix
memiliki petik dua, artinya nilai tersebut merupakan
sebuah objek dengan tipe character. Proses perubahan paksa dari suatu
vector bisa disebut sebagai implicit coercion.
Ilustrasi terjadinya implicit coercion dapat dilihat pada gambar di
bawah ini:
::include_graphics("assets/data_type.png") knitr
<- 4+7i
imajiner
class(imajiner)
#> [1] "complex"
<- c(TRUE, 1L, 1/2)
object1 <- c(TRUE, "TRUE", 1, 1.0)
object2 <- c(1, 2, 3, 4L) object3
object1
adalah numericobject2
adalah characterobject3
adalah numericStruktur data merupakan bagaimana data disusun berdasarkan struktur tertentu, pada R terdapat 4 struktur data dasar yaitu vector, matrix, list, dan dataframe.
Vector merupakan salah satu struktur data yang sering digunakan.
Vector merupakan struktur data yang hanya bisa menampung 1 tipe data
saja dan hanya terdiri dari satu dimensi. Fungsi c()
digunakan untuk membuat sebuah vector.
<- c("Sparta Day Online", "Sparta Night Online", "Sparta Night")
kelas levels(kelas)
#> NULL
Factor merupakan bentuk perkembangan dari vector, yang membedakan vector dan factor adalah objek factor memiliki levels. Digunakan untuk tipe data kategorikal.
<- factor(c("Blue", "Gold", "Platinum", "Gold", "Gold"))
card class(card)
#> [1] "factor"
levels(card)
#> [1] "Blue" "Gold" "Platinum"
Contoh Factor yang lain:
Matrix merupakan struktur data yang memiliki 2 dimensi dan hanya bisa diisi dengan 1 tipe data saja.
# tidak perlu fokus pada pembuatan object matrix
<- matrix(data = 11:16, nrow = 3, ncol = 2)
mat mat
#> [,1] [,2]
#> [1,] 11 14
#> [2,] 12 15
#> [3,] 13 16
3,1] mat[
#> [1] 13
List merupakan struktur data yang dapat menyimpan lebih dari 1 tipe data dan hanya memiliki 1 dimensi
# tidak perlu fokus pada pembuatan object list
<- list(c(TRUE, FALSE), "TRUE", c(1, 6, 12), 1L)
our_list our_list
#> [[1]]
#> [1] TRUE FALSE
#>
#> [[2]]
#> [1] "TRUE"
#>
#> [[3]]
#> [1] 1 6 12
#>
#> [[4]]
#> [1] 1
Seperti vector
, sebuah list
hanya memiliki
1 dimensi; namun jika Anda ingin mengakses elemen-elemen data di
dalamnya, Anda dapat menggunakan []
. Meskipun kita sudah
menggunakan []
, kita masih akan mendapatkan objek dengan
struktur data berupa list
:
Jika ingin mengakses element pada list bisa menggunakan tanda
[]
1] our_list[
#> [[1]]
#> [1] TRUE FALSE
Untuk mengakses vector yang ada di dalamnya, maka kita bisa
menggunakan [[]]
:
1]][1] our_list[[
#> [1] TRUE
Data frame merupakan tipe data yang paling sering digunakan dalam
pengolahan data, karena data frame dapat berisi beberapa tipe data serta
memiliki 2 dimensi. Adapun cara untuk membuat sebuah data frame kita
bisa menggunakan fungsi data.frame()
seperti di bawah
ini:
# cara 1: dari vector
<- c("Rany","Fafil")
nama <- c("Palembang","Jakarta")
kota
data.frame(nama=nama, kota=kota)
# cara 2: langsung
data.frame(nama = c("Rany","Fafil"),
kota = c("Palembang","Jakarta"))
Berikut rangkuman dari ke-empat struktur data yang sudah kita bahas di atas:
::include_graphics("assets/structure.png") knitr
——-END OF DAY 1—————–
——-START OF DAY 2—————
Buat sebuah data frame yang berisi 3 baris dengan kolom sebagai berikut:
product_name
: nama produk di pasar swalayan (bebas/yang
sering Anda beli)quantity
: jumlah pembelian masing-masing produkharga
: harga satuan untuk masing-masing produkSimpan pada object yang bernama product
# code here
<- data.frame(product_name = c('indomilk', 'cabai', 'gula'),
product quantity = c(2,3,5),
harga = c(3000,5000,10000))
Fungsi getwd()
untuk mengetahui working directory
(tempat bekerja) dari file Rmd.
getwd()
#> [1] "C:/Users/User/Desktop/Python & R/Algoritma/R/pendekan data/1_programming_for_data_science-main/Inclass P4DS Day1/Inclass P4DS Day1"
Fungsi setwd()
untuk mengatur lokasi dari working
directory.
# setwd("...")
# untuk menjalankan setwd() harap dirun di console
Kita akan menganalisis data retail.csv
yang terdapat
pada folder data_input
. Gunakan fungsi
read.csv()
untuk membaca file CSV ke R, lalu simpanlah ke
sebuah object dengan nama retail
.
<- read.csv('data_input/retail.csv', row.names = "Row.ID") retail
Deskripsi kolom:
Row.ID
= Nomer barisOrder.ID
= Unique ID pemesananOrder.Date
= Tanggal pemesananShip.Date
= Tanggal pengiriman barangShip.Mode
= Jenis pengiriman yang dipilih customerCustomer.ID
= Unique ID customerSegment
= Segmentasi/kategori custoemrProduct.ID
= Unique ID barangCategory
= Kateogri barangSub.Category
= Sub Kategori barangProduct.Name
= Nama produk barangSales
= Total sales dari barang yang dibeli oleh
customerQuantity
= Total barang yang dibeli oleh customerDiscount
= Total diskon yang diberikan kepada
customerProfit
= Total keuntungan yang didapatkan oleh
perusahaanPada umumnya ketika bekerja dengan data kita ingin melihat data
bentuk data secara keseluruhan, hal tersebut dapat dilakukan dengan
menggunakan fungsi View()
.
#View(retail)
Notes: tidak dianjurkan karena apabila data berukuran besar maka berpotensi melambatkan komputer.
Daripada melihat keseluruhan data, lebih baik kita “mengintip” sebagian baris yang dapat merepresentasikan bentuk keseluruhan data.
Fungsi head()
untuk melihat beberapa baris teratas pada
data (default 6)
head(x=retail, n=10)
Fungsi tail()
untuk melihat beberapa data terakhir.
tail(retail,8)
Fungsi str()
untuk melihat struktur dari dataframe.
str(retail)
#> 'data.frame': 9994 obs. of 14 variables:
#> $ Order.ID : chr "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
#> $ Order.Date : chr "11/8/16" "11/8/16" "6/12/16" "10/11/15" ...
#> $ Ship.Date : chr "11/11/16" "11/11/16" "6/16/16" "10/18/15" ...
#> $ Ship.Mode : chr "Second Class" "Second Class" "Second Class" "Standard Class" ...
#> $ Customer.ID : chr "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
#> $ Segment : chr "Consumer" "Consumer" "Corporate" "Consumer" ...
#> $ Product.ID : chr "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
#> $ Category : chr "Furniture" "Furniture" "Office Supplies" "Furniture" ...
#> $ Sub.Category: chr "Bookcases" "Chairs" "Labels" "Tables" ...
#> $ Product.Name: chr "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
#> $ Sales : num 262 731.9 14.6 957.6 22.4 ...
#> $ Quantity : int 2 3 2 5 2 7 4 6 3 5 ...
#> $ Discount : num 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
#> $ Profit : num 41.91 219.58 6.87 -383.03 2.52 ...
Fungsi dim()
untuk mengetahui dimensi dari
dataframe.
dim(retail)
#> [1] 9994 14
Fungsi nrow()
untuk mengetahui jumlah baris, sedangkan
ncol()
untuk mengetahui jumlah kolom.
nrow(retail)
#> [1] 9994
ncol(retail)
#> [1] 14
Fungsi summary()
untuk mengetahui ringkasan/rangkuman
statistik dari dataframe.
summary(retail)
#> Order.ID Order.Date Ship.Date Ship.Mode
#> Length:9994 Length:9994 Length:9994 Length:9994
#> Class :character Class :character Class :character Class :character
#> Mode :character Mode :character Mode :character Mode :character
#>
#>
#>
#> Customer.ID Segment Product.ID Category
#> Length:9994 Length:9994 Length:9994 Length:9994
#> Class :character Class :character Class :character Class :character
#> Mode :character Mode :character Mode :character Mode :character
#>
#>
#>
#> Sub.Category Product.Name Sales Quantity
#> Length:9994 Length:9994 Min. : 0.444 Min. : 1.00
#> Class :character Class :character 1st Qu.: 17.280 1st Qu.: 2.00
#> Mode :character Mode :character Median : 54.490 Median : 3.00
#> Mean : 229.858 Mean : 3.79
#> 3rd Qu.: 209.940 3rd Qu.: 5.00
#> Max. :22638.480 Max. :14.00
#> Discount Profit
#> Min. :0.0000 Min. :-6599.978
#> 1st Qu.:0.0000 1st Qu.: 1.729
#> Median :0.2000 Median : 8.666
#> Mean :0.1562 Mean : 28.657
#> 3rd Qu.:0.2000 3rd Qu.: 29.364
#> Max. :0.8000 Max. : 8399.976
Pada kolom numerik, ditampilkan ringkasan lima nilai (five number summary). Apakah ada insight yang menarik:
head(retail, 10)
str(retail)
summary(retail, 10)
tail(retail, 10)
dim()
ncol()
class()
str()
Tahapan awal sebelum melakukan analisis data adalah memastikan bahwa data yang digunakan sudah bersih. Salah satu teknik data cleansing yaitu mengubah tipe data ke dalam tipe data yang tepat, atau dikenal sebagai istilah explicit coercion.
# cek kembali struktur data retail
str(retail)
#> 'data.frame': 9994 obs. of 14 variables:
#> $ Order.ID : chr "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
#> $ Order.Date : chr "11/8/16" "11/8/16" "6/12/16" "10/11/15" ...
#> $ Ship.Date : chr "11/11/16" "11/11/16" "6/16/16" "10/18/15" ...
#> $ Ship.Mode : chr "Second Class" "Second Class" "Second Class" "Standard Class" ...
#> $ Customer.ID : chr "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
#> $ Segment : chr "Consumer" "Consumer" "Corporate" "Consumer" ...
#> $ Product.ID : chr "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
#> $ Category : chr "Furniture" "Furniture" "Office Supplies" "Furniture" ...
#> $ Sub.Category: chr "Bookcases" "Chairs" "Labels" "Tables" ...
#> $ Product.Name: chr "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
#> $ Sales : num 262 731.9 14.6 957.6 22.4 ...
#> $ Quantity : int 2 3 2 5 2 7 4 6 3 5 ...
#> $ Discount : num 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
#> $ Profit : num 41.91 219.58 6.87 -383.03 2.52 ...
Untuk mengubah tipe data, kita bisa menggunakan fungsi
as.___()
di mana ___
diisi dengan tipe data
tujuan. Contoh:
as.character()
as.Date()
as.integer()
as.numeric()
as.factor()
Diskusi: Dari data retail
, kolom
manakah saja yang perlu diubah tipe datanya?
# explicit coercion
$Ship.Mode = as.factor(retail$Ship.Mode)
retail$Category = as.factor(retail$Category)
retail$Sub.Category = as.factor(retail$Sub.Category)
retail$Segment = as.factor(retail$Segment)
retail
$Order.Date = as.Date(retail$Order.Date, format="%m/%d/%y")
retail$Ship.Date = as.Date(retail$Ship.Date, format="%m/%d/%y") retail
str(retail)
#> 'data.frame': 9994 obs. of 14 variables:
#> $ Order.ID : chr "CA-2016-152156" "CA-2016-152156" "CA-2016-138688" "US-2015-108966" ...
#> $ Order.Date : Date, format: "2016-11-08" "2016-11-08" ...
#> $ Ship.Date : Date, format: "2016-11-11" "2016-11-11" ...
#> $ Ship.Mode : Factor w/ 4 levels "First Class",..: 3 3 3 4 4 4 4 4 4 4 ...
#> $ Customer.ID : chr "CG-12520" "CG-12520" "DV-13045" "SO-20335" ...
#> $ Segment : Factor w/ 3 levels "Consumer","Corporate",..: 1 1 2 1 1 1 1 1 1 1 ...
#> $ Product.ID : chr "FUR-BO-10001798" "FUR-CH-10000454" "OFF-LA-10000240" "FUR-TA-10000577" ...
#> $ Category : Factor w/ 3 levels "Furniture","Office Supplies",..: 1 1 2 1 2 1 2 3 2 2 ...
#> $ Sub.Category: Factor w/ 17 levels "Accessories",..: 5 6 11 17 15 10 3 14 4 2 ...
#> $ Product.Name: chr "Bush Somerset Collection Bookcase" "Hon Deluxe Fabric Upholstered Stacking Chairs, Rounded Back" "Self-Adhesive Address Labels for Typewriters by Universal" "Bretford CR4500 Series Slim Rectangular Table" ...
#> $ Sales : num 262 731.9 14.6 957.6 22.4 ...
#> $ Quantity : int 2 3 2 5 2 7 4 6 3 5 ...
#> $ Discount : num 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
#> $ Profit : num 41.91 219.58 6.87 -383.03 2.52 ...
Parameter format
pada as.Date()
digunakan
untuk menspesifikan format penulisan tanggal pada data, berikut format
yang sering digunakan:
# explicit coercion data waktu
Ketika tipe data kolom sudah tepat, maka summary lebih informatif:
Tambahan: Kolom dengan tipe data date dapat dioperasikan satu sama
lain. Misal kita ingin menghitung durasi waktu antara pemesanan
(Order.Date
) dengan pengiriman (Ship.Date
),
lalu simpan hasil perhitungan ke kolom Duration
.
Fungsi difftime()
digunakan untuk menghitung
time1 - time2
dengan parameter:
time1
: waktu endtime2
: waktu startunits
: satuan waktu hasil pengurangan, bisa diisi
dengan secs
, mins
, hours
,
days
, weeks
# hitung Duration
$Duration <- difftime(time1 = retail$Ship.Date,
retailtime2 = retail$Order.Date,
units = "days")
retail
Fungsi anyNA()
digunakan untuk mengetahui apakah pada
data terdapat missing value.
anyNA(retail)
#> [1] FALSE
#True : there's Missing Value
Fungsi is.na()
digunakan untuk mengecek missing value
pada setiap nilai. Fungsi colSums()
digunakan untuk
menjumlahkan nilai pada setiap kolom.
colSums(is.na(retail))
#> Order.ID Order.Date Ship.Date Ship.Mode Customer.ID Segment
#> 0 0 0 0 0 0
#> Product.ID Category Sub.Category Product.Name Sales Quantity
#> 0 0 0 0 0 0
#> Discount Profit Duration
#> 0 0 0
Kesimpulan:
Proses imputasi missing value lebih dalamnya akan dibahas pada course Machine Learning.
# contoh NA
as.numeric(c(12, 23, "-"))
#> [1] 12 23 NA
Beberapa cara yang dapat dilakukan untuk mengisi NA:
Subsetting adalah teknik untuk mengambil sebagian data yang
diperlukan untuk proses analisis. Gunakan kurung siku []
setelah nama object Untuk melakukan subsetting. Berikut
ilustrasinya:
::include_graphics("assets/subset.png") knitr
Hint: nama_object[index_baris, index_kolom]
Dari data retail
, ambil index baris 10 hingga 20.
10:20,] retail[
Dari data retail
, ambil kolom Ship.Mode
dan
Segment
saja
1:10,c("Ship.Mode","Segment")] retail[
#or
c(4,6)] retail[,
Bagaimana untuk menggabungkan subset baris dan kolom dari dua kasus di atas?
10:20, c("Ship.Date", "Segment")] retail[
Kita dapat menggunakan operator logikal berikut untuk melakukan filter baris berdasarkan kondisi tertentu.
Logical Operator:
>
lebih dari<
kurang dari>=
lebih dari sama dengan<=
kurang dari sama dengan==
mengecek kesamaan 2 nilai!=
tidak sama dengan&
dan|
atauDari data retail
, ambil baris yang memiliki
Profit
lebih dari 4000 lalu ambil kolom
Product.Name
beserta nilai Profit
nya
#*
$Profit>4000,c("Product.Name", "Profit")] retail[retail
Berapa banyak transaksi yang dilakukan oleh Segment
Corporate yang nilai Profit
nya di atas 500?
= retail[retail$Segment == "Corporate"&retail$Profit>500,]
cor500 nrow(cor500)
#> [1] 35
Berapa banyak transaksi yang pengirimannya (Ship.Mode
)
menggunakan Second Class dan Standard Class?
nrow(retail[retail$Ship.Mode=="Second Class"|retail$Ship.Mode=="Standard Class",])
#> [1] 7913
Dengan operator %in%
:
`%!in%` <- Negate("%in%") #untuk yang not.in tidak ada, jadi harus build fucntion dulu ` untuk buat function
$Ship.Mode %!in% c("Second Class", "Standard Class"),] retail[retail
$Ship.Mode %in% c("Second Class", "Standard Class"),] retail[retail
Anda sebagai seorang analis diminta tolong oleh Fulan selaku kepala divisi Sales, untuk menelusuri performa penjualan perusahaan retail ini. Dibawah ini ada, 3 pertanyaan bisnis yang ditanyakan:=
Category
Furniture yang tipe pengirimannya (Ship.Mode
) adalah
Standard Class?nrow(retail[retail$Category=="Furniture"&retail$Ship.Mode=="Standard Class",])
#> [1] 1248
Category
Furniture
yang mengakibatkan kerugian (Profit
kurang dari nol)?= retail[retail$Category=="Furniture"&retail$Profit<0,c("Category", "Profit", "Sub.Category")]
jawaban_nomor_3 nrow(jawaban_nomor_3)
#> [1] 714
summary()
untuk mengetahui
Sub.Category
dari Furniture apa yang paling banyak
menyebabkan kerugian?summary(jawaban_nomor_3)
#> Category Profit Sub.Category
#> Furniture :714 Min. :-1862.3124 Chairs :235
#> Office Supplies: 0 1st Qu.: -97.5393 Tables :203
#> Technology : 0 Median : -31.8521 Furnishings:167
#> Mean : -85.3447 Bookcases :109
#> 3rd Qu.: -12.7580 Accessories: 0
#> Max. : -0.3398 Appliances : 0
#> (Other) : 0
<- retail[retail$Category=="Furniture"&retail$Profit<0,]
furniture_loss sort(summary(furniture_loss$Sub.Category), decreasing = T)
#> Chairs Tables Furnishings Bookcases Accessories Appliances
#> 235 203 167 109 0 0
#> Art Binders Copiers Envelopes Fasteners Labels
#> 0 0 0 0 0 0
#> Machines Paper Phones Storage Supplies
#> 0 0 0 0 0
#untuk mengubah ke data frame agar oritenasiny
as.data.frame(sort(summary(furniture_loss$Sub.Category), decreasing=T))
#untuk mengambil data pada summary di index ke 1 dan 3
summary(furniture_loss$Sub.Category)[c(1,3)]
#> Accessories Art
#> 0 0
Selain subsetting, hal yang sering dilakukan ketika kita melakukan analisis adalah aggregasi data, yaitu membuat tabel rangkuman.
table()
Fungsi table()
untuk menampilkan
frekuensi tiap kategori
Kita sebagai seorang analyst bisa memanfatkan fungsi
table()
untuk mencari tahu Segment
manakah
yang paling banyak melakukan transaksi pada data
retail
?
sort(table(retail$Segment), decreasing = T)
#>
#> Consumer Corporate Home Office
#> 5191 3020 1783
Contoh kasus lain, untuk mencari tahu tipe pengiriman
(Ship.Mode
) apa yang paling banyak digunakan oleh
Segment
consumer?
table(retail$Ship.Mode, retail$Segment)
#>
#> Consumer Corporate Home Office
#> First Class 769 485 284
#> Same Day 317 114 112
#> Second Class 1020 609 316
#> Standard Class 3085 1812 1071
as.data.frame(table(retail$Ship.Mode, retail$Segment))
prop.table()
Mengubah tabel frekuensi menjadi tabel proporsi/persentase untuk tiap kategori.
Sintaks: prop.table(table(...))
Fungsi prop.table()
dalam data retail dapat kita
manfaatkan untuk mengetahui proporsi transaksi untuk masing-masing
Segment
pelanggan.
prop.table(table(retail$Ship.Mode, retail$Segment))*100
#>
#> Consumer Corporate Home Office
#> First Class 7.694617 4.852912 2.841705
#> Same Day 3.171903 1.140684 1.120672
#> Second Class 10.206124 6.093656 3.161897
#> Standard Class 30.868521 18.130879 10.716430
prop.table(table(retail$Segment))*100
#>
#> Consumer Corporate Home Office
#> 51.94116 30.21813 17.84070
Fungsi xtabs()
untuk menampilkan jumlah (sum)
suatu variabel numerik untuk tiap kategori.
Sintaks: xtabs(formula = ..., data = ...)
Parameter:
formula
dituliskan dengan
numerik ~ kategorik
(simbol ~ disebut tilde)data
dituliskan dengan nama object data yang
digunakanDikarenakan fungsi xtabs()
diperuntuhkan untuk
menjumlahkan, kita bisa menggunakannya untuk menghitung jumlah Profit
yang dihasilkan untuk setiap Category!
sort(xtabs(formula=Profit~Category, data=retail),decreasing=T)
#> Category
#> Technology Office Supplies Furniture
#> 145454.95 122490.80 18451.27
xtabs(formula=Sales~Sub.Category, data=retail)
#> Sub.Category
#> Accessories Appliances Art Binders Bookcases Chairs
#> 167380.32 107532.16 27118.79 203412.73 114880.00 328449.10
#> Copiers Envelopes Fasteners Furnishings Labels Machines
#> 149528.03 16476.40 3024.28 91705.16 12486.31 189238.63
#> Paper Phones Storage Supplies Tables
#> 78479.21 330007.05 223843.61 46673.54 206965.53
Fungsi xtabs()
tidak hanya bisa digunakan untuk satu
value saja. Sebagai contoh, kita ingin menghitung jumlah
Sales
yang diperoleh dari masing-masing
Category
dan setiap Segment
.
xtabs(Sales~Category+Segment,retail)
#> Segment
#> Category Consumer Corporate Home Office
#> Furniture 391049.3 229019.8 121930.7
#> Office Supplies 363952.1 230676.5 124418.4
#> Technology 406399.9 246450.1 183304.0
Untuk melakukan aggregasi data dengan fungsi yang lebih fleksibel,
kita dapat menggunakan fungsi aggregate()
.
Fungsi aggregate()
untuk menghitung nilai statistik
tertentu (jumlah, rata-rata, dll) berdasarkan kolom kategori dalam
data.
Sintaks: aggregate(x = ..., data = ..., FUN = ...)
Parameter:
x
dituliskan dengan
numerik ~ kategorik
data
dituliskan dengan nama object data yang
digunakanFUN
dituliskan dengan nama fungsi:
sum
: jumlahmin
: nilai minimummax
: nilai maksimummean
: nilai rata-ratamedian
: nilai tengahlength
: count (menghitung frekuensi)Hitung nilai rata-rata Sales
untuk setiap
Segment
aggregate(x=Sales~Segment, data=retail, FUN=mean)
aggregate(x=Profit~Category,data=retail,FUN=sum)
Hitung nilai rata-rata Sales
untuk setiap
Segment
dan Category
. Tampilkan baris dengan
nilai rata-rata Sales
yang tertinggi dan terendah saja.
<- aggregate(Sales~Segment+Category,retail,mean) agg_sales
order(agg_sales$Sales, decreasing=T)
#> [1] 9 8 7 2 1 3 5 4 6
<- agg_sales[(order(agg_sales$Sales, decreasing=T)),]
agg_sales
rbind(head(agg_sales,1),tail(agg_sales,1))
Gunakan fungsi order()
untuk mengurutkan nilai, perlu
diingat output dari order()
adalah urutan index sehingga
perlu dikombinasikan dengan subsetting []
untuk mengurutkan
object dataframe.
table()
untuk membuat …prop.table()
untuk membuat …xtabs()
untuk membuat …aggregate()
untuk membuat …sort(table(retail$Category),decreasing=T)
#>
#> Office Supplies Furniture Technology
#> 6026 2121 1847
sort(xtabs(Quantity~Category,retail),decreasing=T)
#> Category
#> Office Supplies Furniture Technology
#> 22906 8028 6939
Jika seorang pelanggan memilih tipe pengiriman Second Class, barang yang dikirim pada hari Rabu maka perkiraan akan sampai pada hari …(sabtu)
aggregate(x=Duration~Ship.Mode,data=retail, FUN=median)
xtabs(Profit~Segment+Category,retail)
#> Category
#> Segment Furniture Office Supplies Technology
#> Consumer 6991.079 56330.321 70797.810
#> Corporate 7584.816 40227.320 44166.998
#> Home Office 3875.378 25933.160 30490.141
retail
<- aggregate(Profit~Segment+Category,data=retail,FUN=sum)
agg_profit
order(agg_profit$Profit,decreasing=T),][c(1,9),] agg_profit[
retail
adalah data transaksi dari tahun 2014
sampai 2017. Anda diminta untuk menghitung jumlah keuntungan yang
diperoleh pada setiap kategori barang, namun hanya untuk order yang
terjadi pada tahun 2017 saja (Hint:
Order.Date
di antara tanggal “2017-01-01” dan
“2017-12-31”).<- retail[retail$Order.Date >= as.Date("2017-01-01")&retail$Order.Date <=as.Date("2017-12-31"),]
retail2017
aggregate(x=Profit~Category,retail2017,FUN=sum)
Fungsi sample()
digunakan untuk mengambil beberapa baris
secara acak pada data. Biasanya digunakan pada proses machine
learning.
# contoh sampling sederhana menggunakan vector
<- c("A", "B", "C", "D")
student sample(student, 3) #(object,size)
#> [1] "D" "A" "C"
Fungsi set.seed()
digunakan untuk mengunci random number
generator sehingga hasil sampling tidak berubah setiap kali run code.
Nilai seed yang digunakan bebas, maksimal 10 digit.
set.seed(100)
sample(student, 3)
#> [1] "B" "C" "D"
Tambahan: Untuk sampling dari data.frame, harus dibuat objek berisi index baris yang akan diambil. Index baris dibuat secara random, kemudian diambil baris sesuai index yang sudah dibuat.
Berikut adalah contoh untuk melakukan sampel sebanyak 60% observasi
dari data retail
set.seed(100)
# buat index baris secara random
<- sample(nrow(retail), # jumlah baris data
index nrow(retail)*0.6) # jumlah baris yang ingin diambil: 60%
head(index)
#> [1] 3786 503 3430 3696 4090 7886
retail[index,]
rmdformats
: https://github.com/juba/rmdformats