1 Latar Belakang

1.1 Libraries dan Pengaturan

Kita akan mengatur cache untuk notebook ini dikarenakan akan ada banyak komputasi yang dilakukan pada baris-baris code yang kita nanti akan pelajari.

knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE,
  fig.align = "center"
)

options(scipen = 9999)
rm(list = ls())

Anda perlu untuk menggunakan install.packages() untuk menginstal package apapun yang belum terinstal pada komputer. Lalu package tersebut harus dibaca terlebih dahul menggunakan fungsi library():

install.packages("skimr")
library(skimr)
library(tidyverse)

1.2 Objektif dari Pelatihan

Objektif utama dari pelatihan ini adalah untuk menjabarkan mengenai fondasi akan statistik sebelum kita masuk lebih dalam ke bagian machine learning pada spesialisasi ini. Silabus yang nanti akan dipelajari:

  • Statistika Deskriptif
    • 5 Number Summary
    • Plot Statistik untuk Statistika Deskriptif
    • Pemahaman mengenai Kuantil
    • Pemusatan dan Penyebaran
    • z-Score dan Central Limit Theorem
  • Statistika Inferensial
    • Probability Mass Function
    • Probability Density Function
    • Confidence Interval
    • Tes Hipotesis
    • Interpretasi dari p-Value

2 Statitika Deskriptif

Statistikawan dan data scientist menggunakan statistika deskriptif untuk menyimpulkan dan menjelaskan banyak pengukuran. Sering kali, pekerjaan ini juga dilakukan bersama dengan memberikan grafik dan gambar untuk membantu memahami kesimpulan dari data yang ada. Saat seorang data sains diaplikasikan pada konteks bisnis, statistika deskriptid digunakan untuk mengitung pemusatan dan penyebaran dari data yang dimiliki. Contohnya seperti rata-rata dari transaksi per bulan, atau keberagaman dari umur karyawan yang dimiliki. Inti dari statistika deskriptif adalah kita tidak menjelaskan hal-hal di luar dari data itu sendiri. Karena bila kita menjelaskan hal-hal di luar dari data yang kita miliki atau mengambil sebuah prediksi, itu akan masuk ke ranah statistik inferensial.

Mari kita mulai dengan membaca data:

lpse_kemenkeu <- read_csv(file = "data/LPSEKemenkeu.csv", na = c("NULL", "NA", " - ", ""))

glimpse(lpse_kemenkeu)
## Rows: 4,500
## Columns: 10
## $ idpaket         <dbl> 32163011, 32149011, 32126011, 32125011, 32092011, 3209~
## $ namapaket       <chr> "Pengadaan Jasa Kebersihan Gedung dan Halaman Kantor p~
## $ kldi            <chr> "Kementerian Keuangan", "Kementerian Keuangan", "Lemba~
## $ pagu            <dbl> 875874924, 15789318000, 573000000, 250000000, 62244000~
## $ hps             <dbl> 875874924, 12429284890, 572880000, 249981600, 56654322~
## $ pemenang        <chr> "CV. MICRO JAYA", "PT. SURYA TEHNIK INTIPRATAMA", "PT.~
## $ nilaitawar      <dbl> 70112350, 12426216000, 390500000, 234000000, 535725300~
## $ nilaiterkoreksi <dbl> 738856415, 12426216000, 390500000, 234000000, 53572530~
## $ alamatpemenang  <chr> "JL. PERUM PANTAI TERITIB MAS B2 NO. 01 RT 06  - Balik~
## $ sumberlpse      <chr> "https://lpse.kemenkeu.go.id", "https://lpse.kemenkeu.~

Dalam menjelaskan sebuah data, kita akan lebih fokus mengenai meng-kuantifikasikan dan membandingkan bentuk, pemusatan, dan penyebaran data.

2.1 Pemusatan

Pada bagian eksplorasi data, sering kali kita ingin memahami terlebih dahulu mengenaik nilai yang paling merepresentasikan data yang kita miliki. Kita sering bilang bahwa ini merupakan “nilai tengah” atau “rata-rata” dari data kita, walau sebenarnya ada tiga buah bentuk dari pemusatan yang sering kita gunakan dan penting kita ketahui.

1. Rata-Rata

Yang paling terkenal dalam sebuah pemusatan adalah mean atau rata-rata, yang kadang direpresentasikan dengan \(\bar{x}\) saat kita mengitung sampel dan \(\mu\) pada populasi. Rata-rata ini dihitung dengan kita menjumlahkan seluruh nilai pada satu kolom dari data yang kita miliki, lalu dibagi dengan banyaknya data pada baris tersebut. Rata-rata bekerja dengan baik pada data yang memiliki distribusi yang sudah terbagi secara merata atau berdistribusi normal (distribusi normal akan dijelaskan secara lebih lengkap nanti). Pada R, rata-rata menggunakan fungsi mean:

Sebelum menghitung rata-rata, kita harus pastikan terlebih dahulu untuk kolom/informasi yang ingin diamati tidak memuat nilai NA. Karena akan menyebabkan hasil rata-ratanya menjadi NA. Pada tahap ini kita akan remove semua baris yang terdapat nilai NA, yang mana ini bukan selalu menjadi cara yang direkomendasikan.

lpse_kemenkeu <- na.omit(lpse_kemenkeu)

is.na(lpse_kemenkeu) %>% 
  colSums()
##         idpaket       namapaket            kldi            pagu             hps 
##               0               0               0               0               0 
##        pemenang      nilaitawar nilaiterkoreksi  alamatpemenang      sumberlpse 
##               0               0               0               0               0

Selanjutnya kita dapat menghitung rata-rata untuk jumlah nilai yang terkoreksi:

Studi Kasus:

Misal kita ingin mengevaluasi semua jenis pengadaan yang sudah pernah dilakukan baik dari sisi jasa maupun barang. Pertanyaan yang ingin dijawab adalah, berapa minimal target budget kita untuk realisasi pengadaan di periode berikutya?

sum(lpse_kemenkeu$nilaiterkoreksi)/length(lpse_kemenkeu$nilaiterkoreksi)
## [1] 3126814569
mean(lpse_kemenkeu$nilaiterkoreksi)
## [1] 3126814569

Catatan: Cara paling sederhana untuk melakukan prediks/proyeksi nilai kedepan dari sekumpulan data yaitu dengan menggunakan nilai mean.

Karakteristik dari mean:

  • cenderung sensitif terhadal nilai ekstrim/outlier
  • cenderung nilainya bias jika terdapat outlier

2. Median

Nilai tengah merupakan sebuah nilai yang memotong tepat di 50% dari data observasi yang kita miliki. Dengan begitu, jumlah data akan terbagi secara merata. Nilai tengah atau median dapat dicari di R dengan menggunakan fungsi median.

median(lpse_kemenkeu$nilaiterkoreksi)
## [1] 768114600

Berikut contoh cara memperoleh median dengan pendekatan manual:

potongan_harga <- c(50,10,20,30,55)

# saat diurutkan, terlihat bahwa nilai tengah adalah 30
potongan_harga[order(potongan_harga)]
## [1] 10 20 30 50 55
# dengan fungsi median()

median(potongan_harga)
## [1] 30

Pada data yang jumlahnya ganjil, median akan mencari nilai tengah dari data, namun pada berjumlah genap akan merata-ratakan kedia nilai tengah dari data yang dimiliki:

hps <- c(5,10,2,6,8,8)

# saat diurutkan, dapat dilihat bahwa nilai tengah sebesar 7
hps[order(hps)]
## [1]  2  5  6  8  8 10
# menggunakan fungsi median()

median(hps)
## [1] 7

Kita harus hati-hati dalam menggunakan rata-rata pada data yang terdapat nilai pencilan karena kemungkinan besar bahwa rata-rata tidak akan menjadi nilai yang paling merepresentasikan dibandingkan kita menggunakan teknik lain. Contohnya, kita memiliki survey pengadaan paket jasa ataupun barang dari berbagai macam perusahaan penyedia jasa dan barang tersebut (IDR, dalam juta):

tender <- c(7.8, 7.5, 6, 7.5, 4.5, 105, 45, 7.5, 5.5, 4)

mean(tender)
## [1] 20.03
median(tender)
## [1] 7.5

Saat median memberikan nilai 7.5, nilai dari rata-rata mengembalikan hampir 3 kali lebih besar yang padahal dapat dikatakan tidak cukup merepresentasikan keadaan sebenarnya. Dikarenakan kebanyakan dari harga jual memiliki nilai di bawah 8 jtua, namun satu nilai yang sangat ekstrim merubah nilai rata-rata tersebut menjadi 20 juta.

Jadi pada masalah ini, median merupakan perhitungan yang lebih baik dikarenakan tidak sensitif pada data outlier.

Karakteristik dari median:

  • tidak sensitif dengan nilai ekstrim/outlier
  • baik digunakan untuk data yang memiliki outlier atau berdistribusi skewed (condong kiri/kanan)

Bila kita diharuskan untuk menggunakan rata-rata, salah satu solusi yang bisa digunakan adalah dengan parameter trim untuk memotong sisi kanan dan sisi kiri dari data yang kita miliki (setelah diurutkan). Hal ini berarti bagian yang bisa dipotong mulai dari 0 yaitu 0% kanan dan 0% kiri dan 50% yang berarti memotong 50% data sebelah kanan dan 50% data sebelah kiri (hal ini menyisakan hanya satu atau dua nilai, tergantung ganjil atau genapnya banyak data).

# 5% dari observasi dipotong

mean(lpse_kemenkeu$nilaiterkoreksi, trim = 0.2)
## [1] 962766367

Kekurangan dari trimmed mean: kita bisa saja kehilangan informasi yang sebenarnya insightful untuk kebutuhan analisa data.

3. Modus

Pada saat kita memiliki variabel yang diskrit, kita juga bisa menggunakan nilai modus atau nilai yang paling banyak muncul. Secara praktis, hal ini jarang digunakan, kecuali pada saat kita ingin melihat banyaknya data pada tiap level pada satu kolom dari data yang kita miliki. Kita bisa membentuk salah satu contohnya dengan membentuk fungsi:

pengadaan <- c("jasa", "barang", "pemeliharaan", "barang", "barang", "jasa", "pemeliharaan", "jasa", "barang", "jasa", "jasa")

most <- function(x){
    table(pengadaan) %>% 
    sort(decreasing = TRUE) %>% 
    names() %>% 
    head(1)
}

most(pengadaan)
## [1] "jasa"

Karena R tidak memiliki fungsi dasar untuk menghitung nilai modus kecuali dalam bentuk faktor (menggunakan table), kita akan mencoba untuk memodifikasi fungsi tersebut agar dapat memunculkan satu nilai yang paling banyak keluar saja.

Kapan menggunakan mean, median, atau modus?

  • mean digunakan saat data yang kita miliki tidak ada outlier atau sebenarnya merata.
  • median digunakan saat data yang kita miliki terdapat outlier atau nilai ekstrim.
  • modus digunakan saat data yang kita miliki kategorik.

2.2 Penyebaran

Penyebaran digunakan untuk menjelaskan bagaimana distribusi data berbeda satu sama yang lain. Dalam praktik, kita menghitung jarak pada tiap nilai dengan rata-ratanya yang lalu dikuadratkan dan dibagi dengan banyaknya data yang kita miliki, yang lalu kita sebut dengan variance. Saat kita mengakarkan nilai tersebut, kita mendapatkan Standard deviation yang menunjukkan seberapa jauh suatu nilai yang kita miliki dari rata-ratanya.

Sebagai contoh, kita akan menghitung variansi dan standar deviasi harga terkoreksi untuk jenis paket pemeliharaan mekanikal. Sebelumnya dilakukan agregasi data terlebih dahulu agar memperoleh informasi kolom yang diperlukan.

harga_terkoreksi <- lpse_kemenkeu %>% 
  filter(str_detect(string = namapaket, pattern = "Pemeliharaan Mekanikal dan Elektrikal Gedung")) %>% 
  pull(nilaiterkoreksi)
# menghitung variansi dengan cara manual

sum((harga_terkoreksi - mean(harga_terkoreksi))^2/length(harga_terkoreksi)-1)
## [1] 53946749719254312
var(harga_terkoreksi)
## [1] 56644087205217056

Lalu kita akarkan guna mendapatkan standard deviation:

sqrt(var(harga_terkoreksi))
## [1] 238000183
sd(harga_terkoreksi)
## [1] 238000183

Variansi dan standar deviasi akan selalu positif bila nilai pada data kita tidak sama semua. Pada saat tidak adanya keberagaman, maka variansi dari data adalah 0. Karena kedua pengukuran tersebut sensitif kepada tiap nilai, maka tidak cukup representatif untuk data yang terdapat pencilan.

Studi kasus:

Tim analis diminta untuk mengevaluasi dari beberapa sampel vendor untuk pengadaan jasa perbaikan mekanikal. Ingin diperoleh pengetahuan mana vendor yang lebih murah dan konsisten dari sisi harga pengadaannya?

Sebelumnya kita akan menyembunyikan informasi nama asli PT pemenang.

library(randomNames)
RNGkind(sample.kind = "Rounding")
set.seed(100)
name_list <- NULL
for(i in 1:10){
  name_list <- append(name_list, randomNames(4000, name.order = "first.last",
                                             name.sep = ' ', sample.with.replacement = F))
}
name_list <- unique(name_list)
set.seed(100)

data_agg <- lpse_kemenkeu %>% 
  filter(str_detect(string = namapaket, pattern = "Pemeliharaan Mekanikal dan Elektrikal Gedung")) %>% 
  group_by(pemenang) %>% 
  summarise(mean_terkoreksi = mean(nilaiterkoreksi),
            var_terkoreksi = var(nilaiterkoreksi),
            sd_terkoreksi = sd(nilaiterkoreksi)) %>% 
  mutate(pemenang = sample(name_list, 4))

data_agg

Jika kita perhatikan, secara rata-rata PT Aseela el-Younes memiliki harga yang terendah namun harga yang pernah ditawarkan cukup bervariasi. Berbeda dengan PT Samantha Lynch dengan harga terendah kedua, variansi harga yang terealisasi cukup lebih stabil (tidak mengalami perubahan/fluktuatif) dibandingkan dengan PT yang lainnya.

Note:

  • Semakin besar nilai variansi, semakin beragam data.
  • Nilai variance: 0 sd inf
  • Nilai tidak bisa diinterpretasikan secara langsung karena merupakan nilai kuadrat, hanya bisa membandingkan variansi antar kelompok data untuk alat pertimbangan keputusan bisnis.
  • Variansi yang diharapkan di sisi bisnis bisa yang terkecil/terbesar, tergantung dari konteks kebutuhan bisnis.
  • Nilai variansi sangat bergantung dengan skala data.

Contoh sederhana:

# data
luas_rumah <- c(100,100,90,90,90,100,100,90,100,100)
harga_sewa <- c(1,2,3,6,5,8,9,1,7,4) # dalam jutaan
# cek variance
var(luas_rumah)
## [1] 26.66667
var(harga_sewa)
## [1] 8.266667

Berdasarkan hasil contoh di atas, sudah terbukti jika kita hanya bisa membandingkan nilai data yang memiliki satuan informasi yang sama. Jika tidak, maka bisa misleading informasi yang disampaikan. Alternatif lain, jika ingin membandingkan variansi antar data yang memiliki satuan berbeda, kita terlebih dahulu harus melakukan transformasi data supaya satuannya sama.

Diskusi:

  1. Saya sebagai tim marketing di suatu perusahaan tentunya ingin memperoleh profit semaksimal mungkin. Bagaimana keadaan profit yang saya inginkan dari sisi mean dan variansi?
  2. Saya sebagai tim pengajar di IBI Kesatuan tentunya ingin setiap mahasiswa memperoleh score yang tinggi. Bagaimana keadaan score yang saya inginkan dari sisi mean dan variansi?
  3. Saya sebagai tim sales di suatu perusahaan ingin menerapkan diskon dalam penjualan yang dilakukan untuk menarik konsumen, namun tentunya ingin diskon yang diberikan rendah tetapi tetap menarik konsumen. Bagaimana keadaan diskon yang saya inginkan dari sisi mean dan variansi?
  4. Jika keadaan pada nomor 3 diterapkan pada sisi konsumen. Bagaiman keadaan diskon yang saya inginkan dari sisi mean dan variansi?

Pengukuran lain yang bisa kita gunakan adalah range dan IQR atau Interquartile Range. Fungsi range mengembalikan 2 buah nilai yaitu nilai minimum dan maksimum. apabila ingin menghitung selisih dari 2 nilai tersebut bisa dilakukan operasi pengurangan. selisih nilai max dan min kurang menggambarkan range dari sebaran, karena bila ada data outlier maka range tidak menggambarkan range sebaran data yang sesungguhnya.

max(harga_terkoreksi) - min(harga_terkoreksi)
## [1] 862191334

Sedangkan Interquartile Range menghitung 50% di tengah data yang kita miliki:

IQR(harga_terkoreksi)
## [1] 334284181
as.numeric(quantile(harga_terkoreksi, 0.75) - quantile(harga_terkoreksi, 0.25))
## [1] 334284181

Selain dari menggunakan quartile() untuk melihat kuartil yang kita miliki, kita juga bisa melihat kuartil ke-nol menggunakan min(), kedua median(), dan kelima menggunakan max(). Kelima angka ini berkumpul menjadi five-number summary. Kita bisa melihat menggunakan fungsi fivenum() pada data harga terkoreksi:

fivenum(harga_terkoreksi)
## [1]  409187572  631211807  832738004  965495988 1271378906

Dapat terlihat dari data harga terkoreksi untuk jenis jasa pemeliharaan mekanikal dari laporan LPSE, nilai terendahnya sekitar Rp 409,187,572 dan tertingginya Rp 1,271,378,906. Terlihat juga bahwa 25% dari harga terkoreksi tidak lebih dari Rp 631,211,807 dan 50% dari nilai tengah dari data yang dimiliki berkisar antara Rp 631,211,807 sampai Rp 965,495,988. Saat kita menggunakan summary() dapat terlihat lebih jelas karena terdapat penjelasan, juga ada tambahan rata-rata atau mean.

summary(harga_terkoreksi)
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
##  409187572  631211807  832738004  815607907  965495988 1271378906

Konsep yang serupa dari standar deviasi yang nanti akan kita gunakan sebagai sebuah fondasi statistik inferential adalah Standard Error of the Mean atau kita singkat sebagai Standard Error, untuk mengestimasi kedekatan rata-rata sampel kita dengan rata-rata populasi yang ada, hal ini ditemukan dengan membagi standar deviasi dengan akar dari jumlah data yang kita miliki:

library(psych)

sd(harga_terkoreksi)/sqrt(length(harga_terkoreksi))
## [1] 51935898
describe(harga_terkoreksi)$se
## [1] 51935898

Pada distribusi normal (yang nanti akan kita bahas), 67% kemungkinan bahwa rata-rata dari populasi ada di sekitar +- 1 SE. Artinya, bila kita dapat membentuk sebuah distribusi normal, maka kit abisa menerka rata-rata dari populasi dengan sebuah jarak atau interval. Dikarenakan oleh formula: \(SE=\frac{\alpha}{\sqrt{n}}\)

Maka semakin besar nilai \(n\), semakin kecil nilai SE, maka kit akan semakin yakin akan estimasi nilai rata-rata di populasi.

Diskusi:

Mana aset finansial yang memiliki tingkat berubah-ubah yang lebih tinggi menurut harga tahunannya?

price.coins <- c(1.4, 0.4, 0.8, 1.1, 1.8, 2.2, 2.3, 1.2)
price.oil <- c(1.6, 1.2, 1.9, 0.8, 0.6, 1.5, 2.1, 1.5)

Tingkat perubahan yang biasa digunakan oleh stock traders dan analis finansial adalah standar deviasi. Dari mana kedua hal di atas memiliki tingkat perubahan yang lebih tinggi?

2.2.0.1 [Opsional: Boxplot]

Boxplot merupakan plot yang menggambarkan sebaran data.

knitr::include_graphics(path = "assets/ps/boxplot.png")

Untuk mencari nilai outlier:

  • outlier bawah (outlier minimum) => \(Q1 - (1.5*IQR)\)
  • outlier atas (outlier maksimum) => \(Q3 + (1.5*IQR)\)

Sebagai contoh, kita akan membuat boxplot nilai HPS untuk Kementerian Sosial:

hps_kemensos <- lpse_kemenkeu %>% 
  filter(kldi == "Kementerian Sosial") %>% 
  pull(hps)

boxplot(hps_kemensos)

  • Boxplot bisa mengindikasikan distribusi data:
    • box yang berada ditengah = distribusi normal (memadat di tengah)
    • box yang mendekati daerah kiri/kanan (bawah/atas) = distribusi skewed
    • bila median mendekati Q1 maka nilai pada data cenderung rendah.
# memunculkan 5 nilai utama dari boxplot
# min, Q1, median, Q3, max

fivenum(hps_kemensos)
## [1]    96200700   506699600  1083689414  3935722560 51954745436
# untuk melihat batas bawah dan batas atas (_whisker_) boxplot.
# rumus batas bawah: Q1 - (1.5*IQR)

batas_bawah <- 506699600 - (1.5*IQR(hps_kemensos))

batas_bawah
## [1] -4479324355
# rumus batas atas: Q3 + (1.5 * IQR)

batas_atas <- 3935722560 + (1.5*IQR(hps_kemensos))

batas_atas
## [1] 8921746515

maka untuk distribusi nilai HPS Kementerian Sosial, apabila nilai HPS < - Rp 4,479,324,355 akan dianggap outlier negatif (ekstrim dengan HPS terendah), atau jika nilai HPS melebihi 8,921,746,515 akan dianggap sebagai outlier positif (HPS dengan nilai jauh lebih tinggi dibandingkan keaadaan umumnya).

Kali ini kita bisa melihat lebih dalam, paket apa saja yang merupakan nilai outlier.

# simpan ke dalam objek boxplot_kemensos 
# untuk diambil informasi index baris yang outlier.

boxplot_kemensos <- boxplot(hps_kemensos, plot = F)

lpse_kemenkeu %>% 
  filter(kldi == "Kementerian Sosial", hps %in% boxplot_kemensos$out) %>% 
  select(namapaket, hps) %>% 
  mutate(hps = scales::dollar(hps, prefix = "Rp "))

Setelah dilakukan audit, terbukti jika seluruh paket yang termasuk outlier jika nilai HPS melebihi Rp 8,921,746,515.

Cara mengatasi ketika terdapat data outlier :

  1. Jika outlier pada data yang kita miliki masih berkisar <5-10% kita bisa buang outlier tersebut
  2. Jika outlier pada data yang kita miliki > dari 10% data kita, maka pertahankan, karena bisa saja outlier tersebut merupakan distribusi asli data kita namun memang nilainya saja yang cukup ekstrim.

2.3 Kovariansi dan Korelasi

Saat kita memiliki dua buah sampel, yaitu X dan Y, dengan jumlah data yang sama, kita bisa melihat hubungan variansi X dengan varian Y. Kovariansi menjelaskan bagiamana kedia data tersebut saling berubah-ubah atau covary dan hal ini direpresentasikan dengan:

  • Formula Kovariansi:

\[Cov(X, Y) = \frac{1}{n-1}\sum\limits^n_{i=1}(X_i - \mu_X)(Y_i - \mu_Y)\]

  • Fungsi di R: cov()

Bila yang pergerakannya serupa maka kovariansi positif, bila tidak serupa maka kovariansi negatif.

Kita akan coba mencari tahu hubungan antara Harga Perkiraan Sendiri (HPS) dengan Harga Penawaran yang diberikan. Sebelumnya, kita buang terlebih dahulu nilai HPS yang merupakan outlier.

subset_lpse <- lpse_kemenkeu %>% 
  filter(hps < 1e11) %>% 
  select(hps, nilaitawar)
# menghitung nilai kovariansi

sum((subset_lpse$hps - mean(subset_lpse$hps))*(subset_lpse$nilaitawar - mean(subset_lpse$nilaitawar)))/(nrow(subset_lpse)-1)
## [1] 32917325110204928000
# dengan fungsi `cov()`

cov(subset_lpse$hps, subset_lpse$nilaitawar)
## [1] 32917325110204923904

Hasil dari kovariansi di atas hanya dapat kita interpretasikan dengan: Terdapat hubungan yang positif dari HPS dan Harga Tawar, itu artinya semakin tinggi HPS akan semakin tinggi pula nilai Harga Tawar nya. Begitupun sebaliknya.

Jika menemukan kovariansi yang negatif berarti semakin kecil nilai X akan berasosiasi dengan nilai Y yang juga akan semakin tinggi, dan juga sebaliknya. Sederhananya, jika nilai kovariansi negatif maka variabel X dan Y memliki asosiasi berkebalikan.

Kovariansi dengan dirinya sendiri \(cov(X,X)\) itu sama saja dengan nilai variansi. Perlu diketahui juga bahwa \(cov(X,Y) = cov(Y,X)\)

Kelemahan: Seperti variansi, kovariansi tidak memiliki batasan nilai untuk mengukur kekuatan hubungan antar dua variabel (-inf s.d inf), sehingga kita hanya bisa mengetahui apakah hubungannya positif atau negatif. Oleh karena itu, hadir nilai korelasi.

Korelasi:

Korelasi memampatkan nilai kovariansi yang dari -inf s.d inf menjadi -1 s.d 1 sehingga bisa diukur kekuatan hubungan antar data (variable).

  • Formula Korelasi: \(Cor(X,Y) = \frac{Cov(X,Y)}{\sqrt{Var(X)Var(Y)}}\)
  • Fungsi di R: cor()
  • Nilai korelasi: -1 sampai 1. Bila korelasi A & B mendekati..
    • -1 = negatif kuat -> bila A naik, B pasti turun.
    • 0 = tidak berkorelasi -> bila A naik, kita tidak tahu pasti apakah B akan naik/turun.
    • 1 = positif kuat -> bila A naik, B pasti naik.
  • Semakin tinggi nilai korelasi, semakin bisa kita memprediksi nilai suatu variable menggunakan nilai variable lainnya.

Contoh:

Adakah korelasi antara HPS dan nilaitawar, bagaimana hubungan dan kekuatannya?

cor(subset_lpse$hps, subset_lpse$nilaitawar)
## [1] 0.9788317

Jawaban:

Visualisasi korelasi dengan scatterplot:

# scatter plot
# run seluruh code bersamaan

plot(subset_lpse$hps, subset_lpse$nilaitawar)
abline(lm(subset_lpse$nilaitawar ~ subset_lpse$hps), # tambah garis;  linear model `lm` baru dibahas di ML
       col = 'red') # warna garis

3 Statistika Inferensial

Statistika Inferensial membantu kita menarik kesimpulan tentang keseluruhan data (populasi) dengan menggunakan sebagian informasinya saja (sampel). Aplikasi Statistika Inferensial diantaranya:

  • Quick Count Pemilu
  • Quality Control
  • Riset Obat

Setiap data memiliki distribusi. Distribusi data yang spesial dan berperan dalam inferential statistics adalah distribusi normal.

3.1 Distribusi Normal

Salah satu cara lain mempelajari pemusatan dan penyebaran adalah dengan melihat kurva. Kurva yang paling merepresentasikan sebuah distribusi dan juga paling terkenal adalah kurva normal.

Distribusi normal dengan rata-rata 0 dan standar deviasi 1 merupakan distribusi normal baku dan dapat diplot menggunakan curve(dnorm) dan dapat kita batasi juga sumbu x nya:

curve(dnorm, -3.5, 3.5, lwd=2, axes = FALSE, xlab = "", ylab = "")
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s"))

Saat data yang kita miliki itu mengikuti distribusi normal, maka asumsi distribusi normal bisa diaplikasikan pada data dan berarti dapat dibagi menjadi dua buah paramter saja: rata-rata dan standard deviasi. Penjabaran ari data yang kita miliki adalah:

  • 68% dari data akan terletak di antara 1 standar deviasi dan rata-rata.
  • 95% dari data akan terletak pada 2 standar deviasi dari rata-rata.
  • 99.7% dari data akan jatuh di dalam 3 standar deviasi dari rata-rata.

Bila kita melihat dari kurva distribusi normal, perhatikan bahwa: - simetris sempurna - unimodal (hanya memiliki satu mode) - area di bawah kurva sama dengan 1.

Salah satu ide atau teori yang membuat distribusi normal menjadi sangat signifikan adalah Central limit theorem: saat kita memiliki cukup banyak data, maka kumpulan dari data tersebut akan cenderung membentuk distribusi normal.

Akan dibentuk 50 angka random menggunakan rnorm(50, 0, 1) menjelaskan rata-rata 0 dan standar deviasi 1. Kita lihat hasilnya, lalu, tambahkan terus angkanya dan perhatikan bahwa semakin banyak data, semakin pula ia membentuk sebuah distribusi normal:

x = rnorm(50,0,1)
plot(density(x))

Coba untuk resapi terlebih dahulu konsep yang sebelum-sebelumnya yang baru. Saat sudah siap, kita akan masuk ke dalam statistik inferensial dan membahas mengenai variabel random yang kontinu, juga probability density function.

3.2 Probability Mass Function

Variabel acak yang diskrit (kuantitas barang terjual, jumlah paket pengadaan), dapat dijelaskan menggunakan probability mass function, yang bisa secara langsung menunjukkan probabilitas dari tiap titiknya:

Sebagai contoh:

  • p(pengadaan jasa): 0.48
  • p(pengadaan barang): 0.52

Karena mereka adalah probabilitas, maka penjumlahannya harus sama dengan 1.

3.3 Probability Density Function

Saat kita berfikir mengenai variabel acak yang kontinu (tingkat gula darah, tinggi, curah hujan, HPS, Harga Pagu), penting untuk mengetahui bahwa nilai-nilai tersebut tidak memiliki hingga, walau hanya di antara dua interval. Hal ini menghasikan probabilitas yang ingin dicari nantinya dijelaskan dalam bentuk probability density, yang ditemukan dengan mengambil area di bawah kurva.

Z-score

Untuk dapat menghitung peluang data kontinu, kita dapat memanfaatkan nilai Z-score. Z-score adalah cara yang dapat digunakan untuk menstandarisasikan distribusi suatu data menjadi distribusi normal

\(Z-score = \frac{x-\bar x}{\sigma}\)

Ket:

  • Z = Z-score
  • x = titik data
  • \(\bar x\) = mean
  • \(\sigma\) = standar deviasi

3.3.1 Contoh di Kehidupan Nyata: Pentingnya Atribut Tersebut

Kembali ke distribusi normal baku - mungkin anda bertanya apa yang bisa kita aplikasikan di sini. Untuk menjawab itu, akan dijabarkan beberapa contoh skenario:

Tinggi dari laki-laki di indonesia berdistribusi normal dengan rata-rata 160cm dan standar deviasi 7cm. Berapa probabilitas saat diambil satu laki-laki secara acak, memiliki tinggi lebih dari 175cm?

Solusi: 175cm itu 15cm lebih tinggi dari rata-rata, dan dengan membaginya dengan standar deviasi 7cm, kita dapatkan 2.143cm. Nilai ini adalah z-score. Maka probabilitas laki-laki indonesia lebih tinggi dari 175cm adalah P(z > 2.143)

# cara 1

z <- (175-160)/7
pnorm(z, lower.tail=F)
## [1] 0.01606229
# bernilai sama: 1-pnorm(z)

Argumen dalam pnorm()

  • q = nilai probability yang ingin dicari
  • mean = rata-rata data yang dimiliki
  • sd = standar deviasi dari data yang dimiliki
  • lower.tail = ketika yang ingin dicari lebih besar maka set FALSE, jika sebaliknya maka set TRUE
# cara 2
pnorm(q = 175, mean = 160, sd = 7, lower.tail = F)
## [1] 0.01606229

Diskusi:

Misal, kita akan menganalisa Harga Perkiraan Sendiri (HPS) untuk jenis pengadaan Pemeliharaan Kebersihan Gedung. Jika diketahui menurut data historis rata-rata dan standar deviasi HPS sebagai berikut

lpse_kemenkeu %>% 
  filter(str_detect(namapaket, "kebersihan gedung")) %>% 
  summarise(mean_hps = mean(hps),
            sd_hps = sd(hps))

Diketahui:

  • rata-rata HPS: Rp 4,137,961,256
  • standar deviasi HPS: Rp 2,810,013,808
  • Pertanyaan: Berapa probabilitas saat diambil di periode berikutnya jika ada pengadaan Jasa Pemberisihan Gedung nilai HPS lebih dari Rp 6 Milyar?
# solusi anda di sini

z-score yang kita tadi gunakan sangat penting untuk menarik data yang kita miliki untuk mengetahui posisinya pada distribusi normal baku. Dalam kata lain, z-score merupakan unit “standar” yang menghitung berapa standar deviasi jauhnya sebuah data statistik dari rata-rata. Hal ini sangat penting pada uji hipotesis, evaluasi performa (dibahas lebih dalam di materi machine learning), dan melihat selang keyakinan.

3.4 Confidence Interval

Kita biasanya memulai dengan estimasi sebuah titik, menggunakan contohnya rata-rata sampel \(\bar{x}\) dan sebagai sebuah titik rata-rata populasi \(\mu\). Lalu kita akan membuat Confidence interval (selang kepercayaan) dari titik yang kita miliki agar kita semakin yakin bahwa nilai rata-rata dari populasi yang ada benar-benar terdapat di sana. Oleh karena itu, Confidence interval berguna untuk menduga nilai mean populasi dengan sebuah interval (batas bawah, batas atas). Menebak dengan sebuah interval akan meminimalisir error dibandingkan hanya dengan menebak satu nilai.

  • Formula:

\[CI= \bar{x} \pm Z_{\frac{\alpha}{2}}*SE\]

  • Ket:
    • \(\bar{x}\) = rata-rata sampel
    • \(Z_{\frac{\alpha}{2}}\) = Z-score ketika alpha/2
    • \(\alpha\) = tingkat error yang ditolerasi, misal 10%, 5%, 1%
    • tingkat kepercayaan (confidence level) = 1-\(\alpha\), misal 90%, 95%, 99%.
    • SE = standard error

Standard Error mengukur kebaikan sampel dalam mewakilkan populasi. Standard Error digunakan untuk mengukur keakuratan sampel yang mewakili populasi dengan menggunakan standar deviasi. Semakin kecil nilai standard error, maka semakin representatif sampel dari keseluruhan populasi.

\[SE = \frac{\sigma}{\sqrt n}\]

  • Ket:
    • \(\sigma\) = standar deviasi sampel
    • \(n\) = jumlah sampel
  • Tahapan:
    • hitung mean sampel
    • hitung standar deviasi sampel & SE
    • tentukan tingkat kepercayaan & \(\alpha\)
    • tentukan Z alpha/2
    • hitung confidence interval

Confidence Interval digunakan sebagai suatu selang yang digunakan untuk memprediksi suatu nilai, karena dengan menebak suatu nilai menggunakan range nilai tertentu memiliki resiko yang lebih kecil dibandingkan dengan hanya menebak suatu nilai dengan satu nilai tertentu.

Contoh nyatanya adalah pemberian dividen tahunan pada sebuah industri, dan kita mengetahui bahwa industri tersebut memiliki populasi dengan standar deviasi 2.4%. Pada saat kita lihat buku publik akan 81 perusaahan dari industri tersebut, terdapat rata-rata sampel sejumlah 11.8% (maka perusahaan-perusahaan dari group berisi 81 badan ini membayar 11.8% akan profit mereka kepada shareholders tiap tahunnya).

Kita ingin membentuk selang kepercayaan 95% untuk μ, rata-rata pengeluaran dividend.

Solusi:

  • mean sampel = 11.8%
  • standar deviasi sampel = 2.4%
  • standar error (SE) adalah 2.4/sqrt(81) = 0.267
  • z-score dari selang kepercayaan 95% adalah 1.96, diperoleh dari qnorm(0.025)
  • margin of error (E) adalah 1.96*SE = 0.0524
  • Selang kepercayaannya adalah 11.8%+-0.524%

Maka kita bisa bilang bahwa selang kepercayaan 95% pada rata-rata pengeluaran dividend pada industri ini adalah [11.28%, 12.32%], kita bisa 95% yakin bahwa interval ini akan terdapat rata-rata dividend pada industri ini.

3.5 Uji Hipotesis dan p-value

Pada kehidupan data sains, kita akan sering sekali bertemu dengan ketidakyakinan pada model yang kita bentuk, dan hal tersebut harus kita uji secara statistik agar kita bisa memercayai model tersebut secara statistik. Kita menggunakan yang disebut uji signifikansi. Hal ini akan kita arahkan ke pada p-value, sebuah probabilitas mendapatkan sebuah hasil sama atau lebih ekstrim dari apa yang ditemukan, dengan asumsi hipotesis nol diterima.

Istilah-istilah:

  • Hipotesis: dugaan sementara yang harus diuji
    • \(H_0\) / null hypothesis:
      • kondisi standar
      • umumnya keadaan yang tidak diharapkan
      • memiliki unsur kesamaan (=, >=, <=)
    • \(H_1\) / alternate hypothesis:
      • umumnya keadaan yang kita harapkan
      • kontradiktif dengan \(H_0\)

Contoh:

  • \(H_0\):
    • Pemakaian masker tidak memberikan pengaruh pada laju penyebaran virus corona (=)
    • Penambahan teknisi tidak memberikan perbedaan durasi servis laptop (>=)
    • Penerapan promo tidak memberikan perbedaan jumlah pembelian produk(<=)
  • \(H_1\):
    • Pemakaian masker memberikan pengaruh pada laju penyebaran virus corona (!=)
    • Penambahan teknisi menurunkan durasi servis laptop (<)
    • Penerapan promo meningkatkan jumlah pembelian (>)
  • \(\alpha\):
    • tingkat signifikansi
    • umumnya 0.05
  • \(1-\alpha\): tingkat kepercayaan
  • \(p-value\):
    • akan dibandingkan dengan alpha untuk untuk mengambil keputusan
    • peluang data sampel berada pada bagian sangat ekstrim/berbeda signifikan dengan keadaan normal.

Pengambilan keputusan:

  • Jika \(p-value\) < \(\alpha\), maka tolak \(H_0\)
  • Jika \(p-value\) > \(\alpha\), maka gagal tolak \(H_0\)

3.5.1 Z-test

Uji hipotesis yang menggunakan Z-test bila:

  • standar deviasi populasi diketahui
  • jumlah sampel banyak (n > 30)

Studi Kasus

Bayangkan skenario bahwa kita diminta untuk memeriksa sebuah startup bernama Quicker, yang mengakui bahwa mereka dapat mempercepat urusan-urusan startup-startup dengan pemerintah untuk diberi izin. Lewat rekaman publik, diketahui bahwa rata-rata sebuah startup diberi dana oleh pemerintah adalah selama 215 hari (populasi standar deviansi 24 hari, dari info asli). Dari 35 perusahaan yang menggunakan Quicker, rata-rata yang dihasilkan adalah sebesar 178 hari.

Diskusi: Apakah observasi dengan hasil 178 hari sudah cukup efektif untuk bisa dikatakan signifikan

  • **Hipotesis Nol (\(H_0\)): Rata-rata Quicker dalam menyalurkan dana startup (178 hari) sama saja dengan metode sebelumnya (215 hari)
  • Hipotesis Alternatif (\(H_1\)): Rata-rata Quicker lebih cepat durasinya penyaluran dananya dibandingkan metode sebelumnya.

Menggunakan z-test, kita akan hitung p-value:

z <- (178-215)/24
pnorm(z)
## [1] 0.06157731
# sama saja: pnorm(178, 215, 24)
  • Keputusan: Kita bisa menolak H0 ketika p-value < 0.05 (alpha). Berdasarkan hasil perhitungan sebelumnya, p-value (0.06) > alpha (0.05) maka keputusannya adalah gagal tolak H0.
  • Kesimpulan: Karena gagal tolak Hipotesis awal, maka diperoleh kesimpulan bahwa Quicker sebanarnya sama saja dengan metode sebelumnya (tidak lebih cepat)

3.5.2 T-test

T-test merupakan suatu uji yang digunakan untuk melakukan pengujian signifikansi. T-test digunakan ketika :

  • sampel yang dimiliki < 30
  • standar deviasi dari populasi tidak diketahui
  • fungsi untuk melakukan t-test yaitu t.test()

Studi Kasus: Pemerintah sedang ingin melakukan lelang pengadaan jasa pemeliharaan Uninterruptible Power Supply (UPS). Terdapat satu PT yang menarik untuk dianalisis dari harga yang pernah ditawarkan. Berikut adalah data historis tender yang pernah diikuti oleh PT ASDF.

harga_ups <- c(10836921885, 14930583056, 8403654534, 10287020040, 9121449700, 15018192090)

Pertanyaannya, apakah ketika menggunakan jasa pemeliharaan UPS dari PT ASDF akan dapat lebih menghemat biaya? Jika diketahui rata-rata biaya pemeliharaan UPS oleh vendor-vendor sebelumnya yaitu sebesar RP 13,959,720,984

Jawab:

  1. Perumusan hipotesis

\(H_0\) : pengadaan Jasa Pemeliharaan UPS melalui PT ASDF lebih mahal atau sama dengan perusahaan lainnya (mu >= ~14 Milyar) \(H_1\) : pengadaan Jasa Pemeliharaan UPS melalui PT ASDF lebih hemat dibandingkan perusahaan lainnya (mu >= ~14 Milyar)

  1. Hitung T-test
t.test(harga_ups, mu = 13959720984, alternative = "less")
## 
##  One Sample t-test
## 
## data:  harga_ups
## t = -2.1542, df = 5, p-value = 0.0419
## alternative hypothesis: true mean is less than 13959720984
## 95 percent confidence interval:
##         -Inf 13796553172
## sample estimates:
##   mean of x 
## 11432970218

p-value = 0.041; alpha = 0.05

  1. Keputusan: p-value < alpha, tolak H0

  2. Kesimpulan:

Pengadaan jasa Pemeliharaan UPS melalui PT ADFT terbukti akan lebih menghemat pengeluaran pemerintah.