تُعد دراسة السلاسل الزمنية وتحليل أنماطها البنيوية من الركائز الأساسية في الإحصاء التطبيقي، وعلم البيانات، والنمذجة القياسية الحديثة. وتكمن الصعوبة الجوهرية في تحليل البيانات المعتمدة على الزمن في انتهاكها لفرضية الاستقلالية الإحصائية الكلاسيكية؛ إذ ترتبط المشاهدات الحالية في الغالب بما سبقها من أحداث وملاحظات عبر مسار زمني متصل. وهنا يبرز مفهوم الارتباط الذاتي (Autocorrelation) كأداة رياضية وتشخيصية لا غنى عنها لقياس مدى اعتمادية السلسلة الزمنية على قيمها السابقة عبر فترات إزاحة زمنية متباينة تُعرف بفترات التباطؤ (Lags). ويُشكل فهم هذا المفهوم الخطوة الأولى لتفكيك السلوك الديناميكي للظواهر المعقدة، بدءاً من التقلبات المالية وصولاً إلى التغيرات المناخية والإشارات الحيوية.
مع التطور المتسارع للحوسبة العلمية، أصبحت لغة بايثون (Python) المنصة البرمجية الأكثر شمولاً وكفاءة لتطبيق الحسابات الإحصائية وبناء نماذج التنبؤ المتقدمة. توفر البيئة البرمجية لبايثون، من خلال حزمها القياسية المتخصصة مثل Statsmodels وPandas وNumPy وMatplotlib، منظومة بيئية متكاملة تسمح للمحللين والباحثين بتقدير دوال الارتباط الذاتي بدقة، ورسم المخططات البيانية (Correlograms)، وإجراء الاختبارات الإحصائية الصارمة لتشخيص خصائص البيانات. يتيح هذا الدمج بين النظرية الرياضية والتطبيق البرمجي قدرة فائقة على استخراج الأنماط الخفية ومعالجة التشوهات الإحصائية التي قد تؤدي إلى نتائج مضللة في نماذج التعلم الآلي والانحدار.
يهدف هذا الدليل المرجعي الشامل إلى استعراض الأسس النظرية والرياضية العميقة للارتباط الذاتي، وتفصيل كافة الطرق البرمجية لحسابه وتصوره في بايثون، وصولاً إلى الاختبارات التشخيصية المتقدمة وكيفية توظيف هذه المعرفة في بناء نماذج السلاسل الزمنية مثل نماذج الانحدار الذاتي والمتوسطات المتحركة (ARIMA). سنغطي كافة الجوانب الرياضية والبرمجية بأسلوب أكاديمي دقيق مدعوم بأفضل الممارسات البرمجية والتحليلية.
- 1. الأسس النظرية والرياضية لمفهوم الارتباط الذاتي
- 2. أهمية الارتباط الذاتي في تحليل البيانات الزمنية والسلوكية
- 3. إعداد وتجهيز بيئة العمل في لغة بايثون
- 4. حساب الارتباط الذاتي باستخدام مكتبة Statsmodels
- 5. حساب الارتباط الذاتي باستخدام مكتبة Pandas
- 6. حساب دالة الارتباط الذاتي رياضياً باستخدام NumPy
- 7. التصور البياني لدالة الارتباط الذاتي (Correlogram)
- 8. تفسير مخرجات الارتباط الذاتي وتحليل التباطؤ الزمني
- 9. الارتباط الذاتي الجزئي (PACF) وحسابه في بايثون
- 10. اختبارات الدلالة الإحصائية للارتباط الذاتي
- 11. التعامل مع التحديات الإحصائية: الاستقرارية والموسمية
- 12. تطبيق عملي شامل: تحليل متكامل لبيانات سلاسل زمنية برمجياً
- خاتمة
- References
1. الأسس النظرية والرياضية لمفهوم الارتباط الذاتي
1.1 تعريف الارتباط الذاتي والارتباط التسلسلي
يُعرّف الارتباط الذاتي بأنه المقياس الإحصائي الذي يقيس درجة التشابه الخطي والترابط الديناميكي بين قيم سلسلة زمنية معينة وقيم نفس السلسلة عند فترات زمنية سابقة أو لاحقة. على عكس معامل الارتباط البسيط الذي يقيس العلاقة بين متغيرين مختلفين تماماً، يركز الارتباط الذاتي على استكشاف الذاكرة الداخلية للمتغير الفردي عبر محور الزمن. يُطلق على الفارق الزمني بين النقطة الحالية والنقطة المقارنة مصطلح فترة التباطؤ (Lag)، ويُرمز له رياضياً بالرمز $k$.
تتداخل في الأدبيات الإحصائية ثلاثة مصطلحات متقاربة: الارتباط الذاتي (Autocorrelation)، والارتباط التسلسلي (Serial Correlation)، والارتباط المتخلف (Lagged Correlation). من الناحية الدلالية الدقيقة، يُستخدم مصطلح الارتباط الذاتي في سياق معالجة الإشارات وتحليل العمليات العشوائية المستقرة لوصف الترابط الداخلي بين $X_t$ و$X_{t-k}$. في المقابل، يميل الاقتصاد القياسي إلى استخدام مصطلح الارتباط التسلسلي للإشارة تحديداً إلى وجود ترابط بين حدود الخطأ العشوائي (Residuals) عبر الزمن في نماذج الانحدار الخطي. أما الارتباط المتخلف فهو التعبير الإجرائي العام الذي يصف ربط أي متغير بمتغير آخر مزاح زمنياً.
تُعد دالة الارتباط الذاتي (Autocorrelation Function – ACF) دالة رياضية تأخذ قيمة التباطؤ $k$ كمتغير مستقل، وتُرجع قيمة المعامل كمتغير تابع. تُعبر هذه الدالة عن كيفية اضمحلال أو استمرار الذاكرة الزمنية للعملية العشوائية؛ فالعمليات التي تتمتع بذاكرة طويلة تُظهر قيماً موجبة مرتفعة لمدد تباطؤ طويلة، بينما العمليات ذات الذاكرة القصيرة أو العشوائية البحتة تتلاشى فيها قيم الدالة بسرعة متجهة نحو الصفر.
1.2 الصيغة الرياضية لمعامل الارتباط الذاتي
ينطلق البناء الرياضي للارتباط الذاتي من مفهوم التباين المشترك الذاتي (Autocovariance). في السلسلة الزمنية المستقرة بالمعنى الواسع (Weakly Stationary)، يُعرّف التباين المشترك الذاتي عند فترة التباطؤ $k$، ويُرمز له بالرمز $\gamma_k$، بالمعادلة التالية:
$$\gamma_k = \text{Cov}(Y_t, Y_{t-k}) = \mathbb{E}[(Y_t – \mu)(Y_{t-k} – \mu)]$$
حيث تمثل $\mu$ المتوسط الحسابي الثابت للسلسلة الزمنية عبر الزمن، ويمثل $\mathbb{E}$ القيمة المتوقعة. وعند التباطؤ الصفري ($k=0$)، يُمثل التباين المشترك الذاتي تباين السلسلة الإجمالي ($\gamma_0 = \sigma^2$). يُشتق معامل الارتباط الذاتي عند التباطؤ $k$، والمشار إليه بالرمز $\rho_k$، بقسمة التباين المشترك عند ذلك التباطؤ على التباين الإجمالي للسلسلة:
$$\rho_k = \frac{\gamma_k}{\gamma_0} = \frac{\mathbb{E}[(Y_t – \mu)(Y_{t-k} – \mu)]}{\sigma^2}$$
أما في العينات الفعلية ذات الحجم $N$، يتم تقدير المعامل عبر الصيغة التجريبية القياسية لمعامل ارتباط بيرسون المطبق على البيانات المتخلفة زمنياً:
$$r_k = \frac{\sum_{t=k+1}^{N} (y_t – \bar{y})(y_{t-k} – \bar{y})}{\sum_{t=1}^{N} (y_t – \bar{y})^2}$$
تتمتع قيم $\rho_k$ بخصائص رياضية صارمة؛ حيث يقع نطاقها الحسابي دائماً ضمن المجال المغلق $[-1, +1]$. تشير القيمة $+1$ إلى ارتباط ذاتي إيجابي تام، بينما تشير القيمة $-1$ إلى ارتباط ذاتي سلبي تام، وتدل القيمة $0$ على انعدام الارتباط الخطي التام عند ذلك التباطؤ. كما تتصف دالة الارتباط الذاتي بالتماثل الزوجي، أي أن $\rho_k = \rho_{-k}$.
1.3 دور الارتباط الذاتي في النمذجة الإحصائية والتنبؤ
يمثل الارتباط الذاتي حجر الزاوية في بناء النماذج الإحصائية المتقدمة والتنبؤ بالسلاسل الزمنية. عند بناء نماذج مثل نماذج الانحدار الذاتي والمتوسطات المتحركة (ARMA)، يُعتمد على شكل وسلوك دالة الارتباط الذاتي لتحديد رتبة النموذج ودرجة تعقيده الرياضي. إذا أظهرت السلسلة ارتباطاً ذاتياً مرتفعاً ومستداماً، فإن ذلك يوفر ميزة تنبؤية تتيح استغلال القيم الماضية لتوقع المسار المستقبلي بدقة تفوق النماذج الساذجة.
علاوة على ذلك، يعمل الارتباط الذاتي كأداة كشف تشخيصية قوية للتعرف على الأنماط الخفية في البيانات، مثل الدورات الزمنية والأنماط الموسمية. فالبيانات التي تتكرر فيها الأنماط بانتظام ستُظهر قمم ارتباط دورية عند مضاعفات فترات التباطؤ الموسمية (مثل $k=12$ للبيانات الشهرية السنوية). كما يسمح فحص التباطؤات برصد عدم الاستقرارية؛ فالانحدار الخطي البطيء جداً لدالة ACF يُعد دليلاً قاطعاً على وجود اتجاه عام (Trend) غير مستقر.
يرتبط الارتباط الذاتي وثيقاً بفرضية السير العشوائي (Random Walk) ونظرية العمليات العشوائية المستقرة. في حالة العمليات العشوائية البحتة (الضجيج الأبيض – White Noise)، تكون كافة معاملات الارتباط الذاتي مساوية للصفر إحصائياً لجميع فترات التباطؤ $k ge 1$. يُعد إثبات أو نفي هذه الخاصية الخطوة التحضيرية الأهم لاختبار فرضية كفاءة الأسواق في النظم المالية ولتقييم مدى جودة مخرجات خوارزميات التعلم الآلي.
2. أهمية الارتباط الذاتي في تحليل البيانات الزمنية والسلوكية
2.1 تطبيقات الارتباط الذاتي في العلوم السلوكية والنفسية
في العلوم السلوكية وعلم النفس التجريبي، يُستخدم الارتباط الذاتي لتحليل البيانات اللحظية المجمعة عبر أساليب التقييم اللحظي البيئي (Ecological Momentary Assessment). يتيح قياس الارتباط الذاتي للمتغيرات المزاجية، مثل القلق أو الاكتئاب المقاس عدة مرات يومياً، فهم ما يُعرف بـ الجمود الانفعالي (Emotional Inertia)؛ حيث يشير الارتباط الذاتي المرتفع إلى صعوبة انتقال الفرد من حالة مزاجية إلى أخرى وبطء تعافيه من المشاعر السلبية.
يمتد التطبيق إلى معالجة وتحليل الإشارات الفسيولوجية والطبية المعقدة، مثل إشارات تخطيط كهربية الدماغ (EEG)، وتخطيط كهربية القلب (ECG)، وتقلبات معدل ضربات القلب (HRV). في هذه النطاقات، يُشير التغير في بنية الارتباط الذاتي للإشارات إلى اختلالات وظيفية أو تغيرات في الحالة العصبية؛ حيث يؤدي فقدان التعقيد الديناميكي وتغير التباطؤات الذاتية للإشارات القلبية إلى مؤشرات تشخيصية حول مخاطر اضطراب النظم القلبي.
يُستخدم الارتباط الذاتي أيضاً لقياس درجة النمطية والتكرارية في القرارات البشرية والحركية. عند تتبع حركة الأفراد أو عادات الشراء أو معدلات التفاعل الرقمي مع المنصات التكنولوجية، يكشف الارتباط الذاتي عن السلوكيات الروتينية المتجذرة، مما يسهم في بناء نماذج ذكاء اصطناعي قادرة على تخصيص التجارب الفردية بناءً على الأنماط السلوكية السابقة.
2.2 تطبيقات النمذجة الاقتصادية والبيانات العامة
يمثل الارتباط الذاتي في الاقتصاد القياسي والتحليل المالي أداة أساسية لدراسة سلوك الأسواق المالية وأسعار الأصول. يُستخدم لفحص فرضية كفاءة السوق بصيغتها الضعيفة؛ إذ يُشير وجود ارتباط ذاتي معنوي في عوائد الأسهم إلى إمكانية التنبؤ بحركة الأسعار المستقبلية، مما يتيح بناء استراتيجيات التداول الخوارزمي المعتمدة على الزخم (Momentum) أو الارتداد إلى المتوسط (Mean Reversion).
في مجال الأرصاد الجوية وعلوم البيئة، يُعد الارتباط الذاتي الأداة المعيارية لدراسة سلاسل درجات الحرارة، وتركيزات الغازات الدفيئة، والتغيرات المناخية الموسمية والمتعددة العقود. يسمح قياس الارتباط الذاتي بتحديد مدى استمرارية الظواهر الجوية كالجفاف أو موجات الحر، وفصل التغيرات المناخية الطبيعية الدورية عن الاتجاهات العامة الناتجة عن الأنشطة البشرية.
يحتل فحص الارتباط الذاتي في بواقي نماذج الانحدار الخطي الكلاسيكي (OLS Residuals) مكانة مركزية في التشخيص الإحصائي. وجود ارتباط ذاتي بين البواقي ينتهك فرضية غاوس-ماركوف، مما يجعل مقدرات المربعات الصغرى غير كفؤة، ويؤدي إلى تصغير زائف للأخطاء المعيارية (Standard Errors)، وبالتالي تضخيم إحصاءات $t$ واختبارات $F$ مما يقود إلى استنتاجات مضللة ورفض خاطئ للفرضيات الصفرية.
3. إعداد وتجهيز بيئة العمل في لغة بايثون
3.1 المكتبات الأساسية المطلوبة لتحليل الارتباط الذاتي
يتطلب التحليل الإحصائي المتقدم للسلاسل الزمنية في بايثون منظومة متكاملة من المكتبات العلمية المتخصصة. تُعد مكتبة Statsmodels الحزمة الأساسية للنمذجة القياسية والإحصائية؛ إذ تحتوي على وحدات متقدمة لحساب دوال الارتباط الذاتي البسيطة والجزئية، بالإضافة إلى الاختبارات التشخيصية كاختبارات Ljung-Box وDurbin-Watson.
تُمثل مكتبة Pandas الهيكل التنظيمي لإدارة وتجهيز السلاسل الزمنية؛ حيث توفر كائنات Series وDataFrame ذات الفهارس الزمنية الدقيقة، إلى جانب دوال مدمجة للحساب السريع للارتباطات المزاحة. وتتكامل معها مكتبة NumPy التي تقدم الأساس للعمليات المتجهية والمصفوفية وحساب التحويلات الرياضية مثل تحويل فورييه السريع (FFT).
للتصور البصري، تُستخدم مكتبة Matplotlib جنباً إلى جنب مع مكتبة Seaborn لتوليد مخططات الارتباط البيانية (Correlograms) عالية الدقة مع فترات الثقة الإحصائية. يمكن تثبيت هذه الحزم في بيئة العمل باستخدام مدير الحزم pip عبر الأمر التالي:
pip install numpy pandas statsmodels matplotlib seaborn
3.2 تجهيز السلاسل الزمنية وتنسيق المتجهات
تتطلب الحسابات الدقيقة للارتباط الذاتي تنظيم البيانات الأولية في هياكل متوافقة زمنياً. تبدأ المعالجة بتحويل القوائم البسيطة (Lists) أو المصفوفات الأحادية إلى كائنات pandas.Series مع ربطها بفهرس زمني صريح من نوع DatetimeIndex. يضمن هذا الإجراء الحفاظ على التباعد الزمني المنتظم بين المشاهدات، وهو شرط أساسي لصحة حساب التباطؤات.
يجب فحص التردد الزمني للبيانات وضبطه عبر دوال مثل asfreq() أو resample() للتعامل مع الفواصل الزمنية غير المنتظمة. في حال وجود أيام عطلات أو فترات انقطاع في التسجيل، يؤدي إهمال التردد إلى احتساب تباطؤات غير متساوية فيزيائياً، مما يشوه المعنى النظري لمعامل الارتباط.
تؤثر القيم المفقودة (NaNs) سلباً على الحسابات الرياضية؛ حيث يؤدي وجود قيمة مفقودة واحدة إلى إفساد حساب حاصل الضرب الداخلي للمتجهات المزاحة. يجب معالجة هذه القيم إما بالحذف الحذر للملاحظات المتأثرة عبر dropna()، أو باستخدام تقنيات الاستيفاء الخطي (Interpolation) والتعويض المناسب لطبيعة الظاهرة المدروسة قبل الشروع في حساب معاملات الارتباط.
4. حساب الارتباط الذاتي باستخدام مكتبة Statsmodels
4.1 استخدام الدالة sm.tsa.acf للحساب الشامل
تقدم مكتبة Statsmodels الدالة المرجعية الأكثر شمولاً لحساب دالة الارتباط الذاتي عبر الوحدة statsmodels.tsa.stattools.acf. تتميز هذه الدالة بقدرتها على إرجاع مصفوفة رقمية متكاملة تحتوي على قيم معاملات الارتباط لكافة فترات التباطؤ المطلوبة بطلب واحد، مع توفير خيارات إحصائية متعددة لضبط آليات الحساب.
يتحكم المعامل nlags في عدد فترات التباطؤ الزمني المراد حسابها. افتراضياً، تحسب الدالة عدداً محدوداً من التباطؤات بناءً على حجم العينة، ولكن يُنصح بضبطه يدوياً بحيث لا يتجاوز $N/4$ أو $10 \log_{10}(N)$ للحفاظ على الدقة الإحصائية وتفادي أخطاء التقدير في العينات الصغيرة.
يتيح المعامل adjusted تحديد ما إذا كان سيتم استخدام مقدر التباين المشترك المعدل الذي يقسم على $N-k$ بدلاً من $N$. على الرغم من أن المقدر غير المعدل (المقسوم على $N$) يعطي تقديراً متحيزاً قليلاً للعينات الصغيرة، إلا أنه يضمن بقاء مصفوفة التباين والتغاير موجبة التعريف (Positive Semi-Definite)، وهو الخيار المفضل رياضياً في معظم التطبيقات.

4.2 فهم خيارات معاملات الارتباط ونطاقات الثقة
تتيح دالة acf حساب فترات الثقة الإحصائية (Confidence Intervals) لكل معامل تباطؤ عبر المعامل alpha. عند تمرير alpha=0.05، تُرجع الدالة مصفوفة ثنائية الأبعاد تتضمن الحدين الأدنى والأعلى لمجال الثقة عند مستوى معنوية 95%، مستندة إلى صيغة بارتليت (Bartlett’s Formula) للتباين التقاربي في العمليات المتحركة.
توفر الدالة أيضاً خيار fft للتحكم في الخوارزمية الحسابية. عند تعيين fft=True، تستخدم الدالة تحويل فورييه السريع القائم على مبرهنة وينر-خينشين (Wiener-Khinchin Theorem) لحساب الارتباط بطريقة الالتفاف السريع (Fast Convolution)، مما يوفر تسريعاً حاسوبياً هائلاً من التعقيد $O(N^2)$ إلى $O(N log N)$ في السلاسل الزمنية الطويلة جداً.
يوضح المثال البرمجي التالي كيفية استدعاء الدالة واستخراج المعاملات وفترات الثقة وتخزينها في إطار بيانات منظم:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import acf
# توليد سلسلة زمنية عشوائية
np.random.seed(42)
data = np.random.normal(0, 1, 1000)
# حساب معاملات الارتباط الذاتي ونطاقات الثقة حتى 20 تباطؤ
autocorr_values, conf_int = acf(data, nlags=20, alpha=0.05, fft=True)
# تنظيم النتائج في DataFrame
results_df = pd.DataFrame({
'Lag': np.arange(len(autocorr_values)),
'ACF': autocorr_values,
'Lower_CI': conf_int[:, 0],
'Upper_CI': conf_int[:, 1]
})
print(results_df.head(10))
5. حساب الارتباط الذاتي باستخدام مكتبة Pandas
5.1 استخدام الدالة Series.autocorr لحساب تباطؤ محدد
توفر مكتبة Pandas واجهة مباشرة وبسيطة لحساب معامل الارتباط الذاتي عند فترة تباطؤ محددة من خلال الدالة Series.autocorr(). تُعد هذه الدالة مثالية عند الرغبة في فحص قيمة التباطؤ الأول $r_1$ أو اختبار تباطؤ موسمي معين دون الحاجة لاستخراج مصفوفة التباطؤات بأكملها.
تأخذ الدالة معاملاً واحداً هو lag، وقيمته الافتراضية هي lag=1. تقوم الآلية الداخلية للدالة بمحاذاة السلسلة الأصلية مع نسخة مزاحة منها بمقدار التباطؤ المحدد، ثم تطبيق معامل ارتباط بيرسون القياسي بين المتجهين بعد استبعاد القيم غير المتطابقة الناتجة عن الإزاحة.
import pandas as pd
# إنشاء سلسلة بيانات بسيطة
ts = pd.Series([12, 15, 14, 18, 20, 25, 24, 30, 32, 38])
# حساب الارتباط الذاتي عند التباطؤ الأول والثاني
lag_1 = ts.autocorr(lag=1)
lag_2 = ts.autocorr(lag=2)
print(f"الارتباط الذاتي عند التباطؤ 1: {lag_1:.4f}")
print(f"الارتباط الذاتي عند التباطؤ 2: {lag_2:.4f}")
5.2 حساب معاملات الارتباط الذاتي لكافة الفترات الزمنية تكرارياً
عند الحاجة لحساب معاملات الارتباط الذاتي لعدة فترات تباطؤ متتالية باستخدام Pandas حصراً، يمكن بناء حلقة تكرارية مرنة أو استخدام تعبيرات الفهم للقوائم (List Comprehensions). تتيح هذه الطريقة مرونة برمجية عالية في تخصيص العمليات وتتبع التغيرات الزمنية خطوة بخطوة.
تتميز تعبيرات الفهم للقوائم بكونها أكثر إيجازاً وتوافقاً مع أسلوب بايثون القياسي (Pythonic Code)، حيث يمكن توليد قائمة بالقيم ثم تحويلها مباشرة إلى كائن pd.Series لربطها بأرقام التباطؤ:
# حساب الارتباط الذاتي لـ 15 فترة تباطؤ باستخدام تعبيرات الفهم
max_lags = 15
acf_pandas = [ts.autocorr(lag=i) for i in range(max_lags + 1)]
# تخزين النتائج في جدول للمقارنة
lags_summary = pd.DataFrame({'Lag': range(max_lags + 1), 'Autocorrelation': acf_pandas})
print(lags_summary)
تجدر الإشارة إلى أن تطبيق autocorr(lag=0) سيعيد دائماً القيمة $1.0$، لأن ارتباط أي متجه مع نفسه دون إزاحة يمثل تطابقاً خطياً تاماً. يوفر تخزين هذه القيم في DataFrame إمكانية إجراء عمليات تصفية أو رسم بياني سريع باستخدام أدوات Pandas المدمجة.
5.3 استخدام دالة Series.shift والارتباط الخطي
لفهم الآلية الهيكلية لحساب الارتباط الذاتي من الصفر، يمكن استخدام دالة الإزاحة اليدوية shift() مع دالة الارتباط الخطي corr(). تتيح هذه الطريقة معاينة محاذاة البيانات وفهم كيفية توليد القيم المفقودة عند حواف المتجهات.
عند تطبيق ts.shift(k)، يتم دفع البيانات إلى الأسفل بمقدار $k$ خانة، وتُملأ الخانات العلوية بقيم NaN. لحساب الارتباط بشكل صحيح، يتم ربط المتجهين في إطار بيانات واحد ثم حساب الارتباط بين العمود الأصلي والعمود المزاح:
# إنشاء عمود مزاح زمنياً بمقدار 2
df = pd.DataFrame({'Original': ts})
df['Lag_2'] = df['Original'].shift(2)
# حساب معامل الارتباط بعد إسقاط القيم الفارغة تلقائياً عبر corr
correlation_manual = df['Original'].corr(df['Lag_2'])
print(f"الارتباط المحسوب عبر shift(): {correlation_manual:.4f}")
تقوم الدالة corr() تلقائياً باستبعاد أزواج القيم التي تحتوي على NaN عبر مطابقة الإقران، مما يضمن دقة الحساب دون الحاجة لتدخل يدوي لحذف الصفوف.
6. حساب دالة الارتباط الذاتي رياضياً باستخدام NumPy
6.1 الخوارزمية الحسابية المباشرة للاعتيان الزمني
يوفر تطبيق الخوارزمية الحسابية المباشرة عبر مكتبة NumPy فهماً عميقاً للعمليات الجبرية الخطية الكامنة وراء الارتباط الذاتي، بعيداً عن الدوال الإحصائية الجاهزة. تبدأ الخوارزمية بتطبيع السلسلة الزمنية من خلال طرح المتوسط الحسابي من كل مشاهدة للحصول على سلسلة ذات متوسط صفري ($y_t – \bar{y}$).
يتم بعد ذلك حساب حاصل الضرب النقطي (Dot Product) للمتجه الأصلي المتمركز مع المتجه المزاح لكل فترة تباطؤ $k$. تُمثل قيمة التباين الإجمالي عند التباطؤ الصفري المقام المعياري لجميع الحسابات، مما يضمن معايرة المخرجات بين $-1$ و$+1$:
import numpy as np
def manual_autocorrelation(series, max_lag):
n = len(series)
# طرح المتوسط الحسابي
series_mean = np.mean(series)
c0 = np.sum((series - series_mean) ** 2)
autocorr = [1.0] # التباطؤ 0 يساوي دائماً 1
for k in range(1, max_lag + 1):
# حاصل ضرب القيم المتخلفة
ck = np.sum((series[:-k] - series_mean) * (series[k:] - series_mean))
autocorr.append(ck / c0)
return np.array(autocorr)
# تجربة الدالة اليدوية
data_array = np.array([2.3, 3.1, 4.5, 3.8, 5.2, 6.1, 5.8, 7.2])
print(manual_autocorrelation(data_array, max_lag=4))
6.2 حساب الارتباط الذاتي باستخدام دالة np.correlate ومبرهنة فورييه
تقدم مكتبة NumPy الدالة عالية الأداء np.correlate التي تنفذ عملية الارتباط المتبادل والذاتي على مستوى لغة C. عند ضبط الوضع على mode='full'، تحسب الدالة الارتباط لكافة الإزاحات الممكنة من $-(N-1)$ إلى $+(N-1)$:
# تطبيع البيانات بطرح المتوسط
normalized_data = data_array - np.mean(data_array)
# حساب الارتباط الذاتي الكامل
full_corr = np.correlate(normalized_data, normalized_data, mode='full')
# استخراج النصف الموجب ومعايرته بالتباين الإجمالي
c0 = np.sum(normalized_data ** 2)
acf_numpy = full_corr[len(data_array) - 1:] / c0
print("قيم الارتباط باستخدام np.correlate:", acf_numpy[:5])
في معالجة السلاسل الزمنية الضخمة التي تحتوي على ملايين المشاهدات (مثل الإشارات الصوتية والفيزيائية)، تتفوق طريقة تحويل فورييه السريع (FFT) المعتمدة على مبرهنة وينر-خينشين. تنص المبرهنة على أن دالة الارتباط الذاتي لسلسلة زمنية مستقرة تكافئ التحويل العكسي لكثافة الطيف الطاقي (Power Spectral Density):
$$\text{ACF}(k) propto \mathcal{F}^{-1}{|\mathcal{F}{x(t)}|^2}$$
تسمح هذه الصياغة الرياضية بتنفيذ الحسابات بسرعة استثنائية عبر numpy.fft.fft وnumpy.fft.ifft، متجاوزة عنق الزجاجة الحسابي للطرق المباشرة.
7. التصور البياني لدالة الارتباط الذاتي (Correlogram)
7.1 رسم مخطط ACF باستخدام plot_acf في Statsmodels
يُعد المخطط البياني للارتباط الذاتي، المعروف بـ Correlogram، الأداة البصرية الأساسية لتشخيص السلاسل الزمنية. توفر مكتبة Statsmodels الدالة المتقدمة plot_acf عبر الوحدة statsmodels.graphics.tsaplots، والتي تقوم برسم خطوط عمودية (Stem Plot) تمثل قيم الارتباط عند كل تباطؤ مع تظليل نطاق الثقة الإحصائي.

يتيح المعامل lags تحديد نطاق فترات التباطؤ المعروضة في الرسم. يمكن أيضاً تخصيص مظهر المخطط والتحكم في عناصر الرسم عبر كائن Axes الخاص بـ Matplotlib. يوضح الكود التالي كيفية إنشاء مخطط ACF احترافي:
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# إنشاء سلسلة بيانات بمكون اتجاهي وموسمي
np.random.seed(42)
time = np.linspace(0, 50, 200)
signal = np.sin(time) + np.random.normal(0, 0.5, 200)
# إنشاء المخطط البياني
fig, ax = plt.subplots(figsize=(10, 5))
plot_acf(signal, lags=40, alpha=0.05, ax=ax, title="مخطط دالة الارتباط الذاتي (ACF)")
ax.set_xlabel("فترات التباطؤ الزمني (Lags)")
ax.set_ylabel("معامل الارتباط الذاتي")
ax.grid(True, linestyle='--', alpha=0.6)
plt.show()
تمثل المنطقة المظللة باللون الأزرق نطاق عدم المعنوية الإحصائية (عادة عند مجال ثقة 95%). إذا وقع عمود الارتباط بالكامل داخل هذه المنطقة المظللة، يُعتبر الارتباط عند ذلك التباطؤ غير ذي دلالة إحصائية ويمكن عزوه للتقلبات العشوائية البحتة.
7.2 رسم المخطط البياني المخصص باستخدام Pandas وMatplotlib
توفر مكتبة Pandas أداة رسم مدمجة وسريعة عبر pandas.plotting.autocorrelation_plot. يقوم هذا التابع برسم دالة الارتباط الذاتي مع إضافة خطين أفقيين يمثلان حدود الثقة عند مستويات المعنوية 95% و99%:

from pandas.plotting import autocorrelation_plot
plt.figure(figsize=(10, 5))
autocorrelation_plot(pd.Series(signal))
plt.title("مخطط الارتباط الذاتي المدمج في Pandas")
plt.xlabel("التباطؤ الزمني")
plt.ylabel("الارتباط الذاتي")
plt.grid(True)
plt.show()
لبناء مخطط بياني مخصص وتفاعلي بالكامل يعكس متطلبات التقارير الأكاديمية، يمكن الجمع بين حسابات Pandas ورسم Matplotlib المباشر مع تلوين الأعمدة الإحصائية بناءً على معنويتها واتجاهها:
# حساب المعاملات
lags_to_plot = 30
acf_vals = [pd.Series(signal).autocorr(lag=i) for i in range(lags_to_plot + 1)]
z_critical = 1.96 / np.sqrt(len(signal)) # حد الثقة 95%
# بناء المخطط المخصص
fig, ax = plt.subplots(figsize=(12, 6))
ax.bar(range(lags_to_plot + 1), acf_vals, color=['crimson' if abs(x) > z_critical else 'steelblue' for x in acf_vals], width=0.4)
ax.axhline(0, color='black', linewidth=1)
ax.axhline(z_critical, color='red', linestyle='--', label='حد الثقة 95% (+)')
ax.axhline(-z_critical, color='red', linestyle='--', label='حد الثقة 95% (-)')
ax.set_title("مخطط الارتباط الذاتي المخصص مع فترات المعنوية")
ax.set_xlabel("التباطؤ (Lag)")
ax.set_ylabel("معامل الارتباط")
ax.legend()
plt.show()
8. تفسير مخرجات الارتباط الذاتي وتحليل التباطؤ الزمني
8.1 قراءة دلالات التباطؤ الصفري وما يليه من تباطؤات
تبدأ دالة الارتباط الذاتي دائماً من التباطؤ الصفري ($k=0$) بقيمة تساوي $1.0$ حتماً. يرجع ذلك رياضياً إلى أن حساب التباين المشترك للبيانات مع نفسها يُطابق تماماً تباين العينة الإجمالي ($\gamma_0 = \sigma^2$)، مما يجعل حاصل القسمة $\gamma_0 / \gamma_0 = 1$. يُعد هذا التباطؤ نقطة الانطلاق المعيارية ولا يحمل في ذاته دلالة تنبؤية مقارنة بالتباطؤات التالية.
يُعطي سلوك المعاملات في التباطؤات المباشرة اللاحقة ($k=1, 2, 3$) نظرة فاحصة على البنية الديناميكية للسلسلة. إذا كانت قيمة $r_1$ مرتفعة جداً (مثلاً أكبر من 0.8) وتناقصت المعاملات التالية ببطء شديد وبشكل شبه خطي، فإن ذلك يشير بقوة إلى وجود اتجاه عام حتمي أو تصادفي (Trend) وعدم استقرارية في المتوسط الحسابي، مما يستوجب أخذ الفروق قبل النمذجة.
إذا أظهر المخطط تحولاً دورياً منتظماً من القيم الموجبة إلى القيم السالبة ثم العودة إلى الموجبة عبر فواصل تباطؤ ثابتة، فإن السلسلة تعكس سلوكاً تذبذبياً أو موجياً واضحاً. يُشير التباعد بين القمم المتتالية إلى الطول الزمني للدورة الكامنة في الظاهرة محل الدراسة.
8.2 الارتباط الإيجابي والسلبي والارتباط شبه المنعدم
يعكس الارتباط الذاتي الإيجابي (Positive Autocorrelation) ظاهرة استمرار السلوك (Persistence) والقصور الذاتي في النظام؛ حيث تميل المشاهدات المرتفعة إلى أن تتبعها مشاهدات مرتفعة، والمشاهدات المنخفضة تتبعها مشاهدات منخفضة. يُعد هذا السلوك سمة بارزة للبيانات الاقتصادية الكلية كالتضخم ومعدلات الفائدة، وكذلك سلاسل درجات الحرارة الجوية اليومية.
في المقابل، يدل الارتباط الذاتي السلبي (Negative Autocorrelation) على ظاهرة التذبذب والانعكاس السريع والارتداد إلى المتوسط (Mean Reversion). في هذه الحالة، تميل المشاهدات التي تعلو المتوسط إلى أن يعقبها فوراً انخفاض حاد دون المتوسط في الفترة التالية. يُلاحظ هذا النمط بشكل شائع في فروق عوائد الأصول المفرطة في المضاربة أو في إشارات التحكم الآلي والأنظمة ذات التغذية الراجعة السلبية.
عندما تتلاشى قيم الارتباط الذاتي وتقترب من الصفر لجميع فترات التباطؤ $k ge 1$ وتقع جميعها داخل نطاقات الثقة العشوائية، تكون السلسلة ممثلة لعملية الضجيج الأبيض (White Noise). يعني ذلك خلو البيانات تماماً من أي ذاكرة خطية تنبؤية؛ حيث تصبح كل مشاهدة مستقلة إحصائياً عن المشاهدات السابقة، مما يجعل أفضل توقع لقيم المستقبل هو المتوسط التاريخي للسلسلة فقط.
9. الارتباط الذاتي الجزئي (PACF) وحسابه في بايثون
9.1 المفهوم النظري للارتباط الذاتي الجزئي والفرق بينه وبين ACF
يقيس الارتباط الذاتي الجزئي (Partial Autocorrelation Function – PACF) درجة الارتباط الخطي بين المشاهدة الحالية $Y_t$ والمشاهدة المتأخرة $Y_{t-k}$ بعد إزالة وعزل التأثير الخطي لكافة المشاهدات الزمنية الوسيطة الواقعة بينهما ($Y_{t-1}, Y_{t-2}, dots, Y_{t-k+1}$).
لتوضيح الفرق الجوهري: عند حساب الارتباط الذاتي الكلاسيكي (ACF) عند التباطؤ $k=2$، يتضمن المعامل الارتباط المباشر بين $Y_t$ و$Y_{t-2}$ بالإضافة إلى الارتباط غير المباشر المنقول عبر المحطة الوسيطة $Y_{t-1}$ (حيث تؤثر $Y_{t-2}$ في $Y_{t-1}$، وتؤثر $Y_{t-1}$ في $Y_t$). تقوم دالة PACF بتجريد هذا الارتباط المنقول وحساب العلاقة الصافية النقية بين النقطتين فقط، وهو ما يكافئ معامل الانحدار الأخير $\phi_{kk}$ في نموذج انحدار ذاتي من الرتبة $k$:
$$Y_t = \phi_{k1} Y_{t-1} + \phi_{k2} Y_{t-2} + dots + \phi_{kk} Y_{t-k} + \epsilon_t$$
يحتل الارتباط الجزئي مكانة حاسمة في منهجية بوكس-جينكينز (Box-Jenkins Methodology) لتحديد رتبة نماذج الانحدار الذاتي AR(p)؛ حيث تتميز عمليات AR(p) بانقطاع حاد وتلاشٍ فوري (Cutoff) في دالة PACF بعد التباطؤ $p$، بينما تتلاشى دالة ACF تدريجياً وبشكل أسي.
9.2 تطبيق دالة plot_pacf وpacf برمجياً في بايثون
توفر مكتبة Statsmodels أدوات متكاملة لحساب ورسم دالة الارتباط الذاتي الجزئي عبر الدوال statsmodels.tsa.stattools.pacf وstatsmodels.graphics.tsaplots.plot_pacf. تدعم هذه الدوال عدة خوارزميات لتقدير المعاملات، مثل طريقة معادلات يول-ووكر (Yule-Walker)، وطريقة المربعات الصغرى العادية (OLS)، وخوارزمية ليفنسون-دوربين (Levinson-Durbin).
يوضح المثال البرمجي التالي كيفية حساب مصفوفة قيم PACF ورسم المخطط البياني المقابل:
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import pacf
from statsmodels.graphics.tsaplots import plot_pacf
# توليد عملية انحدار ذاتي من الرتبة الثانية AR(2)
np.random.seed(42)
n_samples = 500
ar2_data = np.zeros(n_samples)
for t in range(2, n_samples):
ar2_data[t] = 0.6 * ar2_data[t-1] - 0.3 * ar2_data[t-2] + np.random.normal(0, 1)
# حساب قيم PACF باستخدام طريقة Yule-Walker المعدلة
pacf_values = pacf(ar2_data, nlags=15, method='yule_walker')
print("قيم PACF لأول 5 تباطؤات:", pacf_values[:5])
# رسم مخطط PACF
fig, ax = plt.subplots(figsize=(10, 5))
plot_pacf(ar2_data, lags=15, alpha=0.05, method='yule_walker', ax=ax, title="مخطط دالة الارتباط الذاتي الجزئي (PACF)")
ax.set_xlabel("التباطؤ (Lag)")
ax.set_ylabel("معامل الارتباط الجزئي")
ax.grid(True, linestyle='--', alpha=0.5)
plt.show()
عند فحص مخطط PACF لعملية AR(2) المولدة، يُلاحظ بوضوح وجود عمودين معنويين يتجاوزان منطقة الثقة الزرقاء عند التباطؤين $k=1$ و$k=2$، يليهما انقطاع فوري وسقوط كافة المعاملات اللاحقة ($k ge 3$) داخل حدود الثقة، وهو التطابق النظري المثالي لتحديد رتبة النموذج الإحصائي.
10. اختبارات الدلالة الإحصائية للارتباط الذاتي
10.1 اختبار ليونغ-بوكس (Ljung-Box Test)
يُعد اختبار ليونغ-بوكس (Ljung-Box Test) الاختبار المعياري الشامل لفحص وجود ارتباط ذاتي مشترك لمجموعة من فترات التباطؤ مجتمعة حتى التباطؤ $m$. يختبر هذا الاختبار الفرضية الصفرية القائلة بعدم وجود ارتباط ذاتي في السلسلة (أي أن السلسلة تمثل ضجيجاً أبيض عشوائياً)، مقابل الفرضية البديلة بوجود ارتباط ذاتي معنوي عند تباطؤ واحد على الأقل.
تُحسب إحصائية الاختبار $Q$ بالمعادلة التالية التي تراعي تعديل العينات المحدودة لتقليل التحيز:
$$Q = N(N + 2) \sum_{k=1}^{m} \frac{r_k^2}{N – k}$$
تتبع هذه الإحصائية تقاربياً توزيع كاي تربيع ($\chi^2$) بدرجات حرية مساوية لعدد التباطؤات $m$. يتم تنفيذ الاختبار في بايثون عبر الدالة acorr_ljungbox الموجودة في وحدة statsmodels.stats.diagnostic:
from statsmodels.stats.diagnostic import acorr_ljungbox
# تطبيق اختبار Ljung-Box حتى 10 تباطؤات
lb_results = acorr_ljungbox(ar2_data, lags=[5, 10], return_df=True)
print(lb_results)
إذا كانت القيمة الاحتمالية (p-value) الناتجة أقل من مستوى المعنوية المعتمد (مثل 0.05)، تُرفض الفرضية الصفرية، مما يؤكد وجود بنية ارتباطية ذاتية ذات دلالة إحصائية في البيانات تستدعي النمذجة.
10.2 اختبار دوربين-واتسون (Durbin-Watson Test)
يُستخدم اختبار دوربين-واتسون (Durbin-Watson Test) خصيصاً في نماذج الانحدار الخطي للكشف عن وجود ارتباط ذاتي من الرتبة الأولى ($k=1$) بين بواقي الانحدار ($\epsilon_t$). تُعرّف إحصائية دوربين-واتسون $d$ بالصيغة التالية:
$$d = \frac{\sum_{t=2}^{N} (e_t – e_{t-1})^2}{\sum_{t=1}^{N} e_t^2} \approx 2(1 – r_1)$$
يتراوح المدى الرقمي لإحصائية $d$ دائماً بين $0$ و$4$. تشير القيمة $d = 2$ تماماً إلى انعدام الارتباط الذاتي من الرتبة الأولى في البواقي. تشير القيم القريبة من $0$ ($d 2$) إلى وجود ارتباط ذاتي سالب قوي.
يتم استدعاء الاختبار في بايثون من الوحدة statsmodels.stats.stattools:
from statsmodels.stats.stattools import durbin_watson
# حساب إحصائية دوربين-واتسون لمصفوفة البواقي
residuals = ar2_data - np.mean(ar2_data)
dw_stat = durbin_watson(residuals)
print(f"إحصائية Durbin-Watson: {dw_stat:.4f}")
10.3 اختبار بروش-غودفري (Breusch-Godfrey Test)
يتفوق اختبار بروش-غودفري (Breusch-Godfrey Test)، المعروف أيضاً باختبار مضاعف لاغرانج للارتباط التسلسلي (LM Test)، على اختبار دوربين-واتسون في عدة جوانب جوهرية؛ إذ يسمح باختبار الارتباط الذاتي من رتب عليا ($k > 1$)، ويظل صالحاً حتى في وجود متغيرات تابعة متخلفة زمنياً كمتغيرات مستقلة في النموذج.
يقوم الاختبار على بناء انحدار مساعد يتم فيه نمذجة بواقي الانحدار الأصلي كدالة في المتغيرات التفسيرية الأصلية مضافاً إليها التباطؤات الزمنية للبواقي ($e_{t-1}, e_{t-2}, dots, e_{t-p}$). تُستخدم إحصائية $LM = N \cdot R^2$ لاختبار معنوية معاملات البواقي المتأخرة.
يتم تنفيذ الاختبار عبر الدالة acorr_breusch_godfrey في Statsmodels بعد مطابقة نموذج انحدار خطي:
import statsmodels.api as sm
from statsmodels.stats.diagnostic import acorr_breusch_godfrey
# بناء نموذج انحدار بسيط
X = sm.add_constant(np.arange(len(ar2_data)))
model = sm.OLS(ar2_data, X).fit()
# إجراء اختبار بروش-غودفري حتى 4 تباطؤات
lm_stat, p_val, f_stat, f_pval = acorr_breusch_godfrey(model, nlags=4)
print(f"إحصائية LM: {lm_stat:.4f} | القيمة الاحتمالية: {p_val:.4e}")
11. التعامل مع التحديات الإحصائية: الاستقرارية والموسمية
11.1 تأثير عدم الاستقرارية (Non-Stationarity) على الارتباط الذاتي
يؤدي عدم الاستقرارية في السلاسل الزمنية، سواء الناتج عن وجود اتجاه عام (Deterministic or Stochastic Trend) أو تغير التباين عبر الزمن، إلى ظهور ما يُعرف بـ الارتباط الذاتي الزائف (Spurious Autocorrelation). في هذه الحالات، تظل قيم دالة الارتباط الذاتي موجبة ومرتفعة جداً لعدد كبير جداً من التباطؤات، ليس بسبب وجود ذاكرة انحدارية حقيقية بين المشاهدات، ولكن لمجرد أن المشاهدات تشترك في مسار صعودي أو هبوطي مشترك عبر الزمن.
للتحقق من استقرارية السلسلة الزمنية والتأكد من خلوها من الجذور الأحادية (Unit Roots)، يُطبق اختبار ديكي-فولر المعزز (Augmented Dickey-Fuller – ADF Test) عبر الدالة adfuller في Statsmodels:
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(ar2_data)
print(f"إحصائية ADF: {adf_result[0]:.4f}")
print(f"القيمة الاحتمالية (p-value): {adf_result[1]:.4f}")
إذا أظهر الاختبار عدم استقرارية السلسلة ($p\text{-value} > 0.05$)، يجب تطبيق عملية الفروق الأولى (First Differencing) لتحويل السلسلة إلى الحالة المستقرة قبل إعادة حساب وتفسير دوال الارتباط الذاتي:
# حساب الفروق الأولى للسلسلة المستقرة
differenced_series = pd.Series(ar2_data).diff().dropna()
# إعادة حساب ACF بعد أخذ الفروق
diff_acf = acf(differenced_series, nlags=10)
11.2 كشف الأنماط الموسمية الدورية عبر فترات التباطؤ
تترك الأنماط الموسمية بصمة واضحة ومميزة على دالة الارتباط الذاتي؛ حيث تظهر قمم ارتباط دورية متكررة تتجاوز حدود الثقة عند فترات التباطؤ المتوافقة مع التردد الموسمي ومضاعفاته ($s, 2s, 3s, dots$). على سبيل المثال، في البيانات الشهرية ذات النمط السنوي، ستظهر قمم واضحة عند التباطؤات 12 و24 و36.
لتشخيص المكونات بدقة وفصل الارتباط الموسمي عن الاتجاه العام والبواقي، يُستخدم تحليل تفكيك السلاسل الزمنية (Time Series Decomposition) عبر دالة seasonal_decompose في Statsmodels:
from statsmodels.tsa.seasonal import seasonal_decompose
# توليد سلسلة بيانات شهرية افتراضية لمدة 4 سنوات ذات موسمية سنوية
dates = pd.date_range(start='2020-01-01', periods=48, freq='M')
seasonal_data = pd.Series(10 + np.sin(2 * np.pi * np.arange(48) / 12) * 5 + np.random.normal(0, 0.5, 48), index=dates)
# تفكيك السلسلة إلى مكوناتها الأساسية
decomposition = seasonal_decompose(seasonal_data, model='additive')
decomposition.plot()
plt.show()
لتحقيق الاستقرارية في السلاسل الموسمية، يتم تطبيق الفروق الموسمية (Seasonal Differencing) بطرح المشاهدة المقابلة في العام السابق ($Y_t – Y_{t-s}$) عبر استخدام المعامل periods داخل دالة diff() في بايثون:
# تطبيق الفروق الموسمية (s=12)
seasonal_diff = seasonal_data.diff(periods=12).dropna()
plot_acf(seasonal_diff, lags=20, title="ACF بعد الفروق الموسمية")
plt.show()
12. تطبيق عملي شامل: تحليل متكامل لبيانات سلاسل زمنية برمجياً
12.1 استيراد واستكشاف مجموعة بيانات واقعية
سنقوم في هذا التطبيق العملي الشامل ببناء خط أنابيب تحليلي متكامل (Pipeline) لمعالجة سلسلة زمنية واقعية تمثل بيانات مبيعات أو مؤشرات طلب تتسم بالموسمية والاتجاه العام. تبدأ العملية باستيراد البيانات، وضبط الفهرس الزمني، وفحص الإحصاءات الوصفية الأساسية.
يوضح الكود التالي إعداد بيئة البيانات وفحصها وصفياً وبصرياً للتأكد من انتظام الفواصل الزمنية وخلوها من القيم المفقودة:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.stattools import acf, pacf, adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
# توليد مجموعة بيانات واقعية تحاكي مبيعات يومية على مدار عامين (730 يوماً)
np.random.seed(101)
date_rng = pd.date_range(start='2022-01-01', end='2023-12-31', freq='D')
n = len(date_rng)
trend = np.linspace(50, 100, n)
weekly_seasonality = np.sin(2 * np.pi * np.arange(n) / 7) * 8
noise = np.random.normal(0, 3, n)
sales_values = trend + weekly_seasonality + noise
# بناء DataFrame متكامل
df = pd.DataFrame(data={'Sales': sales_values}, index=date_rng)
df.index.name = 'Date'
# فحص الإحصاءات الوصفية
print("الإحصاءات الوصفية لمجموعة البيانات:")
print(df.describe())
12.2 تنفيذ كود بايثون الشامل لحساب ACF وPACF والاختبارات
يقوم السكربت الشامل التالي بتنفيذ المعالجة التحويلية للسلسلة الزمنية، وحساب مصفوفات ACF وPACF، ورسم المخططات البيانية المتجاورة بدقة عالية، ثم تشغيل اختبار ليونغ-بوكس التشخيصي وطباعة تقرير إحصائي مفصل يفسر خصائص البيانات:
# 1. فحص الاستقرارية عبر اختبار ADF
adf_stat, p_value, _, _, crit_vals, _ = adfuller(df['Sales'])
print(f"nنتائج اختبار ADF للسلسلة الأصلية:")
print(f"إحصائية ADF: {adf_stat:.4f} | القيمة الاحتمالية: {p_value:.4f}")
# 2. تطبيق الفروق الأولى لإزالة الاتجاه العام وتحقيق الاستقرارية
df['Sales_Diff'] = df['Sales'].diff()
diff_series = df['Sales_Diff'].dropna()
# 3. حساب مصفوفات الارتباط الذاتي والارتباط الجزئي للسلسلة المستقرة
acf_vals = acf(diff_series, nlags=28, alpha=0.05)
pacf_vals = pacf(diff_series, nlags=28, method='yule_walker')
# 4. التصور البياني المشترك (ACF & PACF)
fig, axes = plt.subplots(1, 2, figsize=(16, 5))
plot_acf(diff_series, lags=28, ax=axes[0], title="دالة الارتباط الذاتي (ACF) بعد الفروق")
plot_pacf(diff_series, lags=28, ax=axes[1], method='yule_walker', title="دالة الارتباط الذاتي الجزئي (PACF) بعد الفروق")
axes[0].set_xlabel("التباطؤ (أيام)")
axes[1].set_xlabel("التباطؤ (أيام)")
plt.tight_layout()
plt.show()
# 5. إجراء اختبار Ljung-Box للكشف عن كفاية النمذجة
lb_test = acorr_ljungbox(diff_series, lags=[7, 14, 21, 28], return_df=True)
print("nنتائج اختبار Ljung-Box للبواقي بعد الفروق:")
print(lb_test)
12.3 استخلاص النتائج وتطبيقها في اختيار نماذج التنبؤ (ARIMA)
يوفر التحليل المشترك لمخططي ACF وPACF بعد أخذ الفروق الأولى الأساس الرياضي لاختيار معلمات نماذج ARIMA وSARIMA وفق منهجية بوكس-جينكينز القياسية:
- تحديد رتبة الفروق ($d$): تم تحقيق الاستقرارية باستخدام الفروق الأولى، وبالتالي تكون رتبة التكامل $d=1$.
- تحديد رتبة الانحدار الذاتي ($p$): يُظهر مخطط PACF قمم ارتباط حادة ومعنوية عند التباطؤات الموسمية، مما يشير إلى الحاجة لإدراج حدود انحدار ذاتي دورية.
- تحديد رتبة المتوسطات المتحركة ($q$): يُظهر مخطط ACF اضمحلالاً تدريجياً مع قمم دورية عند التباطؤ 7 ومضاعفاته (14، 21، 28)، مما يؤكد وجود مكون موسمي أسبوعي يستدعي استخدام نموذج SARIMA بصيغة $(p, 1, q) \times (P, 1, Q)_7$.
بعد ملاءمة النموذج المختار، يجب فحص بواقي النموذج النهائي (Model Residuals) والتأكد من أن مصفوفة الارتباط الذاتي للبواقي تقع بالكامل ضمن حدود الثقة العشوائية، وأن اختبار ليونغ-بوكس للبواقي يعطي قيمة احتمالية $p > 0.05$؛ مما يثبت نجاح النموذج في استخلاص كافة المعلومات والذاكرة الإحصائية من البيانات، وتحويل البواقي إلى ضجيج أبيض خالص صالح للتنبؤ المستقبلي الموثوق.
خاتمة
يمثل الارتباط الذاتي والارتباط الذاتي الجزئي حجر الزاوية في التحليل الإحصائي والنمذجة الرياضية للسلاسل الزمنية. من خلال استيعاب المفاهيم الرياضية للتباين المشترك، والاستفادة من القدرات البرمجية الهائلة لمكتبات بايثون مثل Statsmodels وPandas وNumPy، يستطيع محللو البيانات والباحثون تشخيص الأنماط الديناميكية للبيانات، وتحديد الترددات الموسمية، وفصل الاتجاهات الحتمية عن السلوكيات العشوائية بكفاءة وموثوقية عالية.
إن إتقان قراءة وتفسير المخططات البيانية للارتباط، جنباً إلى جنب مع الاختبارات الإحصائية الصارمة كاختباري Ljung-Box وDurbin-Watson، يوفر الأساس المتين لبناء نماذج تنبؤية قياسية متقدمة وخالية من التشوهات والانحيازات. ومع استمرار تطور تقنيات الذكاء الاصطناعي وتعلم الآلة، يظل فهم الارتباط الذاتي المتطلب المسبق الأكثر أهمية لهندسة الخصائص الزمنية وبناء خوارزميات التنبؤ المستدامة.
References
- Box, G. E., Jenkins, G. M., Reinsel, G. C., & Ljung, G. M. (2015). Time series analysis: Forecasting and control (5th ed.). John Wiley & Sons. https://www.wiley.com/en-us/Time+Series+Analysis
- Brockwell, P. J., & Davis, R. A. (2016). Introduction to time series and forecasting (3rd ed.). Springer. https://doi.org/10.1007/978-3-319-29854-2
- Hamilton, J. D. (1994). Time series analysis. Princeton University Press. https://press.princeton.edu/books/hardcover/9780691042893/time-series-analysis
- Hyndman, R. J., & Athanasopoulos, G. (2021). Forecasting: Principles and practice (3rd ed.). OTexts. https://otexts.com/fpp3/
- McKinney, W. (2022). Python for data analysis: Data wrangling with pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media. https://wesmckinney.com/book/
- Seabold, S., & Perktold, J. (2010). Statsmodels: Econometric and statistical modeling with Python. Proceedings of the 9th Python in Science Conference, 57(61), 10-25080. https://doi.org/10.25080/Majora-92bf1924-011
- Wooldridge, J. M. (2020). Introductory econometrics: A modern approach (7th ed.). Cengage Learning. https://www.cengage.com