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 |
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.
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:
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")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.
Hubungan antar masing-masing peubah pada data kategorik dapat juga divisualisasikan menggunakan perintah gpairs.
gpairs(housetasks)ggballoonplotFungsi 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")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
mosaic(~Eye, direction = "v", df)mosaic(Eye ~ Sex, df, direction = c("v", "h"), highlighting_fill = c("brown", "blue", "gold", "green") )mosaic(Sex ~ Eye + Hair, df, direction = c("v", "h"), highlighting_fill = c("brown", "blue", "gold", "green") )mosaic(HairEyeColor, shade = TRUE, legend = TRUE) pairs(HairEyeColor, highlighting = 2)treemaptreemap 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 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:
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 |
alluvialalluvial(
titan[, 1:4],
freq = titan$Freq,
border = NA,
col = ifelse(titan$Survived == "No", "red", "gray")
)ggalluvial: geom_alluviumPaket 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_flowCara 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"))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_heatContoh 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:
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-16p-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.
Laporan diperoleh dari sumber berikut (demografi berita lokal).↩︎