A. Pemrograman Grafik

Fenomena Pengangguran di Perkotaan selama Pandemi Covid-19 di Indonesia

Dengan mewabahnya Covid-19 di Indonesia sejak Maret 2020, ada banyak sektor yang terdampak. Salah satu di antaranya adalah sektor ekonomi, yang berpengaruh pada lonjakan Tingkat Pengganguran Terbuka (TPT) di Indonesia.

Berikut beberapa konsep dan definisi penting yang digunakan dalam pengumpulan data ketenagakerjaan oleh Badan Pusat Statistik, yaitu:

  1. Penduduk usia kerja (PUK) adalah penduduk berumur 15 tahun ke atas.
  2. Angkatan Kerja (AK) adalah PUK yang bekerja, atau punya pekerjaan namun sementara tidak bekerja dan pengangguran.
  3. Bukan Angkatan Kerja (BAK) adalah PUK yang masih sekolah, mengurus rumah tangga atau melaksanakan kegiatan lainnya selain kegiatan pribadi.
  4. Bekerja adalah AK yang melakukan kegiatan memperoleh/membantu memperoleh pendapatan/keuntungan minimal 1 jam (tidak terputus) dalam seminggu yang lalu, termasuk pekerja tak dibayar.
  5. Pengganguran adalah AK yang terdiri dari para pencari pekerjaan, yang sedang mempersiapkan usaha, yang sudah punya pekerjaan tetapi belum mulai bekerja ataupun mereka yang tidak mencari pekerjaan karena merasa tidak mungkin.
  6. Tingkat Pengangguran Terbuka (TPT) adalah persen (%) jumlah pengangguran terhadap jumlah AK.
library(ggplot2)
data.tpt <- read.csv(file="TPT_Indo_2020_2021.csv", header=T)

1) Tingkat Pengganguran Terbuka, Februari 2020

Sebelum mewabahnya Covid-19 di Indonesia, rilis data ketenagakerjaan Indonesia oleh Badan Pusat Statistik mencatat bahwa Tingkat Pengangguran Terbuka (TPT) Indonesia di wilayah perkotaan pada Februari 2020 mencapai 6,12%. Provinsi dengan tingkat pencapaian TPT tertinggi adalah Provinsi Maluku dan Papua Barat yang masing-masing tercatat sebesar 10,15% dan 9,86%. Sedangkan, TPT terendah tercatat dari Provinsi Bali dan Nusa Tenggara Barat yang masing-masing tercatat sebesar 1,35% dan 2,84%.

TPT_barchart <- ggplot(data.tpt,
  aes(x = Provinsi, y = TPT.Feb.2020)) +
  geom_bar(stat = "identity", color='steelblue', fill='darkblue') +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Tingkat Pengangguran Terbuka", subtitle="Tingkat Pengangguran Terbuka di Indonesia, Februari 2020",
      caption="Sumber: Badan Pusat Statistik", y = "TPT (%)", x = "Provinsi")
TPT_barchart

2) Tingkat Pengganguran Terbuka, Februari 2021

Hasil rilis data Ketenagakerjaan Indonesia pada Februari 2021 oleh BPS, terungkap bahwa TPT Februari 2021 di wilayah perkotaan tercatat sebesar 8% atau naik 1,88% dibanding periode yang sama tahun lalu yang tercatat 6,12%. Adapun persentase tertinggi berasal dari Provinsi Kepulauan Riau (10,64%), Sulawesi Utara (10,43%), Kalimantan Barat (10,28%), dan Maluku (10,07%). Sedangkan, persentase terendah tercatat dari Provinsi Maluku Utara yang tercatat sebesar 3,04%.

Fenomena menarik yang dapat kita amati dari grafik adalah, tampak bahwa Provinsi Bali dan Nusa Tenggara Barat cukup merasa dampak negatif dari mewabahnya Covid-19 di Indonesia, dimana TPT kedua provinsi tersebut yang pada tahun 2020 tercatat di bawah 5%, ditahun 2021 melonjak cukup tajam menjadi di atas 5%. Mewabahnya Covid-19 menyebabkan ditutupnya pintu masuk dari dan ke luar negeri, sehingga berdampak pada menurunnya tingkat kunjungan wisatawan baik mancanegara maupun domestik, yang merupakan sektor andalan pada kedua provinsi tersebut.

TPT_barchart1 <- ggplot(data.tpt,
  aes(x = Provinsi, y = TPT.Feb.2021)) +
  geom_bar(stat = "identity", color='darkorchid2', fill='darkmagenta') +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Tingkat Pengangguran Terbuka", subtitle="Tingkat Pengangguran Terbuka di Indonesia, Februari 2021",
      caption="Sumber: Badan Pusat Statistik", y = "TPT (%)", x = "Provinsi")
TPT_barchart1

3) Penduduk Usia Kerja Terdampak Covid-19

Menurut Data BPS, dari total 205,36 juta Penduduk Usia Kerja (PUK) di Indonesia, terdapat 19,10 juta orang yang terdampak akibat Covid-19 dan 74,82% di antaranya berasal dari wilayah perkotaan.

komp.tpt0 <- read.csv(file="Komponen_AK_Indo_2021.csv", header=T)
komp.tpt0
Komponen Kota_Ags.20 Desa_Ags.20 Kota_Feb.21 Desa_Feb.21 Total_Ags.20 Total_Feb.21
Pengangguran krn covid-19 1.94 0.62 1.27 0.35 2.56 1.62
BAK krn covid-19 0.53 0.23 0.49 0.16 0.76 0.65
Sementara tdk bekerja krn covid-19 1.27 0.50 0.86 0.25 1.77 1.11
Pengurangan jam kerja krn covid-19 16.82 7.21 11.67 4.05 24.03 15.72
Total 20.56 8.56 14.29 4.81 29.12 19.10
Penduduk Usia Kerja (PUK) 115.82 88.15 117.59 87.77 203.97 209.36
% terhadap PUK 17.75 9.71 12.15 5.48 14.28 9.30

Berdasarkan tabel di atas terlihat bahwa dari tempat tinggal, penduduk usia kerja yang terdampak Covid-19 terdiri dari penduduk perkotaan sebanyak 14.29 juta orang dan penduduk pedesaan sebanyak 4,81 juta orang pada Februari 2021. Pada semua komponen dampak Covid-19, persentase penduduk perkotaan jauh lebih besar dibandingkan dengan penduduk pedesaan. Pada komponen pengangguran karena Covid-19, kontribusi penduduk perkotaan yang terdampak mencapa 78.29% atau hampir empat kali lipat dibanding penduduk pedesaan.

komp.tpt <- c(1.27, 0.49, 0.86, 11.67)
kategori <- c("Pengangguran* = 8.89%", "Bukan Angkatan Kerja* = 3.43%", "Sementara Tidak Bekerja* = 6.02%","Pengurangan Jam Kerja* = 81.66%")
pie(komp.tpt, kategori, main = "Penduduk Usia Kerja di Perkotaan Terdampak Covid-19, Feb-2021", col = rainbow(length(komp.tpt)))

B. Pembangkitan Bilangan Acak

Bilangan acak (random) adalah bilangan yang kemunculannya terjadi secara acak dan diharapkan memenuhi sebaran statistik tertentu (pdf/pmf, cdf). Pembangkitan bilangan acak merupakan alat yang diperlukan dalam komputasi statistik, umumnya untuk simulasi. Semua metode pembangkitan bilangan acak tergantung dari pembangkitan bilangan acak uniform.

Pseudo-Random Number Generator merupakan algoritma untuk mendapatkan bilangan secara acak dan tidak dapat diprediksi kemunculan selanjutnya. Bilangan acak yang dibangkitkan oleh komputer disebut bilangan acak semu atau pseudo random number. Disebut pseudo karena kemunculan bilangan tersebut sangat bergantung padaseed atau nilai awal. Jika nilaiseed yang digunakan adalah bilangan yang benar-benar acak, maka bilangan yang dihasilkan juga akan acak sempurna (tidak memiliki pola). Nilai seed yang sama akan menghasilkan bilangan acak yang sama pula.

Fungsi sebaran statistik di R :

fs.sebaran.R <- read.csv(file="Fs_Sebaran_R.csv", header=T)
fs.sebaran.R
Distribution Name.in.R Generator Parameter
Beta beta rbeta shape1,shape2
Binomial binom rbinom size, prob
Cauchy cauchy rcauchy location, scale
Chisquare chisq rchisq df
Exponential exp rexp rate
F f rf df1, df2
Gamma gamma rgamma shape
Gemotric geom rgeom shape
Lognormal lnorm rlnorm meanlog, sdlog
Logistic logis rlogis location, scale
Negative Binomial nbinom rnbinom size, prob
Normal (Gaussian) norm rnorm mean, sd
Poisson pois rpois lambda
Student’s t t rt df
Uniform unif runif min, max
Weibull weibull rweibull Shape

Teknik Pembangkitan Bilangan Acak

Apabila fungsi pembangkit bilangan acak belum tersedia di R karena sebarannya bukan sebaran yang umum dikenal, maka teknik yang umum digunakan untuk membangkitkan bilangan acak adalah sebagai berikut :

  • Inverse-transform method -> dapat digunakan untuk peubah acak yang berdistribusi kontinu maupun diskrit

  • Acceptance-rejection method -> dapat digunakan jika sebuah distribusi memiliki fungsi massa dan metode lain tidak efisien digunakan

  • Other Special techniques :

    • Direct Transformation -> menggunakan teori dari sebaran (sebaran dari suatu peubah acak merupakan sebaran dari peubah acak lain)

    • Convolution -> untuk beberapa distribusi yang mungkin dapat dinyatakan dalam jumlah (X(X = Y1Y1 + Y2Y2 + … + Ym)Ym)

    • dan metode yang lain

1) Inverse-Transform Method

Berdasarkan teori Probabilty Integral Transformation, jika X adalah peubah acak kontinu dengan cdf F(x), maka X ~ Uniform (0,1).

  1. Untuk Sebaran Kontinu

    Langkah :

    • Untuk fungsi cdf : f = F(x)

    • Bangkitkan u dari U(0,1)

    • Maka, X = F^(-1)(u)

    Latihan

    1. Diketahui :

      pdf:f(x)=3x2,0<x<1pdf:f(x)=3x2,0<x<1

      F(x)=x3,0<x<1F(x)=x3,0<x<1

      F−1(u)=u1/3

      n = 100 # misalkan membangkit 1000 bilangan acak
      u = runif(n)
      x = u^(1/3)
      hist(x, prob = TRUE, col = "deeppink3")
      y = seq(0,1,.01)
      lines(y, 3*y^2)

    2. Diketahui :

      X∼Exp(λ),x>0X∼Exp(λ),x>0

      F(x)=1−e−λxF(x)=1−e−λx

      F−1(u)=−1λlog(1−u)

      set.seed(1501212084)
      exp = function (n,lambda){
        u = runif(n)
        x = -log(u)/lambda
        return (x)
      }
      
      #metode invers
      exp1 = exp(100,5)
      
      #fungsi bawaan R
      exp2 = rexp(100, rate = 3)
      
      par(mfrow = c(1,2))
      
      hist(exp1, prob = TRUE, main = " Exp : Metode Invers-Transform" , col = "darkorange3")
      hist(exp2, prob = TRUE, main = " Exp : Fungsi Rexp" , col = "darkorange3")

  2. Unruk Sebaran Diskrit

    Jika X ~ p.a diskrit dan …<xi−1<xi<xi+1<……<xi−1<xi<xi+1<… adalah titik tidak kontinu dari F(x), maka transformasi inversnya adalah : F−1(u)=xiF−1(u)=xi dimana F(xi−1)<u<F(xi)F(xi−1)<u<F(xi)

    Langkah :

    • Bangkitkan U(0,1)

    • Tentukan xixi dimana F(xi−1)<u<F(xi)

      n = 100
      p = 0.5
      u = runif(n)
      x = as.integer (u > 0.65)
      barplot (table(x) , col = "brown3")

2) Acceptance-Rejection Method

Pada metode sebelumnya, bilangan acak dapat dibangkitkan dari suatu sebaran jika mana sebaran tersebut memiliki invers dari sebaran kumulatifnya. Jika sebarang kumulatif tidak bisa diperoleh atau sulit diperoleh, maka dapat menggunakan metode Acceptance-Rejection Method.

Misalkan X dan Y adalah peubah acak dengan pdf/pmf f dan g dan terdapat konstanta c sehingga : f(t)g(t)≤cf(t)g(t)≤c untuk semua t:f(t)>0t:f(t)>0

Langkah :

  1. Tetapkan peubah acak Y dengan density g yang memenuhi f(t)g(t)≤cf(t)g(t)≤c untuk semua t:f(t)>0t:f(t)>0

  2. Untuk setiap satu bilangan acak :

    • Bangkitkan y acak dari sebaran dengan density g

    • Bangkitkan u acak dari sebaran uniform (0,1)

    • Jika u < f(y)cg(y)f(y)cg(y) terima y dan x = y ; selainnya tolak y dan ulangi langkah 2 awal

Latihan

Diketahui : X ~ Beta (= 2 , = 2)

pdf:f(x)=6x(1−x),0<x<1

n = 1000
k = 0
j = 0
y = numeric(n)
while (k < n) {
u = runif(1)
j = j+1
x = runif(1)
if (x*(1-x) > u) {
k = k+1 # terima x
y[k] = x
}
}

hist(y, prob = TRUE , col = "coral3")
sbx <- seq(0, 1, 0.01)
lines(sbx, dbeta(sbx, 2, 2))

3) Direct Transformation

Beberapa transformasi dari transformasi invers sebaran dapat digunakan untuk membangkitkan bilangan acak.

Berikut beberapa contoh peubah acak transformasi :

Latihan

Diketahui :

Jika: U∼Gamma(r,λ)  dan  V∼Gamma(s,λ)U∼Gamma(r,λ)  dan  V∼Gamma(s,λ)

kemudian: X=UU+V∼Beta(r,s)

n = 100
a = 3
b = 2
u = rgamma (n , shape =a , rate =1);
v = rgamma (n , shape =b , rate =1);
x = u/( u + v )

q = qbeta ( ppoints ( n ) , a , b )
qqplot (q, x , cex =0.25 , xlab =" Beta (3 , 2)", ylab =" Sample ")


Diketahui :

U,VU,V peubah acak saling bebas menyebar U(0,1)U(0,1), kemudian :

X=[1+log(V)log(1−(1−θ)U)]

n = 1000 
theta = 0.5
u = runif ( n ) # membangkitkan angka logarithmic
v = runif ( n )
x = floor (1 + log( v ) / log (1 - (1 - theta )^ u ))
k = 1: max( x ) # hitung peluang logarithmic
p = -1 / log (1 - theta ) * theta ^ k / k
se = sqrt ( p*(1 - p )/n )
p.hat = tabulate ( x )/n
print ( round ( rbind (p.hat , p , se) , 3))
##        [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]
## p.hat 0.718 0.177 0.072 0.015 0.008 0.006 0.002 0.002
## p     0.721 0.180 0.060 0.023 0.009 0.004 0.002 0.001
## se    0.014 0.012 0.008 0.005 0.003 0.002 0.001 0.001

Multivariate Normal Distribution

Terkadang kita ingin membangkitkan bilangan acak lebih dari satu yang di antara peubah bebas yang dibangkitkan tersebut memiliki hubungan. Pada pemrograman R untuk membangkitkan bilangan acak multivariate normal bisa dilakukan melalui library MASS. Jika korelasi 0 tinggal membangkitkan univariate sebanyak yang diinginkan, tapi jika membutuhkan korelasi dapat menggunakan multivariate normal.

Mendapatkan multivariate normal dengan teknik eigen.

rmvn.eigen <- function(n, mu, Sigma) {
    d <- length(mu)
    ev <- eigen(Sigma, symmetric = TRUE)
    lambda <- ev$values
    V <- ev$vectors
    R <- V %*% diag(sqrt(lambda)) %*% t(V)
    Z <- matrix(rnorm(n * d), nrow = n, ncol = d)
    X <- Z %*% R + matrix(mu, n, d, byrow = T)
    X
}
mu <- c(0, 0)
Sigma <- matrix(c(1, 0.9, 0.9, 1), nrow = 2, ncol = 2)
X <- rmvn.eigen(1000, mu, Sigma)
cov(X) 
##           [,1]      [,2]
## [1,] 1.0134634 0.9080515
## [2,] 0.9080515 1.0092785
head(X)
##             [,1]        [,2]
## [1,] -0.76760971 -0.47948283
## [2,]  0.61549349  1.22976423
## [3,]  0.51799373  0.09145296
## [4,]  0.74496944 -0.09504890
## [5,]  0.03126962 -0.10163019
## [6,] -0.64548182 -0.23737525

Pembangkitan bilangan acak untuk model

Jika dalam multivariate antar X memiliki korelasi. Pada model, ada satu peubah yang merupakan fungsi dari peubah lainnya. Membangkitkan bilangan acak untuk model berarti membangkitkan bilangan acak dengan peubah lebih dari satu dan peubahnya memiliki keterkaitan fungsi. Dicontohkan dibangkitkan dari model regresi linear. Bangkitkan peubah Y, X1, X2 dan X3 berdasarkan model regresi linear berganda berikut ini:

Y=10+3X1+5X2+7X3+e

dengan mengasumsikan bahwa ϵ ~ N(0,1). Banyaknya amatan yang dibangkitkan adalah 1000

# banyaknya amatan
n <- 1000
set.seed(12)
epsilon <- rnorm(n, mean = 0, sd = 1)

# bangkitkan peubah penjelas Xi yang saling bebas
set.seed(10)
X <- replicate(3, rnorm(n, mean = 0, sd = 1.5))
head(X)
##             [,1]       [,2]        [,3]
## [1,]  0.02811926  1.5750205 -0.46179747
## [2,] -0.27637881  0.4291389  1.13712837
## [3,] -2.05699582  0.3608472 -0.86079512
## [4,] -0.89875157  1.2490578 -1.40811669
## [5,]  0.44181769 -0.3344748 -0.04154899
## [6,]  0.58469145  0.4325163 -1.59937298
# bangkitkan peubah Y dengan menggunakan model regresi
betas <- matrix(c(10, 3, 5, 7), nrow = 4, ncol = 1)
Xgab <- cbind(1, X)

Y <- Xgab %*% betas + epsilon

dataRegresi <- data.frame(Y, X)
colnames(dataRegresi) <- c("Y", "X1", "X2", "X3")
head(dataRegresi)
Y X1 X2 X3
13.246310 0.0281193 1.5750205 -0.4617975
20.853626 -0.2763788 0.4291389 1.1371284
-1.349061 -2.0569958 0.3608472 -0.8607951
2.772212 -0.8987516 1.2490578 -1.4081167
7.364594 0.4418177 -0.3344748 -0.0415490
2.448749 0.5846915 0.4325163 -1.5993730
# pengecekan dengan model regresi
modelRegresi <- lm(Y ~ ., data = dataRegresi)
summary(modelRegresi)
## 
## Call:
## lm(formula = Y ~ ., data = dataRegresi)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0364 -0.6052 -0.0207  0.6087  3.1774 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  9.97484    0.03033   328.8   <2e-16 ***
## X1           2.97225    0.02042   145.6   <2e-16 ***
## X2           4.97282    0.01939   256.5   <2e-16 ***
## X3           7.00493    0.01989   352.2   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9589 on 996 degrees of freedom
## Multiple R-squared:  0.9955, Adjusted R-squared:  0.9954 
## F-statistic: 7.275e+04 on 3 and 996 DF,  p-value: < 2.2e-16

  1. IPB University-Prodi Statistika dan Sains Data 2021↩︎