موقع د. عزيز الجعيد
  • الرئـيـسـية

  • الأقسام

    • علم البيانات والذكاء الإصطناعي

    • ذكاء الأعمال

    • لغة البرمجة بايثون

    • مقالات متنوعـة

    • لغة البرمجة آر R

    • الإحــــــصــــــاء

    • البيانات المفتوحة

  • عـنــي

  • تواصل معي

علم البيانات والذكاء الاصطناعي

  • الرئـيـسـية

  • الأقسام

    • علم البيانات والذكاء الإصطناعي

    • ذكاء الأعمال

    • لغة البرمجة بايثون

    • مقالات متنوعـة

    • لغة البرمجة آر R

    • الإحــــــصــــــاء

    • البيانات المفتوحة

  • عـنــي

  • تواصل معي

برنامج آر R

12/01/2017 | لغة البرمجة آر R

البرنامج الإحصائي آر R هو واحد من أشهر البرامج الإحصائية. هذا البرنامج يعتمد على لغة البرمجة R والتي قام بتطويرها كلاً من : Ross Ihaka و Robert Gentlema من جامعة أوكلاند، نيوزيلندا. يقوم على تطوير البرنامج الآن R Development Core Team. كانت إنطلاقة هذا البرنامج عام 1992. ويتميز هذا البرنامج بأنه مجاني (مفتوحة المصدر). لغة البرمجة R تشبه لغة البرمجة S التي تم تطويرها في مختبرات بيل.

البرنامج الإحصائي R هو برنامج يسمح بناء البرامج والتطبيقات الإحصائية .كذلك، هذا البرنامج يحوي تشكيلة واسعة من التطبيقات الإحصائية مثل: الإنحدار الخطي وغير الخطي، واختبارات الفروض الإحصائية، والرسومات الإحصائية. هناك العديد من الحزم (packages) المتخصصة والتي يمكن تحميها على البرنامج لكي يمكن إستخدمها. هذه الحزم تغطي معظم الأساليب الإحصائية وبشكل متخصص ودقيق جداً. يمكن تحميل نسخة من هذا البرنامج بريارة الموقع الرسمي (https://www.r-project.org). عند تحميل البرنامج، يتم تثبيت الحزم الأساسية مباشرة. حيث أن الواجهه الرئيسية للبرنامج هي:

آر استوديو (RStudio)

22/04/2017 | لغة البرمجة آر R

آر استوديو هو بيئة تشغيل للبرنامج الإحصائي آر R يحوي مجموعة من النوافد والأدوات المصممة بشكل رائع والتي تساعد على إدارة جلسة البرمجة بشكل منظم يساعد على زيادة الإنتاجية والإبداع. أستخدام مثل هذا البرنامج لايتطلب لغة برمجة مختلفة عن آر R. لهذا البرنامج عدة نسخ منها المجاني ومنها المدفوع (مخصص للأغراض التجارية). يمكن تحميل آر استوديو على أجهزة الكمبيوتر كما يمكن الوصول اليه باستخدام متصفح الويب من حلال تشغيله على خادم لينكس (Linux) عن بعد. وهو متوفر لأنظمة التشغيل ويندوز (Windows) وماك (macOS) ولينكس (Linux). للإطلاع على مميزات هذا البرنامج بشكل مفصل، يمكن زيارة صفحة الويب (مميزات برنامج آر استوديو). الصفحة الرئيسية للبرنامج هي على الشكل التالي:

مقدمة في لغة البرمجة آر R

12/01/2017 | لغة البرمجة آر R

هذا الموضوع سوف نوضح بالتفصيل بعض الأساسيات في لغة البرمجة آر R والتي تمثل الخطوه الأولى في فهم هذه اللغة الهامة ويمكن تلخيصها كما يلي:

اولاً: إدخال القيم

In:
x=2
x
Out:
[1] 2

كذلك

In:
y="Ahmed"
y
Out:
[1] "Ahmed"

ويمكن إدخال متجه (vector) يحوي قيم عددية أو أسمية كما يلي :

In:
x=c(1,5,6,8,7) 
x
Out:
[1] 1 5 6 8 7
In:
z=c("Ahmed","Mohammed")
z
Out:
[1] "Ahmed" "Mohammed"

كذلك، يمكن إدخال مصفوفة (matrix) عدد أعمدتها (ncol) يساوي 2 وعدد صفوفها (nrow) يساوي 3، حيث ترتب العناصر بداً بالأعمدة كما يلي :

In:
A=matrix(c(1,2,3,4,5,6),ncol=2,nrow=3)
A
Out:
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

ويمكن إدخال مصفوفة عدد أعمدتها (ncol) يساوي 2 وعدد صفوفها (nrow) يساوي 3، حيث ترتب العناصر بداً بالصفوف بإستخدام :

In:
B=matrix(c(1,2,3,4,5,6),ncol=2,nrow=3,byrow=T)
B
Out:
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

كما يمكن استخدام مجموعة مصفوفة في ثلاث ابعاد (array) كما يلي:

In:
C = array(1:8, dim = c(2, 2, 2))
C
Out:
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

كذلك، اطار بيانات (dataframe)، كما يلي:

In:
y=c(30,40)
z=c("Ahmed", "Mohammed")
d=data.frame(y,z)
d
Out:
   y        z
1 30    Ahmed
2 40 Mohammed

كما يمكن استخدام قائمة (list) وعناصرها يمكن أن تكون متجه، مصفوفة، إطار بيانات او قائمة. مثلاً:

In:
l = list(x, A)
l
Out:
[[1]]
[1] 1 5 6 8 7

[[2]]
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

ويمكن فهرسة (indexing) طرق إدخال البيانات المختلفة كما يلي

النوع مثال الوصف
المتجه (vector) x[i] العنصر الذي ترتيبه i
المصفوفة (matrix) A[i,j] العنصر الذي في الصف i والعمود j
مجموعة المصفوفة (array) l[i,j,k] العنصر الذي في الصف i والعمود j والمستوى k
اطار البيانات (dataframe) d[i,j] العنصر الذي في الصف i والعمود j
القائمة (list) l[[i]] العنصر الذي ترتيبه i

 

ثانياً: العمليات الحسابية

العملية الكود
الضرب *
القسمة /
الجمع +
الطرح –
الجذر للعدد a sqrt(a)
الأس ^
الوغاريتم للعدد a log(a)
ضرب المصفوفات %*%
منقول المصفوفة A t(A)
معكوس مصفوفة A solve(A)

والتي يمكن استخدامها على المدخلات العددية بسهولة. فمثلاً:

In:
x=c(1,5,6,8,7)
y=c(2,3,5,9,10)
x+y
Out:
[1]  3  8 11 17 17

أو تخزينها في متغير جديد:

In:
d=x+y

ملاحظة: عند إستخدام * لضرب المتجهات أو المصفوفات فإنه يضرب العناصر المتناظرة مع بعض، بالتالي لضرب المصفوفات حسب الطرق الرياضية الصحيحة استخدم %*%.

 

ثالثاً: كتابة سلسلة عددية بعدة طرق، فمثلاً السلسلة العددية من من 1 الى 20 يمكن كتابتها بالطرق التالية:

الوصف الكود
 عدد عناصرها 20 وتكون بتزايد ثابت  seq(1,10,length=20)
 بتزايد يساوي 0.7  seq(1,10, by=0.7)
 من 1 الى 20 بتزايد ثابت يساوي 1  seq(20)  او  seq(1:20)

 

رابعاً: التكرار، فمثلاً يمكن إعادة تكرار العدد 1 ثلاث مرات كما يلي :

In:
r=rep(1,3)
r
Out:
[1] 1 1 1

كذلك يمكن تكرار السلسلة من 1 الى 3 مرتين كما يلي:

In:
r=rep(1:3,2)
r
Out:
[1] 1 2 3 1 2 3

او تكرار “Mohammed” ثلاث مرات كما يلي:

In:
r=rep("Mohammed",3)
r
Out:
[1] "Mohammed" "Mohammed" "Mohammed"

خامساً، المقاييس الإحصائية لمتجه x يمكن تلخيصها كما يلي:

المقياس الكود
 المتوسط الحسابي  mean(x)
 الانحراف المعياري  sd(x)
 التباين  var(x)
 اكبر قيمة  max(x)
 أصغر قيمة  min(x)
الوسيط median(x)
المدى range(x)
التقسيم quantile(x,p), 0<p<1

ملاحظة: لعرض بعض ملخص الإحصائيات يمكن استخدام :

In:
summary(x)

سادساً: تحميل وتفعيل المكتبات او الحزم (packages):

الدالة الوصف
install.packages(“xxx”) تحميل حزمة  xxx
library(xxx) تفعيل حزمة xxx

عرض البيانات وتحريرها بشكل تفاعي في آر R

27/05/2022 | لغة البرمجة آر R

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

يمكن استخدام المكتبة كما يلي:

In:
install.packages("DataEditR")
library(DataEditR)
data_edit(mtcars)

ثم يمكن بعد ذلك التعامل مع البيانات بشكل تفاعلي كما يلي:

المصدر: https://cran.r-project.org

التوزيعات الإحتمالية في لغة البرمجة آر R

12/01/2017 | لغة البرمجة آر R

التوزيعات الإحتمالية في البرنامج الإحصائي آر R تعطى من خلال الدوال التالية:

أسم التوزيع بالعربي أسم التوزيع بالأنجليزي أسم التوزيع في برنامج آر R
التوزيع الطبيعي Normal distribution norm
توزيع بيتا Beta distribution beta
توزيع ذات الحدين Binomial distribution binom
توزيع كاي تربيع Chi-squared distribution chisq
التوزيع الأسي Exponential distribution exp
توزيع جاما Gamma distribution gamma

لكل توزيع هناك اربع دوال في البرنامج. للحصول على مساعدة حول اي توزيع اكتب اسم التوزيع مسبوقاً بعلامة إستفهام (مثلاً : norm? للحصول على مساعدة حول التوزيع الطبيعي). اسم التوزيع مسبوق بحرف d للحصول على دالة الكثافة الإحتمالية (probablity density function). اسم التوزيع مسبوق بحرف p للحصول على دالة التوزيع التراكمية (cumulative distribution function). اسم التوزيع مسبوق بحرف q للحصول على الدالة التتقسيمية (quantile function). اسم التوزيع مسبوق بحرف r للحصول على دالة العينة العشوائية. فمثلاً، في حالة التوزيع الطبيعي هناك اربع دوال هي :

In:
dnorm(x, mean = 0, sd = 1, log = FALSE)
pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)
rnorm(n, mean = 0, sd = 1)

حيث أن المتوسط (mean) ويكون الافتراضي صفر، ولإنحراف المعياري (sd) ويكون الإفتراضي 1، وحجم العينة العشوائية (n)، وقيمة الأحتمال (p) وتكون بين 0 و 1 .

مثلاً، نريد ان نرسم دالة الكثافة الإحتمالية (probablity density function) للتوزيع الطبيعي بتموسط 5 وإنحراف معياري 1 .

In:
x=seq(1,9,by=0.001)
f.x=dnorm(x,mean=5,sd=1)
plot(x,f.x,type="l",ylab="Density",lwd=2)

كتابة دالة في لغة البرمجة آر R

12/01/2017 | لغة البرمجة آر R

يستطيع مستخدم لغة البرمجة آر تعريف دالة (User-defined Function) تقبل عدد من المتغيرات وتجري عليها بعض العمليات للوصول الى نتائج معينة وهي تمثل اختصار للمجموعة من الأوامر والعبارة البرمجية بحيث تسهل التعامل معها واستدعائها. وتأخذ الدالة المعرفة في آر الشكل العام التالي:
function_name=function(arg,...){
body
}

حيث أن:

function_name أسم الدالة
arg متغير او عدة متغيرات ويمكن أن تكون متجه، مصفوفة، قائمة … الخ.
body العمليات التي سوف تتم على المتغيرات (arg) حتى عرض النتائج.

لكتابة الدالة SQ في لغة البرمجة آر R والتي تكون مدخلاتها القيمة x ثم تحسب القيمه التربيعه لها، يمكن استخدام الكود التالي:

In:
SQ=function(x){
 out=x^2
 return(out)
 }

ثم بعد ذلك يتم استدعاء الدالة من خلال أسمها كما يلي:

In:
SQ(2)
Out:
[1] 4
In:
SQ(3)
Out:
[1] 9

لكتابة الدالة SR في برنامج آر R والتي تكون مدخلاتها القيمة x ثم تحسب الجذر التربعي. تعطي هذه الدالة رسالة خطأ إذا كانت القيمة المدخلة أصغر من الصفر، يمكن استخدام الكود التالي:

In:
SR=function(x){
out=ifelse(x>=0,sqrt(x),"error: x must be >=0")
return(out)
 }

والتي يمكن أن تعطي النتائج التالية:

In:
SR(4)
Out:
[1] 2
In:
SR(-4)
Out:
[1] "error: x must be >=0"

لكتابة الدالة SS في برنامج آر R والتي تكون مدخلاتها المتجه x ثم تحسب الوسط والوسيط وأصغر وأكبر قيمة. تعطي هذه الدالة رسالة خطأ إذا كان طول المتجه أصغر من 2، يمكن استخدام الكود التالي:

In:
SS=function(x){
  if (length(x)<2){ print("the length of vector x must be > 2")}
  else{
    m1=mean(x)
    m2=median(x)
    m3=min(x)
    m4=max(x)
  return(list(Mean=m1,Median=m2,Minimum=m3,Maximum=m4))}
}

والتي يمكن استخدامها كما يلي:

In:
x=c(1,3,4)
SS(x)
Out:
$Mean
[1] 2.666667

$Median
[1] 3

$Minimum
[1] 1

$Maximum
[1] 4
In:
x=2
SS(x)
Out:
[1] "the length of vector x must be > 2"

الدوال الشرطية في لغة البرمجة آر R

14/07/2017 | لغة البرمجة آر R

هناك عدة صيغ يمكن إستخدامها لتضمين الأوامر الشرطية في كود برنامج آر R. في هذا المقال سوف نستعرض بعض هذه الصيغ مع الأمثلة.

اولاً: استخدام  if … else كمايلي:
if (الشرط):
إذا تحقق الشرط
}
else{
إذا لم يتحقق الشرط
}

مثلاً، هذه دالة تحدد نوع العدد المدخل، هل هو موجب أو سالب (اعتبار الصفر موجب)

In:
NUM=function(x){
 if (x>=0){
 print("عدد موجب")
 }
 else{
 print("عدد سالب")
 }
}

لتنفيد الكود إستخدم مثلاً الأوامر التالية:

In:
NUM(2)
Out:
[1] "عدد موجب"
In:
NUM(-3)
Out:
[1] "عدد سالب"

ثانياً: استحدام الدالة ifelse والتي تأخذ الشكل العام التالي:
ifelse(إذا لم يتحقق الشرط,إذا تحقق الشرط,الشرط)

فمثلاً:

In:
NUM=function(x){
 out=ifelse(x>=0,"عدد موجب","عدد سالب")
print(out)
}

ثالثاً: استخدام if … else المضمنه كما يلي:

In:
NUM=function(x){
 if (x > 0) {
 print("عدد موجب")
 } else if (x < 0) {
 print("عدد سالب")
 } else
 print("صفر")

حلقات التكرار (loops) في لغة البرمجة آر R

28/04/2020 | لغة البرمجة آر R

عند برمجة كثيراً من المشاكل الإحصائية بإستخدام لغة البرمجة آر R، نحتاج في كثير من الأحيان لبناء حلقات التكرار (loops). عليه سوف نناقش مجموعة الأوامر والطرق لبناء حلقات التكرار في لغة البرمجة آر. لتوضيح ذلك، نفرض اننا نريد حساب قيمة المعادلة: $y=x_i+x_{i+1}$  لجميع قيم $i\leq3$ حيث أن $x$  عبارة عن متجه (vector) يحوي القيم من 1 الى 4.

اولاً: باستخدام  الأمر while، ويكون ذلك من خلال الكود التالي:

In:
x=seq(1:4)
i=1
y=c()
while (i<=3){
  y[i]=x[i]+x[i+1]
  i=i+1
}
y
Out:
[1] 3 5 7

ثانياً: باستخدام  الأمر for، ويكون ذلك من خلال الكود التالي:

In:
y=c()
for (i in 1:3){
  y[i]=x[i]+x[i+1]
}
y
Out:
[1] 3 5 7

ويمكن كذلك استخدام حلقات التكرار بشكل متداخل. لتوضيح ذلك نفرض ان لدينا المعادلة التالية: $y=(x_i+x_{i+1})^\frac{1}{m}$ ونرغب في حسابها بالنسبة لـ $x=1,2,3$ و $m=1,2$، ويمكن ذلك من خلال استخدام الكود التالي:

In:
x=seq(1:4)
m=c(1,2)
out=matrix(nrow=3,ncol=2)
for (j in 1:2){
  for (i in 1:3){
    out[i,j]=(x[i]+x[i+1])^(1/m[j])
  }}
out
Out:
     [,1]     [,2]
[1,]    3 1.732051
[2,]    5 2.236068
[3,]    7 2.645751

يمكن استخدام حلقة التكرار for  مع جميع انواع المتجهات مثل التاريخ والنصوص وغيرها، مثلاً:

In:
Names=c("Aziz", "Mohammed", "Ali")
for (i in Names){
  print(i)
}
Out:
[1] "Aziz"
[1] "Mohammed"
[1] "Ali"

كذلك يمكن استخدامها لتكرار عمليات برمجية على عدد من الملفات في مجلد معين، فمثلا اذا كان المجلد myfolder يحوي عدد من الملفات A, B, C  فيمكن استخدام الكود التالي لعمل تكرار على هذه الملفات:

In:
setwd("myfolder")
mydata=data.frame()
fileNames = Sys.glob("*.txt")
for (f in fileNames){
myfile=read.table(f,sep=",",header = T)
mydata=rbind(myfile,mydata)
}
print(mydata)
Out:
      Name Age
1     Sami  39
2      Ali  41
3 Mohammed  34

حيث يتم استبدال myfolder بدليل العمل الى المجلد الذي يحوي الملفات، وكذلك txt بأمتداد الملفات.

ملاحظة.
يمكن استخدام الأوامر التالية:

1. نستخدم الأمر next لتجاوز التكرار الحالي من الحلقة، فمثلاً لتجاوز التكرار عندما تكون قيمة x سالبة نستخدم:

In:
x=c(4,-6,9)
for (i in x){
if (i<0){next}
out=sqrt(i)
print(out)
}
Out:
[1] 2
[1] 3

2. نستخدم الأمر break لأنهاء الحلقة الحالية، مثلاً لأنها الحلقة عندما يكون قيمة x  سالبة نستخدم:

In:
x=c(4,-6,9)
for (i in x){
  if (i<0){break}
  out=sqrt(i)
  print(out)
}
Out:
[1] 2

عائلة الدالة apply في لغة البرمجة آر R

14/01/2019 | لغة البرمجة آر R

عائلة الدالة apply في برنامج آر R هي بديل فعال للحلقات التكرارية (Loops) وتتعامل مع هياكل مختلفة من البيانات، وهي تشمل الدوال التالية:

  1. apply: وهي دالة تتعامل مع المصوفات حيث يمكن من خلالها إجراء العمليات على الصفوف او الأعمده بكل مرونه وهذه الدالة تأخد الشكل التالي:

apply(X, MARGIN, FUN)

حيث أن:

X مصفوفة
MARGIN جزء من مصفوفة حيث 1 يشير للصفوف و 2 يشير للأعمدة
FUN الدالة المطلوب تطبيقها

نفرض أن لدينا المصفوفة التالية:

In:
X=array((1:9),c(3,3))
X
Out:
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

بالتالي الأمر apply يستخدم لتطبيق دالة على أعمدة او صفوف المصفوفة، فمثلاً يمكن حساب المتوسط (mean) للأعمدة كما يلي:

In:
apply(X,2,mean)
Out:
[1] 2 5 8

او للصفوف كما يلي:

In:
apply(X,1,mean)
Out:
[1] 4 5 6

كما يمكن استخدام apply مع اي دالة خاصة، فمثلاً لحساب مجموع عناصر كل عامود مضروب في 10 نستخدم:

In:
apply(X,2,function(X)sum(X)*10)
Out:
[1]  60 150 240

2. lapply: وهي تتعامل مع قوائم البيانات (list) وتأخذ الشكل:

lapply(X, FUN, ...)

حيث أن:

X قائمة (list)
FUN الدالة المطلوب تطبيقها

ويمكن إستخدامها كما يلي:

In:
X <- list(a = 1:10, b = rnorm(10)) 
lapply(X, mean)
Out:
$a
[1] 5.5

$b
[1] 0.4354553

حيث يمكن إستبدال الدالة mean بأي دالة مبنية في آر R او معرفة بواسطة المستخدم.

3. supply: وهي تقوم بنفس عمل الدالة lapply ولكن الإختلاف في المخرجات ولها الشكل:

sapply(X, FUN, ..., simplify, USE.NAME)

حيث أن:

X قائمة (list)
FUN الدالة المطلوب تطبيقها
simplify تبسيط النتيجة الى متجه او مصفوفة
USE.NAME استخدام X اذا كانت نصية كأسماء للنتيجة إذا لم يكن لها أسماء

ويمكن إستخدامها كما الكود التالي:

In:
X = list(a = 1:10, b = rnorm(10))
sapply(X,mean)
Out:
        a         b 
5.5000000 0.3474299

4. vapply: وهي تشبه الدالة sapply ولكن تتطلب تحديد نوع المخرجات المرغوبة من الدالة وتأخذ الشكل:

vapply(X, FUN, FUN.VALUE, , ..., USE.NAME)

حيث أن:

X قائمة (list)
FUN الدالة المطلوب تطبيقها
FUN.VALUE متجه (قالب للنتيجة من FUN)
USE.NAME استخدام X اذا كانت نصية كأسماء للنتيجة إذا لم يكن لها أسماء

وتستخدم كما في الكود التالي:

In:
X = list(a = 1:10, b = rnorm(10)) 
vapply(X, mean,numeric(1))
Out:
         a          b 
 5.5000000 -0.1269196

كذلك يمكن إستخدامها كما يلي:

In:
vapply(X, fivenum,c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))
Out:
           a          b
Min.     1.0 -1.3522746
1st Qu.  3.0 -0.4292616
Median   5.5 -0.1326287
3rd Qu.  8.0  0.5984162
Max.    10.0  1.0095862

5. replicate: وهي تقوم بتكرار عملية معينة عدد من المرات، حيث تأخذ الشكل التالي:

replicate(n, expr, simplify)

حيث أن:

n عدد مرات التكرار
expr العبارة الحسابية المطلوب تكرارها
simplify تبسيط النتيجة الى متجه او مصفوفة

فمثلاً، لحساب المتوسط لعينة عشوائية من التوزيع الطبيعي وتكرار ذلك 20 مره يمكن إستخدام الكود:

In:
replicate(20, mean(rnorm(10000)), simplify = TRUE)
Out:
[1] -0.011153404 -0.001782791 -0.000470738 0.003906841 0.011111986 
[6] -0.002796648 0.007120001 0.003120159 0.007987970 0.020770251 
[11] 0.019081680 0.006376755 -0.003385706 -0.004729454 0.006226663 
[16] -0.013943534 -0.004263212 -0.001227075 0.006997650 0.013958527

6. mapply: هو نسخة متعددة المتغيرات من الدالة sapply وهي تأخد الشكل:

mapply(FUN, ..., MoreArgs, simplify, USE.NAME)

حيث أن:

FUN الدالة المطلوب تطبيقها
MoreArgs المدخلات الأخرى للدالة FUN
simplify تبسيط النتيجة الى متجه او مصفوفة
USE.NAME استخدام أسماء المدخل الأول إذا كان له أسماء أو إذا كان متجه نصي فيستخدم كأسماء

ويمكن إستخدامها كما في الكود التالي:

In:
mapply(rep, times = 1:3, x = letters[1:3])
Out:
[[1]]
[1] "a"

[[2]]
[1] "b" "b"

[[3]]
[1] "c" "c" "c"

7. tapply: في بعض الأحيان نحتاج الى تطبيق دالة على بعض البيانات وفقاً لعامل (factor) معين فيمكن أستخدام tapply والتي تأخذ الشكل:

tapply(X, INDEX, FUN, ..., default simplify)

حيث أن:

X متجه
INDEX المدخلات الأخرى للدالة FUN
FUN الدالة المطلوب تطبيقها
default فقط في حالة التبسيط الى مصفوفة، القيم الأولية الإفتراضية
simplify تبسيط النتيجة الى متجه او مصفوفة

ويمكن إستخدامها كما يلي:

In:
X=rnorm(10)
Group=rbinom(10,1,0.4)
Data = data.frame(X,Group) 
tapply(X, Group, mean)
Out:
         0          1 
 0.3576166 -0.0807149

الرسوم البيانية الأساسية في لغة البرمجة آر R

11/07/2018 | لغة البرمجة آر R

أحد تطبيقات البرنامج الاحصائي R هو عرض البيانات بإستخدام الرسوم البيانية (charts). في هذا الموضوع سوف نوضح بالأمثلة كيف يتم ذلك.

مثال(1): جمع أحد مطاعم الوجبات السريعة إستطلاع العملاء حول جودة الخدمة المقدمة لهم في المطعم وكانت النتيجة كما يلي:

ممتاز جيد مقبول سيئ سيئ جداً
15 37 13 7 4

اولاً نقوم بإدخال البيانات كما يلي:

In:
Ranking=c("ممتاز","جيد","مقبول","سيئ","سيئ جداً")
Numbers=c(15,37,13,7,4)

لتمثيل البيانات بواسطة الرسم البياني الدائري (pie chart) نستخدم الأمر التالي:

In:
pie(Numbers,main="إستطلاع العملاء حول جودة الخدمة",radius = 1,lab=Ranking, col=c("yellow","orange","red","green","blue"))

حيث تم إستخدام الأمر pie والذي يتضمن خيارات عديدة مثل: main وهو يمثل العنوان الرئيسي، radius ويمثل نصف قطر الدائرة، lab وهو يمثل مسميات القطاعات و col يمثل الوان القطاعات. بعد تنفيذ هذا الامر تكون النتيجة كما يلي:

لمعرفة مسميات الألوان، يمكن إستخدام الأمر التالي:

In:
colors()

كما يمكن يمكن التغيير قي الكود السابق كما يلي:

In:
pie(Numbers,main="إستطلاع العملاء حول جودة الخدمة",lab="",radius = 1,col=c("yellow","orange","red","green","blue"))
legend(x=-3,y=1,Ranking,cex=.8,bty="n",fill=c("yellow","orange","red","green","blue"))

حيث تم حذف المسميات وإستخدام أمر legend للحصول على مفتاح الرسم، وبالتالي أصبح الرسم البياني كما يلي:

لاستخدام الرسم البياني الدائري ثلاثي الأبعاد (3D pie chart) نقوم بتحميل وتفعيل الحزمة التالية:

In:
install.packages("plotrix")
library(plotrix)

ثم بعد ذلك نستخدم الكود التالي:

In:
pie3D(Numbers,main="إستطلاع العملاء حول جودة الخدمة",radius=1,labels=Ranking, col=c("yellow","orange","red","green","blue"),explode=0.1,labelcex=0.8)

وبالتالي سوف تكون النتيجة كما في الشكل:

كذلك يمكن عرض هذه البيانات بإستخدام الأعمدة البيانية (bar chart) بإستخدام الكود التالي:

In:
barplot(Numbers,main="إستطلاع العملاء حول جودة الخدمة",names.arg=Ranking, col=c("yellow","orange","red","green","blue"))

حيث تم إستخدام الأمر barplot والذي يتضمن عدد من الخيارات للتحكم في الرسم وكانت النتيجة كما في الشكل التالي:

كذلك يمكن إستخدام الكود التالي:

In:
barplot(Numbers,main="إستطلاع العملاء حول جودة الخدمة",names.arg=Ranking, col=c("yellow","orange","red","green","blue"),cex.names=.5,horiz=TRUE)

حيث تم إستخدام الخيار (horiz=TRUE) لتحويل الأعمدة البيانية من الوضع الراسي الى الأفقي كما في الشكل التالي:

كذلك يمكن استخدام الدالة barp المتوفرة ضمن الحزمة plotrix كما يلي:

In:
barp(Numbers,main="إستطلاع العملاء حول جودة الخدمة",names.arg=Ranking, col=c("blue"),cylindrical=TRUE, shadow=TRUE,border=FALSE)

مثال(2): كان عدد الطلاب المقبولين في أحدى الكليات خلال 5 سنوات على النحو التالي:

2014 2015 2016 2017 2018
702 650 585 740 810

بعد إدخال البيانات كما يلي:

In:
years=c(2014,2015,2016,2017,2018)
Numbers=c(702,650,585,740,810)

سوف نقوم بتمثيل هذه البيانات بإستخدام الرسم البياني الخطي بإستخدام الكود التالي:

In:
plot(years,Numbers,type="l",col="red")

أو بإستخدام الكود التالي:

In:
plot(years,Numbers,type="b",col="red")

يتضمن الأمر plot الخيار (type) والذي يمكن أن يأخد القيم الموضحة في الجدول أدناه:

النوع (type) الوصف
p نقاط
l خطوط مستقيمة
h خطوط راسية
b نقاط تصل بينها خطوط مستقيمة
s خطوط مدرجة
S خطوط مدرجة
o نقاط وخطوط مستقيمة
n بدون نقاط او خطوط

حفظ البيانات الى ملف في لغة البرمجة آر R

16/05/2020 | لغة البرمجة آر R

يمكن حفظ او تصدير البيانات في لغة البرمجة آر R بإستخدام بعض الدوال والتي تتضمن عدة خيارات تسمح بالتحكم في نوع وإعدادات الملف المخرج. في هذا المقال سوف نتناول اهم تلك الدوال والتي يمكن تلخيصها كالتالي:

اولاً: استخدام الدالة: write.table

وهي تسخدم لحفظ او تصدير البيانات الى ملف أكسل (csv)  او ملف نصي (txt) كما يلي:
 write.table(x, file, append, sep, row.names, col.names, fileEncoding)

حيث أن:

x البيانات المراد حفظها، ويفضل أن تكون مصفوفة أو data frame.
file اسم الملف ويحوي امتداد الملف
append تحديد هل يتم إضافة البيانات لملف موجود او انشاء ملف جديد وحذف اي ملف بنفس الأسم وهذا الإفتراضي (append=FALSE).
sep الفاصل بين قيم الصف الواحد، الإفتراضي ” “.
row.names  تحديد هل يتم كتابة اسماء الصفوف، حيث أن الإفتراض نعم (row.names=TRUE)
col.names تحديد هل يتم كتابة اسماء الأعمدة، حيث أن الإفتراض نعم (col.names=TRUE)
fileEncoding ترميز الملفات

فمثلاً، نفرض أن لدينا البيانات التالية:

In:
Names=c("Ali", "Mohammed","Turkey")
Age=c(33,41,29)
mydata=data.frame(Names,Age)
mydata
Out:
     Names Age
1      Ali  33
2 Mohammed  41
3   Turkey  29

لحفظ هذه البيانات في ملف csv يمكن استخدام الدالة:

In:
write.table(mydata,"myfile.csv", sep = ",", row.names = FALSE, col.names = TRUE)

ويمكن استبدال امتداد الملف csv بالإمتداد txt لحفط البيانات في ملف نصي.

كذلك يمكن استخدام الدالة التالية:

In:
write.csv(mydata,"myfile.csv")

ثانيا: استخدام الدالة write

وهي يمكن ان تستخدم  لحفظ البيانات بصيغ مختلفة كما يلي:
 write(x, file, ncolumns, append, sep)
حيث أن:

x البيانات المراد حفظها، ويفضل أن تكون مصفوفة أو data frame.
file اسم الملف ويحوي امتداد الملف
ncolumns عدد الأعمدة لكتابة البيانات فيها.
append تحديد هل يتم إضافة البيانات لملف موجود او انشاء ملف جديد وحذف اي ملف بنفس الأسم وهذا الإفتراضي (append=FALSE).
sep الفاصل بين قيم الصف الواحد، الإفتراضي ” “.

فمثلاً لحفظ البيانات السابقة في ملف json يمكن استخدام الكود التالي:

In:
library("jsonlite")
Jsonfile = toJSON(mydata)
write(Jsonfile, "myfile.json")

كيف يمكن استخدام دوال حفظ البيانات في حلقات التكرار (loops)؟
اولاً:  في بعض الاحيان نحتاج لتحديث ملف البيانات خلال دورات حلقات التكرار لحفظ بعض النتائج. مثلاً يمكن استخدام الكود التالي:

In:
for (i in 1:3){
df=t(rnorm(3))
write.table(df,"myfile.csv",sep = ",",row.names = FALSE, col.names = FALSE, append = TRUE)
}

حيث تم تفعيل خيار append في الدالة.

ثانياً: حفط البيانات او النتائج خلال دورات حلقات التكرار في ملف جديد وبأسم مختلف. مثلاً يمكن استخدام الكود التالي:

In:
for (i in 1:3){
df=t(rnorm(3))
filename=paste("myfile",i,".csv")
write.table(df,filename,sep = ",",row.names = FALSE, col.names = FALSE, append = TRUE)
}

ملاحظة: يجب تحديد موقع حفظ الملف على الجهاز من خلال الدالة:

In:
setwd("Desktop")

معالجة البيانات المفقودة باستخدام لغة البرمجة آر R

27/08/2019 | لغة البرمجة آر R

البيانات المفقودة (Missing Data) هي من القضايا الشائعة في مجال تحليل البيانات ويمكن أن يكون لها تأثير سلبي على الاستنتاجات التي يتم استخلاصها من خلال تحليل البيانات اذا لم يتم التعامل معها بالطريقة الصحيحة. المخطط ادناه يسلط الضوء بشكل مختصر على طريقة التعامل معها من خلال:

  • حذف (deletion) القيم المفقودة.
  • تعويض القيم المفقودة (imputation): وهو عملية استبدال البيانات المفقودة بقيم بديلة يتم تقديرها من خلال المقاييس والاساليب الإحصائية.

في الخطوات التالية سوف نوضح كيف يتم يتم التعامل مع البيانات المفقودة باستخدام لغة البرمجة آر، في البداية سوف نستخدم البيانات Rdata:

In:
Rdata=read.csv("Rdata.csv")

ثم نتبع التالي:

اولاً: حذف الحالات (الصفوف) التي تحوي عدد من القيم المفقودة قد تؤدي الى تحيز التحليل الاحصائي ، مثلاً سوف نقوم بحذف الصفوف التي تحوي اكثر من قيمة مفقودة.

In:
for (r in 1:nrow(Rdata)){
  if (sum(is.na(Rdata[r,]))>1){
    Rdata=Rdata[-r,]}
}

ثانياً: كتابة دالة تعويض القيم المفقودة (imputation)، مثلاً سوف نكتب دالة لتعويض البيانات المفقودة العددية بالوسط (mean) وتعويض البيانات الفقودة غير العددية بالمنوال (mode) كالتالي:

In:
getimputation = function(x) {
  if (is.numeric(Rdata[,i])==TRUE){
    mean(x, na.rm = TRUE)}
  else{
  uniq = unique(x)
  uniq[which.max(tabulate(match(x, uniq)))]
}}

ثالثاً: عملية تعويض القيم المفقودة

In:
for(i in 1:(ncol(Rdata))){
    Rdata[is.na(Rdata[,i]), i] = getimputation(Rdata[,i])
}

 

مقارنة المتوسط لمجموعتين من البيانات باستخدام لغة البرمجة آر R

18/05/2017 | لغة البرمجة آر R

يمكن مقارنة المتوسط (Mean) لمجموعتين من البيانات او عينتين $x$ , $y$ مستقلة (Independent) بإستخدام اختبار t-test ويعتمد على هذا الإختبار على الفرض (Assumption) بأن هذه البيانات تمثل مجتمع يتبع التوزيع الطبيعي (normal distribution). وبالتالي يكون إختبار الفرض الإحصائي (Hypothesis test) هو

\begin{align*}
H_{0}:\mu_{x}=\mu_{y} \\
H_{1}:\mu_{x}\neq \mu_{y}
\end{align*}

والذي يفضل كتابته كما يلي:

\begin{align*}
H_{0}:\mu_{x}-\mu_{y}=0 \\
H_{1}:\mu_{x}- \mu_{y}\neq0
\end{align*}

لتوضيح طريقة تطبيق t-test سوف نستخدم البيانات التالية: xydata والتي تحوي متغيرين هما x و y. في البداية سوف نتأكد من الفرض وهو هل البيانات المعطاه تتبع التوزيع الطبيعي. سوف نستخدم Normal Q-Q Plot والذي يمكن الحصول عليه بإستخدام الكود التالي:

In:
par(mfrow=c(1, 2))
qqnorm(x,main="x")
qqline(x, col = 2,lwd=2)
qqnorm(y,main="y")
qqline(y, col = 2,lwd=2)

حيث تكون النتيجه كما يلي:

حيث يمكن القول أن البيانات تتبع التوزيع الطبيعي. بدلاً من ذلك يمكن إستخدام إختبار Shapiro-Wilks حيث يمكن إجراء ذالك بإستخدام الكود التالي:

In:
shapiro.test(x)
Out:
        Shapiro-Wilk normality test

data:  x
W = 0.98522, p-value = 0.9091

In:
shapiro.test(y)
Out:
        Shapiro-Wilk normality test

data:  y
W = 0.98732, p-value = 0.9511

لكل المجموعتين p-value أكبر من 0.05 وبالتالي وبالتالي يمكن القول أن البيانات تتبع التوزيع الطبيعي. الأن، بإستخدام دالة t.test كما يلي:

In:
t.test(x,y)
Out:
        Welch Two Sample t-test

data:  x and y
t = 3.1732, df = 67.269, p-value = 0.002274
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3240887 1.4229375
sample estimates:
mean of x mean of y 
 5.212591  4.339078

يتضح أن p-value = 0.002274 وهي أقل من مستوى المعنوية (Significance level) والذي يساوي 0.05 وبالتالي نرفض فرض العدم (Null hypothesis) $H_{0}$ ويكون القرار أن المجموعين مخلفتين بالنسبة للمتوسط.

ملاحظة: هذا الاختبار يسمى Welch’s t-test وهو يستخدم في حالة عدم فرض تساوي التباين (unequal variances) وكذلك في حالة اختلاف حجم المجموعتين او العينتين (unequal sample sizes). حيث أن t-test  يتطلب فرض تساوي التباين للعينتين (equal variances)، ويمكن تنفيذه كما يلي:

In:
t.test(x, y, var.equal =T)
Out:
Two Sample t-test

data: x and y
t = 3.1752, df = 68, p-value = 0.00225
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3247364 1.4232636
sample estimates:
mean of x mean of y 
 5.213429 4.339429

وهو في هذه الحالة يؤدي لنفس القرار السابق وذلك لان المجموعتين لها نفس الحجم وكذلك لا يوجد فرق مهم بين التباين لهما كما هو واضح من خلال نتيجة F-test في الكود التالي:

In:
var.test(x,y)
Out:
	F test to compare two variances

data:  x and y
F = 0.81073, num df = 34, denom df = 34, p-value = 0.5441
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4092287 1.6061545
sample estimates:
ratio of variances 
         0.8107309

عدم تحقق الفروض (assumptions):

في حالة كانت البيانات لاتتبع التوزيع الطبيعي او لتجنب هذا الفرض يمكن إستخدام Wilcoxon tests والذي لايعتمد على أي فرض. بإستخدامه تكون النتيجة كمايلي:

In:
wilcox.test(x,y)
Out:
        Wilcoxon rank sum test

data:  x and y
W = 873, p-value = 0.001941
alternative hypothesis: true location shift is not equal to 0

حيث أن p-value = 0.001941 وبالتالي القرار النهائي لم يتغير بإستخدام الطريقتين وهو رفض $H_{0}$.

اختبار التباين الأحادي (One-Way ANOVA Test) في لغة البرمجة آر R

14/08/2018 | لغة البرمجة آر R

تحليل التباين الأحادي (One-Way ANOVA Test)  هو اسلوب إحصائي يتستخدم لإظهار الفرق بين متوسطين أو أكثر من خلال تحليل الإختلاف داخل وبين الفئات (categories) المختلفة. ويوصف رياضياً كما يلي:

\begin{align*}
H_{0}:\mu_{i}=\mu_{j}, \text{ for all }i,j \\
H_{1}:\mu_{i}\neq \mu_{j},\text{ for any }i,j
\end{align*}

في هذا المقال سوف نوضح كيف يتم حساب اختبار التباين الأحادي في برنامج آر R مستخدمين البيانات Profit_data. في البدايه سوف نقوم بإستيراد البيانات كما يلي:

In:
Profit_data=read.csv("Profit_data.csv",sep=";")
Profit_data[1:5,]
Out:
  Profit   Branch
1 515.32 branch_2
2 423.86 branch_2
3 468.08 branch_3
4 489.17 branch_1
5 664.36 branch_2

ثم سوف نتحقق من فروض اختبار أنوفا  التالية:

كما يلي:
اولاً:
يمكن التحقق من أن المتغير المستقل (independent variable) يتضمن عدة فئات باستخدام الامر:

In:
levels(Profit_data$Branch)
Out:
[1] "branch_1" "branch_2" "branch_3"

ثانياً: التحقق من أن المتغير التابع (dependent variable) يتبع التوزيع الطبيعي ويكون ذلك من خلال التحقق من أن أن البواقي (residuals) تتبع التوزيع الطبيعي كما يلي:

(1) qqplot

In:
Anova_Test=aov(Profit ~ Branch, data = Profit_data)
plot(Anova_Test, 2)

(2) اختبار شابيرو ويلك (Shapiro-Wilk test)

In:
Anova_Test_Residuals = residuals(object = Anova_Test )
shapiro.test(x = Anova_Test_Residuals )
Out:

        Shapiro-Wilk normality test

data:  Anova_Test_Residuals
W = 0.99624, p-value = 0.9886

وجميعها تشير الى أن البواقي (residuals) تتبع التوزيع الطبيعي، وهذا يعني أن أن المتغير التابع (dependent variable) يتبع التوزيع الطبيعي.

ثالثاً: التحقق من استقلال المشاهدات (independence of observations) من خلال التحقق من استقلال البواقي (residuals)  كما يلي:

(1) شكل دالة الأرتباط الذاتي  (autocorrelation function)

In:
Anova_Test_Residuals = residuals(object = Anova_Test )
acf(Anova_Test_Residuals,main="Autocorrelation")

(2) اختبار ديربن واتسون للارتباط الذاتي (Durbin-Watson test for autocorrelation)

In:
dwtest(Profit ~ Branch)
Out:
        Durbin-Watson test

data:  Profit ~ Branch
DW = 2.071, p-value = 0.6532
alternative hypothesis: true autocorrelation is greater than 0

وكلاهما يشير إلى أنه ليس هناك دليل على وجود أرتباط ذاتي  (autocorrelation function).

كذلك يمكن التحقق من استقلال البواقي (residuals) بالنسبة للفئات كما يلي:

In:
plot(Anova_Test,3)

نلاحظ من الشكل اعلاه أن توزيع البواقي (residuals)  لايتأثر بالفئات.

رابعاً: التحقق من تجانس التباين (homogeneity of variances)، ويكون ذلك من خلال:

(1) شكل standardized residuals vs fitted values

In:
plot(Anova_Test,3)

نلاحظ أن الشكل السابق يظهر إنتشار عشوائي للبواقي (residuals) غير متزايد او متناقص او شكل منتظم.

(2) اختبار ليفين (Levene’s test) كا يلي:

In:
library(car)
leveneTest(Anova_Test)
Out:
Levene's Test for Homogeneity of Variance (center = median)
       Df F value Pr(>F)
group   2  0.2665 0.7665
      117

وجميعا تشير الى انه لاوجد دليل على أن التباين مختلف بالنسبة للفئات المختلفة.

خامساً: التحقق من عدم وجود قيم متطرفة (outliers) من خلال مسافة كوك (Cook’s Distance) كما يلي:

In:
plot(Anova_Test,4)

واللذي يشير الى ثلاث مشاهدات متطرفة هي رقم 119، 97، 47. والتي قد يكون من المفيد حذفها خصوصاً اذأ كان تركها  يخل بفروض او بنتيجة اختبار أنوفا الأحادي.

الآن سوف نقوم بتنفيذ  اختبار التباين الأحادي (One-Way ANOVA Test) بإستخدام الدالة:

In:
Anova_Test=aov(Profit ~ Branch, data = Profit_data)
summary(Anova_Test)
Out:
             Df  Sum Sq Mean Sq F value Pr(>F)
Branch        2    7457    3728   0.361  0.698
Residuals   117 1208148   10326

والذي يشير الى انه لايوجد دليل على انه هناك فرق بين متوسط الربح في الفروع الثلاثة.

الإختبار اللا بارامتري (Non-parametric) البديل لأختبار أنوفا الأحادي:

In:
kruskal.test(Profit ~ Branch, data = Profit_data)
Out:
        Kruskal-Wallis rank sum test

data:  Profit by Branch
Kruskal-Wallis chi-squared = 0.57776, df = 2, p-value = 0.7491

والذي يتفق مع نتيجة أختبار اختبار أنوفا الأحادي بعدم وجود فرق بين متوسط الربح في الفروع الثلاثة.

ملاحظة هامة: مستوى المعنويه (significance level) الذي تم إستخدامه في جميع الإختبارات أعلاه هو 0.05 وبالتالي فإن فرض العدم (Null hypothesis) يرفض فقط عندما تكون p-value أقل من 0.05

اختبار كاي تربيع (Chi-Square Test) بإستخدام لغة البرمجة آر R

02/03/2019 | لغة البرمجة آر R

اختبار كاي تربيع (Chi-Square Test) يقيس الارتباط بين متغيرين فئوية (categorical) ومستقلة (independent). ويكتب مختصراً على الشكل: (test $\chi^2$). ويعرف هذا الاختبار كذلك باختبار كاي تربيع لبيرسون (Pearson’s chi-square test ). ويشير فرض العدم  ($H_0$) إلى أنه لا يوجد ارتباط بين المتغيرين. يستخدم في الغالب لتحليل البيانات البيولوجية (biological data) ولكنه يمكن أن يستخدم في جميع المجالات العلمية بشرط أن تكون البيانات وحالة الاستخدام مناسبة لطبيعة هذا الاختبار كما يوضح الشكل التالي:

وعند تطبيق اختبار كاي تربيع يجب مراعاة الفروض (assumptions) التالية:

1. المتغيرات X , Y يجب أن تقاس على المستوى الترتيبي أو الاسمي، بمعنى أن البيانات تكون فئوية (categorical data).

2. المتغيرات X , Y يجب أن تكون مستقلة (independent).

3. يجب أن تكون قيمة الخلية المتوقعة (Cell expected values) في جدول الاقتران (contingency table) 5 أو أكثر في 80٪ على الأقل من خلايا الجدول، ويجب ألا يكون هناك أي خلية قيمتها المتوقعة أقل من 1.

ويمكن تطبيق اختبار كاي باستخدام لغة البرمجة آر R من خلال الدالة التالية:
chisq.test(x,y,correct,p,rescale.p,simulate.p.value,B)
حيث أن:

x متجه رقمي أو مصفوفة
y متجه رقمي ويتم تجاهله اذا كان x  مصفوفة، الإفتراضي: NULL.
correct  تطبيق تصحيح الاستمرارية (continuity correction) عند حساب إحصائية الاختبار لجدول 2×2، الإفتراضي: TRUE.
p متجه من الاحتمالات له نفس طول x حيث أن القيمة الإفتراضية:

rep(1/length(x),length(x))

rescale.p إعادة قياس p  ليكون مجموعة يساوي 1، الإفتراضي: FALSE.
simulate.p.value حساب قيم p بواسطة محاكاة مونت كارلو(Monte Carlo)، الإفتراضي: FALSE.
B تكرار اختبار مونت كارلو، الإفتراضي: 2000.

العلاقة بين تاريخ الامهات في التدخين ونقص وزن المواليد

سوف نستخدم اختبار كاي تربيع لاختبار ما إذا كان هناك علاقة بين تاريخ الامهات في التدخين ونقص وزن المواليد. من خلال مجموعة البيانات: lbw data يمكن الحصول على التالي:

mother Baby birth weight
history of smoking nonsmoker
30 29  low (<2500 g)
44 86 normal (>2500 g)

والتي يمكن تهيئتها كما يلي:

In:
library(COUNT)
data(lbw)
birthweight=ifelse(lbw$low==1,"low","normal")
mother=ifelse(lbw$smoke==1,"smoking","nonsmoker")
lbw_data=table(birthweight,mother)
lbw_data
Out:
                 mother
birthweight nonsmoker smoking
     low           29      30
     normal        86      44

فرض العدم (Null hypothesis) هو إن البيانات مستقلة (ليس هناك علاقة بين تاريخ الامهات في التدخين ونقص وزن المواليد). يمكن حساب القيم المتوقعة واختبار كاي كما يلي:

In:
test_result=chisq.test(lbw_data,correct =FALSE)
test_result$expected
Out:
                  mother
birthweight nonsmoker  smoking
     low     35.89947 23.10053
     normal  79.10053 50.89947
In:
test_result
Out:

	Pearson's Chi-squared test

data:  lbw_data
X-squared = 4.9237, df = 1, p-value = 0.02649

عند مستوى معنوية (Significance level) يساوي 0.05 نرفض فرض العدم ونقول إن هناك ارتباط بين تاريخ الامهات في التدخين ونقص وزن المواليد.

العلاقة بين التدخين وسرطان الرئة

سوف ندرس وجود ارتباط بين التدخين وسرطان الرئة من خلال استخدام مجموعة البيانات: Smoking and Lung Cancer data والتي يمكن تحميلها واستعراضها كما يلي:

In:
library(HSAUR3)
Smoking_Mueller1940
Out:
                              Diagnosis
   Smoking             Lung cancer Healthy control
  Nonsmoker                   3              14
  Moderate smoker            27              41
  Heavy smoker               13              22
  Very heavy smoker          18               5
  Extreme smoker             25               4

حيث أن:

number of cigarettes smoked daily Smoker
1-15 moderate
16-25 heavy
26-35 very heavy
more than 35 extreme

الآن سوف نستخدم إختبار كاي تربيع وفي هذه الحالة سوف يكون فرض العدم هو إنه لايوجد ارتباط بين التدخين وسرطان الرئة:

In:
test_result=chisq.test(Smoking_Mueller1940)
test_result$expected
Out:
                   Diagnosis
Smoking             Lung cancer Healthy control
  Nonsmoker                 8.5             8.5
  Moderate smoker          34.0            34.0
  Heavy smoker             17.5            17.5
  Very heavy smoker        11.5            11.5
  Extreme smoker           14.5            14.5
In:
test_result
Out:

	Pearson's Chi-squared test

data:  Smoking_Mueller1940
X-squared = 34.869, df = 4, p-value = 4.942e-07

والذي يشير إن هناك ارتباط قوي بين التدخين وسرطان الرئة. ولكن يظهر من الجدول أعلاه أن كمية التبغ المدخن هو متغير فئوي ترتيبي، وبالتالي فإن من المناسب أخذ هذا في الاعتبار من خلال اختبار الارتباط الخطي. يمكن استعراض نسبة Lung cancer و Healthy control لكل فئة كما يلي:

In:
library(coin)
spineplot(Smoking_Mueller1940)

ويمكن اختبار الارتباط الخطي كما يلي:

In:
independence_test(Smoking_Mueller1940, teststat = "quad", scores = list(Smoking = c(1,2,3,4,5)))
Out:

	Asymptotic General Independence Test

data:  Diagnosis by
	 Smoking (Nonsmoker < Moderate smoker < Heavy smoker < Very heavy smoker < Extreme smoker)
chi-squared = 30.219, df = 1, p-value = 3.858e-08

والذي يشير إلى إن الترتيب مهم في العلاقة بين التدخين وسرطان الرئة.

الإنحدار الخطي بإستخدام لغة البرمجة آر R

16/03/2018 | لغة البرمجة آر R

الأنحدار الخطي (linear regression) هو أسلوب إحصائي يهدف لإيجاد علاقة خطية بين المتغير التابع (dependent variable) والمتغيرات المستقلة (independent variables)، كذلك يهدف الى التنبؤ (prediction) بقيم المتغير التابع. ويمكن تعريف الإنحدار الخطي رياضياً كما يلي:

\[
y=\alpha+\beta_1 x_1+\beta_2 x_2+…+\beta_p x_p+\epsilon
\]

حيث يسمى $y$ المتغير التابع (dependent variable) او متغير الإستجابة (response variable) او متغير الناتج (outcome variable)، كذلك تسمى $x_1, x_2,…, x_p$ المتغيرات المستقلة (independent variables) او المتغيرات التفسيرية (explanatory variables) او متغيرات التنبؤ (predictor variables).

تُعرف البواقي (Residuals) بأنها الفرق بين القيمة الملاحظة (الفعلية) للمتغير التابع وقيمة المتغير التابع التي يتم التنبؤ بها بإستخدام خط الانحدار.

تعطى فروض الإنحدار الخطي (assumptions of linear regression) كما في الشكل ادناه:

الآن سوف نوضح طريقة حساب الإنحدار الخطي (linear regression) بإستخدام الدالة (lm) الموجودة في البرنامج آر R. في البداية، سوف نقوم بتوليد بيانات محكاه (simulated data) من النموذج الخطي التالي:

\[y=\alpha+\beta x +\epsilon\]

 كما يلي:

In:
x=runif(100,10,20)
Epsilon=rnorm(100)
Alpha=2
Beta=1
y=Alpha+Beta*x+Epsilon

بإستخدام الأمر التالي:

In:
plot(y~x)

نجد أن العلاقة بين المتغيرين $x$ و $y$ تعطى بالشكل التالي:

الأن، لتلخيص نتائج التحليل الإحصائي يمكن أن نستخدم الدالة lm كما يلي:

In:
fit=lm(y~x)
Out:
Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)         x 
   1.917          1.008

يمكن رسم خط الأنحدار كما يلي:

In:
plot(y~x)
abline(fit,col=2)

كما يمكن إستخدام الأمر summary لتلخيص نتائج التحليل الإحصائي كما يلي:

In:
summary(fit)
Out:
Call:
lm(formula = y ~ x)

Residuals:
   Min      1Q     Median    3Q     Max 
-2.75873 -0.50077 -0.03808 0.54745 2.23504

Coefficients:
            Estimate Std. Error t value Pr(>|t|) 
(Intercept) 1.9167 0.5261 3.643 0.000433 ***
 x          1.0079 0.0333 30.271 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9731 on 98 degrees of freedom
Multiple R-squared: 0.9034, Adjusted R-squared: 0.9024 
F-statistic: 916.4 on 1 and 98 DF, p-value: < 2.2e-16

كذلك، يمكن تشخيص (diagnosis) النموذج والتأكد من تحقق جميع الفروض بإستخدام الأمر التالي:

In:
par(mfrow=c(2,2))
plot(fit)

حيث يعطي هذا الشكل:

كما يمكن التنبو (prediction) بقيم المتغير التابع $y$ لاي قيمة حديدة لـ $x$، كما يلي:

In:
newdata = data.frame(x = c(11,15,18))
Prediction = predict(fit,newdata)
Prediction
Out:
       1        2        3 
13.00412 17.03592 20.05977

يمكن تحليل التباين (analysis of variance) بإستخدام الأمر:

In:
anova(fit)
Out:
Analysis of Variance Table

Response: y
          Df Sum Sq Mean Sq F value Pr(>F) 
x          1 867.63  867.63  916.36 < 2.2e-16 ***
Residuals 98  92.79    0.95 
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

كما يمكن حساب AIC , BIC لنموذج الإنحدار الخطي بإستخدام الدوال التالية:

In:
AIC(fit)
Out:
[1] 282.3041
In:
BIC(fit)
Out:
[1] 290.1196

الانحدار اللوجستي (logistic regression) باستخدام لغة البرمجة آر R

26/01/2019 | لغة البرمجة آر R

الانحدار اللوجستي (logistic regression) هو أسلوب إحصائي يستخدم لوصف العلاقة بين متغير تابع (dependent variable) ثنائي (binary) ومتغير مستقل (independent variable) واحد او أكثر وفق الصيغة التالية:

\[
logit(p)=\alpha+\beta X
\]

حيث

\[
logit(p)=\ln{\left(\frac{p}{1-p}\right)}
\]

حيث $p=p(y=1|X)$. وهناك عدد من الفروض (assumptions) الهامة التي ينبغي التنبه لها عند استخدام الانحدار اللوجستي وهي:

الآن سوف نوضح كيف يمكن تطبيق نموذج الانحدار اللوجستي على البيانات (PimaIndiansDiabetes) بإستخدام لغة البرمجة آر R وفق الخطوات التالية:

1. تحميل البيانات

In:
library(mlbench)
data(PimaIndiansDiabetes)
head(PimaIndiansDiabetes)
Out:
  pregnant glucose pressure triceps insulin mass pedigree age diabetes
1        6     148       72      35       0 33.6    0.627  50      pos
2        1      85       66      29       0 26.6    0.351  31      neg
3        8     183       64       0       0 23.3    0.672  32      pos
4        1      89       66      23      94 28.1    0.167  21      neg
5        0     137       40      35     168 43.1    2.288  33      pos
6        5     116       74       0       0 25.6    0.201  30      neg

في هذه الحالة سوف يكون المتغير التابع هو diabetes وهو ثنائي كما يتضح، وجميع المتغيرات المتبقية هي متغيرات مستقلة.

2. تقسيم البيانات الى مجموعة تدريب (train) ومجموعة إختبار (test)

In:
m=nrow(PimaIndiansDiabetes)
train_i= sample(seq_len(m),size =0.75*m)  
train_data =PimaIndiansDiabetes[train_i,]
test_data =PimaIndiansDiabetes[-train_i,]

 3. تطبيق نموذج الانحدار اللوجستي

In:
Model = glm(diabetes ~., data = train_data,family = binomial) 
summary(Model)
Out:
Call:
glm(formula = diabetes ~ ., family = binomial, data = train_data)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4879  -0.7398  -0.4308   0.7455   2.8940  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -8.103335   0.813837  -9.957  < 2e-16 ***
pregnant     0.114101   0.037850   3.015  0.00257 ** 
glucose      0.037800   0.004364   8.662  < 2e-16 ***
pressure    -0.012371   0.005913  -2.092  0.03642 *  
triceps      0.003894   0.008233   0.473  0.63622    
insulin     -0.001816   0.001065  -1.705  0.08826 .  
mass         0.074861   0.017213   4.349 1.37e-05 ***
pedigree     0.831963   0.337920   2.462  0.01382 *  
age          0.009841   0.010634   0.925  0.35473    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 742.59  on 575  degrees of freedom
Residual deviance: 548.64  on 567  degrees of freedom
AIC: 566.64

Number of Fisher Scoring iterations: 5

حيث يجب تحديد المتغيرات المستقله الهامة التي يجب ان تكون في النموذج وحذف الأخرى للوصول لأفضل نموذج يجب تطبيقة.

 4. تشخيص النموذج (Model Diagnostics) كما يلي:

  • التأكد من الخطية (linearity) بين المتغيرات المستقله والمتغير التابع على logit scale.
In:
library(tidyverse)
probability = predict(Model, train_data, type="response")
logit=log(probability/(1-probability))
newdata=cbind(logit,train_data[,-9])
newdata = newdata %>%
  gather(key = "predictors", value = "predicted_values", -logit)
ggplot(newdata, aes(predicted_values,logit))+
  geom_point(size = 0.6, alpha = 0.6) +
  theme_bw() + 
  xlab("predicted values")+
  facet_wrap(~predictors, scales = "free_x")

  • التأكد من عدم وجود المشاهدات المتطرفة من خلال شكل الإنتشار للقيم التنبؤية (predictive values) ضد البواقي المعيارية (Standardized residuals).
In:
library(broom)
Model.out = augment(Model)
ggplot(Model.out, aes(.fitted, .std.resid)) + 
  geom_point(aes(color = diabetes), alpha = .5) +
  xlab("Predicted values")+
  ylab("Standardized residuals")+
  theme_bw()

وذلك من خلال التأكد من عدم وجود مشاهدات لها بواقي معيارية خارج النطاق 3±.

  • التأكد من عدم وجود خطية متعددة (multicollinearity).
In:
library(car)
vif(Model)
Out:
pregnant  glucose pressure  triceps  insulin     mass pedigree      age 
1.428726 1.248356 1.222852 1.482516 1.472432 1.306988 1.043258 1.505727 

وذلك من خلال حساب التضخم في التباين (variance-inflation)، حيث أن تجاوز 10 يشير إلى وجود علاقة خطية متعددة.

  • الأرتباط الذاتي (autocorrelation).
In:
acf(Model.out$.resid,main='Autocorrelation')

  • مصفوفة الخطأ (confiusion matrix)
In:
predicted_probability = predict(Model, test_data, type="response") 
predicted_values=ifelse(predicted_probability>0.5,1,0)
actual_values=ifelse(test_data$diabetes=="pos",1,0) 
confiusion_matrix=table(predicted_values,actual_values) 
confiusion_matrix
Out:
                actual_values
predicted_values   0   1
               0 112  34
               1  11  35
  • الحساسية (sensitivity ) والنوعية (specificity).
In:
library(caret)
sensitivity(confiusion_matrix)
Out:
[1] 0.9105691
In:
specificity(confiusion_matrix)
Out:
[1] 0.5072464

استيراد بيانات تويتر باستخدام لغة البرمجة آر R

07/03/2020 | لغة البرمجة آر R

يشكل تويتر متستودعاً ضخماً للكثير من البيانات الهامة حيث يعتبر وجهة رئيسية لمحللي البيانات والباحثين وخصوصاً المهتمين في تحليل المشاعر (sentiments analysis). لإستيراد بيانات من تويتر بإستخدم برنامج آر R نقوم بعدة خطوات سوف نوجزها هنا.

اولاً: الحصول على حساب مطور 

https://developer.twitter.com/

ثانياً: اعداد تطبيق تويتر (Twitter App)، من خلال الرابط:

developer.twitter.com/en/apps

ثالثاً:  الحصول على مفاتيح ورموز (Keys and tokens) الوصول الى بيانات تويتر

رابعاً: تحميل الحزم (packages) اللازمة

الأن نقوم بتحميل وتفعيل حزمة (rtweet) كما يلي:

In:
install.packages("rtweet")
library(rtweet)

خامساً: إعطاء آر R صلاحية الوصول لبيانات تويتر

وذلك من خلال استحدام المفاتيح والرموز أعلاه كما يلي:

In:
api_key = "********"
api_secret_key = "********"
access_token = "********"
access_token_secret = "********"
appname="xxxxxxxx"

حيث تستبدل ******** بمفاتيح ورموز الوصول، وكذلك تستبدل xxxxxxxx بأسم التطبيق، ثم نستخدم الكود:

In:
token = create_token(
  app = appname,
  consumer_key = api_key,
  consumer_secret = api_secret_key,
  access_token = access_token,
  access_secret = access_token_secret
)

get_token()

سادساً: استيراد البيانات

1. استيراد بيانات تاريخية

الآن يمكن إستيراد البيانات من تويتر حول موضوع معين. فمثلاً، يمكن البحث عن 1000 تغريدة تحوي كلمة “السعودية” كما يلي:

In:
query = "السعودية"
twitter_data=search_tweets(q = query,n = 1000)

حيث أن query هو الاستعلام الذي يستخدم لتحديد طريقة جمع البيانات من تويتر. ويمكن أن يأخد كلمة مفتاحية (keyword) او معرف مستخدم (user ID).

ملاحظة:
لمعرفة المتغيرات التي تم الحصول عليها عند استيراد البيانات من تويتر، يمكن استخدام الدالة:

In:
names(twitter_data)

2. جمع بيانات تويتر لحظياً
يمكن جمع بيانات تويتر لحظياً وذلك من خلال استخدام الكود التالي:

In:
query = "السعودية"
stream_time =  30
Data_file = "twitter_data"
rt = stream_tweets(q = query, timeout = stream_time, file_name = Data_file)

حيث أن timeout هو ثابت رقمي يحدد مقدار الوقت بالثواني ليبقى الاتصال مفتوح أثناء جمع البيانات. كذلك يمكن استخدام احداثيات موقع جغرافي، مثلاً لجمع تغريدات مستخدمي تويتر في مدينة الرياض يمكن استخدام الإستعلام التالي:

In:
query = c(46.5,24.5,46.95,24.85)

ملاحظات:
1. يجب تحديد دليل العمل الذي سوف يحفظ عليه ملف البيانات، مثلاً استخدم:

In:
setwd("Desktop")

2. كذلك لقراءة الملف لاحقاً يمكن استخدام الكود:

In:
library(rjson)
fromJSON(file = "twitter_data.json")

استخراج الجداول من صفحات الويب باستخدام لغة البرمجة آر R

08/12/2018 | لغة البرمجة آر R

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

1. تفعيل الحزم (packages) المطلوبة

سوف نستخدم الحزمة rvest وهي حزمة متخصصة في استخراج البيانات من صفحات الويب وتعمل بالتكامل مع بعض الحزم الأخرى مثل magrittr.

In:
library(rvest)

2. استعراض الجداول المتاحة في صفحة الويب المحددة

للقيام بذلك، سوف نستخدم الكود التالي:

In:
webpage = read_html("https://en.wikipedia.org/wiki/World_population")
Tables = html_nodes(webpage, "table")
Tables

والذي يعطي الجداول الموجودة على صفحة ويكيبيديا كما يلي:

3. إستخراج الجدول المطلوب ( مثلاً، رقم 2 ) من القائمة المعطاه.

In:
Table = webpage %>%
  html_nodes("table") %>%
  .[2] %>%
  html_table(fill = TRUE,header=F)

4. تحويل الجدول الى data frame وتهيئتها للتحليل

In:
mydata = as.data.frame(Table)
attach(mydata)
names(mydata)
tit=gsub("\\[10]", ",in 2000", X1[1])
x=as.numeric(gsub(",", "", X3[3:12]))
Lab=gsub("\\*", "", X2[3:12])
pie(x,main=tit,lab="",radius = 1,col=rainbow(10))
legend(x=-3,y=1,Lab,cex=.8,bty="n",fill=rainbow(10))

والذي يعطي النتيجة:

مثال آخر:

لاستخراج بيانات دوري الأمير محمد بن سلمان من موقع الإتحاد السعودي لكرة القدم. سوف نستخدم الكود التالي:

In:
webpage = read_html("http://www.saff.com.sa/ar-sa/league/saudi-professional-league")
Tables = html_nodes(webpage, "table")
Table = webpage %>%
  html_nodes("table") %>%
  .[1] %>%
  html_table(fill = TRUE,header=F)
SPLdata = as.data.frame(Table)
attach(SPLdata)
Points=as.numeric(X10[2:17])
Teams=X2[2:17]
barplot(Points,names.arg=Teams,horiz=TRUE,las=2,xlim=c(0,30),col="skyblue")

والذي يعطي النتيجة:

مقدمة في تحليل المشاعر بإستخدام لغة البرمجة آر R

12/04/2018 | لغة البرمجة آر R

سوف نستعرض طرق تحليل المشاعر (sentiments analysis) بإستخدام البرنامج آر R. في البداية سوف نقوم بتحميل بعض الحزم (packages) التي نحتاجها وهي:

In:
install.packages("tm")
install.packages("wordcloud") 
install.packages("qdap")
install.packages("syuzhet")
install.packages("ggplot2")

الحزمة qdap تتطلب وجود نسخة من Java مثبته على جهازك والتي يمكنك الحصول عليها من خلال الضغط على الرابط:

تحميل Java

 ثم بعد ذلك نقوم بإستدعاء نسخة الجافا بإستخدام الكود:

In:
# for 64-bit
Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\filename')
# for 32-bit
Sys.setenv(JAVA_HOME='C:\\Program Files (x86)\\Java\\filename')

حيث يتم إستبدال filename بأسم ملف نسخة الجافا الموجود على جهازك. ثم بعد ذلك قم بتحميل الحزمة qdap مرة أخرى. ثم فعل هذه الحزم كما يلي:

In:
library(tm)
library(wordcloud) 
library(qdap)
library(syuzhet)
library(ggplot2)

الآن نستخدم الدالة (freq_terms) وهي تقوم بتحديد الكلمات الأكثر تكراراً، وكذلك نستخدم الدالة (wordcloud) وهي تقوم برسم سحابة الكلمات كما يلي:

In:
Freq = freq_terms(mydata, at.least = 1) 
wordcloud(Freq$WORD, Freq$FREQ, colors = Freq$FREQ, max.words = 200)

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

 الدالة  وصفها
 tolower  تغيير الأحرف الصغيرة الى كبيرة أو العكس
 removeWords حذف كلمات محددة
 removePunctuation حذف علامات الترقيم
removeNumbers  حذف الأرقام

كما يلي:

In:
Clean_Data = tolower(mydata)
Removed_words = c("a", "that","and","the","it", "on","so","have", "of","for","be","this","to","is","in", stopwords("en"))
Clean_Data = removeWords(Clean_Data, Removed_words)
Clean_Data = removePunctuation(Clean_Data)
Clean_Data = removeNumbers(Clean_Data)

ثم بعد ذلك سوف نقوم برسم سحابة الكلمات مرة أخرى:

In:
Freq = freq_terms(Clean_Data , at.least = 1) 
wordcloud(Freq$WORD, Freq$FREQ, colors = Freq$FREQ, max.words = 200)

نلاحظ أنه الكلمات في سحابة الكلمات أصبحت ذات مدلول وتعطي أشارة عن طبيعة المشاعر في البيانات. الأن سوف ننتقل الى تحليل المشاعر بإستخدام الدالة (get_nrc_sentiment) والتي تستخدم قاموس NRC sentiment للبحث عن وجود مستويان من المشاعر في البيانات (النص) وهي positive و negative. كما يمكن البحث عن وجود ثمان مستويات من المشاعر وهي anger, anticipation, disgust, fear, joy, sadness, surprise, trust. سوف نستخدم الكود التالي:

In:
Sentiment_Analysis = get_nrc_sentiment(Freq$WORD)
Sentiment_Analysis = cbind("Words" = Freq$WORD, Sentiment_Analysis)
Sentiment_Score = data.frame("Score" = colSums(Sentiment_Analysis[10:11])) 
Total_Sentiment = cbind("Sentiments" = rownames(Sentiment_Score), Sentiment_Score) 
rownames(Total_Sentiment) = NULL 
ggplot(data = Total_Sentiment, aes(x = Sentiments, y = Score)) + geom_bar(stat = "identity", aes(fill = Sentiments))

كما يمكن التغيير في الكود السابق كما يلي:

In:
Sentiment_Analysis = get_nrc_sentiment(Freq$WORD)
Sentiment_Analysis = cbind("Words" = Freq$WORD, Sentiment_Analysis)
Sentiment_Score = data.frame("Score" = colSums(Sentiment_Analysis[2:9])) 
Total_Sentiment = cbind("Sentiments" = rownames(Sentiment_Score), Sentiment_Score) 
rownames(Total_Sentiment) = NULL 
ggplot(data = Total_Sentiment, aes(x = Sentiments, y = Score)) + geom_bar(stat = "identity", aes(fill = Sentiments))

لتصبح النتيجة:

 

* المرجع: موقع planet analytics

استخدام خريطة الشارع المفتوحة (OpenStreetMap) في لغة البرمجة آر R

17/05/2019 | لغة البرمجة آر R

 

خريطة الشارع المفتوحة (OpenStreetMap) والتي يرمز لها بالرمز (OSM) هي خريطة مفتوحة المصدر تم إطلاقها عام 2004 بواسطة ستيف كوست من المملكة المتحدة وهي عبارة عن مشروع تعاوني ويجمع بياناتها أكثر من مليون مستخدم مسجل  وتدعم من خلال مؤسسة خريطة الشارع المفتوحة وهي مؤسسة غير ربحية. في هذا المقال سوف نعطي مقدمة عن آلية الإستفادة منها بواسطة لغة البرمجة آر R من خلال إتباع الخطوات التالية:

اولاً: تفعيل الحزم (packages) اللازمة

In:
library(osmdata) 
library(sf)
library(ggmap)

حيث أن:

osmdata استيراد بيانات “خريطة الشارع المفتوحة” كمعالم بسيطة أو كائنات مكانية.
sf دعم المعالم البسيطة (Simple Features) ، وهي طريقة موحدة لترميز البيانات المكاني.
ggmap تصوير البيانات المكانية وتعمل مع الحزمة ggplot2 المتخصصة في تصوير البيانات.

ثانياً: يمكن معرفة المعالم (features) المكانية المتوفرة على الخريطة من خلال الدالة:

In:
available_features()

مثلاً، من ضمن المعالم “shop” والذي يحوي جميع تصنيفات المتاجر والتي يمكن يمكن الحصول عليها من خلال الدالة:

In:
available_tags("shop")

يمكن إستبدال “shop” بأي معلم (features) للحصول على تصنيفات مختلفة لكل المعالم.

ثالثاً: تحديد الموقع وإضافة المعالم الى استعلام  (Overpass query)

In:
Place=c(left = 46.5, bottom = 24.5, right = 46.95, top = 24.85)
q = Place%>%
   opq()%>%
   add_osm_feature(key ="shop", value ="supermarket")

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

رابعاً: إرجاع الاستعلام على شكل كائن مكاني لخريطة الشارع المفتوحة وبتنسيق sf من خلال الدالة:

In:
Supermarket = osmdata_sf(q)

خامساً: تصوير البيانات المكانية على الخريطة بإستخدام الكود:

In:
bbox= Place
mad_map = get_map(bbox ,maptype = "terrain", force=TRUE, source = "osm")
ggmap(mad_map)+
  geom_sf(data=Supermarket$osm_points,
          inherit.aes =FALSE,
          colour="#238443",
          fill="#004529",
          alpha=.5,
          size=4,
          shape=21)+
  labs(x="longitude ",y="latitude")

حيث تكون النتيجة كما يلي:

تصوير البيانات على خريطة العالم باستخدام لغة البرمجة آر R

02/10/2019 | لغة البرمجة آر R

في كثير من الاحيان نحتاج تصوير البيانات على خريطة العالم، وعليه سوف نستعرض كيفة القيام بذلك من خلال استخدام لغة البرمجة آر R. سوف نستخدم البيانات التالية: Saudi_exports والتي تمثل صادرات المملكة لمختلف بلدان العالم بالطن. وذلك من خلال اتباع الخطوات التالية:

1. تحميل وتفعيل الحزم اللازمة

In:
library("ggplot2")

2. استيراد بيانات الخريطة من خلال الدالة:

In:
WorldMap = map_data('world')

لمعرفة مسميات الدوال في بيانات الخريطة يمكن استخدام الدالة:

In:
unique(WorldMap$region)

حيث يجب أن تكون متطابقة مع اسماء الدول في البيانات الخاصة بك.

3. استيراد البيانات 

In:
Saudi_exports=read.csv("Saudi_exports.csv")
attach(Saudi_exports)

4. تمثيل البيانات على الخريطة

    
In:
M = ggplot()
M = M + geom_map(data=WorldMap, map=WorldMap,
                  aes(x=long, y=lat, group=group, map_id=region),
                  fill="white", colour="#7f7f7f", size=0.5)
M = M + geom_map(data=Saudi_exports, map=WorldMap,
                  aes(fill=value, map_id=region),
                  colour="#7f7f7f", size=0.5)
M = M + scale_fill_continuous(low="thistle1", high="darkred",
                               guide="colorbar")
M = M + scale_y_continuous(breaks=c())
M = M + scale_x_continuous(breaks=c())
Legend=c("الوزن بالألف طن")
M = M + labs(fill=Legend, title="", x="", y="")
M = M + theme_bw()
M = M + theme(panel.border = element_blank(),
               panel.background = element_rect(fill = '#DBFFFF'),
               legend.background = element_blank(),
               legend.position = c(0.05, 0.2))
M

تنفيذ لغة بايثون على آر استوديو

12/10/2019 | لغة البرمجة آر R

تمثل لغتي آر وبايثون اهم لغات البرمجة لعلماء البيانات لما تتميز به كل لغة من مميزات تجعل منها منافس للآخر. في هذا المقال سوف نستعرض طريقة تنفيذ اوامر لغة بايثون على آر استوديو، وذلك من خلال الخطوات التالية:

اولاً: على برنامج بايثون نقوم بتنفيذ التالي:

نحدد موقع ملف تشغيل بايثون على الجهاز وذلك من خلال تنفيذ الكود التالي بيئة تشغيل بايثون:

In:
import sys
import os
os.path.dirname(sys.executable)

حيث سيظهر رابط ملف تشغيل بايثون على جهازك.

ثانياً: على برنامج آر استوديو

1/ تحميل وتفعيل حزمة reticulate:

In:
library(reticulate)

2/ نحدد نسخة بايثون التي سوف تستخدمها:

In:
use_python('*****')

حيث تستبدل ***** برابط ملف تشغيل بايثون على جهازك الذي تم الحصول عليه في اولاً.

3/ تنفيذ اوامر لغة بايثون

يمكن تنفيذ اوامر لغة بايثون في آر استوديو من خلال استخدام الدالة:

In:
py_run_string("*****")

حيث يتم استبدال ***** بأوامر لغة بايثون كما في الأمثلة التالية:

مثال (1): حساب باقي قسمة 3 على 2:

In:
py_run_string("x=3%2")
py$x
Out:
1

مثال (2): دالة معرفة لحساب تربيع عدد معين:

In:
py_run_string("
def squared(x):
 return x**2
")
x  = 3
py$squared(x)
Out:
9

الرسوم البيانية لبيانات مقياس ليكرت باستخدام آر R

03/06/2022 | لغة البرمجة آر R

لتصوير بيانات الاجابات على مقياس ليكرت في الدراسات الإحصائية يمكن استخدام مكتبة (likert) وهي حزمة في لغة البرمجة آر R تعرض نتائج ليكرت جنبًا إلى جنب مع مخططات الكثافة لمساعدة الباحثين في تحديد ما إذا كان يمكن استخدام الاجابات على مقياس ليكرت من الناحية الكمية بدلاً من النوعية. لتوضيح القيام بذلك سوف نستخدم البيانات (Likert_data) ثم نتبع الخطوات التالية:
1. تحميل المكتبة (likert):

In:
library("likert")

2. استيراد البيانات:

In:
df = read.csv("Likert_data.csv",check.names=FALSE)
head(df)
Out:
  ID                 R            Python Statistical analysis Analytical reports           ML & AI
1  1             Agree          Disagree    Strongly_Disagree  Strongly_Disagree             Agree
2  2 Strongly_Disagree    Strongly_Agree             Disagree     Strongly_Agree             Agree
3  3             Agree Strongly_Disagree              Neutral  Strongly_Disagree Strongly_Disagree
4  4           Neutral           Neutral    Strongly_Disagree            Neutral Strongly_Disagree
5  5    Strongly_Agree          Disagree             Disagree  Strongly_Disagree    Strongly_Agree
6  6    Strongly_Agree             Agree              Neutral            Neutral Strongly_Disagree

3. تهيئة البيانات:

In:
df=df[,2:6]
levels = c("Strongly_Disagree", "Disagree", "Neutral", "Agree", "Strongly_Agree")
index = 1:ncol(df)
df[ ,index] = lapply(df[ , index], function(x) factor(x, levels = levels))

4. استخدام مكتبة (likert):

In:
out = likert(df)

5. تصوير البيانات:

5.1 باستخدام (rstacked ba):

In:
plot(out)
Out:

5.2 باستخدام (heat map):

In:
plot(out, type="heat", low.color = "white", high.color = "red")
Out:

5.3 باستخدام دالة الكثافة (density function)

In:
plot(out, type="density")
Out:

تصوير البيانات بشكل تفاعلي باستخدام آر R

17/06/2022 | لغة البرمجة آر R

المكتبة (esquisse) هي حزمة برمجية في لغة البرمجة آر R تسمح للمستخدم بتصوير البيانات بشكل تفاعلي دون الحاجة الى كتابة أكواد برمجية حيث يمكنك من خلال المكتبة تصوير وتمثيل البيانات باستخدام مكتبة (ggplot2) ثم حفظها كصورة او واستيراد الكود الذي تم إنشائه بشكل آلي من خلال التطبيق التفاعلي. للقيام بذلك:

1. تثبيت المكتبة (esquisse) إذا لم تكن مثبته على جهازك

In:
install.packages("esquisse")

2. تفعيل المكتبة (esquisse)

In:
library('esquisse')

3. تشغيل التطبيق باستخدام الكود:

In:
esquisse::esquisser()

ملاحظة: يمكن إستيراد الكود بعد الإنتهاء من تصوير البيانات من خلال خيارات (Export & code).

تضمين كود بايثون Python في صفحة ويب HTML

18/02/2023 | لغة البرمجة آر R

باي سكريبت (PyScript) هو إطار عمل برمجي مفتوح المصدر يسمح للمستخدمين بتضمين كود بايثون (Python) في صفحة ويب (HTML) من خلال توظيف تقنيات Pyodide, WASM ويمكن ذلك من خلال الخطوات التالية:

اولاً: استيراد ملفات باي سكريبت (pyscript) الى صفحة الويب (html) ضمن راس الصفحة <head> كما يلي:

<head>
    <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
    <script defer src="https://pyscript.net/latest/pyscript.js"></script>
</head>

ثانياً: كتابة كود في جسم الصفحة <body> كما يلي:

<body>
    <py-script>
        print('Hello World, I am using Python')
    </py-script>
</body>

حيث يكون الشكل النهائي للكود:

<html>
  <head>
    <link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
    <script defer src="https://pyscript.net/latest/pyscript.js"></script>
  </head>
  <body>
    <py-script>
        print('Hello World, I am using Python')
    </py-script>
  </body>
</html>

والذي يعطي الصفحة:

تطوير واجهة المستخدم لتطبيق Shiny بدون برمجة

08/04/2023 | لغة البرمجة آر R

هي أداة تسمح بتطوير واجهة المستخدم لتطبيقات Shiny دون الحاجة لكتابة اكواد برمجية ويمكن أن يساهم في توفير الوقت والجهد كذلك الخروج بتصاميم متناسقة، وهي متوفرة ضمن حزمة shinyuieditor. يمكن استخدام الاداة للتعديل على تطبيق موجود او بناء تطبيق جديد. للبدء في استخدام الأداة يمكن اتباع الخطوات التالية:

اولاً: تثبيت الحزمة remotes وتفعيلها

In:
install.packages("remotes")
library('remotes')

ثانياً: تثبيت الحزمة shinyuieditor وتفعيلها

In:
remotes::install_github("rstudio/shinyuieditor")
library('shinyuieditor')

ثالثاً: استخدام الدالة launch_editor :
launch_editor(app_loc, host, port, shiny_background_port, ...)
حيث أن:

app_loc دليل العمل الذي يحتوي على تطبيق Shiny المراد تحريره
host عنوان IPv4
port عدد صحيح يشير إلى منفذ الخادم
shiny_background_port منفذ لتشغيل معاينة التطبيق عليه

فمثلاً، لبدء بناء تطبيق جديد يمكن استخدام:

In:
launch_editor(app_loc = "loc/of/app")

وبالتالي سوف تفتح صفحة ويب على localhost كما يلي:

بعد ذلك، يمكن الإنتقال للصفحة التالية:

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

  • YouTube
جميع الحقوق محفوظة © موقع د. عزيز