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.
581 lines
28 KiB
581 lines
28 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# บทนำสู่ความน่าจะเป็นและสถิติ\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",
|
|
"เรามาเริ่มต้นด้วยการสุ่มตัวอย่าง 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 และการทำงานกับข้อมูลในภาษา 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": [
|
|
"## Confidence Intervals\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": [
|
|
"เรามาทดสอบสมมติฐานที่ว่าผู้เล่นตำแหน่ง First Basemen สูงกว่าผู้เล่นตำแหน่ง Second Basemen วิธีที่ง่ายที่สุดในการทดสอบนี้คือการทดสอบช่วงความเชื่อมั่น:\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 ของนักศึกษา (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-value สามารถพิจารณาได้ว่าเป็นความน่าจะเป็นที่การแจกแจงทั้งสองมีค่าเฉลี่ยเท่ากัน ในกรณีของเรา ค่านี้ต่ำมาก ซึ่งหมายความว่ามีหลักฐานที่แข็งแกร่งสนับสนุนว่าผู้เล่นตำแหน่งฐานหนึ่งสูงกว่า\n",
|
|
"* t-value คือค่ากลางของความแตกต่างของค่าเฉลี่ยที่ถูกทำให้เป็นมาตรฐานซึ่งใช้ใน t-test และจะถูกนำไปเปรียบเทียบกับค่าขีดจำกัดสำหรับค่าความเชื่อมั่นที่กำหนดไว้\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'].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` คือคอลัมน์ที่มีปัญหา เนื่องจากมีการคำนวณการแพร่ตัวเอง (self-correlation) ระหว่างค่าของ `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": [
|
|
"## Conclusion\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-16T14:48:45+00:00",
|
|
"source_file": "1-Introduction/04-stats-and-probability/notebook.ipynb",
|
|
"language_code": "th"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
} |