Exploring Urban Mobility: A Time Series Visualization of Bike Sharing Demand


1 Pendahuluan

Bike sharing merupakan salah satu inovasi transportasi perkotaan yang berkembang pesat dalam dekade terakhir. Sistem ini memungkinkan masyarakat menyewa sepeda secara fleksibel dalam jangka waktu tertentu, sehingga menjadi alternatif transportasi yang ramah lingkungan sekaligus efisien untuk perjalanan jarak pendek di tengah kota.

Keunggulan utama sistem bike sharing dari perspektif data adalah kemampuannya merekam setiap transaksi secara otomatis dan real-time. Data ini menyimpan informasi berharga tentang kapan, seberapa sering, dan dalam kondisi apa sepeda digunakan oleh masyarakat. Dengan menganalisis data ini sebagai deret waktu (time series), kita dapat mengungkap pola-pola tersembunyi dalam perilaku mobilitas urban yang tidak terlihat dari sekadar angka rata-rata.

Laporan ini menyajikan analisis visualisasi data deret waktu menggunakan Bike Sharing Dataset dari UCI Machine Learning Repository, yang mencatat aktivitas penyewaan sepeda pada sistem Capital Bikeshare di Washington D.C., Amerika Serikat selama periode 2011–2012.

Tujuan analisis ini adalah:

  1. Mengamati tren perkembangan jumlah penyewaan sepeda dari waktu ke waktu selama dua tahun
  2. Mengidentifikasi pola musiman (seasonality) dalam penggunaan sepeda antarbulan
  3. Menganalisis ritme penggunaan sepeda berdasarkan jam dalam sehari pada hari kerja vs akhir pekan

2 Deskripsi Dataset

Dataset yang digunakan bersumber dari UCI Machine Learning Repository, yang mana dataset ini merekam aktivitas penyewaan sepeda pada sistem Capital Bikeshare di Washington D.C. selama dua tahun penuh, yaitu 1 Januari 2011 hingga 31 Desember 2012.

Dataset tersedia dalam dua level detail waktu:

  • day.csv — Data agregat harian dengan 731 observasi (731 hari selama dua tahun)
  • hour.csv — Data per jam dengan 17.379 observasi

Untuk keperluan analisis ini, kedua file digunakan secara bersamaan sesuai kebutuhan masing-masing visualisasi.

2.1 Variabel Utama Dataset

Variabel-variabel utama yang relevan untuk analisis ini dijelaskan pada tabel berikut:

Nama Variabel Tipe Data Keterangan
dteday Tanggal Tanggal pengamatan
season Kategorikal Musim: 1 = Semi, 2 = Panas, 3 = Gugur, 4 = Dingin
yr Biner Tahun: 0 = 2011, 1 = 2012
mnth Numerik Bulan (1–12)
hr Numerik Jam dalam sehari (0–23) — hanya tersedia di hour.csv
holiday Biner 1 jika hari libur nasional, 0 jika tidak
workingday Biner 1 jika hari kerja (bukan akhir pekan/libur), 0 jika tidak
weathersit Ordinal Kondisi cuaca: 1 = Cerah, 2 = Berawan, 3 = Hujan Ringan, 4 = Hujan Lebat
temp Numerik Suhu udara ternormalisasi (skala 0–1)
casual Numerik Jumlah penyewa tidak terdaftar (non-member)
registered Numerik Jumlah penyewa terdaftar (member)
cnt Numerik Total penyewaan = casual + registered : variabel target utama

3 Memuat dan Mempersiapkan Data

3.1 Memuat Data

Catatan: Jika belum memiliki datasetnya, maka silahkan unduh dari UCI Machine Learning Repository, lalu letakkan file day.csv dan hour.csv di folder yang sama dengan file .Rmd ini.

day_data  <- read.csv("day.csv")
hour_data <- read.csv("hour.csv")

3.2 Struktur Data Harian

glimpse(day_data)
## Rows: 731
## Columns: 16
## $ instant    <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
## $ dteday     <chr> "2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "20…
## $ season     <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ yr         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ mnth       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ holiday    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,…
## $ weekday    <int> 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4,…
## $ workingday <int> 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,…
## $ weathersit <int> 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 2, 2,…
## $ temp       <dbl> 0.3441670, 0.3634780, 0.1963640, 0.2000000, 0.2269570, 0.20…
## $ atemp      <dbl> 0.3636250, 0.3537390, 0.1894050, 0.2121220, 0.2292700, 0.23…
## $ hum        <dbl> 0.805833, 0.696087, 0.437273, 0.590435, 0.436957, 0.518261,…
## $ windspeed  <dbl> 0.1604460, 0.2485390, 0.2483090, 0.1602960, 0.1869000, 0.08…
## $ casual     <int> 331, 131, 120, 108, 82, 88, 148, 68, 54, 41, 43, 25, 38, 54…
## $ registered <int> 654, 670, 1229, 1454, 1518, 1518, 1362, 891, 768, 1280, 122…
## $ cnt        <int> 985, 801, 1349, 1562, 1600, 1606, 1510, 959, 822, 1321, 126…

3.3 Struktur Data Per Jam

glimpse(hour_data)
## Rows: 17,379
## Columns: 17
## $ instant    <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
## $ dteday     <chr> "2011-01-01", "2011-01-01", "2011-01-01", "2011-01-01", "20…
## $ season     <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ yr         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ mnth       <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ hr         <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
## $ holiday    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ weekday    <int> 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,…
## $ workingday <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ weathersit <int> 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3,…
## $ temp       <dbl> 0.24, 0.22, 0.22, 0.24, 0.24, 0.24, 0.22, 0.20, 0.24, 0.32,…
## $ atemp      <dbl> 0.2879, 0.2727, 0.2727, 0.2879, 0.2879, 0.2576, 0.2727, 0.2…
## $ hum        <dbl> 0.81, 0.80, 0.80, 0.75, 0.75, 0.75, 0.80, 0.86, 0.75, 0.76,…
## $ windspeed  <dbl> 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0896, 0.0000, 0.0…
## $ casual     <int> 3, 8, 5, 3, 0, 0, 2, 1, 1, 8, 12, 26, 29, 47, 35, 40, 41, 1…
## $ registered <int> 13, 32, 27, 10, 1, 1, 0, 2, 7, 6, 24, 30, 55, 47, 71, 70, 5…
## $ cnt        <int> 16, 40, 32, 13, 1, 1, 2, 3, 8, 14, 36, 56, 84, 94, 106, 110…

3.4 Ringkasan Statistik

day_data |>
  select(cnt, casual, registered, temp, weathersit) |>
  summary()
##       cnt           casual         registered        temp        
##  Min.   :  22   Min.   :   2.0   Min.   :  20   Min.   :0.05913  
##  1st Qu.:3152   1st Qu.: 315.5   1st Qu.:2497   1st Qu.:0.33708  
##  Median :4548   Median : 713.0   Median :3662   Median :0.49833  
##  Mean   :4504   Mean   : 848.2   Mean   :3656   Mean   :0.49538  
##  3rd Qu.:5956   3rd Qu.:1096.0   3rd Qu.:4776   3rd Qu.:0.65542  
##  Max.   :8714   Max.   :3410.0   Max.   :6946   Max.   :0.86167  
##    weathersit   
##  Min.   :1.000  
##  1st Qu.:1.000  
##  Median :1.000  
##  Mean   :1.395  
##  3rd Qu.:2.000  
##  Max.   :3.000

3.5 Preprocessing

# ── day_data ────────────────────────────────────────────────────────────────
day_data <- day_data |>
  mutate(
    dteday   = as.Date(dteday),
    year     = ifelse(yr == 0, "2011", "2012"),
    month    = month(dteday, label = TRUE, abbr = TRUE),
    season_label = factor(season,
                          levels = 1:4,
                          labels = c("Semi","Panas","Gugur","Dingin"))
  ) |>
  arrange(dteday)

# ── hour_data ───────────────────────────────────────────────────────────────
hour_data <- hour_data |>
  mutate(
    dteday   = as.Date(dteday),
    day_type = ifelse(workingday == 1, "Hari Kerja", "Akhir Pekan / Libur")
  )

4 Visualisasi dan Analisis

Bagian ini menyajikan tiga visualisasi data time series yang saling melengkapi, dimana setiap visualisasinya dirancang untuk menjawab satu pertanyaan spesifik tentang pola penggunaan sepeda. Mulai dari perspektif jangka panjang (dua tahun), pola bulanan, hingga ritme dalam sehari.


4.1 Visualisasi 1 : Tren Harian Penyewaan Sepeda Selama 2 Tahun (2011–2012)

Sebelum mendalami pola-pola yang spesifik, adalah penting untuk terlebih dahulu melihat gambaran besar mengenai bagaimana total penyewaan sepeda bergerak dari hari ke hari selama dua tahun penuh. Pada visualisasi pertama ini, disajikan data harian dalam bentuk line chart yang dilengkapi kurva smoothing (LOESS) untuk memperlihatkan tren jangka panjang di balik fluktuasi harian.

Fokus Grafik: Tren keseluruhan jumlah penyewaan sepeda selama 2011–2012. Yang mana, garis abu-abu tipis merepresentasikan data mentah harian, sedangkan garis biru tebal menunjukkan tren yang dihaluskan. Area berbayang menandai rentang kepercayaan estimasi tren.

ggplot(day_data, aes(x = dteday, y = cnt)) +
  geom_line(color = "gray75", linewidth = 0.4, alpha = 0.9) +
  geom_smooth(method = "loess", span = 0.25,
              color = "#0077b6", fill = "#90e0ef",
              linewidth = 1.3, se = TRUE, alpha = 0.2) +
  scale_x_date(
    date_breaks = "2 months",
    date_labels = "%b\n%Y",
    expand = c(0.01, 0.01)
  ) +
  scale_y_continuous(labels = label_comma()) +
  annotate("rect",
           xmin = as.Date("2011-01-01"), xmax = as.Date("2011-12-31"),
           ymin = -Inf, ymax = Inf,
           fill = "#caf0f8", alpha = 0.10) +
  annotate("rect",
           xmin = as.Date("2012-01-01"), xmax = as.Date("2012-12-31"),
           ymin = -Inf, ymax = Inf,
           fill = "#ade8f4", alpha = 0.10) +
  annotate("text", x = as.Date("2011-07-01"), y = 8400,
           label = "2011", fontface = "bold",
           color = "#0077b6", size = 4.5, alpha = 0.5) +
  annotate("text", x = as.Date("2012-07-01"), y = 8400,
           label = "2012", fontface = "bold",
           color = "#0077b6", size = 4.5, alpha = 0.5) +
  labs(
    title    = "Tren Harian Penyewaan Sepeda (2011–2012)",
    subtitle = "Garis biru menunjukkan tren keseluruhan; garis abu-abu adalah data harian aktual",
    x        = "Tanggal",
    y        = "Jumlah Penyewaan Sepeda",
    caption  = "Sumber: UCI Machine Learning Repository — Bike Sharing Dataset"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", color = "#1a1a2e", size = 15),
    plot.subtitle   = element_text(color = "gray40", size = 11),
    plot.caption    = element_text(color = "gray50", size = 9),
    panel.grid.minor = element_blank(),
    axis.text.x     = element_text(size = 9)
  )
Visualisasi 1 — Tren Harian Penyewaan Sepeda (2011–2012)

Visualisasi 1 — Tren Harian Penyewaan Sepeda (2011–2012)

Makna Grafik: Grafik ini menampilkan data penyewaan sepeda harian selama dua tahun penuh, dari Januari 2011 hingga Desember 2012. Sumbu horizontal (X) menunjukkan rentang waktu berdasarkan tanggal, sedangkan sumbu vertikal (Y) menunjukkan jumlah sepeda yang disewa pada hari tersebut. Dimana, semakin tinggi posisi suatu titik di grafik, berarti semakin banyak sepeda yang disewa pada hari itu.

Hal pertama yang langsung terlihat adalah bahwa garis abu-abu tipis, yang merepresentasikan data harian sesungguhnya, bergerak naik-turun dengan sangat cepat. Hal ini wajar karena penggunaan sepeda tiap harinya dipengaruhi banyak faktor kecil seperti cuaca mendadak, hari libur tak terduga, atau even tertentu. Namun di balik padatnya data tersebut, garis biru tebal (smoothed line chart) menunjukkan arah umum yang jauh lebih jelas, yakni ada pola naik-turun yang teratur setiap tahunnya, di mana penggunaan meningkat di pertengahan tahun dan menurun di awal serta akhir tahun. Pola ini mencerminkan pergantian musim. Saat musim panas tiba dan cuaca cerah, orang-orang lebih semangat keluar rumah dan naik sepeda. Sebaliknya, ketika musim dingin datang dan udara terasa dingin, jumlah penyewa pun ikut menurun drastis.

Selain itu, paling menarik untuk diperhatikan adalah perbandingan antara tahun 2011 dan 2012. Puncak tertinggi di tahun 2011 hanya mencapai sekitar angka 4.500–5.000 penyewaan per hari, sedangkan puncak di tahun 2012 melesat jauh hingga mendekati angka 7.000–8.000 penyewaan per hari. Ini adalah bukti nyata bahwa sistem bike sharing di Washington D.C. sedang mengalami pertumbuhan yang sangat pesat, dengan semakin banyak warga yang mulai menjadikan sepeda sebagai bagian tetap dari gaya hidup dan mobilitas harian mereka.


4.2 Visualisasi 2 : Perbandingan Pola Penyewaan Bulanan (2011 vs 2012)

Setelah melihat tren harian secara keseluruhan, langkah berikutnya adalah mengidentifikasi pola musiman (seasonality), yaitu pola berulang yang terjadi dalam siklus waktu tertentu. Dalam konteks bike sharing, pola musiman yang paling terlihat adalah perubahan permintaan seiring pergantian bulan dan musim dalam setahun.

Visualisasi kedua ini mengagregasi data harian menjadi total penyewaan per bulan, kemudian membandingkan tahun 2011 dan 2012 dalam satu grafik. Dengan demikian, kita dapat melihat dua hal sekaligus: apakah pola musiman konsisten antartahun, dan apakah ada pertumbuhan volume dari tahun ke tahun?

Fokus Grafik: Perbandingan total penyewaan sepeda per bulan antara 2011 (oranye) dan 2012 (biru). Titik-titik pada grafik menandai nilai aktual setiap bulannya dan disertai dengan garis yang menghubungkan pola sepanjang tahun.

monthly_data <- day_data |>
  group_by(year, month) |>
  summarise(total_rentals = sum(cnt), .groups = "drop")

ggplot(monthly_data, aes(x = month, y = total_rentals,
                          color = year, group = year)) +
  geom_line(linewidth = 1.3) +
  geom_point(size = 3.5, shape = 21,
             aes(fill = year), color = "white", stroke = 1.5) +
  geom_text(aes(label = label_comma()(total_rentals)),
            vjust = -1.1, size = 3, fontface = "bold") +
  scale_y_continuous(
    labels = label_comma(),
    limits = c(0, NA),
    expand = expansion(mult = c(0, 0.18))
  ) +
  scale_color_manual(values = c("2011" = "#f77f00", "2012" = "#0077b6")) +
  scale_fill_manual(values  = c("2011" = "#f77f00", "2012" = "#0077b6")) +
  labs(
    title    = "Perbandingan Pola Penyewaan Bulanan: 2011 vs 2012",
    subtitle = "Menampilkan pola musiman dan pertumbuhan tahunan",
    x        = "Bulan",
    y        = "Total Penyewaan Sepeda",
    color    = "Tahun",
    fill     = "Tahun",
    caption  = "Sumber: UCI Machine Learning Repository — Bike Sharing Dataset"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title      = element_text(face = "bold", color = "#1a1a2e", size = 15),
    plot.subtitle   = element_text(color = "gray40", size = 11),
    plot.caption    = element_text(color = "gray50", size = 9),
    panel.grid.minor = element_blank(),
    legend.position = "top",
    legend.title    = element_text(face = "bold")
  )
Visualisasi 2 — Perbandingan Pola Penyewaan Bulanan (2011 vs 2012)

Visualisasi 2 — Perbandingan Pola Penyewaan Bulanan (2011 vs 2012)

Makna Grafik: Grafik ini menampilkan total penyewaan sepeda yang dikelompokkan per bulan, untuk tahun 2011 (garis oranye) dan tahun 2012 (garis biru). Sumbu horizontal (X) menunjukkan urutan bulan dari Januari hingga Desember, sedangkan sumbu vertikal (Y) menunjukkan total jumlah penyewaan sepeda yang terjadi sepanjang bulan tersebut. Label angka di setiap titik menampilkan nilai pastinya sehingga perbandingan antarbulan dan antartahun dapat dibaca langsung tanpa harus menebak.

Pola yang terbentuk dari kedua garis sangat konsisten dan mudah dibaca antara lain: bulan-bulan awal tahun (Januari–Maret), jumlah penyewaan berada di titik terendah, kemudian angkanya naik secara bertahap seiring datangnya musim semi dan musim panas, dan mencapai puncaknya di sekitar bulan Agustus–September, lalu turun kembali saat memasuki musim gugur dan musim dingin menjelang akhir tahun. Pola naik-turun yang teratur dan berulang di kedua tahun ini membuktikan bahwa faktor musim dan cuaca sangat dominan dalam menentukan seberapa banyak orang yang mau bersepeda.

Perbedaan yang paling mencolok adalah besarnya jarak antara dua garis tersebut. Jika di tahun 2011 bulan terbaik (Juni) hanya menghasilkan sekitar 143.512 penyewaan, maka di tahun 2012 bulan terbaik (September) mencapai 218.573 penyewaan. Hampir satu setengah kali lipat lebih tinggi. Bahkan di bulan yang biasanya sepi sekalipun, seperti Januari (2012), penyewaan mencapai 96.744 alias sudah jauh melampaui angka terbaik beberapa bulan di tahun 2011. Temuan ini menegaskan bahwa pertumbuhan pengguna bike sharing bukan hanya terjadi di musim ramai saja, melainkan merata di seluruh bulan sepanjang tahun.


4.3 Visualisasi 3 : Pola Penyewaan Sepeda Dalam Sehari

Setelah dua visualisasi sebelumnya memperlihatkan bagaimana pola penyewaan dari skala harian dan bulanan, kini kita akan memperbesar resolusi pengamatan ke level yang lebih detail, yakni pola per jam dalam sehari. Dalam visualisasi ini, akan digunakan data dari hour.csvyang mana kita tidak hanya melihat fluktuasi antar jam, tetapi juga membandingkannya pada dua tipe hari yang berbeda, yakni hari kerja (Senin–Jumat di luar hari libur) dan akhir pekan/hari libur.

Pemilahan ini penting karena motivasi penggunaan sepeda dapat sangat berbeda seperti pada hari kerja, sepeda kemungkinan digunakan untuk keperluan commuting (pergi-pulang kerja), sedangkan pada akhir pekan lebih cenderung untuk rekreasi. Kedua pola ini diperkirakan akan menghasilkan distribusi jam yang sangat berbeda.

Fokus Grafik: Rata-rata penyewaan sepeda per jam yang dibedakan antara hari kerja (biru) dan akhir pekan/libur (oranye). Disini, sumbu X menunjukkan jam (0–23) dan sumbu Y menunjukkan rata-rata jumlah penyewaan.

hourly_pattern <- hour_data |>
  group_by(hr, day_type) |>
  summarise(avg_rentals = mean(cnt), .groups = "drop")

# Tandai jam puncak hari kerja
peak_workday <- hourly_pattern |>
  filter(day_type == "Hari Kerja") |>
  filter(avg_rentals == max(avg_rentals))

peak_weekend <- hourly_pattern |>
  filter(day_type == "Akhir Pekan / Libur") |>
  filter(avg_rentals == max(avg_rentals))

ggplot(hourly_pattern, aes(x = hr, y = avg_rentals,
                            color = day_type, group = day_type)) +
  geom_ribbon(
    data = hourly_pattern |> filter(day_type == "Hari Kerja"),
    aes(ymin = 0, ymax = avg_rentals),
    fill = "#90e0ef", alpha = 0.15, color = NA
  ) +
  geom_ribbon(
    data = hourly_pattern |> filter(day_type == "Akhir Pekan / Libur"),
    aes(ymin = 0, ymax = avg_rentals),
    fill = "#ffd166", alpha = 0.15, color = NA
  ) +
  geom_line(linewidth = 1.4) +
  geom_point(data = peak_workday,
             aes(x = hr, y = avg_rentals),
             color = "#0077b6", size = 4.5, shape = 18) +
  geom_point(data = peak_weekend,
             aes(x = hr, y = avg_rentals),
             color = "#f77f00", size = 4.5, shape = 18) +
  geom_text(data = peak_workday,
            aes(label = paste0("Puncak: ", round(avg_rentals, 0))),
            vjust = -1, hjust = 0.5, size = 3.3,
            color = "#0077b6", fontface = "bold") +
  geom_text(data = peak_weekend,
            aes(label = paste0("Puncak: ", round(avg_rentals, 0))),
            vjust = -1, hjust = 0.5, size = 3.3,
            color = "#f77f00", fontface = "bold") +
  scale_x_continuous(
    breaks = seq(0, 23, by = 1),
    labels = function(x) paste0(sprintf("%02d", x), ":00")
  ) +
  scale_y_continuous(labels = label_comma()) +
  scale_color_manual(
    values = c("Hari Kerja" = "#0077b6", "Akhir Pekan / Libur" = "#f77f00")
  ) +
  labs(
    title    = "Ritme Penyewaan Sepeda Dalam Sehari",
    subtitle = "Rata-rata penyewaan per jam, hari kerja vs akhir pekan/libur",
    x        = "Jam",
    y        = "Rata-rata Penyewaan Sepeda",
    color    = "Jenis Hari",
    caption  = "Sumber: UCI Machine Learning Repository — Bike Sharing Dataset"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title       = element_text(face = "bold", color = "#1a1a2e", size = 15),
    plot.subtitle    = element_text(color = "gray40", size = 11),
    plot.caption     = element_text(color = "gray50", size = 9),
    panel.grid.minor = element_blank(),
    axis.text.x      = element_text(angle = 45, hjust = 1, size = 8),
    legend.position  = "top",
    legend.title     = element_text(face = "bold")
  )
Visualisasi 3 — Pola Penyewaan Sepeda Berdasarkan Jam dalam Sehari

Visualisasi 3 — Pola Penyewaan Sepeda Berdasarkan Jam dalam Sehari

Makna Grafik:

Grafik ini memperlihatkan rata-rata jumlah penyewaan sepeda pada setiap jam dalam sehari, yang dibedakan menjadi dua kelompok, yakni hari kerja (garis biru) dan akhir pekan atau hari libur (garis oranye). Sumbu horizontal (X) menunjukkan jam dari pukul 00:00 dini hari hingga 23:00 malam, sedangkan sumbu vertikal (Y) menunjukkan rata-rata jumlah penyewaan sepeda pada jam tersebut. Yang mana, nilai ini dihitung dari ratusan hari data, bukan hanya satu hari saja, sehingga hasilnya mencerminkan kebiasaan umum yang benar-benar terjadi di lapangan.

Pada hari kerja (garis biru), pola yang terbentuk sangat khas dan mudah dikenali. Mulai dari tengah malam hingga dini hari (00:00–05:00), hampir tidak ada aktivitas penyewaan (masyarakat sana masih belum memulai aktivitas di luar). Lalu tiba-tiba di sekitar pukul 07:00–08:00 pagi, angka penyewaan melonjak tajam hingga mendekati angka 475 penyewaan per jam. Ini adalah waktu orang berangkat ke kantor atau sekolah. Setelah itu angkanya turun drastis di siang hari (09:00–15:00) karena kebanyakan orang sudah berada di tempat tujuan masing-masing. Kemudian terjadi lonjakan kedua yang bahkan lebih tinggi pada pukul 17:00–18:00 sore dengan puncak rata-rata 525 penyewaan per jam, tepat saat jam pulang kerja. Pola dua puncak seperti ini dalam dunia analisis data transportasi dikenal sebagai pola commuter, yaitu pola yang terbentuk dari kebiasaan orang yang menggunakan sepeda sebagai alat transportasi pergi-pulang bekerja.

Pada akhir pekan dan hari libur (garis oranye), pola yang terbentuk sama sekali berbeda. Dapat kita lihat, bahwa tidak ada lonjakan tajam di pagi hari. Melainkan, penyewaan sepeda mulai pelan-pelan meningkat sejak pukul 08:00 pagi, yang kemudian naik secara bertahap dan melandai di sekitar pukul 12:00–14:00 siang dengan puncak rata-rata sekitar 373 penyewaan per jam, lalu turun perlahan hingga malam. Pola yang lebih datar dan tersebar merata sepanjang siang ini mencerminkan bahwa orang menggunakan sepeda bukan karena tuntutan jadwal, melainkan karena ingin bersantai, berolahraga, atau sekadar menikmati hari. Dari perbandingan kedua pola ini, kita dapat menyimpulkan satu hal yang sangat menarik: sepeda yang sama, di kota yang sama, memiliki dua fungsi yang benar-benar berbeda tergantung hari, sepeda adalah kendaraan kerja di hari biasa, dan sekaligus menjadi alat rekreasi di hari libur.


5 Kesimpulan

Analisis visualisasi deret waktu terhadap Bike Sharing Dataset ini mengungkap tiga temuan utama yang saling berkaitan dan membentuk gambaran utuh tentang perilaku mobilitas urban di Washington D.C.

Pertama, sistem bike sharing ini sedang mengalami pertumbuhan. Selama dua tahun periode pengamatan, jumlah total penyewaan sepeda meningkat secara konsisten. Pertumbuhan disini, bukanlah sekadar pertumbuhan kecil. Dapat kita lihat dari volume penyewaan di tahun 2012 yang hampir dua kali lipat dibanding tahun 2011 di hampir setiap bulannya. Hal ini mengindikasikan bahwa kepercayaan dan kebiasaan masyarakat terhadap sepeda sebagai moda transportasi semakin menguat dari waktu ke waktu.

Kedua, cuaca dan musim adalah pengatur utama permintaan sepeda. Ketiga visualisasi secara kompak menunjukkan bahwa pola penggunaan sepeda tidak pernah merata sepanjang tahun. Musim panas dan awal gugur (sekitar Juni–September) selalu menjadi periode puncak, sementara musim dingin (Desember–Februari) menjadi titik terendah. Artinya, faktor lingkungan dan kenyamanan cuaca memiliki pengaruh yang sangat besar terhadap keputusan seseorang untuk bersepeda.

Ketiga, sepeda melayani dua kebutuhan yang berbeda sesuai hari. Di hari kerja, sepeda adalah alat transportasi fungsional dengan dua jam sibuk yang mencerminkan ritme pergi-pulang kantor. Di akhir pekan, sepeda bertransformasi menjadi sarana rekreasi dengan pola penggunaan yang lebih santai dan merata sepanjang siang hari. Pemahaman ini sangat berharga bagi pengelola sistem bike sharing untuk mengalokasikan armada sepeda secara lebih efisien sesuai dengan kebutuhan nyata penggunanya.

Secara keseluruhan, data ini membuktikan bahwa sepeda bukanlah hanya sekadar kendaraan alternatif di kota Washington D.C. tersebut, melainkan cerminan dari ritme kehidupan kota itu sendiri.


6 Daftar Pustaka

UCI Machine Learning Repository. (2013). Bike Sharing Dataset. https://archive.ics.uci.edu/dataset/275/bike+sharing+dataset


Laporan ini dibuat menggunakan R Markdown | 12 March 2026