You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
449 lines
20 KiB
449 lines
20 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_1-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": [],
|
|
"toc_visible": true
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1",
|
|
"translation_date": "2025-08-29T14:55:54+00:00",
|
|
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
|
|
"language_code": "ar"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"# قم ببناء نموذج انحدار: ابدأ باستخدام R وTidymodels لنماذج الانحدار\n"
|
|
],
|
|
"metadata": {
|
|
"id": "YJUHCXqK57yz"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## مقدمة إلى الانحدار - الدرس الأول\n",
|
|
"\n",
|
|
"#### وضع الأمور في سياقها\n",
|
|
"\n",
|
|
"✅ هناك العديد من أنواع طرق الانحدار، واختيار الطريقة المناسبة يعتمد على الإجابة التي تبحث عنها. إذا كنت تريد التنبؤ بالطول المحتمل لشخص بناءً على عمره، ستستخدم `الانحدار الخطي`، لأنك تبحث عن **قيمة رقمية**. أما إذا كنت مهتمًا بمعرفة ما إذا كان نوع معين من المأكولات يجب اعتباره نباتيًا أم لا، فأنت تبحث عن **تصنيف فئة**، وبالتالي ستستخدم `الانحدار اللوجستي`. ستتعلم المزيد عن الانحدار اللوجستي لاحقًا. فكر قليلاً في بعض الأسئلة التي يمكنك طرحها على البيانات، وأي من هذه الطرق سيكون أكثر ملاءمة.\n",
|
|
"\n",
|
|
"في هذا القسم، ستعمل مع [مجموعة بيانات صغيرة عن مرض السكري](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). تخيل أنك تريد اختبار علاج لمرضى السكري. قد تساعدك نماذج التعلم الآلي في تحديد المرضى الذين قد يستجيبون بشكل أفضل للعلاج، بناءً على مجموعات من المتغيرات. حتى نموذج انحدار بسيط جدًا، عند تصوره، قد يظهر معلومات عن المتغيرات التي يمكن أن تساعدك في تنظيم تجاربك السريرية النظرية.\n",
|
|
"\n",
|
|
"مع ذلك، دعونا نبدأ في هذه المهمة!\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>عمل فني بواسطة @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>عمل فني بواسطة @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. تحميل مجموعة الأدوات الخاصة بنا\n",
|
|
"\n",
|
|
"لهذه المهمة، سنحتاج إلى الحزم التالية:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) هو [مجموعة من حزم R](https://www.tidyverse.org/packages) مصممة لجعل علم البيانات أسرع وأسهل وأكثر متعة!\n",
|
|
"\n",
|
|
"- `tidymodels`: إطار عمل [tidymodels](https://www.tidymodels.org/) هو [مجموعة من الحزم](https://www.tidymodels.org/packages/) للنمذجة وتعلم الآلة.\n",
|
|
"\n",
|
|
"يمكنك تثبيتها باستخدام الأمر التالي:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"السكربت أدناه يتحقق مما إذا كانت الحزم المطلوبة لإكمال هذا الوحدة مثبتة لديك، ويقوم بتثبيتها إذا كانت مفقودة.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "FIo2YhO26wI9"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"pacman::p_load(tidyverse, tidymodels)"
|
|
],
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stderr",
|
|
"text": [
|
|
"Loading required package: pacman\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"id": "cIA9fz9v7Dss",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"الآن، دعونا نقوم بتحميل هذه الحزم الرائعة وجعلها متاحة في جلسة R الحالية لدينا. (هذا للتوضيح فقط، `pacman::p_load()` قد قام بذلك بالفعل نيابةً عنك)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "gpO_P_6f9WUG"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# load the core Tidyverse packages\r\n",
|
|
"library(tidyverse)\r\n",
|
|
"\r\n",
|
|
"# load the core Tidymodels packages\r\n",
|
|
"library(tidymodels)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "NLMycgG-9ezO"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. مجموعة بيانات مرض السكري\n",
|
|
"\n",
|
|
"في هذا التمرين، سنعرض مهاراتنا في الانحدار من خلال إجراء توقعات باستخدام مجموعة بيانات مرض السكري. تحتوي [مجموعة بيانات مرض السكري](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) على `442 عينة` من البيانات المتعلقة بمرض السكري، مع 10 متغيرات تنبؤية تشمل `العمر`، `الجنس`، `مؤشر كتلة الجسم`، `متوسط ضغط الدم`، و`ستة قياسات لمصل الدم` بالإضافة إلى متغير النتيجة `y`: وهو قياس كمي لتقدم المرض بعد سنة واحدة من نقطة البداية.\n",
|
|
"\n",
|
|
"|عدد الملاحظات|442|\n",
|
|
"|----------------------|:---|\n",
|
|
"|عدد المتغيرات التنبؤية|أول 10 أعمدة هي تنبؤية رقمية|\n",
|
|
"|النتيجة/الهدف|العمود 11 هو قياس كمي لتقدم المرض بعد سنة واحدة من نقطة البداية|\n",
|
|
"|معلومات المتغيرات التنبؤية|- العمر بالسنوات\n",
|
|
"||- الجنس\n",
|
|
"||- مؤشر كتلة الجسم (bmi)\n",
|
|
"||- متوسط ضغط الدم (bp)\n",
|
|
"||- s1 tc، إجمالي الكوليسترول في المصل\n",
|
|
"||- s2 ldl، البروتينات الدهنية منخفضة الكثافة\n",
|
|
"||- s3 hdl، البروتينات الدهنية عالية الكثافة\n",
|
|
"||- s4 tch، إجمالي الكوليسترول / HDL\n",
|
|
"||- s5 ltg، ربما لوغاريتم مستوى الدهون الثلاثية في المصل\n",
|
|
"||- s6 glu، مستوى السكر في الدم|\n",
|
|
"\n",
|
|
"> 🎓 تذكر، هذا تعلم تحت الإشراف، ونحتاج إلى هدف مسمى 'y'.\n",
|
|
"\n",
|
|
"قبل أن تتمكن من التعامل مع البيانات باستخدام R، تحتاج إلى استيراد البيانات إلى ذاكرة R، أو إنشاء اتصال بالبيانات يمكن لـ R استخدامه للوصول إلى البيانات عن بُعد.\n",
|
|
"\n",
|
|
"> توفر حزمة [readr](https://readr.tidyverse.org/)، وهي جزء من Tidyverse، طريقة سريعة وسهلة لقراءة البيانات المستطيلة إلى R.\n",
|
|
"\n",
|
|
"الآن، دعونا نقوم بتحميل مجموعة بيانات مرض السكري من رابط المصدر التالي: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"سنقوم أيضًا بإجراء فحص سريع على بياناتنا باستخدام `glimpse()` وعرض أول 5 صفوف باستخدام `slice()`.\n",
|
|
"\n",
|
|
"قبل المضي قدمًا، دعونا نقدم شيئًا ستواجهه كثيرًا في كود R 🥁🥁: مشغل الأنابيب `%>%`\n",
|
|
"\n",
|
|
"مشغل الأنابيب (`%>%`) يقوم بتنفيذ العمليات بتسلسل منطقي عن طريق تمرير كائن إلى وظيفة أو تعبير استدعاء. يمكنك التفكير في مشغل الأنابيب كأنه يقول \"ثم\" في الكود الخاص بك.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KM6iXLH996Cl"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Import the data set\r\n",
|
|
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Get a glimpse and dimensions of the data\r\n",
|
|
"glimpse(diabetes)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Select the first 5 rows of the data\r\n",
|
|
"diabetes %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "Z1geAMhM-bSP"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"`glimpse()` يظهر لنا أن هذه البيانات تحتوي على 442 صفًا و11 عمودًا، وكل الأعمدة من نوع البيانات `double`.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"> glimpse() و slice() هما دالتان في [`dplyr`](https://dplyr.tidyverse.org/). Dplyr، وهو جزء من Tidyverse، يمثل قواعد لتنظيم البيانات ويوفر مجموعة متناسقة من الأفعال التي تساعدك في حل التحديات الأكثر شيوعًا في معالجة البيانات.\n",
|
|
"\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"الآن بعد أن حصلنا على البيانات، دعونا نركز على خاصية واحدة (`bmi`) كهدف لهذا التمرين. هذا يتطلب منا اختيار الأعمدة المطلوبة. كيف يمكننا القيام بذلك؟\n",
|
|
"\n",
|
|
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) تتيح لنا *اختيار* (وأحيانًا إعادة تسمية) الأعمدة في إطار البيانات.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "UwjVT1Hz-c3Z"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Select predictor feature `bmi` and outcome `y`\r\n",
|
|
"diabetes_select <- diabetes %>% \r\n",
|
|
" select(c(bmi, y))\r\n",
|
|
"\r\n",
|
|
"# Print the first 5 rows\r\n",
|
|
"diabetes_select %>% \r\n",
|
|
" slice(1:10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "RDY1oAKI-m80"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 3. بيانات التدريب والاختبار\n",
|
|
"\n",
|
|
"من الممارسات الشائعة في التعلم الموجّه *تقسيم* البيانات إلى مجموعتين؛ مجموعة (عادةً أكبر) لتدريب النموذج، ومجموعة أصغر \"محجوزة\" لمعرفة أداء النموذج.\n",
|
|
"\n",
|
|
"الآن بعد أن أصبحت البيانات جاهزة، يمكننا معرفة ما إذا كانت الآلة يمكن أن تساعد في تحديد تقسيم منطقي بين الأرقام في هذه المجموعة. يمكننا استخدام حزمة [rsample](https://tidymodels.github.io/rsample/)، وهي جزء من إطار عمل Tidymodels، لإنشاء كائن يحتوي على معلومات حول *كيفية* تقسيم البيانات، ثم استخدام وظيفتين إضافيتين من rsample لاستخراج مجموعتي التدريب والاختبار التي تم إنشاؤهما:\n"
|
|
],
|
|
"metadata": {
|
|
"id": "SDk668xK-tc3"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"set.seed(2056)\r\n",
|
|
"# Split 67% of the data for training and the rest for tesing\r\n",
|
|
"diabetes_split <- diabetes_select %>% \r\n",
|
|
" initial_split(prop = 0.67)\r\n",
|
|
"\r\n",
|
|
"# Extract the resulting train and test sets\r\n",
|
|
"diabetes_train <- training(diabetes_split)\r\n",
|
|
"diabetes_test <- testing(diabetes_split)\r\n",
|
|
"\r\n",
|
|
"# Print the first 3 rows of the training set\r\n",
|
|
"diabetes_train %>% \r\n",
|
|
" slice(1:10)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "EqtHx129-1h-"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 4. تدريب نموذج الانحدار الخطي باستخدام Tidymodels\n",
|
|
"\n",
|
|
"الآن نحن جاهزون لتدريب النموذج!\n",
|
|
"\n",
|
|
"في Tidymodels، يتم تحديد النماذج باستخدام `parsnip()` من خلال تحديد ثلاثة مفاهيم:\n",
|
|
"\n",
|
|
"- **نوع النموذج** يميز بين النماذج مثل الانحدار الخطي، الانحدار اللوجستي، نماذج الأشجار القرار، وما إلى ذلك.\n",
|
|
"\n",
|
|
"- **وضع النموذج** يشمل خيارات شائعة مثل الانحدار والتصنيف؛ بعض أنواع النماذج تدعم أيًا من هذه الخيارات بينما البعض الآخر لديه وضع واحد فقط.\n",
|
|
"\n",
|
|
"- **محرك النموذج** هو الأداة الحسابية التي سيتم استخدامها لتدريب النموذج. غالبًا ما تكون هذه الأدوات حزم R، مثل **`\"lm\"`** أو **`\"ranger\"`**\n",
|
|
"\n",
|
|
"يتم جمع هذه المعلومات الخاصة بالنمذجة في مواصفات النموذج، لذا دعونا نبني واحدة!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "sBOS-XhB-6v7"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Build a linear model specification\r\n",
|
|
"lm_spec <- \r\n",
|
|
" # Type\r\n",
|
|
" linear_reg() %>% \r\n",
|
|
" # Engine\r\n",
|
|
" set_engine(\"lm\") %>% \r\n",
|
|
" # Mode\r\n",
|
|
" set_mode(\"regression\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Print the model specification\r\n",
|
|
"lm_spec"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "20OwEw20--t3"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"بعد أن يتم *تحديد* النموذج، يمكن `تقديره` أو `تدريبه` باستخدام وظيفة [`fit()`](https://parsnip.tidymodels.org/reference/fit.html)، وعادةً ما يتم ذلك باستخدام صيغة وبيانات معينة.\n",
|
|
"\n",
|
|
"`y ~ .` تعني أننا سنقوم بتقدير `y` كالقيمة المتوقعة/الهدف، والتي يتم تفسيرها بواسطة جميع المتغيرات التوضيحية/الخصائص أي `.` (في هذه الحالة، لدينا متغير توضيحي واحد فقط: `bmi`).\n"
|
|
],
|
|
"metadata": {
|
|
"id": "_oDHs89k_CJj"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Build a linear model specification\r\n",
|
|
"lm_spec <- linear_reg() %>% \r\n",
|
|
" set_engine(\"lm\") %>%\r\n",
|
|
" set_mode(\"regression\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Train a linear regression model\r\n",
|
|
"lm_mod <- lm_spec %>% \r\n",
|
|
" fit(y ~ ., data = diabetes_train)\r\n",
|
|
"\r\n",
|
|
"# Print the model\r\n",
|
|
"lm_mod"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "YlsHqd-q_GJQ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"من المخرجات التي يقدمها النموذج، يمكننا رؤية المعاملات التي تم تعلمها أثناء التدريب. هذه المعاملات تمثل معاملات خط الانحدار الأفضل الذي يعطينا أقل خطأ إجمالي بين المتغير الفعلي والمتغير المتوقع.\n",
|
|
"<br>\n",
|
|
"\n",
|
|
"## 5. إجراء التنبؤات على مجموعة الاختبار\n",
|
|
"\n",
|
|
"الآن بعد أن قمنا بتدريب النموذج، يمكننا استخدامه للتنبؤ بتطور المرض y لمجموعة بيانات الاختبار باستخدام [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). سيتم استخدام هذا لرسم الخط الفاصل بين مجموعات البيانات.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "kGZ22RQj_Olu"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Make predictions for the test set\r\n",
|
|
"predictions <- lm_mod %>% \r\n",
|
|
" predict(new_data = diabetes_test)\r\n",
|
|
"\r\n",
|
|
"# Print out some of the predictions\r\n",
|
|
"predictions %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "nXHbY7M2_aao"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"رائع! 💃🕺 لقد قمنا بتدريب نموذج واستخدمناه لإجراء التنبؤات!\n",
|
|
"\n",
|
|
"عند إجراء التنبؤات، تتبع tidymodels دائمًا قاعدة إنتاج tibble/إطار بيانات يحتوي على أسماء أعمدة موحدة. هذا يجعل من السهل دمج البيانات الأصلية مع التنبؤات في صيغة قابلة للاستخدام للعمليات اللاحقة مثل الرسم البياني.\n",
|
|
"\n",
|
|
"`dplyr::bind_cols()` يربط أعمدة إطارات البيانات المتعددة بكفاءة.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "R_JstwUY_bIs"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Combine the predictions and the original test set\r\n",
|
|
"results <- diabetes_test %>% \r\n",
|
|
" bind_cols(predictions)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"results %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "RybsMJR7_iI8"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 6. عرض نتائج النمذجة\n",
|
|
"\n",
|
|
"حان الوقت لرؤية هذا بشكل مرئي 📈. سنقوم بإنشاء مخطط مبعثر لجميع قيم `y` و `bmi` في مجموعة الاختبار، ثم نستخدم التوقعات لرسم خط في المكان الأنسب بين مجموعات بيانات النموذج.\n",
|
|
"\n",
|
|
"لدى R عدة أنظمة لإنشاء الرسوم البيانية، ولكن `ggplot2` هو واحد من أكثرها أناقة وتنوعًا. يتيح لك هذا النظام تكوين الرسوم البيانية عن طريق **دمج المكونات المستقلة**.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "XJbYbMZW_n_s"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Set a theme for the plot\r\n",
|
|
"theme_set(theme_light())\r\n",
|
|
"# Create a scatter plot\r\n",
|
|
"results %>% \r\n",
|
|
" ggplot(aes(x = bmi)) +\r\n",
|
|
" # Add a scatter plot\r\n",
|
|
" geom_point(aes(y = y), size = 1.6) +\r\n",
|
|
" # Add a line plot\r\n",
|
|
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "R9tYp3VW_sTn"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"✅ فكر قليلاً فيما يحدث هنا. هناك خط مستقيم يمر عبر العديد من النقاط الصغيرة للبيانات، لكن ما الذي يفعله بالضبط؟ هل يمكنك أن ترى كيف يمكن استخدام هذا الخط للتنبؤ بمكان نقطة بيانات جديدة وغير مرئية بالنسبة لمحور y في الرسم البياني؟ حاول أن تصف بالكلمات الاستخدام العملي لهذا النموذج.\n",
|
|
"\n",
|
|
"تهانينا، لقد قمت ببناء أول نموذج انحدار خطي، وأنشأت توقعًا باستخدامه، وعرضته في رسم بياني!\n"
|
|
],
|
|
"metadata": {
|
|
"id": "zrPtHIxx_tNI"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**إخلاء المسؤولية**: \nتمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.\n"
|
|
]
|
|
}
|
|
]
|
|
} |