email             :
ntraktir          : https://trakteer.id/contekansial
nyawer          : https://saweria.co/contekansial
github            : https://bit.ly/origin-AL-GitHub
youtube         : https://bit.ly/origin-AL-youtube



1 Dasar R

1.1 Membuat Data Frame

Jika kamu memliki data.frame berikut :

AL. <- data.frame(a = c(11, 22, 33), b = c(44, 55, 66), c = c(77, 88, 99))

Bagaimana kamu memunculkan output berikut di R console ?

[1] 44 55 66
[1] 22
[1] 99

Begini :

AL. <- data.frame(a = c(11, 22, 33), b = c(44, 55, 66), c = c(77, 88, 99)) #membuat variabel yang berisi dataframe
AL.
   a  b  c
1 11 44 77
2 22 55 88
3 33 66 99
AL.[[2]] #akses kolom kedua
[1] 44 55 66
AL.[[1]][[2]] #akses kolom pertama, baris kedua
[1] 22
AL.[[3]][[3]] #akses kolom ketiga, baris ketiga
[1] 99

1.2 Membuat Vector dan Index Position

Silakan mengisi bagian ... dengan syntax yang sesuai, sehingga diperoleh output yang diharapkan !

A <- c("merah", "jingga", "hitam", "hijau", "biru", "ungu")          
L <- A...
L

output

[1] "biru" "hitam" "merah"

Begini :

A <- c("merah", "jingga", "hitam", "hijau", "biru", "ungu") #membuat variabel yang berisi vektor
L <- A[c(5,3,1)] #akses indeks ke-n
L
[1] "biru"  "hitam" "merah"

1.3 Mengisi Syntax Factor

Variabel AL adalah suatu factor :

AL <- ...
AL
  1. Isilah ... dengan syntax yang tepat sehingga dihasilkan output berikut :
[1] anggur duku apel panda sirsak mangga
Levels: anggur apel duku mangga panda sirsak
  1. Bagaimana syntax yang tepat untuk memodifikasi AL, jika output yang diharapkan adalah berikut ini :
[1] anggur duku apel anggur sirsak mangga
Levels: anggur apel duku mangga panda sirsak

Begini :

AL <- factor(c("anggur", "duku", "apel", "panda", "sirsak", "mangga")) #membuat variabel berisi factor
AL
[1] anggur duku   apel   panda  sirsak mangga
Levels: anggur apel duku mangga panda sirsak
AL[4] <- "anggur" #mengganti isian factor
AL
[1] anggur duku   apel   anggur sirsak mangga
Levels: anggur apel duku mangga panda sirsak

1.4 Menggunakan Function

Jika terdapat function :

tambah_angka <- function(A, L) {
    A + L
}

dimana A dan L = 4. Bagaimana kamu menggunakan function tersebut sehingga mendapatkan output berikut :

[1] 8

Notes : Pada bagian function, dituliskan dulu (A = ..., L = ...)

Begini :

#membuat fungsi penambahan angka
tambah_angka <- function(A, L) {
  A + L
}
#menggunakan fungsi dengan isian angka 4
tambah_angka(4, 4)
[1] 8

1.5 Mengganti Missing Value

Buatlah sebuah “Fungsi R”, dimana fungsi tersebut dapat digunakan untuk mengganti missing value dari suatu vector dengan nilai mean dari vector tersebut !

Vector dengan missing value (input) :

AL <- c(1, 3, 5, 7, 9, 2, NA, 4, 6, 8, NA)
AL
[1] 1 3 5 7 9 2 NA 4 6 8 NA
ganti.mean <- ...
AL <- ganti.mean(AL)
AL

vector sesudah missing value diganti dengan nilai mean (output) :

[1] 1 3 5 7 9 2 5 4 6 8 5

Begini :

#membuat variabel dataset
AL <- c(1, 3, 5, 7, 9, 2, NA, 4, 6, 8, NA)
AL
 [1]  1  3  5  7  9  2 NA  4  6  8 NA
#membuat fungsi
ganti.mean <- function(i) { #nama fungsi usahakan beda dengan variabel dataset
  i[is.na(i)] <- mean(i, na.rm=TRUE); #cari nilai NA, jika ada ganti dengan nilai mean
  i #simpan nilai
}
#menggunakan fungsi
AL <- ganti.mean(AL)
AL
 [1] 1 3 5 7 9 2 5 4 6 8 5

2 Statistik - Visualisasi dengan R

2.1 Masaslah 1: Langkah Awal

Sebagai seorang data scientist di suatu organisasi lingkungan hidup, kamu diminta untuk melakukan analisa terhadap data hasil observasi dari beberapa pohon cherry. Dataset hasil observasi disimpan di link file. Proses analisa dilakukan dengan R. Adapun tahap - tahap yang perlu dilakukan adalah sebagai berikut :

  1. Load library dan load dataset dengan nama “Pohon_AL”. Adapun library yang diperlukan yaitu readr.

Begini :

library(readr)

Pohon_AL <- read_csv("https://storage.googleapis.com/dqlab-dataset/trees.csv", show_col_types = FALSE)
Pohon_AL
# A tibble: 31 × 3
   Girth Height Volume
   <dbl>  <dbl>  <dbl>
 1   8.3     70   10.3
 2   8.6     65   10.3
 3   8.8     63   10.2
 4  10.5     72   16.4
 5  10.7     81   18.8
 6  10.8     83   19.7
 7  11       66   15.6
 8  11       75   18.2
 9  11.1     80   22.6
10  11.2     75   19.9
# … with 21 more rows

2.2 Mengecek Struktur Data

  • Menampilkan nama kolom dan tipe data setiap kolom.
  • Terdapat kesalahan penulisan untuk kolom Girth, seharusnya nama kolom tersebut adalah Diameter.
  • Satuan dari kolom Girth/ Diameter adalah inch, seharusnya adalah ft, sehingga perlu ditambahkan kolom (diameter.ft) yang berisi hasil konversi inch - ft (1 inch = 0.08333 ft).
  • Memunculkan beberapa baris dari dataset.
  • Menampilkan hasil statistik deskriptif (min, max, - median, mean, dan quartil) untuk semua kolom.
  • Mengecek missing value.

Begini :

#menampilkan nama kolom
names(Pohon_AL)
[1] "Girth"  "Height" "Volume"
#menampilkan tipe data
str(Pohon_AL)
spc_tbl_ [31 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ Girth : num [1:31] 8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
 $ Height: num [1:31] 70 65 63 72 81 83 66 75 80 75 ...
 $ Volume: num [1:31] 10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
 - attr(*, "spec")=
  .. cols(
  ..   Girth = col_double(),
  ..   Height = col_double(),
  ..   Volume = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 
#mengubah nama kolom
names(Pohon_AL)[1] <- "Diameter"
#membuat kolom baru (diameter.ft)
Pohon_AL$diameter.ft <- Pohon_AL$Diameter*0.08333 #konversi inch ke ft
#menampilkan beberapa baris data
head(Pohon_AL)
# A tibble: 6 × 4
  Diameter Height Volume diameter.ft
     <dbl>  <dbl>  <dbl>       <dbl>
1      8.3     70   10.3       0.692
2      8.6     65   10.3       0.717
3      8.8     63   10.2       0.733
4     10.5     72   16.4       0.875
5     10.7     81   18.8       0.892
6     10.8     83   19.7       0.900
#menampilkan hasil Statistik
summary(Pohon_AL)
    Diameter         Height       Volume       diameter.ft    
 Min.   : 8.30   Min.   :63   Min.   :10.20   Min.   :0.6916  
 1st Qu.:11.05   1st Qu.:72   1st Qu.:19.40   1st Qu.:0.9208  
 Median :12.90   Median :76   Median :24.20   Median :1.0750  
 Mean   :13.25   Mean   :76   Mean   :30.17   Mean   :1.1040  
 3rd Qu.:15.25   3rd Qu.:80   3rd Qu.:37.30   3rd Qu.:1.2708  
 Max.   :20.60   Max.   :87   Max.   :77.00   Max.   :1.7166  
#mengecek missing value
is.na(Pohon_AL)
      Diameter Height Volume diameter.ft
 [1,]    FALSE  FALSE  FALSE       FALSE
 [2,]    FALSE  FALSE  FALSE       FALSE
 [3,]    FALSE  FALSE  FALSE       FALSE
 [4,]    FALSE  FALSE  FALSE       FALSE
 [5,]    FALSE  FALSE  FALSE       FALSE
 [6,]    FALSE  FALSE  FALSE       FALSE
 [7,]    FALSE  FALSE  FALSE       FALSE
 [8,]    FALSE  FALSE  FALSE       FALSE
 [9,]    FALSE  FALSE  FALSE       FALSE
[10,]    FALSE  FALSE  FALSE       FALSE
[11,]    FALSE  FALSE  FALSE       FALSE
[12,]    FALSE  FALSE  FALSE       FALSE
[13,]    FALSE  FALSE  FALSE       FALSE
[14,]    FALSE  FALSE  FALSE       FALSE
[15,]    FALSE  FALSE  FALSE       FALSE
[16,]    FALSE  FALSE  FALSE       FALSE
[17,]    FALSE  FALSE  FALSE       FALSE
[18,]    FALSE  FALSE  FALSE       FALSE
[19,]    FALSE  FALSE  FALSE       FALSE
[20,]    FALSE  FALSE  FALSE       FALSE
[21,]    FALSE  FALSE  FALSE       FALSE
[22,]    FALSE  FALSE  FALSE       FALSE
[23,]    FALSE  FALSE  FALSE       FALSE
[24,]    FALSE  FALSE  FALSE       FALSE
[25,]    FALSE  FALSE  FALSE       FALSE
[26,]    FALSE  FALSE  FALSE       FALSE
[27,]    FALSE  FALSE  FALSE       FALSE
[28,]    FALSE  FALSE  FALSE       FALSE
[29,]    FALSE  FALSE  FALSE       FALSE
[30,]    FALSE  FALSE  FALSE       FALSE
[31,]    FALSE  FALSE  FALSE       FALSE

2.3 Shapiro Test

Apakah data hasil observasi ketiga variabel (Height, Volume, diameter.ft) terdistribusi normal ?

Gunakan Shapiro-Wilk’s method untuk mengevaluasi normality dari setiap variabel.

Begini :

#uji normalitas kolom Height
shapiro.test(Pohon_AL$Height)

    Shapiro-Wilk normality test

data:  Pohon_AL$Height
W = 0.96545, p-value = 0.4034
#uji normalitas kolom Volume
shapiro.test(Pohon_AL$Volume)

    Shapiro-Wilk normality test

data:  Pohon_AL$Volume
W = 0.88757, p-value = 0.003579
#uji normalitas kolom diameter.ft
shapiro.test(Pohon_AL$diameter.ft)

    Shapiro-Wilk normality test

data:  Pohon_AL$diameter.ft
W = 0.94117, p-value = 0.08893

Jika nilai p > 0.05, maka distribusi data nya normal. Hasil uji tampak bahwa kolom Volume data nya belum normal.

2.4 Visualisasi Sederhana

Buatlah visualisasi sederhana yang menjelaskan distribusi Volume dari dataset yang sudah dikerjakan sebelumnya.

Untuk menyelesaikan soal ini, diminta untuk menggunakan density plot dari standar R-base.

Begini:

plot(density(Pohon_AL$Volume))

2.5 Mencari Hubungan

Bagaimanakah hubungan antara Volume batang pohon Cherry dengan diameter dan ketinggian (height) ?

Gunakan pula visualisasi sederhana untuk menjelaskan hubungan tersebut.

Begini :

#menggunakan Regresi untuk mencari huubungan antara Volume dengan Tinggi dan Diameter(ft)
lm(formula = Volume ~ Height + diameter.ft, data = Pohon_AL) #perhatikan posisi kolom dalam dataset di rumus Regresi nya

Call:
lm(formula = Volume ~ Height + diameter.ft, data = Pohon_AL)

Coefficients:
(Intercept)       Height  diameter.ft  
   -57.9877       0.3393      56.5002  
#melihat hubungan antara diameter.ft terhadap volume 
plot(Pohon_AL$diameter.ft, Pohon_AL$Volume)

#melihat hubungan antara height terhadap volume
plot(Pohon_AL$Height, Pohon_AL$Volume)


3 Pernyataan Masalah

3.1 Analisa Efek Pemberian Obat Tidur

Selanjutnya, kamu diminta untuk menganalisa efek pemberian obat tidur terhadap peningkatan lamanya waktu tidur dari sekelompok mahasiswa. Berikut preview dari observasi tersebut :

extra group ID
0.7 1 1
-1.6 1 2
-0.2 1 3
-1.2 1 4
-0.1 1 5
3.4 1 6

extra = peningkatan waktu tidur dalam satuan jam (hour) - numeric

group = jenis treatment/dosis obat yang diberikan - factor

ID = ID mahasiswa yang diobservasi - factor

Jika diasumsikan data hasil observasi tersebut terdistribusi normal, lakukanlah uji hipotesis untuk mengetahui apakah terdapat perbedaan efek antara group 1 dan group 2.

  • H0 = Tidak ada perbedaan efek antara group 1 dan group 2
  • H1 = Terdapat perbedaan efek group 1 dan group 2

Begini :

#set library yang dibutuhkan
library("readr")
library("dplyr")

#membuat variabel dataset
Tidur_AL <- read_csv('https://storage.googleapis.com/dqlab-dataset/sleep.csv', show_col_types = FALSE) 
Tidur_AL
# A tibble: 20 × 3
   extra group    ID
   <dbl> <dbl> <dbl>
 1   0.7     1     1
 2  -1.6     1     2
 3  -0.2     1     3
 4  -1.2     1     4
 5  -0.1     1     5
 6   3.4     1     6
 7   3.7     1     7
 8   0.8     1     8
 9   0       1     9
10   2       1    10
11   1.9     2     1
12   0.8     2     2
13   1.1     2     3
14   0.1     2     4
15  -0.1     2     5
16   4.4     2     6
17   5.5     2     7
18   1.6     2     8
19   4.6     2     9
20   3.4     2    10
#simpan data dalam 2 data.frame/vector berbeda
group1 <- filter(Tidur_AL, Tidur_AL$group == 1)
group2 <- filter(Tidur_AL, Tidur_AL$group == 2)

#melakukan t-test
t_test <- t.test(group1$extra, group2$extra)
t_test

    Welch Two Sample t-test

data:  group1$extra and group2$extra
t = -1.8608, df = 17.776, p-value = 0.07939
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.3654832  0.2054832
sample estimates:
mean of x mean of y 
     0.75      2.33 
#cara 2

library("tidyverse")
library(readr)

Bobo_AL <- read_csv('https://storage.googleapis.com/dqlab-dataset/sleep.csv', show_col_types = FALSE)

#langsung t-test tanpa membagi data
t_test <- t.test(extra ~ group, data = Bobo_AL)
t_test

    Welch Two Sample t-test

data:  extra by group
t = -1.8608, df = 17.776, p-value = 0.07939
alternative hypothesis: true difference in means between group 1 and group 2 is not equal to 0
95 percent confidence interval:
 -3.3654832  0.2054832
sample estimates:
mean in group 1 mean in group 2 
           0.75            2.33 

Jika nilai p > 0.05, maka terima H0. Nilai p = 0.08, artinya tidak ada perbedaan efek antara grup 1 dan grup 2.

3.2 Menganalisa Grafik - Boxplot

Menggunakan data di sebelumnya dan library ggplot, buatlah R syntax yang jika dijalankan akan menghasilkan output berupa boxplot !

Begini :

#set library yang digunakan
library("ggplot2")

#membuat boxplot
ggplot(Tidur_AL, aes(x=as.character(group), y=extra, fill=as.character(group))) + geom_boxplot()


4 Pembelajaran Mesin dengan R

4.1 Membuat Model Sederhana

Dataset menyajikan informasi terkait biaya listrik rumah tangga di suatu negara.

Dari data tersebut kamu ingin mengetahui faktor - faktor yang memengaruhi total biaya listrik di setiap rumah tangga.

Buatlah model sederhana yang dapat menjelaskan bagaimana pengaruh num_people dan housearea terhadap amount_paid !

Begini :

#set library yang dibutuhkan
library(readr)

#membuat variabel dataset
tagihan.listrik <- read_csv("https://storage.googleapis.com/dqlab-dataset/electric_bill.csv", show_col_types = FALSE)
head(tagihan.listrik, 9)
# A tibble: 9 × 10
  num_rooms num_pe…¹ house…² is_ac is_tv is_flat ave_m…³ num_c…⁴ is_ur…⁵ amoun…⁶
      <dbl>    <dbl>   <dbl> <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1         3        3    743.     1     1       1   9676.       2       0    560.
2         1        5    953.     0     1       0  35065.       1       1    633.
3         3        1    761.     1     1       1  22292.       0       0    512.
4         0        5    861.     1     1       0  12139.       0       0    333.
5         1        8    732.     0     1       0  17230.       2       1    658.
6         0        5    837.     0     1       1  24662.       2       1    793.
7         4        5    679.     0     1       0  28184.       1       1    570.
8         3        4   1045.     0     0       1  16913.       2       1    585.
9         2        4    714.     1     0       0  26058.       0       1    653.
# … with abbreviated variable names ¹​num_people, ²​housearea,
#   ³​ave_monthly_income, ⁴​num_children, ⁵​is_urban, ⁶​amount_paid
#membuat Regresi untuk mencari hubungan
lm(amount_paid ~  num_people + housearea, data=tagihan.listrik)

Call:
lm(formula = amount_paid ~ num_people + housearea, data = tagihan.listrik)

Coefficients:
(Intercept)   num_people    housearea  
    482.920        4.834        0.118  

4.2 Training dan Testing

Dalam membuat model machine learning, dataset perlu dibagi ke dalam Training dan Testing set. Salah satu library yang digunakan adalah caret.

Dengan menggunakan Iris dataset dan library caret, buatlah syntax untuk membagi dataset tersebut ke dalam training set (80%) dan testing set (20%) !

Begini :

#set library yang dibutuhkan
library(readr)
library(caret)

set.seed(123)

iris.AL <- read_csv("https://storage.googleapis.com/dqlab-dataset/iris.csv", show_col_types = FALSE)
head(iris.AL, 9)
# A tibble: 9 × 5
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
         <dbl>       <dbl>        <dbl>       <dbl> <chr>  
1          5.1         3.5          1.4         0.2 setosa 
2          4.9         3            1.4         0.2 setosa 
3          4.7         3.2          1.3         0.2 setosa 
4          4.6         3.1          1.5         0.2 setosa 
5          5           3.6          1.4         0.2 setosa 
6          5.4         3.9          1.7         0.4 setosa 
7          4.6         3.4          1.4         0.3 setosa 
8          5           3.4          1.5         0.2 setosa 
9          4.4         2.9          1.4         0.2 setosa 
#membagi dataset
trainIndex <- createDataPartition(iris.AL$Species, p=0.8, list=FALSE)
training <- iris.AL[trainIndex, ]
testing <- iris.AL[-trainIndex, ]

dim(training)
[1] 120   5
dim(testing)
[1] 30  5
tail(training, 30)
# A tibble: 30 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
          <dbl>       <dbl>        <dbl>       <dbl> <chr>    
 1          5.8         2.8          5.1         2.4 virginica
 2          6.5         3            5.5         1.8 virginica
 3          7.7         3.8          6.7         2.2 virginica
 4          7.7         2.6          6.9         2.3 virginica
 5          6.9         3.2          5.7         2.3 virginica
 6          5.6         2.8          4.9         2   virginica
 7          7.7         2.8          6.7         2   virginica
 8          6.3         2.7          4.9         1.8 virginica
 9          6.7         3.3          5.7         2.1 virginica
10          7.2         3.2          6           1.8 virginica
# … with 20 more rows
testing
# A tibble: 30 × 5
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <chr>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          5.4         3.9          1.7         0.4 setosa 
 4          5.7         4.4          1.5         0.4 setosa 
 5          4.6         3.6          1           0.2 setosa 
 6          5.5         4.2          1.4         0.2 setosa 
 7          4.9         3.1          1.5         0.2 setosa 
 8          4.9         3.6          1.4         0.1 setosa 
 9          5           3.5          1.6         0.6 setosa 
10          5.1         3.8          1.6         0.2 setosa 
# … with 20 more rows

4.3 Model Decision Tree

Dataset menyajikan informasi terkait profil customer yang pernah membeli mobil keluaran terbaru.

Dataset ini perlu dibagi ke dalam training set dan testing set, dan buatlah machine learning model dengan menggunakan Decision Tree untuk memprediksi customer yang tertarik membeli mobil keluaran terbaru, serta evaluasi performance dari kedua model tersebut.

Begini :

#set library yang dibutuhkan
library(caret) 
library(rpart)
library(readr)

set.seed(123) #membuat pengacakan konsisten

#membuat variabel dataset
beli.AL <- read_csv("https://storage.googleapis.com/dqlab-dataset/suv_data.csv", show_col_types = FALSE)
head(beli.AL, 9)
# A tibble: 9 × 4
  Gender   Age EstimatedSalary Purchased
  <chr>  <dbl>           <dbl>     <dbl>
1 Male      19           19000         0
2 Male      35           20000         0
3 Female    26           43000         0
4 Female    27           57000         0
5 Male      19           76000         0
6 Male      27           58000         0
7 Female    27           84000         0
8 Female    32          150000         1
9 Male      25           33000         0
#membagi data ke training dan testing
trainIndex <- createDataPartition(beli.AL$Purchased, p=0.8, list=FALSE)
training <- beli.AL[trainIndex, ]
testing <- beli.AL[-trainIndex, ]

#membuat model dengan decision tree
pohon_kep <- rpart(Purchased ~ ., data = training, method="class")
prediksi <- predict(pohon_kep, newdata = testing, type = "class")

#evaluasi performance dengan data testing
testing.beli <- factor(testing$Purchased)

#menampilkan hasil evaluasi model 
hasil.eval <- confusionMatrix(prediksi,testing.beli)
hasil.eval
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 53  1
         1  5 21
                                         
               Accuracy : 0.925          
                 95% CI : (0.8439, 0.972)
    No Information Rate : 0.725          
    P-Value [Acc > NIR] : 7.53e-06       
                                         
                  Kappa : 0.822          
                                         
 Mcnemar's Test P-Value : 0.2207         
                                         
            Sensitivity : 0.9138         
            Specificity : 0.9545         
         Pos Pred Value : 0.9815         
         Neg Pred Value : 0.8077         
             Prevalence : 0.7250         
         Detection Rate : 0.6625         
   Detection Prevalence : 0.6750         
      Balanced Accuracy : 0.9342         
                                         
       'Positive' Class : 0