لغة R والتحليل الإحصائي

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

إخوتي وأخواتي المهندسين والمهندسات؛
كتاب نافع - بحوله تعالى - في إحدى مجالاتِ التقنية ولغات البرمجة .

لغة R والتحليل الإحصائي

/

تعد لغة R من اللغات التي صعد نجمها حديثا وبشكل سريع بمجال البرمجة العلمية في قطاعي الإحصاء والمعلوماتية الحيوية (bioinformatics) حيث باتت معتمدة على نطاق واسع في كثير من الجامعات ومراكز البحث العلمية، وأصبحنا نرى استخدامها والإشارة إليها في المقالات المنشورة بالمجلات العلمية المحكّمة يزداد بشكل طردي ومتسارع، هذا عدى عن حقيقة كونها لغة حرة مفتوحة المصدر يخضع توزيعها لترخيص GPL الشهير. كل ذلك أدى إلى تزايد ما هو متوفر ومتاح على الشابكة (الإنترنت) من مصادر لها على توزع طيف تلك المصادر، فهناك الكتب الإلكترونية والدروس التعليمية وحتى المناهج الأكاديمية والدورات التدريبية إضافة إلى البرامج الجاهزة والمكتوبة بلغة R لتنفيذ هذه المهمة أو تلك، حتى أنها باتت تحظى ببعض الامتياز مقارنة بالعديد من العمالقة في قطاع البرمجة الرياضياتية العلمية والإحصائية مثل SAS و SPSS خصوصا في مجال توافر الجديد من الطرق والخوارزميات الحديثة، حيث يقاد هذا التوجه في معظمه من طرف الجامعات ممثلة بطلاب الدراسات العليا يحفّزهم على ذلك سهولة بناء الإضافات لهذه اللغة،

ويعتبر هذا الأسلوب رغم ما قد يشوبه من نقاط ضعف تتعلق بموثوقية وجودة وغزارة تلك الإضافات الجديدة، والتي تتبع خبرة ومهارة مطوريها وناشريها، لكنها تبقى في القطاع العلمي والأكاديمي أفضل كثيرا من البدائل التجارية التي يعيبها ارتفاع ثمنها من جهة، ومن جهة أخرى بطئ إضافة التحديثات التي تعكس تطور القطاعات العلمية المختلفة، حيث أنها عادة ما تتبع دورة تجارية تتحكم بها الشركات المنتجة.

سنحاول في هذه المقالة أن نقدم مدخلا مبسطا ومختصرا لأساسيات هذه اللغة ونستكشف بعضا من إمكانياتها واستخداماتها، والتي أتمنى أن أراها تدرّس في جامعاتنا يوما ما، بحيث تستخدم كأداة للاختبار والتجربة والتطوير ضمن الجلسات العملية لبعض المقررات العلمية في الكليات ذات الاختصاص. هذا هو الجزء الأول في سلسة مؤلفة من أربع مقالات تهدف إلى التعريف بلغة R حيث سيتناول الجزء الثاني منها موضوع المخططات البيانية الإحصائية، أما الجزء الثالث فسيتحدث عن كيفية إجراء بعض الاختبارات الإحصائية بلغة R، فيما نختم السلسلة بجزء رابع يتحدث عن بعض التقنيات المتقدمة في هذه اللغة.

يمكنك تحميل لغة R من الموقع الرسمي لها على الشابكة والموجود على العنوان http://www.r-project.org حيث توجد إصدارات منها لمعظم أنظمة التشغيل الشائعة ومنها Windows و Linux وحتى Apple. إن عملية التنصيب سهلة وتخلو من التعقيدات، وعند الانتهاء منها يمكنك تشغيل بيئة عمل لغة R بالنقر على الأيقونة الخاصة بالبرنامج سواء تلك الموجودة على سطح المكتب أو من خلال قائمة البرامج، وحينها ستظهر لك شاشة سطر الأوامر الخاصة بلغة R وهو المكان المعتاد لكتابة الأوامر الخاصة بهذه اللغة كما هو ملاحظ في الشكل التالي:

وبما أننا ذكرنا أن هذه اللغة واسعة الانتشار في مجال النشر العلمي، لذا دعونا نطلع على تعليمتنا الأولى وهي تعليمة ()citation والتي تعرض الطريقة الرسمية للإشارة إلى لغة R كمرجع ضمن لائحة المراجع المستخدمة في أي ورقة علمية كما هو موضح بالشكل التالي:

في لغة R تستخدم الفاصلة المنقوطة للفصل فيما بين كل أمر من أوامر اللغة الموجودة على سطر واحد (فيما لاحاجة لتلك الفواصل المنقوطة إن كانت كل تعليمة ترد ضمن سطر مستقل بها)، كما ترى فإن خرج تنفيذ أي أمر أو دالة بلغة R يظهر بعدها مباشرة، وهكذا تتكون جلسة العمل الاعتيادية من تنفيذ لتتالي من الأوامر والتعليمات وصولا إلى إنجاز العمل أو التحليل المطلوب، ويمكنك باستخدام أزرار الأسهم إلى الأعلى وإلى الأسفل من التنقل عبر مجموعة الأوامر التي تم تنفيذها خلال جلسة العمل الحالية جيئة وذهابا، كذلك يمكنك استعراض آخر 15 أمر على سبيل المثال من خلال الدالة (history(15، هذا عدى عن إمكانية حفظ وتخزين أرشيف أوامر الجلسة الحالية في ملف باستخدام الدالة ("savehistory("myfile ومن ثم استعادة ذلك الأرشيف في جلسة عمل جديدة منفصلة باستخدام الدالة "("loadhistory("myfile، هناك اختصار آخر مفيد حينما ترى أن نافذة سطر الأوامر لديك أصبحت مزدحمة بالنتائج وتريد تنظيفها، فكل ما عليك القيام به هو النقر على الاختصار Ctrl+L (مع ملاحظة أن ذلك لن يحذف أي من البيانات التي تم تحميلها إلى البرنامج والمحفوظة بالتالي في الذاكرة، بل يقوم فقط بتنظيف الشاشة المعروضة أمامك).

قبل الانطلاق قدما في استعراض ما في هذه اللغة من دوال وكيفية استخدام كل منها، دعونا بداية نتعرف على طريقة الحصول على المساعدة فيها، إذ يتدرج الأمر من طلب الحصول على المساعدة الخاصة بأمر محدد أو دالة بعينها، وذلك بذكر اسم الأمر أو الدالة عقب علامة الاستفهام ومن ثم النقر على زر الإدخال، فمثلا يقوم الأمر read.table? بعرض الصفحة الخاصة بتوثيق التعليمة read.table ضمن ملفات المساعدة الخاصة بلغة R.

أما إن أردت البحث عن مفهوم معين أو كلمة مفتاحية ما دون أن تعلم تماما أي الدوال هي التي تتعامل معها في لغة R، فيمكنك استخدام الأمر ("help.search("data input لتعرض عليك بعدها مجموعة من الأوامر ذات الصلة بهذا المفهوم، وتستطيع حينها الحصول على شرح أو مساعدة تفصيلية لأي من تلك الدوال بالطريقة التي أشرنا إليها سابقا. هناك وسيلة مساعدة أخرى متوفرة في لغة R موجهة إلى فئة المبرمجين الذين يفضلون رؤية الأمثلة وهي تعمل على أن يقرؤوا العشرات من أسطر ملفات المساعدة، وهؤلاء يمكنهم استخدام الأمر example بعد أن تمرر له اسم الدالة المراد الحصول على أمثلة عملية عن طريق استخدامها، فعلى سبيل المثال يمكنك تجربة الأمر (example(mean.

وطالما أننا نتحدث عن وسائل وأساليب الحصول على المساعدة، أجد أنه من المفيد ذكر طريقة إضافة التعليقات في لغة R، وهو أسلوب لا تخفى ضرورته على أي مبرمج محترف، ففي لغة R التعليقات هي كل نص يتلو الرمز # سواء ظهر من بداية السطر أو جاء بعد تعليمة ما، لكن الغريب أن لغة R تفتقر إلى طريقة لجعل مقطع كامل يعامل معاملة التعليقات (كما هو حال استخدام أسلوب التأطير /* … */ في العديد من لغات البرمجة الأخرى).

الخطوة التالية التي يجب تعلمها الآن هي آلية استيراد البيانات وقراءتها من مصادرها وإن تعددت تنسيقات وصيغ تلك المصادر، فعلى سبيل المثال يمكنك القراءة من جداول البيانات المحفوظة بتنسيق csv باستخدام الأمر التالي:
data <- read.csv(“d:/mydir/myfile.csv”, header=TRUE, sep=”;”)

كما هو واضح فقد أشرنا إلى أن السطر الأول من محتويات الملف المستورد هو عبارة عن تسميات الأعمدة من خلال الخاصية header=TRUE، كذلك تم تحديد الفاصل ما بين عمود وآخر من البيانات على أنه الفاصلة المنقوطة من خلال الخاصية “;”=sep. وقد استخدمنا في هذا المثال الاسم الكامل للملف بما فيه المسار، أما إن ذكرت اسم الملف دون تحديد المسار فسيتم البحث عنه ضمن ما يدعى بمجلد العمل، ولمعرفة أين يشير مجلد العمل الحالي لديك يمكنك استخدام الأمر ()getwd، أو يمكنك تحديد مجلد عمل مختلف باستخدام الأمر ("setwd("d:/mydir ، من جهة أخرى يمكنك الاستعاضة عن كل ذلك باستخدام الأمر ()file.choose عوضا عن ذكر اسم الملف ومساره، حيث ستحصل عند التنفيذ على صندوق حوار يتيح للمستخدم استعراض ما على حاسوبه من مجلدات وملفات وصولا إلى اختيار الملف المطلوب.

كما سبق وأن رأينا فإن عملية الإسناد في لغة R يشار إليها بالرمز <- وهي الطريقة الأكثر شيوعا مقارنة برمز المساواة = والذي يصح استخدامه على الرغم من عدم شيوعه بين معشر المبرمجين بلغة R، إن البيانات المقروءة سيتم حفظها ضمن إطار بيانات (dataframe) أسميناه في حالة مثالنا السابق data، ويمكنك استعراض محتويات إطار البيانات ذلك بمجرد كتابة اسمه ومن ثم النقر على زر الإدخال ضمن سطر الأوامر، أما إن كانت كمية البيانات ضخمة فمن المفيد استخدام أي من الأمرين (head(data والذي يعرض مجموعة من الأسطر مقتطعة من بداية كتلة البيانات، أو الأمر (tail(data والذي يعرض مجموعة أخرى من الأسطر مقتطعة من نهاية كتلة البيانات ذاتها. كذلك تستطيع استخدام الأمر التالي:
data <- edit(data)

لعرض تلك البيانات ضمن نافذة جدول بسيط يتيح للمستخدم تنقيحها ومن ثم إعادتها إلى ذات إطار البيانات الأصلي كما هو موضح من الأمر السابق. إن كانت البيانات مخزنة في ملف نصي يستخدم رمز الجدولة للفصل ما بين أعمدته (أي text tab delimated)، فعليك حينها استخدام الأمر read.data عوضا عن الأمر read.csv الموضح في المثال السابق، وهناك حالة خاصة عندما تكون البيانات المراد استيرادها موجودة فعليا ضمن الحافظة، وحينها عليك الاستعاضة عن ذكر اسم الملف بالعبارة “clipboard”. لدى لغة R أيضا المزيد من تعليمات الاستيراد التي تختص كل منها بتنسيق مختلف، فعلى سبيل المثال لا الحصر نذكر الأوامر التالية:

read.spss و read.systat و read.mtp و read.xport.

[color=purple]نستطيع الوصول بكل سهولة إلى أي جزئية في إطار البيانات الحالي من خلال المرونة التي تتيحها لنا لغة R، فلو كان لدينا إطار عمل يدعى data على سبيل المثال، فإن التعبير [data[i,j سيشير إلى العنصر أو القيمة الموجودة في السطر i والعمود j، أما التعبير [,data[i فيشير إلى كامل السطر i في حين أن التعبير [data[,n:m فيشير بدوره إلى مجموعة الأعمدة بدءا من n حتى m، من جهة أخرى فإن التعبير [,data[-i فيشير إلى كامل البيانات ضمن data فيما عدى السطر i، وأخيرا فإن التعبير [,(data[c(n,m فهو يشير إلى السطرين n و m تحديدا دون غيرهما من أسطر البيانات في data. []/color

تأتي لغة R محزومة مع إطار بيانات افتراضي يدعى mtcars يتضمن بيانات مأخوذة من مجلة Motor Trend لعام 1974 تقارن فيها عشر من مواصفات التصميم والأداء لأكثر من ثلاثين سيارة منتجة في العام 1973، وسنستخدم من بيانات تلك المواصفات في مقالتنا هذه كل من mpg ويقصد بها عدد الأميال المقطوعة بغالون البنزين الواحد، و cyl الذي يمثل عدد الإسطوانات في محرك السيارة، و wt وهو الوزن بآلاف الليبرات (الليبرة تقريبا نصف كيلوغرام)، وكذلك qsec وهو التسارع مقاسا بالزمن اللازم لقطع مسافة ربع ميل (لمزيد من المعلومات والتفاصيل يمكنك طلب المساعدة باستخدام التعليمة ?mtcars). سنستخدم هذه البيانات في استعراض مجموعة من الأمثلة حول ما سيتلو ذكره من دوال وتقنيات إحصائية.

بمجرد استيراد بياناتك يمكنك الوصول إلى القيم الموجودة في أي من أعمدة جدولك باستخدام الصيغة mtcars$mpg على سبيل المثال حيث mpg يشير إلى اسم العمود، أما إن أردت أسلوبا أكثر سهولة واختصارا يقتصر على ذكر اسم العمود فقط دون الحاجة إلى ذكر اسم إطار البيانات المأخوذ منه في كل مرة، فعليك بداية استخدام الأمر (attach(mtcars عقب استيرادك للبيانات، وحينها يكفي ذكر الاسم mpg للدلالة على ذات العمود من البيانات. وتستطيع استعراض ما تحويه ذاكرة الجلسة الحالية من بيانات في لغة R باستخدام الأمر ()ls ، إضافة إلى ذلك يمكنك حذف أي من كتل البيانات تلك من ذاكرة الجلسة الحالية باستخدام الأمر (rm(x حيث يشير الرمز x إلى اسم كتلة البيانات سواء كانت عمود (أي شعاع من القيم) أو مصفوفة أو إطار بيانات كامل، حتى أنك تستطيع حذف كل ما يوجد الآن في ذاكرة الجلسة الحالية من بيانات سبق وأن تم تحميلها وذلك باستخدام الأمر (()rm(list=ls.

عند قيامك بتحميل بياناتك إلى ذاكرة الجلسة الحالية، تصبح مستعدا للبدء في العمل عليها لتطبيق تحليلاتك المختلفة. ومن الأوامر الأساسية المتاحة نذكر على سبيل المثال الدالة (max(mpg والتي تعيد القيمة العظمى ضمن العمود mpg (أي شعاع القيم mpg)، أما الدالة (min(mpg فهي على عكس سابقتها تعيد القيمة الصغرى، في حين أن الدالة (mean(mpg تعيد المتوسط الحسابي للقيم الواردة في mpg، والدالة (median(mpg تعيد قيمة الوسيط (الوسيط هو القيمة التي تقع في المنتصف عند ترتيب قيم mpg تصاعديا، وبالتالي تكون نصف قيم mpg تزيد عن قيمة هذا الوسيط فيما النصف الآخر يقل عنها، وعادة ما يستخدم الوسيط للدلالة على مركز المجموعة حينما تكون هناك قيم متطرفة زيادة أو نقصانا بحيث تؤثر على المتوسط الحسابي وتؤدي إلى انحيازه). من جهة أخرى هناك دوال تستخدم لوصف مدى تشتت قراءات وقيم mpg حول النقطة المركزية الممثلة بالمتوسط، ومنها الدالة (var(mpg والتي تحسب مقدار التباين، والدالة (sd(mpg والتي تعيد قيمة الانحراف المعياري.

يحسب التباين من خلال العلاقة التالية irUJUSoBg8FXIvatIckAAAAASUVORK5CYII= أي أننا نراكم مجموع فروقات كل واحدة من قراءاتنا عن قيمة المتوسط بعد أن نربّع هذا الفرق، حيث تخدم عملية التربيع في جعل الناتج موجبا دوما (كون الأخطاء أو الفروقات موجودة سواء كانت بالزيادة أو النقصان، وإن لم نفعل ذلك لحصلنا دوما على الناتج 0 كمحصلة لعملية الجمع تلك)، الخدمة الثانية التي نحصل عليها من هذا التربيع هي تقليل أثر الفروقات الصغيرة على حساب تعظيم ومضاعفة تأثير الفروقات الكبيرة (فتربيع الأرقام الصغيرة لايضاعفها بقدر ما يفعل مع الأرقام الكبيرة، ولولا ذلك لاكتفينا بالقيمة المطلقة للفروقات المحسوبة عن المتوسط عند حساب مقدار التباين). من جهة ثانية فإن الانحراف المعياري يقوم بتقييس معيار التباين وذلك للتعبير عن التشتت بصيغة مستقلة عن عدد العينات أو القراءات التي لدينا (والتي تؤثر على قيمة التباين كونه حساب تراكمي يزداد بازدياد عدد القراءات)، وتتم عملية التقييس تلك من خلال تقسيم مقدار التباين الناتج على (n-1) وهو عدد العينات منقوصا منه واحد، وبعد عملية القسمة تلك نحسب الجذر التربيعي الناتج وذلك حتى يعود المقدار المحسوب إلى ذات فضاء القيم الموجودة لدينا بدلا من كونه في حالة التباين من مرتبة مربّع تلك الأرقام، فيعود من السهل علينا مقارنته مباشرة مع قيمنا أو المتوسط الخاص بتلك القيم.

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

[color=green]كذلك تمتلك لغة R مجموعة واسعة من الدوال الرياضياتية مثل (abs(x والتي تعيد القيمة المطلقة (الإيجابية الإشارة دوما) للقيمة أو شعاع القيم المدخل لها، والدالة (sqrt(x التي تحسب الجذر التربيعي والتي نستطيع الحصول على نفس وظيفتها من خلال عملية الرفع إلى أس مقداره نصف أي x^0.5 ، كذلك لدينا الدوال المثلثية المختلفة مثل (sin(x و (cos(x وغيرهما، هذا بالإضافة إلى طيف من دوال التقريب المختلفة مثل (floor(2.718 والتي ستعيد القيمة 2 كأكبر عدد صحيح أصغر من القيمة المعطاة،

وكذلك الدالة (ceiling(3.142 والتي ستعيد القيمة 4 كأصغر عدد صحيح أكبر من القيمة المعطاة، أما الدالة (round(2.718, digits=2 فستعيد القيمة 2.72 حيث تقوم هذه الدالة بعملية التقريب الحسابية المعتادة مع إمكانية تحديد عدد الخانات العشرية بعد الفاصلة والتي تريد الاحتفاظ بها. لدينا أيضا دوال التحويل مثل (log(x التي تحسب اللوغاريتم الطبيعي للمقدار x، فيما تحسب الدالة (log10(x اللوغاريتم العشري لذات المقدار x، مع هذا يمكنك استخدام الصيغة الأكثر مرونة وهي (log(x,n والتي تحسب اللوغاريتم لأي أساس يحدده المبرمج من خلال المقدار n، فمثلا يمكنك حساب اللوغاريتم الثنائي للمقدار x باستخدام التعليمة (log(x,2. [/color]

هذه هي نهاية الجزء الأول من سلسلة المقالات التي تتحدث عن لغة R، سنتحدث في الجزء الثاني عن المخططات البيانية الإحصائية.

انتهى.

/

كتبه/ م. خالد الشمعة.
المصدر/ أكاديمية حسوب.

بحول الله تعالى يكُن لقاء جديد؛ في رحاب التقنية، ولغات البرمجة.

إعجاب واحد (1)