Bivariate dan Multivariate (2)

Author

Alfa Nugraha

Visualisasi gugus data yang berisi peubah yang bersifat kategorik (atau kualitatif) dapat menggunakan plot dalam bentuk grafik batang (bar plot), balon (balloon plot), atau mosaic plot.

Untuk data kategorik multivariate yang berukuran besar, diperlukan teknik statistik khusus yang didedikasikan untuk analisis data kategorikal, seperti analisis korespondensi sederhana dan berganda. Metode-metode ini memungkinkan untuk menganalisis dan memvisualisasikan hubungan (yaitu korelasi) antara sejumlah besar variabel kualitatif.

Bar plot untuk tabel kontingensi

Gugus data contoh yang digunakan adalah HairEyeColor, variasi warna rambut, mata, dan jenis kelamin pada 592 mahasiswa statistik

data("HairEyeColor")
df <- as.data.frame(HairEyeColor)
kable(head(df))
Hair Eye Sex Freq
Black Brown Male 32
Brown Brown Male 53
Red Brown Male 10
Blond Brown Male 3
Black Blue Male 11
Brown Blue Male 50

Buatlah grafik batang dengan ketentuan:

  • Warna rambut pada sumbu-x
  • Ubah warna batang berdasarkan warna mata
  • Split grafik menjadi panel ganda berdasarkan jenis kelamin
ggplot(df, aes(x = Hair, y = Freq)) +
  geom_bar(
    aes(fill = Eye), stat = "identity", color = "white",
    position = position_dodge(0.9)
    ) +
  facet_wrap(~Sex) + 
  fill_palette("jco")

Balloon plot

Salah satu alternatif bar plot dalam visualisasi data kategorik berukuran besar adalah balloon plot. Gugus data Housetasks akan digunakan pada contoh grafik kali ini, tabel kontingensi yang berisi frekuensi 13 tugas rumah tangga pada suatu keluarga.

Plot berpasangan pada data kategorik

Hubungan antar masing-masing peubah pada data kategorik dapat juga divisualisasikan menggunakan perintah gpairs.

gpairs(housetasks)

ggballoonplot

Fungsi ggballoonplot dapat digunakan untuk menggambarkan matriks tabel kontingensi dalam bentuk balon, dimana masing-masing sel berisi sebuah titik berukuran tertentu sebagai representasi nilai besaran secara relatif dari masing-masing komponen.

housetasks <- read.delim(
  system.file("demo-data/housetasks.txt", package = "ggpubr"),
  row.names = 1
  )
kable(head(housetasks, 4))
Wife Alternating Husband Jointly
Laundry 156 14 2 4
Main_meal 124 20 5 4
Dinner 77 11 7 13
Breakfeast 82 36 15 7

Buat balloon plot sederhana pada tabel tersebut. Ubah warna berdasarkan nilai pada tiap-tiap sel.

ggballoonplot(housetasks, fill = "value") +
  scale_fill_viridis_c(option = "C")

Contoh visualisasi frekuensi data secara berkelompok berdasarkan jenis kelamin pada HairEyeColor menggunakan balloon plot dapat dibentuk dalam bentuk plot multi-panel sebagai berikut.

ggballoonplot(df, x = "Hair", y = "Eye", size = "Freq",
              fill = "Freq", facet.by = "Sex",
              ggtheme = theme_bw()) +
  scale_fill_viridis_c(option = "C")

Mosaic plot

Plot mosaik pada dasarnya adalah visualisasi proporsional area dari frekuensi yang diamati, terdiri dari ubin (mengacu pada sel) yang dibuat berdasarkan partisi pada persegi panjang secara vertikal dan horizontal secara rekursif. Luas tiap ubin sebanding dengan entri sel terkait, dengan mempertimbangkan dimensi pemisahan sebelumnya.

Fungsi yang digunakan adalah mosaicplot pada paket vcd

Satu peubah

mosaic(~Eye, direction = "v", df)

Dua peubah

mosaic(Eye ~ Sex, df, direction = c("v", "h"), highlighting_fill = c("brown", "blue", "gold", "green") )

Tiga peubah

mosaic(Sex ~ Eye + Hair, df, direction = c("v", "h"), highlighting_fill = c("brown", "blue", "gold", "green") )

mosaic(HairEyeColor, shade = TRUE, legend = TRUE) 

Plot mosaik berpasangan

pairs(HairEyeColor, highlighting = 2)

Plot mosaik: treemap

treemap adalah visualisasi dalam bentuk peta berhirarki dengan plot persegi panjang yang mewakili hirarki dari suatu data (blok warna tidak selalu menggambarkan frekuensi data)

data(GNI2014)
treemap::treemap(GNI2014,
  index=c("continent", "iso3"),
  vSize="population",
  vColor="GNI",
  type="value",
  format.legend = list(scientific = FALSE, big.mark = " ")
)

Analisis Korespondensi

Analisis korespondensi dapat digunakan untuk merangkum dan memvisualisasikan informasi yang terdapat dalam tabel kontingensi yang dibentuk oleh dua peubah kategorik.

res.ca <- CA(housetasks, graph = FALSE)
fviz_ca_biplot(res.ca, repel = TRUE)

Pada grafik dapat disimpulkan bahwa:

  • Tugas rumah tangga seperti persiapan makan malam, sarapan, laundri banyak dilakukan oleh istri
  • Mengemudi dan reparasi paling sering dilakukan oleh suami sebagai kepala RT laki-laki

Sankey Diagram

Diagram sankey adalah visualisasi yang digunakan untuk menggambarkan aliran dari satu kumpulan nilai ke kumpulan nilai lainnya dengan jenjang yang berbeda-beda. Hal-hal yang dihubungkan disebut node dan koneksi disebut link.

Diagram ini dikenal juga dengan sebutan diagram alluvial dengan komponen axis, alluvium, stratum, dan load.

Berikut ini digunakan contoh gugus data Titanic

data(Titanic)
titan <- as.data.frame(Titanic)
kable(titan)
Class Sex Age Survived Freq
1st Male Child No 0
2nd Male Child No 0
3rd Male Child No 35
Crew Male Child No 0
1st Female Child No 0
2nd Female Child No 0
3rd Female Child No 17
Crew Female Child No 0
1st Male Adult No 118
2nd Male Adult No 154
3rd Male Adult No 387
Crew Male Adult No 670
1st Female Adult No 4
2nd Female Adult No 13
3rd Female Adult No 89
Crew Female Adult No 3
1st Male Child Yes 5
2nd Male Child Yes 11
3rd Male Child Yes 13
Crew Male Child Yes 0
1st Female Child Yes 1
2nd Female Child Yes 13
3rd Female Child Yes 14
Crew Female Child Yes 0
1st Male Adult Yes 57
2nd Male Adult Yes 14
3rd Male Adult Yes 75
Crew Male Adult Yes 192
1st Female Adult Yes 140
2nd Female Adult Yes 80
3rd Female Adult Yes 76
Crew Female Adult Yes 20

alluvial

alluvial(
  titan[, 1:4], 
  freq = titan$Freq, 
  border = NA,
  col = ifelse(titan$Survived == "No", "red", "gray")
)

ggalluvial: geom_alluvium

Paket ggalluvial melengkapi penggunaan ggplot2 pada visualisasi diagram alluvial dengan grammar geom_alluvium

df2 <- data.frame(Class1 = c("Stats", "Math", "Stats", "Math", "Stats", "Math", "Stats", "Math"),
                  Class2 = c("French", "French", "Art", "Art", "French", "French", "Art", "Art"),
                  Class3 = c("Gym", "Gym", "Gym", "Gym", "Lunch", "Lunch", "Lunch", "Lunch"),
                  Freq = c(20, 3, 40, 5, 10, 2, 5, 15)
)
kable(df2)
Class1 Class2 Class3 Freq
Stats French Gym 20
Math French Gym 3
Stats Art Gym 40
Math Art Gym 5
Stats French Lunch 10
Math French Lunch 2
Stats Art Lunch 5
Math Art Lunch 15
ggplot(df2, aes(axis1 = Class1, axis2 = Class2, axis3 = Class3, y = Freq)) +
  geom_alluvium(color='black') +
  geom_stratum() +
  geom_text(stat = "stratum", aes(label = paste(after_stat(stratum), "\n", after_stat(count)))) +
  scale_x_discrete(limits = c("Class1", "Class2", "Class3"))

Pewarnaan alluvium dapat dipilih berdasarkan peubah tertentu yang berbeda, sebagai contoh peubah Class1.

ggplot(df2, aes(axis1 = Class1, axis2 = Class2, axis3 = Class3, y = Freq)) +
  geom_alluvium(aes(fill = Class1), width = 1/12) +
  geom_stratum() +
  geom_text(stat = "stratum", aes(label = paste(after_stat(stratum), "\n", after_stat(count)))) +
  scale_x_discrete(limits = c("Class1", "Class2", "Class3"))

geom_flow

Cara lain menggunakan grammar geom_flow

ggplot(df2, aes(axis1 = Class1, axis2 = Class2, axis3 = Class3, y = Freq)) +
  geom_flow(aes(fill = Class1), width = 1/12) +
  geom_stratum() +
  geom_text(stat = "stratum", aes(label = paste(after_stat(stratum), "\n", after_stat(count)))) +
  scale_x_discrete(limits = c("Class1", "Class2", "Class3"))

Heat map

Seringkali heat map digunakan dalam visualisasi data numerik. Pada kasus tertentu, heat map juga dapat digunakan pada y dan x yang bersifat kategorik. Paket vcdExtra dapat mengakomodasi penyajian hasil dalam bentuk klaster grafik batang1

theme_heat <- theme_classic() +
  theme(axis.line = element_blank(),
        axis.ticks = element_blank())
orderedclasses <- c("Farm", "LoM", "UpM", "LoNM", "UpNM")
mydata <- Yamaguchi87
mydata$Son <- factor(mydata$Son, levels = orderedclasses)
mydata$Father <- factor(mydata$Father,
                        levels = orderedclasses)
mydata3 <- mydata %>% group_by(Country, Father) %>% 
  mutate(Total = sum(Freq)) %>% ungroup()
ggplot(mydata3, aes(x = Father, y = Son)) +
  geom_tile(aes(fill = (Freq/Total)), color = "white") +
  coord_fixed() + 
  scale_fill_gradient2(low = "black", mid = "white",
                        high = "red", midpoint = .2) +
  facet_wrap(~Country) + theme_heat

Uji Statistik

Uji independensi chi-square

Contoh data yang dapat digunakan untuk melakukan uji bebas chi-square dimana frekuensi orang dewasa dalam hal ketertarikan berita lokal lebih banyak dibanding remaja2.

local <- data.frame(Age = c("18-29", "30-49", "50-64", "65+"),
                    Freq = c(2851, 9967, 11163, 10911)) %>%
  mutate(Followers = round(Freq*c(.15, .28, .38, .42)), 
         Nonfollowers = Freq - Followers) 
kable(local[,c(1,3)])
Age Followers
18-29 428
30-49 2791
50-64 4242
65+ 4583

Hipotesis yang dapat digunakan:

  • H_0: Usia dan ketertarikan pada berita lokal bersifat bebas
  • H_1: Usia dan ketertarikan pada berita lokal bersifat dependen
localmat <- as.matrix(local[,3:4])
rownames(localmat) <- local$Age
X <- chisq.test(localmat, correct = FALSE)
kable(X$observed)
Followers Nonfollowers
18-29 428 2423
30-49 2791 7176
50-64 4242 6921
65+ 4583 6328
kable(X$expected)
Followers Nonfollowers
18-29 984.1065 1866.893
30-49 3440.4032 6526.597
50-64 3853.2378 7309.762
65+ 3766.2526 7144.747
X
## 
##  Pearson's Chi-squared test
## 
## data:  localmat
## X-squared = 997.48, df = 3, p-value < 2.2e-16

p-value lebih kecil dari taraf nyata 5% maka perbedaan tidak signifikan artinya terima H_0 sehingga dapat dikatakan terdapat cukup bukti bahwa usia dan ketertarikan pada berita lokal saling bebas.

Footnotes

  1. Heat map.↩︎

  2. Laporan diperoleh dari sumber berikut (demografi berita lokal).↩︎