๐Ÿ“˜ Pertemuan 14

Analisis Data Time Series

Tujuan Pembelajaran

Setelah pertemuan ini, mahasiswa diharapkan mampu:

  • Memahami konsep dasar analisis data deret waktu (time series)
  • Mengidentifikasi tren dan pola musiman pada data
  • Membaca dan menafsirkan perubahan data dari waktu ke waktu
  • Menerapkan teknik moving average untuk smoothing data

Rencana Pembelajaran

Konsep Utama

Pertemuan ini dirancang untuk memperkenalkan jenis data yang memiliki dimensi waktu seperti:

  • Data suhu harian
  • Harga saham
  • Penjualan bulanan
  • Traffic website

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.

Konsep Data Time Series

Apa itu Time Series?

Time Series adalah kumpulan data yang dicatat secara berurutan berdasarkan waktu. Data ini biasanya digunakan untuk:

  • Menganalisis pola historis
  • Menemukan tren jangka panjang
  • Membuat peramalan (forecasting)
  • Mendeteksi anomali
๐Ÿ’ก Contoh Aplikasi:
  • Keuangan: Analisis harga saham, nilai tukar
  • Meteorologi: Prediksi cuaca berdasarkan data historis
  • Bisnis: Forecasting penjualan produk
  • Kesehatan: Tracking perkembangan penyakit

Komponen Time Series

3 Komponen Utama:
1. Trend

Pola jangka panjang yang menunjukkan kenaikan atau penurunan data secara umum.

2. Seasonal

Pola berulang dalam periode waktu tertentu (harian, bulanan, tahunan).

3. Noise

Fluktuasi acak atau tidak teratur yang tidak dapat dijelaskan oleh trend atau seasonal.

Import Library untuk Time Series:
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")

Visualisasi Data Time Series

Membuat Dataset Suhu Harian:
# 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())
Visualisasi Grafik Garis:
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()
Insight: Dari grafik dapat terlihat pola musiman (seasonal pattern) dan tren kenaikan suhu sepanjang tahun.

Moving Average (Smoothing)

Teknik Moving Average:

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()
๐ŸŽฏ Kegunaan Moving Average:
  • Menghilangkan noise dari data
  • Melihat tren jangka panjang lebih jelas
  • Mengidentifikasi turning point
  • Dasar untuk forecasting sederhana

Realisasi / Praktik

Studi Kasus: Analisis Harga Saham
# 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%}")
๐Ÿ“Š Interpretasi:

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.

Tugas Mandiri

Latihan Praktik
  1. Pilih salah satu dataset time series (suhu, saham, atau penjualan)
  2. Buat visualisasi grafik garis untuk melihat pola data
  3. Hitung Moving Average dengan window 7, 14, dan 30
  4. Bandingkan data asli dengan hasil smoothing
  5. Identifikasi tren (naik/turun) dari data
  6. Tuliskan kesimpulan dari analisis time series yang dilakukan
๐Ÿ’ก Tips:
  • Gunakan yfinance untuk download data saham real
  • Eksplorasi seasonal decomposition dengan statsmodels
  • Coba buat prediksi sederhana dengan trend line
Bonus: Download Data Saham Real
# 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())