Analisis Data Time Series
Setelah pertemuan ini, mahasiswa diharapkan mampu:
Pertemuan ini dirancang untuk memperkenalkan jenis data yang memiliki dimensi waktu seperti:
Mahasiswa diajarkan komponen utama time series: tren, musiman, dan noise. Tujuannya agar mereka dapat mengenali pola dan membuat visualisasi perubahan data dari waktu ke waktu.
Time Series adalah kumpulan data yang dicatat secara berurutan berdasarkan waktu. Data ini biasanya digunakan untuk:
Pola jangka panjang yang menunjukkan kenaikan atau penurunan data secara umum.
Pola berulang dalam periode waktu tertentu (harian, bulanan, tahunan).
Fluktuasi acak atau tidak teratur yang tidak dapat dijelaskan oleh trend atau seasonal.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Setting untuk visualisasi lebih baik
plt.style.use('seaborn-v0_8-darkgrid')
sns.set_palette("husl")
# Membuat data suhu harian selama 1 tahun
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
np.random.seed(42)
# Simulasi data dengan trend dan seasonal
trend = np.linspace(20, 30, len(dates))
seasonal = 5 * np.sin(2 * np.pi * np.arange(len(dates)) / 365)
noise = np.random.normal(0, 2, len(dates))
temperature = trend + seasonal + noise
df = pd.DataFrame({
'Date': dates,
'Temperature': temperature
})
df.set_index('Date', inplace=True)
print(df.head())
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['Temperature'], linewidth=1, color='steelblue')
plt.title('Data Suhu Harian Tahun 2023', fontsize=16, fontweight='bold')
plt.xlabel('Tanggal', fontsize=12)
plt.ylabel('Suhu (ยฐC)', fontsize=12)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
Moving Average adalah teknik untuk menghaluskan data time series dengan menghitung rata-rata bergerak dalam window tertentu.
# Menghitung Moving Average
df['MA_7'] = df['Temperature'].rolling(window=7).mean() # 7 hari
df['MA_30'] = df['Temperature'].rolling(window=30).mean() # 30 hari
# Visualisasi
plt.figure(figsize=(14, 7))
plt.plot(df.index, df['Temperature'], label='Data Asli', alpha=0.5, linewidth=1)
plt.plot(df.index, df['MA_7'], label='MA 7 Hari', linewidth=2)
plt.plot(df.index, df['MA_30'], label='MA 30 Hari', linewidth=2)
plt.title('Perbandingan Data Asli dengan Moving Average', fontsize=16)
plt.xlabel('Tanggal')
plt.ylabel('Suhu (ยฐC)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
# Menggunakan data saham (contoh simulasi)
# Dalam praktik nyata, gunakan yfinance untuk data real
dates = pd.date_range(start='2022-01-01', end='2023-12-31', freq='D')
np.random.seed(100)
# Simulasi harga saham
base_price = 5000
returns = np.random.normal(0.001, 0.02, len(dates))
price = base_price * (1 + returns).cumprod()
df_stock = pd.DataFrame({
'Date': dates,
'Close': price
})
df_stock.set_index('Date', inplace=True)
# Hitung Rolling Mean
df_stock['MA_20'] = df_stock['Close'].rolling(window=20).mean()
df_stock['MA_50'] = df_stock['Close'].rolling(window=50).mean()
# Visualisasi
plt.figure(figsize=(14, 7))
plt.plot(df_stock.index, df_stock['Close'],
label='Harga Penutupan', alpha=0.7, linewidth=1.5)
plt.plot(df_stock.index, df_stock['MA_20'],
label='MA 20 Hari', linewidth=2)
plt.plot(df_stock.index, df_stock['MA_50'],
label='MA 50 Hari', linewidth=2)
plt.title('Analisis Harga Saham dengan Moving Average', fontsize=16)
plt.xlabel('Tanggal')
plt.ylabel('Harga (Rupiah)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Analisis statistik
print("Statistik Harga Saham:")
print(df_stock['Close'].describe())
print(f"\nReturn Harian Rata-rata: {df_stock['Close'].pct_change().mean():.4%}")
print(f"Volatilitas: {df_stock['Close'].pct_change().std():.4%}")
Mahasiswa memahami bagaimana membaca dan menafsirkan perubahan data seiring waktu serta potensi penggunaan data time series untuk peramalan. Moving Average membantu mengidentifikasi tren jangka panjang dan sinyal beli/jual dalam trading.
yfinance untuk download data saham realstatsmodels# Install library terlebih dahulu
# !pip install yfinance
import yfinance as yf
# Download data saham BBRI
data = yf.download("BBRI.JK", start="2022-01-01", end="2023-12-31")
print(data.head())