สถิติสำหรับวิทยาการข้อมูล (Statistic for Data Science)
เขียนโดย ดร.จักรกฤษณ์ แสงแก้ว วันที่ 21 กรกฎาคม 2562
สถิติ
- Data Driven Business คือ การใช้ข้อมูลเพื่อตัดสินใจทำเนินการทางธุรกิจ
- Data Analyst หรือ Business Analyst คือ นักวิเคราะห์ข้อมูลโดยใช้ทักษะทางคณิตศาสตร์และสถิติ
ประชากรและตัวอย่าง (Population และ Sample)
- ประชากร คือ กลุ่มข้อมูลทั้งหมดที่สนใจ
- ตัวอย่าง คือ กลุ่มข้อมูลบางส่วนจากประชากรทั้งหมด
พิจารณา : สมมติว่าเราผลิตผงซักผ้าขึ้นมาใหม่ และต้องการทราบผลตอบรับจากแม่บ้านในเขตภาคตะวันออกเฉียงเหนือต่อผลิตภัณฑ์ของเรา สิ่งที่ต้องทำคือ นำผงซักฟอกไปทดสอบกับแม่บ้านทั้งหมดในภาคตะวันออกเฉียงเหนือ
ปัญหาคือ ถ้าเอาผงซักฟอกไปแจกแม่บ้านทุกคนมีเสียค่าใช้จ่ายสูงและยังใช้เวลานานกว่าจะได้ข้อมูลจากผู้ใช้ ดังนั้น จึงใช้ กลุ่มตัวอย่าง (Sample) เนื่องจากผลการวิจัยระบุว่าการเอาผงซักฟอกไปใช้กับแม่บ้านทุกคนในภาคอีสาน(ประชากร) ไม่ต่างจากการเอาใช้กับบางส่วน (กลุ่มตัวอย่าง)
- ประชากร คือ แม่บ้านทุกคนในภาคตะวันออกเฉียงเหนือ
- ตัวอย่าง คือ แม่บ้านบางส่วนที่คัดเลือกออกมาจากแม่บ้านในภาคอีสานทั้งหมด
ค่ากลาง
1. ค่าเฉลี่ย (Mean) คือ ผลรวมทั้งหมดหารด้วยจำนวนข้อมูล
2. มัธยฐาน (Median) คือ การนำข้อมูลมาเรียงจากน้อยไปมากและเลือกเอาค่าข้อมูลที่อยู่ตรงกลางแถว
3. ฐานนิยม (Mode) คือ ค่าข้อมูลที่ซ้ำกันมากที่สุด
การเขียนโปรแกรมเพื่อคำนวณค่า เฉลี่ย (Mean) , มัธยฐาน (Median) และ ฐานนิยม (Mode) ด้วยภาษา python และ numpy
import numpy as np
x = np.array([1, 3, 3, 5, 5, 5, 5, 7, 7, 9])
print("ค่าเฉลี่ย = ", x.mean())
print("ค่ามัธยฐาน = ", np.median(x))
from scipy import stats
mode = stats.mode(x)
print("ค่าฐานนิยม = ", mode[0])
ผลลัพธ์ :
ค่าเฉลี่ย = 5.0
ค่ามัธยฐาน = 5.0
ค่าฐานนิยม = ModeResult(mode=array([5]), count=array([4]))
คำอธิบาย :
บรรทัด 1 : ประกาศขอใช้ไลบรารี่ numpy และตั้งชื่อย่อว่า np
บรรทัด 2 : ประกาศตัวแปร x เป็นชนิด numpy array เพื่อใช้การคำนวณทางคณิตศาสตร์
บรรทัด 3 : พิมพ์ค่าเฉลี่ยของตัวแปร x ด้วยคำสั่ง x.mean()
บรรทัด 4 : พิมพ์ค่ามัธยฐานของตัวแปร x ด้วยคำสั่ง x.median()
บรรทัด 6 : เนื่องจาก numpy ไม่มีฟังก์ชั่นในการหาฐานนิยม เราจึงใช้คลาส stats จากไลบรารี่ scipy ซึ่งเป็นไลบรารี่ด้านสถิติ
บรรทัด 7 : ประกาศตัวแปร mode ซึ่งคำนวณฐานนิยมจาก ฟังก์ชั่น stats.mode()
บรรทัด 8 : พิมพ์ค่าฐานนิยมซึ่งเก็บในตัวแปร mode ซึ่งผลลัพธ์จะแสดงค่าข้อมูลที่มีความถี่สูงสุด คือ เลข 5 โดยมีความถี่คือ 4 ครั้ง
ค่าเบี่ยงเบน
1. พิสัย (Range) คือ ค่าสูงสุดลบด้วยค่าต่ำสุด
2. ค่าแปรปรวน (Variance) คือ ผลรวมของการนำข้อมูลแต่ละตัวมาลบจากค่าเฉลี่ยแล้วยกกำลังสอง
3. ค่าเบี่ยงเบนมาตรฐาน (Standard deviation) คือ การนำค่าความแปรปรวนมาถอดรากที่ 2
import numpy as np
x = np.array([1, 3, 3, 5, 5, 5, 5, 7, 7, 9])
print("พิสัย : ", max(x) - min(x))
print("ความแปรปรวน : ", x.var())
print("ค่าเบี่ยงเบนมาตรฐาน : ", x.std())
ผลลัพธ์ :
พิสัย : 8
ความแปรปรวน : 4.8
ค่าเบี่ยงเบนมาตรฐาน : 2.1908902300206643
คำอธิบาย :
บรรทัด 1 : ประกาศขอใช้ไลบรารี่ numpy และตั้งชื่อย่อว่า np
บรรทัด 2 : ประกาศตัวแปร x เป็นชนิด numpy array เพื่อใช้การคำนวณทางคณิตศาสตร์
บรรทัด 3 : พิมพ์ค่าพิสัยของตัวแปร x ด้วยคำสั่ง max(x) - min(x)
บรรทัด 4 : พิมพ์ค่าความแปรปรวนของตัวแปร x ด้วยคำสั่ง x.var()
บรรทัด 5 : พิมพ์ค่าเบี่ยงเบนมาตรฐานของตัวแปร x ด้วยคำสั่ง x.std()
คะแนนมาตรฐาน
คุณลักษณะของ Z-Score และ T-Score
- Z-Score ใช้ข้อมูลจากกลุ่มประชากรที่รู้จำนวนหรือมากกว่า 30
- T-Score ใช้ข้อมูลจากกลุ่มตัวอย่างที่ไม่ทราบจำนวนและมีขนาดน้อยกว่า 30
- ค่าเฉลี่ยของ Z-Score เท่ากับ 0 ส่วน T-Score เท่ากับ 50
- ค่าพิสัย (Range) ของ Z-Score มีค่าระหว่าง -3 ถึง 3 ส่วน T-Score มีค่าระหว่าง 20 ถึง 80
- ค่าเบี่ยงเบนมาตรฐานของ Z-Score มีค่าเท่ากับ 1 ส่วน -T-Score มีค่าเท่ากับ 10
- ค่าข้อมูลของ Z-Score สามารถเป็นเลขลบได้ ส่วน T-Score จะเป็นเลขบวกเท่านั้น
- Z-Score ใช้งานกับข้อมูลขนาดใหญ่ ส่วน T-Score ใช้กับข้อมูลขนาดจำกัด
from scipy import stats
x = [24, 20, 15, 12, 24, 27, 14, 18, 20, 19, 23, 20, 21, 20, 23, 24, 25, 20, 17, 15]
x.sort(reverse=True)
z = stats.zscore(x)
t = 10*(z)+50
print("ลำดับ\tx\tz\tt")
for i in range(len(x)):
print("%d\t%d\t%.2f\t%.2f"%(i+1,x[i], z[i],t[i]))
ผลลัพธ์ :
ลำดับ x z t
1 27 1.78 67.80
2 25 1.27 62.68
3 24 1.01 60.12
4 24 1.01 60.12
5 24 1.01 60.12
6 23 0.76 57.55
7 23 0.76 57.55
8 21 0.24 52.43
9 20 -0.01 49.87
10 20 -0.01 49.87
11 20 -0.01 49.87
12 20 -0.01 49.87
13 20 -0.01 49.87
14 19 -0.27 47.31
15 18 -0.52 44.75
16 17 -0.78 42.19
17 15 -1.29 37.07
18 15 -1.29 37.07
19 14 -1.55 34.51
20 12 -2.06 29.38
คำอธิบาย :
บรรทัด 1 : ประกาศขอใช้คลาส stats จากไลบรารี่ scipy ซึ่งจัดการด้านสถิติตัวหนึ่ง
บรรทัด 2 : ประกาศตัวแปร x เก็บคะแนนนักเรียนจำนวน 20 คน
บรรทัด 3 : เรียงลำดับคะแนนและให้กลับคะแนนจากมากไปหาน้อย (reverse=True)
บรรทัด 4 : ฟังก์ชั่น stats.zscore(x) ทำหน้าที่คำนวณคะแนน Z ของตัวแปร x
บรรทัด 5 : คำนวณ T-Score จาก Z-Score
บรรทัด 6 : พิมพ์ส่วนหัวของข้อมูล ด้วยคำว่า "ลำดับ x z t"
บรรทัด 7 : วนรอบเข้าไปในตัวแปร x
บรรทัด 8 : พิมพ์ ลำดับ, ค่า x z และ t โดย %d คือเลขจำนวนเต็ม ส่วน %.2f คือทศนิยมสองตำแหน่ง
อธิบายความหมาย
ตัวแปร x เป็นคะแนนนักเรียนจำนวน 20 คน จากนั้นนำไปหาคะแนน Z (Z-Score) ด้วยคำสั่ง stats.zscore(x) และเก็บไว้ในตัวแปร z หลังจากนั้นคำนวณหาคะแนน t (T-Score) ด้วยสูตร 10*(x)+50 จากผลลัพธ์ที่ได้พบว่า คะแนนสูงสุดคือ 27 ต่ำสุดคือ 12 เมื่อเทียบเป็นคะแนน T-Score คะแนน 27 เทียบได้กับ 67.80 คะแนนเต็มร้อย ส่วนคะแนนดิบ 12 เทียบได้เท่ากับ 29.38 คะแนนจาก T-Score
สหสัมพันธ์ (Correlation)
- สหสัมพันธ์ (Correlation) คือ ความสัมพันธ์ระหว่างข้อมูล 2 ชุด มีค่าระหว่าง -1.0 ถึง 1.0 ถ้ามีค่าใกล้ 1 คือมีความสัมพันธ์มาก ถ้าเข้าใกล้ 0 คือ ไม่มีความสัมพันธ์กันเลย ถ้าเข้าใกล้ -1 คือ มีความสัมพันธ์ในทางตรงข้าม
- สูตรการคำนวณสหสัมพันธ์ คือ
$$r = \frac{\sum_{i=1}^n (x_{i} - \bar{x})(y_{i} - \bar{y})}{ \sqrt{ \sum_{i=1}^n (x_{i} - \bar{x})^2 \sum_{i=1}^n (y_{i} - \bar{y})^2 } }$$
import numpy as np
from scipy import stats
x = np.array([5.0,4.0,5.0,2.0,3.0])
y = np.array([4,4.0,5.0,1.5,3])
sp = sum((x - x.mean()) * (y - y.mean()))
from math import sqrt
ss = sqrt(sum((x - x.mean())**2) * sum((y - y.mean())**2))
r = sp/ss
print("สหสัมพันธ์ระหว่าง x และ y มีค่า : %f"%(r))
ผลลัพธ์ :
สหสัมพันธ์ระหว่าง x และ y มีค่า : 0.942128
อธิบาย :
บรรทัด 1 : ประกาศใช้ไลบรารี่ numpy ตั้งชื่อย่อว่า np
บรรทัด 2 : ขอใช้คลาส stats (สถิติ) ของไลบรารี่ scipy
บรรทัด 3-4 : ประกาศตัวแปร x และ y เป็นชนิด numpy array
บรรทัด 6 : คำนวน sum of product ซึ่งเป็นส่วนบนของเครื่องหมายหารในสมการสหสัมพันธ์
บรรทัด 7: ขอใช้ฟังก์ชั่น sqrt สำหรับถอดรากที่สอง
บรรทัด 8: คำนวณ sum of square ซึ่งเป็นส่วนล่างเครื่องหมายหารในสมการสหสัมพันธ์
บรรทัด 9: พิมพ์ค่าสหสัมพันธ์ เมื่อ %f คือแสดงผลด้วยเลขทศนิยม
หมายเหตุ : การคำนวณสหสัมพันธ์โดยใช้ไลบรารี่ scipy สามารถเรียกใช้คำสั่ง stats.pearsonr(x, y) ได้เช่นเดียวกัน
ศึกษาเพิ่มเติม
- https://www.youtube.com/user/RStatsInstitute/videos