أيهما افضل R او Python.. الجواب :الإثنان معًا


حزم R


منذ اصبح علم البيانات عنصر مهم وسبب لنجاح او فشل كثير من المؤسسات والشركات الكبيرة عالميا ومحليا,وهو منقسم إلي فريق البايثونين والآرستاتيين. هذا الإنقسام زاد قطبية مع ازدياد المصادر و المواقع التعليمية التي تقدم آلاف الدورات التدريبية في كل من اللغتين فالكثير من الطلاب والمهتمين الجدد يجدو انفسهم امام سؤال تحديد هوية وانتماء قبل أن يبدءون مشوارهم.

فلا عجب أن يكون اكثر سؤال اتلقاه انا وأصدقائي المختصين على تويتر هو “أيهم افضل R او Python؟”. في السابق كنت انصح فقط بلغة R بينما ينصح الآخرون بلغة Python. الآن لازلت انصح بتعلم لغة R لكني ايضا انصح بتعلم لغة Python ايضا لأنه إن كنت فعلًا تريد ان تبحر في مجال علم البيانات فلابد أن يسع قلبك إلى اللغتين معًا. السبب هو ان لكل لغة مراكز قوة مختلفة فالإلمام بهما معا يفتح لك ابواب علم البيانات على مصراعيه. إن كنت من محبي “الكومكيس” فتعلم اللغتين هو ان تكون “سوبرمان” و “باتمان” في آن واحد.

لا أخفيكم سرًا انني من المنتمين إلى حزب الآرستاتيين, لكن في هذه التدوينة احمل بشرى سارة لكل الحزبين. الآن يمكنك الدمج في نوت بوك واحد كل من اللغتين. بل بالإمكان البدء بلغة وإكمال التحليل باللغة الأخرى. وكل ذلك في ملف Rmarkdown في بيئة R.

حزمة reticulate

هذه الحزمة توفر الكثير من الإمكانيات لتنفيذ اكواد Python بكل سهولة في بيئة R من تلك الإمكانيات هي

  • تنفيذ اكواد Python سواء كانت عدة سطور او ملف سكريبت كامل. كذلك يمكنك ارفاق اي حزم تخص لغة البايثون

  • الإنتقال بكل سلاسة من عناصر لغة R إلى الـPython والعكس. ذلك يعني اننا بالإمكان استخدام إيطار بيانات (Data Frame) من حزمة pandas إلى بيئة R بدون اي عناء.

  • إمكانية استخدام عدة إصدارات من python في نفس النوت بوك.

مثال سريع

في العادة نقوم بتحميل اي حزمة نريد ان نستخدمها عن طريق استخدام دالة install.packages()لكن الممارسة الأفضل للمبرمج الجيد هو ان نتحقق من وجود الحزمة اولا حتى نتفادى إعادة تحميل الحزمة كل مرة نقوم بتنفيذ الكود.

if("reticulate" %in% rownames(installed.packages()) == FALSE) {
  install.packages("reticulate")
}
library("reticulate")
library("tidyverse")

ايضا من الممارسات الجيدة أن يكون لديك بيئة افتراضية لإصدار البايثون الذي تستخدمه لمشاريع علم البيانات بمنعزل عن إصدار البايثون الذي يستخدمه النظام . ذلك يساعدنا لتجنب اي مشاكل مع النظام فيما لو اردنا ان نستخدم إصدار مختلف. يمكننا إنشاء هذه البيئة عن طريق امر بسيط في Command Line Interface.

conda create -n dataScience python=3.6

حتى نتمكن من إستخدام البيئة التي قمنا بإنشاءها سوف نقوم بإستخدام دالة خاصة من reticulate وهي use_condaenv(). سوف ايضا نجعل استخدام تلك البيئة ضروريا.

# بيئة آر
use_condaenv("dataScience", required = T)

سوف نتأكد من النسخة التي لدينا عن طريق استخدام حزمة sysمن بايثون لكن سوف نقوم بتحميلها عن طريق R كما نرى ادناه نسخة python تطابق النسخة التي خصصناها في البيئة الإفتراضية.

# بيئة آر
sys <- import("sys")
sys$version # لطباعة إصدار البايثون
## [1] "3.6.7 |Anaconda, Inc.| (default, Oct 23 2018, 19:19:38) \n[GCC 7.3.0]"

سوف نقوم بإستخدام قاعدة البيانات المتوفرة في بيئة R ونقلها إلى بيئة الـ Python

# بيئة آر
aq <- airquality 
head(aq)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6

الآن يمكننا الحصول على تلك البيانات من خلال الـ Object r. سوف نقوم برسم جزء من تلك البيانات حتى نتأكد من وجودها فعلا في بيئة الـpython.

#بيئة بايثون 
import pandas 
import matplotlib.pyplot as plt
air_py = r.aq # بإمكاننا الحصول على البيانات من عنصر آر الذي ارفقه النظام لنا في بيئة بايثون

# تصوير مستويات درجة الحرارة في مدينة نيويورك
plt.plot(air_py["Temp"].dropna())
plt.title("New York Air Quality Measurements-(May-Sept 1973)\nTemperature (degrees F)")
plt.xlabel("#Day")
plt.ylabel("Degrees F")

دعنا الآن نعرّف دالة في بيئة Python لنقوم بإستخدامها في بيئة R

# بيئة بايثون
def month_num_to_str(df,k):
    df_py = df[k]
    mon_lookup = {1 : "January",
                2: "February",
                3: "March",
                4: "April",
                5: "May",
                6: "June",
                7: "July",
                8: "August", 
                9: "September", 
                10: "October", 
                11: "November",
                12: "December"}
    return df_py.map(mon_lookup)

في الكود اعلاه قمنا بتعريف دالة تقوم بتحويل الشهور من الأرقام إلى الأسماء. دعنا الآن نستخدمها في بيئة R

# بيئة آر
aq["Month_Str"] <-  py$month_num_to_str(aq, "Month")

head(aq)
##   Ozone Solar.R Wind Temp Month Day Month_Str
## 1    41     190  7.4   67     5   1       May
## 2    36     118  8.0   72     5   2       May
## 3    12     149 12.6   74     5   3       May
## 4    18     313 11.5   62     5   4       May
## 5    NA      NA 14.3   56     5   5       May
## 6    28      NA 14.9   66     5   6       May

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

الخلاصة

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


جرب بنفسك

كامل الكود تجده هنا

comments powered by Disqus