مقدمة بسيطة للتسلسلات الزمنية
مقدمة
القدرة على قراءة و تحليل التسلسلات الزمنية مهارة مهمة لكل مدير أو صاحب قرار أو اي باحث يريد الإستفادة من الماضي و توقع المستقبل. من خواص التسلسلات الزمنية أنها تبرز السمات المهمة في مجموعة البيانات وايضا تساعد على كشف التغيرات العشوائية في البيانات. لذلك في هذا المقال سوف نتناول هذا الموضوع المهم بشكل تسلسلي (دام الدعوة كلها تسلسلات )
التحفيز لتناول هذا الموضوع
هناك انتشار كبير الآن في المضاربة في العملات الرقمية مثل البتكوينز و الإثيريم وايضا الريبل. ولعل اكثر شي ملفت للنظر في سوق العملات الرقمية هو حجم التغيرات وسرعتها خلال فترات زمنية بسيطة. على إثر ذلك اتلقى كثير من التساؤلات وطلبات المشورة من اصحابي وعلى تويتر على أمل إيجاد تفسيرات لهذه الفوضى. لذلك قررت أن أبدء هذه السلسلة من الدروس.
هل يوجد تطبيقات عملية لهذه التسلسلات؟
بروتوكول كايوتو الذي يهدف إلى الحد من الغازات الدفئية طرح على الكونجرس الأمريكي سنة ١٩٩٧ ولم يتم اعتماده إلا في عام ٢٠٠٥ بعد ما قام العلماء والمختصين بطرح التحاليل لمجموعة من التسلسلات الزمنية للعوامل المؤثرة في مستويات هذه الغازات.
آيضا في عام ٢٠٠٦ قامت الخطوط السنغافورية بطلب عشرين طائرة بوينج من طراز ٧٨٧-٩ وتوقيع قصد طلب آخر لتسع وعشرين طائرة ايربص من طراز A350 و A380 بعد ما ادركت الشركة اهمية هذه الخطوة من خلال تحليلها للتسلسلات الزمنية للنمو المتزايد لعدد الركاب وتوافق الفرصة لتحقيق اهداف الشركة للتوسع في سوق النقل الجوي.
هذه بعض الآمثلة التي توضح اهمية التسلسلات الزمنية. من خلال تجربة شخصية، اجد أن القدرة على قراءة وتحليل التسلسلات الزمنية مهارة مطلوبة في سوق العمل وأنا كثيرا ما اجد نفسي اقوم بتحليل تسلسلات زمنية وخصوصا عند وضع الخطط التشغيلية في مقر عملي.
ماهي التسلسلات الزمنية
في كثير من المجالات كالهندسة والتجارة وغيرها، يكون لدينا عدة متغيرات نقوم بقياسها بشكل تسلسلي خلال الزمن. فمثلا، الحكومات تقوم بقياس دخل الناتج القومي بشكل سنوي.أيضا البنوك ومؤسسات النقد تقوم بقياس نسبة الفائدة وتداول العملات بشكل يومي. عندما نقوم بقياس متغير معين خلال فترة محددة من الزمن (تسمى فترة أخذ العينات) ينتج لنا من ذلك تسلسل زمني لذلك المتغير.
مزايا التسلسلات الزمنية
من المزايا للتسلسلات الزمنية النمط Trend و التغيرات الموسمية seasonal variations والتي يمكن نمذجتها بطريقة تحديدية من خلال معادلات رياضية زمنية. لكن هناك ميزة أهم وهي ميزة التسلسل ونقصد بذلك أن القيم المتقاربة في التسلسل الزمني عادة ما تكون مترابطة ايضا correlated. في الواقع، مجمل طرق التحليل للتسلسلات الزمنية تحاول تفسير هذا الترابط بل وأستخدام هذه الظاهرة للتنبؤ بالقيم المستقبلية للمتغير.
أمثلة لللتسلسلات الزمنية مع لغة R
المثال الأول :عدد المسافرين في أمريكا خلال فترة الخمسينات
في هذا المثال سوف نتناول كيف يتعامل R مع التسلسلات الزمنية. أيضا سوف نستطلع بعض الدوال المتخصصة للتسلسلات الزمنية الموجودة الحزمة الأساسية لR
اما الآن فدعنا نحلق مع التسلسل الزمني لعدد المسافرين جويا في الولايات المتحدة منذ عام ١٩٤٩ إلى ١٩٦٠. هذه البيانات موجودة في بيئة R وبإمكانك الحصول عليها خلال الكود التالي. أيضا سوف آقوم بنسخها لدينا في متغير حتى نبدmgأ بتحليلها بكل راحة.
data("AirPassengers")
AP <- AirPassengers
AP
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432
لغة R تحفظ التسلسلات على صيغة ts object . لهذه الصيغة مزايا جميلة ومفيدة وبالإمكان التحقق منها من خلال الكود التالي.
class(AP)
start(AP)
end(AP)
frequency(AP)
## [1] "ts"
## [1] 1949 1
## [1] 1960 12
## [1] 12
كما ترى، بإمكاننا معرفة بداية ونهاية التسلسل وكذلك الفترات الزمنية لقياس المتغير. في المخرجات، يتبين لنا أن بداية هذه التسلسل شهر يناير من عام ١٩٤٩ ونهايتها شهر ديسمبر عام ١٩٦٠ ويتم تدوين عدد الركاب بشكل شهري.
لعل أهم الخطوات في التحليل المبدئي للتسلسلات الزمنية هو رسمها. هذا بالضبط الي راح نسويه الآن
plot(AP, ylab = "Passengers (1000's)")
هناك عدد من الملاحظات بارزة لنا في هذا الرسم البياني. أولا يبدو لنا أن عدد المسافرين في تزايد مستمر في تلك الفترة. هذا النوع من التزايد المنتظم يطلق عليه بالنمط أو Trend. أيضا يبدو لنا أن هناك نمط متكرر خلال تلك الفترة. هذا النوع من التكرار يطلق عليه بالتغيرات الموسمية أو seasonal varations. مبدئيا، بإمكاننا إفتراض أن هذه التغيرات الموسمية تعود إلى ازدياد الحجوزات في اشهر الصيف في يونيو و يوليو و أغسطس بينما الركود يكون عادة في اشهر الشتاء والخريف من شهر نوفمبر إلى فبراير. طبعا مثل هذه الفرضيات تحتاج إلى معاينة ومراجعة والتحقق منها إحصائيا.
يمكننا معاينة النمط بشكل ادق وذلك من خلال عزل التغيرات الموسمية من النمط. نقوم بذلك عن طريق حساب مجموع المسافرين لكل سنة. سوف نقوم بإستخدام الدالة aggregate. ستلاحظ أن المتغيرات الموسمية قد زالت وبدى لنا النمو المتزايد بشكل اوضح. آيضا بإمكاننا تحليل التغيرات الموسمية وتلخيصها في فترة واحدة. نقوم بذلك عن طريق حساب المتوسط الحسابي للأشهر وجمعها في فترة زمنية موسمية.
layout(1:2)
plot(aggregate(AP))
boxplot(AP ~ cycle(AP))
المثال الثاني: مستوى البطالة في ولاية ماين الأمريكية
في معظم الأحيان، نحصل على البيانات بصيغة data.frame أو Matrix وهي مختلفة عن صيغة ts. لذلك في هذا المثال سوف نتعلم كيف نحول تلك الصيغ إلى ts ليمكننا الإستفادة من الدوال العديدة التابعة لها.
سنبدأ بالتسلسل الزمني لمستويات البطالة في ولاية ماين الأمريكية خلال عشر سنوات ما بين ١٩٩٦ و ٢٠٠٦ والتي تم تسجيلها بشكل شهري. هذه البيانات متوفرة على موقع US Department of Labor. يمكنك ايضا الحصول عليها من خلال الريبو الخاص بهذا المقال.
نبدأ أولا بقراءة الملف ونسخ البيانات في متغير
library("here")
## here() starts at /Users/Hussain/Documents/Arabian Analyst /Arabian_Analyst_Blog
www <- here("static", "data", "Maine.dat")
Maine.month <- read.table(www, header = TRUE)
attach(Maine.month)
class(Maine.month)
## [1] "data.frame"
قمنا ايضا بإستخدام دالة attach ليمكننا التعامل مع الأعمدة الموجودة في جدول البيانات بشكل مباشر. كما ترى، الصيغة الحالية للبيانات هي data.frame. سنقوم بتحويلها إلى ts من خلال الكود التالي
Maine.month.ts <- ts(unemploy, start = c(1996, 1), freq = 12)
في هذا الكود خصصنا وقت بدأ الفترة وهو شهر يناير سنة ١٩٩٦. ثم خصصنا عدد مرات تكرار القياس وهو بشكل شهري.
وكما سبق وفعلنا في المثال السابق. سوف نقوم بتلخيص البيانات على شكل المتوسط الحسابي بشكل سنوي. وهذا الكود لفعل ذلك
Maine.annual.ts <- aggregate(Maine.month.ts)/12
لاحظ أننا قمنا بالتقسيم الأن الخطوة الأولى في التحليل هي استعراض تلك البيانات من خلال الرسم البياني.
layout(1:2)
plot(Maine.month.ts, ylab = "unemployed (%)")
plot(Maine.annual.ts, ylab = "unemployed (%)")
في الرسم البياني تلاحظ أننا تخلصنا من التغيرات الموسمية عندما قررنا النظر على مستوى المتوسط الحسابي للبيانات بشكل سنوي مقارنة بالرسم البياني الآخر على المستوى الشهري. من الطرق التحليلية يمكننا القيام بها الآن، هي أن نقارن مستوى البطالة في احد شهور الشتاء كفبراير مثلا مع مستوى البطالة بشكل عام خلال شهور السنة. سنقوم بفعل نفس الطريقة مع شهر اغسطس لموسم الصيف.
Maine.Feb <- window(Maine.month.ts, start = c(1996,2), freq = TRUE)
Maine.Aug <- window(Maine.month.ts, start = c(1996,8), freq = TRUE)
Feb.ratio <- mean(Maine.Feb) / mean(Maine.month.ts)
Aug.ratio <- mean(Maine.Aug) / mean(Maine.month.ts)
Feb.ratio
## [1] 1.222529
Aug.ratio
## [1] 0.8163732
متوسط البطالة في ولاية ماين خلال شهر فبراير اكثر من المتوسط العام بـ ٢٢ بالمئة بينما البطالة في شهر أغسطس أقل من المتوسط بـ ١٨٪. أحد الاسباب لتلك النتائج هي أن ولاية ماين تعتبر ولاية سياحية و يكثر فيها السواح خلال الصيف مما يخلق فرص وظيفية لكثير من الناس. اما شهر فبراير فهو يأتي بعد موسم عيد الميلاد والذي تكون فيه مستويات البطالة منخفضة. وبالمقارنة يكون مستوى البطالة في شهر فبراير اكثر.
المثال الثالث: عملة الدولار النيوزلندي والباوند البريطاني
كثير منا قد يتسرع في التنبؤ لإتجاه قيم متغيرات معينة كالأسهم المالية أو العملات الأجنبية معتمدين فقط على ما يبدو لنا أنه نمط متصاعد و إفتراضنا أن هذا النمط سوف يستمر بنفس الإتجاه. في هذا المثال سوف نقوم بتوضيح خطورة هذه العادة المتسرعة.
أولا سوف نقوم بقراءة ونسخ تسلسل زمني لأسعار عملة الدولار النيوزلندي بالمقارنة بالباوند البريطاني للفترة ما بين شهر يناير عام ١٩٩١ إلى مارس ٢٠٠٠.
www <- here("static", "data", "pounds_nz.dat")
Z <- read.table(www, header = T)
البيانات تحتوي على متوسطات ربعية لكل سنة لذلك سوف نقوم بتحويل صيغة هذه البيانات إلى ts. أيضا سنقوم بإستعراض البيانات من خلال الرسم البياني كما فعلنا في الأمثلة السابقة
Z.ts <- ts(Z, st = 1991, fr = 4)
plot(Z.ts, xlab = "time / years",
ylab = "Quarterly exchange rate in $NZ / pound")
ستلاحظ في الرسم البياني صعود مفاجئ في رأس سنة ١٩٩٢ ثم إنحدار مستمر في قيمة العملة حتى إلى سنة ١٩٩٦ ثم صعود مفاجئ آخر حتى سنة ٢٠٠٠. للأسف لا يوجد أسباب تحديدية لهذه التقلبات، لذلك في تلك الحالة يقوم المحللين و علماء البيانات باللجوء إلى النماذج العشوائية والتي سبق وتحدث عنها في مقال سابق.
دعنا الآن ننظر إلى مدة خطورة التسرع في صنع القرار عند معاينة التسلسلات الزمنية. لو فصلنا الرسم البياني اعلاه إلى جزئين حول سنة ١٩٩٢ قد نتسرع ونصل إلى قرارين متناقضين.
Z.92.96 <- window(Z.ts, start = c(1992, 1), end = c(1996, 1))
Z.96.98 <- window(Z.ts, start = c(1996, 1), end = c(1998, 1))
layout (1:2)
plot(Z.92.96, ylab = "Exchange rate in $NZ/pound",
xlab = "Time (years)" )
plot(Z.96.98, ylab = "Exchange rate in $NZ/pound",
xlab = "Time (years)" )
الخلاصة
في هذا المقال قمنا بتعريف التسلسلات الزمنية وشرح مدى اهميتها وبعض المزايا التي تخصها. أيضا ناقشنا بعض الأمثلة وتطرقنا إلى تنفيذها بإستخدام لغة R. آرجو أنكم استمتعتم بقراءة هذا المقال ولكن الأهم أنكم استفدتم وتعلمتم شيء جديد ينفعكم في حياتكم العملية. إلى مقال آخر، أستودعكم الله.
جرب بنفسك
كامل الكود تجده هنا
comments powered by Disqus