Penggunaan bahasa R menjadi penting di era data saat ini karena R adalah bahasa pemrograman yang dirancang khusus untuk analisis data dan statistik. Dengan kemampuan yang kuat dalam mengolah, menganalisis, dan memvisualisasikan data, R telah menjadi salah satu alat utama bagi para data scientist, peneliti, dan analis di berbagai bidang.
Open-source dan gratis: Bisa menggunakan R tanpa perlu mengeluarkan biaya lisensi.
Komunitas yang besar: Ada banyak pengguna R di seluruh dunia sehingga mudah menemukan bantuan dan sumber daya.
Paket yang lengkap: R memiliki banyak paket khusus untuk analisis data, seperti raster, rgdal, dan meteoR.
Fleksibilitas: R sangat fleksibel yang memungkinkan melakukan berbagai jenis analisis, dari yang sederhana hingga yang kompleks.
Hal yang paling sederhana yang dapat dilakukan R adalah sebagai kalkulator atau menggunakannya sebagai kalkulator sederhana.
1 + 10
## [1] 11
R adalah bahasa pemrograman yang case-sensitive. Artinya perbedaan huruf kapital dan huruf kecil sangat berpengaruh.
a <- 3
a
## [1] 3
Bahasa pemrograman R mempunyai sedikit perbedaan dengan bahasa
pemrograman pada umumnya. Salah satunya adalah pada operator
assignment. Hampir semua bahasa pemrograman lain menggunakan
tanda =
sebagai operator assignment. Di R, yang
utama dan paling banyak digunakan oleh pengguna R adalah operator panah
kiri (<-
).
x <- 5
x
## [1] 5
Sebenarnya menggunakan operator =
juga bisa.
x = 5
Jika ingin mengetahui nilai suatu objek cukup panggil objek tersebut
atau gunakan fungsi print()
print(x)
## [1] 5
Operator Assignment Lainnya
Ada beberapa operator assignment lainnya yang dapat digunakan pada R.
Operator | Penjelasan |
---|---|
<- | nilai dari sebelah kanan dimasukkan ke dalam objek di sebelah kiri. |
-> | nilai dari sebelah kiri dimasukkan ke dalam objek di sebelah kanan. |
<<- | nilai dari sebelah kanan dimasukkan ke dalam objek global di sebelah kiri |
->> | nilai dari sebelah kiri dimasukkan ke dalam objek global di sebelah kanan |
# Nilai x sebelumnya
x
## [1] 5
# Nilai x yang baru
x <- 8 + 2
x
## [1] 10
# Nilai x yang baru
x <- x + 5
x
## [1] 15
52 -> x
x
## [1] 52
y <- 2 + 4
2 + 4 -> y
y
## [1] 6
Aturan penamaan objek di R hampir sama dengan aturan penamaan pada bahasa pemrograman lain. Namun ada beberapa aturan khusus yang terdapat di R. Berikut aturan penamaan objek di R:
Nama variabel harus dimulai dengan sebuah huruf dan dapat berupa kombinasi huruf, angka, titik(.) dan garis bawah (_). Jika diawali dengan titik(.), maka tidak boleh diikuti dengan angka.
Nama variabel tidak boleh dimulai dengan angka atau garis bawah (__).
Tidak mengandung spasi, tab atau karakter khusus seperti
!
, @
, #
dan lainnya.
Sebaiknya tidak menggunakan beberapa penamaan atau nilai yang
sudah digunakan oleh R (function dan keyword lainnya). Misalnya
c
, q
, TRUE
, FALSE
,
df
, dt
, rnorm
,
runif
, rf
, exp
, dan lain-lain.
Untuk mengetahui nama-nama yang sudah digunakan oleh R dapat mengetikkan
perintah ?reserved
di console RStudio.
# Contoh nama variable yang diperbolehkan
myvar <- "Universitas Indonesia"
my_var <- "Universitas Indonesia"
myVar <- "Universitas Indonesia"
MYVAR <- "Universitas Indonesia"
myvar2 <- "Universitas Indonesia"
.myvar <- "Universitas Indonesia"
R Comment
Komentar di R memiliki fungsi untuk membedakan antara R syntax dengan tulisan biasa/bukan kode. Ketika melakukan print output, maka R akan mengabaikan code yang terdapat symbol # (R comment).
Jika ingin membuat komentar multiline dapat menyisipkan simbol # tersebut pada setiap barisnya. Untuk mempermudah membuat komentar di R, bisa dengan shortcut keyboard CTRL+SHIFT+C.
Contoh komentar satu baris sebelum baris kode.
# Komentar satu baris sebelum baris kode
"Hello world"
## [1] "Hello world"
Contoh komentar satu baris di akhir baris kode.
"Hello world" #Komentar satu baris di akhir kode
## [1] "Hello world"
## [1] "Hello world"
Contoh komentar multiline.
# Ini adalah komentar multiline
# Cukup dengan menuliskan simbol # di setiap line code
"Hello world"
## [1] "Hello world"
Tipe Variabel
Tipe data dalam R meliputi numeric, complex, character, dan logical.
Mengecek tipe data suatu objek menggunakan class()
# numeric
x1 <- 78.5
class(x1)
## [1] "numeric"
# complex
x2 <- 9i + 13
class(x2)
## [1] "complex"
# character/string
x3 <- "Kalisari"
class(x3)
## [1] "character"
# logical/boolean
x4 <- TRUE
class(x4)
## [1] "logical"
Working Directory
Untuk mengetahui di folder kerja saat ini, gunakan perintah
getwd()
Set working direktori pada komputer: setwd()
Objek dalam R terdiri atas Vector, Factor, Matrix, Array, Dataframe,
List. Untuk melakukan pemeriksaan tipe variabel, gunakan perintah
str()
Vector adalah objek data paling sederhana dalam R. Vector merupakan
data array yang dapat menyimpan banyak data dalam 1 variabel saja dan
diakses menggunakan indeks. Fungsi yang paling sering digunakan untuk
membuat sebuah vector adalah dengan menuliskan c()
Secara umum jenis vector terbagi 2, yaitu numeric dan character.
x <- c(2, 1, 5, 3, 1)
x
## [1] 2 1 5 3 1
x[2]
## [1] 1
Untuk membuat sebuah vector numeric berurutan secara meningkat atau menurun.
x <- 1:10 # 1 sampai 10
x
## [1] 1 2 3 4 5 6 7 8 9 10
Fungsi ini dapat digunakan untuk membuat vector berurutan dan dengan increment tertentu.
x <- seq(from = 1, to = 10, by = 2)
x
## [1] 1 3 5 7 9
x <- seq(from = 1, to = 10, length.out = 7)
x
## [1] 1.0 2.5 4.0 5.5 7.0 8.5 10.0
Dengan perintah rep()
dapat dibuat sebuah vector dengan
mengulang-ulang nilai.
x <- rep(3, 10)
x
## [1] 3 3 3 3 3 3 3 3 3 3
Vector character adalah vector yang semua elemennya bertipe character.
y <- c("a", "A", "d", "c")
y
## [1] "a" "A" "d" "c"
Memeriksa jenis objek:
str(y)
## chr [1:4] "a" "A" "d" "c"
Factor merupakan bentuk lebih luas dari vector. Biasanya factor lebih
sering digunakan untuk menyimpan data nominal atau ordinal. Misalnya
tampilan dari isi datanya mungkin "male"
dan
"female"
tetapi isi dari factor adalah pengkodean numerik.
Misal untuk "female"
nilai sebenarnya adalah
1
, sedangkan "male"
berniali
2
.
fc <- factor(c("SD", "SMA", "SMP", "SMP", "SD", "SMA", "SD", "SMP", "Kuliah"))
fc
## [1] SD SMA SMP SMP SD SMA SD SMP Kuliah
## Levels: Kuliah SD SMA SMP
Matriks adalah objek di R yang memiliki 2 dimensi, baris (row/m) dan kolom (column/n), dan tipe nilainya sama. Jadi, jika Vector menyimpan nilai 1 dimensi, maka Matrix dapat menyimpan nilai 2 dimensi.
x <- c(1, 2, 5, 14, 12, 12, 23, 33, 5, 43, 11, 0, 4, 3, 0, 6)
x
## [1] 1 2 5 14 12 12 23 33 5 43 11 0 4 3 0 6
m <- matrix(data = x, nrow = 4)
m
## [,1] [,2] [,3] [,4]
## [1,] 1 12 5 4
## [2,] 2 12 43 3
## [3,] 5 23 11 0
## [4,] 14 33 0 6
m <- matrix(data = x, nrow = 8)
m
## [,1] [,2]
## [1,] 1 5
## [2,] 2 43
## [3,] 5 11
## [4,] 14 0
## [5,] 12 4
## [6,] 12 3
## [7,] 23 0
## [8,] 33 6
m <- matrix(data = x, nrow = 7, ncol = 3)
## Warning in matrix(data = x, nrow = 7, ncol = 3): data length [16] is not a
## sub-multiple or multiple of the number of rows [7]
m
## [,1] [,2] [,3]
## [1,] 1 33 0
## [2,] 2 5 6
## [3,] 5 43 1
## [4,] 14 11 2
## [5,] 12 0 5
## [6,] 12 4 14
## [7,] 23 3 12
x=c(2,4)
y=c(6,8)
m1=cbind(x,y)
m1
## x y
## [1,] 2 6
## [2,] 4 8
m2=matrix(c(10,20,30,40),ncol=2)
m2
## [,1] [,2]
## [1,] 10 30
## [2,] 20 40
m3=matrix(c(1,3,2,5,-1,2,2,3,9),ncol=3,byrow=T)
m3
## [,1] [,2] [,3]
## [1,] 1 3 2
## [2,] 5 -1 2
## [3,] 2 3 9
t(m3) # transpose dari m3
## [,1] [,2] [,3]
## [1,] 1 5 2
## [2,] 3 -1 3
## [3,] 2 2 9
m3[2,3] #element dari m3 pada baris 2, kolom 3
## [1] 2
m3[2,] #baris 2
## [1] 5 -1 2
m3[,3] #kolom 3
## [1] 2 2 9
m3[-1,] #submatrix dari m3 tanpa baris pertama
## [,1] [,2] [,3]
## [1,] 5 -1 2
## [2,] 2 3 9
m3[,-1] #submatrix dari m3 tanpa kolom pertama
## [,1] [,2]
## [1,] 3 2
## [2,] -1 2
## [3,] 3 9
m3[-1,-1] #submatrix dari m3 tanpa kolom pertama dan baris pertama
## [,1] [,2]
## [1,] -1 2
## [2,] 3 9
2*m1 #perkalian scalar
## x y
## [1,] 4 12
## [2,] 8 16
m1+m2 #penambahan matrix addition
## x y
## [1,] 12 36
## [2,] 24 48
m1 %*% m2 #perkalian component matrix
## [,1] [,2]
## [1,] 140 300
## [2,] 200 440
solve(m1) #inverse matrix
## [,1] [,2]
## x -1.0 0.75
## y 0.5 -0.25
diag(3) #membangun k by k identity matrix
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
diag(c(2,3,3)) #diagonal matrices
## [,1] [,2] [,3]
## [1,] 2 0 0
## [2,] 0 3 0
## [3,] 0 0 3
eigen(m2) #mencari eigen
## eigen() decomposition
## $values
## [1] 53.722813 -3.722813
##
## $vectors
## [,1] [,2]
## [1,] -0.5657675 -0.9093767
## [2,] -0.8245648 0.4159736
Untuk Array 3 dimensi dapat dibayangkan sebagai lapisan beberapa lembar kertas seperti pada gambar di atas. Berikut ini merupakan contoh array berdimensi 3 berisi 2 lapis matriks masing-masing berukuran 4 baris dan 4 kolom.
array(mtcars$mpg, dim = c(4, 4, 2))
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 21.0 18.7 22.8 17.3
## [2,] 21.0 18.1 19.2 15.2
## [3,] 22.8 14.3 17.8 10.4
## [4,] 21.4 24.4 16.4 10.4
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 14.7 21.5 19.2 15.8
## [2,] 32.4 15.5 27.3 19.7
## [3,] 30.4 15.2 26.0 15.0
## [4,] 33.9 13.3 30.4 21.4
Dataframe layaknya sebuah tabel di Ms Excel, terdiri dari baris dan kolom dengan nama masing-masing kolom berbeda.
x1 <- c(1, 3, 2, 6, 4, 7)
v1 <- c("a", "A", "c", "d", "e", "F")
data1 <- data.frame(x1 = x1, v1 = v1)
data1
## x1 v1
## 1 1 a
## 2 3 A
## 3 2 c
## 4 6 d
## 5 4 e
## 6 7 F
str(data1)
## 'data.frame': 6 obs. of 2 variables:
## $ x1: num 1 3 2 6 4 7
## $ v1: chr "a" "A" "c" "d" ...
# Menggunakan tanda dollar
data1$x1
## [1] 1 3 2 6 4 7
# Menggunakan indeks urutan posisi variable
data1[, 1]
## [1] 1 3 2 6 4 7
# Menggunakan double-bracket posisi variable
data1[[1]]
## [1] 1 3 2 6 4 7
# Menggunakan nama variable pada indeks
data1[, "x1"]
## [1] 1 3 2 6 4 7
Untuk membuat kolom baru dapat digunakan cara yang hampir sama dan
menggunakan assignment. Berikut ini akan dibuat kolom baru
bernama x2
berupa variable numeric.
data1$x2 <- 11
data1
## x1 v1 x2
## 1 1 a 11
## 2 3 A 11
## 3 2 c 11
## 4 6 d 11
## 5 4 e 11
## 6 7 F 11
data1$x3 <- data1$x1 + data1$x2
str(data1)
## 'data.frame': 6 obs. of 4 variables:
## $ x1: num 1 3 2 6 4 7
## $ v1: chr "a" "A" "c" "d" ...
## $ x2: num 11 11 11 11 11 11
## $ x3: num 12 14 13 17 15 18
Objek list
pada dasarnya mirip seperti vector, hanya
saja tipe elemennya bisa berbeda. Jika pada vector numeric semua
elemennya harus berupa numerik. Pada vector character semuanya harus
karakter. Pada objek list
elemennya dapat berupa vector,
factor, matriks, array, dataframe, bahkan list di dalam list atau objek
lain seperti model prediktif yang dibuat di R
list(2, "A", c(4, 5, 2), iris[1:5,])
## [[1]]
## [1] 2
##
## [[2]]
## [1] "A"
##
## [[3]]
## [1] 4 5 2
##
## [[4]]
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
Pada dasarnya R adalah bahasa pemrograman functional atau Functional Programming (FP). Karena dibuat untuk memudahkan analisis data, R mempunyai banyak fungsi yang tersedia untuk melakukan analisis statistik.
x <- seq(1, 100, by = 4)
# Rata-rata vector x
mean(x)
## [1] 49
min(x)
## [1] 1
max(x)
## [1] 97
range(x)
## [1] 1 97
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1 25 49 49 73 97
Ketika membuat sebuah script yang akan digunakan berkali-kali namun
dengan nilai input yang berbeda-beda, maka ada baiknya script tersebut
dibuat menjadi sebuah fungsi atau function
sesuai dengan kebutuhan atau User-Defined Function. Untuk
membuat function di R, gunakan function().
a <- 5
b <- 7
d <- a + b
d
## [1] 12
Elemen Fungsi
Nama Fungsi: Nama yang diberikan untuk fungsi, digunakan untuk memanggilnya.
Argumen: Variabel input yang diperlukan oleh fungsi untuk menjalankan tugas.
Isi Fungsi: Kode yang dieksekusi saat fungsi dipanggil yang biasanya berisi perhitungan/operasi lain.
Return: Fungsi mengembalikan hasil yang bisa berupa angka,
vektor, data frame, atau objek lain. Jika tidak ada
return()
, fungsi akan mengembalikan hasil dari baris
terakhir dalam blok kode.
sum_ab <- function(a, b){
d <- a + b
return(d)
}
sum_ab(a = 5, b = 7)
## [1] 12
Luas Segitiga
luassegitiga <- function (a, t){
luas = 0.5*a*t
return (luas)
}
luassegitiga(4,8)
## [1] 16
Kuadrat
kuadrat <- function(x) {
rumus = x^2
return (rumus)
}
kuadrat(10)
## [1] 100
Faktorial
FAKTORIAL=function(x){
fak=1
for (i in 1:x){fak=fak*i}
return(fak)
}
x=3
FAKTORIAL(x)
## [1] 6
Koef. Determinasi
rsq <- function(x, y) {
rumus = cor(x, y) ^ 2
return (rumus)
}
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 3, 8, 10)
rsq(x,y)
## [1] 0.8474576
Package adalah sebuah kumpulan fungsi atau data yang dibuat untuk memudahkan proses di R tanpa harus menuliskan ulang script yang dibutuhkan. Saat ini package menjadi bagian yang sangat penting bagi Data Analyst atau Data Scientist ketika menggunakan R. Karena dengan package tambahan (yang belum ada ketika install R) pekerjaan dalam mengolah data menjadi lebih efisien.
Untuk menginstall package, gunakan
install.packages(nama paket)
#install.packages("ggplot2")
Untuk memanggil package yang sudah terinstall, gunakan
library()
#Contoh memanggil library yang akan digunakan
library(dplyr) #manipulasi data
library(Hmisc) #statistik deskriptif, analisis regresi, penanganan missing data
library(foreign) #membaca dan menulis file data dalam berbagai format
library(MASS) #metode analisis statistik
library(readxl)
library(writexl)
library(olsrr) #Ordinary Least Squares (OLS) Regression
library(ggplot2)
Ketika membahas struktur kendali pada suatu bahasa pemrograman pasti
akan membahas tentang operator logika atau logical operator.
Nilai dari logika akan selalu bernilai TRUE
atau
FALSE
. Berikut ini tabel operator logika dan
penjelasannya.
Operator | Logika |
---|---|
& | dan |
| | atau |
! | negasi |
== | sama dengan |
!= | tidak sama dengan |
%in% | ada diantara |
> | lebih besar dari |
< | lebih kecil dari |
>= | lebih besar sama dengan |
<= | lebih kecil sama dengan |
&& | dan |
|| | atau |
2 %in% 1:5
## [1] TRUE
1 > 2 # 1 tidak lebih besar dari 2
## [1] FALSE
2 > 1:5
## [1] TRUE FALSE FALSE FALSE FALSE
p <- c(TRUE, TRUE, FALSE, FALSE)
q <- c(TRUE, FALSE, TRUE, FALSE)
p & q
## [1] TRUE FALSE FALSE FALSE
Struktur kendali pada bahasa pemrograman R yang umum digunakan adalah
fungsi if()
. Argumen yang dibutuhkan pada fungsi
if()
adalah sebuah vector logical tunggal bernilai
TRUE
atau FALSE
. Untuk mendapatkan nilai
logical ini digunakan operator logika yang sudah dibahas sebelumnya.
if(2 < 3) print("Kondisi tersebut benar")
## [1] "Kondisi tersebut benar"
a <- 1
b <- 12
if(a<b){
print("ekspresi jika kondisi benar")
} else {
print("jika kondisi salah")
}
## [1] "ekspresi jika kondisi benar"
Looping merupakan suatu cara untuk mengulang suatu perintah dengan
kondisi yang ditentukan. Looping yang digunakan dalam R yaitu
for
, while
, dan repeat
.
Secara umum, diagramnya adalah:
Looping for
Looping for
adalah salah satu bentuk perulangan yang
digunakan untuk mengulang sejumlah perintah berdasarkan elemen-elemen
dalam suatu objek, seperti vektor, list, atau range. Perulangan ini akan
berjalan sebanyak jumlah elemen yang ada dalam objek tersebut.
Contoh 1:
for (i in 1:5) {
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Contoh 2:
for (i in 1:5) {
hasil <- i^2
print(hasil)
}
## [1] 1
## [1] 4
## [1] 9
## [1] 16
## [1] 25
Looping while
Looping while
adalah salah satu bentuk perulangan yang
akan terus dijalankan selama kondisi tertentu bernilai TRUE. Dengan
while
, dapat diulang serangkaian perintah sampai suatu
kondisi tidak lagi terpenuhi. Jika kondisi tersebut tidak pernah menjadi
FALSE, maka perulangan akan terus berjalan tanpa henti (infinite
loop).
x <- 1 # Inisialisasi variabel
while (x <= 5) {
print(x)
x <- x + 1 # Menambahkan x agar perulangan berhenti
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Looping repeat
Looping repeat
adalah salah satu bentuk perulangan yang
akan terus berjalan tanpa batas hingga dihentikan secara eksplisit
dengan pernyataan break
. Karena repeat tidak memiliki
kondisi seperti while
atau for
, perulangan
akan berjalan selamanya kecuali ada kondisi tertentu yang menghentikan
loop.
x <- 1
repeat {
print(x)
x <- x + 1
if (x > 5) {
break # Hentikan perulangan ketika x lebih dari 5
}
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
Membaca CSV file
dataku <- read.csv ("tabelku.csv")
Membaca Excel file
library(readxl)
dataku <- read_excel ("tabelku.xlsx")
Membaca SPSS file
library(haven)
dataku <- read_sav ("tabelku.sav")
Membaca STATA file
library(haven)
dataku <- read_dta ("tabelku.dta")
Contoh data yang di-ekspor adalah:
data <- data.frame(
id = 1:5,
name = c("Alice", "Bob", "Charlie", "David", "Eva"),
score = c(90, 85, 88, 92, 95)
)
Mengekspor CSV file
write.csv(data, "OutputCSV.csv")
Mengekspor excel file
write_xlsx(data, "OutputExcel.xlsx")
Mengekspor SPSS file
library(haven)
write_sav(data, "OutputSPSS.sav")
Mengekspor STATA file
library(haven)
write_dta(data, "OutputStata.dta")
caff.marital <- matrix(c(652,1537,598,242,36,46,38,21,218,327,106,67),nrow=3,byrow=T)
caff.marital
## [,1] [,2] [,3] [,4]
## [1,] 652 1537 598 242
## [2,] 36 46 38 21
## [3,] 218 327 106 67
#Penamaan kolom dari sebuah tabel
colnames(caff.marital) <- c("0","1-150","151-300",">300")
#Penamaan baris dari sebuah tabel
rownames(caff.marital) <- c("Married","Prev.married","Single")
caff.marital
## 0 1-150 151-300 >300
## Married 652 1537 598 242
## Prev.married 36 46 38 21
## Single 218 327 106 67
#Membuat transpose dari sebuah tabel
t(caff.marital)
## Married Prev.married Single
## 0 652 36 218
## 1-150 1537 46 327
## 151-300 598 38 106
## >300 242 21 67
#Membuat marginal tabel
margin.table(caff.marital,1)
## Married Prev.married Single
## 3029 141 718
margin.table(caff.marital,2)
## 0 1-150 151-300 >300
## 906 1910 742 330
#Membuat proporsi tabel
prop.table(caff.marital,1)
## 0 1-150 151-300 >300
## Married 0.2152526 0.5074282 0.1974249 0.07989435
## Prev.married 0.2553191 0.3262411 0.2695035 0.14893617
## Single 0.3036212 0.4554318 0.1476323 0.09331476
prop.table(caff.marital,2)
## 0 1-150 151-300 >300
## Married 0.7196468 0.80471204 0.80592992 0.73333333
## Prev.married 0.0397351 0.02408377 0.05121294 0.06363636
## Single 0.2406181 0.17120419 0.14285714 0.20303030
Untuk membuat isian desimal menjadi 2 digit, gunakan
round ( ..., 2)
round(prop.table(caff.marital,2),2)
## 0 1-150 151-300 >300
## Married 0.72 0.80 0.81 0.73
## Prev.married 0.04 0.02 0.05 0.06
## Single 0.24 0.17 0.14 0.20
Spector, P. (2016). Data manipulation with R. CRC Press.
Wickham, H., & Grolemund, G. (2016). R for data science: Import, tidy, transform, visualize, and model data. O’Reilly Media.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id