Practical Statistics berisi kaidah statistika yang banyak diterapkan dalam praktik data science agar dapat memahami dan mengolah data dengan tepat. Secara umum, Practical Statistics terbagi 2, berdasarkan kegunaannya:
Berikut adalah mindmap dari Practical Statistics yang akan kita pelajari:
Pertumbuhan supermarket di kota-kota besar meningkat setiap tahunnya
dan kompetisi pasar juga tinggi. Kita sebagai tim data diminta untuk
menganalisa performa retail milik perusahaan. Data
tersimpan dalam folder dat_input dengan nama file
retail.RDS
.
Read Data
Fungsi readRDS()
untuk membaca file ekstensi RDS, yaitu
object di R yang disimpan ke dalam sebuah file. Cara menyimpan object
menjadi file RDS dengan fungsi saveRDS()
<- readRDS(file = "data_input/retail.RDS")
retail retail
Deskripsi kolom:
Row.ID
= Nomer barisOrder.ID
= Unique ID pemesananOrder.Date
= Tanggal pemesananShip.Date
= Tanggal pengiriman barangShip.Mode
= Jenis pengiriman yang dipilih customerCustomer.ID
= Unique ID customerSegment
= Segmentasi/kategori custoemrProduct.ID
= Unique ID barangCategory
= Kateogri barangSub.Category
= Sub Kategori barangProduct.Name
= Nama produk barangSales
= Total sales dari barang yang dibeli oleh
customerQuantity
= Total barang yang dibeli oleh customerDiscount
= Total diskon yang diberikan kepada
customerProfit
= Total keuntungan yang didapatkan oleh
perusahaanShip.Duration
= Durasi pengirimanMonth
= Bulan transaksiDay
= Hari transaksiIsWeekend
= Apakah hari weekday atau weekendDescriptive Statistics membantu kita menggambarkan karakteristik dari data, sehingga berguna dalam proses Exploratory Data Analysis (EDA).
Ukuran pemusatan data adalah suatu nilai yang cukup untuk mewakili seluruh nilai pada data.
Cara paling umum untuk membuat perkiraan nilai tunggal dari data yang banyak adalah dengan merata-ratakannya.
\[\frac{\sum{x_i}}{n}\]
mean()
Contoh:
Berapa rata-rata profit
dari keseluruhan data retail
yang kita miliki?
mean(retail$Profit)
#> [1] 28.6569
Outlier adalah nilai ekstrim yang jauh dari observasi lainnya. Kurang tepat apabila menggunakan nilai mean yang diketahui ada data outliernya.
Contoh lain:
Ada sebuah Kantor Cabang BCA di daerah Sunter yang merekap jumlah pengunjung per bulan
Dengan nilai mean:
<- c(55, 50, 40, 70, 60, 45, 35, 35, 60, 1000, 100, 70)
pengunjung mean(pengunjung)
#> [1] 135
Apakah nilai mean di atas dapat diandalkan? Tidak selamanya bisa diandalkan
Masalah ini dapat diatasi oleh nilai median atau trimed mean.
mean(pengunjung, trim = 0.1)
#> [1] 58.5
Median atau nilai tengah diperoleh dengan mengurutkan data terlebih dahulu kemudian mencari nilai tengah dari data.
median()
Mari hitung ulang nilai pusat data profit
dengan
median:
median(pengunjung)
#> [1] 57.5
Nilai mean profit = 135, sedangkan median profit = 57.5
# opsional: cara kerja nilai median
sort(pengunjung)
#> [1] 35 35 40 45 50 55 60 60 70 70 100 1000
Nilai tengahnya berada diantara 55 & 60. Kedua nilai tersebut akan dicari rata2nya:
55+60)/2 (
#> [1] 57.5
Modus berguna untuk mencari nilai yang paling sering muncul (frekuensi tertinggi).
Contoh:
Tipe Ship.Mode
apa yang paling sering digunakan pada
data retail
?
Untuk mencari tahu hal tersebut, kita juga dapat membuat fungsi custom untuk mendapatkan nilai modus:
# PENTING: run chunk keseluruhan secara bersamaan
<- function(x){
most # membuat tabel frekuensi
<- table(x)
table_x
# mengurutkan tabel
<- sort(table_x, decreasing = TRUE)
sort_table_x
# mengambil kategori
<- names(sort_table_x)
name
# mengambil kategori dengan frekuensi terbesar
1]
name[ }
Menggunakan fungsi most()
:
most(retail$Ship.Mode)
#> [1] "Standard Class"
Ukuran penyebaran data mewakili seberapa menyebar atau beragam data kita.
Variance menggambarkan seberapa beragam suatu data numerik tunggal menyebar dari pusat datanya.
\[var = \frac{\sum(X_i - \bar{X})^2}{n-1}\]
var()
Contoh:
Toko retail ini sedang menyeleksi daerah mana yang cocok untuk cabang baru mereka. Mereka mengumpulkan informasi harga sewa bagnunan di daerah A dan B sebagai berikut:
<- c(400,410,420,400,410,420,400,410,420,400,410,420,400)
harga_A <- c(130,430,650,540,460,320,380,550,650,470,330,140,270) harga_B
Setelah dibandingkan, rata-rata harga bangunan kedua daerah sama:
mean(harga_A)
#> [1] 409.2308
mean(harga_B)
#> [1] 409.2308
Mari bandingkan dari sisi lain, yaitu tingkat keberagaman data (variance). Daerah manakah yang harganya lebih bervariansi?
var(harga_A)
#> [1] 74.35897
var(harga_B)
#> [1] 28707.69
Karakteristik:
Skala variance dari 0 sampai tak hingga. Semakin besar nilainya maka artinya semakin menyebar dari pusat data (mean).
Variance memiliki satuan kuadrat, sehingga tidak dapat langsung diinterpretasikan. Biasanya digunakan untuk membandingkan dengan nilai var lain dengan satuan yang sama.
Nilai variansi sangat bergantung dengan skala data
Kasus: Di bawah ini, data mana yang lebih bervariasi?
<- retail$Profit
profit_usd <- retail$Profit * 14000 profit_idr
# cek variance
var(profit_idr)
#> [1] 10756048418854
var(profit_usd)
#> [1] 54877.8
Diskusi: Apakah bisa kita simpulkan profit_idr
lebih
bervariasi daripada profit_usd
?
Jika dilihat dari nilai
var()
memang lebih besar, akan tetapi perlu diperhatikan bahwa sebenarnya nilai profit_idr itu sama dengan nilai profit_usd.
Standard deviation menggambarkan seberapa jauh simpangan nilai yang dianggap umum, dihitung dari titik pusat (mean) nya. Kita dapat menentukan apakah suatu nilai dikatakan menyimpang dari rata-rata namun masih dikatakan umum, atau sudah tidak umum.
Standard deviation dapat diinterpretasikan karena satuannya sudah sama seperti satuan data aslinya.
\[sd = \sqrt{var}\]
sd()
Mari kita coba hitungg standar devisiasi untuk kedua harga di bawah ini.
<- c(400,410,420,400,410,420,400,410,420,400,410,420,400)
harga_A <- c(130,430,650,540,460,320,380,550,650,470,330,140,270) harga_B
# standar deviasi harga_A & harga_B
sd(harga_A)
#> [1] 8.623165
sd(harga_B)
#> [1] 169.4334
mean(harga_A)
#> [1] 409.2308
mean(harga_B)
#> [1] 409.2308
Interpretasi: mean +- sd
Apabila kita ditawarkan suatu bangungan di daerah B dengan harga 800, apakah harga tersebut masih digolongkan wajar?
# hitung batas bawah dan atas dari harga wajar daerah B
409.2308 + 169.43
#> [1] 578.6608
DIVE DEEPER: Diskusi
Dikumpulkan harga saham_A
dan saham_B
selama 20 periode terakhir.
<- c(1000,1200,1150,1000,950,900,1200,1300,1400,1450,1500,1600,1400,1250,1400,1600,1700,1300,1400,1300)
saham_A <- c(1300,1350,1320,1310,1280,1230,1250,1260,1280,1300,1320,1340,1300,1270,1280,1300,1320,1400,1300,1290) saham_B
Victor adalah seorang investor pemula. Bantulah Victor untuk menentukan saham mana yang lebih baik dipilih untuk investasi! Gunakan nilai mean dan standar deviasi.
Berapa rata-rata harga tiap saham?
mean(saham_A)
#> [1] 1300
mean(saham_B)
#> [1] 1300
Saham mana yang memiliki volatilitas lebih tinggi?
Note: Volatilitas menunjukkan seberapa fluktuatif (naik/turunnya) sebuah nilai saham
sd(saham_A)
#> [1] 223.6068
sd(saham_B)
#> [1] 37.41657
Kesimpulan: …
a. Saya sebagai investor pemula tidak memiliki modal yang banyak untuk membeli saham dan ingin memilih saham dengan resiko rendah. Bagaimana keadaan harga saham yang saya harapkan?
b. Saya sebagai tim marketing di suatu supermarket tentunya ingin memperoleh profit semaksimal mungkin. Bagaimana keadaan profit yang saya harapkan?
c. Saya sebagai student di Algoritma yang akan mengerjakan quiz untuk keseluruhan course. Bagaimana keadaan score quiz yang saya harapkan?
Five number summary (ringkasan lima angka) adalah satu set statistika deskriptif numerik yang terdiri dari lima angka:
Gunakan fungsi summary()
untuk merangkum nilai sebaran
data tersebut.
Contoh:
Deskripsikan distribusi Sales
dari data
retail
summary(retail$Sales)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.444 17.280 54.490 229.858 209.940 22638.480
Dari summary tersebut, kita bisa mengetahui nilai sebaran:
Range dari Ship.Duration
adalah 7
summary(retail$Ship.Duration)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.000 3.000 4.000 3.958 5.000 7.000
IQR dari Ship.Duration
adalah 2
IQR(retail$Ship.Duration)
#> [1] 2
Distribusi data numerik pada umumnya divisualisasikan dengan boxplot, yang meliputi komponen:
Beberapa hal yang harus diperhatikan dalam boxplot:
Insight yang dapat diperoleh dari boxplot:
Contoh:
Visualisasikan sebaran data Quantity
dari data
retail
dengan boxplot()
! Analisis informasi
yang didapatkan.
boxplot(retail$Quantity, horizontal = T)
Contoh lain:
Selain untuk melihat satu value saja, boxplot juga dapat digunakan
untuk melihat dua value. Mari kita coba visualisasikan sebaran data
Quantity
berdasarkan Category
transaksi yan
dilakukan.
boxplot(formula = Quantity ~ Category, data = retail)
Ukuran yang digunakan untuk melihat hubungan linear antara dua variabel numerik.
Covariance menunjukkan bagaimana variansi 2 data (variable yang berbeda) bergerak bersamaan.
\[Cov(X, Y) = \frac{1}{n-1}\sum\limits^n_{i=1}(X_i - \mu_X)(Y_i - \mu_Y)\]
cov()
Contoh:
Hitunglah covariance antara saham_A
dan
saham_B
! Bagaimana hubungannya?
<- c(1000,1200,1150,1000,950,900,1200,1300,1400,1450,1500,1600,1400,1250,1400,1600,1700,1300,1400,1300)
saham_A <- c(1300,1350,1320,1310,1280,1230,1250,1260,1280,1300,1320,1340,1300,1270,1280,1300,1320,1400,1300,1290) saham_B
cov(x = saham_A, y = saham_B)
#> [1] 2657.895
Kelemahan: Seperti variance, covariance 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 correlation.
Correlation memampatkan nilai covariance yang dari -inf s.d inf menjadi -1 s.d 1 sehingga bisa diukur kekuatan hubungan antar data (variable).
\[Cor(X,Y) = \frac{Cov(X,Y)}{\sqrt{Var(X)Var(Y)}}\]
Fungsi di R: cor()
Nilai korelasi mengindikasikan kekuatan hubungan antara dua variable numerik sebagai berikut:
Bila korelasi dua variable numerik mendekati: * -1 artinya korelasi negatif kuat * 0 artinya tidak berkorelasi * 1 artinya korelasi positif kuat
Contoh:
Adakah korelasi antara saham_A
dan saham_B
,
bagaimana hubungan dan kekuatannya?
cor(x = saham_A, y = saham_B)
#> [1] 0.3176792
Jawaban: Weak Positive Corellation
Visualisasi korelasi dengan scatter plot:
# scatter plot
# run seluruh code bersamaan
plot(saham_A, saham_B)
abline(lm(saham_B ~ saham_A),
col = 'red')
Ilustrasi correlation:
Diskusi Bersama
Victor adalah seorang investor dan memiliki modal untuk membeli dua saham sekaligus. Victor telah mengumpulkan data historis 5 saham potensial dan melihat pergerakannya:
Melihat matriks korelasi antar saham dengan fungsi
cor()
# buat matriks korelasi data
cor(saham)
#> saham_A saham_B saham_C saham_D saham_E
#> saham_A 1.0000000 0.31767918 -0.202135392 0.434056705 1.0000000
#> saham_B 0.3176792 1.00000000 0.014539664 -0.112781955 0.3176792
#> saham_C -0.2021354 0.01453966 1.000000000 -0.005651362 -0.2021354
#> saham_D 0.4340567 -0.11278195 -0.005651362 1.000000000 0.4340567
#> saham_E 1.0000000 0.31767918 -0.202135392 0.434056705 1.0000000
Visualisasi korelasi dapat menggunakan fungsi ggcorr()
(visualisasi heatmap) dari package GGally:
# install package di console:
# install.packages("GGally")
# load library:
library(GGally)
# visualisasi:
ggcorr(saham, label = T)
Diskusi: Berdasarkan korelasi di atas, dua saham mana yang akan Victor beli sekaligus?
Saham A & Saham E, karena korelasinya sangat tinggi.
Inferential Statistics membantu kita menarik kesimpulan tentang keseluruhan data (populasi) dengan menggunakan sebagian informasinya saja (sampel).
Setiap data memiliki distribusi. Distribusi data yang spesial dan berperan dalam inferential statistics adalah distribusi normal.
Karakteristik:
Distribusi normal banyak digunakan pada inferensial statistik karena dicetuskannya Central Limit Theorem. Semakin bertambahnya jumlah sampel yang diambil secara acak (random), maka distribusi rata-rata sampel akan mengikuti distribusi normal.
Karakteristik distribusi normal inilah yang dimanfaatkan untuk penghitungan inferensial statistik:
Contoh:
Dari data Retail
, berapa peluang (proporsi) pelanggan
membeli produk dari Category
Technology?
Hint:
table()
membuat tabel frekuensi (count)prop.table()
membuat tabel proporsi dari tabel
frekuensiprop.table(table(retail$Category))
#>
#> Furniture Office Supplies Technology
#> 0.2122273 0.6029618 0.1848109
Z-score merupakan sebuah nilai yang merepresentasikan berapa standard deviasi data tersebut menyimpang dari rata-ratanya
\[Z = \frac{x-\mu}{\sigma}\]
Keterangan:
Contoh
Tinggi badan pria dewasa di Indonesia berdistribusi normal dengan rata-rata 165 cm dan standar deviasi 10 cm. Berapa peluang pria dewasa di Indonesia memiliki tinggi badan > 180 cm?
Diketahui:
Cara 1
Tahapan 1: Hitung Z-score
<- (180 - 165) / 10
z_score z_score
#> [1] 1.5
Tahapan 2: Ubah menjadi peluang
Dalam merubah Z-Score menjadi peluang, kita dapat memanfaatkan fungsi
pnorm()
.
pnorm(q = z_score, lower.tail = F)
#> [1] 0.0668072
Cara 2
Pada cara 2, kita akan langsung menggunakan fungsi
pnorm()
dan memanfaatkan semua parameter yang ada.
pnorm(q = 180,
mean = 165,
sd = 10,
lower.tail = F)
#> [1] 0.0668072
Jawaban: Peluang pria dewasa di Indonesia memiliki tinggi badan > 180 cm adalah 6.6%
Confidence interval (selang kepercayaan) berguna untuk menduga nilai mean populasi dengan sebuah interval. Menebak dengan sebuah interval akan meminimalisir error dibandingkan hanya dengan menebak satu nilai.
\[CI = \bar{x} \pm Z_{\frac{\alpha}{2}}*SE\]
SE mengukur kebaikan sampel dalam mewakilkan populasi. Semakin kecil, maka sampel semakin representatif (baik).
\[SE = \frac{\sigma}{\sqrt n}\]
Contoh:
Suatu retail memiliki 1000 cabang dan ingin memperkirakan interval durasi pelayan pelanggan pada setiap kasir. Total data yang berhasil dikumpulkan sementara waktu dari Retail tersebut adalah 300 cabang, dimana data tersebut memiliki durasi pelayan selama 3 bulan terakhir dengan rata-rata durasi 500 detik dan standar deviasi 100 detik.
Berapakah confidence interval untuk rata-rata durasi pelayanan? Gunakan tingkat kepercayaan 95%.
Tahapan 1: Hitung nilai SE
<- 100 / sqrt(300)
SE SE
#> [1] 5.773503
Tahapan 2: Tentukan tingkat kepercayaan dan alpha
Tambahan panduan dalam menentukan alpha,
<- 0.05 alpha
Tahapan 3: Hitung nilai Z
Untuk menghitung nilai Z kita akan menggunakan fungsi
qnorm()
, dimana fungsi tersebut akan mengubah nilai
probability menjadi Z.
qnorm()
untuk mencari titik di normal baku (q) dari
sebuah peluang (p) (z –> probability)pnorm()
untuk mencari peluang (p) dari sebuah titik di
normal baku (q) (probability –> z)Pada fungsi qnorm()
akan kita isi dengan nilai peluan
dari hasil alpha/2, alpha dibagi 2 karena ingin membuat batas bawah dan
batas atas (dalam dunia statistika dikenal sebagai two-tailed)
::include_graphics("assets/two-tailed.png") knitr
<- qnorm(alpha/2)
Z Z
#> [1] -1.959964
<- abs(Z)
Z_abs Z_abs
#> [1] 1.959964
Sama seperti menentukan nilai standar devisasi, dalam menentukan nilai CI kita akan mencari batas atas dan batas bawah.
# CI batas atas
<- 500 + Z_abs * SE
CI_atas CI_atas
#> [1] 511.3159
# CI batas bawah
<- 500 - Z_abs * SE
CI_bawah CI_bawah
#> [1] 488.6841
Pelayanan pelanggan pada setiap kasir berkisar antara 488.6841 sampai 511.3159, dengan tingkat kepercayaan sebesar 90%
Uji hipotesis bertujuan untuk menguji dugaan. Uji hipotesis sering disebut juga sebagai uji signifikansi yang digunakan untuk menguji apakah suatu treatment memberikan perubahan/pengaruh signifikan terhadap suatu kondisi.
Istilah-istilah:
Contoh:
\(H_0\): Penerapan diskon tidak memberikan perbedaan jumlah pembelian produk (<=)
\(H_1\): Penerapan diskon meningkatkan jumlah pembelian produk (>)
\(\alpha\):
\(1-\alpha\): tingkat kepercayaan
\(p-value\):
Pengambilan keputusan:
Contoh:
Uji hipotesis yang menggunakan Z-test bila:
\[Z = \frac{\bar X-\mu}{SE}\]
\[SE = \frac{\sigma}{\sqrt n}\]
Contoh Kasus
BCA merupakan salah satu Bank terbaik di Indonesia. Bila diketahui rata-rata likes dari suatu post di platform mereka sebesar 14000 likes dengan standar deviasi 5000 likes.
Demi meningkatkan likes dari tiap post, BCA memutuskan untuk menggunakan influencer sebagai brand ambassador pemasaran produk. Setelah menggunakan influencer, diambil 50 postingan acak yang ternyata memiliki rata-rata likes 17500.
Sebagai tim marketing, lakukan analisis apakah menggunakan jasa influencer secara signifikan meningkatkan customer engagement (dari sisi rata-rata jumlah likes) atau tidak? Gunakan tingkat kepercayaan 95%.
Diketahui,
Jawab:
Tahapan 1: Tentukan Hipotesis
H0 (awal): jasa influencer tidak berpengaruh terhadap customer engagement (= 14000) H1 (tujuan): jasa influencer berpengaruh terhadap customer engagement (> 14000)
Tahapan 2: Hitung p-value
Untuk menghitung nilai p-value kita akan memanfaatkan nilai Z dari
rumus di atas, lalu nilai Z tersebut akan dimasukan kedalam fungsi
pnorm()
# menghitung nilai SE
<- 5000 / sqrt(50)
SE
# menghitung nilai z
<- (17500 - 14000) / SE Z
<- pnorm(q = Z,
p_value lower.tail = F)
p_value
#> [1] 0.0000003715492
Tahapan 3: Bandingkan p-value dengan alpha
p-value = 0.0000003715492 < alpha = 0.05
tolak H0
Tahapan 4: kesimpulan
Jasa influencer berpengaruh terhadap customer engagement
Uji hipotesis menggunakan T-test jika:
Bentuk T-distribution mirip dengan normal distribution, hanya saja lebih landai ketika jumlah sampel sedikit:
Contoh:
Quicker merupakan startup yang bertugas untuk membantu para startup lain mendapatkan dana hibah dari pemerintah. Umumnya, rata-rata lama proses penyerahan berkas hingga dana dicairkan adalah 215 hari.
Dikumpulkan data durasi proses pencairan dana dari 10 perusahaan startup yang menggunakan jasa Quicker sebagai berikut:
<- c(201, 200, 215, 212, 246, 220, 205, 195, 190, 200) duration
Apakah Quicker bisa secara signifikan mempercepat durasi pencairan dana hibah Gunakan tingkat kepercayaan 95%.
Jawab:
Tahapan 1: Tentukan Hipotesis
Tahapan 2: Hitung P-value dengan t.test()
Untuk t.test R sudah memiliki fungsi built-in tersendiri:
Parameter yang dapat digunakan pada t.test()
:
x
= objek yang berisikan data ataupun vectormu
= rata-rata dari nilai yang diperhitungkanalternative
= operator pembanding yang diberikan pada
H1 atau alternative hipotesis. greater
/
less
t.test(x = duration,
mu = 215,
alternative = "less")
#>
#> One Sample t-test
#>
#> data: duration
#> t = -1.297, df = 9, p-value = 0.1134
#> alternative hypothesis: true mean is less than 215
#> 95 percent confidence interval:
#> -Inf 217.7279
#> sample estimates:
#> mean of x
#> 208.4
Thapan 3: Bandingkan P-value dengan alpha
p-value = 0.1134 > alpha = 0.05
Gagal Tolak HO
Tahapan 4: Kesimpulan
Quicker tidak memberikan efek pada durasi pencairan dana
Summary Day 2:
prop.table()
& table()
pnorm()
-> mengubah nilai Z Score
menjadi probabilityqnorm()
, kita menggunakan fungsi tersebut untuk mencari
titik normal baku karena nilai yang kita miliki adalah probability
berdsar penentuan alpha.