Bersepeda di tengah kota bukan lagi sekadar tren, melainkan gaya hidup dan solusi mobilitas. Namun, pernahkah kita menyadari bahwa keputusan seseorang untuk menyewa sepeda sangat dipengaruhi oleh lingkungan sekitarnya? Mulai dari terik matahari, rintik hujan, hingga hembusan angin, semuanya memiliki cerita tersendiri.
Dalam dokumen eksplorasi ini, kita akan melakukan Visualisasi Data Kontinu (Bivariate) menggunakan dataset Bike Sharing dari Washington D.C. Kita tidak hanya akan melihat satu sudut pandang, melainkan mempertemukan dua variabel untuk menjawab pertanyaan analitis: Bagaimana alam dan waktu mengendalikan dinamika pesepeda di jalanan? Mari kita bedah datanya.
Sebelum melakukan visualisasi, kita perlu memuat dataset ke dalam memori kerja R.
Scatter plot adalah grafik yang menunjukkan hubungan antara dua variabel numerik. Setiap titik pada scatter plot mewakili satu pengamatan, dengan posisi titik ditentukan oleh nilai kedua variabel. Berikut adalah contoh kode untuk membuat scatter plot antara cnt dan temp:
ggplot(bike_data, aes(x = temp, y = cnt)) +
geom_point(color = "steelblue", alpha = 0.5, size = 2) +
labs(title = "Scatter Plot of Total Bike Rentals vs Temperature",
x = "Temperature (temp)",
y = "Total Rentals (cnt)") +
theme_minimal()Scatter plot di atas menunjukkan hubungan antara suhu (temp) dan jumlah penyewaan sepeda (cnt). Setiap titik pada grafik mewakili satu hari, dengan posisi horizontal menunjukkan suhu dan posisi vertikal menunjukkan jumlah penyewaan sepeda pada hari tersebut. Dari visualisasi ini terlihat bahwa terdapat pola positif antara suhu dan jumlah penyewaan sepeda, di mana semakin tinggi suhu, semakin banyak penyewaan sepeda yang terjadi. Hal ini menunjukkan bahwa cuaca yang lebih hangat cenderung meningkatkan penggunaan sepeda, sementara suhu yang lebih rendah mungkin membuat orang enggan untuk menyewa sepeda. Meskipun terdapat beberapa titik yang menyebar, pola umum menunjukkan bahwa suhu memiliki pengaruh positif terhadap jumlah penyewaan sepeda
Boxplot bivariate digunakan untuk membandingkan distribusi variabel numerik (cnt) berdasarkan kategori dari variabel lain, seperti musim (season). Berikut adalah contoh kode untuk membuat boxplot bivariate antara cnt dan season:
ggplot(bike_data, aes(x = as.factor(season), y = cnt)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
labs(title = "Boxplot of Total Bike Rentals by Musim",
x = "Musim (1:Spring, 2:Summer, 3:Fall, 4:Winter)",
y = "Total Rentals (cnt)") +
theme_minimal()Boxplot bivariate di atas digunakan untuk membandingkan distribusi jumlah penyewaan sepeda (cnt) berdasarkan kategori musim (season). Setiap kotak pada grafik mewakili distribusi penyewaan sepeda untuk masing-masing musim, dengan garis di dalam kotak menunjukkan median, batas kotak menunjukkan kuartil pertama (Q1) dan kuartil ketiga (Q3), serta whisker yang memanjang menunjukkan rentang data. Dari visualisasi ini terlihat bahwa musim Summer memiliki jumlah penyewaan sepeda yang lebih tinggi dibandingkan dengan musim lainnya, dengan median yang berada di kisaran 5.000 penyewaan per hari. Sementara itu, musim Winter memiliki jumlah penyewaan yang lebih rendah, dengan median di bawah 3.000 penyewaan per hari. Hal ini menunjukkan bahwa penggunaan sepeda cenderung meningkat selama musim panas dan menurun selama musim dingin, kemungkinan karena faktor cuaca yang mempengaruhi kenyamanan dalam menggunakan sepeda
Violin plot bivariate digunakan untuk membandingkan distribusi variabel numerik (cnt) berdasarkan kategori dari variabel lain, seperti kondisi cuaca (weathersit). Berikut adalah contoh kode untuk membuat violin plot bivariate antara cnt dan weathersit:
ggplot(bike_data, aes(x = as.factor(weathersit), y = cnt)) +
geom_violin(fill = "lightcoral", color = "darkred", alpha = 0.6) +
geom_boxplot(width = 0.1, fill = "white", color = "black", outlier.shape = NA) +
labs(title = "Violin Plot of Total Bike Rentals by Kondisi Cuaca",
x = "Kondisi Cuaca (1:Cerah, 2:Berkabut, 3:Hujan/Salju Ringan)",
y = "Total Rentals (cnt)") +
theme_minimal()Violin plot bivariate di atas digunakan untuk membandingkan distribusi jumlah penyewaan sepeda (cnt) berdasarkan kondisi cuaca (weathersit). Setiap bentuk violin mewakili distribusi penyewaan sepeda untuk masing-masing kondisi cuaca, dengan bagian yang lebih lebar menunjukkan bahwa lebih banyak hari memiliki jumlah penyewaan pada kisaran tersebut. Boxplot di dalam violin memberikan informasi statistik ringkas, seperti median dan kuartil. Dari visualisasi ini terlihat bahwa kondisi cuaca yang cerah (Clear) memiliki distribusi penyewaan sepeda yang lebih tinggi dan lebih padat dibandingkan dengan kondisi cuaca lainnya, seperti hujan ringan (Light Rain) atau hujan deras (Heavy Rain), yang memiliki distribusi penyewaan yang lebih rendah. Hal ini menunjukkan bahwa kondisi cuaca yang baik cenderung meningkatkan penggunaan sepeda, sementara kondisi cuaca yang buruk dapat mengurangi minat orang untuk menyewa sepeda.
Melalui Jitter Plot, kita akan melihat hubungan antara status hari (workingday) dengan jumlah pengguna sepeda kasual atau non-member (casual). Variabel workingday bernilai 0 untuk hari libur atau akhir pekan, dan bernilai 1 untuk hari kerja biasa. Jitter PLot ini, akan menjawab pertanyaan: Apakah pengguna kasual (non-member) lebih mendominasi penyewaan di hari libur dibandingkan pada hari kerja?. Dengan kata lain, tujuan kita adalah untuk mengetahui apakah kelompok pengguna yang biasanya menyewa untuk tujuan rekreasi ini memiliki preferensi hari tertentu.
ggplot(bike_data, aes(x = as.factor(workingday), y = casual)) +
geom_jitter(color = "darkorange", alpha = 0.6, width = 0.2, size = 2) +
labs(title = "Jitter Plot: Distribusi Pengguna Kasual (Hari Libur vs Kerja)",
x = "Status Hari (0 = Libur/Akhir Pekan, 1 = Hari Kerja)",
y = "Jumlah Pengguna Kasual (casual)") +
theme_minimal()Visualisasi di atas menunjukkan perbedaan perilaku penyewaan yang sangat tajam. Pada hari libur atau akhir pekan (kategori 0), jumlah pengguna kasual tersebar luas hingga mencapai angka tertinggi di atas 3.000 penyewa dalam sehari (terlihat dari sebaran titik-titik oranye yang memanjang ke atas). Sebaliknya, pada hari kerja (kategori 1), aktivitas pengguna kasual sangat terkonsentrasi di angka yang rendah, mayoritas di bawah 1.000 penyewa (terlihat dari kumpulan titik data sangat padat dan terkonsentrasi di bagian bawah). Hal ini mengonfirmasi bahwa pengguna kasual jauh lebih aktif menggunakan layanan ini saat hari libur dibandingkan hari kerja
Selanjutnya, kita mempertemukan variabel kecepatan angin (windspeed) di sumbu X dengan jumlah pengguna sepeda yang sudah terdaftar atau member (registered) di sumbu Y. Pengguna terdaftar umumnya didominasi oleh para komuter yang bersepeda untuk rutinitas harian seperti bekerja. Visualisasi 2D Density ini bertujuan melihat di titik mana pusat massa aktivitas mereka berada ketika dihadapkan dengan kondisi angin. Melalui 2D Density Plot ini, kita akan mengetahui jawaban dari pertanyaan: Pada tingkat kecepatan angin berapakah mayoritas pengguna sepeda komuter (registered) paling padat beraktivitas?
ggplot(bike_data, aes(x = windspeed, y = registered)) +
geom_density_2d_filled(alpha = 0.9) +
labs(title = "2D Density Plot: Aktivitas Komuter vs Kecepatan Angin",
x = "Kecepatan Angin (windspeed)",
y = "Jumlah Pengguna Terdaftar (registered)",
fill = "Kepadatan") +
theme_minimal()Area berwarna kuning terang pada grafik menunjukkan pusat aktivitas tertinggi dari pengguna terdaftar (komuter), dengan kata lain, area berwarna kuning ini merupakan area dengan frekuensi kepadatan tertinggi. Dari area kuning terang tersebut, terlihat bahwa mayoritas perjalanan komuter terjadi ketika kecepatan angin berada di tingkat rendah hingga sedang (di kisaran 0.1 hingga 0.25 pada sumbu X). Saat kecepatan angin meningkat melebihi 0.3, warna grafik memudar menjadi ungu gelap yang menandakan volume pengguna komuter menurun drastis. Hal ini mengindikasikan bahwa meskipun mereka adalah pengguna rutin/pesepeda harian, angin kencang tetap menjadi faktor penghambat yang signifikan.
Visualisasi ketiga membandingkan tingkat kelembapan udara (hum) yang berskala 0 hingga 1 di sumbu X, dengan total seluruh penyewaan sepeda harian (cnt) di sumbu Y. Karena jumlah observasi harian cukup banyak dan berisiko menumpuk, kita menggunakan Hexbin Plot untuk mengelompokkan data ke dalam bentuk segienam (heksagonal). Melalui Hexbin Plot ini, kita dapat menjawab pertanyaan berikut: Pada rentang kelembapan (humidity) berapakah titik kumpul tertinggi penyewaan sepeda terjadi secara keseluruhan?
ggplot(bike_data, aes(x = hum, y = cnt)) +
geom_hex(bins = 20) +
scale_fill_viridis_c(option = "plasma") +
labs(title = "Hexbin Plot: Total Penyewaan Berdasarkan Kelembapan",
x = "Kelembapan Udara (hum)",
y = "Total Penyewaan (cnt)",
fill = "Frekuensi (Hari)") +
theme_minimal()Hexbin plot ini menggunakan gradasi warna untuk menunjukkan frekuensi kejadian dalam satu sel. Sel-sel heksagonal berwarna kuning terang menandakan frekuensi hari yang paling banyak, sedangkan warna ungu gelap menandakan frekuensi hari yang sangat sedikit. Hexbin plot di atas menunjukkan bahwa frekuensi tertinggi (area berwarna kuning) berkumpul secara solid di area kelembapan moderat, yaitu pada rentang 0.50 hingga 0.70. Pada rentang kelembapan ini, total penyewaan harian (cnt) paling sering berada di angka 4.000 hingga 5.000 unit. Sebaliknya, pada kondisi kelembapan yang ekstrem seperti terlalu kering (di bawah 0.30) atau terlalu basah (di atas 0.80), area grafik didominasi warna ungu (baik ungu gelap maupun ungu muda) karena jumlah hari dengan penyewaan tinggi sangat minim pada kondisi tersebut.
Line plot berikut memperlihatkan pergerakan data terhadap waktu. Kita menggunakan variabel bulan (mnth) dari urutan 1 (Januari) hingga 12 (Desember) pada sumbu X, dan rata-rata penyewaan harian (cnt) pada sumbu Y. Untuk melihat pertumbuhan secara komparatif, kita memisahkan data berdasarkan tahun (yr), yang direpresentasikan oleh dua garis warna berbeda: garis biru untuk tahun 2011 dan garis oranye untuk tahun 2012.Melalui Line Plot ini, kita dapat memiliki jawaban untuk pertanyaan berikut: Bagaimana tren rata-rata jumlah penyewaan sepeda dari bulan ke bulan, dan apakah terdapat pertumbuhan performa bisnis secara keseluruhan dari tahun 2011 ke 2012?
ggplot(bike_data, aes(x = as.factor(mnth), y = cnt, group = as.factor(yr), color = as.factor(yr))) +
stat_summary(fun = mean, geom = "line", size = 1.2) +
stat_summary(fun = mean, geom = "point", size = 3) +
scale_color_manual(values = c("0" = "steelblue", "1" = "darkorange"),
labels = c("2011", "2012")) +
labs(title = "Line Plot: Tren Rata-Rata Penyewaan Bulanan (2011 vs 2012)",
x = "Bulan (1 = Jan, 12 = Des)",
y = "Rata-rata Penyewaan Harian",
color = "Tahun") +
theme_minimal()Grafik garis di atas mengonfirmasi dua temuan krusial: adanya pola musiman yang berulang dan pertumbuhan tahunan yang pesat. Pertama, kedua tahun menunjukkan bentuk kurva yang serupa, yaitu diawali dengan penyewaan yang rendah di awal tahun (bulan 1 dan 2), kemudian merangkak naik, dan kembali menurun perlahan menjelang akhir tahun (bulan 10 hingga 12).
Namun, jika kita perhatikan secara detail, terdapat dinamika yang menarik. Pada garis biru (2011), rata-rata penyewaan harian memuncak di bulan ke-6 (Juni) pada kisaran 4.800 unit. Sementara itu, pada garis oranye (2012), puncak penyewaan justru bergeser dan mencapai angka maksimalnya di bulan ke-9 (September) yang menyentuh angka sekitar 7.000 unit per hari. Terlepas dari pergeseran puncak tersebut, garis oranye (2012) secara konsisten selalu berada jauh di atas garis biru (2011) di setiap bulannya. Hal ini membuktikan secara solid bahwa layanan penyewaan sepeda ini mengalami pertumbuhan pengguna dan ekspansi bisnis yang sangat positif dari tahun pertama ke tahun kedua.
Dari seluruh grafik yang telah kita buat, kita bisa melihat cerita menarik tentang kebiasaan orang dalam menyewa sepeda. Berikut adalah tiga kesimpulan utamanya:
Cuaca Sangat Menentukan
Orang paling banyak menyewa sepeda saat cuaca sedang cerah, suhunya hangat, dan udaranya terasa pas (tidak terlalu kering atau terlalu lembap). Sebaliknya, jika angin sedang kencang, hujan, atau cuaca ekstrem, jumlah penyewa langsung menurun, bahkan bagi mereka yang biasa bersepeda setiap hari sekalipun.
Beda Tipe Pengguna, Beda Kebiasaan
Pengguna biasa (yang bukan member) sangat mendominasi penyewaan di hari libur. Ini menunjukkan mereka menyewa sepeda murni untuk jalan-jalan atau rekreasi. Di sisi lain, pengguna terdaftar (member) adalah orang orang yang rutin menyewa di hari kerja. Mereka ini adalah komuter yang menjadi tulang punggung penyewaan harian.
Paling Ramai di Pertengahan Tahun & Bisnis Semakin Laris
Penyewaan sepeda selalu punya pola yang sama tiap tahun: sepi di awal dan akhir tahun (karena musim dingin), lalu memuncak dan paling ramai di pertengahan tahun (sekitar bulan Juni hingga September). Selain itu, data juga membuktikan bahwa bisnis bike-sharing ini mengalami pertumbuhan basis pengguna yang konsisten, di mana rata-rata penyewaan pada seluruh bulan di tahun 2012 mengungguli performa pada bulan yang sama di tahun 2011.
Singkatnya, laris tidaknya penyewaan sepeda sangat bergantung pada faktor cuaca dan musim. Namun terlepas dari naik-turunnya cuaca, minat masyarakat untuk bersepeda terbukti terus meningkat dari tahun ke tahun. Pemahaman mendalam terkait interaksi relasional inilah yang menjadi landasan utama bagi seorang analis data untuk merumuskan rekomendasi operasional, seperti mengoptimalkan ketersediaan unit sepeda saat kelembapan moderat di akhir pekan musim panas, atau menyusun strategi promosi saat memasuki siklus musim dingin.