Di sesi ini kita akan mempelajari beberapa teknik statistik deskriptif dasar yang dapat kita gunakan untuk melakukan eksplorasi data. Di antaranya, kita akan mempelajari cara-cara menghitung cross-tab, indeks central tendency seperti mean, dan variasi di dalam data. Kita juga akan mempelajari sedikit tentang korelasi. Terakhir, kita akan membahas bagaimana menyimpan data tersebut di dalam tabel yang dapat dibaca dengan mudah.
Catatan: Sumber utama tutorial adalah buku Danielle Navarro: Learning Statistics with R (https://learningstatisticswithr.com/), halaman di Stats and R ini (https://statsandr.com/blog/descriptive-statistics-in-r), dan petunjuk dari Tidyverse (https://tidyverse.org)
Pertama kita nyalakan package terlebih dahulu dan set working directory
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
-- Attaching packages ------------------------------------------------------------ tidyverse 1.3.1 --
v ggplot2 3.3.5.9000 v purrr 0.3.4
v tibble 3.1.6 v dplyr 1.0.7
v tidyr 1.1.4 v stringr 1.4.0
v readr 2.1.0 v forcats 0.5.1
-- Conflicts --------------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
setwd("D:/Temp/R Tutoring/Jan 21")
Lalu kita masukkan data
df <- read_csv("./Session 3/Jajan Q1.csv")
Rows: 25 Columns: 6
-- Column specification -----------------------------------------------------------------------------
Delimiter: ","
chr (3): nama, bulan, jajan
dbl (3): jumlah, harga, pengeluaran
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
df
Data untuk simulasi missing value
df_missing <- read_csv("./Session 3/Jajan Q1 - Sheet1 (missing).csv", )
Rows: 25 Columns: 6
-- Column specification -----------------------------------------------------------------------------
Delimiter: ","
chr (3): nama, bulan, jajan
dbl (3): jumlah, harga, pengeluaran
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_missing
Kita sudah mengenal sedikit tentang bagaimana memunculkan hitungan statistik deskriptif sebelumnya, dengan fungsy summary() Ingat bahwa kalau kita menggunakan summary() pada sebuah data numerik, kita akan mendapatkan deskripsi seperti berikut
summary(df$pengeluaran)
Min. 1st Qu. Median Mean 3rd Qu. Max.
30000 60000 110000 236600 180000 1200000
Namun, terdapat cara-cara lebih spesifik untuk mendapatkan deskripsi tersebut, untuk menunjukkan central tendency, variasi, dan distribusi dalam data.
Untuk mendapatkan mean, caranya cukup mudah. Gunakan fungsi mean().
mean(df$pengeluaran)
[1] 236600
Untuk kalkulasi seperti ini, jika ada missing value di dalam kolom yang dihitung, maka kita harus memberikan perintah apa yang dilakukan terhadap missing value tersebut. Jika tidak, maka akan keluar error dalam perhitungan. Gunakan na.rm = TRUE untuk meminta mean() mengabaikan row dengan missing value.Hal ini berlaku untuk kebanyakan fungsi kalkulasi dari base R.
# Lihat apa yang terjadi jika kita menggunakan kolom yang memiliki missing value
mean(df_missing$pengeluaran)
[1] NA
# Sekarang kita tambahkan na.rm = TRUE
mean(df_missing$pengeluaran, na.rm = TRUE)
[1] 245714.3
Hitungan central tendency lain yang sering digunakan adalah median. Median dapat dihitung dengan median()
median(df$pengeluaran)
[1] 110000
untuk menghitung kuartil data, kita bisa menggunakan fungsi quantile()
quantile(df$pengeluaran)
0% 25% 50% 75% 100%
30000 60000 110000 180000 1200000
Untuk hasil lebih spesifik, kita bisa menuliskan potongan data di kuartil keberapa yang kita inginkan.
quantile(df$pengeluaran, 0.2)
20%
60000
Fungsi range secara otomatis menunjukkan nilai paling rendah (min) dan paling tinggi (max) dari kolom.
range(df$pengeluaran)
[1] 30000 1200000
Namun, kita bisa menggunakan min atau max jika kita ingin mendapatkan salah satu nilai itu saja.
min(df$pengeluaran)
[1] 30000
max(df$pengeluaran)
[1] 1200000
Standard deviation adalah salah satu cara paling umum untuk melihat variasi dari suatu data, yang merujuk ke seberapa jauh umumnya data point di dalam suatu set berada di luar mean. Di dalam R, kita bisa hitung hal ini dengan mudah menggunakan sd()
sd(df$pengeluaran)
[1] 321881.6
Untuk melakukan crosstab, kita memiliki dua pilihan, table() atau xtab(). Keduanya secara output tidak berbeda, walau ada sedikit perbedaan di dalam sintaks. Dua contoh di bawah menggunakan masing-masing fungsi menampilkan berapa kali setiap orang di dalam dataset Jajan melakukan pembelian di setiap bulan.
table(df$nama, df$bulan)
Februari Januari Maret
Alvin 4 4 3
Bene 4 2 2
Cakra 2 3 1
xtabs(~ df$nama + df$bulan)
df$bulan
df$nama Februari Januari Maret
Alvin 4 4 3
Bene 4 2 2
Cakra 2 3 1
Biasanya, kita lebih perlu untuk mengetahui proporsi (%) dari suatu cross tab, bukan jumlahnya secara riil. Untuk itu, kita bisa menggunakan fungsi prop.table().
prop.table(table(df$nama, df$bulan))
Februari Januari Maret
Alvin 0.16 0.16 0.12
Bene 0.16 0.08 0.08
Cakra 0.08 0.12 0.04
Fungsi prop.table() secara otomatis akan menghitung proporsi dari setiap sel dengan populasi. Namun, kita bisa memerintahkan untuk menghitung per row atau kolom.
# Proporsi per row
prop.table(table(df$nama, df$bulan), 1)
Februari Januari Maret
Alvin 0.3636364 0.3636364 0.2727273
Bene 0.5000000 0.2500000 0.2500000
Cakra 0.3333333 0.5000000 0.1666667
# Proporsi per kolom
prop.table(table(df$nama, df$bulan), 2)
Februari Januari Maret
Alvin 0.4000000 0.4444444 0.5000000
Bene 0.4000000 0.2222222 0.3333333
Cakra 0.2000000 0.3333333 0.1666667
Seringkali kita perlu melakukan deskripsi berdasarkan kelompok atau kategori tertentu dalam data. Misalnya, kita ingin melihat secara rata-rata, Alvin, Bene dan Cakra menghabiskan berapa untuk jajan. Terdapat beberapa cara untuk melakukan ini.
Cara yang cepat dan mudah adalah dengan aggregate() dan describeBy(). Cara-cara ini mirip dengan kalau kita menggunakan summary:
summary(df)
nama bulan jajan jumlah harga
Length:25 Length:25 Length:25 Min. :1.00 Min. : 30000
Class :character Class :character Class :character 1st Qu.:1.00 1st Qu.: 30000
Mode :character Mode :character Mode :character Median :1.00 Median : 60000
Mean :2.04 Mean : 200800
3rd Qu.:2.00 3rd Qu.: 80000
Max. :8.00 Max. :1200000
pengeluaran
Min. : 30000
1st Qu.: 60000
Median : 110000
Mean : 236600
3rd Qu.: 180000
Max. :1200000
Namun, kita bisa memerintahkan R untuk membagi hasilnya per kategori tertentu. Misalnya dengan describeBy, fungsi yang ada di dalam package psych.
library(psych)
Attaching package: ‘psych’
The following objects are masked from ‘package:ggplot2’:
%+%, alpha
describeBy(x = df[c("pengeluaran", "jumlah")], group = df$nama)
Descriptive statistics by group
group: Alvin
---------------------------------------------------------------------------
group: Bene
---------------------------------------------------------------------------
group: Cakra
describeBy() memberikan summary data yang terkategorisasikan. Fungsi ini akan memberikan hasil yang serupa dengan summary, namun dengan tambahan adanya pengelompokkan data berdasarkan suatu variabel faktor.
Cara lainnya adalah dengan aggregate().
aggregate(formula = pengeluaran ~ nama,
data = df,
FUN = mean)
aggregate(formula = pengeluaran ~ nama,
data = df,
FUN = SD)
Ada cara yang lebih fleksibel, walau sedikit lebih kompleks, yaitu dengan kombinasi summarise() dan group_by(). Secara prinsip, cara ini tidak jauh beda dengan aggregate(), dan hasilnya mirip dengan jika kita menggunakan aggregate() untuk beberapa fungsi sekaligus, dan langsung membuat sebuah tabel dari fungsi tersebut. Lihat contoh di bawah ini:
Perhatikan bahwa di sini digunakan fungsi %>% yang artinya untuk semua fungsi berikutnya akan merujuk ke dataset di awal, yang dikombinasikan dengan <-, untuk menyimpan sebagai objek tabel baru.
Fungsi groupBy() di sini memberikan perintah untuk mengelompokkan berdasarkan nama. Di fungsi ini kita juga bisa membuat tabulasi berdasarkan lebih dari satu variabel. Misalkan, kita ingin melihat mean dan standard deviation per orang per bulan:
# Clean up: membetulkan sort order dari faktor 'bulan'
df$bulan <- factor(df$bulan, levels=c("Januari", "Februari", "Maret"))
tab_desc <-df %>%
group_by(nama, bulan) %>%
summarise(mean = mean(pengeluaran),
median = median(pengeluaran),
sd = sd(pengeluaran),
n = n())
`summarise()` has grouped output by 'nama'. You can override using the `.groups` argument.
tab_desc
summarise() membuat kalkulasi berdasrkan fungsi tertentu seperti mean atau standard deviation. Untuk melihat fungsi lengkapnya, gunakan ?summarise untuk membuka dokumentasi dari fungsi.
Histogram sangat praktis untuk melihat distribusi data secara visual. Gunakan hist() untuk membuat histogram.
hist(df$pengeluaran)
Dengan boxplot, kita bisa langsung melihat potensi nilai-nilai outlier, atau lebih tepatnya, nilai yang jauh di atas interquartile range (IQR). Gunakan boxplot untuk menggambar figur ini.
boxplot(df$pengeluaran)
Scatterplot sangat berguna untuk melihat distribusi nilai dari dua variabel, dan sebuah instrumen yang memudahkan eksplorasi hubungan antara dua variabel.plot adalah fungsi yang digunakan untuk membuat scatterplot sederhana.
plot(df$pengeluaran, df$jumlah)
Q-Q Plot (quantile-quantile plot) adalah metode untuk melihat normalitas data. Figur ini bisa menjadi indikasi awal apakah suatu variabel normal atau tidak, di mana normalitas didefinisikan sebagai sebuah distribusi data yang bersifat unimodal.Gunakan qqnorm untuk menggambar Q-Q Plot.
qqnorm(df$pengeluaran)
qqline(df$pengeluaran)
Korelasi, walaupun pada dasarnya adalah sebuah teknik inferensial, berguna untuk mengeksplorasi potensi keterhubungan antara variabel-variabel. Hal ini terutama jika kita menggunakan sebuah tabel korelasi.
Fungsi untuk menghitung korelasi di dalam R adalah cor(). cor() dapat membuat tabel korelasi dengan lebih dari 2 variabel sekaligus. Tabel dari cor() akan memuat koefisien korelasi yang dihitung dari korelasi Spearman secara default.
cor(df[c("pengeluaran", "jumlah", "harga")])
pengeluaran jumlah harga
pengeluaran 1.0000000 -0.1567716 0.9874424
jumlah -0.1567716 1.0000000 -0.3076555
harga 0.9874424 -0.3076555 1.0000000
Kalau kita ingin melihat p-value dari korelasi, berbarengan dengan koefisiennya, kita bisa gunakan fungsi corr.test(), yang merupakan bagian dari package psych.
corr.test(df[c("pengeluaran", "jumlah", "harga")])
Call:corr.test(x = df[c("pengeluaran", "jumlah", "harga")])
Correlation matrix
pengeluaran jumlah harga
pengeluaran 1.00 -0.16 0.99
jumlah -0.16 1.00 -0.31
harga 0.99 -0.31 1.00
Sample Size
[1] 25
Probability values (Entries above the diagonal are adjusted for multiple tests.)
pengeluaran jumlah harga
pengeluaran 0.00 0.45 0.00
jumlah 0.45 0.00 0.27
harga 0.00 0.13 0.00
To see confidence intervals of the correlations, print with the short=FALSE option
Opsi lainnya adalah melihat kalkulasi korelasi secara visual. cor.plot(), bagian dari psych, adalah fungsi yang dapat digunakan untuk melakukan visualisasi tabel korelasi.
cor.plot(df[c("pengeluaran", "jumlah", "harga")])