วันอังคารที่ 18 กุมภาพันธ์ พ.ศ. 2563

โปรแกรม R บทที่ 2

บทที่ 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) จะกล่าวถึงในบทต่อๆ ไป

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
            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
           
        ตัวอย่างที่ 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")
  
                                                                    รูปที่ 2.3 Pie chart of  beer
             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

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
            2.2.2 Dot Plots
           
นอกจาก 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
            คำสั่ง mean( ) จะคำนวณค่าเฉลี่ยของตัวอย่างสำหรับ data vector เราสามารถเพิ่ม arguments ลงไปในคำสั่งนี้ได้ เช่น
trim = ซึ่งเป็นการกำหนดให้คำนวณ  trimed mean และ na.rm = เพื่อกำจัด missing data ออกจากชุดข้อมูล
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
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
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
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
            จะเห็นได้ว่าค่าเบี่ยงเบนมาตรฐานมีค่ามากกว่าค่าพิสัยควอร์ไทล์มาก เนื่องจากค่าที่มากที่สุดของข้อมูลมี
ค่ามากกว่าค่าของข้อมูลอื่นๆมากทำให้ข้อมูลมีการแจกแจงแบบเบ้
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

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
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
คำสั่ง 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

Estimating the density
           
ฟังก์ชัน 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 ค่าสังเกต หากต้องการทราบว่าค่าสังเกตเหล่านี้คือค่าใดบ้างทำได้ดังนี้
> 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                                     "



ไม่มีความคิดเห็น:

แสดงความคิดเห็น