วันพฤหัสบดีที่ 20 กุมภาพันธ์ พ.ศ. 2563

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

บทที่ 3


ข้อมูล 2 ตัวแปร (Bivariate Data)

            ในบทนี้เราจะพิจารณาถึงข้อมูลที่ประกอบด้วยตัวแปร 2 ตัว (bivariate data) ซึ่งในกรณีนี้นอกจากที่เราสามารถหาข้อสรุปเกี่ยวกับข้อมูลโดยใช้ค่ากลาง ค่าวัดการกระจาย และลักษณะการแจกแจงของข้อมูล ดังที่เราทำในบทที่ 2 เกี่ยวกับข้อมูลที่ประกอบด้วยตัวแปรเดียวแล้ว สำหรับกรณีที่ข้อมูลของเราประกอบด้วยตัวแปรสองตัว เรายังสามารถ ศึกษาถึงความสัมพันธ์ระหว่างตัวแปรสองตัวนี้ได้ด้วย

3.1 ตัวแปรเชิงกลุ่มสองตัวแปร (Bivariate Categorical Variables)
            โดยปกติเรามักจะนำเสนอข้อมูลเชิงกลุ่ม 2 ตัวแปร ในรูปของตารางสองทาง (two-way contingency table) ซึ่งเป็นตาราง ที่แสดงการแจกแจงความถี่ตามการรวมกันของแต่ละระดับของตัวแปรทั้งสอง ซึ่งตารางรูปแบบนี้จะทำให้เราสามารถศึกษาถึงความสัมพันธ์ระหว่างตัวแปรทั้งสองได้โดยการเปรียบเทียบแถวหรือหลักของตาราง นอกจากนั้นเรายังสามารถทดสอบได้ว่าการแจกแจงของตัวแปรตัวหนึ่งขึ้นอยู่กับการแจกแจงของอีกตัวแปรหนึ่งหรือไม่  ข้อมูลที่ประกอบด้วยตัวแปรเชิงกลุ่ม 2 ตัวแปรนี้ อาจอยู่ในรูปที่สรุปแล้ว (เป็ นตาราง 2 ทาง) หรืออยู่ในรูปของข้อมูลดิบที่ยังไม่มีการสรุปซึ่งลักษณะการป้อนข้อมูลสองรูปแบบนี้จะแตกต่างกัน
            3.1.1 การสร้างตารางสองทางจากข้อมูลที่สรุปแล้ว
           
(Making Two-way Tables From Summarized Data)
           
าข้อมูลที่เรามีอยู่นั้นอยู่ในรูปของตาราง และเราต้องการวิเคราะห์ข้อมูลนี้ด้วย R เราสามารถป้อนข้อมูลโดยใช้คำสั่ง c( ) และวิธีที่ง่ายที่สุดในการสร้างตารางคือการรวมเวกเตอร์ข้อมูลเข้าด้วยกัน โดยอาจรวมตามแนวแถวโดยใช้ฟังก์ชัน rbind( ) หรือรวมตามแนวตั้งหรือคอลัมน์โดยใช้ฟังก์ชัน cbind( ) ก็ได้  ตัวอย่างต่อไปนี้เป็น การแสดงวิธีการป้อนข้อมูลที่ได้รับการสรุปเป็นตารางมาแล้ว โดยข้อมูลได้มาจากการสำรวจ การใช้เข็มขัดนิรภัยในแคลิฟอร์เนีย อเมริกา โดยต้องการศึกษาถึงความสัมพันธ์ระหว่างการใช้เข็มขัดนิรภัยของบิดา-มารดา และ การใช้เข็มขัดนิรภัยของบุตร ข้อมูลที่ได้ตามตารางที่ 3.1

ตารางที่ 3.1การใช้เข็มขัดนิรภัยในแคลิฟอร์เนีย



เราสามารถป้อนข้อมูลลักษณะนี้ได้ในหลายแบบ ดังนี้
> rbind(c(56,8), c(2,16))                                     #combine rows
            
[,1]    [,2]
[1,]       56      8
[2,]       2      16
> cbind(c(56,2), c(8,16))                                     # bind as columns
             [,1]   [,2]
[1,]       56      8
[2,]        2      16
           
การรวมเวกเตอร์ข้อมูลตามแนวแถวหรือหลักนั้นเป็นการสร้างเมตริกซ์นั่นเอง อย่างไรก็ตามเราสามารถ
สร้างเมตริกซ์ข้อมูลได้โดยตรงโดยใช้ฟังก์ชัน
matrix( ) ในการป้อนข้อมูลเราต้องกำหนดขนาดของเมตริกซ์ที่ถูกต้องก่อนดังนี้
> x = matrix(c(56,2,8,16), nrow=2)
> x
             
[,1]  [,2]
[1,]       56    8
[2,]       2     16
            การให้ชื่อกับเมตริกซ์นั้นอาจไม่จำเป็น แต่ถ้าหากกำหนดชื่อให้กับแถวและคอลัมน์จะทำให้เมตริกซ์ดูสวยงามขึ้น ซึ่งฟังก์ชันที่ใช้ในการกำหนดชื่อแถวและชื่อหลักของเมตริกซ์คือ
rownames( ) และ colnames( )
> rownames(x) = c("buckled", "unbuckled")
> colnames(x) = c("buckled", "unbuckled")
 > x
                        
buckled  unbuckled
buckled             56           8
unbuckled          2            16
            นอกจากนั้นเรายังสามารถใช้ฟังก์ชัน
dimnames( ) ในการกำหนดชื่อแถวและคอลัมน์ในคราวเดียวกัน และยังสามารถกำหนดชื่อของตัวแปรได้ด้วย
> tmp = c("unbuckled", "buckled")                       # less typing
> dimnames(x) = list(parent=tmp,child=tmp)         # uses a named list
> x
                                 
child              
 
parent              unbuckled   buckled
unbuckled          56                8
buckled              2                 16 

            3.1.2 Making Two-Way Tables From Unsummarized Data
            ถ้าข้อมูลที่มีอยู่เป็นข้อมูลดิบที่ยังไม่ได้มีการสรุปเราสามารถสร้างตารางสองทางได้ด้วยฟังก์ชัน table( )
ถ้าเวกเตอร์ข้อมูล 2 เวกเตอร์คือ x และ y แล้ว table(x,y) จะสร้างตารางสองทาง
ตัวอย่างที่
3.1
ในการสำรวจเกี่ยวกับความสัมพันธ์รหว่างการสูบบุหรี่ และการเข้าเรียนของนิสิต ได้ขอ้มูลดังตาราง ที่ 3.1.2      
  ตารางที่ 3.2: ข้อมูลที่ได้จากการสำรวจเกี่ยวกับการสูบบุหรี่และการเข้าเรียนของนิสิต
              
   เราจะป้อนข้อมูลเหล่านี้โดยสร้างเวคเตอร์ข้อมูลสองเวคเตอร์ และใช้คำสั่ง table( ) ในการสร้างตารางสองทาง ดังนี้
> smokes = c("Y", "N", "N", "Y", "N", "Y", "Y", "Y", "N", "Y")
> amount = c(1,2,2,3,3,1,2,1,3,2)
> table(smokes, amount)

              
amount
smokes 1   2   3
       
N   0  2   2
       
Y   3  2   1

ตัวอย่างที่ 3.2 จากความเชื่อที่ว่านักเรียนที่ได้ A ในวิชาหนึ่ง มักจะได้ A ในอีกวิชาหนึ่งด้วย เพื่อทดสอบความเชื่อนี้ พิจารณาชุดข้อมูล grades (UsingR) ซึ่งประกอบด้วยเกรดของนักเรียนในวิชาคณิตศาสตร์ และเกรดของนักเรียนเหล่านี้ในวิชาคณิตศาสตร์ที่เรียนก่อนหน้านี้
> library(UsingR)
> grades                                                            #raw data
             
prev     grade
1          B+        B+
2          A-         A-
3          B+        A-
...
122       B          B
> attach(grades)
> table(prev,grade)

         

นอกจากการสร้างตารางการแจกแจงความถี่ ของตัวแปรเชิงกลุ่มสองตัวแปรในลักษณะที่ กล่าวมาแล้ว เรายังสามารถ หาค่าผลรวมของความถี่ตามแนวแถวและแนวหลัก และสัดส่วนของข้อมูลได้โดยใช้ฟังก์ชัน
margin.table( ) และ prop.table( ) เมื่อ argument 1 ใช้สำหรับการหาผลรวมตามแนวแถว และ 2 ใช้สำหรับหาผลรวมตามแนวหลัก  จากตัวอย่างการสูบบุหรี่เราสามารถหาสัดส่วนตามแนวแถวและแนวหลักได้ดังนี้
> tmp = table(smokes, amount)
> prop.table(tmp,1)                                             # calculate row proportion
              
amount
smokes             1                 2                 3
            N          0.0000000  0.5000000  0.5000000
            Y          0.5000000  0.3333333  0.1666667
> prop.table(tmp,2)                                             # calculate column proportion
             amount
smokes              1                2                  3
            N          0.0000000   0.5000000    0.6666667
            Y          1.0000000   0.5000000    0.3333333
> prop.table(tmp)                                               # all the numbers sum to 1
 

            amount
smokes 1       2       3
    N      0.0     0.2   0.2
    Y      0.3     0.2    0.1
           
สำหรับข้อมูลการใช้เข็มขัดนิรภัยเราสามารถหาผลรวมตามแนวแถวและหลักได้ดังนี้
> x
                   
child
parent      unbuckled buckled
unbuckled          56         8
buckled             2          16
> margin.table(x,1)                                             # row sum is for parents
parent
unbuckled      buckled  
            64         18
> margin.table(x,2)                                             # column sum for kids
child
unbuckled     buckled
            58         24
           
นอกจากนั้นเรายังสามารถแสดงค่าผลรวมตามแนวแถวและหลักลงในตารางสองทางได้โดยใช้ฟังก์ชัน
addmargins( ) ดังนี้
> addmargins(x)
                
child
parent   unbuckled  buckled  Sum
unbuckled          56       8       64
buckled             2         16     18
Sum                  58       24      82
            พิจารณาการแจกแจงของแต่ละตัวแปรของชุดข้อมูล
grade ดังนี้
> margin.table(table(prev,grade),1)                      # previous
prev

A   A- B+ B  B- C+ C   D   F
28  5   9   15  4   3   27   9   22

> margin.table(table(prev,grade),2)                      # current
grade
 
A   A- B+ B   B-  C+ C   D   F
21   9   5   14   7    5   20  19  22 

            3.1.3 การสร้างกราฟสำหรับข้อมูลในตารางสองทาง
           
(Graphical Summaries of Two-Way Contingency Tables)
            นอกจากที่เราสามารถแสดงการสรุปข้อมูลในรูปของตารางสองทางแล้ว เรายังสามารถนำข้อมูลในตารางสองทางนั้นมาสร้าง
Barplot เพื่อให้เห็นถึงลักษณะของข้อมูลได้อย่างชัดเจนมากขึ้นการสร้าง barplot ทำได้โดยเลือกตัวแปรตัวหนึ่งเพื่อเป็นตัวแปรแบ่งกลุ่มสำหรับ barplot แล้วให้แท่งกราฟแสดงแต่ละระดับของกลุ่มเป็นส่วนๆเพื่อแสดงให้เห็นถึง สัดส่วนของอีกตัวแปรหนึ่ง หรือใช้แท่งกราฟแยกแต่ละแท่งเปรียบเทียบกันจากข้อมูลเกี่ยวกับการสูบบุหรี่ เราสามารถสร้าง barplot แสดงจำนวนข้อมูลสำหรับ "N" และ "Y" หรือ
> par(mfrow = c(1,4), cex = 0.6)
> barplot(table(smokes,amount))
> barplot(table(amount,smokes))
                          # for names
> smokes = factor(smokes)
> barplot(table(smokes,amount), beside = TRUE, legend.text = TRUE)

> barplot(table(amount,smokes), beside = TRUE, legend.text = c("<5","5-10",">10"))
ได้ผลดังรูปที่
3.1
จากข้อมูลเกี่ยวกับ
seatbelt เราสามารถสร้าง barplot ได้ดังนี้
> par(mfrow = c(1,2), cex = 0.6)
> barplot(x, xlab="Parent", main = "Child seat-belt usage")
> barplot(x, xlab="Parent", main = "Child seat-belt usage", beside = TRUE)
ได้กราฟดังรูปที่
3.2
ในบางครั้งความสัมพันธ์ลักษณะนี้ควรแสดงในรูปของสัดส่วนมากกว่าการใช้จำนวนนับ โดยใช้ฟังก์ชัน
prop.table() ก่อนสร้าง barplot                           

                                                 รูปที่ 3.1: Barplots for smoke data
                               

                                                 รูปที่ 3.2: Segments and side-by-side barplot
                                         
                                                   รูปที่ 3.4: Densityplots of placebo and ephedra group

3.3 ข้อมูลที่มีสองตัวแปรเป็นตัวแปรเชิงปริมาณทั้งคู
     
(Bivariate Data: Numerical vs. Numerical)
            ในการเปรียบเทียบตัวแปรเชองปริมาณสองตัวแปรสามารถทำได้ด้วยวิธีต่างๆ หากคิดว่าตัวแปรสองตัวแปรเป็นอิสระกัน เราอาจทำการเปรียบเทียบการแจกแจงของตัวแปรทั้งสองนี้ หากคิดว่าตัวแปรทั้งสองตัวนี้มี ความสัมพันธกันเราจะใช้กราฟการกระจายในการศึกษาความสัมพันธ์ของตัวแปรทั้งสองนี้
           
3.3.1 เปรียบเทียบการแจกแจงของตัวแปรด้วยกราฟ
            หากเราต้องการเปรียบเทียบการแจกแจงของสองตัวแปรนั้นสามารถทำได้โดยการใช้
side-by-side boxplots อย่ างไรก็ตาม เราสามารถใช้กราฟแบบอื่นๆในการพิจารณาการเปรียบเทียบการแจกแจงของสองตัวแปรได้ เช่น  Side by side boxplots with rug การใช้ rug จะทำให้เราสามารถเห็นข้อมูลทั้งหมดได้ ซึ่งจะใช้ได้ดีกับข้อมูลที่มีขนาดเล็ก หากข้อมุลมีขนาดใหญ่ควรใช้คำสั่ง jitter แทน
ตัวอย่างที่ 3.3ข้อมูลชุด homedata (UsingR) ประกอบด้วยตัวแปรเชิงปริมาณสองตัวแปร คือมูลค่าของบ้านจำนวน  150 หลัง ใน Maplewood ในปี  1970 และ ปี 2000 ที่สุ่มมาจากบ้านทั้งหมดในเขตนั้น
> par(mfrow=c(1,2))
> boxplot(y1970,y2000, names = c("1970", "2000"))
> boxplot(scale(y1970),scale(y2000),
+ names = c("1970", "2000"))                                #make boxplot after scaling each
ได้กราฟดังรูปที่
3.5
            3.3.2 การใช้ scatterplots เพื่อศึกษาความสัมพันธ
Scatterplot เป็นกราฟที่มีประโยชน์มากในการศึกษาความสัมพันธ์ระหว่างตัวแปรเชิงปริมาณสองตัว ใน R เราสามารถ  ใช้ฟังก์ชัน plot() ในการสร้าง scatterplot  
> attach(homedata)
> plot(y1970, y2000)
ได้กราฟดังรูป
3.6


                 รูปที่ 3.5 : Boxplots for Homedata                                 
                 รูปที่ 3.6: Scatterplot for home data    




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

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