Modul 2 Analisis Statistika Deskriptif

Setelah mempelajari modul ini, Anda diharapkan dapat mengoperasikan perhitungan persentase/proporsi, rasio, laju, ukuran pemusatan, dan ukuran penyebaran untuk suatu data kuantitatif dengan menggunakan perangkat lunak STP-2.4

Dalam praktikum ini kita akan melanjutkan analisis data terstruktur kita dengan analisis statistika deskriptif untuk variabel-variabel kategoris dan numerik. Kedua jenis variabel ini berkaitan juga dengan tingkat pengukurannya yang terdiri atas nominal, ordinal, dan interval/rasio (metrik).

Analisis statistik deskriptif yang akan kita lakukan mencakup ukuran frekuensi yang diwakili oleh persentase/proporsi, ukuran pemusatan yang diwakili oleh rata-rata (mean), median, dan ukuran penyebaran yang diwakili oleh standar deviasi, persentil, kuartil, dan IQV. Perhitungan IQV akan dilakukan dengan sekaligus mengenalkan mekanisme function di R.

2.1 Persiapan

Seperti biasa, kita perlu memuat library andalan kita dalam mengolah data, tidyverse, dan juga untuk membaca file Excel, openxlsx.

# Memuat library yang diperlukan
library(tidyverse)
library(openxlsx)

Selain itu, kita memerlukan paket gtsummary dan flextable untuk melakukan analisis statistika deskriptif dengan ringkas. Paket ini memiliki perintah tbl_summary() yang dapat mengeluarkan analisis statistika deskriptif secara intuitif berdasarkan jenis data yang kita masukkan.

Untuk meng-install kedua paket tersebut, hapus tanda pagar di depan baris pertama dalam chunk di bawah dan muat paket gtsummary saja.

# install.packages(c("gtsummary", "flextable"))
library(gtsummary)

2.2 Mengimpor Dataset

Kita menggunakan data mahasiswa UBL pada langkah demonstratif praktikum ini. Di Aktivitas Mandiri, kalian akan menggunakan dataset lain.

# Mengeset variabel tersendiri untuk nama file nama sheet
file_dibaca <- "datasets/Data Praktikum 02.xlsx"
sheet_ubl <- "DataUtama_mhsUBL"

# Mengimpor file menjadi dataset memanfaatkan variabel nama file dan nama sheet yang kita buat tadi
data_ubl <- read.xlsx(file_dibaca, sheet = sheet_ubl)

Aktivitas Mandiri 1: Mengimpor Data UNILA

Impor dataset mahasiswa UNILA dari file dan sheet yang sama:

  1. Gunakan variabel file_dibaca yang sudah ada (file Excel-nya sama)
  2. Buat variabel sheet_unila dengan isi "DataUtama_mhsUNILA"
  3. Impor dataset ke variabel data_unila
  4. Verifikasi dengan glimpse(data_unila) — perhatikan nama-nama variabelnya

2.3 Praktik Operator Pipa (Pipe Operator)

Sebelum kita bisa menganalisis data, kita perlu merapikannya terlebih dahulu. Dua hal yang lazim dilakukan adalah mengganti nama variabel dan membuang baris yang datanya tidak lengkap. Mari kita praktikkan sambil mengenal salah satu fitur terpenting di tidyverse: pipe operator (|>). Kita sudah dikenalkan dengan operator ini pada subbab 0.11, dan di sini kita akan langsung mempraktikkannya bersama.

2.3.1 Memahami Konsep Pipe Operator

Untuk memahami konsep pipe operator, mari kita praktikkan kasus berikut dengan dua cara, yakni yang tanpa dan dengan pipe operator.

Kita akan mencoba menelusuri struktur dataset kita — khususnya kolom-kolom yang berhubungan dengan kepemilikan kendaraan saja. Untuk itu, kita perlu: (1) menyeleksi kolom-kolom yang kita butuhkan saja dengan select(), lalu (2) melihat hasilnya dengan glimpse().

Perhatikan dua cara untuk melakukan dua langkah tersebut.

CARA 1: KONVENSIONAL

# Langkah 1: Seleksi kolom kepemilikan kendaraan, simpan ke variabel sementara
data_kendaraan <- select(
  data_ubl,
  kepemilikan.mobil, kepemilikan.motor
)

# Langkah 2: Baru bisa melihat hasilnya dari variabel sementara
glimpse(data_kendaraan)
## Rows: 379
## Columns: 2
## $ kepemilikan.mobil <dbl> 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, NA, 0, 0, 1, 0, 0, 0, 0…
## $ kepemilikan.motor <dbl> 2, 1, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 0, 1,…

CARA 2: MENGGUNAKAN PIPE OPERATOR

# Seleksi kolom dan langsung lihat hasilnya — tanpa variabel sementara
data_ubl |>
  select(kepemilikan.mobil, kepemilikan.motor) |>
  glimpse()
## Rows: 379
## Columns: 2
## $ kepemilikan.mobil <dbl> 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, NA, 0, 0, 1, 0, 0, 0, 0…
## $ kepemilikan.motor <dbl> 2, 1, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 0, 1,…

Dalam cara 1, kita terpaksa membuat variabel perantara data_kendaraan hanya untuk meneruskan hasil select() ke glimpse(). Variabel ini tidak kita butuhkan untuk keperluan lain — hanya agar kedua langkah bisa terhubung. Operator pipa (|>) memungkinkan kita merangkai kedua proses itu secara langsung, tanpa variabel perantara, dengan alur yang mengalir dari atas ke bawah.

Berikut adalah penjelasan cara-2:

  • data_ubl |>: perintah “Ambil dataset data_ubl.”

  • Kirimkan dataset itu ke fungsi select() untuk menyeleksi kolom yang diinginkan.

  • Hasil seleksi langsung dikirimkan ke glimpse() untuk ditampilkan — tidak perlu disimpan ke variabel baru.

💡 Tip

Pipe operator dapat dimasukkan dengan kombinasi tombol Ctrl + Shift + M di keyboard.

2.3.2 Mengganti Nama Variabel dan Menghilangkan Missing Values Sekaligus dengan Pipe Operator

Keunggulan ini semakin terasa ketika kita mulai merangkai lebih banyak langkah sekaligus. Misalnya, kita perlu merapikan dataset UBL kita dengan beberapa pekerjaan berbeda: (1) memilih beberapa kolom yang akan dianalisis dengan select(), (2) mengganti nama beberapa variabel dengan rename(), dan (3) membuang baris yang mengandung nilai kosong atau hilang (missing values) dengan drop_na() dari paket tidyr.

Dengan pipe operator, ketiga pekerjaan itu bisa dirangkai dalam satu alur yang mengalir dari atas ke bawah:

# Membaca ulang dataset supaya menjadi kondisi semula
data_ubl <- read.xlsx(file_dibaca, sheet = sheet_ubl)

# Mengganti nama variabel, lalu langsung membuang missing values dalam satu alur
data_ubl <- data_ubl |>
  select(Kampus_PT, Jenis.Kelamin,
         Umur, Tingkat.Semester,
         biaya.dalam.seminggu, Jumlah.perjalanan.Senin, `jarak.(km)`) |>
  rename(kampus = Kampus_PT,
         jenis_kelamin = Jenis.Kelamin,
         umur = Umur,
         tingkat_semester = Tingkat.Semester,
         biaya_dalam_sepekan = biaya.dalam.seminggu,
         jumlah_perjalanan_senin = Jumlah.perjalanan.Senin,
         jarak = `jarak.(km)`) |>
  drop_na()
  • data_ubl |>: ambil dataset data_ubl.
  • select(...): pilih kolom-kolom yang akan dianalisis.
  • rename(...): ganti nama kolom-kolom yang akan dianalisis.
  • drop_na(): buang baris yang datanya tidak lengkap.
  • Hasil akhir disimpan kembali ke data_ubl.

Bayangkan jika ini dilakukan secara konvensional: setiap langkah membutuhkan penulisan nama dataset atau variabel perantara baru — semakin banyak langkahnya, semakin panjang dan rawan salah kodenya.

Aktivitas Mandiri 2: Merapikan Dataset UNILA dengan Pipe Operator

Dengan satu blok kode menggunakan pipe operator |>:

  1. Baca dataset UNILA dari file_dibaca dan sheet_unila
  2. Pilih variabel Kampus_PT, Jenis.Kelamin, Umur, Uang.Saku, Tingkat.Semester, Biaya.perjalanan, Jumlah.Perjalanan.Senin, jara
  3. Ubah nama variabel-variabel tersebut seperti berikut:
    1. Kampus_PT menjadi kampus
    2. Jenis.Kelamin menjadi jenis_kelamin
    3. Umur menjadi umur
    4. Uang.Saku menjadi uang_saku
    5. Tingkat.Semester menjadi tingkat_semester
    6. Biaya.perjalanan menjadi biaya_dalam_sepekan
    7. Jumlah.Perjalanan.Senin menjadi jumlah_perjalanan_senin
    8. jara menjadi jarak
  4. Buang baris yang mengandung missing values dengan drop_na()
  5. Simpan hasilnya ke variabel data_unila_bersih
  6. Verifikasi dengan glimpse(data_unila_bersih) — pastikan tidak ada NA

2.4 Membuat Factor

Sekarang mari kita kembali ke dataset UBL yang sudah bersih. Sebelumnya kita sudah melihat dataset kita dengan glimpse(). Kali ini, mari kita coba perintah lain bernama summary() — perintah bawaan R (base R) yang dapat meringkas isi dataset.

# Melihat ringkasan dataset sebelum variabel kategoris diubah menjadi factor
summary(data_ubl)
##     kampus          jenis_kelamin           umur       tingkat_semester  
##  Length:335         Length:335         Min.   :18.00   Length:335        
##  Class :character   Class :character   1st Qu.:20.00   Class :character  
##  Mode  :character   Mode  :character   Median :21.00   Mode  :character  
##                                        Mean   :20.74                     
##                                        3rd Qu.:22.00                     
##                                        Max.   :23.00                     
##  biaya_dalam_sepekan jumlah_perjalanan_senin     jarak         
##  Min.   :  5.00      Min.   :1.000           Min.   : 0.06352  
##  1st Qu.: 50.00      1st Qu.:2.000           1st Qu.: 1.31127  
##  Median : 70.00      Median :2.000           Median : 2.71347  
##  Mean   : 97.93      Mean   :2.684           Mean   : 3.37000  
##  3rd Qu.:120.00      3rd Qu.:4.000           3rd Qu.: 4.71515  
##  Max.   :600.00      Max.   :8.000           Max.   :43.54519

Dari output tersebut, perhatikan dua pola yang berbeda:

  • Variabel angka seperti umur atau biaya_dalam_sepekan menampilkan Min., 1st Qu., Median, Mean, 3rd Qu., dan Max. — ini adalah ukuran-ukuran pemusatan dan penyebaran data numerik.

  • Variabel teks (character) seperti jenis_kelamin atau tingkat_semester hanya menampilkan Length, Class, dan Mode — R belum tahu apa nilai-nilai yang ada di sana, sehingga hanya bisa memberikan informasi panjang datanya saja.

Bagaimana agar R bisa menampilkan frekuensi tiap nilai, seperti berapa banyak Laki-Laki dan berapa banyak Perempuan di variabel jenis_kelamin? Caranya adalah dengan mengubah tipe variabel tersebut menjadi factor agar R mengenalinya sebagai variabel kategoris dengan nilai-nilai yang terdefinisi.

Contoh pertama kita adalah variabel yang paling mudah: jenis_kelamin.

Sebelum membuat vektor, kita perlu mengecek terlebih dahulu nilai-nilai apa yang sebenarnya tersimpan di dalam dataset — persis seperti yang tertulis, termasuk huruf besar dan kecilnya. Kita akan menggunakan perintah table() untuk mengecek nilai-nilai unik yang ada di variabel jenis_kelamin.

# Cek nilai-nilai unik yang ada di variabel jenis_kelamin
table(data_ubl$jenis_kelamin)
## 
## Laki-Laki Perempuan 
##       167       168

Dari output di atas, kita tahu bahwa nilai yang tersimpan adalah "Laki-Laki" dan "Perempuan" — bukan "Laki-laki". Vektor yang kita buat harus menuliskan nilai-nilai itu persis sama, karakter per karakter.

# Membuat vektor dengan nilai yang PERSIS SAMA seperti di data
jk <- c("Laki-Laki", "Perempuan")

# Mengubah jenis variabel "Jenis.Kelamin" dari chr ke fct dengan 'mutate()'
data_ubl <- data_ubl |>
  mutate(jenis_kelamin = factor(jenis_kelamin, levels = jk))

# Mengecek hasil
glimpse(data_ubl)
## Rows: 335
## Columns: 7
## $ kampus                  <chr> "UBL", "UBL", "UBL", "UBL", "UBL", "UBL", "UBL"…
## $ jenis_kelamin           <fct> Perempuan, Laki-Laki, Laki-Laki, Laki-Laki, Per…
## $ umur                    <dbl> 21, 20, 21, 22, 21, 22, 22, 22, 22, 22, 22, 19,…
## $ tingkat_semester        <chr> "4 (Semester 7 - Semester 8)", "3 (Semester 5 -…
## $ biaya_dalam_sepekan     <dbl> 25, 200, 50, 20, 40, 70, 35, 50, 350, 50, 30, 3…
## $ jumlah_perjalanan_senin <dbl> 2, 3, 1, 2, 3, 2, 4, 4, 3, 2, 4, 2, 2, 2, 1, 1,…
## $ jarak                   <dbl> 4.2237967, 2.7033310, 3.2370722, 3.0023362, 2.9…

Berikut adalah penjelasan dari perintah pembuatan factor di atas:

mutate(jenis_kelamin = factor(jenis_kelamin, levels = jk))
  • mutate(...) — perintah untuk mengubah atau menambah variabel dalam dataset. Di sini kita menimpa variabel jenis_kelamin yang sudah ada dengan versi barunya.

  • jenis_kelamin = ... — bagian kiri = adalah nama variabel yang akan diubah/dibuat. Kita bisa menuliskan nama variabel baru di sini. Misalnya jika kita ingin mengubah nama variabelnya menjadi jenis_kelamin, maka perintahnya akan menjadi mutate(jenis_kelamin = factor(jenis_kelamin, jk)).

  • factor(jenis_kelamin, levels = jk) — perintah yang mengubah tipe variabel menjadi factor, dengan:

    • argumen pertama (jenis_kelamin): variabel yang ingin diubah,
    • argumen kedua (levels = jk): vektor yang berisi nilai-nilai yang diizinkan, disebut levels.

Kita sudah berhasil menjadikan variabel jenis_kelamin sebagai factor. Selanjutnya, kita akan mengubah variabel-variabel kategoris lain menjadi factor juga. Variabel kategoris lain yang kita belum kita ubah menjadi factor adalah tingkat_semester. .

Sekarang kita akan mengecek nilainya dua cara: (1) perintah table() dan (2) perintah count() yang dipadukan dengan pipe operator dari paket tidyverse().

Cara #1: Perintah table() dari base R

# Cara #1
table(data_ubl$tingkat_semester)
## 
## 1 (Semester 1 – Semester 2) 2 (Semester 3 – Semester 4) 
##                          35                          50 
## 3 (Semester 5 - Semester 6) 4 (Semester 7 - Semester 8) 
##                          65                         185

Cara #2: Perintah count() dari tidyverse

# Cara #2
data_ubl |>
  count(tingkat_semester)
##              tingkat_semester   n
## 1 1 (Semester 1 – Semester 2)  35
## 2 2 (Semester 3 – Semester 4)  50
## 3 3 (Semester 5 - Semester 6)  65
## 4 4 (Semester 7 - Semester 8) 185

Kemudian kita buat vektor-vektor yang menyimpan nilai-nilai yang mungkinnya.

⚠️ Hati-hati!

Cara ini rawan kesalahan karena kita mengandalkan penglihatan dan tangan kita untuk menuliskan vektornya secara manual. Oleh karena itu, kita akan menggunakan cara yang lebih otomatis seperti berikut.

Agar kita dapat menghasilkan vektor nilai-nilai dalam kategori tanpa mengetik ulang nilai-nilai tersebut satu per satu, kita akan menjalankan sintaks sesuai cara #1 atau #2 sebagai berikut.

Cara #1: Membuat vektor nilai kategori dari table()

Fungsi names() dapat membantu kita mengambil nama-nama kolom dari hasil table() — yang sama persis dengan nilai-nilai unik dalam kategori — dan menyimpannya langsung sebagai vektor.

## Mengambil nama-nama kategori dari table() dan menyimpannya sebagai vektor
tingkat <- names(table(data_ubl$tingkat_semester))
tingkat
## [1] "1 (Semester 1 – Semester 2)" "2 (Semester 3 – Semester 4)"
## [3] "3 (Semester 5 - Semester 6)" "4 (Semester 7 - Semester 8)"

Dengan cara ini, kita tidak perlu mengetik ulang nilai-nilai kategorinya secara manual. Cukup jalankan names(table(...)), dan nilai-nilai itu langsung tersimpan ke variabel vektor kita.

⚠️ Perhatian untuk Variabel Ordinal

Untuk variabel ordinal, urutan nilai dalam vektor sangat penting karena menentukan tingkatan (levels) dari factor. Fungsi names(table(...)) mengurutkan nilainya secara alfabetis, bukan berdasarkan tingkatan yang bermakna. Pastikan mengurutkan ulang isi vektor secara manual setelah mengambilnya jika urutan kategorinya penting.

Jika terjadi perbedaan urutan tersebut, kita bisa selesaikan dengan manipulasi vektor sebagai berikut

# Vektor yang berantakan
contoh <- c("<10", "20-30", "10-20", ">40", "30-40")

# mengurutkan secara mentah terlebih dahulu
contoh <- sort(contoh)

# ambil ">40" jadi satu variabel tersendiri
akhir <- contoh[2]

# menggabungkan contoh yang sudah kita ambil elemen keduanya
# dan menggabungkannya dengan variabel tersendiri tadi 
contoh <- c(contoh[-2], akhir)

Cara #2: Membuat vektor nilai kategori dari count()

Jika kita menggunakan count() dari tidyverse, kita dapat menggunakan fungsi pull() untuk mengambil nama-nama kategori dari hasil count() dan menyimpannya langsung sebagai vektor.

# Mengambil nama-nama kategori dari count() dan menyimpannya sebagai vektor
tingkat <- data_ubl |>
  count(tingkat_semester) |>
  pull(tingkat_semester)
tingkat
## [1] "1 (Semester 1 – Semester 2)" "2 (Semester 3 – Semester 4)"
## [3] "3 (Semester 5 - Semester 6)" "4 (Semester 7 - Semester 8)"

Berdasarkan hasil kedua cara, urutan kategori kita sudah sesuai dengan urutan tingkatan semester. Oleh karena itu, kita bisa langsung mengaplikasikan vektor tingkat ke dalam variabel tingkat_semester.

Penting untuk diingat bahwa variabel tingkat_semester adalah variabel ordinal, sehingga perlu menggunakan atribut ordered = TRUE agar urutan tingkatan semester sama seperti yang kita tetapkan.

# Mengubah variabel-variabel tersebut menjadi factor
data_ubl <- data_ubl |>
  mutate(
    tingkat_semester = factor(tingkat_semester,
      levels = tingkat,
      ordered = TRUE
    )
  )

# Mengecek hasil
glimpse(data_ubl)
## Rows: 335
## Columns: 7
## $ kampus                  <chr> "UBL", "UBL", "UBL", "UBL", "UBL", "UBL", "UBL"…
## $ jenis_kelamin           <fct> Perempuan, Laki-Laki, Laki-Laki, Laki-Laki, Per…
## $ umur                    <dbl> 21, 20, 21, 22, 21, 22, 22, 22, 22, 22, 22, 19,…
## $ tingkat_semester        <ord> 4 (Semester 7 - Semester 8), 3 (Semester 5 - Se…
## $ biaya_dalam_sepekan     <dbl> 25, 200, 50, 20, 40, 70, 35, 50, 350, 50, 30, 3…
## $ jumlah_perjalanan_senin <dbl> 2, 3, 1, 2, 3, 2, 4, 4, 3, 2, 4, 2, 2, 2, 1, 1,…
## $ jarak                   <dbl> 4.2237967, 2.7033310, 3.2370722, 3.0023362, 2.9…

Sekarang, tipe data untuk variabel-variabel kategoris kita tadi sudah menampilkan <fct> yang berarti “factor”. Variabel ordinal diidentifikasi dengan tipe <ord>.

Kita dapat mengecek urutan factor kita dengan perintah levels() berikut.

# Mengecek hasil dengan mengidentifikasi level factor untuk data kategoris-ordinal
levels(data_ubl$jenis_kelamin)
## [1] "Laki-Laki" "Perempuan"
levels(data_ubl$tingkat_semester)
## [1] "1 (Semester 1 – Semester 2)" "2 (Semester 3 – Semester 4)"
## [3] "3 (Semester 5 - Semester 6)" "4 (Semester 7 - Semester 8)"

Sekarang, mari kita buktikan apa yang terjadi pada summary() setelah kita mengubah variabel kategoris menjadi factor. Bandingkan dengan hasil sebelumnya!

# Melihat ringkasan dataset SETELAH variabel kategoris diubah menjadi factor
summary(data_ubl)
##     kampus            jenis_kelamin      umur      
##  Length:335         Laki-Laki:167   Min.   :18.00  
##  Class :character   Perempuan:168   1st Qu.:20.00  
##  Mode  :character                   Median :21.00  
##                                     Mean   :20.74  
##                                     3rd Qu.:22.00  
##                                     Max.   :23.00  
##                     tingkat_semester biaya_dalam_sepekan jumlah_perjalanan_senin
##  1 (Semester 1 – Semester 2): 35     Min.   :  5.00      Min.   :1.000          
##  2 (Semester 3 – Semester 4): 50     1st Qu.: 50.00      1st Qu.:2.000          
##  3 (Semester 5 - Semester 6): 65     Median : 70.00      Median :2.000          
##  4 (Semester 7 - Semester 8):185     Mean   : 97.93      Mean   :2.684          
##                                      3rd Qu.:120.00      3rd Qu.:4.000          
##                                      Max.   :600.00      Max.   :8.000          
##      jarak         
##  Min.   : 0.06352  
##  1st Qu.: 1.31127  
##  Median : 2.71347  
##  Mean   : 3.37000  
##  3rd Qu.: 4.71515  
##  Max.   :43.54519

Perhatikan perbedaannya: variabel-variabel yang tadi hanya menampilkan Length, Class, dan Mode, sekarang sudah menampilkan frekuensi tiap nilai karena R sudah mengenali nilai-nilai yang mungkin ada di variabel tersebut. Inilah kegunaan utama factor — selain memperbaiki analisis, ia juga membuat ringkasan data kita menjadi jauh lebih informatif.

Aktivitas Mandiri 3: Membuat Factor untuk Variabel Kategoris UNILA

Untuk dataset UNILA yang sudah dibersihkan (data_unila_bersih):

  1. Gunakan table() atau count() untuk mengecek nilai-nilai unik dari variabel-variabel kategoris berikut:
    • kampus
    • uang_saku
    • jenis_kelamin
    • tingkat_semester
  2. Buat vektor untuk masing-masing variabel di atas (perhatikan variabel ordinal!) menggunakan salah satu cara yang sudah kita pelajari.
    • kampus menjadi kampus_levels
    • uang_saku menjadi uang_saku_levels
    • jenis_kelamin menjadi jenis_kelamin_levels
    • tingkat_semester menjadi tingkat_semester_levels
    • gunakan perintah berikut untuk memperbaiki uang_saku_levels
    uang_saku_levels <- c(uang_saku_levels[4], uang_saku_levels[-4])
  3. Gunakan mutate() untuk mengubah variabel-variabel tersebut menjadi factor
  4. Verifikasi dengan glimpse() untuk memastikan tipenya <fct> atau <ord>
  5. Jalankan summary(data_unila_bersih) — bandingkan tampilan sebelum dan sesudah factor!

2.5 Analisis Statistika Deskriptif

Seperti yang sudah kita pelajari di kelas, analisis statistika deskriptif yang kita praktikkan di sini dibagi menjadi tiga kelompok besar: ukuran frekuensi, ukuran pemusatan, dan ukuran penyebaran. Kita akan menggunakan fungsi tbl_summary() dari paket gtsummary sebagai alat utama, yang selalu kita teruskan ke as_flex_table() untuk menghasilkan tabel yang rapi.

2.5.1 Ukuran Frekuensi (Persentase/Proporsi)

Ukuran frekuensi digunakan untuk variabel kategoris dan menjawab pertanyaan: “Seberapa banyak tiap kategori?” Kita cukup memasukkan variabel-variabel kategoris ke dalam tbl_summary() melalui atribut include. Fungsi ini akan secara otomatis menampilkan frekuensi setiap nilai beserta persentasenya.

data_ubl |>
  tbl_summary(include = c(
    jenis_kelamin,
    kampus,
    tingkat_semester
  )) |>
  as_flex_table()

Characteristic

N = 3351

jenis_kelamin

Laki-Laki

167 (50%)

Perempuan

168 (50%)

kampus

UBL

335 (100%)

tingkat_semester

1 (Semester 1 – Semester 2)

35 (10%)

2 (Semester 3 – Semester 4)

50 (15%)

3 (Semester 5 - Semester 6)

65 (19%)

4 (Semester 7 - Semester 8)

185 (55%)

1n (%)

Untuk menampilkan ukuran lainnya, kita dapat memanfaatkan atribut statistic dan ukuran yang termasuk ke dalam ukuran frekuensi:

  • {n}: jumlah data
  • {p}: persentase data
  • {N}: jumlah data total
  • {P}: persentase data total

Untuk menampilkan proporsi, kita dapat menambahkan atribut modify_fmt_fun() untuk mengubah cara kolom statistik ditampilkan menjadi berskala 0–1.

data_ubl |>
  tbl_summary(include = c(
    jenis_kelamin,
    kampus,
    tingkat_semester
  ),
  statistic = list(
    all_categorical() ~ "{p}"
  )) |>
  modify_fmt_fun(
    stat_0 ~ function(x) style_number(as.numeric(x) / 100, digits = 3)
  ) |>
  as_flex_table()

Characteristic

N = 3351

jenis_kelamin

Laki-Laki

0.500

Perempuan

0.500

kampus

UBL

1.000

tingkat_semester

1 (Semester 1 – Semester 2)

0.100

2 (Semester 3 – Semester 4)

0.150

3 (Semester 5 - Semester 6)

0.190

4 (Semester 7 - Semester 8)

0.550

1%

Berikut adalah penjelasan sintaks dari setiap bagian kode di atas:

  • statistic = list(all_categorical() ~ "{p}") — meminta tbl_summary() untuk menampilkan nilai {p} (persentase, skala 0–100) untuk semua variabel kategoris sekaligus, tanpa harus menuliskan setiap variabel satu per satu.

  • modify_fmt_fun(stat_0 ~ ...) — fungsi modify_fmt_fun() digunakan untuk mengubah cara kolom statistik ditampilkan setelah tabel dibuat. stat_0 merujuk pada kolom statistik pertama yang dihasilkan tbl_summary().

  • function(x) style_number(as.numeric(x) / 100, digits = 3) — fungsi anonim yang diterapkan pada setiap nilai di kolom stat_0. Nilai persentase dibagi 100 untuk dikonversi menjadi proporsi (0–1), lalu diformat dengan style_number() menjadi 3 angka desimal.

2.5.2 Interpretasi Hasil Tabel Persentase/Proporsi

Seperti yang sudah dipelajari di kelas, ukuran frekuensi menampilkan ukuran relatif dari tiap kategori, alih-alih frekuensi absolut. Hal ini bertujuan agar frekuensi dapat diperbandingkan dengan objektif.

Kita dapat menafsirkan hasil persentase/proporsi sebagai berikut:

  • kategori dominan/minor. angka persentase/proporsi yang mendekati 100% menunjukkan kategori dominan, sedangkan angka persentase/proporsi yang mendekati 0% menunjukkan kategori minor.

kita dapat mengenali kategori dominan jika proporsi kategori tersebut lebih besar dari 100%/jumlah kategori. sebagai contoh, jika terdapat 3 kategori, maka kategori dominan adalah kategori yang memiliki proporsi lebih besar dari 100%/3 = 33.33%.

  • ketimpangan frekuensi. ketimpangan frekuensi terjadi ketika proporsi satu kategori jauh lebih besar dari kategori lainnya. hal ini menunjukkan bahwa data tidak terdistribusi secara merata di antara kategori-kategori tersebut.

  • perbandingan dua kelompok yang objektif. proporsi memungkinkan kita untuk membandingkan frekuensi antar kelompok secara objektif, terlepas dari ukuran sampel yang berbeda. sebagai contoh, jika kelompok a memiliki 100 responden dan kelompok b memiliki 200 responden, kita dapat membandingkan proporsi tiap kategori untuk mengetahui apakah terdapat perbedaan yang signifikan antar kelompok.

2.5.3 Ukuran Pemusatan (Mean dan Median)

Ukuran pemusatan digunakan untuk variabel numerik dan menjawab pertanyaan: “Di mana titik tengah data kita?” Secara default, tbl_summary() sudah otomatis menampilkan median beserta kuartil untuk variabel numerik.

data_ubl |>
  tbl_summary(include = c(
    jumlah_perjalanan_senin,
    jarak
  )) |>
  as_flex_table()

Characteristic

N = 3351

jumlah_perjalanan_senin

1

45 (13%)

2

131 (39%)

3

71 (21%)

4

72 (21%)

5

9 (2.7%)

6

4 (1.2%)

7

2 (0.6%)

8

1 (0.3%)

jarak

2.71 (1.31, 4.74)

1n (%); Median (Q1, Q3)

Perlu diperhatikan, tbl_summary menampilkan persentase tiap nilai jumlah_perjalanan_senin seolah-olah variabel kategoris — hal ini terjadi karena nilainya bertipe numerik dengan sedikit kategori unik. Untuk memaksanya ditampilkan sebagai variabel kontinu, kita gunakan atribut type.

Kita juga bisa memilih ukuran pemusatan spesifik yang ingin ditampilkan melalui atribut statistic:

data_ubl |>
  tbl_summary(
    include = c(jumlah_perjalanan_senin, jarak),
    type = list(jumlah_perjalanan_senin ~ "continuous"),
    digits = list(jumlah_perjalanan_senin ~ 0),
    statistic = list(
      jumlah_perjalanan_senin ~ "{median}",  # hanya median
      jarak ~ "{mean}, {median}"                # mean dan standar deviasi
    )
  ) |>
  as_flex_table()

Characteristic

N = 3351

jumlah_perjalanan_senin

2

jarak

3.37, 2.71

1Median; Mean, Median

Pilihan statistics yang termasuk ke dalam ukuran pemusatan di antaranya adalah {mean} dan {median}.

2.5.4 Interpretasi Hasil Ukuran Pemusatan

Rata-rata atau mean adalah ukuran untuk menentukan nilai tipikal (nilai kebanyakan) dari suatu variabel dalam dataset kita. Adapun median bertindak serupa dengan mean, akan tetapi median tidak terpengaruh oleh nilai ekstrem (outlier). Oleh karena itu, penting untuk menyatakan nilai mean dan median secara bersamaan untuk mengetahui apakah terdapat nilai ekstrem dalam dataset kita.

2.5.5 Ukuran Penyebaran (Standar Deviasi, Persentil, Kuartil, dan IQV)

Ukuran penyebaran menjawab pertanyaan: “Seberapa menyebar data kita dari titik tengahnya?” Untuk variabel numerik, kita gunakan standar deviasi, persentil, dan kuartil. Untuk variabel nominal, kita gunakan IQV (Index of Qualitative Variation).

Variabel Numerik: Standar Deviasi, Persentil, dan Kuartil

Kita bisa menentukan ukuran penyebaran yang ditampilkan melalui atribut statistic. Teknik-teknik yang tersedia di antaranya:

  • {min}, {max} : nilai minimum dan maksimum
  • {p##} : persentil ke-##. Kuartil bawah (Q1) = {p25}, kuartil atas (Q3) = {p75}
  • {sd} : standar deviasi
data_ubl |>
  tbl_summary(
    include = c(biaya_dalam_sepekan, jumlah_perjalanan_senin, jarak),
    type = list(
      jumlah_perjalanan_senin ~ "continuous"
    ),
    digits = list(
      jumlah_perjalanan_senin ~ 0
    ),
    statistic = list(
      all_continuous() ~ "[{min}], {p25}, {median}, {p75}, [{max}] ({sd})"
    )
  ) |>
  as_flex_table()

Characteristic

N = 3351

biaya_dalam_sepekan

[5], 50, 70, 120, [600] (77)

jumlah_perjalanan_senin

[1], 2, 2, 4, [8] (1)

jarak

[0.06], 1.31, 2.71, 4.74, [43.55] (3.57)

1[Min], Q1, Median, Q3, [Max] (SD)

# Perhatikan urutan dan kelengkapan tanda koma pada setiap atribut fungsi

Variabel Nominal: IQV

Untuk variabel nominal (kategoris tanpa urutan), ukuran penyebaran yang tepat adalah IQV (Index of Qualitative Variation). IQV bernilai 0 jika semua observasi jatuh pada satu kategori (tidak ada variasi), dan mendekati 1 jika observasi tersebar merata ke semua kategori.

Karena R tidak memiliki fungsi IQV bawaan, kita buat sendiri menggunakan mekanisme function:

iqv <- function(x) {
  x_clean <- x[!is.na(x)]
  counts <- table(x_clean)
  K <- length(counts)
  if (K <= 1) return(0)
  n <- sum(counts)
  sum_p_sq <- sum((counts / n)^2)
  iqv_value <- (K / (K - 1)) * (1 - sum_p_sq)
  return(iqv_value)
}

Untuk memanggil fungsi iqv(), kita masukkan vektor variabel yang ingin dihitung dengan sintaks dataset$nama_variabel:

# Menghitung IQV variabel jenis_kelamin
iqv(data_ubl$jenis_kelamin)
## [1] 0.9999911

2.5.6 Interpretasi Hasil Ukuran Penyebaran

Ukuran penyebaran menunjukkan seberapa beragam data kita.

Untuk simpangan baku atau standar deviasi, semakin kecil nilainya, semakin sedikit variasi data kita. Artinya, data kita semakin homogen. Sebaliknya, semakin besar nilainya, semakin banyak variasi data kita. Artinya, data kita semakin heterogen.

Untuk persentil/kuartil, kita menentukan variabilitasnya dari nilai-nilai di datasetnya secara langsung. Misalnya, jika Q1 kita 5 sementara median kita 10, maka ia lebih homogen dibandingkan ketika Q1 5 sementara median 20.

Untuk IQV, semakin kecil nilainya, semakin sedikit variasi data kita. Artinya, data kita semakin homogen. Sebaliknya, semakin besar nilainya, semakin banyak variasi data kita. Artinya, data kita semakin heterogen.

Aktivitas Mandiri 4: Analisis Statistik Deskriptif Komprehensif Data UNILA STP-2.4

Persiapan: Gunakan data_unila_bersih yang sudah dirapikan dan sudah memiliki variabel factor. Gunakan tbl_summary() dan as_flex_table() untuk menghasilkan tabel deskriptif.

Analisis yang Diminta:

  1. Persentase/Proporsi:
    • Hitung persentase mahasiswa berdasarkan tingkat_semester
    • Interpretasi: bagaimana dominansi/minoritas tingkat semester mahasiswa? Apakah ada ketimpangan?
  2. Ukuran Pemusatan (Mean dan Median):
    • Untuk variabel jarak
    • Tampilkan Mean dan Median
    • Gunakan statistic = "{mean} ({median})"
    • Interpretasi: berapa rata-rata dan nilai tengah jarak tempuh mahasiswa? Apakah ada nilai ekstrem? (Petunjuk: lihat perbandingan nilai mean dan mediannya)
  3. Ukuran Penyebaran (Mean dan SD):
    • Untuk variabel biaya_dalam_sepekan
    • Tampilkan Minimal, Kuartil Bawah, Median, Kuartil Atas, Maksimal, dan Standar Deviasi
    • Gunakan statistic = "{min}, {p25}, {median}, {p75}, {max} ({sd})"
    • Interpretasi: seberapa beragam biaya yang dikeluarkan mahasiswa dalam sepekan?
  4. Ukuran Variasi Nominal (IQV):
    • Hitung IQV untuk variabel uang_saku
    • Gunakan fungsi iqv() yang sudah dipelajari
    • Interpretasi: seberapa bervariasi uang saku mahasiswa?

Dokumentasi:

  • Sertakan interpretasi singkat untuk setiap hasil analisis dengan bentuk komentar (acu kembali Modul 0 untuk cara teknisnya).
  • Kumpulkan semua jawaban aktivitas mandiri dalam satu file R dengan format nama Prak2_[NIM]_[Nama].R.