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.
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.
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:
- Gunakan variabel
file_dibacayang sudah ada (file Excel-nya sama) - Buat variabel
sheet_uniladengan isi"DataUtama_mhsUNILA" - Impor dataset ke variabel
data_unila - 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 datasetdata_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 datasetdata_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 |>:
- Baca dataset UNILA dari
file_dibacadansheet_unila - Pilih variabel
Kampus_PT,Jenis.Kelamin,Umur,Uang.Saku,Tingkat.Semester,Biaya.perjalanan,Jumlah.Perjalanan.Senin,jara - Ubah nama variabel-variabel tersebut seperti berikut:
-
Kampus_PTmenjadikampus -
Jenis.Kelaminmenjadijenis_kelamin -
Umurmenjadiumur -
Uang.Sakumenjadiuang_saku -
Tingkat.Semestermenjaditingkat_semester -
Biaya.perjalananmenjadibiaya_dalam_sepekan -
Jumlah.Perjalanan.Seninmenjadijumlah_perjalanan_senin -
jaramenjadijarak
-
- Buang baris yang mengandung missing values dengan
drop_na() - Simpan hasilnya ke variabel
data_unila_bersih - 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
umurataubiaya_dalam_sepekanmenampilkanMin.,1st Qu.,Median,Mean,3rd Qu., danMax.— ini adalah ukuran-ukuran pemusatan dan penyebaran data numerik.Variabel teks (character) seperti
jenis_kelaminatautingkat_semesterhanya menampilkanLength,Class, danMode— 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(...)— perintah untuk mengubah atau menambah variabel dalam dataset. Di sini kita menimpa variabeljenis_kelaminyang 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 menjadijenis_kelamin, maka perintahnya akan menjadimutate(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.
-
argumen pertama (
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):
- Gunakan
table()ataucount()untuk mengecek nilai-nilai unik dari variabel-variabel kategoris berikut:kampusuang_sakujenis_kelamintingkat_semester
- Buat vektor untuk masing-masing variabel di atas (perhatikan variabel ordinal!) menggunakan salah satu cara yang sudah kita pelajari.
-
kampusmenjadikampus_levels -
uang_sakumenjadiuang_saku_levels -
jenis_kelaminmenjadijenis_kelamin_levels -
tingkat_semestermenjaditingkat_semester_levels - gunakan perintah berikut untuk memperbaiki
uang_saku_levels
uang_saku_levels <- c(uang_saku_levels[4], uang_saku_levels[-4]) -
- Gunakan
mutate()untuk mengubah variabel-variabel tersebut menjadi factor - Verifikasi dengan
glimpse()untuk memastikan tipenya<fct>atau<ord> - 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}")— memintatbl_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 ~ ...)— fungsimodify_fmt_fun()digunakan untuk mengubah cara kolom statistik ditampilkan setelah tabel dibuat.stat_0merujuk pada kolom statistik pertama yang dihasilkantbl_summary().function(x) style_number(as.numeric(x) / 100, digits = 3)— fungsi anonim yang diterapkan pada setiap nilai di kolomstat_0. Nilai persentase dibagi 100 untuk dikonversi menjadi proporsi (0–1), lalu diformat denganstyle_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 fungsiVariabel 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:
-
Persentase/Proporsi:
- Hitung persentase mahasiswa berdasarkan
tingkat_semester - Interpretasi: bagaimana dominansi/minoritas tingkat semester mahasiswa? Apakah ada ketimpangan?
- Hitung persentase mahasiswa berdasarkan
-
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)
- Untuk variabel
-
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?
- Untuk variabel
-
Ukuran Variasi Nominal (IQV):
- Hitung IQV untuk variabel
uang_saku - Gunakan fungsi
iqv()yang sudah dipelajari - Interpretasi: seberapa bervariasi uang saku mahasiswa?
- Hitung IQV untuk variabel
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.