Source Dataset: Oil Prices
Dataset: Brent Crude Oil Prices dari https://github.com/datasets/oil-prices
berisi data historis harian harga minyak Brent sejak tahun 1987. Dataset ini digunakan untuk analisis tren harga, evaluasi pasar, serta pemodelan time series dalam sektor energi dan ekonomi global.
Date
menjadi datetime untuk analisis waktuDate
sebagai indexdropna()
untuk menghapus data kosong
# Contoh kode lengkap
import pandas as pd
# 1. Membaca dataset dari URL
df = pd.read_csv("https://raw.githubusercontent.com/datasets/oil-prices/master/data/brent-daily.csv")
# 2. Konversi kolom Date ke format datetime
df['Date'] = pd.to_datetime(df['Date'])
# 3. Set kolom Date sebagai index
df = df.set_index('Date')
# 4. Hapus data kosong (jika ada)
df = df.dropna()
# 5. Lihat informasi struktur data
df.info()
# 6. Cek missing value
df.isnull().sum()
# 7. Statistik deskriptif dasar
df.describe()
# 8. Reset index jika diperlukan (mengembalikan kolom Date)
df.reset_index(inplace=True)
df.head()
read_csv()
: Membaca file CSV dari URL dan menyimpannya sebagai DataFrame.to_datetime()
: Mengonversi kolom string menjadi objek datetime agar dapat digunakan untuk analisis waktu.set_index()
: Mengatur kolom tertentu sebagai index, penting untuk time series.dropna()
: Menghapus baris yang memiliki nilai kosong untuk menjaga kualitas analisis.info()
: Menampilkan jumlah kolom, baris, tipe data, dan memori yang digunakan.describe()
: Menyediakan statistik deskriptif untuk kolom numerik.reset_index()
: Mengembalikan index menjadi kolom biasa untuk fleksibilitas analisis.df.info()
dan jelaskan apa yang Anda pahami dari hasil tersebut.df.isnull().sum()
untuk mengidentifikasi apakah ada kolom kosong.df.describe()
untuk memahami nilai minimum, maksimum, dan rata-rata harga minyak.Dokumentasi Resmi:
Pandas Official Documentation
EDA bertujuan untuk mengeksplorasi data agar kita memahami lebih jauh pola distribusi, outlier, tren musiman, serta potensi korelasi antar variabel. Tahap ini penting sebelum membangun model machine learning.
# Ringkasan statistik deskriptif
print(df.describe())
# Lineplot tren harga minyak
import matplotlib.pyplot as plt
plt.figure(figsize=(12,5))
df['Price'].plot(title='Harga Minyak Harian')
plt.xlabel('Tanggal')
plt.ylabel('Harga (USD)')
plt.grid(True)
plt.show()
# Boxplot untuk mendeteksi outlier
plt.figure(figsize=(6,4))
df.boxplot(column='Price')
plt.title('Boxplot Harga Minyak')
plt.ylabel('Harga (USD)')
plt.show()
# Histogram distribusi harga
df['Price'].hist(bins=30, figsize=(8,5))
plt.title('Distribusi Harga Minyak')
plt.xlabel('Harga (USD)')
plt.ylabel('Frekuensi')
plt.grid(True)
plt.show()
# Deteksi tanggal harga tertinggi dan terendah
tanggal_max = df['Price'].idxmax()
tanggal_min = df['Price'].idxmin()
harga_max = df['Price'].max()
harga_min = df['Price'].min()
print(f"Harga tertinggi: {harga_max:.2f} USD pada {tanggal_max.date()}")
print(f"Harga terendah: {harga_min:.2f} USD pada {tanggal_min.date()}")
describe()
: memberikan statistik dasar seperti mean, median, std, min, dan max.df.describe()
dan tentukan nilai rata-rata dan simpangan baku harga minyak.Price
.idxmax()
dan idxmin()
, lalu bandingkan dengan peristiwa geopolitik yang mungkin berpengaruh.df['2008':'2010']
.Referensi Dokumentasi: Pandas | Matplotlib
Feature engineering adalah proses penting dalam data science yang bertujuan menciptakan fitur baru dari data mentah untuk membantu model machine learning mengenali pola yang tersembunyi. Pada data deret waktu seperti harga minyak, teknik ini sangat berguna untuk mengungkapkan tren, pola musiman (seasonality), dan dinamika harga historis.
# Muat data dan tangani nilai kosong
import pandas as pd
url = "https://raw.githubusercontent.com/datasets/oil-prices/master/data/brent-daily.csv"
df = pd.read_csv(url)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
# Tangani nilai null untuk kolom numerik (Price)
df['Price'] = df['Price'].fillna(df['Price'].mean()) # Imputasi dengan rata-rata
# Tambahkan kolom dengan nilai string yang null untuk contoh (misalnya 'Status')
df['Status'] = ['Aktif' if i%2==0 else None for i in range(len(df))] # Contoh string dengan nilai null
df['Status'] = df['Status'].fillna('Tidak diketahui') # Imputasi string
# Tambahkan fitur waktu
df['Year'] = df.index.year
df['Month'] = df.index.month
df['DayOfWeek'] = df.index.dayofweek
# Tambahkan rata-rata bergulir (Moving Average)
df['Rolling7'] = df['Price'].rolling(7).mean()
df['Rolling30'] = df['Price'].rolling(30).mean()
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
df['Price'].plot(label='Harga Harian', alpha=0.5)
df['Rolling7'].plot(label='Rata-rata 7 Hari', linewidth=2)
df['Rolling30'].plot(label='Rata-rata 30 Hari', linewidth=2)
plt.title('Harga Minyak & Moving Average')
plt.xlabel('Tanggal')
plt.ylabel('Harga (USD)')
plt.legend()
plt.grid(True)
plt.show()
Moving Average membantu mengenali tren seperti:
WeekOfYear
dan Quarter
dari indeks tanggal.Rolling90
dan bandingkan visualnya dengan Rolling30
.groupby('Month')
untuk menghitung rata-rata harga bulanan, lalu tampilkan grafiknya.Rolling30
dan Price
menggunakan df.corr()
dan interpretasikan nilainya.Periode
berdasarkan Year
dengan format 'Q1-2023' dsb dan analisis agregasi berdasarkan itu.Referensi: Pandas, Matplotlib
Pada tahap ini, kita akan melatih model prediksi menggunakan teknik regresi. Regresi dipilih karena variabel target kita berupa angka kontinu, yaitu harga minyak per hari.
Linear Regression digunakan ketika hubungan antara fitur dan target cenderung linier. Sebaliknya, Random Forest Regressor cocok untuk pola data kompleks dan non-linier.
Sebelum memulai pelatihan, penting untuk memisahkan data menjadi data pelatihan dan pengujian untuk menghindari data leakage. Teknik ini dilakukan dengan train_test_split()
.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
# Fitur input dan target
X = df[['Year', 'Month']]
y = df['Price']
# Split data: 80% latih, 20% uji
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Melatih model Linear Regression
model_lr = LinearRegression()
model_lr.fit(X_train, y_train)
# Melatih model Random Forest
model_rf = RandomForestRegressor(random_state=42)
model_rf.fit(X_train, y_train)
DayOfWeek = df.index.dayofweek
. Ubah X
menjadi ["Year", "Month", "DayOfWeek"]
.from sklearn.metrics import r2_score
dan tampilkan skor R2 pada data uji dari kedua model.test_size
menjadi 0.3 dan bandingkan akurasi.plt.scatter(y_test, y_pred)
untuk melihat kecocokan prediksi dengan nilai aktual.Dokumentasi Referensi: Linear Regression, Random Forest
Validasi model bertujuan untuk mengevaluasi seberapa baik model memprediksi data yang belum pernah dilihat sebelumnya. Dua metrik umum untuk regresi adalah:
Referensi mendalam tentang metrik evaluasi regresi: Mastering Regression Evaluation Metrics
from sklearn.metrics import mean_squared_error, r2_score
# Prediksi menggunakan data uji
pred_lr = model_lr.predict(X_test)
pred_rf = model_rf.predict(X_test)
# Evaluasi Linear Regression
print("Linear Regression")
print("R2 Score:", r2_score(y_test, pred_lr))
print("MSE:", mean_squared_error(y_test, pred_lr))
# Evaluasi Random Forest
print("Random Forest")
print("R2 Score:", r2_score(y_test, pred_rf))
print("MSE:", mean_squared_error(y_test, pred_rf))
Gunakan matplotlib
untuk membandingkan nilai prediksi dan aktual:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.scatter(y_test, pred_rf, alpha=0.5, label='Random Forest')
plt.scatter(y_test, pred_lr, alpha=0.5, label='Linear Regression', color='orange')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
plt.xlabel("Nilai Aktual")
plt.ylabel("Prediksi")
plt.title("Perbandingan Prediksi vs Aktual")
plt.legend()
plt.grid(True)
plt.show()
scatter plot
membantu melihat seberapa dekat prediksi dengan nilai aktual.mean_absolute_error
menggunakan from sklearn.metrics import mean_absolute_error
.DecisionTreeRegressor
dan bandingkan akurasi.plt.hist()
untuk melihat distribusi error dari salah satu model.train_test_split
menjadi 0.5 dan amati perubahan skor R².Dokumentasi Referensi: Evaluasi Model Sklearn
Pada tahap ini, kita melakukan penyempurnaan terhadap model dengan memilih parameter terbaik (hyperparameter tuning) dan menyimpannya agar bisa digunakan kembali.
Hyperparameter adalah parameter yang ditentukan sebelum proses training, seperti n_estimators
dan max_depth
pada Random Forest. Penentuan nilai ini sangat mempengaruhi akurasi dan performa model.
Beberapa pendekatan yang bisa digunakan:
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
param_grid = {
'n_estimators': [50, 100, 150],
'max_depth': [None, 5, 10],
'min_samples_split': [2, 5]
}
gs = GridSearchCV(RandomForestRegressor(), param_grid, cv=5)
gs.fit(X_train, y_train)
print("Best Params:", gs.best_params_)
Setelah mendapatkan model terbaik, kita bisa menyimpannya dengan joblib
:
import joblib
joblib.dump(gs.best_estimator_, "model_rf_best.pkl")
model_loaded = joblib.load("model_rf_best.pkl")
prediksi = model_loaded.predict(X_test)
param_grid
untuk mencoba parameter min_samples_leaf
.Referensi: Dokumentasi GridSearchCV | Penyimpanan Model Sklearn