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/fa/1-Introduction/04-stats-and-probability/notebook.ipynb

581 lines
22 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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",
"بیایید با کشیدن یک نمونه ۳۰ مقداری از توزیع یکنواخت از ۰ تا ۹ شروع کنیم. همچنین میانگین و واریانس را محاسبه خواهیم کرد.\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-value را می‌توان به عنوان احتمال برابری میانگین دو توزیع در نظر گرفت. در مورد ما، این مقدار بسیار کم است، که به این معنی است که شواهد قوی‌ای وجود دارد که حمایت می‌کند اولی‌ها قد بلندتری دارند.\n",
"* مقدار t-value مقدار میانی اختلاف میانگین نرمال‌شده است که در آزمون 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",
"همبستگی به ما اجازه می‌دهد روابط بین دنباله‌های داده را پیدا کنیم. در مثال اسباب‌بازی ما، فرض کنیم یک شرکت بیسبال شرور وجود دارد که به بازیکنانش بر اساس قدشان پول پرداخت می‌کند - هر چقدر بازیکن بلندقدتر باشد، پول بیشتری می‌گیرد. فرض کنید حقوق پایه ۱۰۰۰ دلار است و یک پاداش اضافی از ۰ تا ۱۰۰ دلار بسته به قد وجود دارد. بازیکنان واقعی 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": [
"همبستگی برابر با ۱ به این معنی است که یک **رابطه خطی** قوی بین دو متغیر وجود دارد. می‌توانیم رابطه خطی را به صورت بصری با رسم یکی از مقادیر در مقابل دیگری مشاهده کنیم:\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-16T09:14:56+00:00",
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
"language_code": "fa"
}
},
"nbformat": 4,
"nbformat_minor": 4
}