انتقل إلى المحتوى الرئيسي

الوحدة 3 — الاستقرارية، والتفاضل، والارتباط الذاتي

تُبنى معظم النماذج الإحصائيّة الكلاسيكيّة (ARIMA وأخواتها) على فرضيّة الاستقرارية: أن تكون الخصائص الإحصائيّة للسلسلة ثابتة عبر الزمن. مبيعات صيدليّاتنا الخام ليست كذلك — فيها اتّجاه، وموسميّة سنويّة قويّة — ولا يمكن تمرير ARIMA عليها كما هي. هذه الوحدة تشرح كيف نُشخّص عدم الاستقرارية، وكيف نُحوّل السلسلة إلى شكل مُستقرّ عبر التفاضل، وكيف نقرأ دوالّ الارتباط الذاتي لاختيار رتب النموذج بذكاء بدلًا من التخمين.

ثلاث درجات من الاستقرارية

يُفرَّق بين ثلاثة مفاهيم يجب عدم خلطها. الاستقرارية الشديدة تشترط أن يكون توزيع أيّ نافذة من السلسلة مستقلًّا عن مكانها الزمنيّ، وهي فرضيّة نظريّة صعبة يندر التحقّق منها. أمّا الاستقرارية الضعيفة (أو من الرتبة الثانية) فتشترط أن يكون المتوسّط ثابتًا، والتباين ثابتًا، وأن يعتمد الارتباط الذاتي بين yty_t وytky_{t-k} على kk فقط، لا على tt. هذه هي الفرضيّة العمليّة التي تعتمد عليها ARIMA. وأخيرًا، تصف الاستقرارية حول اتّجاه سلسلةً ذات اتّجاه حتميّ يمكن نزعه بانحدار على الزمن، بخلاف السلسلة المتكاملة التي يزيلها التفاضل وحده. الفرق بين هذين النوعين يقود إلى قرار مختلف: نزع اتّجاه بانحدار، أو تفاضل.

اختبار ADF: قرار عدديّ لا حكم بصريّ

اختبار Augmented Dickey-Fuller (ADF) هو أشيع اختبار للاستقرارية. الفرضيّة الصفر (H0) هي وجود جذر وحدة، أي عدم الاستقرارية؛ الفرضيّة البديلة هي الاستقرارية. نرفض H0 (ونعتبر السلسلة مستقرّة) حين تكون القيمة p أصغر من 0.05.

import pandas as pd
from statsmodels.tsa.stattools import adfuller

df = pd.read_csv("ventes_pharmacies.csv", parse_dates=["date"])
serie = df.set_index("date")["ventes_totales"].asfreq("D")

def afficher_adf(x, nom):
stat, p, *_ = adfuller(x.dropna())
print(f"{nom:20s} | ADF={stat:7.3f} | p={p:.4f} | " +
("مستقرّة" if p < 0.05 else "غير مستقرّة"))

afficher_adf(serie, "السلسلة الخام")
afficher_adf(serie.diff(1), "تفاضل بسيط")
afficher_adf(serie.diff(1).diff(7), "بسيط + موسميّ")

نتيجة نموذجيّة على مبيعاتنا: السلسلة الخام تعطي p ≈ 0.7 (غير مستقرّة، اتّجاه)؛ التفاضل البسيط يخفض p إلى ≈ 0.02 (يقارب الاستقرارية لكن يبقى ما هو موسميّ)؛ إضافة تفاضل موسميّ لـ7 خطوات ينزل p إلى ≈ 0.0001 (سلسلة مستقرّة تمامًا وجاهزة لـSARIMA).

ملاحظتان مهمّتان. أوّلًا، قوّة ADF منخفضة أمام تناوبات بطيئة: عدم رفض H0 لا يعني بالضرورة عدم الاستقرارية، بل ربّما نقص أدلّة. لذا يُوصى بجمع ADF مع اختبار KPSS ذي الفرضيّة الصفرية المعكوسة، وقراءة الاثنين. ثانيًا، الحكم البصريّ يبقى مفيدًا: رسم السلسلة قبل الاختبار وبعده يمنع خطأ عدديًّا صرفًا (مثل ثبات المتوسّط على مستوى واحد لكن مع تباين متضخّم).

التفاضل: بسيط وموسميّ

التفاضل البسيط يحسب Δyt=ytyt1\Delta y_t = y_t - y_{t-1}، ويُزيل الاتّجاه من الرتبة الأولى. الرتبة التي نحتاجها تُسمّى dd في ARIMA(p, d, q)، وقيمتها الشائعة 0 أو 1 (وأحيانًا 2، نادرًا 3). كلّما زدنا dd خسرنا بيانات (نقطة لكلّ تفاضل) وزاد ضجيج البواقي، فلا نُبالغ.

التفاضل الموسميّ يحسب Δsyt=ytyts\Delta_s y_t = y_t - y_{t-s}، حيث ss فترة الموسميّة (7 لدينا). يُزيل هذا التفاضل الموسميّة الحتميّة، ورتبته DD في SARIMA. غالبًا D=1D = 1 يكفي؛ ونادرًا نحتاج إلى D=2D = 2.

يجمع النموذج الفعّال بين الاثنين حين تُوجد الاتّجاه والموسميّة معًا، كما في مبيعاتنا:

serie_diff = serie.diff(1).diff(7).dropna()
# السلسلة الآن مستقرّة تقريبًا؛ نبني عليها ACF وPACF.

قراءة ACF وPACF: خارطة لاختيار الرتب

بعد التفاضل تصبح السلسلة قابلة للفحص بدالّتين اثنتين. ACF (Auto-Correlation Function) تُظهر الارتباط بين yty_t وytky_{t-k} لكلّ تأخّر kk؛ وPACF (Partial ACF) تُظهر الارتباط المتبقّي بعد إزالة أثر التأخّرات الأصغر.

القراءة الكلاسيكيّة تُلخَّص في جدول تُحفظ ملامحه:

النمطيقترح
ACF ينحدر تدريجيًا، PACF يُقطَع بعد ppنموذج AR(p)
ACF يُقطَع بعد qq، PACF ينحدر تدريجيًانموذج MA(q)
كلتاهما تنحدر تدريجيًانموذج ARMA(p, q) مختلط
قمّة كبيرة عند k=sk = s على ACFمكوّنة موسميّة لم تُزَل بعد
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
plot_acf(serie_diff, lags=40, ax=axes[0])
plot_pacf(serie_diff, lags=40, ax=axes[1])
plt.tight_layout()

على مبيعاتنا بعد التفاضل المزدوج، غالبًا ما نرى: PACF ينقطع بعد التأخّر 1 أو 2 (يقترح p=1p = 1 أو 22)، وACF ينقطع بعد التأخّر 1 (يقترح q=1q = 1)، وقمّة صغيرة متبقّية عند k=7k = 7 (تقترح مكوّنة MA موسميّة Q=1Q = 1). فالنموذج المرشّح هو SARIMA(1, 1, 1)(0, 1, 1)7_7، وهو ما سنُختبره في الوحدة 5.

ADF على سلسلة مُفكَّكة موسميًا

لا تُطبّق ADF على سلسلة موسميّة قويّة قبل التفاضل الموسميّ: سيرفض H0 بسبب الموسميّة نفسها، فتعتقد أنّ السلسلة مستقرّة وتغفل الحاجة إلى D=1D = 1. الترتيب الصحيح: تفاضل موسميّ أوّلًا (إن وُجدت موسميّة)، ثمّ ADF، ثمّ تفاضل بسيط عند الحاجة.

الخلاصة

  • الاستقرارية الضعيفة هي فرضيّة ARIMA العمليّة: متوسّط ثابت، وتباين ثابت، وارتباط ذاتي يعتمد على المسافة الزمنيّة فقط.
  • ADF يقرّر عدديًا (p < 0.05 = مستقرّة)؛ ندعمه بـKPSS ولا نستغني عن الرسم البصريّ.
  • التفاضل البسيط يزيل الاتّجاه (dd)، والتفاضل الموسميّ يزيل الموسميّة (DD)؛ نجمع الاثنين عند الحاجة.
  • ACF وPACF بعد التفاضل تُوجّه اختيار (p,q)(p, q) و(P,Q)(P, Q)؛ الجدول أعلاه يكفي لبناء المرشّح الأوّل.

الوحدة التالية: قبل قياس أيّ نموذج متقدّم، نُثبّت النماذج المرجعيّة التي عليها أن تهزمها.