Modul 1 Pengolahan Data Terstruktur

Setelah mempelajari modul ini Anda diharapkan dapat:

1. menganalisis variabel dan objek dalam sebuah format data terstruktur STP-1.3 2. mengelola data terstruktur dengan tepat menggunakan perangkat komputer STP-1.4

Kita akan mempelajari cara pengolahan data terstruktur atau dataset/set data dari hasil kuesioner kepada mahasiswa-mahasiswa Universitas Islam Negeri Raden Intan Lampung (UINRIL) dan Universitas Bandar Lampung (UBL) tentang pola perjalanan mereka.

Dalam R, pengolahan data terstruktur dipermudah dengan adanya paket tidyverse. Paket ini menyertakan paket-paket lain yang mempunyai kegunaan unik dalam pengolahan data terstruktur.

Seperti yang kalian lihat, paket tidyverse menyertakan paket-paket berikut yang mempunyai kegunaan masing-masing:

  • dplyr: menyediakan serangkaian fungsi inti untuk memanipulasi dan mentransformasi data secara efisien.
  • forcats: memudahkan pekerjaan dengan data kategorikal atau yang dalam R disebut juga ‘factors’.
  • ggplot2: untuk membuat grafik yang ciamik.
  • lubridate: mempermudah pekerjaan terkait format tanggal
  • purrr: meningkatkan kemampuan pemrograman fungsi dan vektor
  • readr: untuk membaca data tabular seperti .csv
  • stringr: menyederhanakan operasi teks/string
  • tibble: versi modern dari data.frame yang lebih rapi dan mudah digunakan.
  • tidyr: untuk merapikan data dengan mengubah format atau struktur tata letaknya.

Selain paket tidyverse, kita juga akan menggunakan paket openxlsx untuk mengoperasikan file Excel.

1.1 Mengimpor set data (dataset) dari Excel

Untuk membuat set data di lingkungan kerja R kita, gunakan fungsi read.xlsx() seperti berikut. Fungsi read.xlsx() mempunyai atribut utama berupa file path lokasi file yang ditempatkan di dalam tanda kurung.

⚠️ Penting

Pastikan file Excel yang akan diimpor sudah tertutup, karena mengimpor file yang sedang terbuka akan menghasilkan error.

# Memuat dataset dari file Excel "Data Praktikum 01.xlsx" yang terletak di folder datasets/
data <- read.xlsx("datasets/Data Praktikum 01.xlsx")

# Menampilkan 6 baris pertama dataset
head(data)
##   Kampus_PT Nomor.urut Jenis.Kelamin Umur Fakultas          Prodi
## 1    UINRIL          1     Laki-laki   22  Syariah Hukum Keluarga
## 2    UINRIL          2     Laki-laki   25  Syariah Hukum Keluarga
##              Tingkat.Semester  Uang.Saku kepemilikan.mobil kepemilikan.motor
## 1 4 (Semester 7 - Semester 8) 1Jt - 2 Jt                 0                 1
## 2 4 (Semester 7 - Semester 8)     < 1 Jt                 1                 4
##   kepemilikan.sepedan      kendaraan.utama kelurahan  jenis.tempat.tinggal
## 1                   0 Sepeda Motor Pribadi    Wiyono Rumah Bersama Saudara
## 2                   0 Sepeda Motor Pribadi  Sukarame           Kos Sendiri
##   nama.jalan.tempat.tinggal alasan.pemilihan.lokasi.tempat.tinggal jarak.(km)
## 1              Pasar Wiyono                              Lain-lain      19.27
## 2       jln endro suratmin                     Dekat dengan kampus       0.58
##   biaya.dalam.ribu2 Jumlah.Perjalanan.Senin Jumlah.Perjalanan.Selasa
## 1               100                       3                        3
## 2                80                       3                        3
##   Jumlah.Perjalanan.Rabu Jumlah.Perjalanan.Kamis Jumlah.Perjalanan.Jumat
## 1                      0                       0                       0
## 2                      0                       3                       0
##   Jumlah.Perjalanan.Sabtu Jumlah.Perjalanan.Ahad
## 1                       0                      0
## 2                       0                      0
##  [ reached 'max' / getOption("max.print") -- omitted 4 rows ]

Fungsi tersebut akan mengimpor seluruh isi dari file Excel Data Praktikum 01.xlsx pada sheet pertama saja. Dataset yang kita impor akan menjadi objek dengan jenis tibble.

Apabila kita ingin mengimpor set data dari sheet lainnya, kita harus menyertakan detil nama sheet yang kita ingin impor pada atribut sheet. Misalnya kita ingin mengimpor sheet UBL yang bernama “DataUtama_mhsUBL”, maka perintahnya adalah:

# Menyimpan file sebagai variabel tersendiri sehingga lebih fleksibel
file_dibaca <- "datasets/Data Praktikum 01.xlsx" # nama variabel bukan 'file' saja karena sudah ada fungsi R tersendiri dengan nama tersebut

# Mengimpor data dari file_dibaca dan menyimpannya sebagai variabel
data_ubl <- read.xlsx(file_dibaca, sheet = "DataUtama_mhsUBL")

# Melihat data tersebut
head(data_ubl)
##   Timestamp Kampus_PT Nomor.urut Jenis.Kelamin Umur
## 1  45413.83       UBL          1     Perempuan   21
##                           Fakultas           Prodi            Tingkat.Semester
## 1 Fakultas Ilmu Sosial dan Politik Ilmu Komunikasi 4 (Semester 7 - Semester 8)
##   Uang.Saku kepemilikan.mobil kepemilikan.motor kepemilikan.sepeda
## 1    < 1 jt                 1                 2                  1
##        kendaraan.utama         kelurahan         jenis.tempat.tinggal
## 1 Sepeda Motor Pribadi Kalibalau Kencana Rumah pribadi/rumah keluarga
##   nama.jalan.tempat.tinggal jarak.(km) alasan.pemilihan.lokasi.tempat.tinggal
## 1              eLBe Loundry   4.223797         Bersama keluarga/saudara/teman
##   biaya.dalam.seminggu Jumlah.perjalanan.Senin Jumlah.Perjalanan.Selasa
## 1              25 ribu                       2                        3
##   Jumlah.Perjalanan.Rabu Jumlah.Perjalanan.Kamis Jumlah.Perjalanan.Jumat
## 1                      2                       3                       2
##   Jumlah.Perjalanan.Sabtu Jumlah.Perjalanan.Ahad
## 1                       2                      2
##  [ reached 'max' / getOption("max.print") -- omitted 5 rows ]

Kita juga dapat melihat dataset kita secara lengkap dengan perintah View().

# Melihat set data UINRIL
View(data)

# Melihat set data UBL
View(data_ubl)

1.2 Analisis data terstruktur pada set data

Kita sudah mempelajari bahwa data terstruktur terdiri atas objek, variabel, dan nilai. Satu objek diwakili oleh satu baris, variabel oleh kolom, dan nilai berada di dalam sel-sel yang merupakan perpotongan kolom dan baris.

⚠️ Perhatian

Di modul ini kita menggunakan istilah “variabel” untuk menyebut dua hal yang berbeda. Makna pertama mengacu pada penyimpan nilai di R, sementara yang kedua adalah elemen data terstruktur yang menjadi kolom-kolom.

Dalam modul ini kita akan menggunakan istilah yang sama untuk kedua makna, jadi pahami konteks kalimatnya terlebih dahulu ketika menemukan kata ini.

Untuk mengetahui ringkasan struktur data, kita dapat menggunakan fungsi glimpse() yang membutuhkan set data yang kita simpan sebagai argumen.

# ringkasan struktur data UIN RIL
glimpse(data)
## Rows: 400
## Columns: 25
## $ Kampus_PT                              <chr> "UINRIL", "UINRIL", "UINRIL", "U…
## $ Nomor.urut                             <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1…
## $ Jenis.Kelamin                          <chr> "Laki-laki", "Laki-laki", "Perem…
## $ Umur                                   <dbl> 22, 25, 24, 19, 23, 21, 22, 21, …
## $ Fakultas                               <chr> "Syariah", "Syariah", "Tarbiyah …
## $ Prodi                                  <chr> "Hukum Keluarga", "Hukum Keluarg…
## $ Tingkat.Semester                       <chr> "4 (Semester 7 - Semester 8)", "…
## $ Uang.Saku                              <chr> "1Jt - 2 Jt", "< 1 Jt", "< 1 Jt"…
## $ kepemilikan.mobil                      <dbl> 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0,…
## $ kepemilikan.motor                      <dbl> 1, 4, 0, 1, 1, 1, 1, 4, 4, 1, 0,…
## $ kepemilikan.sepedan                    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ kendaraan.utama                        <chr> "Sepeda Motor Pribadi", "Sepeda …
## $ kelurahan                              <chr> "Wiyono", "Sukarame", "Sukarame"…
## $ jenis.tempat.tinggal                   <chr> "Rumah Bersama Saudara", "Kos Se…
## $ nama.jalan.tempat.tinggal              <chr> "Pasar Wiyono", "jln endro surat…
## $ alasan.pemilihan.lokasi.tempat.tinggal <chr> "Lain-lain", "Dekat dengan kampu…
## $ `jarak.(km)`                           <dbl> 19.27, 0.58, 0.56, 1.05, 1.69, 7…
## $ biaya.dalam.ribu2                      <dbl> 100, 80, 0, 50, 50, 50, 35, 50, …
## $ Jumlah.Perjalanan.Senin                <dbl> 3, 3, 3, 0, 4, 0, 3, 4, 2, 3, 4,…
## $ Jumlah.Perjalanan.Selasa               <dbl> 3, 3, 0, 2, 4, 2, 0, 4, 0, 2, 4,…
## $ Jumlah.Perjalanan.Rabu                 <dbl> 0, 0, 3, 0, 0, 2, 3, 4, 3, 2, 4,…
## $ Jumlah.Perjalanan.Kamis                <dbl> 0, 3, 0, 2, 0, 0, 0, 4, 0, 2, 2,…
## $ Jumlah.Perjalanan.Jumat                <dbl> 0, 0, 0, 2, 3, 2, 2, 4, 0, 0, 2,…
## $ Jumlah.Perjalanan.Sabtu                <dbl> 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2,…
## $ Jumlah.Perjalanan.Ahad                 <dbl> 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2,…

Hasil dari fungsi glimpse() tersebut menunjukkan jumlah baris, jumlah kolom, dan kolom-kolom yang ada dalam set data kita beserta rinciannya. Set data kita memiliki 400 baris yang ditunjukkan oleh Rows dan 25 kolom yang ditunjukkan oleh Columns . Ini artinya, set data kita memiliki 400 objek dan 25 variabel.

Rincian nama-nama variabel ditunjukkan pada baris keluaran yang diawali oleh simbol $. Singkatan-singkatan di dalam kurung sudut <> bermakna jenis nilai dari variabel tersebut. Laman ini memberikan penjelasan makna setiap singkatan tersebut.

Terlihat dalam data kita bahwa hanya ada dua tipe nilai variabel: dbl dan chr yang berarti double (bilangan desimal) dan character (huruf/string).

Aktivitas Mandiri 1: Menganalisis Struktur Data STP-1.3

Jalankan glimpse(data) untuk dataset UBL dan jawab:

  1. Berapa jumlah objek (baris) dalam dataset ini?
  2. Berapa jumlah variabel (kolom)?
  3. Sebutkan 3 variabel dengan tipe dbl dan 3 variabel dengan tipe chr
  4. Mengapa variabel Jenis.Kelamin bertipe chr bukan dbl? Jelaskan!

1.3 Mengolah set data

Dalam bagian ini kita akan mengolah set data kita yang bertujuan untuk memenuhi kebutuhan pengolahan data kita. Sebelum melakukan pengolahan, maka kita perlu menjawab pertanyaan terlebih dahulu “apa yang kita butuhkan untuk pengolahan data kita?”

Dalam praktikum ini kita sudah mengetahui bahwa terdapat dua jenis set data hasil kuesioner, yakni set data mahasiswa Universitas Islam Negeri Raden Intan Lampung (UINRIL) dan juga Universitas Bandar Lampung (UBL). Kedua jenis set data tersebut disimpan dalam variabel yang berbeda. Kita butuh untuk menggabungkan kedua set data tersebut menjadi satu set data yang mencakup kedua kampus agar nanti kita bisa melakukan analisis dengan lebih leluasa.

Pengolahan set data seperti ini punya istilah yang keren: data wrangling (bisa dibaca “data rengling”)

1.3.1 Merancang Algoritma (Urutan kerja)

Karena R adalah program yang mayoritasnya character user interface (CUI) alih-alih graphical user interface, maka pekerjaan kita tidak bisa seleluasa GUI yang dapat kita bolak-balik urutannya. Kita sebaiknya memiliki “rencana kerja” yang jelas, yang dalam bahasa pemrograman disebut algoritma.

Algoritma yang akan kita lakukan dalam praktikum ini adalah sebagai berikut:

  1. Mengidentifikasi nama-nama kolom di set data UIN RIL
  2. Mengidentifikasi nama-nama kolom di set data UBL
  3. Menentukan kolom-kolom yang akan diambil di set data baru
  4. Menyeleksi kolom-kolom yang akan dipakai di set data UIN RIL dan UBL,
  5. Mengubah nama kolom-kolom di kedua set data menjadi nama-nama yang sudah ditentukan di langkah-3.
  6. Menyatukan kedua set data.

💡 Tip

Sebisa mungkin rancang setiap langkah pada urutan kerja kita dengan rinci agar kita dapat menerjemahkan langkah-langkah tersebut dengan lebih mudah ke baris kode.

1.3.2 Mengidentifikasi Nama-nama Kolom

Untuk mengidentifikasi nama-nama kolom kita dapat menggunakan fungsi colnames() yang mengambil argumen nama set data.

# data UIN RIL
colnames(data)
##  [1] "Kampus_PT"                             
##  [2] "Nomor.urut"                            
##  [3] "Jenis.Kelamin"                         
##  [4] "Umur"                                  
##  [5] "Fakultas"                              
##  [6] "Prodi"                                 
##  [7] "Tingkat.Semester"                      
##  [8] "Uang.Saku"                             
##  [9] "kepemilikan.mobil"                     
## [10] "kepemilikan.motor"                     
## [11] "kepemilikan.sepedan"                   
## [12] "kendaraan.utama"                       
## [13] "kelurahan"                             
## [14] "jenis.tempat.tinggal"                  
## [15] "nama.jalan.tempat.tinggal"             
## [16] "alasan.pemilihan.lokasi.tempat.tinggal"
## [17] "jarak.(km)"                            
## [18] "biaya.dalam.ribu2"                     
## [19] "Jumlah.Perjalanan.Senin"               
## [20] "Jumlah.Perjalanan.Selasa"              
## [21] "Jumlah.Perjalanan.Rabu"                
## [22] "Jumlah.Perjalanan.Kamis"               
## [23] "Jumlah.Perjalanan.Jumat"               
## [24] "Jumlah.Perjalanan.Sabtu"               
## [25] "Jumlah.Perjalanan.Ahad"
# data UIN RIL
colnames(data_ubl)
##  [1] "Timestamp"                             
##  [2] "Kampus_PT"                             
##  [3] "Nomor.urut"                            
##  [4] "Jenis.Kelamin"                         
##  [5] "Umur"                                  
##  [6] "Fakultas"                              
##  [7] "Prodi"                                 
##  [8] "Tingkat.Semester"                      
##  [9] "Uang.Saku"                             
## [10] "kepemilikan.mobil"                     
## [11] "kepemilikan.motor"                     
## [12] "kepemilikan.sepeda"                    
## [13] "kendaraan.utama"                       
## [14] "kelurahan"                             
## [15] "jenis.tempat.tinggal"                  
## [16] "nama.jalan.tempat.tinggal"             
## [17] "jarak.(km)"                            
## [18] "alasan.pemilihan.lokasi.tempat.tinggal"
## [19] "biaya.dalam.seminggu"                  
## [20] "Jumlah.perjalanan.Senin"               
## [21] "Jumlah.Perjalanan.Selasa"              
## [22] "Jumlah.Perjalanan.Rabu"                
## [23] "Jumlah.Perjalanan.Kamis"               
## [24] "Jumlah.Perjalanan.Jumat"               
## [25] "Jumlah.Perjalanan.Sabtu"               
## [26] "Jumlah.Perjalanan.Ahad"

Kita dapat mengetahui jumlah kolom setiap set data secara langsung dengan fungsi length().

length(colnames(data)) # jumlah kolom set data UIN RIL
## [1] 25
length(colnames(data_ubl)) # jumlah kolom set data UBL
## [1] 26

Hasil ini menunjukkan bahwa kedua dataset memiliki jumlah kolom yang hanya berbeda 1 kolom (25 kolom untuk UINRIL, 26 untuk UBL). Selain jumlahnya yang berbeda, terdapat juga perbedaan penamaan kolom pada kedua dataset sehingga perlu diseragamkan.

Catatan

Fungsi length() pada dasarnya adalah fungsi penghitung jumlah elemen dalam suatu vektor atau jenis data lain yang berupa daftar.

# Mendefinisikan suatu vektor
suatu_vektor <- c(1, 2, 3, 4, 5)

# Mengukur panjangnya
length(suatu_vektor)
## [1] 5

Dari kedua fungsi tersebut, length() dan colnames(), kita dapat mengetahui bahwa terdapat perbedaan jumlah kolom dan juga perbedaan penamaan:

  • kepemilikan.sepedan di data UIN vs kepemilikan.sepeda di data UBL.

  • biaya.dalam.ribu2 di data UIN vs biaya.dalam.seminggu di data UBL.

Perbedaan-perbedaan inilah yang membuat kita tidak bisa langsung menggabungkan data. Kita harus menyeragamkannya terlebih dahulu.

1.3.3 Menentukan Kolom-kolom yang Akan Diambil di Set Data Baru

Setelah mengidentifikasi nama-nama variabel dan jumlahnya, kita putuskan untuk mengambil variabel-variabel berikut: (1) Nomor.urut, (2) Jenis.Kelamin, (3) Umur, (4) Fakultas, (5) Prodi, (6) Tingkat.Semester, (7) Uang.Saku, (8) kepemilikan.mobil, (9) kepemilikan.motor, (10) kepemilikan.sepeda, (11) kendaraan.utama, (12) jenis.tempat.tinggal, (13) jarak, (14) biaya.dalam.seminggu, (15) Jumlah.perjalanan.Senin, (16) Jumlah.perjalanan.Selasa, (17) Jumlah.perjalanan.Rabu, (18) Jumlah.perjalanan.Kamis, (19) Jumlah.perjalanan.Jumat, (20) Jumlah.perjalanan.Sabtu, (21) Jumlah.perjalanan.Ahad.

Kita akan menyimpan nama-nama kolom yang sudah kita tentukan tersebut menjadi sebuah vektor.

# Membuat vektor berisi nama-nama kolom final yang kita inginkan
kolom_final <- c(
   "nomor_urut", "jenis_kelamin", "umur", "fakultas", "prodi",
   "tingkat_semester", "uang_saku",
   "kepemilikan_mobil",
   "kepemilikan_motor", "kepemilikan_sepeda", "kendaraan_utama",
   "jenis_tempat_tinggal", "jarak", "biaya_dalam_sepekan",
   "jumlah_perjalanan_senin", "jumlah_perjalanan_selasa",
   "jumlah_perjalanan_rabu", "jumlah_perjalanan_kamis",
   "jumlah_perjalanan_jumat", "jumlah_perjalanan_sabtu",
   "jumlah_perjalanan_ahad"
)

1.3.4 Menyeleksi Kolom-kolom Yang Akan Dipakai

Kita akan menggunakan fungsi select() dari dplyr (bagian dari tidyverse) untuk memilih hanya kolom-kolom yang relevan dari masing-masing set data. Perhatikan baik-baik, kita harus menggunakan nama kolom asli saat menyeleksi.

# 4. Menyeleksi kolom dari data UIN RIL
# Fungsi select() memilih kolom yang kita butuhkan dari 25 kolom yang ada
data_uin_selected <- select(
   data,
   Nomor.urut, Jenis.Kelamin, Umur, Fakultas, Prodi, Tingkat.Semester,
   Uang.Saku,
   kepemilikan.mobil, kepemilikan.motor,
   kepemilikan.sepedan, # Perhatian: Nama asli pakai 'n'
   kendaraan.utama, jenis.tempat.tinggal,
   `jarak.(km)`, # Backtick (`) WAJIB untuk nama kolom dengan karakter spesial
   `biaya.dalam.ribu2`, # Backtick melindungi tanda kurung dan angka
   Jumlah.Perjalanan.Senin, Jumlah.Perjalanan.Selasa, Jumlah.Perjalanan.Rabu,
   Jumlah.Perjalanan.Kamis, Jumlah.Perjalanan.Jumat, Jumlah.Perjalanan.Sabtu,
   Jumlah.Perjalanan.Ahad
)
# 5. Menyeleksi kolom dari data UBL
data_ubl_selected <- select(
   data_ubl,
   Nomor.urut, Jenis.Kelamin, Umur, Fakultas, Prodi, Tingkat.Semester,
   Uang.Saku,
   kepemilikan.mobil, kepemilikan.motor,
   kepemilikan.sepeda, # Di sini namanya sudah benar
   kendaraan.utama, jenis.tempat.tinggal,
   `jarak.(km)`,
   biaya.dalam.seminggu,
   Jumlah.perjalanan.Senin, Jumlah.Perjalanan.Selasa, Jumlah.Perjalanan.Rabu,
   Jumlah.Perjalanan.Kamis, Jumlah.Perjalanan.Jumat, Jumlah.Perjalanan.Sabtu,
   Jumlah.Perjalanan.Ahad
)

Sekarang kita punya dua data frame baru (data_uin_selected dan data_ubl_selected) yang isinya hanya kolom-kolom yang kita butuhkan.

1.3.5 Mengubah Nama Kolom Menjadi Nama Standar

Ini adalah langkah kuncinya. Kita cukup menimpa nama-nama kolom di kedua data frame yang sudah kita seleksi tadi dengan nama-nama kolom dari vektor kolom_final yang kita buat di 3.3.3.

# Mengganti nama kolom di kedua data frame
colnames(data_uin_selected) <- kolom_final
colnames(data_ubl_selected) <- kolom_final

Untuk membuktikan bahwa namanya sudah berubah, kita bisa cek lagi.

# Cek nama kolom setelah diubah
colnames(data_uin_selected)
##  [1] "nomor_urut"               "jenis_kelamin"           
##  [3] "umur"                     "fakultas"                
##  [5] "prodi"                    "tingkat_semester"        
##  [7] "uang_saku"                "kepemilikan_mobil"       
##  [9] "kepemilikan_motor"        "kepemilikan_sepeda"      
## [11] "kendaraan_utama"          "jenis_tempat_tinggal"    
## [13] "jarak"                    "biaya_dalam_sepekan"     
## [15] "jumlah_perjalanan_senin"  "jumlah_perjalanan_selasa"
## [17] "jumlah_perjalanan_rabu"   "jumlah_perjalanan_kamis" 
## [19] "jumlah_perjalanan_jumat"  "jumlah_perjalanan_sabtu" 
## [21] "jumlah_perjalanan_ahad"
colnames(data_ubl_selected)
##  [1] "nomor_urut"               "jenis_kelamin"           
##  [3] "umur"                     "fakultas"                
##  [5] "prodi"                    "tingkat_semester"        
##  [7] "uang_saku"                "kepemilikan_mobil"       
##  [9] "kepemilikan_motor"        "kepemilikan_sepeda"      
## [11] "kendaraan_utama"          "jenis_tempat_tinggal"    
## [13] "jarak"                    "biaya_dalam_sepekan"     
## [15] "jumlah_perjalanan_senin"  "jumlah_perjalanan_selasa"
## [17] "jumlah_perjalanan_rabu"   "jumlah_perjalanan_kamis" 
## [19] "jumlah_perjalanan_jumat"  "jumlah_perjalanan_sabtu" 
## [21] "jumlah_perjalanan_ahad"

Hasil dari kedua perintah di atas seharusnya adalah daftar nama yang identik.

Aktivitas Mandiri 2: Seleksi dan Rename Kolom STP-1.4

Pada aktivitas ini kita akan mengolah kembali dataset dari UINRIL.

  1. Impor kembali sheet pertama (UINRIL) dari file dataset dengan fungsi read.xlsx(), lalu simpan hasilnya dengan nama data_uinril_lat.
  2. Pilih hanya 6 kolom berikut menggunakan perintah select(): Kampus_PT, Jenis.Kelamin, kepemilikan.mobil, kepemilikan.motor, kepemilikan.sepedan, dan `jarak.(km)` (ingat menggunakan backtick (`) untuk kolom jarak karena terdapat karakter khusus).
  3. Buat vektor kolom_final berisi nama standar berikut: c("kampus", "jenis_kelamin", "kepemilikan_mobil", "kepemilikan_motor", "kepemilikan_sepeda", "jarak").
  4. Gunakan vektor tersebut untuk menyeragamkan nama kolom dari data hasil seleksi Langkah 2 dengan fungsi colnames(...) <- ...
  5. Simpan hasil akhir (setelah diseleksi dan diubah nama kolomnya) ke variabel data_uinril_subset.
  6. Gunakan glimpse(data_uinril_subset) untuk memverifikasi bahwa sekarang hanya ada 6 kolom dan namanya sudah seragam sesuai dengan isi dari kolom_final.

1.3.6 Menyatukan Kedua Set Data

Ini adalah langkah terakhir kita. Karena kedua set data kini memiliki struktur kolom yang sama persis, kita bisa menyatukannya menjadi satu data frame besar dengan fungsi bind_rows().

# Menggabungkan kedua data frame menjadi satu
data_gabungan <- bind_rows(data_uin_selected, data_ubl_selected)

Hasil dari penggabungan tersebut menyebabkan error pada kolom biaya.dalam.sepekan . Ini disebabkan oleh biaya.dalam.sepekan dalam set data UINRIL (data) berbeda jenisnya dengan set data UBL (data_ubl). Begitu pula Jumlah.perjalanan.Senin

# Mengecek tipe data dalam set data UINRIL
glimpse(data_uin_selected)
## Rows: 400
## Columns: 21
## $ nomor_urut               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ jenis_kelamin            <chr> "Laki-laki", "Laki-laki", "Perempuan", "Laki-l…
## $ umur                     <dbl> 22, 25, 24, 19, 23, 21, 22, 21, 21, 21, 19, 19…
## $ fakultas                 <chr> "Syariah", "Syariah", "Tarbiyah dan Keguruan",…
## $ prodi                    <chr> "Hukum Keluarga", "Hukum Keluarga", "Pendidika…
## $ tingkat_semester         <chr> "4 (Semester 7 - Semester 8)", "4 (Semester 7 …
## $ uang_saku                <chr> "1Jt - 2 Jt", "< 1 Jt", "< 1 Jt", "< 1 Jt", "<…
## $ kepemilikan_mobil        <dbl> 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0…
## $ kepemilikan_motor        <dbl> 1, 4, 0, 1, 1, 1, 1, 4, 4, 1, 0, 1, 3, 1, 0, 0…
## $ kepemilikan_sepeda       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0…
## $ kendaraan_utama          <chr> "Sepeda Motor Pribadi", "Sepeda Motor Pribadi"…
## $ jenis_tempat_tinggal     <chr> "Rumah Bersama Saudara", "Kos Sendiri", "Kos S…
## $ jarak                    <dbl> 19.27, 0.58, 0.56, 1.05, 1.69, 7.91, 2.58, 2.3…
## $ biaya_dalam_sepekan      <dbl> 100, 80, 0, 50, 50, 50, 35, 50, 40, 50, 0, 50,…
## $ jumlah_perjalanan_senin  <dbl> 3, 3, 3, 0, 4, 0, 3, 4, 2, 3, 4, 2, 3, 2, 3, 2…
## $ jumlah_perjalanan_selasa <dbl> 3, 3, 0, 2, 4, 2, 0, 4, 0, 2, 4, 2, 2, 2, 3, 2…
## $ jumlah_perjalanan_rabu   <dbl> 0, 0, 3, 0, 0, 2, 3, 4, 3, 2, 4, 2, 2, 2, 2, 2…
## $ jumlah_perjalanan_kamis  <dbl> 0, 3, 0, 2, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 0, 3…
## $ jumlah_perjalanan_jumat  <dbl> 0, 0, 0, 2, 3, 2, 2, 4, 0, 0, 2, 2, 2, 2, 2, 0…
## $ jumlah_perjalanan_sabtu  <dbl> 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 0…
## $ jumlah_perjalanan_ahad   <dbl> 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0…
# Mengecek tipe data dalam set data UBL
glimpse(data_ubl_selected)
## Rows: 379
## Columns: 21
## $ nomor_urut               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ jenis_kelamin            <chr> "Perempuan", "Laki-Laki", "Laki-Laki", "Laki-L…
## $ umur                     <dbl> 21, 20, 21, 22, 21, 21, 22, 22, 22, 22, 21, 22…
## $ fakultas                 <chr> "Fakultas Ilmu Sosial dan Politik", "Fakultas …
## $ prodi                    <chr> "Ilmu Komunikasi", "Ilmu Hukum", "Manajemen", …
## $ tingkat_semester         <chr> "4 (Semester 7 - Semester 8)", "3 (Semester 5 …
## $ uang_saku                <chr> "< 1 jt", "1 jt – 2 jt", "1 jt – 2 jt", "1 jt …
## $ kepemilikan_mobil        <dbl> 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, NA, 0, 0, 1, 0, …
## $ kepemilikan_motor        <dbl> 2, 1, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1…
## $ kepemilikan_sepeda       <dbl> 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, NA, 0, 0, 0, 0, …
## $ kendaraan_utama          <chr> "Sepeda Motor Pribadi", "Mobil Pribadi", "Sepe…
## $ jenis_tempat_tinggal     <chr> "Rumah pribadi/rumah keluarga", "Rumah pribadi…
## $ jarak                    <dbl> 4.2237967, 2.7033310, 3.2370722, 3.0023362, 5.…
## $ biaya_dalam_sepekan      <chr> "25 ribu", "200", "50rb menggunakan kendaraan …
## $ jumlah_perjalanan_senin  <chr> "2", "3", "1", "2", "1", "3", "2", "4", "4", "…
## $ jumlah_perjalanan_selasa <dbl> 3, 3, 1, 2, 1, 3, 2, 4, 4, 3, 3, 1, 1, 4, 1, 3…
## $ jumlah_perjalanan_rabu   <dbl> 2, 3, 1, 2, 1, 1, 2, 4, 4, 3, 1, 2, 1, 4, 3, 2…
## $ jumlah_perjalanan_kamis  <dbl> 3, 3, 1, 2, 1, 1, 2, 4, 4, 3, 1, 1, 1, 4, 3, 2…
## $ jumlah_perjalanan_jumat  <dbl> 2, 3, 1, 2, 1, 1, 2, 4, 3, 3, 1, 2, 1, 4, 3, 2…
## $ jumlah_perjalanan_sabtu  <dbl> 2, 3, 1, 2, 1, 1, 2, 3, 4, 2, 1, 1, 1, 1, 1, 2…
## $ jumlah_perjalanan_ahad   <dbl> 2, 3, 1, 2, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1…

Ini adalah kasus yang tepat untuk menggambarkan bahwa dalam data terstruktur, jenis nilai harus sama persis. Untuk kesederhanaan praktikum, kita akan melewati dulu variabel biaya.dalam.sepekan dan Jumlah.perjalanan.Senin tersebut.

1.3.7 Memperbaiki Set Data yang Akan Digabungkan

Kita akan menghapus biaya.dalam.sepekan dari kedua set data kita. Untuk menghapus suatu kolom, kita dapat menggunakan fungsi select() juga, akan tetapi kita tambahkan tanda negatif (-) di depan nama variabelnya.

# 'Menimpa' data_uin_selected dengan data_uin_selected yang variabel biaya.dalam.sepekan sudah dihapus
data_uin_selected <- select(
   data_uin_selected,
   -`biaya_dalam_sepekan`, -`jumlah_perjalanan_senin`
)

# Melihat hasilnya
glimpse(data_uin_selected)
## Rows: 400
## Columns: 19
## $ nomor_urut               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ jenis_kelamin            <chr> "Laki-laki", "Laki-laki", "Perempuan", "Laki-l…
## $ umur                     <dbl> 22, 25, 24, 19, 23, 21, 22, 21, 21, 21, 19, 19…
## $ fakultas                 <chr> "Syariah", "Syariah", "Tarbiyah dan Keguruan",…
## $ prodi                    <chr> "Hukum Keluarga", "Hukum Keluarga", "Pendidika…
## $ tingkat_semester         <chr> "4 (Semester 7 - Semester 8)", "4 (Semester 7 …
## $ uang_saku                <chr> "1Jt - 2 Jt", "< 1 Jt", "< 1 Jt", "< 1 Jt", "<…
## $ kepemilikan_mobil        <dbl> 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0…
## $ kepemilikan_motor        <dbl> 1, 4, 0, 1, 1, 1, 1, 4, 4, 1, 0, 1, 3, 1, 0, 0…
## $ kepemilikan_sepeda       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0…
## $ kendaraan_utama          <chr> "Sepeda Motor Pribadi", "Sepeda Motor Pribadi"…
## $ jenis_tempat_tinggal     <chr> "Rumah Bersama Saudara", "Kos Sendiri", "Kos S…
## $ jarak                    <dbl> 19.27, 0.58, 0.56, 1.05, 1.69, 7.91, 2.58, 2.3…
## $ jumlah_perjalanan_selasa <dbl> 3, 3, 0, 2, 4, 2, 0, 4, 0, 2, 4, 2, 2, 2, 3, 2…
## $ jumlah_perjalanan_rabu   <dbl> 0, 0, 3, 0, 0, 2, 3, 4, 3, 2, 4, 2, 2, 2, 2, 2…
## $ jumlah_perjalanan_kamis  <dbl> 0, 3, 0, 2, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 0, 3…
## $ jumlah_perjalanan_jumat  <dbl> 0, 0, 0, 2, 3, 2, 2, 4, 0, 0, 2, 2, 2, 2, 2, 0…
## $ jumlah_perjalanan_sabtu  <dbl> 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 0…
## $ jumlah_perjalanan_ahad   <dbl> 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0…
colnames(data_uin_selected)
##  [1] "nomor_urut"               "jenis_kelamin"           
##  [3] "umur"                     "fakultas"                
##  [5] "prodi"                    "tingkat_semester"        
##  [7] "uang_saku"                "kepemilikan_mobil"       
##  [9] "kepemilikan_motor"        "kepemilikan_sepeda"      
## [11] "kendaraan_utama"          "jenis_tempat_tinggal"    
## [13] "jarak"                    "jumlah_perjalanan_selasa"
## [15] "jumlah_perjalanan_rabu"   "jumlah_perjalanan_kamis" 
## [17] "jumlah_perjalanan_jumat"  "jumlah_perjalanan_sabtu" 
## [19] "jumlah_perjalanan_ahad"
# 'Menimpa' data_ubl_selected dengan data_ubl_selected yang variabel biaya.dalam.sepekan sudah dihapus
data_ubl_selected <- select(
   data_ubl_selected,
   -`biaya_dalam_sepekan`, -`jumlah_perjalanan_senin`
)

# Melihat hasilnya
glimpse(data_ubl_selected)
## Rows: 379
## Columns: 19
## $ nomor_urut               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ jenis_kelamin            <chr> "Perempuan", "Laki-Laki", "Laki-Laki", "Laki-L…
## $ umur                     <dbl> 21, 20, 21, 22, 21, 21, 22, 22, 22, 22, 21, 22…
## $ fakultas                 <chr> "Fakultas Ilmu Sosial dan Politik", "Fakultas …
## $ prodi                    <chr> "Ilmu Komunikasi", "Ilmu Hukum", "Manajemen", …
## $ tingkat_semester         <chr> "4 (Semester 7 - Semester 8)", "3 (Semester 5 …
## $ uang_saku                <chr> "< 1 jt", "1 jt – 2 jt", "1 jt – 2 jt", "1 jt …
## $ kepemilikan_mobil        <dbl> 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, NA, 0, 0, 1, 0, …
## $ kepemilikan_motor        <dbl> 2, 1, 2, 4, 4, 2, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1…
## $ kepemilikan_sepeda       <dbl> 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, NA, 0, 0, 0, 0, …
## $ kendaraan_utama          <chr> "Sepeda Motor Pribadi", "Mobil Pribadi", "Sepe…
## $ jenis_tempat_tinggal     <chr> "Rumah pribadi/rumah keluarga", "Rumah pribadi…
## $ jarak                    <dbl> 4.2237967, 2.7033310, 3.2370722, 3.0023362, 5.…
## $ jumlah_perjalanan_selasa <dbl> 3, 3, 1, 2, 1, 3, 2, 4, 4, 3, 3, 1, 1, 4, 1, 3…
## $ jumlah_perjalanan_rabu   <dbl> 2, 3, 1, 2, 1, 1, 2, 4, 4, 3, 1, 2, 1, 4, 3, 2…
## $ jumlah_perjalanan_kamis  <dbl> 3, 3, 1, 2, 1, 1, 2, 4, 4, 3, 1, 1, 1, 4, 3, 2…
## $ jumlah_perjalanan_jumat  <dbl> 2, 3, 1, 2, 1, 1, 2, 4, 3, 3, 1, 2, 1, 4, 3, 2…
## $ jumlah_perjalanan_sabtu  <dbl> 2, 3, 1, 2, 1, 1, 2, 3, 4, 2, 1, 1, 1, 1, 1, 2…
## $ jumlah_perjalanan_ahad   <dbl> 2, 3, 1, 2, 1, 1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1…

1.3.8 Menyatukan Kedua Set Data Setelah Diperbaiki

Kita akan coba menggabungkan kedua set data tadi.

# Menggabungkan kedua data frame menjadi satu
# bind_rows() menumpuk baris-baris dari kedua dataset (seperti menumpuk kartu)
# PENTING: Nama kolom harus sama PERSIS agar penggabungan berhasil
data_gabungan <- bind_rows(data_uin_selected, data_ubl_selected)

Selesai! 🥳 Mari kita lihat hasil akhir dari kerja keras kita dengan glimpse(). Hasil akan menunjukkan bahwa kita mempunyai 779 objek yang merupakan gabungan responden mahasiswa UIN RIL dan UBL.

# Tampilkan struktur data gabungan yang sudah rapi
glimpse(data_gabungan)
## Rows: 779
## Columns: 19
## $ nomor_urut               <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…
## $ jenis_kelamin            <chr> "Laki-laki", "Laki-laki", "Perempuan", "Laki-l…
## $ umur                     <dbl> 22, 25, 24, 19, 23, 21, 22, 21, 21, 21, 19, 19…
## $ fakultas                 <chr> "Syariah", "Syariah", "Tarbiyah dan Keguruan",…
## $ prodi                    <chr> "Hukum Keluarga", "Hukum Keluarga", "Pendidika…
## $ tingkat_semester         <chr> "4 (Semester 7 - Semester 8)", "4 (Semester 7 …
## $ uang_saku                <chr> "1Jt - 2 Jt", "< 1 Jt", "< 1 Jt", "< 1 Jt", "<…
## $ kepemilikan_mobil        <dbl> 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0…
## $ kepemilikan_motor        <dbl> 1, 4, 0, 1, 1, 1, 1, 4, 4, 1, 0, 1, 3, 1, 0, 0…
## $ kepemilikan_sepeda       <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0…
## $ kendaraan_utama          <chr> "Sepeda Motor Pribadi", "Sepeda Motor Pribadi"…
## $ jenis_tempat_tinggal     <chr> "Rumah Bersama Saudara", "Kos Sendiri", "Kos S…
## $ jarak                    <dbl> 19.27, 0.58, 0.56, 1.05, 1.69, 7.91, 2.58, 2.3…
## $ jumlah_perjalanan_selasa <dbl> 3, 3, 0, 2, 4, 2, 0, 4, 0, 2, 4, 2, 2, 2, 3, 2…
## $ jumlah_perjalanan_rabu   <dbl> 0, 0, 3, 0, 0, 2, 3, 4, 3, 2, 4, 2, 2, 2, 2, 2…
## $ jumlah_perjalanan_kamis  <dbl> 0, 3, 0, 2, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 0, 3…
## $ jumlah_perjalanan_jumat  <dbl> 0, 0, 0, 2, 3, 2, 2, 4, 0, 0, 2, 2, 2, 2, 2, 0…
## $ jumlah_perjalanan_sabtu  <dbl> 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 0, 0, 0, 0…
## $ jumlah_perjalanan_ahad   <dbl> 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0…

🎉 Selamat! Kita telah berhasil menggabungkan dataset dari dua kampus berbeda. Dataset gabungan kita sekarang memiliki:

  • 779 baris (400 dari UIN RIL + 379 dari UBL)
  • 19 kolom yang sudah diseragamkan namanya
  • Sudah siap untuk analisis lebih lanjut!

Aktivitas Mandiri 3: Menggabungkan Data UINRIL dan ITERA STP-1.3, STP-1.4

Melanjutkan dari aktivitas mandiri sebelumnya, gabungkan data responden dari UINRIL yang sudah kita siapkan (data_uinril_subset) dengan data mahasiswa ITERA.

Langkah-langkah:

  1. Impor data dari sheet ITERA menggunakan read.xlsx()
    • Buka kembali file Excel asal dan impor dataset ITERA dari sheet DataUtama_mhsITERA ke variabel data_itera_lat.
  2. Seleksi kolom yang sesuai menggunakan select()
    • Gunakan glimpse() untuk mengecek nama variabel pada hasil impor di Langkah 1.
    • Pilihlah 6 kolom yang maknanya bersesuaian dengan variabel kita pada aktivitas sebelumnya (yakni: kampus, jenis kelamin, kepemilikan mobil, motor, sepeda, dan jarak).
    • Penting: Urutan kolom yang diseleksi harus sejajar dengan urutan nama di kolom_final pada aktivitas mandiri sebelumnya.
  3. Ganti nama kolom menggunakan fungsi colnames()
    • Timpa nama kolom dataset ITERA yang sudah diseleksi pada Langkah 2 tadi dengan vektor kolom_final dari aktivitas mandiri sebelumnya.
    • Simpan hasil akhirnya ke dalam variabel data_itera_subset.
  4. Gabungkan dengan bind_rows()
    • Gabungkan data_uinril_subset dengan data_itera_subset menggunakan bind_rows().
    • Simpan set data dari hasil gabungan ini ke variabel data_gabungan_iterauinril.

Analisis [STP-1.3]:

  1. Berapa jumlah variabel (kolom) dalam data gabungan (data_gabungan_iterauinril)?
  2. Berapa jumlah objek (baris) dalam data gabungan?
  3. Tampilkan bukti dengan menjalankan perintah glimpse(data_gabungan_iterauinril).

Refleksi: - Apa tantangan terbesar yang Anda hadapi dalam menggabungkan data? - Mengapa penting untuk mengecek atau menyeragamkan tipe data sebelum menggabungkan dataset?

1.3.9 Mengekspor Set Data Hasil Pengolahan ke Fail (File) Terpisah

Dalam dunia data sains dikenal jenis fail .csv yang merupakan singkatan dari comma-separated values. Fail ini menyimpan nilai-nilai dalam bentuk teks biasa yang dipisahkan oleh koma (comma-separated) sehingga dapat dibaca sebagai tabel.

Teks biasa:

Nama, umur
Ifna, 20
Salbina, 21

Ketika dibaca menjadi:

Nama umur
Ifna 20
Salbina 21

Selain tanda koma, tanda titik-koma (;) juga sering dipakai untuk menjadi pemisah nilai. Tanda ini biasanya dipakai pada fail yang menggunakan koma sebagai pemisah desimal, seperti di Indonesia, agar tanda koma tidak dibaca sebagai pemisah.

Nama; jarak
Ifna; 2,01
Salbina; 19,7

Dibaca menjadi:

Nama jarak
Ifna 2,01
Salbina 19,7

Cara mengekspor dataset hasil pengolahan kita ke format CSV adalah dengan menggunakan perintah write.csv() atau write.csv2().

Penggunaan keduanya sangat ketat dan harus dipatuhi agar file tidak sulit dibaca oleh komputer lain ke depannya:

  • write.csv() akan menulis fail csv dengan titik sebagai pemisah desimal dan koma sebagai pemisah sel.

  • write.csv2() akan menulis fail csv dengan koma sebagai pemisah desimal dan titi-koma sebagai pemisah sel.

Kita dapat mengekspor set data hasil pengolahan kita menjadi fail dengan format data terstruktur seperti .csv atau Excel (.xls, .xlsx) dengan fungsi write.csv2() atau write.xlsx().

Format perintah fungsi-fungsi ini adalah:

write.csv2(variabel_dataset, "nama_file_ekspor.csv")

write.xlsx(variabel_dataset, "nama_file_ekspor.xlsx")

Seluruh fail yang diekspor lokasi direktorinya sama seperti lokasi file .Rproj kita.

1.3.9.1 Mengekspor set data ke fail .csv

Terdapat dua jenis fungsi untuk mengekspor set data ke fail .csv: write.csv() dan write.csv2(). Perbedaan antara keduanya adalah pemisah nilainya.

Fungsi write.csv() digunakan untuk set data yang menggunakan tanda titik sebagai pemisah desimal, sehingga pemisahnya adalah tanda koma (,). Ini adalah format yang biasa dipakai di Amerika Utara.

Sementara itu, write.csv2() menggunakan pemisah titik-koma (;) (semicolon). Ini digunakan untuk set data yang pemisah desimalnya adalah tanda koma.

# Mengekspor data_gabungan dalam format csv
write.csv2(data_gabungan, "Data UINRIL & UBL.csv")

1.3.9.2 Mengekspor set data ke fail .xlsx

Sama seperti write.csv2(), fungsi write.xlsx() juga mengikuti format yang sama.

write.xlsx(data_gabungan, "Data UINRIL & UBL.xlsx")

Jika kita ingin mengekspor fail ke dalam suatu direktori yang sudah ada, misalnya dir-saya, maka kita bisa menambahkan nama direktori tersebut sebelum nama failnya.

# Mengekspor data_gabungan ke dalam direktori dir-saya
write.csv2(data_gabungan, "dir-saya/Data UINRIL & UBL.csv")

Aktivitas Mandiri 4: Mengekspor Set Data Gabungan STP-1.3, STP-1.4

Simpan ke file - Ekspor hasil gabungan dengan write.xlsx() - Nama file: Prak1_[NIM]_[Nama].xlsx - Pastikan direktori file hasil ekspor ada di direktori output.