Kita akan mengatur cache untuk notebook ini dikarenakan akan ada banyak komputasi yang dilakukan pada baris-baris code yang kita nanti akan pelajari.
::opts_chunk$set(
knitrecho = 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)
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:
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:
<- read_csv(file = "data/LPSEKemenkeu.csv", na = c("NULL", "NA", " - ", ""))
lpse_kemenkeu
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.
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.
<- na.omit(lpse_kemenkeu)
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:
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:
<- c(50,10,20,30,55)
potongan_harga
# saat diurutkan, terlihat bahwa nilai tengah adalah 30
order(potongan_harga)] 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:
<- c(5,10,2,6,8,8)
hps
# saat diurutkan, dapat dilihat bahwa nilai tengah sebesar 7
order(hps)] 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):
<- c(7.8, 7.5, 6, 7.5, 4.5, 105, 45, 7.5, 5.5, 4)
tender
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:
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:
<- c("jasa", "barang", "pemeliharaan", "barang", "barang", "jasa", "pemeliharaan", "jasa", "barang", "jasa", "jasa")
pengadaan
<- function(x){
most 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?
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.
<- lpse_kemenkeu %>%
harga_terkoreksi 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)
<- NULL
name_list for(i in 1:10){
<- append(name_list, randomNames(4000, name.order = "first.last",
name_list name.sep = ' ', sample.with.replacement = F))
}<- unique(name_list) name_list
set.seed(100)
<- lpse_kemenkeu %>%
data_agg 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:
Contoh sederhana:
# data
<- c(100,100,90,90,90,100,100,90,100,100)
luas_rumah <- c(1,2,3,6,5,8,9,1,7,4) # dalam jutaan harga_sewa
# 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:
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?
<- c(1.4, 0.4, 0.8, 1.1, 1.8, 2.2, 2.3, 1.2)
price.coins <- c(1.6, 1.2, 1.9, 0.8, 0.6, 1.5, 2.1, 1.5) price.oil
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?
Boxplot merupakan plot yang menggambarkan sebaran data.
::include_graphics(path = "assets/ps/boxplot.png") knitr
Untuk mencari nilai outlier:
Sebagai contoh, kita akan membuat boxplot nilai HPS untuk Kementerian Sosial:
<- lpse_kemenkeu %>%
hps_kemensos filter(kldi == "Kementerian Sosial") %>%
pull(hps)
boxplot(hps_kemensos)
# 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)
<- 506699600 - (1.5*IQR(hps_kemensos))
batas_bawah
batas_bawah
## [1] -4479324355
# rumus batas atas: Q3 + (1.5 * IQR)
<- 3935722560 + (1.5*IQR(hps_kemensos))
batas_atas
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(hps_kemensos, plot = F)
boxplot_kemensos
%>%
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 :
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:
\[Cov(X, Y) = \frac{1}{n-1}\sum\limits^n_{i=1}(X_i - \mu_X)(Y_i - \mu_Y)\]
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.
<- lpse_kemenkeu %>%
subset_lpse 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).
cor()
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
Statistika Inferensial membantu kita menarik kesimpulan tentang keseluruhan data (populasi) dengan menggunakan sebagian informasinya saja (sampel). Aplikasi Statistika Inferensial diantaranya:
Setiap data memiliki distribusi. Distribusi data yang spesial dan berperan dalam inferential statistics adalah 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:
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:
= rnorm(50,0,1)
x 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.
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:
Karena mereka adalah probabilitas, maka penjumlahannya harus sama dengan 1.
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:
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
<- (175-160)/7
z pnorm(z, lower.tail=F)
## [1] 0.01606229
# bernilai sama: 1-pnorm(z)
Argumen dalam pnorm()
q
= nilai probability yang ingin dicarimean
= rata-rata data yang dimilikisd
= standar deviasi dari data yang dimilikilower.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:
# 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.
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.
\[CI= \bar{x} \pm Z_{\frac{\alpha}{2}}*SE\]
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}\]
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:
qnorm(0.025)
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.
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:
Contoh:
Pengambilan keputusan:
Uji hipotesis yang menggunakan Z-test bila:
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
Menggunakan z-test, kita akan hitung p-value:
<- (178-215)/24
z pnorm(z)
## [1] 0.06157731
# sama saja: pnorm(178, 215, 24)
T-test merupakan suatu uji yang digunakan untuk melakukan pengujian signifikansi. T-test digunakan ketika :
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.
<- c(10836921885, 14930583056, 8403654534, 10287020040, 9121449700, 15018192090) harga_ups
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:
\(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)
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
Keputusan: p-value < alpha, tolak H0
Kesimpulan:
Pengadaan jasa Pemeliharaan UPS melalui PT ADFT terbukti akan lebih menghemat pengeluaran pemerintah.