# Pengantar

Workshop ini mengikuti alur kerja data science: **Import → Tidy → Transform → Visualize → Model → Communicate** (Wickham & Grolemund, 2017).

![Alur kerja data science](images/data-workflow.png)

Workshop ini dirancang sebagai sesi **live-coding**. Tujuannya bukan hanya agar peserta bisa menyalin kode, tetapi juga memahami alur berpikir saat bekerja dengan data di R.

- Ikuti praktik secara bertahap sambil mencoba kode sendiri
- Jangan takut bereksperimen dan membuat error kecil
- Target sesi ini adalah membangun **fondasi** dan **kepercayaan diri** untuk belajar R secara mandiri

### Garis Besar Seri Workshop

1. **Impor** data ke R dari file atau sumber lain
2. **Rapikan (tidy)** data agar setiap kolom = variabel dan setiap baris = observasi
3. **Transformasi** data untuk filter, membuat variabel baru, dan menghitung ringkasan
4. **Visualisasi** dan **pemodelan** untuk memahami pola dan menguji hubungan
5. **Komunikasikan** hasil agar temuan dapat dipahami orang lain

### Rencana Hari Ini

- **Bagian 1**: Dasar-dasar R — objek, tipe data, vektor, faktor, dataframe
- **Bagian 2**: Pengolahan data dengan Tidyverse — import, filter, select, mutate, summarize
- **Bagian 3**: Visualisasi dan statistik deskriptif — ggplot2, histogram, boxplot, scatter plot, korelasi

---

## Apa itu R? Apa itu RStudio?

**R**: Bahasa pemrograman open-source yang dikembangkan untuk analisis statistik dan visualisasi. Komunitas R sangat aktif berbagi kode dan membuat paket-paket yang memperluas fungsionalitas R.

**RStudio**: Lingkungan pengembangan terintegrasi (IDE) yang memudahkan kita berinteraksi dengan R — menulis kode, menavigasi file, memeriksa variabel, dan memvisualisasikan plot.

- Anda perlu menginstal **keduanya**: R terlebih dahulu, baru kemudian RStudio.
- Kunjungi <https://posit.co/download/rstudio-desktop> untuk mengunduh.

R adalah **bahasanya**, sedangkan RStudio adalah **tempat bekerja** dengan bahasa tersebut. Dalam praktik sehari-hari, kita hampir selalu memakai keduanya secara berpasangan.

## Tur RStudio

Pertama, kita perlu familiar dengan antarmuka RStudio. Kita akan menggunakan RStudio untuk menulis kode, menavigasi file di komputer, memeriksa variabel yang kita buat, dan memvisualisasikan plot yang kita hasilkan.

![Tampilan R Studio](images/rstudio-tour.jpg){fig-align="center"}

### Sebelum Mulai Coding

1. **Working directory**: Folder tempat R mencari dan menyimpan file. Praktik terbaik: gunakan **R Project**.
2. **Buat proyek**: `File` > `New Project` > `New Directory` > `New Project`.
3. **Buat folder** di dalam proyek:
   - `data` — data mentah (jangan diubah!)
   - `data-output` — data yang sudah dimodifikasi
   - `fig-output` — grafik yang disimpan

Jika working directory tidak sesuai, ubah dari file browser di RStudio melalui menu **More → Set As Working Directory**.

::: {.callout-tip}
Jangan taruh proyek di folder OneDrive. Hindari spasi dan karakter khusus pada nama folder/file.
:::

Sebelum mulai menulis banyak kode, biasakan membuat **script R** baru melalui `File > New File > R Script`. Jalankan baris kode dari editor dengan shortcut `Ctrl + Enter` agar kode tersimpan dan mudah diulang.

### Penyegaran: Tipe Data Kuantitatif

**Data Non-Kontinu:**

- **Nominal/Kategorikal**: Data non-urut, non-numerik (contoh: kebangsaan, status pekerjaan)
- **Ordinal**: Data non-numerik berurutan (contoh: peringkat, frekuensi olahraga)
- **Diskrit**: Data numerik dengan nilai tertentu — biasanya bilangan bulat (contoh: ukuran sepatu)
- **Biner**: Data nominal dengan dua kemungkinan (contoh: ya/tidak, lulus/gagal)

**Data Kontinu:**

- **Interval**: Tidak memiliki "nol sejati" (contoh: suhu Celsius — 0°C bukan berarti tidak ada panas)
- **Rasio**: Memiliki "nol sejati" (contoh: pendapatan — 0 berarti tidak ada pendapatan)

---

# Bagian 1: Dasar-Dasar R

## 1. Objek dan Nilai

```{r}
country_name <- "Singapore"
```

- `"Singapore"` adalah sebuah **nilai** (value)
- `country_name` adalah **objek** tempat kita menyimpan nilai
- `<-` adalah operator penugasan (assignment). Shortcut: `Alt` + `-` (Windows) atau `Option` + `-` (Mac)

Aturan penamaan objek: tidak boleh dimulai angka, case-sensitive, tidak boleh ada spasi, beberapa kata dicadangkan.

Anda juga bisa menggunakan `=`, tetapi dalam R, penulisan dengan `<-` adalah konvensi yang paling umum dan lebih mudah dikenali saat membaca script.

## 2. Tipe Data Dasar

R memiliki 4 tipe data dasar:

```{r}
country_code <- "SGP"          # character
life_satisfaction <- 8.5        # numeric (double)
is_religious <- TRUE            # logical (boolean)
birth_year <- 1990L             # integer

typeof(country_code)
typeof(life_satisfaction)
typeof(is_religious)
```

- Untuk menyertakan komentar dalam kode, gunakan karakter `#`. Apa pun di sebelah kanan `#` diabaikan oleh R saat eksekusi.
- Praktik yang baik untuk membuat catatan dan menjelaskan kode.

Untuk memeriksa tipe data, kita bisa menggunakan `typeof()` atau `str()`. Fungsi `str()` berguna karena menampilkan **tipe data sekaligus isinya** secara ringkas.

### Operasi Aritmatika

```{r}
(8 + 7 + 9) / 3    # rata-rata tiga skor
2025 - 1990         # hitung usia
```

### Operasi Boolean

```{r}
life_satisfaction > 8                              # TRUE
country_code == "SGP"                              # TRUE
(country_code == "NZL") & (life_satisfaction > 8)  # AND: FALSE
(country_code == "NZL") | (life_satisfaction > 8)  # OR: TRUE
```

- Operator `&` berarti **kedua kondisi harus benar**
- Operator `|` berarti **minimal satu kondisi benar**

Operasi boolean sangat penting karena nantinya dipakai untuk **memfilter data**.

## 3. Fungsi

Fungsi mengambil input dan menghasilkan output. Nama fungsi selalu diikuti tanda kurung `()`.

Cara paling sederhana memahami fungsi adalah menganggapnya sebagai **resep**: fungsi menerima bahan (input), memprosesnya, lalu menghasilkan output.

```{r}
round(3.1415926)             # default: 0 desimal
round(3.1415926, digits = 2) # argumen opsional
```

Gunakan `?round` di konsol untuk melihat dokumentasi fungsi.

- `3.1415926` adalah argumen yang dibutuhkan oleh fungsi `round()`
- `digits` adalah argumen opsional yang mengubah cara fungsi bekerja

Pola ini berlaku untuk hampir semua fungsi di R: ada argumen wajib, dan sering ada argumen tambahan untuk mengatur detail perilaku fungsi.

## Struktur Data di R

![](images/data-structures.svg){width=100% height=100%}

Kita akan mengeksplorasi 3 tipe dasar **struktur data** di R:

1. **Vektor** — dapat menampung beberapa nilai dalam satu objek
2. **Faktor** — struktur khusus untuk variabel kategorikal
3. **Dataframe** — struktur tabular (baris × kolom) untuk pemrosesan, plotting, dan statistik

Tipe lain (tidak dibahas): Lists, Matrices.

## 4. Vektor

Bayangkan vektor sebagai satu kolom dalam dataset. Vektor hanya bisa berisi 1 tipe data, dan dibuat dengan fungsi `c()`.

Vektor adalah struktur data paling dasar dan paling sering dipakai di R. Banyak operasi di R sebenarnya bekerja pada vektor, termasuk perhitungan, logika, dan indexing.

```{r}
countries <- c("CAN", "NZL", "SGP", "CAN", "SGP")
satisfaction_scores <- c(8, 7, 9, 6, 8)

length(countries)
mean(satisfaction_scores)
sd(satisfaction_scores)
```

### Mengakses Elemen Vektor

```{r}
countries[1]              # elemen pertama
satisfaction_scores[1:3]  # elemen 1 sampai 3
satisfaction_scores[c(1, 3)]  # elemen 1 dan 3
```

Tanda kurung siku `[]` digunakan untuk **mengambil bagian tertentu dari data**, sedangkan tanda kurung bulat `()` digunakan untuk **menjalankan fungsi**.

### Filtering dengan Kondisi

```{r}
criteria <- satisfaction_scores > 7
satisfaction_scores[criteria]
```

### Menangani Nilai NA

```{r}
financial_satisfaction <- c(8, 7, NA, 6, 9, NA, 7)
mean(financial_satisfaction)                  # NA!
mean(financial_satisfaction, na.rm = TRUE)    # hapus NA dulu
```

## 5. Dataframe

Dataframe = struktur data tabular (baris × kolom), seperti spreadsheet.

Ini adalah struktur yang paling sering digunakan untuk analisis data, karena hampir semua dataset survei, eksperimen, dan administrasi dapat direpresentasikan sebagai tabel.

```{r}
survey_data <- data.frame(
  country = c("SGP", "CAN", "NZL", "SGP", "CAN"),
  life_satisfaction = c(8, 7, 9, 6, 8),
  employment = c("Full time", "Student", "Part time", "Retired", "Full time")
)
survey_data
```

### Mengakses Kolom

```{r}
survey_data$country       # sebagai vektor
survey_data["country"]    # sebagai dataframe
survey_data[1, 2]         # baris 1, kolom 2
```

## 6. Faktor

Faktor = struktur data untuk variabel kategorikal. Memiliki `levels` yang terurut.

Walaupun terlihat seperti teks biasa, faktor disimpan secara khusus oleh R agar kategori dapat diperlakukan secara benar dalam tabulasi, visualisasi, dan model statistik.

```{r}
negara_factor <- factor(c("SGP", "CAN", "NZL", "SGP"))
levels(negara_factor)
```

Faktor berurutan (ordinal):

```{r}
pendidikan <- factor(c("SD", "SMA", "S1", "S2"),
                     levels = c("SD", "SMA", "S1", "S2"),
                     ordered = TRUE)
pendidikan
```

### Mengonversi Kolom Dataframe ke Faktor

Dalam praktik, kita sering perlu mengonversi kolom di dataframe ke faktor. Misalnya, kolom `negara` seharusnya berupa faktor karena berisi kategori, bukan teks bebas.

**Faktor tidak berurutan (nominal):**

```{r}
# Contoh: konversi kolom negara dari character ke factor
negara_contoh <- c("Singapura", "Kanada", "Selandia Baru", "Singapura")
negara_contoh <- factor(negara_contoh)

# Periksa levels (R mengurutkan secara alfabet)
levels(negara_contoh)
str(negara_contoh)
```

**Faktor berurutan (ordinal) — contoh dengan data survei:**

Sebagai contoh faktor berurutan, misalkan kita ingin mengurutkan `status_pekerjaan` dari yang paling tidak aktif ke paling aktif secara ekonomi:

```{r}
status_contoh <- c("Penuh waktu", "Pelajar/Mahasiswa", "Paruh waktu", "Pensiunan", "Penuh waktu")
status_contoh <- factor(status_contoh,
                        levels = c("Tidak bekerja", "Pelajar/Mahasiswa",
                                   "Ibu rumah tangga", "Pensiunan",
                                   "Paruh waktu", "Penuh waktu",
                                   "Wiraswasta", "Lainnya"),
                        ordered = TRUE)

levels(status_contoh)
str(status_contoh)
```

Dengan ordered factor, R memahami bahwa ada urutan antar kategori, sehingga operasi perbandingan (`>`, `<`) bisa dilakukan.

---

# Bagian 2: Pengolahan Data dengan Tidyverse

## 7. Muat Paket

```{r}
library(tidyverse)
library(readxl)
```

`tidyverse` adalah kumpulan paket untuk data science: `dplyr` (manipulasi), `ggplot2` (visualisasi), `tidyr` (reshaping), dll.

- **Instalasi paket** biasanya cukup sekali saja: `install.packages("nama_paket")`
- **Memuat paket** perlu dilakukan setiap sesi R baru dengan `library(nama_paket)`

Dalam workshop ini, `tidyverse` dipakai sebagai toolkit utama karena sintaksnya konsisten dan relatif mudah dibaca.

### Mengapa Menggunakan Tidyverse?

- Kode terlihat lebih mirip bahasa Inggris sehingga lebih intuitif
- Tidyverse mengikuti pola sintaks yang konsisten
- Pesan error yang lebih jelas dan membantu

Contoh perbandingan:

```r
# Base R
subset_data <- data[data$usia > 18 & data$kepuasan_hidup > 5, c("negara", "usia")]

# Tidyverse  
subset_data <- data |> 
  filter(usia > 18, kepuasan_hidup > 5) |> 
  select(negara, usia)
```

Fungsi yang akan sering digunakan: `drop_na()`, `select()`, `filter()`, `mutate()`, `if_else()`, `case_when()`, `group_by()`, `summarize()`.

Cheatsheet berguna:

- [dplyr cheatsheet](https://rstudio.github.io/cheatsheets/html/data-transformation.html)
- [tidyr cheatsheet](https://rstudio.github.io/cheatsheets/html/tidyr.html)

## 8. Import Data

```{r}
wvs1 <- read_excel("data/regresi/wvs1.xlsx")
wvs2 <- read_excel("data/regresi/wvs2.xlsx")

# Gabungkan kedua dataset
wvs <- bind_rows(wvs1, wvs2)
glimpse(wvs)
```

### Fungsi Eksplorasi

```{r}
dim(wvs)
names(wvs)
```

Fungsi-fungsi eksplorasi seperti `dim()`, `names()`, `str()`, `head()`, dan `tail()` berguna untuk memahami bentuk dataset sebelum mulai membersihkan atau menganalisisnya.

## 9. Operator Pipe (`|>`)

Pipe memungkinkan kita merangkai operasi tanpa membuat variabel perantara. Shortcut: `Ctrl`+`Shift`+`M`.

Pipe membuat alur kerja lebih mudah dibaca karena kita dapat menuliskan langkah transformasi dari atas ke bawah, mengikuti urutan logis proses analisis.

```{r}
wvs_data <- wvs 
```

```{r}
# Tanpa pipe
wvs_data <- drop_na(wvs_data)
wvs_sorted <- arrange(wvs_data, desc(usia))
```

```{r}
# Dengan pipe
wvs_data |> 
  drop_na() |> 
  arrange(desc(usia))
```

## 10. Data Wrangling

Bayangkan kita adalah asisten peneliti yang sedang menyiapkan data survei agar siap dianalisis. Langkah umum yang biasanya dilakukan adalah:

1. Menghapus nilai hilang
2. Menghapus duplikasi
3. Memilih variabel yang relevan
4. Menyaring observasi sesuai kriteria
5. Membuat variabel baru
6. Menyimpan hasil pembersihan

### Langkah 1: Hapus Nilai Kosong

```{r}
wvs <- wvs |> drop_na()
dim(wvs)
```

### Langkah 2: Hapus Duplikasi

```{r}
wvs <- wvs |> distinct(id_responden, .keep_all = TRUE)
```

### Langkah 3: Pilih Kolom (select)

```{r}
wvs <- wvs |>
  select(id_responden, negara, jenis_kelamin, tahun_lahir, usia,
         kepuasan_hidup, pentingnya_pekerjaan, kepuasan_finansial,
         kebebasan_memilih, religiusitas, skala_politik,
         status_pernikahan, status_pekerjaan)
glimpse(wvs)
```

### Langkah 4: Filter dan Urutkan

```{r}
wvs <- wvs |>
  filter(usia >= 18) |>
  arrange(desc(usia))

head(wvs)
```

### Langkah 5: Buat Variabel Baru (mutate + case_when)

```{r}
wvs <- wvs |>
  mutate(kelompok_usia = case_when(
    usia <= 28 ~ "18-28",
    usia <= 44 ~ "29-44",
    usia <= 60 ~ "45-60",
    TRUE       ~ "61+"
  ))

wvs |>
  select(usia, kelompok_usia) |>
  head(4)
```

### Simpan Hasil

```{r}
wvs |> write_csv("data-output/wvs_cleaned_v1.csv")
```

```{r}
# Simpan ke excel
library(writexl)
wvs |> write_xlsx("data-output/wvs_cleaned_v1.xlsx")
```

### Konversi ke Factor

```{r}
kolom_faktor <- c("negara", "jenis_kelamin", "status_pernikahan", "status_pekerjaan")

wvs_cleaned <- wvs |>
  mutate(across(all_of(kolom_faktor), as_factor))

str(wvs_cleaned[kolom_faktor])
```

## 11. Group By + Summarize

Tujuan ringkasan deskriptif adalah mengubah data mentah menjadi informasi yang lebih ringkas. Dalam praktiknya, kita sering ingin menghitung rata-rata, simpangan baku, atau jumlah observasi **per kelompok**.

```{r}
wvs_cleaned |>
  summarize(
    rata_rata = mean(kepuasan_hidup),
    sd = sd(kepuasan_hidup),
    n = n(),
    .by = negara
  )
```

Fungsi `summarize()` menghitung ringkasan statistik per grup yang ditentukan oleh `.by`. Di sini kita mendapat rata-rata, SD, dan jumlah observasi kepuasan hidup untuk setiap negara. Selandia Baru memiliki rata-rata tertinggi (7.60), Thailand terendah (6.56).

### Grup Kepuasan: if_else

```{r}
wvs_cleaned <- wvs_cleaned |>
  mutate(
    grup_kepuasan = if_else(
      kepuasan_hidup > mean(kepuasan_hidup),
      "Di Atas Rata-rata",
      "Di Bawah Rata-rata"
    )
  )

table(wvs_cleaned$negara, wvs_cleaned$grup_kepuasan)
```

Fungsi `if_else()` membuat variabel baru dengan dua kemungkinan nilai berdasarkan kondisi. `table()` lalu menampilkan tabulasi silang antara `negara` dan `grup_kepuasan`. Hasilnya menunjukkan frekuensi responden "Di Atas" vs "Di Bawah" rata-rata per negara.

Fungsi `if_else()` cocok untuk aturan sederhana dengan dua hasil, sedangkan `case_when()` lebih cocok jika kita punya banyak kondisi seperti pada pembuatan `kelompok_usia`.

### Pivot: Reshape Data

```{r}
wvs_cleaned |>
  summarize(
    rata_kepuasan = mean(kepuasan_hidup),
    .by = c(negara, kelompok_usia)
  ) |>
  pivot_wider(
    names_from = kelompok_usia,
    values_from = rata_kepuasan
  )
```

Fungsi `pivot_wider()` mengubah data dari format "panjang" ke "lebar" — kolom `kelompok_usia` menjadi nama kolom baru, dan nilainya diisi oleh `rata_kepuasan`. Hasilnya lebih mudah dibaca untuk perbandingan antar kelompok usia per negara.

### Latihan Tidyverse

Muat file `data/regresi/wvs2.xlsx`, gabungkan dengan `wvs_data` menggunakan `bind_rows()`. Saring hanya responden dari Indonesia, lalu hitung rata-rata `kepuasan_hidup` per `jenis_kelamin`.

```{r}
#| code-fold: true
#| code-summary: Jawaban
wvs2_latihan <- read_excel("data/regresi/wvs2.xlsx")
wvs_gabungan <- bind_rows(wvs_data, wvs2_latihan)

wvs_gabungan |>
  filter(negara == "Indonesia") |>
  summarize(
    rata_kepuasan = mean(kepuasan_hidup, na.rm = TRUE),
    n = n(),
    .by = jenis_kelamin
  )
```

---

# Bagian 3: Visualisasi dan Statistik Deskriptif

## 12. Statistik Deskriptif

### Ukuran Pemusatan

```{r}
library(DescTools)
mean(wvs_cleaned$usia, na.rm = TRUE)
median(wvs_cleaned$usia, na.rm = TRUE)
DescTools::Mode(wvs_cleaned$usia, na.rm = TRUE)
```

### Ukuran Penyebaran

```{r}
sd(wvs_cleaned$usia, na.rm = TRUE)
var(wvs_cleaned$usia, na.rm = TRUE)
range(wvs_cleaned$usia, na.rm = TRUE)
IQR(wvs_cleaned$usia, na.rm = TRUE)
```

### Ringkasan per Variabel

```{r}
wvs_cleaned |>
  select(kepuasan_hidup, kebebasan_memilih, kepuasan_finansial, usia) |>
  pivot_longer(everything(), names_to = "variabel", values_to = "nilai") |>
  summarize(
    M = mean(nilai), SD = sd(nilai),
    Min = min(nilai), Max = max(nilai),
    .by = variabel
  )
```

Kombinasi `pivot_longer()` + `summarize()` dipakai untuk menghitung statistik deskriptif (M, SD, Min, Max) sekaligus untuk beberapa variabel numerik. Ini cara efisien menghindari penulisan `mean()`, `sd()` berulang per variabel.

### Tabel Frekuensi

```{r}
table(wvs_cleaned$negara)
```

Fungsi `table()` menghitung frekuensi setiap level dalam variabel faktor. Output menunjukkan jumlah responden per negara — Kanada paling banyak (4.018), Selandia Baru paling sedikit (660).

## 13. Pengantar ggplot2

`ggplot2` adalah sistem visualisasi data berbasis **"Grammar of Graphics"** — setiap plot dibangun dari **layers** (lapisan) yang ditumpuk satu per satu.

Struktur dasar:

```r
ggplot(data, aes(x = var_x, y = var_y)) +
  geom_tipe_plot()
```

Komponen utama:

| Komponen | Fungsi |
|----------|--------|
| `ggplot()` | Inisialisasi plot dengan data |
| `aes()` | Pemetaan variabel ke estetika visual (x, y, warna, ukuran, dll.) |
| `geom_*()` | Tipe geometri plot (titik, garis, bar, histogram, dll.) |
| `labs()` | Label dan judul |
| `theme_*()` | Tema tampilan |
| `facet_wrap()` | Membagi plot berdasarkan variabel kategorikal |

Karena dibangun secara berlapis, kita bisa mulai dari plot sederhana lalu menambahkan elemen sedikit demi sedikit sampai visualisasi menjadi informatif.

## 14. Visualisasi

### Histogram

```{r}
ggplot(wvs_cleaned, aes(x = kepuasan_hidup)) +
  geom_histogram(binwidth = 1, fill = "steelblue", color = "white") +
  labs(title = "Distribusi Kepuasan Hidup", x = "Kepuasan Hidup", y = "Frekuensi")
```

`geom_histogram()` menampilkan distribusi frekuensi variabel numerik. Parameter `binwidth = 1` mengatur lebar setiap batang = 1 unit. Distribusi kepuasan hidup tampak miring ke kiri (negatively skewed) — mayoritas responden melaporkan skor 7–8.

### Boxplot per Negara

```{r}
ggplot(wvs_cleaned, aes(x = negara, y = kepuasan_hidup, fill = negara)) +
  geom_boxplot() +
  labs(title = "Kepuasan Hidup per Negara", x = "Negara", y = "Kepuasan Hidup") +
  theme(legend.position = "none")
```

`geom_boxplot()` menampilkan distribusi variabel numerik per kategori: median (garis tengah), IQR (kotak), dan outlier (titik). Argumen `fill = negara` memberi warna berbeda per negara. Selandia Baru memiliki median tertinggi; Indonesia memiliki IQR paling lebar.

### Bar Chart

```{r}
ggplot(wvs_cleaned, aes(x = negara, fill = negara)) +
  geom_bar() +
  labs(title = "Jumlah Responden per Negara", x = "Negara", y = "Jumlah") +
  theme_minimal() +
  theme(legend.position = "none")
```

### Pie Chart

```{r}
proporsi_negara <- wvs_cleaned |>
  count(negara) |>
  mutate(persen = n / sum(n) * 100)

ggplot(proporsi_negara, aes(x = "", y = persen, fill = negara)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  labs(title = "Proporsi Responden per Negara") +
  theme_void()
```

### Scatter Plot

```{r}
ggplot(wvs_cleaned, aes(x = kebebasan_memilih, y = kepuasan_hidup)) +
  geom_jitter(alpha = 0.1, width = 0.3, height = 0.3) +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "Kebebasan Memilih vs Kepuasan Hidup",
       x = "Kebebasan Memilih", y = "Kepuasan Hidup")
```

`geom_jitter()` menyebarkan titik data agar tidak menumpuk (karena skala diskrit), dan `geom_smooth(method = "lm")` menambahkan garis regresi linear. Pola menunjukkan hubungan positif: semakin tinggi kebebasan memilih, semakin tinggi kepuasan hidup.

### Latihan: Histogram

Buat histogram `kepuasan_finansial` dengan `binwidth = 1`.

```{r}
#| code-fold: true
#| code-summary: Jawaban
ggplot(wvs_cleaned, aes(x = kepuasan_finansial)) +
  geom_histogram(binwidth = 1, fill = "steelblue", color = "white") +
  labs(title = "Distribusi Kepuasan Finansial",
       x = "Kepuasan Finansial", y = "Frekuensi") +
  theme_minimal()
```

### Tabulasi Silang

Tabulasi silang membantu kita melihat distribusi bersama dari dua variabel kategorikal. Ini berguna sebelum membuat stacked bar chart atau grouped bar chart.

```{r}
wvs_cleaned |>
  count(negara, kelompok_usia) |>
  pivot_wider(names_from = negara, values_from = n)
```

### Stacked Bar Chart

```{r}
ggplot(wvs_cleaned, aes(x = negara, fill = kelompok_usia)) +
  geom_bar() +
  labs(title = "Distribusi Kelompok Usia per Negara",
       x = "Negara", y = "Jumlah", fill = "Kelompok Usia") +
  theme_minimal()
```

### Grouped Bar Chart

```{r}
ggplot(wvs_cleaned, aes(x = negara, fill = kelompok_usia)) +
  geom_bar(position = "dodge") +
  labs(title = "Distribusi Kelompok Usia per Negara (Grouped)",
       x = "Negara", y = "Jumlah", fill = "Kelompok Usia") +
  theme_minimal()
```

### Proportional Bar Chart

```{r}
ggplot(wvs_cleaned, aes(x = negara, fill = kelompok_usia)) +
  geom_bar(position = "fill") +
  labs(title = "Proporsi Kelompok Usia per Negara",
       x = "Negara", y = "Proporsi", fill = "Kelompok Usia") +
  theme_minimal() +
  scale_y_continuous(labels = scales::percent)
```

## 15. Korelasi

```{r}
cor(wvs_cleaned$kepuasan_finansial, wvs_cleaned$kepuasan_hidup)
```

Fungsi `cor()` menghitung korelasi Pearson antara dua variabel numerik. Nilai r = 0.57 menunjukkan hubungan positif moderat–kuat antara kepuasan finansial dan kepuasan hidup.

### Matriks Korelasi

```{r}
library(corrplot)

wvs_cleaned |>
  select(kepuasan_hidup, kepuasan_finansial, religiusitas,
         kebebasan_memilih, usia) |>
  cor(use = "complete.obs") |>
  corrplot(method = "color", type = "upper",
           addCoef.col = "black", number.cex = 0.8,
           tl.col = "black", tl.cex = 0.8)
```

Fungsi `corrplot()` memvisualisasikan matriks korelasi. Warna biru tua = korelasi positif kuat, merah = negatif. Korelasi terkuat: kepuasan finansial–kepuasan hidup (0.57). Religiusitas dan usia nyaris tidak berkorelasi dengan variabel lain.

## 16. Faceting

```{r}
ggplot(wvs_cleaned, aes(x = kepuasan_finansial, y = kepuasan_hidup)) +
  geom_jitter(alpha = 0.2, width = 0.3, height = 0.3) +
  geom_smooth(method = "lm", color = "red") +
  facet_wrap(~ negara) +
  labs(title = "Kepuasan Finansial vs Kepuasan Hidup per Negara",
       x = "Kepuasan Finansial", y = "Kepuasan Hidup") +
  theme_minimal()
```

`facet_wrap(~ negara)` memecah satu plot menjadi panel terpisah berdasarkan variabel kategorikal. Ini memudahkan perbandingan pola hubungan kepuasan finansial–kepuasan hidup antar negara. Slope positif konsisten di semua negara.

### Menyimpan Plot

Setelah membuat plot yang rapi, simpan hasilnya dengan `ggsave()` agar dapat digunakan dalam laporan, slide, atau artikel.

```r
p <- ggplot(wvs_cleaned, aes(x = kepuasan_finansial, y = kepuasan_hidup)) +
  geom_jitter(alpha = 0.2) +
  geom_smooth(method = "lm") +
  theme_minimal()

ggsave("output/scatter_kepuasan.png", plot = p, width = 8, height = 6, dpi = 300)
```

---

# Troubleshooting

Jenis pesan di R:

- **Error**: Kesalahan fatal — kode gagal dijalankan. Harus diperbaiki.
- **Warning**: Pesan peringatan — kode tetap berjalan tetapi ada potensi masalah.
- **Message**: Informasi — biasanya bisa diabaikan.

Checklist jika kode error:

- Sudah mengatur working directory?
- Cek koma (`,`) dan tanda kurung `()` yang hilang?
- Cek ejaan? (R peka huruf besar/kecil!)
- Cek tanda kutip `""` dan operator?

Kesalahan kecil seperti kapitalisasi (`sum` vs `sUm`), tanda baca yang kurang, atau salah menaruh tanda kutip sering menjadi penyebab error paling umum bagi pemula.

---

# Rekap Sesi 1

- **Dasar R**: objek, tipe data (character, numeric, logical, integer), vektor, faktor, dataframe
- **Tidyverse**: `select()`, `filter()`, `mutate()`, `case_when()`, `group_by()`, `summarize()`, `pivot_wider()`, operator pipe `|>`
- **Visualisasi**: histogram, boxplot, bar chart, pie chart, scatter plot, faceting, matriks korelasi
- **Statistik Deskriptif**: mean, median, mode, sd, var, range, IQR, tabulasi frekuensi

---

# Latihan

## Latihan 1

Buat boxplot `kepuasan_finansial` per `jenis_kelamin`.

```{r}
#| code-fold: true
#| code-summary: Jawaban
ggplot(wvs_cleaned, aes(x = jenis_kelamin, y = kepuasan_finansial,
                        fill = jenis_kelamin)) +
  geom_boxplot() +
  labs(title = "Kepuasan Finansial per Jenis Kelamin",
       x = "Jenis Kelamin", y = "Kepuasan Finansial") +
  theme_minimal() +
  theme(legend.position = "none")
```

## Latihan 2

Hitung rata-rata `kebebasan_memilih` per `negara` dan `jenis_kelamin`.

```{r}
#| code-fold: true
#| code-summary: Jawaban
wvs_cleaned |>
  summarize(
    rata_kebebasan = mean(kebebasan_memilih, na.rm = TRUE),
    n = n(),
    .by = c(negara, jenis_kelamin)
  )
```

## Latihan 3

Buat boxplot `kepuasan_finansial` per `jenis_kelamin`, dengan facet per `negara`.

```{r}
#| code-fold: true
#| code-summary: Jawaban
ggplot(wvs_cleaned, aes(x = jenis_kelamin, y = kepuasan_finansial,
                        fill = jenis_kelamin)) +
  geom_boxplot() +
  facet_wrap(~ negara) +
  labs(title = "Kepuasan Finansial per Jenis Kelamin dan Negara",
       x = "Jenis Kelamin", y = "Kepuasan Finansial") +
  theme_minimal() +
  theme(legend.position = "none")
```

