rolling() dan expanding() memberi bobot sama pada setiap observasi di dalam jendelanya. Padahal dalam banyak kasus bisnis, penjualan minggu ini lebih relevan daripada penjualan dua bulan lalu: kondisi pasar berubah, dan data lama kehilangan keterkinannya. ewm() (exponentially weighted functions) menjawab kebutuhan itu dengan memberi bobot terbesar pada data terbaru, lalu bobot menurun secara eksponensial untuk data yang semakin lama. Pada chapter ini kita membaca hasil ewm().mean(), memahami hubungan parameter span dan alpha, serta membandingkan mode koreksi adjust=True dan adjust=False.
Bobot Eksponensial pada Data Terbaru #
Seperti rolling() dan expanding(), method ewm() hanya menyusun konfigurasi window; statistiknya dipanggil setelahnya, misalnya ewm().mean(). Mekanisme bobotnya: nilai terbaru menerima bobot alpha, nilai satu langkah lebih lama menerima bobot alpha × (1 - alpha), dan seterusnya menurun dengan faktor tetap untuk setiap langkah mundur. Rata-rata ewm() adalah rata-rata tertimbang dari seluruh riwayat tersebut. Karena tidak menunggu jendela terkumpul penuh, hasil sudah terisi dari baris pertama, tidak seperti rolling(5) yang menghasilkan NaN untuk empat baris awal.
Skrip berikut menempelkan rata-rata rolling(5) dan ewm(span=5) pada data penjualan sepuluh hari pertama Januari 2026:
import pandas as pd
tanggal = pd.date_range("2026-01-01", "2026-01-10", freq="D")
penjualan = pd.Series(
[200, 202, 284, 286, 208, 210, 212, 214, 216, 298],
index=tanggal,
name="penjualan",
)
banding = pd.DataFrame(
{
"penjualan": penjualan,
"rolling_5hari": penjualan.rolling(5).mean().round(1),
"ewm_span5": penjualan.ewm(span=5).mean().round(1),
}
)
print("Rolling 5 hari vs ewm span 5:")
print(banding)
alpha_setengah = penjualan.ewm(alpha=0.5).mean().round(2)
span_tiga = penjualan.ewm(span=3).mean().round(2)
print("\nalpha=0.5 identik dengan span=3?")
print((alpha_setengah == span_tiga).all())
print("\nEWM rekursif dengan adjust=False:")
print(penjualan.ewm(span=5, adjust=False).mean().round(1))Output yang Dihasilkan:
Rolling 5 hari vs ewm span 5:
penjualan rolling_5hari ewm_span5
2026-01-01 200 NaN 200.0
2026-01-02 202 NaN 201.2
2026-01-03 284 NaN 240.4
2026-01-04 286 NaN 259.4
2026-01-05 208 236.0 239.6
2026-01-06 210 238.0 228.8
2026-01-07 212 240.0 222.9
2026-01-08 214 226.0 219.8
2026-01-09 216 212.0 218.5
2026-01-10 298 230.0 245.5
alpha=0.5 identik dengan span=3?
True
EWM rekursif dengan adjust=False:
2026-01-01 200.0
2026-01-02 200.7
2026-01-03 228.4
2026-01-04 247.6
2026-01-05 234.4
2026-01-06 226.3
2026-01-07 221.5
2026-01-08 219.0
2026-01-09 218.0
2026-01-10 244.7
Freq: D, Name: penjualan, dtype: float64Mari kita telaah baris-baris kuncinya:
- Baris 10-16 (
pd.DataFrame): tiga kolom dibandingkan berdampingan — nilai asli,rolling(5).mean().round(1), danewm(span=5).mean().round(1). - Baris 20-21 (
ewmdua mode):ewm(alpha=0.5)danewm(span=3)masing-masing dihitung lalu dibulatkan dua desimal untuk pemeriksaan kesetaraan. - Baris 23 (
(a == b).all()): membandingkan kedua Series elemen per elemen dan merangkumnya menjadi satu nilai booleanTrueatauFalse. - Baris 26 (
adjust=False): menghitung ulangewm(span=5)dalam mode rekursif untuk melihat perbedaan hasilnya.
Parameter span dan alpha #
Dua parameter itu menyatakan hal yang sama dalam kemasan berbeda. alpha adalah faktor bobot data terbaru secara langsung, dengan syarat 0 < alpha <= 1; semakin besar alpha, semakin responsif hasilnya terhadap nilai terbaru. span adalah cara yang lebih nyaman: pandas menghitung alpha = 2 / (span + 1), sehingga span=3 setara dengan alpha=0.5. Baris alpha=0.5 identik dengan span=3? True pada output membuktikan kesetaraan itu pada data yang sama. Karena itu, aturan praktisnya: pakai span bilangan bulat (5, 10, 20) saat ingin hasil yang mudah dijelaskan ke tim, dan pakai alpha saat nilai peluruhan memang perlu dikontrol presisi.
Perhatikan juga perilaku pada data lonjakan. Saat 2026-01-03 penjualan melonjak ke 284, ewm_span5 langsung naik ke 240.4, sementara pada hari-hari biasa nilainya bertahan di sekitar 218-230. Respons cepat inilah ciri khas bobot eksponensial: lonjakan baru langsung terasa, lalu pengaruhnya perlahan menurun seiring masuknya data berikutnya.
Mode Koreksi dengan adjust #
Parameter adjust mengatur cara bobot dirangkum. Dengan adjust=True (default), seluruh bobot sejak awal data dinormalisasi ulang, sehingga estimasi pada awal data tidak bias. Dengan adjust=False, pandas memakai rumus rekursif buku teks y_t = (1 - alpha) × y_{t-1} + alpha × x_t dengan y_0 = x_0; bobot tidak dinormalisasi ulang sehingga nilai awal masih terbawa pengaruhnya. Itulah sebabnya baris kedua output terakhir menunjukkan 200.7 untuk adjust=False versus 201.2 untuk mode default. Pada data yang panjang, kedua mode konvergen ke hasil serupa — lihat baris terakhir: 244.7 berbanding 245.5.
Referensi pandas.DataFrame.ewm
merinci seluruh parameter termasuk adjust dan batas nilai alpha, dan halaman Windowing operations
membandingkan keluarga window di pandas secara ringkas. Kita kini punya tiga window: rolling() untuk rata-rata bergerak lokal, expanding() untuk akumulasi, dan ewm() untuk respons terhadap data terkini. Chapter berikutnya berpindah dari perhitungan window ke alat perbandingan antarperiode: shift(), yang menggeser nilai agar “kemarin” berdampingan dengan “hari ini”.