{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to Probability and Statistics\n", "ਇਸ ਨੋਟਬੁਕ ਵਿੱਚ, ਅਸੀਂ ਕੁਝ ਅਜਿਹੇ ਸਿਧਾਂਤਾਂ ਨਾਲ ਖੇਡਾਂਗੇ ਜਿਨ੍ਹਾਂ ਬਾਰੇ ਅਸੀਂ ਪਹਿਲਾਂ ਹੀ ਵਿਚਾਰ ਕਰ ਚੁੱਕੇ ਹਾਂ। ਸੰਭਾਵਨਾ ਅਤੇ ਅੰਕੜੇ ਵਿਗਿਆਨ ਦੇ ਬਹੁਤ ਸਾਰੇ ਸਿਧਾਂਤPython ਵਿੱਚ ਡਾਟਾ ਪ੍ਰੋਸੈਸਿੰਗ ਲਈ ਮੁੱਖ ਲਾਇਬ्रेਰੀਆਂ ਜਿਵੇਂ ਕਿ `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 ਅਤੇ ਪਿੱਠੋਨ ਵਿੱਚ ਡਾਟਾ ਨਾਲ ਕੰਮ ਕਰਨ ਬਾਰੇ ਹੋਰ ਗੱਲ ਕਰਨਗੇ।\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": [ "## Normal Distribution\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": [ "ਕਿਉਂਕਿ ਜ਼ਿਆਦਾਤਰ ਅਸਲ ਜੀਵਨ ਵਿੱਚ ਮੁੱਲ normalt ਵੰਡੇ ਹੁੰਦੇ ਹਨ, ਸਾਨੂੰ ਨਮੂਨਾ ਡੇਟਾ ਬਣਾਉਣ ਲਈ ਇੱਕ ਸਮਾਨ ਰੈਂਡਮ ਨੰਬਰ ਜੇਨੇਰੇਟਰ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰਨੀ ਚਾਹੀਦੀ। ਅਸੀਂ ਦੇਖਦੇ ਹਾਂ ਕਿ ਜੇ ਅਸੀਂ ਇੱਕ ਸਮਾਨ ਵੰਡ (ਜੋ `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", "ਹੁਣ ਅਸੀਂ ਬੇਸਬਾਲ ਖਿਡਾਰੀਆਂ ਦੇ ਵਜ਼ਨ ਅਤੇ ਕਦ ਦੀਆਂ ਭਰੋਸੇਯੋਗ ਇੰਟਰਵਲ ਦੀ ਗਣਨਾ ਕਰਾਂਗੇ। ਅਸੀਂ ਇਹ ਕੋਡ [ਇਸ stackoverflow ਚਰਚਾ ਤੋਂ](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": [ "## Correlation and Evil Baseball Corp\n", "\n", "Correlation ਸਾਡੇ ਲਈ ਡਾਟਾ ਸੀਕੁਐਂਸز ਵਿਚਕਾਰ ਸੰਬੰਧ ਲੱਭਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ। ਸਾਡੇ ਖੇਡ ਉਦਾਹਰਨ ਵਿੱਚ, ਆਓ ਮੰਨ ਲਈਏ ਕਿ ਇੱਕ ਬੁਰਾ ਬੇਸਬਾਲ ਕਾਰਪੋਰੇਸ਼ਨ ਹੈ ਜੋ ਆਪਣੇ ਖਿਡਾਰੀਆਂ ਨੂੰ ਉਹਨਾਂ ਦੀ ਉਚਾਈ ਦੇ ਅਨੁਸਾਰ ਪੈਸਾ ਦਿੰਦਾ ਹੈ - ਜਿੰਨਾ ਵੱਡਾ ਖਿਡਾਰੀ ਹੁੰਦਾ ਹੈ, ਉੰਨਾ ਜ਼ਿਆਦਾ ਪੈਸਾ ਉਸਨੂੰ ਮਿਲਦਾ ਹੈ। ਮੰਨ ਲਈਏ ਕਿ ਬੇਸ ਸੈਲਰੀ $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\n**ਇਨਕਾਰ**: \nਇਹ ਦਸਤਾਵੇਜ਼ ਏਆਈ ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਰੱਖੋ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸਮਪੜਤਤਾ ਹੋ ਸਕਦੀ ਹੈ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਆਪਣੇ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਕ ਸਰੋਤ ਮਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਿਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਨਾਲ ਉਪਜਣ ਵਾਲੀਆਂ ਕਿਸੇ ਵੀ ਗਲਤਫਹਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆਵਾਂ ਲਈ ਜਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n\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-16T12:47:41+00:00", "source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb", "language_code": "pa" } }, "nbformat": 4, "nbformat_minor": 4 }