สถิติสำหรับวิทยาการข้อมูล (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
สถิติ (Statistics)