11/2/2025 module-machine-learning - rev.
md
Modul 11: Pembelajaran Mesin (Machine Learning)
Analisis Pola Penggunaan Sepeda Berbagi (Bike-
Sharing)
Capaian Pembelajaran
Mengkaji dan menjelaskan perbedaan supervised dan unsupervised machine learning
Mengevaluasi prediksi output numerik dari hasil supervised learning
Menggunakan K-Means untuk segmentasi data kota dan menafsirkan hasil clustering
Ringkasan Modul
Modul ini akan memandu Anda melalui proses analisis data bike-sharing menggunakan Google Colab. Anda
akan belajar bagaimana cara mengeksplorasi data, membangun model machine learning sederhana, dan
menginterpretasikan hasilnya.
Platform: Google Colab Bahasa: Python Pustaka: Pandas, Matplotlib, Seaborn, Scikit-learn Durasi: 3 x 50
Menit
Pengantar: Memprediksi Permintaan Sepeda dengan Machine Learning
Machine Learning (ML) adalah teknik yang memungkinkan komputer untuk "belajar" dari data historis guna
menemukan pola dan membuat prediksi. Dalam modul ini, kita akan menerapkan ML pada data bike sharing,
layanan pemakaian sepeda bersama, untuk tujuan yang sangat praktis: memprediksi permintaan.
Sebagai operator layanan, kemampuan memprediksi berapa banyak sepeda yang akan disewa pada waktu
dan kondisi tertentu sangatlah berharga. Informasi ini dapat membantu optimasi alokasi sepeda, penjadwalan
perawatan, hingga strategi promosi. Kita akan membangun model yang belajar dari data cuaca dan waktu
untuk memprediksi jumlah total sepeda yang disewa.
Setiap baris data yang kita miliki—yang mencatat kondisi pada satu jam tertentu—disebut sebagai instance
atau sampel. Dari setiap instance inilah model kita akan "belajar".
BAGIAN 1: SUPERVISED LEARNING (PREDIKSI
PERMINTAAN)
Konsep Supervised Learning
Supervised Learning atau Pembelajaran Terarah adalah pendekatan di mana kita melatih model
menggunakan data yang sudah memiliki "jawaban" atau "label" yang benar. Anggap saja seperti belajar
dengan seorang guru yang memberikan contoh soal beserta jawabannya.
Ciri Utama: Data yang digunakan adalah data berlabel. Artinya, setiap baris data (instance) memiliki
variabel input (fitur) dan satu variabel output yang ingin diprediksi (target).
1 / 11
11/2/2025 module-machine-learning - [Link]
Tujuan: Tujuannya adalah agar model belajar memetakan hubungan antara fitur dan target, sehingga
ia bisa memprediksi target untuk data baru yang belum pernah dilihat sebelumnya.
Contoh Kita: Dalam bagian ini, kita akan memprediksi jumlah sewa sepeda (cnt, sebagai target)
berdasarkan data cuaca dan waktu (hr, temp, dll., sebagai fitur). Ini adalah contoh masalah regresi,
salah satu jenis supervised learning.
Sesi 1: Eksplorasi Data
Tujuan:
Mengimpor data bike-sharing.
Melakukan Analisis Data Eksplorasi (EDA) untuk menemukan pola awal.
Langkah-langkah:
1. Mempersiapkan Google Colab
Buka [Link]
Buat Notebook baru dengan mengklik File > New notebook.
Beri nama notebook Anda, misalnya "Analisis Bike Sharing - (NIM, Nama Anda)".
Kenali antarmuka dasar: sel kode (code cell) dan sel teks (text cell).
2. Mengunduh dan Memuat Data
Di dalam sel kode, gunakan perintah berikut untuk mengunduh dataset bike-sharing dari sumber
publik. Kita akan menggunakan dataset dari Capital Bikeshare.
# Perintah 'wget' untuk mengunduh file dari URL yang diberikan.
!wget [Link]
databases/00275/[Link]
# Perintah 'unzip' untuk mengekstrak konten dari file .zip yang baru
saja diunduh.
!unzip [Link]
Impor pustaka Pandas dan muat dataset [Link] ke dalam DataFrame.
# Mengimpor pustaka pandas, yang merupakan standar untuk manipulasi dan
analisis data.
import pandas as pd
# Membaca data dari file '[Link]' dan memuatnya ke dalam struktur
data DataFrame.
df = pd.read_csv('[Link]')
# Menampilkan lima baris pertama dari DataFrame untuk mendapatkan
gambaran awal isi data.
[Link]()
2 / 11
11/2/2025 module-machine-learning - [Link]
Memahami Data: Metadata
Sebelum melangkah lebih jauh, mari kita pahami setiap kolom dalam dataset kita. Metadata ini memberikan
konteks penting untuk setiap variabel.
instant: Indeks rekaman (record index)
dteday: Tanggal pencatatan data
season: Musim (1: dingin, 2: semi, 3: panas, 4: gugur)
yr: Tahun (0: 2011, 1: 2012)
mnth: Bulan (1 hingga 12)
hr: Jam (0 hingga 23)
holiday: Apakah hari tersebut hari libur atau bukan
weekday: Hari dalam seminggu
workingday: Jika hari itu bukan akhir pekan atau hari libur, nilainya 1, jika tidak 0.
weathersit: Kondisi cuaca:
1: Cerah, Sedikit berawan, Berawan sebagian
2: Kabut + Berawan, Kabut + Awan pecah, Kabut
3: Salju Ringan, Hujan Ringan + Badai Petir
4: Hujan Lebat + Badai Petir, Salju + Kabut
temp: Suhu ternormalisasi dalam Celsius.
atemp: Suhu "perasaan" (feels like) ternormalisasi dalam Celsius.
hum: Kelembapan ternormalisasi.
windspeed: Kecepatan angin ternormalisasi.
casual: Jumlah pengguna biasa (tidak terdaftar)
registered: Jumlah pengguna terdaftar
cnt: Jumlah total sepeda yang disewa (casual + registered)
3. Analisis Data Eksplorasi
Gunakan [Link]() dan [Link]() untuk mendapatkan ringkasan statistik dari data.
Periksa nilai yang hilang dengan [Link]().sum().
Hitung total sepeda yang disewa per hari untuk mendapatkan gambaran agregat.
# Menghitung total sepeda yang disewa per hari dengan mengelompokkan
berdasarkan 'dteday' dan menjumlahkan 'cnt'.
daily_counts = [Link]('dteday')['cnt'].sum()
# Menampilkan beberapa baris pertama dari total harian.
print("Total Sepeda Disewa per Hari:")
print(daily_counts)
Visualisasikan jumlah total peminjaman sepeda per hari untuk melihat tren jangka panjang
(Opsional).
# Mengimpor pustaka [Link] dan seaborn untuk visualisasi.
import [Link] as plt
import seaborn as sns
import [Link] as mdates # untuk memformat sumbu X tanggal
3 / 11
11/2/2025 module-machine-learning - [Link]
# Membuat kanvas plot dengan ukuran 15x7 inci untuk menampung data time
series yang panjang.
[Link](figsize=(15, 7))
# Membuat plot garis menggunakan seaborn.
# Sumbu x adalah indeks dari 'daily_counts' (yaitu, tanggal).
# Sumbu y adalah nilai dari 'daily_counts' (yaitu, total sewa harian).
[Link](x=daily_counts.index, y=daily_counts.values)
# Menetapkan judul plot yang deskriptif.
[Link]('Jumlah Total Peminjaman Sepeda per Hari')
# Memberi label pada sumbu horizontal.
[Link]('Tanggal')
# Memberi label pada sumbu vertikal.
[Link]('Jumlah Total Sewa')
# Mengatur format label sumbu x agar hanya menampilkan bulan dan tahun.
[Link]().xaxis.set_major_formatter([Link]('%b %Y'))
# Mengatur agar label tanggal pada sumbu x ditampilkan dengan rotasi 45
derajat agar tidak tumpang tindih.
[Link](rotation=45)
# Menyesuaikan layout untuk memastikan semua elemen plot (seperti
label) terlihat dengan baik.
plt.tight_layout()
# Menampilkan plot.
[Link]()
Buat visualisasi lain untuk melihat pola berdasarkan musim (season) atau hari (weekday).
Sesi 2: Persiapan Data dan Pembangunan Model
Tujuan:
Membersihkan dan mempersiapkan data untuk pemodelan.
Membagi data menjadi set pelatihan dan pengujian.
Melatih model regresi linear sederhana.
Langkah-langkah:
1. Pemilihan Fitur
Selanjutnya, kita perlu memberi tahu model kita mana variabel yang menjadi "petunjuk" (disebut
fitur atau features) dan mana variabel yang harus diprediksi (disebut target). Istilah "fitur" dan
"target" ini sama saja dengan istilah variabel independen dan variabel dependen, atau
variabel prediktor dan variabel respons dalam analisis regresi linear.
Fitur adalah input yang kita berikan ke model. Untuk memulai, kita akan menggunakan hr (jam),
temp (suhu), hum (kelembapan), dan windspeed (kecepatan angin).
Target adalah output yang kita ingin model prediksi. Dalam kasus ini, target kita adalah cnt
(jumlah total sewa).
4 / 11
11/2/2025 module-machine-learning - [Link]
features = ['hr', 'temp', 'hum', 'windspeed']
target = 'cnt'
2. Membagi Data
Kita akan menggunakan Scikit-learn (disingkat sklearn), pustaka machine learning paling
populer di Python, untuk membantu kita. Pustaka ini menyediakan berbagai alat untuk
membangun dan mengevaluasi model.
Impor fungsi train_test_split dari Scikit-learn. Fungsi ini berguna untuk membagi data kita
menjadi dua set: satu untuk melatih model (data pelatihan) dan satu lagi untuk menguji seberapa
baik performanya (data pengujian).
Kita akan membagi data dengan proporsi 80% untuk data pelatihan dan 20% untuk data
pengujian.
# (Opsional) Instal pustaka scikit-learn jika Anda menjalankan ini di
lingkungan seperti Google Colab
# dan belum menginstalnya. Hapus tanda '#' jika ingin mengaktifkan
baris ini.
# !pip install scikit-learn
# Mengimpor fungsi 'train_test_split' dari modul 'model_selection' di
scikit-learn.
from sklearn.model_selection import train_test_split
# Memisahkan DataFrame kita menjadi dua bagian: X (kumpulan fitur) dan
y (target).
X = df[features]
y = df[target]
# Membagi data fitur (X) dan data target (y) menjadi set pelatihan dan
set pengujian.
# 'test_size=0.2' berarti 20% dari data akan digunakan untuk pengujian,
dan 80% untuk pelatihan.
# 'random_state=42' memastikan bahwa pembagian data akan selalu sama
setiap kali kode ini dijalankan, untuk reproduktifitas.
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=42)
3. Melatih Model Regresi Linear
Impor LinearRegression dari sklearn.linear_model.
Latih model menggunakan data pelatihan.
Ketika kita menulis model = LinearRegression(), kita mungkin bertanya, 'Kenapa tidak ada
angka atau pengaturan khusus di dalam kurung?' Ini karena LinearRegression dari Scikit-learn
sudah sangat pintar. Secara default, ia sudah tahu cara melakukan regresi linear yang paling
umum. Ibaratnya, Anda membeli sebuah alat elektronik baru; Anda bisa langsung
menyalakannya dan ia akan bekerja dengan pengaturan standar yang sudah bagus. Anda tidak
perlu mengubah apa pun kecuali jika Anda punya kebutuhan yang sangat spesifik. Jadi, dengan
5 / 11
11/2/2025 module-machine-learning - [Link]
membiarkan kurung itu kosong, kita memberitahu Python untuk menggunakan pengaturan
bawaan yang sudah optimal untuk kebanyakan kasus.
# Mengimpor kelas 'LinearRegression' dari modul 'linear_model' di
scikit-learn.
from sklearn.linear_model import LinearRegression
# Membuat sebuah objek atau 'instance' dari model Regresi Linear.
# Karena kurungnya kosong, model akan menggunakan pengaturan bawaan
yang sudah optimal.
model = LinearRegression()
# Melatih model ('fit') menggunakan data fitur pelatihan (X_train) dan
data target pelatihan (y_train).
# Di sinilah proses "belajar" dari data terjadi.
[Link](X_train, y_train)
Sesi 3: Evaluasi Model dan Interpretasi
Tujuan:
Mengevaluasi performa model.
Menginterpretasikan koefisien model.
Mendiskusikan implikasi dari hasil analisis.
Langkah-langkah:
1. Membuat Prediksi
Gunakan model yang telah dilatih untuk membuat prediksi pada data pengujian.
# Menggunakan model yang sudah dilatih untuk membuat prediksi pada data
fitur pengujian (X_test).
# Model akan menghasilkan prediksi nilai target berdasarkan fitur yang
diberikan.
y_pred = [Link](X_test)
2. Evaluasi Model
Impor metrik evaluasi seperti Mean Absolute Error (MAE) dan R-squared (R²).
Hitung dan cetak skor evaluasi.
# Mengimpor dua metrik evaluasi dari scikit-learn.
from [Link] import mean_absolute_error, r2_score
# Menghitung Mean Absolute Error (MAE) dengan membandingkan nilai
target sebenarnya (y_test) dengan nilai yang diprediksi model (y_pred).
6 / 11
11/2/2025 module-machine-learning - [Link]
mae = mean_absolute_error(y_test, y_pred)
# Menghitung R-squared (R²) untuk mengukur seberapa baik model kita
menjelaskan variasi dalam data.
r2 = r2_score(y_test, y_pred)
# Mencetak nilai MAE, diformat menjadi dua angka desimal.
print(f'Mean Absolute Error: {mae:.2f}')
# Mencetak nilai R-squared, diformat menjadi dua angka desimal.
print(f'R-squared: {r2:.2f}')
Diskusikan apa arti dari skor-skor ini. R² yang lebih mendekati 1 menandakan model yang lebih
baik. MAE menunjukkan rata-rata kesalahan prediksi.
3. Interpretasi Model
Lihat koefisien dari model regresi linear untuk memahami bagaimana setiap fitur memengaruhi
jumlah penyewaan.
# Membuat DataFrame pandas untuk menampilkan koefisien regresi.
# 'model.coef_' adalah atribut dari model yang berisi nilai koefisien
untuk setiap fitur.
# Kita memasangkannya dengan nama fitur untuk interpretasi yang lebih
mudah.
coefficients = [Link](model.coef_, features, columns=
['Coefficient'])
# Mencetak DataFrame yang berisi koefisien tersebut.
print(coefficients)
Koefisien positif menunjukkan hubungan yang positif (misalnya, semakin tinggi suhu, semakin
banyak sepeda disewa), dan sebaliknya.
BAGIAN 2: UNSUPERVISED LEARNING (MENEMUKAN
POLA PENGGUNA)
Konsep Unsupervised Learning
Unsupervised Learning atau Pembelajaran Tak Terarah adalah pendekatan di mana model belajar dari data
yang tidak memiliki label atau "jawaban" yang telah didefinisikan sebelumnya. Berbeda dengan supervised
learning, tidak ada variabel target.
Ciri Utama: Data yang digunakan adalah data tidak berlabel. Model tidak diberi tahu apa yang harus
dicari.
Tujuan: Tujuannya adalah agar model secara mandiri menemukan struktur, pola, atau pengelompokan
tersembunyi di dalam data.
Contoh Kita: Dalam bagian ini, kita tidak akan memprediksi jumlah sewa. Sebaliknya, kita akan
meminta model untuk mengelompokkan hari-hari berdasarkan pola penggunaan sepeda per jam untuk
7 / 11
11/2/2025 module-machine-learning - [Link]
menemukan "tipe hari" yang berbeda secara alami. Ini adalah contoh masalah clustering.
Sesi 4: Menemukan Pola dengan Clustering
Tujuan:
Mempersiapkan data untuk clustering.
Membangun model K-Means untuk mengelompokkan data.
Menganalisis dan menginterpretasikan cluster yang terbentuk.
Langkah-langkah:
1. Rekayasa Fitur (Feature Engineering)
Sebelum melakukan clustering, kita perlu memastikan kolom dteday memiliki tipe data yang
benar karena akan kita gunakan sebagai indeks.
Tampilkan tipe data kolom-kolom kita dengan perintah [Link](). Akan terlihat bahwa
kolom dteday masih bertipe object.
Ubah tipe data dteday menjadi format tanggal ('datetime')
# Mengubah tipe data kolom 'dteday' dari teks (object) menjadi
format tanggal (datetime).
# Ini memungkinkan kita untuk melakukan operasi berbasis waktu,
seperti menjadikannya indeks.
df['dteday'] = pd.to_datetime(df['dteday'])
2. Mempersiapkan Data untuk Clustering
Untuk mengelompokkan hari, kita perlu mengubah bentuk data kita. Saat ini, setiap baris adalah
satu jam. Kita perlu membuat setiap baris menjadi satu hari unik, dengan kolom-kolom yang
mewakili jumlah sewa pada setiap jam (0-23).
Kita bisa melakukannya dengan pivot_table. Kita juga akan mengisi nilai yang hilang (jika ada)
dengan 0.
# Mengubah struktur data dari format 'panjang' (satu baris per jam) ke
format 'lebar'.
# 'index="dteday"' membuat setiap baris menjadi satu hari unik.
# 'columns="hr"' membuat 24 kolom baru, satu untuk setiap jam.
# 'values="cnt"' mengisi sel dengan jumlah sewa ('cnt').
# 'fill_value=0' mengganti nilai yang tidak ada (NaN) dengan 0.
daily_patterns = df.pivot_table(index='dteday', columns='hr', values='cnt',
fill_value=0)
# Menampilkan lima baris pertama dari tabel pivot yang baru untuk memeriksa
hasilnya.
daily_patterns.head()
8 / 11
11/2/2025 module-machine-learning - [Link]
3. Membangun Model Clustering (K-Means)
Kita akan menggunakan K-Means, salah satu algoritma clustering yang paling populer. K-Means
akan mengelompokkan data ke dalam sejumlah K cluster yang kita tentukan.
Untuk contoh ini, mari kita coba mengelompokkan hari-hari ke dalam 4 tipe berbeda.
Bagaimana Cara Menentukan Jumlah Cluster (K) yang Optimal? (Opsional)
Salah satu tantangan dalam K-Means adalah memilih nilai K yang tepat. Salah satu metode
yang paling umum digunakan adalah Metode Siku (Elbow Method).
Idenya adalah menjalankan K-Means untuk berbagai nilai K (misalnya, dari 1 hingga 10)
dan menghitung inertia untuk setiap K. Inertia adalah jumlah kuadrat jarak dari setiap titik
data ke pusat cluster terdekatnya. Semakin kecil nilainya, semakin padat clusternya.
Ketika kita memplot inertia terhadap nilai K, grafiknya sering kali terlihat seperti lengan.
"Siku" pada lengan tersebut—titik di mana penurunan inertia mulai melambat secara
signifikan—adalah kandidat yang baik untuk nilai K yang optimal.
# Menyiapkan list untuk menyimpan nilai inertia
inertia = []
# Menentukan rentang K yang akan diuji
K_range = range(1, 11)
for k in K_range:
# Membuat model KMeans untuk setiap nilai k
kmeans_model = KMeans(n_clusters=k, random_state=42, n_init=10)
# Melatih model
kmeans_model.fit(daily_patterns)
# Menyimpan nilai inertia
[Link](kmeans_model.inertia_)
# Membuat plot untuk metode siku
[Link](figsize=(10, 6))
[Link](K_range, inertia, marker='o', linestyle='--')
[Link]('Metode Siku untuk Menentukan K Optimal')
[Link]('Jumlah Cluster (K)')
[Link]('Inertia')
[Link](K_range)
[Link](True)
[Link]()
Dari plot di atas, kita bisa mencari "siku" di mana penurunan inertia tidak lagi drastis.
Misalnya, jika siku terlihat di K=3 atau K=4, itu menunjukkan bahwa penambahan cluster
setelah titik tersebut tidak memberikan peningkatan kualitas cluster yang signifikan. Untuk
analisis ini, kita akan tetap menggunakan K=4, yang sering kali merupakan pilihan yang
baik untuk menemukan pola dasar seperti hari kerja, akhir pekan, cuaca buruk, dan hari
libur.
9 / 11
11/2/2025 module-machine-learning - [Link]
# Mengimpor kelas KMeans dari modul cluster di scikit-learn.
from [Link] import KMeans
# Menentukan jumlah cluster (kelompok) yang ingin kita temukan dalam data.
K = 4
# Membuat instance model KMeans.
# 'n_clusters=K' menetapkan jumlah cluster yang kita inginkan.
# 'random_state=42' untuk hasil yang konsisten setiap kali dijalankan.
# 'n_init=10' menjalankan algoritma 10 kali dengan titik pusat awal yang
berbeda dan memilih hasil terbaik, ini penting untuk stabilitas.
kmeans = KMeans(n_clusters=K, random_state=42, n_init=10)
# Melatih model pada data pola harian. Model akan mengelompokkan hari-hari
ke dalam K cluster.
[Link](daily_patterns)
# Membuat kolom baru 'cluster' di DataFrame kita, yang berisi nomor cluster
(0, 1, 2, atau 3) untuk setiap hari.
daily_patterns['cluster'] = kmeans.labels_
Catatan: n_init=10 ditambahkan untuk menjalankan algoritma beberapa kali dengan titik awal yang
berbeda untuk memastikan hasil yang lebih stabil.
4. Menganalisis dan Memvisualisasikan Cluster
Sekarang bagian yang paling menarik: apa arti dari setiap cluster ini? Kita bisa memahaminya
dengan memvisualisasikan pola penggunaan rata-rata untuk setiap cluster.
# Membuat kanvas plot dengan ukuran yang lebih besar untuk kejelasan.
[Link](figsize=(15, 8))
# Melakukan loop sebanyak K kali (dalam kasus ini, 4 kali, untuk cluster 0,
1, 2, 3).
for i in range(K):
# 1. Memfilter DataFrame untuk mendapatkan semua hari yang termasuk
dalam cluster 'i'.
# 2. Menghapus kolom 'cluster' agar tidak ikut dihitung dalam rata-rata.
# 3. Menghitung nilai rata-rata untuk setiap kolom jam (0-23).
cluster_mean = daily_patterns[daily_patterns['cluster'] ==
i].drop('cluster', axis=1).mean()
# Memplot rata-rata pola penggunaan untuk cluster saat ini sebagai
sebuah garis.
[Link](cluster_mean.index, cluster_mean.values, label=f'Cluster {i}')
# Menambahkan judul dan label untuk membuat plot informatif.
[Link]('Pola Penggunaan Sepeda Rata-Rata per Cluster')
[Link]('Jam dalam Sehari')
[Link]('Rata-Rata Jumlah Sewa')
# Mengatur agar sumbu-x menampilkan semua jam dari 0 hingga 23.
[Link](range(0, 24))
# Menambahkan grid untuk membantu pembacaan nilai.
10 / 11
11/2/2025 module-machine-learning - [Link]
[Link](True)
# Menampilkan legenda untuk mengidentifikasi garis cluster mana.
[Link]()
# Menampilkan plot final.
[Link]()
5. Interpretasi Hasil Cluster
Dengan melihat grafik di atas, kita bisa mulai menafsirkan makna dari setiap cluster. Misalnya,
Anda mungkin akan melihat pola seperti:
Satu cluster dengan dua puncak tajam di pagi dan sore hari, yang kemungkinan besar
mewakili hari kerja (orang pergi-pulang kantor).
Satu cluster dengan puncak tunggal yang lebih landai di siang hingga sore hari, yang
bisa jadi mewakili akhir pekan.
Cluster lain dengan tingkat penggunaan yang secara umum rendah, mungkin
mewakili hari dengan cuaca buruk atau hari libur tertentu.
Analisis unsupervised seperti ini tidak memberikan prediksi, tetapi menghasilkan wawasan
mendalam tentang perilaku pengguna yang dapat digunakan untuk pengambilan keputusan
strategis.
Diskusi dan Kesimpulan Umum
Apa saja wawasan yang bisa didapat dari kedua analisis (supervised dan unsupervised)?
Dari sisi prediksi (supervised): Perencana kota dapat menggunakan model untuk mengantisipasi
lonjakan permintaan, memastikan ketersediaan sepeda pada jam sibuk di lokasi strategis.
Dari sisi pola (unsupervised): Pemahaman tentang "tipe hari" (misalnya, hari kerja vs. akhir pekan)
memungkinkan pembuatan strategi yang berbeda. Contoh: menawarkan paket sewa harian di akhir
pekan atau diskon khusus pada hari-hari yang sepi.
Apa langkah selanjutnya yang bisa dilakukan untuk meningkatkan analisis? (Contoh: menggunakan
lebih banyak fitur, mencoba model yang lebih kompleks, atau menganalisis cluster lebih dalam).
11 / 11