Anggota

  1. Adi Pratama M0401241002
  2. Ni Kadek Arista Mahadewi M0401241031
  3. Muhammad Athaurahman M0401241082
  4. Ainur Roudlotul Jannah Firdaus M0401241028
  5. Desthio Rendiarto Akhmad M0401241080
  6. Mifta Indira Putri Wardini M0401241090
library(ggplot2)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(plotly)
## Warning: package 'plotly' was built under R version 4.5.2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

Data

data <- read_xlsx("C:\\Dokumen\\Kuliah IPB\\Semester 4\\Visualisasi Data\\Tugas Projek\\Data Gabungan.xlsx")
data
## # A tibble: 2,416 × 21
##    Tanggal             Terakhir Pembukaan Tertinggi Terendah Vol.   `Perubahan%`
##    <dttm>                 <dbl>     <dbl>     <dbl>    <dbl> <chr>         <dbl>
##  1 2026-02-20 00:00:00    8272.     8300.     8328.    8237. 40,03B      -0.0003
##  2 2026-02-19 00:00:00    8274.     8357.     8376.    8252. 43,54B      -0.0043
##  3 2026-02-18 00:00:00    8310.     8236.     8310.    8227. 45,90B       0.0119
##  4 2026-02-13 00:00:00    8212.     8240.     8252.    8171. 43,44B      -0.0064
##  5 2026-02-12 00:00:00    8265.     8317.     8334.    8220. 37,94B      -0.0031
##  6 2026-02-11 00:00:00    8291.     8153.     8291.    8118. 54,57B       0.0196
##  7 2026-02-10 00:00:00    8132.     8032.     8141.    8011. 37,45B       0.0124
##  8 2026-02-09 00:00:00    8032.     7970.     8032.    7863. 31,02B       0.0122
##  9 2026-02-06 00:00:00    7935.     7945.     8025.    7862. 31,22B      -0.0208
## 10 2026-02-05 00:00:00    8104.     8155.     8214.    8103. 32,36B      -0.0053
## # ℹ 2,406 more rows
## # ℹ 14 more variables: `Data Historis USD_IDR.Tanggal` <dttm>,
## #   `Data Historis USD_IDR.Terakhir` <dbl>,
## #   `Data Historis USD_IDR.Pembukaan` <dbl>,
## #   `Data Historis USD_IDR.Tertinggi` <dbl>,
## #   `Data Historis USD_IDR.Terendah` <dbl>, `Data Historis USD_IDR.Vol.` <chr>,
## #   `Data Historis USD_IDR.Perubahan%` <dbl>, …
data_ab <- data %>%
  arrange(Tanggal) %>%
  group_by(year(Tanggal), month(Tanggal)) %>%
  slice(1) %>%
  ungroup()

data_filt <- data_ab %>%
  filter(Tanggal >= as.Date("2020-01-02"),
         Tanggal <= as.Date("2024-12-30"))

data_filt
## # A tibble: 60 × 23
##    Tanggal             Terakhir Pembukaan Tertinggi Terendah Vol.  `Perubahan%`
##    <dttm>                 <dbl>     <dbl>     <dbl>    <dbl> <chr>        <dbl>
##  1 2020-01-02 00:00:00    6284.     6313.     6317.    6264. 3,30B      -0.0025
##  2 2020-02-03 00:00:00    5884.     5921.     5943.    5877. 3,50B      -0.0094
##  3 2020-03-02 00:00:00    5361.     5455.     5491.    5355. 4,02B      -0.0168
##  4 2020-04-01 00:00:00    4466.     4539.     4627.    4445. 4,18B      -0.0161
##  5 2020-05-04 00:00:00    4605.     4716.     4716.    4576. 3,91B      -0.0235
##  6 2020-06-02 00:00:00    4848.     4754.     4884.    4754. 7,31B       0.0198
##  7 2020-07-01 00:00:00    4914.     4905.     4929.    4886. 4,32B       0.0018
##  8 2020-08-03 00:00:00    5006.     5150.     5157.    4928. 8,38B      -0.0278
##  9 2020-09-01 00:00:00    5311.     5238.     5311.    5219. 9,05B       0.0138
## 10 2020-10-01 00:00:00    4970.     4900.     4970.    4899  9,64B       0.0205
## # ℹ 50 more rows
## # ℹ 16 more variables: `Data Historis USD_IDR.Tanggal` <dttm>,
## #   `Data Historis USD_IDR.Terakhir` <dbl>,
## #   `Data Historis USD_IDR.Pembukaan` <dbl>,
## #   `Data Historis USD_IDR.Tertinggi` <dbl>,
## #   `Data Historis USD_IDR.Terendah` <dbl>, `Data Historis USD_IDR.Vol.` <chr>,
## #   `Data Historis USD_IDR.Perubahan%` <dbl>, …
data_filt2 <- data %>%
  filter(Tanggal >= as.Date("2020-01-02"),
         Tanggal <= as.Date("2024-12-30"))

Time Series

ggplot(data_filt, aes(x = Tanggal, y = Terakhir)) +
  geom_line(color = "blue") +
  geom_point(color = "darkblue", size = 2) +
  labs(
    title = "Pergerakan IHSG",
    x = "Waktu",
    y = "IHSG"
  ) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year") +
  theme_minimal() 

ggplot(data_filt, aes(x = Tanggal, y = `Data Historis USD_IDR.Terakhir`)) +
  geom_line(color = "red") +
  geom_point(color = "darkred", size = 2) +
  labs(
    title = "Pergerakan Nilai Tukar USD/IDR",
    x = "Waktu",
    y = "Kurs (IDR)"
  ) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year") +
  theme_minimal()

ggplot(data_filt, aes(x = Tanggal, y = `Data Historis CBOE Volatility Index.Terakhir`)) +
  geom_line(color = "gray") +
  geom_point(color = "black", size = 2) +
  labs(
    title = "Pergerakan Volatilitas",
    x = "Waktu",
    y = "Volatilitas"
  ) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year") +
  theme_minimal() 

Time Series Dual Axis

# IHSG vs Nilai Tukar Rupiah
scale_factor <- max(data_filt$Terakhir, na.rm = TRUE) /
                max(data_filt$`Data Historis USD_IDR.Terakhir`, na.rm = TRUE)

break_dates <- as.Date(c("2020-4-01",
                         "2023-10-02"))


ggplot(data_filt, aes(x = Tanggal)) +
  geom_line(
    aes(y = Terakhir, color = "IHSG"),
    linewidth = 0.5
  ) +
  geom_line(
    aes(y = `Data Historis USD_IDR.Terakhir` * scale_factor,
        color = "Nilai Tukar Rupiah"),
    linewidth = 0.5
  ) +
  scale_y_continuous(
    name = "IHSG (dalam Rupiah)",
    sec.axis = sec_axis(
      ~ . / scale_factor,
      name = "Nilai Tukar Rupiah (dalam Rupiah)"
    )
  ) +
  labs(
    title = "IHSG vs Nilai Tukar Rupiah",
    x = "Tanggal",
    color = "Variabel"
  ) +
  scale_x_date(breaks = break_dates, date_labels = "%b %Y") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Perubahan IHSG vs Nilai Tukar Rupiah
scale_factor <- max(data_filt$`Perubahan%`, na.rm = TRUE) /
                max(data_filt$`Data Historis USD_IDR.Perubahan%`, na.rm = TRUE)


ggplot(data_filt, aes(x = Tanggal)) +
  geom_line(
    aes(y = `Perubahan%`, color = "IHSG"),
    linewidth = 0.5
  ) +
  geom_line(
    aes(y = `Data Historis USD_IDR.Perubahan%` * scale_factor,
        color = "Nilai Tukar Rupiah"),
    linewidth = 0.5
  ) +
  scale_y_continuous(
    name = "Perubahan IHSG",
    sec.axis = sec_axis(
      ~ . / scale_factor,
      name = "Perubahan Nilai Tukar Rupiah"
    )
  ) +
  labs(
    title = "Perubahan IHSG vs Nilai Tukar Rupiah",
    x = "Tanggal",
    color = "Variabel"
  ) +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year") +
  theme_minimal()

## Pake Rumus
data_index <- data_filt %>%
  arrange(Tanggal) %>%
  mutate(
    PerIHSG_Index = (`Perubahan%` / first(`Perubahan%`)) * 100,
    PerUSD_Index  = (`Data Historis USD_IDR.Perubahan%` /
                 first(`Data Historis USD_IDR.Perubahan%`)) * 100
  )

scale_factor <- max(data_index$PerIHSG_Index, na.rm = TRUE) /
                max(data_index$PerUSD_Index, na.rm = TRUE)
# Dual Axis
ggplot(data_index, aes(x = Tanggal)) +
  geom_line(aes(y = PerIHSG_Index, color = "IHSG Index"), linewidth = 0.5) +
  geom_line(aes(y = PerUSD_Index * scale_factor,
                color = "USD/IDR Index"), linewidth = 0.5) +
  scale_y_continuous(
    name = "IHSG Index (Basis 100)",
    sec.axis = sec_axis(~ . / scale_factor,
                        name = "USD/IDR Index (Basis 100)")
  ) +
  labs(x = "Tanggal", color = "Variabel") +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year") +
  theme_minimal()

# Satu Axis
ggplot(data_index, aes(x = Tanggal)) +
  geom_line(aes(y = PerIHSG_Index, color = "IHSG")) +
  geom_line(aes(y = PerUSD_Index, color = "USD/IDR")) +
  theme_minimal()

Scatter Plot

# Scatter plot dasar
ggplot(data_filt2, aes(x = `Perubahan%`, y = `Data Historis USD_IDR.Perubahan%`)) +
  geom_point(alpha = 0.5,  # transparansi titik
             color = "blue") +  # warna titik
  labs(title = "Hubungan Perubahan IHSG dan Nilai Tukar Rupiah",
       x = "Perubahan IHSG",
       y = "Perubahan Nilai Tukar") +
  theme_minimal() +
  geom_smooth(method = "lm",  # menambahkan garis regresi linear
              se = TRUE,  # confidence interval
              color = "red")
## `geom_smooth()` using formula = 'y ~ x'

Areal Plot

# Stacked area plot

data_index <- data_filt %>%
  arrange(Tanggal) %>%
  mutate(
    PerIHSG_Index = (`Perubahan%` / first(`Perubahan%`)) * 100,
    PerUSD_Index  = (`Data Historis USD_IDR.Perubahan%` /
                 first(`Data Historis USD_IDR.Perubahan%`)) * 100
  )

ggplot(data_index, aes(x = Tanggal, y = `Perubahan%`)) +
  geom_area(position = "stack", alpha = 0.7) +  # stack area
  labs(title = "Area Plot: Perubahan IHSG",
       x = "Waktu",
       y = "Perubahan",
       ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")

ggplot(data_index, aes(x = Tanggal, y = `Data Historis USD_IDR.Perubahan%`)) +
  geom_area(position = "stack", alpha = 0.7) +  # stack area
  labs(title = "Area Plot: Perubahan Nilai Tukar Rupiah",
       x = "Waktu",
       y = "Perubahan",
       ) +
  theme_minimal() +
  scale_fill_brewer(palette = "Set2")