---
title: "Dashboard Transformasi Data Cuaca"
output:
flexdashboard::flex_dashboard:
vertical_layout: scroll
theme: yeti
source_code: embed
---
```{r setup, include=FALSE}
# Importing libraries
library(flexdashboard)
library(tidyverse)
library(highcharter)
library(gt)
library(htmltools)
library(viridis)
library(DT)
library(plotly)
library(lubridate)
```
```{r}
# Load dataset
df <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv")
# Bersihkan data dan buat kolom tahun
df_clean <- df %>%
distinct() %>%
mutate(
Date = as.Date(Date),
Year = year(Date) # Tambahkan kolom Year di sini
)
data_anim <- df_clean %>%
group_by(Location, Year) %>%
summarise(
Average_Temperature = mean(Temperature, na.rm = TRUE),
.groups = "drop"
)
```
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(lubridate)
# 1. Baca dan bersihkan data
df <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv")
df_clean <- df %>%
mutate(
Date = as.Date(Date),
month = month(Date),
Season = case_when(
month %in% c(11, 12, 1, 2) ~ "Rainy Season",
month %in% c(6, 7, 8, 9) ~ "Dry Season",
TRUE ~ "Transitional Season"
)
)
# 2. Buat ringkasan data per lokasi per musim
df_summary <- df_clean %>%
group_by(Location, Season) %>%
summarise(
avg_temp = mean(Temperature, na.rm = TRUE),
avg_humidity = mean(Humidity, na.rm = TRUE),
avg_rainfall = mean(Rainfall, na.rm = TRUE),
.groups = "drop"
)
```
# Table {data-orientation=rows}
### Data Cuaca (Tabel) {data-height=520}
```{r}
datatable(
df_clean,
options = list(scrollX = TRUE, pageLength = 10),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left;',
'Tabel: ', htmltools::em('Data Transformasi Cuaca')
)
)
```
Overview {data-orientation=columns}
=======================================================================
Column {data-width=650}
-----------------------------------------------------------------------
### Rata-rata Parameter Suhu per Lokasi (Tabel)
```{r, echo=FALSE, message=FALSE, warning=FALSE}
datatable(
data_anim %>%
arrange(Year, desc(Average_Temperature)) %>%
mutate(Average_Temperature = round(Average_Temperature, 2)),
rownames = FALSE,
options = list(
pageLength = 10,
autoWidth = TRUE,
scrollX = TRUE
),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left; font-weight: bold;',
'Tabel: Rata-rata Suhu per Lokasi per Tahun'
)
)
```
Column {data-width=650}
-----------------------------------------------------------------------
### Rata-rata Parameter Suhu per Lokasi
```{r, echo=FALSE}
library(dplyr)
library(highcharter)
library(readr)
library(lubridate)
library(viridisLite)
# Load data
df_clean <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv") %>%
distinct() %>%
mutate(Year = year(Date))
# Hitung rata-rata suhu per lokasi per tahun
data_anim <- df_clean %>%
group_by(Location, Year) %>%
summarise(Average_Temperature = mean(Temperature, na.rm = TRUE), .groups = "drop")
# Urutkan lokasi berdasarkan suhu rata-rata total
location_order <- data_anim %>%
group_by(Location) %>%
summarise(total_avg = mean(Average_Temperature, na.rm = TRUE)) %>%
arrange(desc(total_avg)) %>%
pull(Location)
# Map warna turbo
location_colors <- setNames(
viridis::turbo(length(location_order), alpha = 0.95, direction = -1),
location_order
)
# Tambahkan warna ke data_anim
data_anim <- data_anim %>%
mutate(color = location_colors[Location]) %>%
mutate(Location = factor(Location, levels = location_order))
# Format motion data untuk horizontal bar
motion_data <- data_anim %>%
arrange(Year, desc(Average_Temperature)) %>%
group_by(Location) %>%
summarise(item = list(
list(
name = first(Location),
sequence = Average_Temperature,
color = first(color)
)
)) %>%
pull(item)
# Buat horizontal bar chart + motion antar tahun
highchart() %>%
hc_chart(type = "bar", inverted = TRUE) %>%
hc_title(text = " Rata-rata Suhu Lokasi (Bar Horizontal Interaktif per Tahun)") %>%
hc_subtitle(text = "Data 2020–2023 dengan Motion Chart per Tahun") %>%
hc_xAxis(
categories = location_order,
title = list(text = NULL),
labels = list(style = list(fontSize = '13px'))
) %>%
hc_yAxis(
title = list(text = "Suhu Rata-rata (°C)"),
labels = list(format = "{value} °C"),
min = 0
) %>%
hc_add_series(
data = motion_data,
name = "Suhu Rata-rata",
showInLegend = FALSE
) %>%
hc_tooltip(
useHTML = TRUE,
pointFormat = '<span style="color:{point.color}">●</span> <b>{point.name}</b>: {point.y:.1f} °C'
) %>%
hc_plotOptions(bar = list(
borderRadius = 4,
colorByPoint = FALSE,
dataLabels = list(enabled = TRUE, format = '{point.y:.1f} °C'),
states = list(hover = list(color = "#FF5733")) # Warna hover
)) %>%
hc_motion(
enabled = TRUE,
axisLabel = "Tahun",
labels = sort(unique(data_anim$Year)),
series = 0,
updateInterval = 100
) %>%
hc_add_theme(hc_theme_google()) %>%
hc_credits(enabled = TRUE, text = "@statify – Motion Chart Horizontal Interaktif")
```
### Tren Suhu Tahunan {data-width=600 data-height=510}
```{r, echo=FALSE}
# Load library
library(tidyverse)
library(highcharter)
library(lubridate)
library(readr)
# 1. Baca data dan periksa kolom
df_clean <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv") %>%
distinct()
# 2. Pastikan kolom 'Date' dalam format date
df_clean <- df_clean %>%
mutate(Date = as.Date(Date)) %>%
select(Date, Temperature, Humidity) # Hanya ambil kolom yang diperlukan
# 3. Ubah data ke long format
df_long <- df_clean %>%
pivot_longer(
cols = c(Temperature, Humidity),
names_to = "key",
values_to = "value"
) %>%
mutate(Date = as.Date(Date))
# 4. Ambil semua tahun unik untuk custom tick pada x-axis
year_breaks <- df_clean %>%
mutate(Year = year(Date)) %>%
pull(Year) %>%
unique() %>%
sort()
year_positions <- datetime_to_timestamp(ymd(paste0(year_breaks, "-01-01")))
# 5. Buat visualisasi chart atas (upper)
hc_upper <- highchart() %>%
hc_chart(type = "areaspline", backgroundColor = "rgba(255,255,255,0.90)") %>%
hc_plotOptions(series = list(stacking = "normal")) %>%
hc_title(text = "Temperature and Humidity Over Time (Upper X-Axis)") %>%
hc_xAxis(
type = "datetime",
tickPositions = year_positions,
labels = list(formatter = JS("function () { return Highcharts.dateFormat('%Y', this.value); }")),
title = list(text = "Tahun")
) %>%
hc_yAxis(title = list(text = "Nilai")) %>%
hc_add_series(
data = df_long,
type = "areaspline",
hcaes(x = datetime_to_timestamp(Date), y = value, group = key)
) %>%
hc_tooltip(shared = TRUE) %>%
hc_legend(align = "center", verticalAlign = "bottom") %>%
hc_credits(
enabled = TRUE,
text = "Data: 6 Data-Transformation – Data Science Programming.csv"
)
hc_upper
```
Seasonal Analysis {data-orientation=columns}
=======================================================================
Column {data-width=500}
-----------------------------------------------------------------------
### Tabel Rata-rata per Lokasi & Musim
```{r tabel_summary, echo=FALSE, message=FALSE, warning=FALSE}
library(DT)
# Tabel dari df_summary
datatable(
df_summary,
rownames = FALSE,
options = list(
pageLength = 10,
autoWidth = TRUE
),
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left; font-weight: bold;',
'Tabel: Rata-rata Suhu, Kelembaban, dan Curah Hujan per Lokasi per Musim'
)
)
```
Column {data-width=500}
-----------------------------------------------------------------------
### Distribusi Suhu {data-width=600 data-height=510}
```{r fig.height=5, echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(lubridate)
library(highcharter)
# 1. Baca data
df <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv")
# 2. Konversi tanggal & tentukan musim
df_clean <- df %>%
mutate(
Date = as.Date(Date),
month = month(Date),
Season = case_when(
month %in% c(11, 12, 1, 2) ~ "Rainy Season",
month %in% c(6, 7, 8, 9) ~ "Dry Season",
TRUE ~ "Transitional Season"
)
)
# 3. Hitung rata-rata parameter cuaca per lokasi per musim
df_summary <- df_clean %>%
group_by(Location, Season) %>%
summarise(
avg_temp = mean(Temperature, na.rm = TRUE),
avg_humidity = mean(Humidity, na.rm = TRUE),
avg_rainfall = mean(Rainfall, na.rm = TRUE), # Gunakan rainfall sebagai ukuran bubble
.groups = "drop"
)
# 4. Buat scatter plot interaktif
hchart(df_summary, "scatter",
hcaes(x = avg_temp,
y = avg_humidity,
size = avg_rainfall,
group = Season,
name = Location)) %>%
hc_title(text = "Scatter Plot: Rata-rata Suhu vs Kelembaban per Musim") %>%
hc_subtitle(text = "Ukuran bubble = Curah Hujan | Warna = Musim") %>%
hc_xAxis(title = list(text = "Rata-rata Suhu (°C)")) %>%
hc_yAxis(title = list(text = "Rata-rata Kelembaban (%)")) %>%
hc_add_theme(hc_theme_google()) %>%
hc_tooltip(
pointFormat = paste(
"<b>Lokasi:</b> {point.name}<br>",
"<b>Musim:</b> {series.name}<br>",
"<b>Suhu:</b> {point.x:.2f} °C<br>",
"<b>Kelembaban:</b> {point.y:.2f} %<br>",
"<b>Curah Hujan:</b> {point.z:.2f} mm<br>"
),
useHTML = TRUE
) %>%
hc_credits(enabled = TRUE, text = "@statify – Flexdashboard UAS")
```
---
### Hujan Berdasarkan Musim {data-width=600 data-height=510}
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library(tidyverse)
library(highcharter)
library(lubridate)
# Load dan bersihkan data
df_clean <- read_csv("C:/Users/ASUS/OneDrive/Dokumen/3. KULIAH SMT 2/PEMROGRAMAN SAINS DATA 1/8. UAS/datauas.csv") %>%
distinct() %>%
mutate(
Date = as.Date(Date),
Month = month(Date),
Season = case_when(
Month %in% c(11, 12, 1, 2) ~ "Rainy Season",
Month %in% c(6, 7, 8, 9) ~ "Dry Season",
TRUE ~ "Transitional Season"
)
)
# Donut data: rata-rata hujan per musim
donutdata <- df_clean %>%
group_by(Season) %>%
summarise(avg_rain = mean(Rainfall, na.rm = TRUE), .groups = "drop")
# Nested data untuk tooltip scatter
donutdata2 <- df_clean %>%
select(Season, Temperature, Humidity) %>%
nest(.by = Season) %>%
mutate(
data = map(data, mutate_mapping, hcaes(x = Temperature, y = Humidity), drop = TRUE),
data = map(data, list_parse)
) %>%
rename(ttdata = data) %>%
left_join(donutdata, by = "Season")
# Buat Donut Chart
hchart(
donutdata2,
"pie",
hcaes(name = Season, y = avg_rain),
innerSize = 300,
color = viridis::magma(n = nrow(donutdata2), alpha = 0.95)
) %>%
hc_add_theme(hc_theme_google()) %>%
hc_title(text = "Distribusi Rata-rata Curah Hujan per Musim",
style = list(fontSize = "22px", fontWeight = "bold")) %>%
hc_subtitle(text = "Tooltip: Sebaran Temperature vs Humidity",
style = list(fontSize = "15px")) %>%
hc_tooltip(
useHTML = TRUE,
headerFormat = "<b>{point.key}</b>",
pointFormatter = tooltip_chart(
accesor = "ttdata",
hc_opts = list(
chart = list(type = "scatter"),
credits = list(enabled = FALSE),
plotOptions = list(scatter = list(marker = list(radius = 2)))
),
height = 140
),
positioner = JS(
"function () {
xp = this.chart.chartWidth/2 - this.label.width/2;
yp = this.chart.chartHeight/2 - this.label.height/2;
return { x: xp, y: yp };
}"
),
shadow = FALSE,
borderWidth = 0,
backgroundColor = "transparent",
hideDelay = 1000
) %>%
hc_credits(enabled = TRUE, text = "@statify – Flexdashboard UAS")
```
Location Deep Dive {data-orientation=columns}
=======================================================================
Column {data-width=500}
-------------------------------
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library(dplyr)
library(DT)
library(lubridate)
# 1. Buat data suhu tahunan
df_temp <- df_clean %>%
mutate(Year = year(Date)) %>%
group_by(Location, Year) %>%
summarise(Avg_Temperature = mean(Temperature, na.rm = TRUE), .groups = "drop")
# 2. Buat data kelembapan tahunan
df_humid <- df_clean %>%
mutate(Year = year(Date)) %>%
group_by(Location, Year) %>%
summarise(Avg_Humidity = mean(Humidity, na.rm = TRUE), .groups = "drop")
# 3. Gabungkan kedua data
df_gabung <- left_join(df_temp, df_humid, by = c("Location", "Year")) %>%
arrange(Location, Year) %>%
mutate(
Avg_Temperature = round(Avg_Temperature, 2),
Avg_Humidity = round(Avg_Humidity, 2)
)
# 4. Tampilkan datatable tanpa pagination, langsung semua
datatable(
df_gabung,
caption = htmltools::tags$caption(
style = 'caption-side: top; text-align: left; font-weight: bold;',
'Tabel: Rata-rata Suhu dan Kelembapan per Tahun per Kota'
),
rownames = FALSE,
options = list(
paging = FALSE, # Tampilkan semua data langsung
scrollY = "400px", # Scroll vertikal jika panjang
dom = 't', # Hapus search bar & pagination
autoWidth = TRUE
)
)
```
Column {data-width=500}
-----------------------------------------------------------------------
### Tren Suhu dan Hujan Kota Terpilih
```{r}
# Buat data agregat suhu per tahun per kota
df_temp_tahunan <- df_clean %>%
mutate(Year = year(Date)) %>%
group_by(Location, Year) %>%
summarise(
Avg_Temperature = mean(Temperature, na.rm = TRUE),
.groups = "drop"
)
# Visualisasi suhu
ggplot(df_temp_tahunan, aes(x = Year, y = Avg_Temperature, color = Location)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
labs(
title = "Tren Suhu Rata-rata per Tahun per Kota",
x = "Tahun", y = "Suhu Rata-rata",
color = "Kota"
) +
theme_minimal()
```
### Tren Kelembapan dan Hujan Kota Terpilih
```{r,}
# Buat data agregat kelembapan per tahun per kota
df_humid_tahunan <- df_clean %>%
mutate(Year = year(Date)) %>%
group_by(Location, Year) %>%
summarise(
Avg_Humidity = mean(Humidity, na.rm = TRUE),
.groups = "drop"
)
# Visualisasi kelembapan
ggplot(df_humid_tahunan, aes(x = Year, y = Avg_Humidity, color = Location)) +
geom_line(linewidth = 1.2) +
geom_point(size = 2) +
labs(
title = "Tren Kelembapan (Hujan) Rata-rata per Tahun per Kota",
x = "Tahun", y = "Kelembapan Rata-rata",
color = "Kota"
) +
theme_minimal()
```