Deskripsi: Dataset airquality berisi data pengukuran kualitas udara harian di New York dari bulan Mei hingga September tahun 1973.
Detail:
Data dikumpulkan dari berbagai lokasi di New York dengan fokus pada parameter utama kualitas udara.
Pengukuran dilakukan setiap hari dari tanggal 1 Mei 1973 hingga 30 September 1973.
Data ini sering digunakan untuk analisis tren polusi udara, hubungan antara suhu dan ozon, serta faktor-faktor yang mempengaruhi kualitas udara di lingkungan perkotaan.
Sebelum kita melakukan visualisasi data, instal packages “ggplot2” terlebih dahulu, dan input data yang ingin digunakan. Pada kali ini data yang digunakan adalah “airquality”
library(ggplot2)
data("airquality")
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
tail(airquality)
## Ozone Solar.R Wind Temp Month Day
## 148 14 20 16.6 63 9 25
## 149 30 193 6.9 70 9 26
## 150 NA 145 13.2 77 9 27
## 151 14 191 14.3 75 9 28
## 152 18 131 8.0 76 9 29
## 153 20 223 11.5 68 9 30
dim(airquality)
## [1] 153 6
Berikut dibawah ini adalah beberapa visualisasi yang dapat digunakan ketika data numerik “airquality” yaitu:Histogram, Density Plot, Boxplot, Violin Plot, Q-Q Plot, Scatter Plot, Line Chart, Multiple Line Chart
Untuk membuat histogram pada package {ggplot2} menggunakan perintah
geom_histogram()
. Variable yang digunakan yaitu
Temp pada data airquality.
Variabel Temp dipilih karena: Temp adalah variabel numerik yang dapat membantu menganalisis distribusi suhu melalui pola iklim selama periode pengamatan (Mei–September 1973).
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Secara defaut, geom_histogram()
menggunakan 30 bins
(batang). Selanjutnya mengganti nilai bins tersebut dengan menambahkan
argumen bins = 53. Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_histogram(bins = 53)
Kita dapat memberikan pemisah dengan warna putih Anda dapat tambahkan
argumen color = "blueviolet"
. Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_histogram(bins = 53, color = "blueviolet")
Kita dapat mengubah warna batang dengan menggunakan argumen
fill
, mengubah format penulisan nilai pada sumbu x dan y
menggunakan function scale_x_continuous()
untuk sumbu x dan
scale_y_continuous()
untuk sumbu y dan mengubah nama label
pada sumbu x dan y dengan fungsi labs
. Hasilnya sebagai
berikut.
library(scales)
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_histogram(bins = 35, color = "floralwhite", fill = "indianred") +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(x = "Temperature",
y = "Frekuensi")
Dengan melihat pola distribusi diatas maka data “airquality” menunjukkan pola distribusi suhu yang tidak terlalu normal dengan kemungkinan adanya variasi suhu yang cukup besar sehingga membuat pola menjadi tidak terlihat mulus.
Dari hasil histogram diatas dapat dilihat bahwa puncak tertinggi atau suhu yang paling sering muncul(modus) terjadi di suhu sekitar 80°F. Sedangkan untuk pola nya menunjukkan sedikit miring ke kanan (positively skewed).
Untuk membuat density plot menggunakan ggplot2 kita cukup menggunakan function geom_density()
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_density()
Untuk mengatur warna, transaparansi, format penulisan nilai pada sumbu x dan y, dan labeling sumbu x sama seperti pembuatan Histogram. Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_density(fill = "moccasin", alpha = 0.7) +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(x = "Temp")
Kita dapat membandingkan sebaran menggunakan density plot berdasarkan kategori. Misal akan dilihat sebaran Temperature (Temp) berdasarkan periode per bulannya (Month). Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp, fill = as.factor(Month), color = as.factor(Month))) +
geom_density(alpha = 0.7) +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(x = "Temp")
Untuk mengurangi kesulitan dalam mengamati visual tersebut maka perlu dipisah per kategori dengan menggunakan visualisasi ridgeline plot atau disebut juga joyplot.
library(ggridges)
ggplot(data = airquality, mapping = aes(x = Temp, y = as.factor(Month), fill = as.factor(Month))) +
geom_density_ridges() +
labs(x = "Temperature", y = "Bulan")
## Picking joint bandwidth of 2.65
Bentuk distribusi tampak puncaknya disekitar Temp 80°F menunjukkan bahwa sebagian besar data terkonsentrasi di sekitar nilai ini. Ekornya menyebar ke kiri dan kanan, yang menunjukkan adanya variasi Temp di bawah dan di atas 80°F. Distribusi ini tampak mendekati normal tetapi agak condong ke kanan.
Pada grafik ini, distribusi Temperature (Temp) dibagi berdasarkan bulan (5, 6, 7, 8, 9).Dan tentunya tiap warna yang berbeda akan mewakili nilai tiap Temp dalam satu bulan tertentu. Secara keseluruhan tiap bulan memiliki distribusi suhu yang berbeda-beda karena adanya variansi pola ini dapat dikaitkan dengan perubahan musim.
Untuk membuat boxplot di ggplot2 kita dapat gunakan
function geom_boxplot()
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_boxplot()
Membuat boxplot secara vertikal menggunakan perintah
coord_flip()
. Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp)) +
geom_boxplot()+
coord_flip()
kita dapat membuat boxplot dari data numerik dan membandingkan sebarannya berdasarkan kategori. Misalnya kita ingin membandingkan sebaran Temperature (Temp) berdasarkan bulan (Month). Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp, y = as.factor(Month))) +
geom_boxplot() +
labs(x = "Temperatur", y = "Bulan")
Selanjutnya memberi warna berbeda untuk setiap box berdasarkan
kategorinya. Kita dapat menambahkan argumen fill
dengan
nilai berupa nama variabel dari kategori yang ingin kita gunkan untuk
perbandingan boxplot. Misalnya kita ingin membandingkan sebaran dari
variabel Temperature (Temp) berdasarkan bulannya
(Month) menggunakan boxplot dan menyesuaikan
warnanya berdasarkan kategori dari Month. Hasilnya sebagai
berikut.
ggplot(data = airquality, mapping = aes(x = Temp, y = as.factor(Month), fill = as.factor(Month))) +
geom_boxplot()
Untuk menghilangkan legend dari color kita dapat tambahkan theme(legend.position = “none”).Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp, y = as.factor(Month), fill = as.factor(Month))) +
geom_boxplot() +
theme(legend.position = "none")
Didalam bulan tertentu(bulan ke-6 dan bulan ke-7) menunjukkan bahwa didalam data terdapat outlier(pencilan) yang memperlihatkan bahwa ada beberapa suhu yang ekstrem (lebih rendah atau lebih tinggi dari distribusi umumnya).
Dan dapat dilihat juga bahwa bulan ke-5 memiliki suhu yang paling rendah dibanding bulan lainnya.
Plot ini dibentuk dengan menggabungkan antara Density Plot dengan boxplot. Hasilnya sebagai berikut.
ggplot(data = airquality, mapping = aes(x = Temp,y="all")) +
geom_violin(fill="tomato",alpha=0.5) +
geom_boxplot(fill="navajowhite2",width=0.1)
##Modifikasi, Violin Plot, Multiple Bisa juga y nya diganti color, tapi hasilnya jadi dalam grop berikut contoh code r nya :
ggplot(data = airquality, mapping = aes(x = Temp, y ="all")) +
geom_violin(fill = "thistle2", alpha = 0.5) +
geom_boxplot(fill = "slateblue", width = 0.1)
Untuk bagian distribusinya bagian yang lebih lebar menunjukkan kepadatan data yang lebih tinggi,sedangkan bagian yang lebih sempit menunjukkan data yang lebih jarang/sedikit. Lalu pola distribusi suhu tampaknya mendekati normal, dengan pemusatan data di sekitar suhu 75-85°F derajat.
Sementara output untuk boxplot yang ditengah adalah nilai median (garis tengah di dalam kotak) menunjukkan nilai tengah suhu yang berada sekitar 80°F.Jadi Kebanyakan hari memiliki suhu di antara 75°F hingga 85°F, sementara suhu ekstrem (di bawah 65°F atau di atas 90°F) jarang terjadi.
Plot ini berguna untuk memeriksa apakah sebaran data (sebaran empirik) memiliki bentuk yang sama dengan sebaran tertentu yang dispesifikan (sebaran hipotetik=sebaran data normal). Misalnya kita ingin melihat pola sebaran Temperature (Temp). apakah menyebar normal atau tidak.
ggplot(data = airquality, aes(sample = Temp)) +
stat_qq(col = "violet", cex = 0.9) +
stat_qq_line(col = "slateblue4", lwd = 1) #data hipotetiknya
Untuk membuat scatter plot menggunakan ggplot2
kita
dapat menggunakan geom_point()
. Misalnya kita ingin melihat
pola sebaran antara Temp dan Wind
ggplot(data = airquality, mapping = aes(x = Temp, y = Wind)) +
geom_point()
Kita juga dapat memberikan warna untuk setiap titik. Misalnya warna masing-masing titik menyesuaikan dengan kategori pada variabel cut.
ggplot(data = airquality, mapping = aes(x = Temp, y = Wind, color = factor(Month))) +
geom_point()
Plot ini digunakan untuk melihat trend data berdasarkan perubahan waktu. Artinya pada Line Chart cocok untuk data-data deret waktu.
Data yang digunakan adalah data sekunder yang diambil dari BPS (Badan Pusat Statistik) yaitu data Nilai Ekspor dan Impor Migas (juta US$) 1996-2023
library(readxl)
# Atur direktori kerja (opsional)
setwd("D:/Pictures/SEMESTER 4/Visualisasi Data")
# Baca file Excel dari sheet ke-2
file_path <- "D:/Pictures/SEMESTER 4/Visualisasi Data/DATAFIX_LINE CHART.xlsx"
gas_indo <- read_excel(file_path, sheet = 2, col_names = TRUE)
## New names:
## • `` -> `...3`
## • `` -> `...5`
## • `` -> `...7`
# Lihat 6 data pertama
head(gas_indo)
## # A tibble: 6 × 7
## Tahun `Minyak Mentah` ...3 `Hasil Minyak` ...5 `Gas Alam` ...7
## <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 NA Ekspor Impor Ekspor Impor Ekspor Impor
## 2 1996 5711.8 1518.9 1516.1 2076.6 4493.8999… 0
## 3 1997 5480 1467 1302.5 2457.10000000000… 4840.1000… 0
## 4 1998 3348.6 1058.3 708.1 1595.4 3815.5 0
## 5 1999 4517.3 1587.7 918 2093.4 4357 0
## 6 2000 6090.1 2524.9 1651.6 3494.6 6624.9 0
# Lihat struktur data
str(gas_indo)
## tibble [29 × 7] (S3: tbl_df/tbl/data.frame)
## $ Tahun : num [1:29] NA 1996 1997 1998 1999 ...
## $ Minyak Mentah: chr [1:29] "Ekspor" "5711.8" "5480" "3348.6" ...
## $ ...3 : chr [1:29] "Impor" "1518.9" "1467" "1058.3" ...
## $ Hasil Minyak : chr [1:29] "Ekspor" "1516.1" "1302.5" "708.1" ...
## $ ...5 : chr [1:29] "Impor" "2076.6" "2457.1000000000004" "1595.4" ...
## $ Gas Alam : chr [1:29] "Ekspor" "4493.8999999999996" "4840.1000000000004" "3815.5" ...
## $ ...7 : chr [1:29] "Impor" "0" "0" "0" ...
# Ganti nama kolom agar lebih mudah diakses
colnames(gas_indo) <- c("Tahun", "Minyak_Mentah_Ekspor", "Minyak_Mentah_Impor", "Hasil_Minyak_Ekspor", "Hasil_Minyak_Impor",
"Gas_Alam_Ekspor", "Gas_Alam_Impor")
##DATA CLEANING
#Pastikan Format Data Sesuai
gas_indo$Tahun <- as.numeric(gas_indo$Tahun)
# Ubah semua angka ke numerik (hapus tanda koma jika ada)
gas_indo[, 2:7] <- lapply(gas_indo[, 2:7], function(x) as.numeric(gsub(",", "", x)))
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
## Warning in FUN(X[[i]], ...): NAs introduced by coercion
# Cek apakah ada nilai NA
colSums(is.na(gas_indo))
## Tahun Minyak_Mentah_Ekspor Minyak_Mentah_Impor
## 1 1 1
## Hasil_Minyak_Ekspor Hasil_Minyak_Impor Gas_Alam_Ekspor
## 1 1 1
## Gas_Alam_Impor
## 1
# Hapus baris dengan nilai NA
gas_indo <- na.omit(gas_indo)
# Tampilkan ringkasan data
summary(gas_indo)
## Tahun Minyak_Mentah_Ekspor Minyak_Mentah_Impor Hasil_Minyak_Ekspor
## Min. :1996 Min. : 916.6 Min. : 1058 Min. : 708.1
## 1st Qu.:2003 1st Qu.: 4993.2 1st Qu.: 3348 1st Qu.:1501.2
## Median :2010 Median : 5713.2 Median : 7055 Median :1788.7
## Mean :2010 Mean : 6439.7 Mean : 6863 Mean :2299.8
## 3rd Qu.:2016 3rd Qu.: 8430.4 3rd Qu.: 9386 3rd Qu.:3045.8
## Max. :2023 Max. :13828.7 Max. :13586 Max. :4776.8
## Hasil_Minyak_Impor Gas_Alam_Ekspor Gas_Alam_Impor
## Min. : 1595 Min. : 3516 Min. :0
## 1st Qu.: 3561 1st Qu.: 5694 1st Qu.:0
## Median :12443 Median : 8461 Median :0
## Mean :14350 Mean : 9432 Mean :0
## 3rd Qu.:20545 3rd Qu.:10322 3rd Qu.:0
## Max. :31761 Max. :22872 Max. :0
##Memperbaiki Data
colnames(gas_indo)
## [1] "Tahun" "Minyak_Mentah_Ekspor" "Minyak_Mentah_Impor"
## [4] "Hasil_Minyak_Ekspor" "Hasil_Minyak_Impor" "Gas_Alam_Ekspor"
## [7] "Gas_Alam_Impor"
colSums(is.na(gas_indo))
## Tahun Minyak_Mentah_Ekspor Minyak_Mentah_Impor
## 0 0 0
## Hasil_Minyak_Ekspor Hasil_Minyak_Impor Gas_Alam_Ekspor
## 0 0 0
## Gas_Alam_Impor
## 0
data_gas <- na.omit(gas_indo) # Menghapus baris dengan NA
# atau
gas_indo[is.na(gas_indo)] <- 0 # Mengganti NA dengan 0
str(gas_indo)
## tibble [28 × 7] (S3: tbl_df/tbl/data.frame)
## $ Tahun : num [1:28] 1996 1997 1998 1999 2000 ...
## $ Minyak_Mentah_Ekspor: num [1:28] 5712 5480 3349 4517 6090 ...
## $ Minyak_Mentah_Impor : num [1:28] 1519 1467 1058 1588 2525 ...
## $ Hasil_Minyak_Ekspor : num [1:28] 1516 1302 708 918 1652 ...
## $ Hasil_Minyak_Impor : num [1:28] 2077 2457 1595 2093 3495 ...
## $ Gas_Alam_Ekspor : num [1:28] 4494 4840 3816 4357 6625 ...
## $ Gas_Alam_Impor : num [1:28] 0 0 0 0 0 0 0 0 0 0 ...
## - attr(*, "na.action")= 'omit' Named int 1
## ..- attr(*, "names")= chr "1"
data_gas$Hasil_Minyak_Impor <- as.numeric(gas_indo$Hasil_Minyak_Impor)
data_gas$Hasil_Minyak_Ekspor <- as.numeric(gas_indo$Hasil_Minyak_Ekspor)
ggplot(data = gas_indo, aes(x = Tahun, y = Hasil_Minyak_Impor, group = 1)) +
geom_line() +
labs(x = "Tahun", y = "Hasil Minyak Impor", title = "Tren Impor Minyak Tanah Impor")
Untuk menambah estetika dapat dilakukan dengan mengarsir daerah di bawah plot deret waktu. Plot seperti ini disebut Area Plot. Hasilnya sebagai berikut.
ggplot(data = gas_indo, aes(x = Tahun, y = Hasil_Minyak_Impor , group = 1)) +
geom_line(lwd= 3.2, col="plum4") +
geom_area(fill="blanchedalmond", alpha= 0.9 )
labs(x = "Tahun", y = "Hasil Minyak Impor", title = "Tren Impor Minyak Tanah Impor")
## $x
## [1] "Tahun"
##
## $y
## [1] "Hasil Minyak Impor"
##
## $title
## [1] "Tren Impor Minyak Tanah Impor"
##
## attr(,"class")
## [1] "labels"
Pada plot ini dapat digunakan untuk membandingkan trend data deret waktu pada beberapa wilayah/kelompok.
ggplot(data = gas_indo, aes(x=Tahun)) +
geom_line(aes(y=Hasil_Minyak_Ekspor), lwd=1.2, col="palevioletred2") +
geom_line(aes(y=Hasil_Minyak_Impor), lwd=1.2, col="violetred") +
labs(x="Tahun", y="Frekuensi")
Untuk menambahkan nama kelompok digunakan perintah berikut.
ggplot(data_gas, aes(x = Tahun)) +
geom_line(aes(y = Hasil_Minyak_Ekspor, color = "Ekspor"), size = 1.2) +
geom_line(aes(y = Hasil_Minyak_Impor, color = "Impor"), size = 1.2) +
geom_text(aes(x = max(Tahun), y = tail(Hasil_Minyak_Ekspor, 1), label = "Ekspor"),
size = 5, color = "indianred2", hjust = 1.9) +
geom_text(aes(x = max(Tahun), y = tail(Hasil_Minyak_Impor, 1), label = "Impor"),
size = 5, color = "palevioletred2", hjust = 3) +
scale_color_manual(values = c("Ekspor" = "indianred2", "Impor" = "palevioletred2")) +
labs(title = "Perbandingan Hasil Minyak Ekspor dan Impor",
x = "Tahun",
y = "Hasil Minyak") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in geom_text(aes(x = max(Tahun), y = tail(Hasil_Minyak_Ekspor, 1), : All aesthetics have length 1, but the data has 28 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
## Warning in geom_text(aes(x = max(Tahun), y = tail(Hasil_Minyak_Impor, 1), : All aesthetics have length 1, but the data has 28 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.