AIRQUALITY

Deskripsi: Dataset airquality berisi data pengukuran kualitas udara harian di New York dari bulan Mei hingga September tahun 1973.

Detail:

Input Data

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

1.1 HISTOGRAM

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")

1.1.1 Interpretasi Hasil Histogram Plot

  1. 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.

  2. 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).

1.2 DENSITY PLOT

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

1.2.1 Interpretasi Hasil Density Plot

  1. Untuk Density Plot Temp

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.

  1. Untuk Density Plot Temp Berdasarkan Bulan

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.

1.3 BOXPLOT

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")

1.3.1 Interpretasi Hasil Boxplot

  1. 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).

  2. Dan dapat dilihat juga bahwa bulan ke-5 memiliki suhu yang paling rendah dibanding bulan lainnya.

1.4 VIOLIN PLOT

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)

1.4.1 Interpretasi Hasil Violin Plot

  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.

  2. 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.

1.5 Q-Q PLOT

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

1.5.1 Interpretasi Hasil Q-Q Plot

  1. Data Temperature (Temp) dalam dataset airquality secara umum memiliki distribusi yang hampir normal karena sebagian besar titik berada di sekitar garis lurus, yang mengindikasikan bahwa data mendekati distribusi normal, dengan sedikit penyimpangan di bagian ekor atau menunjukkan adanya sedikit skewness/outlier. Jika adanya penyimpangan kecil ini tidak signifikan, asumsi normalitas bisa dianggap cukup terpenuhi.

1.6 SCATTER PLOT

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()

1.6.1 Interpretasi Hasil Scatter Plot

  1. Secara visual, titik-titik dalam scatter plot menunjukkan pola yang cenderung menurun, yang mengindikasikan adanya korelasi negatif antara Temperatur dan Wind atau dapat dikatakan bahwa semakin tinggi suhu (Temp), semakin rendah kecepatan angin (Wind).

1.7 LINE CHART

Plot ini digunakan untuk melihat trend data berdasarkan perubahan waktu. Artinya pada Line Chart cocok untuk data-data deret waktu.

Input Data

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)

Line chart Dasar

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")

Area Plot

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"

1.7.1 Interpretasi Hasil Line Chart

  1. Pada awal periode (1995-2005), impor minyak tanah relatif stabil dengan peningkatan kecil.Setelah itu tahun 2005, terjadi peningkatan signifikan dalam impor minyak tanah setelah mencapai puncak disekitar tahun 2010, terdapat fluktuasi tajam dalam impor minyak tanah namun kembali mengalami peningkatan meskipun mengalami penurunan kembali.

1.8 MULTIPLE LINE CHART

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.

1.8.1 Interpretasi Hasil Multiple Line Chart

  1. Garis impor (warna palevioletred2) menunjukkan tren kenaikan signifikan sejak tahun 2005, mencapai puncak sekitar 2010 dan mengalami fluktuasi besar setelahnya. Sedangkan untuk garis ekspor (warna indianred2) relatif stabil dan jauh lebih rendah dibanding impor, dengan sedikit kenaikan setelah 2015. Jadi dapat disimpulkan karena impor jauh lebih tinggi dibanding ekspor, ini menunjukkan bahwa Indonesia mengalami defisit perdagangan minyak, di mana lebih banyak minyak yang dibeli dari luar negeri daripada yang dijual ke pasar internasional.