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.
Data-Science-For-Beginners/translations/ar/1-Introduction/04-stats-and-probability/notebook.ipynb

581 lines
21 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# مقدمة في الاحتمالات والإحصاء\n",
"في هذا الدفتر، سنقوم بالتجربة مع بعض المفاهيم التي ناقشناها سابقًا. العديد من المفاهيم من الاحتمالات والإحصاء ممثلة بشكل جيد في المكتبات الكبرى لمعالجة البيانات في بايثون، مثل `numpy` و `pandas`.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import random\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## المتغيرات العشوائية والتوزيعات\n",
"لنبدأ برسم عينة من 30 قيمة من توزيع متساوي بين 0 و 9. سنقوم أيضًا بحساب المتوسط والتباين.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sample = [ random.randint(0,10) for _ in range(30) ]\n",
"print(f\"Sample: {sample}\")\n",
"print(f\"Mean = {np.mean(sample)}\")\n",
"print(f\"Variance = {np.var(sample)}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"لتقدير عدد القيم المختلفة في العينة بصريًا، يمكننا رسم **الهيستوجرام**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.hist(sample)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## تحليل البيانات الحقيقية\n",
"\n",
"المتوسط والتباين مهمان جدًا عند تحليل البيانات الواقعية. لنقم بتحميل البيانات الخاصة بلاعبي البيسبول من [SOCR MLB Height/Weight Data](http://wiki.stat.ucla.edu/socr/index.php/SOCR_Data_MLB_HeightsWeights)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"../../data/SOCR_MLB.tsv\",sep='\\t', header=None, names=['Name','Team','Role','Weight','Height','Age'])\n",
"df\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> نحن نستخدم حزمة تسمى [**Pandas**](https://pandas.pydata.org/) هنا لتحليل البيانات. سنتحدث أكثر عن Pandas والعمل مع البيانات في بايثون لاحقًا في هذه الدورة.\n",
"\n",
"دعونا نحسب القيم المتوسطة للعمر والطول والوزن:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df[['Age','Height','Weight']].mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"الآن دعونا نركز على الطول، ونحسب الانحراف المعياري والتباين:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(list(df['Height'])[:20])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mean = df['Height'].mean()\n",
"var = df['Height'].var()\n",
"std = df['Height'].std()\n",
"print(f\"Mean = {mean}\\nVariance = {var}\\nStandard Deviation = {std}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"بالإضافة إلى المتوسط، من المنطقي النظر في القيمة الوسيطية والرباعيات. يمكن تمثيلها بصريًا باستخدام **مخطط الصندوق**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,2))\n",
"plt.boxplot(df['Height'].ffill(), vert=False, showmeans=True)\n",
"plt.grid(color='gray', linestyle='dotted')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"يمكننا أيضًا صنع مخططات الصناديق لعينات فرعية من مجموعتنا البيانية، على سبيل المثال، مجمعة حسب دور اللاعب.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.boxplot(column='Height', by='Role', figsize=(10,8))\n",
"plt.xticks(rotation='vertical')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> **ملاحظة**: يشير هذا المخطط إلى أنه في المتوسط، أطوال لاعبي القاعدة الأولى أعلى من أطوال لاعبي القاعدة الثانية. لاحقًا سنتعلم كيف يمكننا اختبار هذه الفرضية بطريقة أكثر رسمية، وكيفية إثبات أن بياناتنا ذات دلالة إحصائية لتوضيح ذلك.\n",
"\n",
"العمر، الطول، والوزن جميعها متغيرات عشوائية مستمرة. ما رأيك في توزيعها؟ طريقة جيدة لمعرفة ذلك هي رسم المدرج التكراري للقيم:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df['Weight'].hist(bins=15, figsize=(10,6))\n",
"plt.suptitle('Weight distribution of MLB Players')\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Count')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## التوزيع الطبيعي\n",
"\n",
"دعونا ننشئ عينة اصطناعية للأوزان تتبع توزيعًا طبيعيًا بمتوسط وتباين متماثل مع بياناتنا الحقيقية:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"generated = np.random.normal(mean, std, 1000)\n",
"generated[:20]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(generated, bins=15)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.hist(np.random.normal(0,1,50000), bins=300)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"نظرًا لأن معظم القيم في الحياة الواقعية تتبع التوزيع الطبيعي، فلا ينبغي علينا استخدام مولد أعداد عشوائية متساوية التوزيع لتوليد بيانات عينة. إليك ما يحدث إذا حاولنا توليد الأوزان بتوزيع متساوي (تم توليدها بواسطة `np.random.rand`):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"wrong_sample = np.random.rand(1000)*2*std+mean-std\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(wrong_sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## فترات الثقة\n",
"\n",
"دعونا الآن نحسب فترات الثقة لأوزان وأطوال لاعبي البيسبول. سنستخدم الكود [من هذا النقاش على ستاك أوفرفلو](https://stackoverflow.com/questions/15033511/compute-a-confidence-interval-from-sample-data):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import scipy.stats\n",
"\n",
"def mean_confidence_interval(data, confidence=0.95):\n",
" a = 1.0 * np.array(data)\n",
" n = len(a)\n",
" m, se = np.mean(a), scipy.stats.sem(a)\n",
" h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)\n",
" return m, h\n",
"\n",
"for p in [0.85, 0.9, 0.95]:\n",
" m, h = mean_confidence_interval(df['Weight'].fillna(method='pad'),p)\n",
" print(f\"p={p:.2f}, mean = {m:.2f} ± {h:.2f}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## اختبار الفرضيات\n",
"\n",
"دعونا نستكشف أدوارًا مختلفة في مجموعة بيانات لاعبي البيسبول لدينا:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.groupby('Role').agg({ 'Weight' : 'mean', 'Height' : 'mean', 'Age' : 'count'}).rename(columns={ 'Age' : 'Count'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"دعونا نختبر الفرضية القائلة بأن لاعبي القاعدة الأولى أطول من لاعبي القاعدة الثانية. أبسط طريقة للقيام بذلك هي اختبار فترات الثقة:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for p in [0.85,0.9,0.95]:\n",
" m1, h1 = mean_confidence_interval(df.loc[df['Role']=='First_Baseman',['Height']],p)\n",
" m2, h2 = mean_confidence_interval(df.loc[df['Role']=='Second_Baseman',['Height']],p)\n",
" print(f'Conf={p:.2f}, 1st basemen height: {m1-h1[0]:.2f}..{m1+h1[0]:.2f}, 2nd basemen height: {m2-h2[0]:.2f}..{m2+h2[0]:.2f}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"يمكننا أن نرى أن الفواصل الزمنية لا تتداخل.\n",
"\n",
"الطريقة الأكثر صحة إحصائيًا لإثبات الفرضية هي استخدام **اختبار t لستودنت**:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from scipy.stats import ttest_ind\n",
"\n",
"tval, pval = ttest_ind(df.loc[df['Role']=='First_Baseman',['Height']], df.loc[df['Role']=='Second_Baseman',['Height']],equal_var=False)\n",
"print(f\"T-value = {tval[0]:.2f}\\nP-value: {pval[0]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"القيمتان اللتان تعيدهما دالة `ttest_ind` هما:\n",
"* قيمة p يمكن اعتبارها كاحتمال أن يكون للوزعين نفس المتوسط. في حالتنا، القيمة منخفضة جدًا، مما يعني أن هناك دليلاً قوياً يدعم أن لاعبي القاعدة الأولى أطول.\n",
"* قيمة t هي القيمة الوسيطة لاختلاف المتوسطات المعيارية التي تُستخدم في اختبار t، ويتم مقارنتها مع قيمة عتبة لقيمة ثقة معينة.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## محاكاة توزيع طبيعي مع نظرية الحد المركزي\n",
"\n",
"مصدر الأعداد العشوائية الزائفة في بايثون مصمم لإعطائنا توزيعًا منتظمًا. إذا أردنا إنشاء مولد لتوزيع طبيعي، يمكننا استخدام نظرية الحد المركزي. للحصول على قيمة موزعة طبيعيًا، سنقوم فقط بحساب متوسط عينة مولدة بشكل منتظم.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def normal_random(sample_size=100):\n",
" sample = [random.uniform(0,1) for _ in range(sample_size) ]\n",
" return sum(sample)/sample_size\n",
"\n",
"sample = [normal_random() for _ in range(100)]\n",
"plt.figure(figsize=(10,6))\n",
"plt.hist(sample)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## الارتباط وشركة البيسبول الشريرة\n",
"\n",
"يسمح لنا الارتباط بإيجاد العلاقات بين تسلسلات البيانات. في مثالنا التوضيحي، دعونا نتخيل وجود شركة بيسبول شريرة تدفع للاعبيها وفقًا لطولهم - كلما كان اللاعب أطول، زادت الأموال التي يحصل عليها. لنفترض أن هناك راتبًا أساسيًا قدره 1000 دولار، ومكافأة إضافية تتراوح بين 0 و100 دولار، تعتمد على الطول. سنأخذ اللاعبين الحقيقيين من MLB، ونحسب رواتبهم الخيالية:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"heights = df['Height'].fillna(method='pad')\n",
"salaries = 1000+(heights-heights.min())/(heights.max()-heights.mean())*100\n",
"print(list(zip(heights, salaries))[:10])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"لنحسب الآن التغاير والارتباط لتلك المتتاليات. ستعطينا الدالة `np.cov` ما يُسمى **مصفوفة التغاير**، وهي تمديد للتغاير ليشمل متغيرات متعددة. العنصر $M_{ij}$ من مصفوفة التغاير $M$ هو التغاير بين المتغيرين الإدخاليين $X_i$ و $X_j$، والقيم القطرية $M_{ii}$ هي تباين $X_{i}$. وبالمثل، ستعطينا الدالة `np.corrcoef` **مصفوفة الارتباط**.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(f\"Covariance matrix:\\n{np.cov(heights, salaries)}\")\n",
"print(f\"Covariance = {np.cov(heights, salaries)[0,1]}\")\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"يشير الارتباط الذي يساوي 1 إلى وجود **علاقة خطية** قوية بين متغيرين. يمكننا رؤية العلاقة الخطية بصريًا من خلال رسم قيمة مقابل الأخرى:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights,salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"لنرَ ماذا يحدث إذا لم تكن العلاقة خطية. لنفترض أن شركتنا قررت إخفاء التبعية الخطية الواضحة بين الطول والرواتب، وأدخلت بعض اللاخطية في الصيغة، مثل `sin`:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"في هذه الحالة، الارتباط أقل قليلاً، ولكنه لا يزال مرتفعًا إلى حد كبير. الآن، لجعل العلاقة أقل وضوحًا، قد نرغب في إضافة بعض العشوائية الإضافية عن طريق إضافة متغير عشوائي إلى الراتب. لنرَ ما سيحدث:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"salaries = 1000+np.sin((heights-heights.min())/(heights.max()-heights.mean()))*100+np.random.random(size=len(heights))*20-10\n",
"print(f\"Correlation = {np.corrcoef(heights, salaries)[0,1]}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(heights, salaries)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"> هل يمكنك تخمين لماذا تتراصف النقاط في خطوط عمودية مثل هذه؟\n",
"\n",
"لقد لاحظنا العلاقة بين مفهوم مصطنع الهندسة مثل الراتب والمتغير الملحوظ *الطول*. دعونا نرى أيضًا ما إذا كان المتغيران الملحظان، مثل الطول والوزن، يرتبطان أيضًا:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].ffill(),df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"لسوء الحظ، لم نحصل على أي نتائج - فقط بعض القيم الغريبة `nan`. يرجع ذلك إلى أن بعض القيم في سلسلتنا غير معرفة، ممثلة بـ `nan`، مما يسبب أن تكون نتيجة العملية غير معرفة أيضًا. من خلال النظر إلى المصفوفة يمكننا أن نرى أن عمود `Weight` هو العمود الإشكالي، لأن الارتباط الذاتي بين قيم `Height` قد تم حسابه.\n",
"\n",
"> يوضح هذا المثال أهمية **إعداد البيانات** و**تنظيفها**. بدون بيانات مناسبة لا يمكننا حساب أي شيء.\n",
"\n",
"لنعتمد على طريقة `fillna` لملء القيم المفقودة، وحساب الارتباط:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"np.corrcoef(df['Height'].fillna(method='pad'), df['Weight'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"هناك بالفعل علاقة ارتباط، لكنها ليست قوية كما في مثالنا الاصطناعي. في الواقع، إذا نظرنا إلى مخطط التشتت لقيمة مقابل الأخرى، فإن العلاقة ستكون أقل وضوحًا بكثير:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.scatter(df['Weight'],df['Height'])\n",
"plt.xlabel('Weight')\n",
"plt.ylabel('Height')\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## الاستنتاج\n",
"\n",
"في هذا الدفتر تعلمنا كيفية إجراء العمليات الأساسية على البيانات لحساب الدوال الإحصائية. نحن الآن نعرف كيفية استخدام مجموعة قوية من الرياضيات والإحصائيات من أجل إثبات بعض الفرضيات، وكيفية حساب فواصل الثقة للمتغيرات التعسفية بناءً على عينة بيانات.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**تنويه**:\nتمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى جاهدين لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. ينبغي اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق به. للمعلومات الحساسة، يُنصح بالاعتماد على الترجمة المهنية بواسطة مترجم بشري. نحن غير مسؤولين عن أي سوء تفاهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"interpreter": {
"hash": "86193a1ab0ba47eac1c69c1756090baa3b420b3eea7d4aafab8b85f8b312f0c5"
},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.6"
},
"coopTranslator": {
"original_hash": "0f899e3c5019f948e7c787b22f3b2304",
"translation_date": "2026-01-16T08:23:35+00:00",
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
"language_code": "ar"
}
},
"nbformat": 4,
"nbformat_minor": 4
}