{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ការ៉Introduសេចក្ដីសង្ខេបអំពីប្រហែលនិងស្ថិតិ\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", "យើងចាប់ផ្តើមដោយគូរឧទាហរណ៍មួយនៃតម្លៃចំនួន ៣០ ពីចែកចាយសមាមាត្រពី ០ ទៅ ៩។ យើងនឹងគណនាមធ្យម និង វារីយ៉ងផងដែរ។\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(), orientation='horizontal', 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": [ "> **សម្គាល់**: គំនូសបង្ហាញនេះបញ្ជាក់ថា, imធម្មតា, កម្ពស់របស់អ្នកលេងទីមួយឆ្មាំខ្នាតខ្ពស់ជាងកម្ពស់របស់អ្នកលេងទីពីរចំហៀង។ បន្ទាប់មកយើងនឹងរៀនពីរបៀបដែលយើងអាចសាកល្បងសفرضនេះយ៉ាងផ្លូវការ និងរបៀបបង្ហាញថាទិន្នន័យរបស់យើងមានសារៈសំខាន់ផ្នែកស្ថិតិដើម្បីបង្ហាញវា។ \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", "ឥឡូវនេះ យើងនឹងគណនាជួរជឿជាក់សម្រាប់ទម្ងន់ និងកម្ពស់របស់អ្នកលេងបេស្បាល់។ យើងនឹងប្រើកូដ [ពីការពិភាក្សានៅ 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'].ffill(),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**:\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", "ម៉ាស៊ីនចេតនា​សំណុំ​បែប​រ៉ែន​ដុំ​នៅក្នុង Python ត្រូវ​បាន​រចនា​ឡើង​ដើម្បីផ្តល់ឲ្យ​ពួក​យើង​នូវចែកចាយ​ឯករាជ្យស្របគ្នា។ ប្រសិន​បើយើងចង់បង្កើតម៉ាស៊ីនចេញសម្រាប់ចែកចាយធម្មតា យើងអាចប្រើទ្រឹស្តីកម្រិតកណ្ដាល។ ដើម្បីទទួលបានតម្លៃចែកចាយធម្មតា យើងគ្រាន់តែគណនាមធ្យមនៃគំរូបង្កើតដោយឯករាជ្យស្របគ្នា។ \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'].ffill()\n", "salaries = 1000+(heights-heights.min())/(heights.max()-heights.mean())*100\n", "print(list(zip(heights, salaries))[:10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ឥឡូវនេះ យើងនឹងគណនាអាចប្រើបាន covariance និង correlation របស់សមីការ​ទាំងនោះ។ `np.cov` នឹងផ្តល់ឲ្យយើងនូវអ្វីដែលហៅថា **covariance matrix** ដែលជាការពង្រីកនៃ covariance ទៅនឹងអថេរជាច្រើន។ ធាតុ $M_{ij}$ នៃម៉ាទ្រីស covariance $M$ គឺជាការតភ្ជាប់រវាងអថេរ $X_i$ និង $X_j$ ផ្ទុកក្នុងចំណូល ដោយតម្លៃគន្លងបន្ទាត់ $M_{ii}$ គឺជាអាចប្រើបាននៃ $X_i$។ ដូចគ្នា `np.corrcoef` នឹងផ្តល់ឲ្យយើងនូវ **ម៉ាទ្រីស correlation** ។\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'].ffill(), 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ឯកសារនេះត្រូវបានបម្លែងភាសា ដោយប្រើសេវាបម្លែងភាសា AI [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" } }, "nbformat": 4, "nbformat_minor": 4 }