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/ur/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",
"آئیے 0 سے 9 تک کی یکساں تقسیم سے 30 قدروں کا نمونہ بنائیں۔ ہم اوسط اور ویرینس بھی حساب کریں گے۔\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 اور Python میں ڈیٹا کے ساتھ کام کرنے کے بارے میں مزید بات کریں گے۔\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",
"فرضیہ کو ثابت کرنے کا ایک شماریاتی طور پر زیادہ درست طریقہ **Student t-test** استعمال کرنا ہے:\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$ کا عنصر $M_{ij}$ ان پٹ متغیرات $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اس دستاویز کا ترجمہ AI ترجمہ خدمات [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:16:03+00:00",
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
"language_code": "ur"
}
},
"nbformat": 4,
"nbformat_minor": 4
}