Table

Data Cuaca (Tabel)

Overview

Column

Rata-rata Parameter Suhu per Lokasi (Tabel)

Column

Rata-rata Parameter Suhu per Lokasi

Tren Suhu Tahunan

Seasonal Analysis

Column

Tabel Rata-rata per Lokasi & Musim

Column

Distribusi Suhu


Hujan Berdasarkan Musim

Location Deep Dive

Column

Column

Tren Suhu dan Hujan Kota Terpilih

Tren Kelembapan dan Hujan Kota Terpilih

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

```