1  Pengantar R dan RStudio

Dasar-dasar R untuk Biostatistika

Author

Tim Pengampu Biostatistika

Published

June 1, 2026

1.1 Tujuan Pembelajaran

Setelah sesi ini, mahasiswa akan mampu:

Mengetahui Memahami Melakukan
Operator assignment <- R menyimpan data dalam objek yang dapat diperiksa, disubsetting, dan divisualisasikan Memuat dataset dengan read.delim()
Tipe data (numeric, character, factor, data.frame) Objek yang sama dapat dieksplorasi dengan berbagai cara Memeriksa struktur data dengan str() dan summary()
Fungsi dasar: head(), str(), summary() Membuat visualisasi dasar dengan ggplot2
Paket R dan cara memuatnya (library())

1.2 Mengenal RStudio

RStudio adalah Integrated Development Environment (IDE) untuk R. Saat Anda membuka RStudio, Anda akan melihat empat panel:

Panel Lokasi Fungsi
Console Kiri bawah Tempat R mengeksekusi kode dan menampilkan output
Source Editor Kiri atas Tempat menulis dan menyimpan script (.R files)
Environment Kanan atas Menampilkan objek yang ada di memori R
Files/Plots/Packages/Help Kanan bawah Tab untuk navigasi file, melihat plot, mengelola paket, dan dokumentasi

Think-aloud (I Do): “Saya membuka RStudio dan melihat empat panel. Panel yang paling sering saya gunakan adalah Console untuk menjalankan kode dan Source Editor untuk menulis script panjang. Ketika saya menjalankan kode di Console, objek yang saya buat akan muncul di panel Environment.”

1.3 Objek dan Assignment

Dalam R, kita menyimpan data dalam objek menggunakan operator assignment <-:

# Membuat objek bernama 'x' yang berisi angka 5
x <- 5

# Membuat objek bernama 'nama' yang berisi teks
nama <- "BISB211203"

# Membuat objek bernama 'angka' yang berisi deret angka
angka <- c(1, 2, 3, 4, 5)

# Melihat isi objek
x
[1] 5
nama
[1] "BISB211203"
angka
[1] 1 2 3 4 5

Mengapa <- bukan =? Keduanya bisa digunakan, tetapi <- adalah konvensi R. Ini membuat kode lebih mudah dibaca dan konsisten dengan kode yang ditulis oleh komunitas R.

Self-explanation prompts:
1. Mengapa kita perlu menyimpan data dalam objek? Apa bedanya langsung mengetik 5 + 3 vs x <- 5; x + 3?
2. Apa yang terjadi jika kita menjalankan x <- 10 setelah sebelumnya x <- 5?

1.4 Tipe Data Dasar

R memiliki beberapa tipe data yang penting untuk diketahui:

# Numeric (angka)
panjang <- c(12.5, 13.2, 11.8, 14.0)
class(panjang)  # "numeric"
[1] "numeric"
# Character (teks)
spesies <- c("setosa", "versicolor", "virginica")
class(spesies)  # "character"
[1] "character"
# Factor (kategori)
# Penting untuk data kategorikal dalam statistik
kelompok <- factor(c("A", "B", "A", "C", "B"))
class(kelompok)  # "factor"
[1] "factor"
# Logical (TRUE/FALSE)
hasil <- c(TRUE, FALSE, TRUE)
class(hasil)  # "logical"
[1] "logical"

Mengapa factor penting? Dalam statistik, factor digunakan untuk variabel kategorikal (jenis spesies, perlakuan, jenis tanah). R akan memperlakukan factor secara berbeda dari character — factor memiliki levels (tingkat kategori) yang digunakan dalam analisis.

1.5 Memuat dan Memeriksa Data

1.5.1 Membaca File

# Membaca file TSV
iris_data <- read.delim("assets/data/iris_dataset.tsv")

1.5.2 Memeriksa Struktur Data

# Melihat 6 baris pertama
head(iris_data)
  sepal.length sepal.width petal.length petal.width       class
1          5.1         3.5          1.4         0.2 Iris-setosa
2          4.9         3.0          1.4         0.2 Iris-setosa
3          4.7         3.2          1.3         0.2 Iris-setosa
4          4.6         3.1          1.5         0.2 Iris-setosa
5          5.0         3.6          1.4         0.2 Iris-setosa
6          5.4         3.9          1.7         0.4 Iris-setosa
# Melihat struktur lengkap data
str(iris_data)
'data.frame':   150 obs. of  5 variables:
 $ sepal.length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ sepal.width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ petal.length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ petal.width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ class       : chr  "Iris-setosa" "Iris-setosa" "Iris-setosa" "Iris-setosa" ...
# Melihat ringkasan statistik
summary(iris_data)
  sepal.length    sepal.width     petal.length    petal.width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.054   Mean   :3.759   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       class    
 Length   :150  
 N.unique :  3  
 N.blank  :  0  
 Min.nchar: 11  
 Max.nchar: 15  
                

Think-aloud (I Do): “Saya menjalankan str(iris_data) dan melihat bahwa data ini memiliki 150 observasi dan 5 variabel. Variabel ‘sepal length’ adalah numeric (angka), ‘class’ adalah factor (kategori). Ini penting karena saya akan menggunakan jenis data yang berbeda untuk analisis yang berbeda.”

1.5.3 Hinge Question

Sebelum melanjutkan tutorial ini, coba jawab pertanyaan berikut: Anda menjalankan str(data_mahasiswa) dan melihat output: Factor w/ 3 levels "A","B","C": 1 1 2 3 2 1. Apa arti “Factor w/ 3 levels”?

  1. Data memiliki 3 baris
  2. Kolom ini berisi 3 kategori (variabel kategorikal)
  3. Ada 3 kolom dalam dataset
  4. Nilainya diurutkan 1, 2, 3

Jawaban: B. Ini adalah variabel kategorikal dengan 3 level kategori.

1.6 Subsetting Data

Subsetting berarti mengambil sebagian data dari dataset:

# Mengambil kolom tertentu menggunakan $
iris_data$`sepal.length`
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
 [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
 [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
 [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
 [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
 [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
[109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
[127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
[145] 6.7 6.7 6.3 6.5 6.2 5.9
# Mengambil baris tertentu menggunakan [ ]
iris_data[1:5, ]  # 5 baris pertama, semua kolom
  sepal.length sepal.width petal.length petal.width       class
1          5.1         3.5          1.4         0.2 Iris-setosa
2          4.9         3.0          1.4         0.2 Iris-setosa
3          4.7         3.2          1.3         0.2 Iris-setosa
4          4.6         3.1          1.5         0.2 Iris-setosa
5          5.0         3.6          1.4         0.2 Iris-setosa
# Mengambil kolom dan baris tertentu
iris_data[1:5, 1:3]  # 5 baris pertama, 3 kolom pertama
  sepal.length sepal.width petal.length
1          5.1         3.5          1.4
2          4.9         3.0          1.4
3          4.7         3.2          1.3
4          4.6         3.1          1.5
5          5.0         3.6          1.4
# Filter dengan dplyr
library(dplyr)

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
iris_setosa <- filter(iris_data, `class` == "Iris-setosa")
head(iris_setosa)
  sepal.length sepal.width petal.length petal.width       class
1          5.1         3.5          1.4         0.2 Iris-setosa
2          4.9         3.0          1.4         0.2 Iris-setosa
3          4.7         3.2          1.3         0.2 Iris-setosa
4          4.6         3.1          1.5         0.2 Iris-setosa
5          5.0         3.6          1.4         0.2 Iris-setosa
6          5.4         3.9          1.7         0.4 Iris-setosa

1.7 Visualisasi Dasar dengan ggplot2

1.7.1 Memuat ggplot2

library(ggplot2)

1.7.2 Histogram

ggplot(iris_data, aes(x = `sepal.length`)) +
  geom_histogram(binwidth = 0.5, fill = "steelblue", color = "white") +
  labs(title = "Distribusi Panjang Sepal",
        x = "Panjang Sepal (cm)",
        y = "Frekuensi") +
  theme_minimal()

1.7.3 Boxplot

ggplot(iris_data, aes(x = `class`, y = `sepal.length`, fill = `class`)) +
  geom_boxplot() +
  labs(title = "Perbandingan Panjang Sepal Antar Spesies",
        x = "Spesies",
        y = "Panjang Sepal (cm)") +
  theme_minimal() +
  theme(legend.position = "none")

Think-aloud (I Do): “Dalam ggplot2, saya selalu memulai dengan ggplot(data, aes(...)) yang menentukan data dan aesthetic mapping (x dan y). Kemudian saya menambahkan layer dengan geom_*geom_histogram() untuk distribusi, geom_boxplot() untuk perbandingan kelompok. labs() memberi judul dan label, theme_minimal() memberi tampilan yang bersih.”

1.8 Latihan (You Do)

Sekarang giliran Anda! Ikuti langkah-langkah berikut secara mandiri:

1.8.1 Latihan 1: Eksplorasi Dataset Tapak Dara

  1. Muat dataset morfologi_tapak_dara.tsv:

    tapak_dara <- read.delim("assets/data/morfologi_tapak_dara.tsv")
  2. Periksa struktur data:

    str(tapak_dara)
    summary(tapak_dara)
  3. Buat histogram untuk variabel plant.height:

    ggplot(tapak_dara, aes(x = plant.height)) +
      geom_histogram(binwidth = 5, fill = "forestgreen", color = "white") +
      labs(title = "Distribusi Tinggi Tanaman Tapak Dara",
           x = "Tinggi Tanaman (cm)",
           y = "Frekuensi") +
      theme_minimal()

1.8.2 Latihan 2: Perbandingan Kelompok

  1. Buat boxplot plant.height berdasarkan lokasi (label):

    ggplot(tapak_dara, aes(x = label, y = plant.height, fill = label)) +
      geom_boxplot() +
      labs(title = "Perbandingan Tinggi Tanaman Berdasarkan Lokasi",
           x = "Lokasi",
           y = "Tinggi Tanaman (cm)") +
      theme_minimal() +
      theme(legend.position = "none")
  2. Hitung statistik deskriptif per kelompok:

    tapak_dara %>%
      group_by(label) %>%
      summarise(
        n = n(),
        mean_height = mean(plant.height),
        sd_height = sd(plant.height)
      )

1.8.3 Latihan 3: Challenges

Coba buat visualisasi yang berbeda dari dataset [iris:\\](iris:\ - Histogram untuk petal width
- Boxplot petal length per spesies
- Scatter plot sepal length vs sepal width dengan warna berdasarkan spesies

1.9 Ringkasan

Dalam sesi ini, kita telah mempelajari:
- Empat panel RStudio dan fungsinya
- Objek dan assignment dengan <-
- Tipe data dasar: numeric, character, factor, logical
- Membaca data dengan read.delim()
- Memeriksa data dengan str(), summary(), head()
- Subsetting data dengan $, [ ], dan dplyr::filter()
- Visualisasi dasar dengan ggplot2: histogram dan boxplot

Di sesi berikutnya, kita akan menggunakan kemampuan ini untuk melakukan analisis statistik yang lebih mendalam — dimulai dengan T-test.