บทที่ 2
ข้อมูลตัวแปรเดียว
Univariate Data
ในทางสถิติขอมูลสามารถแบ่งได้เป็น 2 ชนิด ข้อมูลเชิงคุณภาพ (Quanlitative data) หรือข้อมูลเชิงกลุ่ม (Categorical data) และข้อมูลเชิงปริมาณ (Quantitative data) ซึ่งสามารถแบ่งได้เป็น 2 ประเภท คือข้อมูลแบบไม่ต่อเนื่อง (Discreat data) และข้อมูลแบบต่อเนื่อง (Continuous data) ในการใช้วิธีทางสถิติในการวิเคราะห์ข้อมูลนั้นเราจำเป็นต้องทราบว่าข้อมูลของเรานั้นจัดอยู่ในข้อมูลประเภทใด เนื่องจากข้อมูลแต่ละชนิดจะมีการวิเคราะห์ที่แตกต่างกัน ในบทนี้เราจะศึกษาถึงการจัดการข้อมูลชนิดต่างๆโดยใช้ R และการอธิบายและหาข้อสรุปเบื้องต้นเกี่ยวกับข้อมูลชุดหนึ่งที่มีเพียงตัวแปรเดียวโดยการใช้กราฟและค่าสถิติต่างๆ
เมื่อข้อมูลชุดหนึ่งประกอบด้วยตัวแปรเพียงหนึ่งตัว(univariate data set) ซึ่งเราจะศึกษาเป็นการเฉพาะในบทนี้ สำหรับในกรณีที่มีตัวแปรมากกว่า 1 ตัว คือข้อมูลชุดหนึ่งประกอบด้วยตัวแปรสองตัว(bivariate data set) และชุดข้อมูลประกอบด้วยตัวแปร 2 ตัวหรือมากกว่า(multivariate data set) จะกล่าวถึงในบทต่อๆ ไป
ข้อมูลตัวแปรเดียว
Univariate Data
ในทางสถิติขอมูลสามารถแบ่งได้เป็น 2 ชนิด ข้อมูลเชิงคุณภาพ (Quanlitative data) หรือข้อมูลเชิงกลุ่ม (Categorical data) และข้อมูลเชิงปริมาณ (Quantitative data) ซึ่งสามารถแบ่งได้เป็น 2 ประเภท คือข้อมูลแบบไม่ต่อเนื่อง (Discreat data) และข้อมูลแบบต่อเนื่อง (Continuous data) ในการใช้วิธีทางสถิติในการวิเคราะห์ข้อมูลนั้นเราจำเป็นต้องทราบว่าข้อมูลของเรานั้นจัดอยู่ในข้อมูลประเภทใด เนื่องจากข้อมูลแต่ละชนิดจะมีการวิเคราะห์ที่แตกต่างกัน ในบทนี้เราจะศึกษาถึงการจัดการข้อมูลชนิดต่างๆโดยใช้ R และการอธิบายและหาข้อสรุปเบื้องต้นเกี่ยวกับข้อมูลชุดหนึ่งที่มีเพียงตัวแปรเดียวโดยการใช้กราฟและค่าสถิติต่างๆ
เมื่อข้อมูลชุดหนึ่งประกอบด้วยตัวแปรเพียงหนึ่งตัว(univariate data set) ซึ่งเราจะศึกษาเป็นการเฉพาะในบทนี้ สำหรับในกรณีที่มีตัวแปรมากกว่า 1 ตัว คือข้อมูลชุดหนึ่งประกอบด้วยตัวแปรสองตัว(bivariate data set) และชุดข้อมูลประกอบด้วยตัวแปร 2 ตัวหรือมากกว่า(multivariate data set) จะกล่าวถึงในบทต่อๆ ไป
2.1 ข้อมูลเชิงกลุ่ม (Categorical Data)
เมื่อตัวแปรที่ใช้เป็นตัวแปรเชิงคุณภาพ หรือตัวแปรเชิงกลุ่ม เราสามารถทำการหาข้อสรุปเกี่ยวกับข้อมูลเบื้องต้นได้ ในรูปของกราฟ ซึ่งกราฟที่เหมาะสมกับข้อมูลประเภทนี้คือกราฟแท่ง(barplots) , กราฟจุด (dot charts) และ กราฟวงกลม(pie charts)
2.1.1 การสร้างตารางการแจกแจงความถี่
ในการหาข้อสรุปเกี่ยวกับข้อมูลเชิงกลุ่มนั้น เรามักจะทำให้อยู่ในรูปของตารางการแจกแจงความถี่ ตามกลุ่มของข้อมูล ซึ่งใน R คำสั่งที่ใช้ในการสร้างตารางแบบนี้คือ table( ) เช่น ข้อมูลของเราเป็นผลที่ได้จากการสำรวจเกี่ยวกับการสูบบุหรี่ โดยสอบถามผู้ที่เป็นตัวอย่างว่าสูบบุหรี่หรือไม่ ดังนั้นคำตอบที่เป็นไปได้คือ ("yes" = สูบ, "no" = ไม่สูบ) จากการ สำรวจคนจำนวน 5 คน ได้ข้อมูลดังนี้ "yes", "yes", "no", "yes", "no" เราสามารถสร้างตารางการแจกแจงความถี่ของข้อมูลชุดนี้ได้ดังนี้
> res = c("Y", "Y", "N", "Y", "N")
> table(res)
res
N Y
2 3
เนื่องจากตัวอย่างข้างต้นเป็นตัวอย่างง่ายๆข้อมูลไม่มาก ซึ่งเราสามารถสร้างตารางได้โดยไม่ต้องใช้คอมพิวเตอร์ช่วยก็ได้ ตัวอย่างต่อไปเป็นข้อมูลที่มีขนาดใหญ่ เราสามารถใช้ฟังก์ชันเดิมเพื่อสร้างตารางโดยไม่ต้องทำอะไรเพิ่มขึ้นเลย
ตัวอย่างที่ 2.1 Weather in May:
ตัวอย่างนี้เป็นข้อมูลที่ได้จาก The United States National Weather Service เป็นข้อมูลที่เก็บเป็นรายวันในเดือนพฤษภาคม 2003 ประกอบด้วยตัวแปรจำนวนมากทั้งตัวแปรเชิงกลุ่มและตัวแปรเชิงปริมาณ ถ้าเราสนใจลักษณะของการมีเมฆในแต่ละวันคือ "clear", "cloudy", "partly cloudy" ซึ่งค่า สังเกตเกี่ยวกับลักษณะของเมฆที่ Central Park ในเดือนพฤษภามคม 2003 ถูกเก็บไว้ใน central.park.cloud (UsingR) หลังจากติดตั้ง R แล้วจะมี library ชื่อ UsingR ที่เก็บข้อมูลไว้ใน central.park.cloud การเรียกข้อมูลมาทำดังนี้
> library(UsingR)
> central.park.cloud
[1] partly.cloudy partly.cloudy partly.cloudy clear partly.cloudy
[6] partly.cloudy clear cloudy partly.cloudy clear
[11] cloudy partly.cloudy cloudy cloudy clear
[16] partly.cloudy partly.cloudy clear clear clear
[21] clear cloudy cloudy cloudy cloudy
[26] cloudy clear partly.cloudy clear clear
[31] partly.cloud clear clear partly.cloudy cloudy
กำหนดให้ 1=clear, 2 = partly.cloudy, 3 = cloudy
central.park.cloud=c(2,2,2,1,2,2,1,3,2,1,3,2,3,3,1,2,1,3,3,3,3,2,2,2,2,2,3,1,3,3,1,3,3,1,2)
เราสามารถสร้างตารางการแจกแจงความถี่ ของข้อมูลชุดนี้ได้โดย
> table(central.park.cloud)
central.park.cloud
clear partly.cloudy cloudy
11 11 9
การกำหนดข้อมูลเชิงกลุ่มให้อยูในรูปของ factor โดยทั่วไปเรามักจะใช้ข้อมูลเชิงกลุ่มในการแบ่งข้อมูลออกเป็นกลุ่มๆ หรือระดับ เช่น จากตัวอย่างการสำรวจเกี่ยวกับ รายการโทรทัศน์ ตัวแปรนี้อาจเป็นส่วนหนึ่งของข้อมูลของการสำรวจขนาดใหญ่เกี่ยวกับสุขภาพของนิสิตก็ได้ ซึ่งR มีclass พิเศษสำหรับทำงานกับ factors ซึ่งหากเรากำหนดให้ข้อมูลของเราเป็น factors แล้วเมื่อเรียกข้อมูลนี้ R จะทราบโดย อัตโนมัติว่าเป็นข้อมูลหรือตัวแปรนี้เป็น factor การกำหนดให้ตัวแปรเป็น factor ทำได้โดยใช้คำสั่ง factor( ) หรือ as.factor( ) จากตัวอย่างนี้ให้สังเกตว่า R จัดการกับ factor อย่างไร
> x = c("Yes", "No", "No", "Yes", "Yes")
> x # print out values in x
[1] "Yes" "No" "No" "Yes" "Yes"
> factor(x) # print out value in factor(x)
[1] Yes No No Yes Yes
Levels: No Yes # notice levels are printed.
> as.factor(x)
[1] Yes No No Yes Yes
Levels: No Yes
ในการหาข้อสรุปเกี่ยวกับข้อมูลเชิงกลุ่มนั้น เรามักจะทำให้อยู่ในรูปของตารางการแจกแจงความถี่ ตามกลุ่มของข้อมูล ซึ่งใน R คำสั่งที่ใช้ในการสร้างตารางแบบนี้คือ table( ) เช่น ข้อมูลของเราเป็นผลที่ได้จากการสำรวจเกี่ยวกับการสูบบุหรี่ โดยสอบถามผู้ที่เป็นตัวอย่างว่าสูบบุหรี่หรือไม่ ดังนั้นคำตอบที่เป็นไปได้คือ ("yes" = สูบ, "no" = ไม่สูบ) จากการ สำรวจคนจำนวน 5 คน ได้ข้อมูลดังนี้ "yes", "yes", "no", "yes", "no" เราสามารถสร้างตารางการแจกแจงความถี่ของข้อมูลชุดนี้ได้ดังนี้
> res = c("Y", "Y", "N", "Y", "N")
> table(res)
res
N Y
2 3
เนื่องจากตัวอย่างข้างต้นเป็นตัวอย่างง่ายๆข้อมูลไม่มาก ซึ่งเราสามารถสร้างตารางได้โดยไม่ต้องใช้คอมพิวเตอร์ช่วยก็ได้ ตัวอย่างต่อไปเป็นข้อมูลที่มีขนาดใหญ่ เราสามารถใช้ฟังก์ชันเดิมเพื่อสร้างตารางโดยไม่ต้องทำอะไรเพิ่มขึ้นเลย
ตัวอย่างที่ 2.1 Weather in May:
ตัวอย่างนี้เป็นข้อมูลที่ได้จาก The United States National Weather Service เป็นข้อมูลที่เก็บเป็นรายวันในเดือนพฤษภาคม 2003 ประกอบด้วยตัวแปรจำนวนมากทั้งตัวแปรเชิงกลุ่มและตัวแปรเชิงปริมาณ ถ้าเราสนใจลักษณะของการมีเมฆในแต่ละวันคือ "clear", "cloudy", "partly cloudy" ซึ่งค่า สังเกตเกี่ยวกับลักษณะของเมฆที่ Central Park ในเดือนพฤษภามคม 2003 ถูกเก็บไว้ใน central.park.cloud (UsingR) หลังจากติดตั้ง R แล้วจะมี library ชื่อ UsingR ที่เก็บข้อมูลไว้ใน central.park.cloud การเรียกข้อมูลมาทำดังนี้
> library(UsingR)
> central.park.cloud
[1] partly.cloudy partly.cloudy partly.cloudy clear partly.cloudy
[6] partly.cloudy clear cloudy partly.cloudy clear
[11] cloudy partly.cloudy cloudy cloudy clear
[16] partly.cloudy partly.cloudy clear clear clear
[21] clear cloudy cloudy cloudy cloudy
[26] cloudy clear partly.cloudy clear clear
[31] partly.cloud clear clear partly.cloudy cloudy
กำหนดให้ 1=clear, 2 = partly.cloudy, 3 = cloudy
central.park.cloud=c(2,2,2,1,2,2,1,3,2,1,3,2,3,3,1,2,1,3,3,3,3,2,2,2,2,2,3,1,3,3,1,3,3,1,2)
เราสามารถสร้างตารางการแจกแจงความถี่ ของข้อมูลชุดนี้ได้โดย
> table(central.park.cloud)
central.park.cloud
clear partly.cloudy cloudy
11 11 9
การกำหนดข้อมูลเชิงกลุ่มให้อยูในรูปของ factor โดยทั่วไปเรามักจะใช้ข้อมูลเชิงกลุ่มในการแบ่งข้อมูลออกเป็นกลุ่มๆ หรือระดับ เช่น จากตัวอย่างการสำรวจเกี่ยวกับ รายการโทรทัศน์ ตัวแปรนี้อาจเป็นส่วนหนึ่งของข้อมูลของการสำรวจขนาดใหญ่เกี่ยวกับสุขภาพของนิสิตก็ได้ ซึ่งR มีclass พิเศษสำหรับทำงานกับ factors ซึ่งหากเรากำหนดให้ข้อมูลของเราเป็น factors แล้วเมื่อเรียกข้อมูลนี้ R จะทราบโดย อัตโนมัติว่าเป็นข้อมูลหรือตัวแปรนี้เป็น factor การกำหนดให้ตัวแปรเป็น factor ทำได้โดยใช้คำสั่ง factor( ) หรือ as.factor( ) จากตัวอย่างนี้ให้สังเกตว่า R จัดการกับ factor อย่างไร
> x = c("Yes", "No", "No", "Yes", "Yes")
> x # print out values in x
[1] "Yes" "No" "No" "Yes" "Yes"
> factor(x) # print out value in factor(x)
[1] Yes No No Yes Yes
Levels: No Yes # notice levels are printed.
> as.factor(x)
[1] Yes No No Yes Yes
Levels: No Yes
2.1.2 กราฟแท่ง
นอกจากที่ สามารถสรุปข้อมูลเชิงกลุ่มในรูปของตารางแล้ว ยังสามารถสรุปข้อมูลประเภทนี้ในรูปของกราฟได้ด้วย ซึ่งกราฟที่เหมาะสมในการนำเสนอข้อมูลเชิงกลุ่มคือกราฟแท่ง (barplot หรือ bar chart) ซึ่งกราฟแบบนี้ได้จากการพล็อตกลุ่ม หรือระดับของข้อมูลไว้ที่ แกนนอน และแกนตั้งจะเป็นความถี่ ของข้อมูลในกลุ่มนั้น และแสดงความถี่ (frequency) หรือ สัดส่วน (proportion) ของข้อมูลในรูปของแท่งกราฟ
ใน R สามารถสร้างกราฟแท่ง ได้โดยใช้ฟังก์ชัน barplot( ) ต่อไปเป็นตัวอย่างการสร้างกราฟแท่ง
ตัวอย่างที่ 2.2
จากตัวอย่าง Weather in May สร้าง barplot ได้ดังนี้
> barplot(table(central.park.cloud))
รูปที่ 2.1: Barplot of central.park.cloud
นอกจากที่ สามารถสรุปข้อมูลเชิงกลุ่มในรูปของตารางแล้ว ยังสามารถสรุปข้อมูลประเภทนี้ในรูปของกราฟได้ด้วย ซึ่งกราฟที่เหมาะสมในการนำเสนอข้อมูลเชิงกลุ่มคือกราฟแท่ง (barplot หรือ bar chart) ซึ่งกราฟแบบนี้ได้จากการพล็อตกลุ่ม หรือระดับของข้อมูลไว้ที่ แกนนอน และแกนตั้งจะเป็นความถี่ ของข้อมูลในกลุ่มนั้น และแสดงความถี่ (frequency) หรือ สัดส่วน (proportion) ของข้อมูลในรูปของแท่งกราฟ
ใน R สามารถสร้างกราฟแท่ง ได้โดยใช้ฟังก์ชัน barplot( ) ต่อไปเป็นตัวอย่างการสร้างกราฟแท่ง
ตัวอย่างที่ 2.2
จากตัวอย่าง Weather in May สร้าง barplot ได้ดังนี้
> barplot(table(central.park.cloud))
รูปที่ 2.1: Barplot of central.park.cloud
ตัวอย่างที่ 2.3
จากการสำรวจคนจำนวน 25 คนเกี่ยวกับชนิดของเบียร์ที่พวกเขาชอบดื่ม โดยกำหนดรหัสให้กับชนิดของเบียร์ดังนี้
(1) domestic can, (2) domestic bottle, (3) microbrew, (4) import ได้ข้อมูลดังนี้
3 4 1 1 3 4 3 3 1 3
2 1 2 1 2 3 2 3 1 1
1 1 4 3 1
เราจะสร้างกราฟแท่ง สำหรับข้อมูลชุดนี้ โดยจะเริ่มจากใช้ฟังก์ชัน scan() เพื่ออ่านข้อมูล แล้วสร้างกราฟด้วยวิธีการต่างๆดังนี้
beer=c(3,4,1,1,3,4,3,3,1,3,2,1,2,1,2,3,2,3,1,1,1,1,4,3,1)
> par(mfrow=c(1,3)) # partition graphics window into 3 parts
> barplot(beer) # this isn’t correct
> barplot(table(beer), # frequencies
+ xlab="beer", ylab="frequency")
> barplot(table(beer)/length(beer), # proportions
+ xlab="beer", ylab="proportion")
ได้กราฟดังรูปที่ 2.2 barplot รูปแรกทางด้านซ้ายไม่ใช่ barplot ที่ถูกต้อง เนื่องจากไม่ได้ทำการแจกแจงความถี่ของ ข้อมูลก่อน ส่วน barplot รูปที่ 2 และ 3 นั้นถูกต้องแล้วต่างกันที่สเกลของแกนตั้งเท่านั้น แกนตั้งของรูปที่ 2 เป็น ความถี่ ส่วนแกนตั้งของรูปที่ 3 เป็นสัดส่วน
รูปที่ 2.2 BarPlot of Beer
2.1.3 Pie
Charts
Pie chart เป็นกราฟที่ใช้ในการแสดงความถี่สัมพัทธ์หรือสัดส่วนของกลุ่มหรือระดับของตัวแปรเชิงกลุม โดย pie chart จะแสดงสัดส่วนเหล่านี้ด้วยการแบ่งพื้นที่ออกเป็นสวนๆมีขนาดตามสัดส่วนของแต่ละกลุ่มหรือระดับ การสร้าง pie chart คล้ายกับการสร้าง barplot แต่จะใช้ฟังก์ชัน pie( ) ดังนี้
> pie(table(beer),main = "Beer")
Pie chart เป็นกราฟที่ใช้ในการแสดงความถี่สัมพัทธ์หรือสัดส่วนของกลุ่มหรือระดับของตัวแปรเชิงกลุม โดย pie chart จะแสดงสัดส่วนเหล่านี้ด้วยการแบ่งพื้นที่ออกเป็นสวนๆมีขนาดตามสัดส่วนของแต่ละกลุ่มหรือระดับ การสร้าง pie chart คล้ายกับการสร้าง barplot แต่จะใช้ฟังก์ชัน pie( ) ดังนี้
> pie(table(beer),main = "Beer")
รูปที่ 2.3 Pie chart of beer
2.1.4 Dot Charts
Dot chart หรือ Cleveland dotplot เป็นวิธีหนึ่งที่ช่วยให้เราเห็นความแตกต่างระหว่างแต่ละระดับของข้อมูลเชิงกลุ่มได้ชัดเจน โดยปกติ dot chart จะแสดงค่า
2.1.4 Dot Charts
Dot chart หรือ Cleveland dotplot เป็นวิธีหนึ่งที่ช่วยให้เราเห็นความแตกต่างระหว่างแต่ละระดับของข้อมูลเชิงกลุ่มได้ชัดเจน โดยปกติ dot chart จะแสดงค่า
กราฟรูปแบบนี้เราจะเห็นความแตกต่างระหว่างค่าสูงสุดและค่าต่ำสุดได้อย่างชัดเจน
แต่ถ้าต้องการทราบค่าของข้อมูลจริงๆเราต้องดูที่สเกลของกราฟ จากตัวอย่าง beer เราสามารถสร้าง dot chart ได้ดังนี้
> dotchart(table(beer), xlab="Amount of people")
รูปที่ 2.4 Dot chart of Beer data
> dotchart(table(beer), xlab="Amount of people")
รูปที่ 2.4 Dot chart of Beer data
2.2 ข้อมูลเชิงปริมาณ (Numeric Data)
สำหรับ univariate data ที่เป็นข้อมูลเชิงปริมาณนั้น เราต้องการศึกษาลักษณะการแจกแจงของข้อมูล เช่น อยากทราบว่าพิสัยของข้อมูลเท่ากับเท่าไร ค่ากลางของข้อมูลคืออะไร ข้อมูลมีการกระจายมากหรือน้อยขนาดใด ซึ่งเราสามารถหา ค่าหรือพิจารณาได้ทั้งจากกราฟและค่าสถิติ ในหัวข้อนี้เราจะเห็นถึงการใช้ R ในการหาค่าเฉลี่ย ค่าเบี่ยงเบนมาตรฐาน ค่าpth quantile ซึ่งเป็นการขยายแนวคิดเกี่ยวกับค่ามัธยฐานเพื่อหาตำแหน่งของข้อมูล
2.2.1 Stem-and-leaf Plots
สำหรับข้อมูลเชิงปริมาณนั้นเราสามารถใช้กราฟได้หลายรูปแบบในการสรุปเกี่ยวกับข้อมูล ถ้าชุ ดข้อมูลมีขนาดเล็ก กราฟ ที่เหมาะสมในการพิจารณาลักษณะการแจกแจงและค่าของข้อมูลคือ stem-and-leaf plot ในกราฟรูปแบบนี้ตัวเลขที่อยู่ ทางด้านซ้ายของ | คือ stem และตัวเลขที่อยู่ทางด้านขวาของ | คือ leaf หากเรานำตัวเลขสองส่วนมารวมกันจะได้เป็น ค่ าสังเกตของข้อมู ลนั่นเอง
หากเรามีข้อมูลเกี่ยวกับคะแนนที่ นักบาสเกตบอลแต่ละคนในทั้งสองทีมทำได้ในการแข่งขั้นครั้งหนึ่ ง ดังนี้
2 3 16 23 14 12 4 13 2 0
0 0 6 28 31 14 4 8 2 5
เราสามารถสร้าง stem-and-leaf plot ได้ดังนี้
> x = scan()
1: 2 3 16 23 14 12 4 13 2 0 0 0 6 28 31 14 1 8 2 5
21:
Read 20 items
> stem(x)
The decimal point is 1 digit(s) to the right of the |
0 | 000122234568
1 | 23446
2 | 38
3 | 1
stem-and-leaf ทำให้เราสามารถเข้าใจลักษณะของข้อมูลได้ง่ายขึ้น เราสามารถทราบค่าต่ำสุดและสูงสุดของข้อมูล รูปร่าง ของการแจกแจง และค่ากึ่งกลางของข้อมูลได้ทันที เช่น ในตัวอย่างข้างต้นเมื่อพิจารณาจากกราฟเราสามารถทราบได้ทันทีว่าค่าสูงสุดและค่าต่ำสุดของข้อมูลชุดนี้คือ 31 และ 0 คะแนน ตามลำดับ ลักษณะของการแจกแจงของข้อมูลเป็น แบบเบ้ขวา เป็นต้น
ถ้าเราสร้าง stem-and-leaf ครั้งแรกแล้วปรากฏว่ามีจำนวน leaves มากเกินไปในแต่ละ stem เราสามารถเปลี่ยน argument ของฟงก์ชัน stem() ได้ เช่น เราต้องการให้ stem ออกเป็ นสองส่วนเท่าๆกัน สามารถทำได้ดังนี้
> stem(x, scale=2)
The decimal point is 1 digit(s) to the right of the |
0 | 000122234
0 | 568
1 | 2344
1 | 6
2 | 3
2 | 8
3 | 1
0 0 6 28 31 14 4 8 2 5
เราสามารถสร้าง stem-and-leaf plot ได้ดังนี้
> x = scan()
1: 2 3 16 23 14 12 4 13 2 0 0 0 6 28 31 14 1 8 2 5
21:
Read 20 items
> stem(x)
The decimal point is 1 digit(s) to the right of the |
0 | 000122234568
1 | 23446
2 | 38
3 | 1
stem-and-leaf ทำให้เราสามารถเข้าใจลักษณะของข้อมูลได้ง่ายขึ้น เราสามารถทราบค่าต่ำสุดและสูงสุดของข้อมูล รูปร่าง ของการแจกแจง และค่ากึ่งกลางของข้อมูลได้ทันที เช่น ในตัวอย่างข้างต้นเมื่อพิจารณาจากกราฟเราสามารถทราบได้ทันทีว่าค่าสูงสุดและค่าต่ำสุดของข้อมูลชุดนี้คือ 31 และ 0 คะแนน ตามลำดับ ลักษณะของการแจกแจงของข้อมูลเป็น แบบเบ้ขวา เป็นต้น
ถ้าเราสร้าง stem-and-leaf ครั้งแรกแล้วปรากฏว่ามีจำนวน leaves มากเกินไปในแต่ละ stem เราสามารถเปลี่ยน argument ของฟงก์ชัน stem() ได้ เช่น เราต้องการให้ stem ออกเป็ นสองส่วนเท่าๆกัน สามารถทำได้ดังนี้
> stem(x, scale=2)
The decimal point is 1 digit(s) to the right of the |
0 | 000122234
0 | 568
1 | 2344
1 | 6
2 | 3
2 | 8
3 | 1
2.2.2 Dot Plots
นอกจาก stem-and-leaf แล้วยังมีกราฟอีกรูปหนึ่งที่สามารถใช้แทนได้คือ dot plot
> DOTplot(x)
นอกจาก stem-and-leaf แล้วยังมีกราฟอีกรูปหนึ่งที่สามารถใช้แทนได้คือ dot plot
> DOTplot(x)
รูปที่ 2.5: Dot plot of x
2.2.3 The Center: mean, Median, and Mode
การศึกษาการแจกแจงของข้อมูลด้วย stem-and-leaf และ dot plot นั้นอาจมีความยุ่งยากได้หากข้อมูลมี
นวนมากเกินไปวิธีที่สะดวกมากกว่าคือการใช้ค่าสถิติในการสรุปเกี่ยวกับข้อมูล ซึ่งนอกจากค่าสถิติเหล่านี้จะอธิบายถึงลักษณะของข้อมูลชุดนั้นๆแล้ว ยังสามารถใช้ในการเปรียบเทียบข้อมูลหลายชุดได้ ในหัวข้อนี้เราจะกล่าวถึงค่ากลางของข้อมูล ซึ่งสำหรับข้อมูลเชิงปริมาณค่ากลางที่คุ้นเคยกันดีคือค่าเฉลี่ยนั่นเอง ซึ่งในทางปฏิบัติข้อมูลที่มีนั้นเป็นข้อมูลตัวอย่าง ดังนั้นค่าเฉลี่ยที่ได้จะเป็นค่าเฉลี่ยของตัวอยาง, ¯x นั่นเอง
Sample Mean
เราสามารถหาค่าเฉลี่ยของข้อมูลได้โดยตรงจากสูตร
หรือใช้ฟังก์ชัน mean( ) ดังนี้
> xbar = sum(x)/ length(x) # compute mean from the formular
> xbar
[1] 9.2
> mean(x) # obtain mean from built-in function
[1] 9.2
2.2.3 The Center: mean, Median, and Mode
การศึกษาการแจกแจงของข้อมูลด้วย stem-and-leaf และ dot plot นั้นอาจมีความยุ่งยากได้หากข้อมูลมี
นวนมากเกินไปวิธีที่สะดวกมากกว่าคือการใช้ค่าสถิติในการสรุปเกี่ยวกับข้อมูล ซึ่งนอกจากค่าสถิติเหล่านี้จะอธิบายถึงลักษณะของข้อมูลชุดนั้นๆแล้ว ยังสามารถใช้ในการเปรียบเทียบข้อมูลหลายชุดได้ ในหัวข้อนี้เราจะกล่าวถึงค่ากลางของข้อมูล ซึ่งสำหรับข้อมูลเชิงปริมาณค่ากลางที่คุ้นเคยกันดีคือค่าเฉลี่ยนั่นเอง ซึ่งในทางปฏิบัติข้อมูลที่มีนั้นเป็นข้อมูลตัวอย่าง ดังนั้นค่าเฉลี่ยที่ได้จะเป็นค่าเฉลี่ยของตัวอยาง, ¯x นั่นเอง
Sample Mean
เราสามารถหาค่าเฉลี่ยของข้อมูลได้โดยตรงจากสูตร
หรือใช้ฟังก์ชัน mean( ) ดังนี้
> xbar = sum(x)/ length(x) # compute mean from the formular
> xbar
[1] 9.2
> mean(x) # obtain mean from built-in function
[1] 9.2
คำสั่ง mean( ) จะคำนวณค่าเฉลี่ยของตัวอย่างสำหรับ data vector เราสามารถเพิ่ม arguments ลงไปในคำสั่งนี้ได้ เช่น
trim = ซึ่งเป็นการกำหนดให้คำนวณ trimed mean และ na.rm = เพื่อกำจัด missing data ออกจากชุดข้อมูล
trim = ซึ่งเป็นการกำหนดให้คำนวณ trimed mean และ na.rm = เพื่อกำจัด missing data ออกจากชุดข้อมูล
Median
ในบางครั้งการใช้ค่าเฉลี่ ยเป็นค่ากลางของข้อมูลนั้นก็ไม่เหมาะสมโดยเฉพาะเมื่อมีค่าผิดปกติในชุดข้อมูล ซึ่งหากเราใช้ ค่าเฉลี่ยเป็นค่ากลางของค่ามูลจะทำให้เราได้ค่ากลางที่ ไม่ เป็นตัวแทนที่ ของค่าของข้อมูลส่วนใหญ่ ในชุดข้อมูล ค่ากลาง ที่เหมาะสมในกรณีที่มีค่าผิดปกติอยู่ในชุดข้อมูลคือ ค่ามัธยฐาน (median) ซึ่งเป็นค่าสังเกตที่มีตำแหน่งอยู่กึ่งกลางของ ค่าสังเกตทั้งหมดที่มีการเรียงลำดับจากน้อยไปหามากแล้ว เราสามารถหาค่ามัธยฐานของชุดข้อมูลได้ดังนี้
ในบางครั้งการใช้ค่าเฉลี่ ยเป็นค่ากลางของข้อมูลนั้นก็ไม่เหมาะสมโดยเฉพาะเมื่อมีค่าผิดปกติในชุดข้อมูล ซึ่งหากเราใช้ ค่าเฉลี่ยเป็นค่ากลางของค่ามูลจะทำให้เราได้ค่ากลางที่ ไม่ เป็นตัวแทนที่ ของค่าของข้อมูลส่วนใหญ่ ในชุดข้อมูล ค่ากลาง ที่เหมาะสมในกรณีที่มีค่าผิดปกติอยู่ในชุดข้อมูลคือ ค่ามัธยฐาน (median) ซึ่งเป็นค่าสังเกตที่มีตำแหน่งอยู่กึ่งกลางของ ค่าสังเกตทั้งหมดที่มีการเรียงลำดับจากน้อยไปหามากแล้ว เราสามารถหาค่ามัธยฐานของชุดข้อมูลได้ดังนี้
หรือจากฟังก์ชัน median( )
พิจารณาตัวอย่างต่อไปนี้ เจ้าของร้านอาหารแห่งหนึ่งต้องการหาค่าเฉลี่ยของความมั่งคั่งของลู กค้าที่มารับประทาน อาหารในร้านของเขาเป็นประจำทั้งก่อนและหลังจากที่ Bill Gates จะเข้ามาเป็นลูกค้าประจำของเขา จะพบว่าค่าเฉลี่ย นั้นถูกกระทบด้วยค่าที่สูงผิดปกติอย่างมาก ในขณะที่ค่านี้แทบจะไม่มีผลต่อค่ามัธยฐานแลย
> bar = c(50,60,100,75,200) # bar patrons worth in 1000s
> bar.with.gates = c(bar,50000) # after Bill Gates enters
> mean(bar)
[1] 97
> mean(bar.with.gates)
[1] 8414.167
> median(bar)
[1] 75
> median(bar.with.gates) # median is resistant
[1] 87.5
พิจารณาตัวอย่างต่อไปนี้ เจ้าของร้านอาหารแห่งหนึ่งต้องการหาค่าเฉลี่ยของความมั่งคั่งของลู กค้าที่มารับประทาน อาหารในร้านของเขาเป็นประจำทั้งก่อนและหลังจากที่ Bill Gates จะเข้ามาเป็นลูกค้าประจำของเขา จะพบว่าค่าเฉลี่ย นั้นถูกกระทบด้วยค่าที่สูงผิดปกติอย่างมาก ในขณะที่ค่านี้แทบจะไม่มีผลต่อค่ามัธยฐานแลย
> bar = c(50,60,100,75,200) # bar patrons worth in 1000s
> bar.with.gates = c(bar,50000) # after Bill Gates enters
> mean(bar)
[1] 97
> mean(bar.with.gates)
[1] 8414.167
> median(bar)
[1] 75
> median(bar.with.gates) # median is resistant
[1] 87.5
Trimmed Mean
เนื่องจากค่าเฉลี่ยนั้นถูกกระทบได้ง่ายด้วยค่าของข้อมูลที่ผิดปกติ ดังนั้นจึงมีการปรับค่าของค่าเฉลี่ยใหม่โดยการใช้ ค่าเฉลี่ยที่เรียกว่า trimmed mean ซึ่งค่าเฉลี่ยแบบนี้คือค่าเฉลี่ยของข้อมูลที่มีการตัดค่าต่ำสุดและสูงสุดของข้อมูลออก ไปแล้ว ดังนั้นหากในชุดข้อมูลมีค่าสังเกตที่ผิดปกติไม่มากนัก จะทำให้ trimmed mean ไม่ถูกกระทบด้วยค่าสังเกตที่ผิดปกติ ตัวอย่างต่อไปนี้แสดงการใช้ trimmed mean ในการหาค่ากลางของข้อมูล
เนื่องจากค่าเฉลี่ยนั้นถูกกระทบได้ง่ายด้วยค่าของข้อมูลที่ผิดปกติ ดังนั้นจึงมีการปรับค่าของค่าเฉลี่ยใหม่โดยการใช้ ค่าเฉลี่ยที่เรียกว่า trimmed mean ซึ่งค่าเฉลี่ยแบบนี้คือค่าเฉลี่ยของข้อมูลที่มีการตัดค่าต่ำสุดและสูงสุดของข้อมูลออก ไปแล้ว ดังนั้นหากในชุดข้อมูลมีค่าสังเกตที่ผิดปกติไม่มากนัก จะทำให้ trimmed mean ไม่ถูกกระทบด้วยค่าสังเกตที่ผิดปกติ ตัวอย่างต่อไปนี้แสดงการใช้ trimmed mean ในการหาค่ากลางของข้อมูล
ตัวอย่างที่ 2.4
ตัวอย่างนี้จะศึกษาถึงลักษณะการแจกแจงของข้อมูล cfb (UsingR) ซึ่งได้จากการสำรวจ Survey of
Consumer Finances ของ U.S. Federal reserve Board ในปี 2001 ตัวแปรหลายตัวในข้อมูลชุดนี้มีค่าบางค่าที่มากกว่าค่าของข้อมูลส่วนใหญ่ เช่น ตัวแปรชื่อ income เราจะหาค่ากลางของข้อมูลชุดนี้
> income = cfb$INCOME
> mean(income)
[1] 63402.66
> median(income)
[1] 38032.70
> mean(income,trim=.2)
[1] 41991.86
> sum(income <= mean(income))/length(income)*100
[1] 70.5
จากผลที่ได้เห็นได้ชัดว่าข้อมูลชุดนี้มีการแจกแจงแบบเบ้ขวา เนื่องจากค่าเฉลี่ยมีค่ามากกว่าค่ามัธยฐานมาก และค่า trimmed mean นั้นมีค่าใกล้เคียงกับค่ามัธยฐาน บรรทัดสุดท้ายแสดงให้เห็นว่ามีค่าของข้อมูลร้อยละ 70.5 ที่มีค่าน้อย กว่า
Mode
ตามที่ทราบดีแล้วว่าค่าฐานนิยมของชุดข้อมูลคือค่าของข้อมูลที่เกิดขึ้นบ่อยที่สุดในชุ ดข้อมูล โดยปกติเราจะใช้ค่ามัธยฐาน นี้กับข้อมูลเชิงปริมาณแบบไม่ต่อเนื่องเท่านั้น สำหรับ R นั้นไม่มีฟังก์ชันในการหาค่าฐานนิยม เนื่องจากฐานนิยมไม่ใช่ ค่ากลางที่ ดีของข้อมูล อย่างไรก็ตามเราสามารถหาค่าฐานนิยมได้ดังนี้
> x = c(72,75,84,84,98,94,55,62)
> which(table(x) == max(table(x)))
84
5
จากผลลัพธ์ที่ได้ ค่า 84 ซึ่งเป็นค่าสังเกตต่ำแหน่งที่ 5 หลังจากเรียงลำดับข้อมูลจากน้อยไปหามากแล้ว นอกจากที่เราสามารถหาค่าฐานนิยมได้ตามคำสั่งข้างต้นแล้ว เรายังสามารถหาค่าฐานนิยมได้จากคำสั่งwhich.max( ) ได้ดังนี้
> which.max(table(x))
84
5
Sample Range
ค่าสถิติที่ใช้ในการอธิบายถึงความผันแปรของข้อมูลนั้นมีอยู่หลายค่าด้วยกัน ค่าพิสัย (range) เป็ นหนึ่งในค่าเหล่านั้น และเป็ นค่าที่ คำนวณได้ง่ายที่ สุ ด สำหรับ R เราสามารถหาค่าพิสัยได้โดยใช้คำสั่ง range( ) ซึ่งจะให้ผลลัพธ์เป็นค่าต่ำสุด และค่าสูงสุดของข้อมูล หากเราของการทราบว่าผลต่างระหว่างสองค่านี้ทำได้โดยใช้ diff(range( )) เช่น
> x = c(72,75,84,84,98,94,55,62)
> range(x)
[1] 55 98
> diff(range(x))
[1] 43
ตัวอย่างนี้จะศึกษาถึงลักษณะการแจกแจงของข้อมูล cfb (UsingR) ซึ่งได้จากการสำรวจ Survey of
Consumer Finances ของ U.S. Federal reserve Board ในปี 2001 ตัวแปรหลายตัวในข้อมูลชุดนี้มีค่าบางค่าที่มากกว่าค่าของข้อมูลส่วนใหญ่ เช่น ตัวแปรชื่อ income เราจะหาค่ากลางของข้อมูลชุดนี้
> income = cfb$INCOME
> mean(income)
[1] 63402.66
> median(income)
[1] 38032.70
> mean(income,trim=.2)
[1] 41991.86
> sum(income <= mean(income))/length(income)*100
[1] 70.5
จากผลที่ได้เห็นได้ชัดว่าข้อมูลชุดนี้มีการแจกแจงแบบเบ้ขวา เนื่องจากค่าเฉลี่ยมีค่ามากกว่าค่ามัธยฐานมาก และค่า trimmed mean นั้นมีค่าใกล้เคียงกับค่ามัธยฐาน บรรทัดสุดท้ายแสดงให้เห็นว่ามีค่าของข้อมูลร้อยละ 70.5 ที่มีค่าน้อย กว่า
Mode
ตามที่ทราบดีแล้วว่าค่าฐานนิยมของชุดข้อมูลคือค่าของข้อมูลที่เกิดขึ้นบ่อยที่สุดในชุ ดข้อมูล โดยปกติเราจะใช้ค่ามัธยฐาน นี้กับข้อมูลเชิงปริมาณแบบไม่ต่อเนื่องเท่านั้น สำหรับ R นั้นไม่มีฟังก์ชันในการหาค่าฐานนิยม เนื่องจากฐานนิยมไม่ใช่ ค่ากลางที่ ดีของข้อมูล อย่างไรก็ตามเราสามารถหาค่าฐานนิยมได้ดังนี้
> x = c(72,75,84,84,98,94,55,62)
> which(table(x) == max(table(x)))
84
5
จากผลลัพธ์ที่ได้ ค่า 84 ซึ่งเป็นค่าสังเกตต่ำแหน่งที่ 5 หลังจากเรียงลำดับข้อมูลจากน้อยไปหามากแล้ว นอกจากที่เราสามารถหาค่าฐานนิยมได้ตามคำสั่งข้างต้นแล้ว เรายังสามารถหาค่าฐานนิยมได้จากคำสั่งwhich.max( ) ได้ดังนี้
> which.max(table(x))
84
5
Sample Range
ค่าสถิติที่ใช้ในการอธิบายถึงความผันแปรของข้อมูลนั้นมีอยู่หลายค่าด้วยกัน ค่าพิสัย (range) เป็ นหนึ่งในค่าเหล่านั้น และเป็ นค่าที่ คำนวณได้ง่ายที่ สุ ด สำหรับ R เราสามารถหาค่าพิสัยได้โดยใช้คำสั่ง range( ) ซึ่งจะให้ผลลัพธ์เป็นค่าต่ำสุด และค่าสูงสุดของข้อมูล หากเราของการทราบว่าผลต่างระหว่างสองค่านี้ทำได้โดยใช้ diff(range( )) เช่น
> x = c(72,75,84,84,98,94,55,62)
> range(x)
[1] 55 98
> diff(range(x))
[1] 43
Sample Variance and Sample Standard
Deviation
ความแปรปรวนและค่าเบี่ยงเบนมาตรฐานของตัวอย่างนั้นสามารถคำนวณได้จาก
ความแปรปรวนและค่าเบี่ยงเบนมาตรฐานของตัวอย่างนั้นสามารถคำนวณได้จาก
ซึ่งจากสูตรจะเห็นได้ว่าค่าความแปรปรวนนั้นคือค่าเฉลี่ยของกำลังสองของผลต่างระหว่างค่าสังเกตกับค่าเฉลี่ย
และเราสามารถหาค่าทั้งสองคานี้ใน R ได้จาก
> xbar = mean(x)
> n = length(x)
> xvar = (1/(n-1)) * sum((x - xbar)^2) # compute variance directly
> xvar
[1] 89.74737
> var(x) # use built-in function
[1] 89.74737
> xsd = sqrt(xvar)
> xsd
[1] 9.473509
> sd(x)
[1] 9.473509
Quantiles, Percentiles
ค่าเบี่ ยงเบนมาตรฐานอาจไม่ใช่ค่าที่ดีนักในการวัดการกระจายของข้อมูลถ้าข้อมูลชุดนั้นมีค่าที่ผิดปกติ
ในกรณีเราสามารถใช้ IQR เป็นทางเลือกหนึ่งได้
> x = 0:5
> length(x)
[1] 6
> sum(sort(x)[3:4])/2 # median from the hard way
[1] 2.5
> median(x) # median from built-in function
[1] 2.5
> quantile(x,.25)
25%
1.25
> quantile(x,c(.25,.5,.75)) # more than one at a time
25% 50% 75% 1.25 2.50 3.75
> quantile(x) # defualt gives quartiles
และเราสามารถหาค่าทั้งสองคานี้ใน R ได้จาก
> xbar = mean(x)
> n = length(x)
> xvar = (1/(n-1)) * sum((x - xbar)^2) # compute variance directly
> xvar
[1] 89.74737
> var(x) # use built-in function
[1] 89.74737
> xsd = sqrt(xvar)
> xsd
[1] 9.473509
> sd(x)
[1] 9.473509
Quantiles, Percentiles
ค่าเบี่ ยงเบนมาตรฐานอาจไม่ใช่ค่าที่ดีนักในการวัดการกระจายของข้อมูลถ้าข้อมูลชุดนั้นมีค่าที่ผิดปกติ
ในกรณีเราสามารถใช้ IQR เป็นทางเลือกหนึ่งได้
> x = 0:5
> length(x)
[1] 6
> sum(sort(x)[3:4])/2 # median from the hard way
[1] 2.5
> median(x) # median from built-in function
[1] 2.5
> quantile(x,.25)
25%
1.25
> quantile(x,c(.25,.5,.75)) # more than one at a time
25% 50% 75% 1.25 2.50 3.75
> quantile(x) # defualt gives quartiles
0% 25% 50% 75%
100%
0.00 1.25 2.50
3.75 5.00
ตัวอย่างที่ 2.5
Executive pay: exec.pay (UsingR) เป็นข้อมูลเกี่ยวกับจำนวนเงินที่ CEO ของบริษัท 199 แห่งในU.S. ได้รับในปี2000 มีหน่วยเป็น$10,000 ข้อมูลชุดนี้มีการแจกแจงแบบไม่สมมาตรเมื่อพิจารณาจาก stem-and-leaf เราจะใช้ quantile() เพื่ อพิจารณาข้อมูลชุดนี้ดังนี้
> sum(exec.pay > 100)/length(exec.pay) # proportion more
[1] 0.09045226 # 9% make more than 1 million
> quantile(exec.pay,0.9) # 914,000 dollars is 90 percentile
90%
91.4
> quantile(exec.pay,0.99) # 9 million is top 1 percentile
99%
906.62
> sum(exec.pay <= 10)/length(exec.pay)
[1] 0.1457286 # 14 percent make 100,000 or less
> quantile(exec.pay,.10) # the 10 percentile is 90,000
10%
9
Inter-quartile Range
Inter-quartile range คือระยะห่างระหว่าง 75th percentile และ 25th percentile ใน R จะใช้ฟังก์ชัน
QR() ดังนี้ จากตัวอย่าง Executive pay
> IQR(exec.pay)
[1] 27.5
ในขณะที่ค่าเบี่ยงเบนมาตรฐานของข้อมูลคือ
> sd(exec.pay)
[1] 207.0435
จะเห็นได้ว่าค่าเบี่ยงเบนมาตรฐานมีค่ามากกว่าค่าพิสัยควอร์ไทล์มาก เนื่องจากค่าที่มากที่สุดของข้อมูลมี
ค่ามากกว่าค่าของข้อมูลอื่นๆมากทำให้ข้อมูลมีการแจกแจงแบบเบ้
Executive pay: exec.pay (UsingR) เป็นข้อมูลเกี่ยวกับจำนวนเงินที่ CEO ของบริษัท 199 แห่งในU.S. ได้รับในปี2000 มีหน่วยเป็น$10,000 ข้อมูลชุดนี้มีการแจกแจงแบบไม่สมมาตรเมื่อพิจารณาจาก stem-and-leaf เราจะใช้ quantile() เพื่ อพิจารณาข้อมูลชุดนี้ดังนี้
> sum(exec.pay > 100)/length(exec.pay) # proportion more
[1] 0.09045226 # 9% make more than 1 million
> quantile(exec.pay,0.9) # 914,000 dollars is 90 percentile
90%
91.4
> quantile(exec.pay,0.99) # 9 million is top 1 percentile
99%
906.62
> sum(exec.pay <= 10)/length(exec.pay)
[1] 0.1457286 # 14 percent make 100,000 or less
> quantile(exec.pay,.10) # the 10 percentile is 90,000
10%
9
Inter-quartile Range
Inter-quartile range คือระยะห่างระหว่าง 75th percentile และ 25th percentile ใน R จะใช้ฟังก์ชัน
QR() ดังนี้ จากตัวอย่าง Executive pay
> IQR(exec.pay)
[1] 27.5
ในขณะที่ค่าเบี่ยงเบนมาตรฐานของข้อมูลคือ
> sd(exec.pay)
[1] 207.0435
จะเห็นได้ว่าค่าเบี่ยงเบนมาตรฐานมีค่ามากกว่าค่าพิสัยควอร์ไทล์มาก เนื่องจากค่าที่มากที่สุดของข้อมูลมี
ค่ามากกว่าค่าของข้อมูลอื่นๆมากทำให้ข้อมูลมีการแจกแจงแบบเบ้
Numeric
summaries of the data
ในการอธิบายการแจกแจงของข้อมูลเชิงปริมาณนั้นทำได้โดยการพิจารณาจากพิสัยค่าเฉลี่ยค่าเบี่ยงเบนมาตรฐาน ของข้อมูล อย่างไรก็ตามเราอาจจะอธิบายข้อมูลด้วยค่าพิสัยควอร์ไทล์ และค่าเฉลี่ยก็ได้ ใน R มีคำสั่ง summary( ) ที่ ให้ผลลัพธ์เป็ นค่าเหล่านี้สำหรับเวคเตอร์ข้อมูลเชิงปริมาณ ดังตัวอย่างต่อไปนี้
จากตัวอย่าง
> summary(exec.pay)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 14.00 27.00 59.89 41.50 2510.00
ในการอธิบายการแจกแจงของข้อมูลเชิงปริมาณนั้นทำได้โดยการพิจารณาจากพิสัยค่าเฉลี่ยค่าเบี่ยงเบนมาตรฐาน ของข้อมูล อย่างไรก็ตามเราอาจจะอธิบายข้อมูลด้วยค่าพิสัยควอร์ไทล์ และค่าเฉลี่ยก็ได้ ใน R มีคำสั่ง summary( ) ที่ ให้ผลลัพธ์เป็ นค่าเหล่านี้สำหรับเวคเตอร์ข้อมูลเชิงปริมาณ ดังตัวอย่างต่อไปนี้
จากตัวอย่าง
> summary(exec.pay)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 14.00 27.00 59.89 41.50 2510.00
2.3 Shape of a
Distribution
เมื่อชุดข้อมูลมีขนาดใหญ่การใช้ stem-and-leaf ในการศึกษาถึงการแจกแจงของข้อมูลนั้นมีรายละเอียด
ของข้อมูลมาก เกินไปเนื่องจากกราฟรูปแบบนี้แสดงค่าสังเกตทุกค่าของข้อมูลดังนั้นในกรณีที่ชุดข้อมูลมีขนาดใหญ่กราฟที่เรานิยมใช้ในการศึกษาถึงลักษณะการแจกแจงของข้อมูลคือ Histogram และ Boxplot
2.3.1 Histogram
Histogram เป็นกราฟที่แสดงถึงลักษณะการแจกแจงของข้อมูลจากกราฟเราสามารถทราบได้ทันทีว่าข้อมูลส่วนใหญ่มีค่าอยู่ในช่วงใด ตัวอย่างต่อไปนี้เป็นตัวอย่างของการสร้าง histogram สำหรับตัวแปร waiting ที่อยู่ในชุดข้อมูล faithful ซึ่งตัวแปรนี้เป็นข้อมูลเกี่ยวกับระยะเวลาที่เว้นช่วงระหว่างการเกิดระเบิดของภูเขาไฟ Old Faithful เราสร้าง histogram ด้วยคำสั่ง hist( ) ดังนี้
> data(faithful)
> attach(faithful)
> hist(waiting)
ซึ่งในตัวอยางข้างบนนี้เป็นการสร้าง histogram ที่ง่ายที่สุด
รูปที่ 2.6 Histogram ของตัวแปร waiting ใน Faithful data set
การสร้าง Histogram ใน R ด้วย hist( )
ในการสร้าง histogram นั้นเราต้องตัดสินใจว่าเราจะใช้ความกว้างชั้นเท่าใด (bins) และจะให้ความสูงของแท่งกราฟ แสดงค่าอะไรสำหรับคำสั่ง hist( )ใน R นั้นมี arguments สำหรับการเลือก bins และการเลือกค่าที่แสดงความสูงของ แท่งกราฟ ซึ่งความสูงของแท่งกราฟนั้นอาจจะเป็ นความถี่ (frequency) หรือสัดส่วน (proportion) ก็ได้ สำหรับฟังก์ชัน hist() เราสามารถควบคุมขนาดของ bin ได้โดยใช้ argument breaks = โดยกำหนดได้หลายแบบ คือกำหนดเป็นชื่อของ algorithm ได้แก่ "Sturges" ซึ่งเป็น default, "Scott" หรือ "Friedman-Diaconis", กำหนดด้วย จำนวนของ breaks ที่ต้องการหรือกำหนดตำแหน่งของ breaks เช่น
> par(mfrow=c(2,2))
> hist(waiting) # usr defaults
> hist(waiting,breaks=10) # suggest 10 breaks
> hist(waiting,breaks=seq(43,108,length=10)) # use these breaks
> hist(waiting,breaks="scott") # use "Scott" algorithm
รูปที่ 2.7: Histogram of waiting variable in faithful data set
เมื่อพิจารณา histograms ที่สร้างขึ้นทั้ง 4 รูป จะเห็นว่าในรูปที่ 2 ซึ่งเรากำหนดไว้ว่าให้ใช้จำนวน
breaks=10 แต่ปรากฎว่ากราฟนั้นมีจำนวนแท่งกราฟมากกว่า 10 แท่งกราฟ ส่วนรูปที่ 3 นั้นเรากำหนด breaks ในรูปของเวคเตอร์ของจุดตัดโดยตรงเพื่อให้ได้กราฟอย่างที่เราต้องการ นอกจากนั้นหากเราต้องการสร้าง histogram ที่ความสูงของแท่งกราฟคือสัดส่วนก็สามารถทำได้โดยใช้ argument probability= โดยที่ default เป็น FALSE คือความสูงของแท่งกราฟจะเป็นความถี่
> par(mfrow=c(1,2))
> hist(waiting)
> hist(waiting,prob=TRUE)
รูปที่ 2.8: Histogram of waiting variable in faithful data set
จะเห็นได้ว่า histograms ที่ได้นั้นมีลักษณะเหมือนกันทุกประการ ยกเว้นแกนตั้งเท่านั้นที่แตกต่างกัน
ตามปกติ แล้ว R จะใช้ช่วงของข้อมูลเป็นแบบ(a, b] หากเราต้องการเปลี่ยนให้เป็นแบบ[a, b] ก็สามารถทำได้โดย
ใช้ argument include.lowest = TRUE
ตัวอย่างที่ 2.6
ตัวอย่างต่อไปนี้เป็นการสร้าง histogram โดยใช้ arguments ต่างๆในคำสั่ง hist( ) เพื่อให้กราฟสมบูรณ์
มากขึ้น
> hist(waiting,breaks="Scott",prob=TRUE,col="blue",
+ main = "My histogram of the waiting variable")
คำสั่ง hist( ) นั้นเป็นคำสั่งในการสร้าง histogram ที่มีประสิทธิ์ภาพดีคำสั่งหนึ่ง อย่างไรก็ตามยังมีคำสั่งอีกคำสั่ง
หนึ่งที่สามารถนำมาใช้แทนคำสั่งนี้ไดคือ truehist( ) ซึ่งอยู่ในแพคเกจ MASS
เมื่อชุดข้อมูลมีขนาดใหญ่การใช้ stem-and-leaf ในการศึกษาถึงการแจกแจงของข้อมูลนั้นมีรายละเอียด
ของข้อมูลมาก เกินไปเนื่องจากกราฟรูปแบบนี้แสดงค่าสังเกตทุกค่าของข้อมูลดังนั้นในกรณีที่ชุดข้อมูลมีขนาดใหญ่กราฟที่เรานิยมใช้ในการศึกษาถึงลักษณะการแจกแจงของข้อมูลคือ Histogram และ Boxplot
2.3.1 Histogram
Histogram เป็นกราฟที่แสดงถึงลักษณะการแจกแจงของข้อมูลจากกราฟเราสามารถทราบได้ทันทีว่าข้อมูลส่วนใหญ่มีค่าอยู่ในช่วงใด ตัวอย่างต่อไปนี้เป็นตัวอย่างของการสร้าง histogram สำหรับตัวแปร waiting ที่อยู่ในชุดข้อมูล faithful ซึ่งตัวแปรนี้เป็นข้อมูลเกี่ยวกับระยะเวลาที่เว้นช่วงระหว่างการเกิดระเบิดของภูเขาไฟ Old Faithful เราสร้าง histogram ด้วยคำสั่ง hist( ) ดังนี้
> data(faithful)
> attach(faithful)
> hist(waiting)
ซึ่งในตัวอยางข้างบนนี้เป็นการสร้าง histogram ที่ง่ายที่สุด
รูปที่ 2.6 Histogram ของตัวแปร waiting ใน Faithful data set
การสร้าง Histogram ใน R ด้วย hist( )
ในการสร้าง histogram นั้นเราต้องตัดสินใจว่าเราจะใช้ความกว้างชั้นเท่าใด (bins) และจะให้ความสูงของแท่งกราฟ แสดงค่าอะไรสำหรับคำสั่ง hist( )ใน R นั้นมี arguments สำหรับการเลือก bins และการเลือกค่าที่แสดงความสูงของ แท่งกราฟ ซึ่งความสูงของแท่งกราฟนั้นอาจจะเป็ นความถี่ (frequency) หรือสัดส่วน (proportion) ก็ได้ สำหรับฟังก์ชัน hist() เราสามารถควบคุมขนาดของ bin ได้โดยใช้ argument breaks = โดยกำหนดได้หลายแบบ คือกำหนดเป็นชื่อของ algorithm ได้แก่ "Sturges" ซึ่งเป็น default, "Scott" หรือ "Friedman-Diaconis", กำหนดด้วย จำนวนของ breaks ที่ต้องการหรือกำหนดตำแหน่งของ breaks เช่น
> par(mfrow=c(2,2))
> hist(waiting) # usr defaults
> hist(waiting,breaks=10) # suggest 10 breaks
> hist(waiting,breaks=seq(43,108,length=10)) # use these breaks
> hist(waiting,breaks="scott") # use "Scott" algorithm
รูปที่ 2.7: Histogram of waiting variable in faithful data set
เมื่อพิจารณา histograms ที่สร้างขึ้นทั้ง 4 รูป จะเห็นว่าในรูปที่ 2 ซึ่งเรากำหนดไว้ว่าให้ใช้จำนวน
breaks=10 แต่ปรากฎว่ากราฟนั้นมีจำนวนแท่งกราฟมากกว่า 10 แท่งกราฟ ส่วนรูปที่ 3 นั้นเรากำหนด breaks ในรูปของเวคเตอร์ของจุดตัดโดยตรงเพื่อให้ได้กราฟอย่างที่เราต้องการ นอกจากนั้นหากเราต้องการสร้าง histogram ที่ความสูงของแท่งกราฟคือสัดส่วนก็สามารถทำได้โดยใช้ argument probability= โดยที่ default เป็น FALSE คือความสูงของแท่งกราฟจะเป็นความถี่
> par(mfrow=c(1,2))
> hist(waiting)
> hist(waiting,prob=TRUE)
รูปที่ 2.8: Histogram of waiting variable in faithful data set
จะเห็นได้ว่า histograms ที่ได้นั้นมีลักษณะเหมือนกันทุกประการ ยกเว้นแกนตั้งเท่านั้นที่แตกต่างกัน
ตามปกติ แล้ว R จะใช้ช่วงของข้อมูลเป็นแบบ(a, b] หากเราต้องการเปลี่ยนให้เป็นแบบ[a, b] ก็สามารถทำได้โดย
ใช้ argument include.lowest = TRUE
ตัวอย่างที่ 2.6
ตัวอย่างต่อไปนี้เป็นการสร้าง histogram โดยใช้ arguments ต่างๆในคำสั่ง hist( ) เพื่อให้กราฟสมบูรณ์
มากขึ้น
> hist(waiting,breaks="Scott",prob=TRUE,col="blue",
+ main = "My histogram of the waiting variable")
หนึ่งที่สามารถนำมาใช้แทนคำสั่งนี้ไดคือ truehist( ) ซึ่งอยู่ในแพคเกจ MASS
Creating a
frequency polygon
ในบางครั้งนอกจาก histogram แล้วเรายังสามารถสร้างกราฟอีกแบบหนึ่งในการศึกษาถึงลักษณะการแจกแจงของข้อมูลได้ นั่นคือ frequency polygon รูปที่ 2.8 แสดง frequency polygon สำหรับตัวแปร waiting การสร้าง frequency polygon ทำได้โดยใช้วิธีเดียวกับการสร้าง histogram เพียงแต่แทนที่จะแสดงเป็นแท่งกราฟจะใช้การลากเส้นเชื่อมต่อ ระหว่างจุดกึ่งกลางของแต่ละ bin แทน ซึ่งเราเรียกเส้นที่ลากขึ้นนี้ว่า polygon
คำสั่งที่ใช้ในการสร้าง frequency polygon ในรูปที่ 2.9
> bins = seq(42, 109, by = 10)
> freqs = table(cut(waiting, bins))
> y.pts = c(0, freqs, 0)
> x.pts = seq(37, 107, by = 10)
> plot(x.pts,y.pts,type="l") # connect points with lines
> rug(waiting) # show values
ในบางครั้งนอกจาก histogram แล้วเรายังสามารถสร้างกราฟอีกแบบหนึ่งในการศึกษาถึงลักษณะการแจกแจงของข้อมูลได้ นั่นคือ frequency polygon รูปที่ 2.8 แสดง frequency polygon สำหรับตัวแปร waiting การสร้าง frequency polygon ทำได้โดยใช้วิธีเดียวกับการสร้าง histogram เพียงแต่แทนที่จะแสดงเป็นแท่งกราฟจะใช้การลากเส้นเชื่อมต่อ ระหว่างจุดกึ่งกลางของแต่ละ bin แทน ซึ่งเราเรียกเส้นที่ลากขึ้นนี้ว่า polygon
คำสั่งที่ใช้ในการสร้าง frequency polygon ในรูปที่ 2.9
> bins = seq(42, 109, by = 10)
> freqs = table(cut(waiting, bins))
> y.pts = c(0, freqs, 0)
> x.pts = seq(37, 107, by = 10)
> plot(x.pts,y.pts,type="l") # connect points with lines
> rug(waiting) # show values
คำสั่ง plot( ) ใช้เพื่อพลอตจุดลงในกราฟ และ argument type="l" ในฟังก์ชัน plot( ) ใช้เพื่อให้มีการลากเส้นตรง ระหว่างจุดแทนการพลอตจุด
ฟังก์ชัน rug( ) ใช้แสดงจุดข้อมูลโดยใช้ hash marks บนแกนนอน นอกจากนั้นใน ตัวอย่างนี้ยังแสดงการใช้ฟังก์ชัน cut( ) และ table( ) ในการเปลี่ยนข้อมูลแบบต่อเนื่องให้เป็นข้อมูลไม่ต่อเนื่อง
หรือ แม้กระทั่งเปลี่ยนให้เป็นข้อมูลเชิงกลุ่มได้ ผลลัพธ์ที่ได้จากคำสั่ง cut( ) คือ bins ที่ข้อมูลอยู่
โดยที่ bins ถูกกำหนดด้วยเวกเตอร์ของค่าของขอบบน เช่น ถ้าเวกเตอร์คือ
c(1,3,5) bins คือ(1, 3], (3, 5] ค่าซ้ายสุดจะไม่ถูกนำมารวมด้วย Frequency polygon สามารถนำมาใช้ร่วมกับ histogram เพื่อเป็นข้อสังเกตของการแจกแจงความน่าจะเป็นของตัวแปรอย่างไรก็ตามเรานิยมที่จะประมาณ
density โดยตรงมากกว่าเนื่องจากลักษณะของ frequency polygon นั้นขึ้น อยู่กับการกำหนด bins เช่นเดียวกับ histogram
รูปที่ 2.9: Frequency
polygon for waiting variable of the faithful data set
ฟังก์ชัน density() ใช้เพื่อหาการประมาณความหนาแน่น (density estimate) จากข้อมูลที่มีอยู่ในตัวอย่างต่อไปนี้แสดงการสร้าง histogram ร่วมกับ density plot
> attach(faithful)
> hist(waiting, breaks="Scott", prob=TRUE, main ="",ylab="")
> lines(density(waiting))

รูปที่ 2.10: Histogram of waiting with density estimate
จากรูปที่
2.9 จะเห็นได้ว่าเส้นโค้งความหนาแน่นที่ได้นั้นแสดงถึงยอดของกราฟสองยอดอย่างชัดเจน
ซึ่งเส้นโค้ง ความหนาแน่นนี้ถูกวางซ้อนทับลงไปบน histogram ที่มีพื้นที่ใต้กราฟทั้งหมดเท่ากับ 1
(จาก prob = TRUE)
2.3.2 Boxplots
Histogram ที่ประกอบด้วยเส้นโค้งความหนาแน่นเป็นกราฟที่ช่วยในการศึกษาถึงค่ากลาง การกระจาย หางและรูปร่าง ของการแจกแจงของข้อมูลได้เป็นอย่างดี อย่ างไรก็ตาม histogram นั้นไม่ เหมาะที่จะใช้ในการเปรียบเทียบการแจกแจงของข้อมูลหลายชุดพร้อมๆกัน เนื่องจากเราต้องสร้างฮิสโทแกรมของข้อมูลแต่ละชุดไว้บนแกนเดียวกัน ทำให้เกิดการซ้อนทับกันจึงเป็นการยากต่อการดูกราฟ กราฟรูปแบบหนึ่งที่ใช้ได้ดีในการเปรียบเทียบการแจกแจงของข้อมูลหลาย ชุดคือ boxplots ซึ่งกราฟรูปนี้จะแสดงให้เห็นถึงค่ากลาง การกระจาย ความเบ้ และความยาวของหาง ของการแจกแจง ของข้อมูลได้
Boxplot จะแสดงค่าสรุปของชุดข้อมูลทั้งหมด 5 ค่า คือ ค่าต่ำสุด (minimum) ค่า lower quartile ค่า
มัธยาน (median) ค่า upper quartile และค่าสูงสุด (maximum) นอกจากนั้นเรายังสามารถศึกษาถึงการกระจายของข้อมูลได้ โดยดูจากขนาดของ box ซึ่งคือค่าพิสัยควอร์ไทล์ (IQR) นั่นเอง ค่ากลางของข้อมูลคือค่ามัธยฐานซึ่งแสดงโดยเส้นตั้งฉากภายใน box
ตัวอย่างที่ 2.7 All-time gross movie sales:
ตัวอยางนี้เป็นการสร้าง boxplot ของตัวแปร Gross ในชุดข้อมูลชื่อ alltime.movies (UsingR) ซึ่งเป็นข้อมูลเกี่ยวกับยอดขายตั๋วทั้งหมดของภาพยนต์จำนวน 79 เรื่อง ที่ฉายใน U.S.
> attach(alltime.movies)
> boxplot(Gross,ylab="All-time gross sales")
> f=fivenum(Gross)
> text(rep(1.3,5),f,labels=c("minimum", "lower hinge", + "median", "upper hinge","maximum"),cex=0.7)
รูปที่ 2.11: Boxplot of all-time gross movie revenues in United States
จากกราฟรูปที่ 2.3.2 จะเห็นได้ว่ามีค่าสังเกตที่มีค่ามากกว่าค่าส่วนใหญ่อยู่ 5 ค่าสังเกต
หากต้องการทราบว่าค่าสังเกตเหล่านี้คือค่าใดบ้างทำได้ดังนี้ 2.3.2 Boxplots
Histogram ที่ประกอบด้วยเส้นโค้งความหนาแน่นเป็นกราฟที่ช่วยในการศึกษาถึงค่ากลาง การกระจาย หางและรูปร่าง ของการแจกแจงของข้อมูลได้เป็นอย่างดี อย่ างไรก็ตาม histogram นั้นไม่ เหมาะที่จะใช้ในการเปรียบเทียบการแจกแจงของข้อมูลหลายชุดพร้อมๆกัน เนื่องจากเราต้องสร้างฮิสโทแกรมของข้อมูลแต่ละชุดไว้บนแกนเดียวกัน ทำให้เกิดการซ้อนทับกันจึงเป็นการยากต่อการดูกราฟ กราฟรูปแบบหนึ่งที่ใช้ได้ดีในการเปรียบเทียบการแจกแจงของข้อมูลหลาย ชุดคือ boxplots ซึ่งกราฟรูปนี้จะแสดงให้เห็นถึงค่ากลาง การกระจาย ความเบ้ และความยาวของหาง ของการแจกแจง ของข้อมูลได้
Boxplot จะแสดงค่าสรุปของชุดข้อมูลทั้งหมด 5 ค่า คือ ค่าต่ำสุด (minimum) ค่า lower quartile ค่า
มัธยาน (median) ค่า upper quartile และค่าสูงสุด (maximum) นอกจากนั้นเรายังสามารถศึกษาถึงการกระจายของข้อมูลได้ โดยดูจากขนาดของ box ซึ่งคือค่าพิสัยควอร์ไทล์ (IQR) นั่นเอง ค่ากลางของข้อมูลคือค่ามัธยฐานซึ่งแสดงโดยเส้นตั้งฉากภายใน box
ตัวอย่างที่ 2.7 All-time gross movie sales:
ตัวอยางนี้เป็นการสร้าง boxplot ของตัวแปร Gross ในชุดข้อมูลชื่อ alltime.movies (UsingR) ซึ่งเป็นข้อมูลเกี่ยวกับยอดขายตั๋วทั้งหมดของภาพยนต์จำนวน 79 เรื่อง ที่ฉายใน U.S.
> attach(alltime.movies)
> boxplot(Gross,ylab="All-time gross sales")
> f=fivenum(Gross)
> text(rep(1.3,5),f,labels=c("minimum", "lower hinge", + "median", "upper hinge","maximum"),cex=0.7)
รูปที่ 2.11: Boxplot of all-time gross movie revenues in United States
> f=fivenum(Gross)
> the.name = rownames(alltime.movies)
> the.name[Gross > f[4] + 1.5*(f[4] - f[2])]
[1] "Titanic "
[2] "Star Wars "
[3] "E.T. "
[4] "Star Wars: The Phantom Menace "
[5] "Spider-Man "
ไม่มีความคิดเห็น:
แสดงความคิดเห็น