ข้อมูลแบบกรอบข้อมูล(data frame)

ข้อมูลแบบกรอบข้อมูล คือการเก็บข้อมูลแบบเมทริกซ์ที่มีขนาด \(N\times M\) และในเมทริกซ์นี้จะมีข้อมูลแบบใดก็ได้ และมีการบังคับให้ตั้งชื่อแก่สดมภ์ทุกสดมภ์ และข้อมูลในแต่ละสดมภ์ต้องเป็นข้อมูลประเภทเดียวกันเท่านั้น เช่น เช่นข้อมูลของนักเรียนสามคนที่ประกอบด้วยชื่อ Aom Nicha และ Bua อายุ 12 13 และ 12 และเงินไปโรงเรียนต่อวัน 50 45 60 บาทตามลำดับ สามารถสร้างเป็นกรอบข้อมูลได้ดังนี้

student<-data.frame(  name = c("Aom","Nicha","Bua"), # ชื่อ
                       age = c(12, 13 ,12 ), # อายุ
                     money = c(50,45,60)  # เงินไปโรงเรียน
                     ) 
student    
##    name age money
## 1   Aom  12    50
## 2 Nicha  13    45
## 3   Bua  12    60
# str() คือคำสั่งดูข้อมูลภายในกรอบข้อมูลเบื้องต้น
str(student) 
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

ถ้าไม่ตั้งชื่อตัวแปรในหลักสดมภ์ โปรแกรมอาร์จะตั้งชื่อให้อัตโนมัติดังนี้

student<-data.frame(c("Aom","Nicha","Bua"),
                    c(12, 13 ,12 ),
                    c(50,45,60))
str(student)                   
## 'data.frame':    3 obs. of  3 variables:
##  $ c..Aom....Nicha....Bua..: chr  "Aom" "Nicha" "Bua"
##  $ c.12..13..12.           : num  12 13 12
##  $ c.50..45..60.           : num  50 45 60

คำสั่ง str() เป็นการแสดงค่าชนิดของตัวแปรและค่าภายในของแต่ละสดมภ์ของกรอบข้อมูลว่า มีจำนวนตัวแปรเและจำนวนข้อมูลเท่าไหร่ และเป็นข้อมูลชนิดใดบ้าง

ข้อสังเกตุ สำหรับสดมภ์ที่สร้างขึ้นจากเวคเตอร์ของตัวอักษร จะถูกกำหนดให้เป็นเวคเตอร์ของข้อมูลชนิดใหม่ คือข้อมูลแบบ factor ก็คือข้อมูลแบบตัวอักษร ที่สามารถกำหนดให้มีลำดับหรือสามารถเปรียบเทียบกันได้ ซึ่งใช้มากในทางสังคมศาสตร์ ซึ่งจะพูดถึงในภายหลัง ดังนั้นถ้าต้องการให้เวคเตอร์อักษรยังคงเป็นอักษรอยู่สามารถใช้คำสั่งนี้ as.character() ช่วยสำหรับตัวแปรชนิดตัวอักษรบางตัวที่ไม่ต้องการเปลี่ยนให้เป็นตัวแปร factor หรือกำหนดเงื่อนไขใน คำสั่ง data.frame ดังนี้ stringsAsFactors = FALSE จะทำให้ตัวแปรที่เป็นชนิดตัวอักษรทั้งหมด จะไม่ถูกเปลี่ยนไปเป็น factor ก็ได้

student<-data.frame(  name = c("Aom","Nicha","Bua"), # ชื่อ
                       age = c(12, 13 ,12 ), # อายุ
                     money = c(50,45,60)  # เงินไปโรงเรียน
                     ) 
student$name<-as.character(student$name)
str(student)      
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

หรือจะใช้คำสั่ง stringAsFactor = FALSE ตอนสร้างกรอบข้อมูลเลยก็ได้

student<-data.frame(  name = c("Aom","Nicha","Bua"),
                       age = c(12, 13 ,12 ),
                     money = c(50,45,60),
                     stringsAsFactors = FALSE)
str(student)  
## 'data.frame':    3 obs. of  3 variables:
##  $ name : chr  "Aom" "Nicha" "Bua"
##  $ age  : num  12 13 12
##  $ money: num  50 45 60

การเรียกใช้ข้อมูลในกรอบข้อมูล สามารถทำได้เหมือนกับข้อมูลแบบเมทริกซ์ แต่สำหรับการเรียกใช้ค่าตัวแปรในกรอบข้อมูลให้ ใส่เครื่องหมาย $ ต่อจากตัวแปรกรอบข้อมูล แล้วตามชื่อเรียกตัวแปรในสดมภ์ ที่ต้องการ เช่น

# แสดงข้อมูลแถวที่ 1 ทั้งหมด
student [1,]
##   name age money
## 1  Aom  12    50
# แสดงข้อมูลหลักที่ 2 ทั้งหมด
student[,2]
## [1] 12 13 12
# แสดงข้อมูลแถวที่ 1 และ 2 กับหลักที่ 2 และ 3
student[c(1,2),c(2,3)]
##   age money
## 1  12    50
## 2  13    45
# แสดงข้อมูลแถวที่ 3 และ 1
student [c(3,1),]
##   name age money
## 3  Bua  12    60
## 1  Aom  12    50
# แสดงข้อมูลหลักที่ 3 และ 1
student [, c(3,1)]
##   money  name
## 1    50   Aom
## 2    45 Nicha
## 3    60   Bua
# แสดงข้อมูลตัวแปรชื่อ name ทั้งหมด
student$name
## [1] "Aom"   "Nicha" "Bua"
# แสดงข้อมูลตัวแปรชื่อ money ทั้งหมด
student$money
## [1] 50 45 60

ถ้าต้องการใช้ข้อมูลบางตัวในตัวแปรสดมภ์ของกรอบข้อมูลก็ทำได้ดังนี้

student$name[c(1,3)]
## [1] "Aom" "Bua"
student$money[c(2,3)]
## [1] 45 60

ในงานทางด้านสถิตินั้น การเก็บข้อมูลและเรียกใช้งาน ควรใช้ข้อมูลแบบกรอบข้อมูลเพราะจะช่วยให้การทำงานต่างๆ ง่ายขึ้น สำหรับการเพิ่มจำนวนตัวแปร หรือต้องลบข้อมูลบางแถวหรือบางหลักออกก็สามารถทำได้ดังนี้ สมมุติมีข้อมูลเพิ่มว่า นักเรียนแต่คนใช้เงินเท่าไหร่ เช่น 20 30 และ 40 บาทตามลำดับ ถ้าอยากทราบจะเหลือเงินเท่าไหร่ก็สามารถทำได้ โดย ให้ expense แทนตัวแปรรายจ่าย ให้ balance แทนจำนวนเงินคงเหลือ

student$expense <-c(20,30,40)
student$balance <-student$money-student$expense
student
##    name age money expense balance
## 1   Aom  12    50      20      30
## 2 Nicha  13    45      30      15
## 3   Bua  12    60      40      20

ส่วนการลบตัวแปรออกนั้นสามารถทำได้โดยดังนี้ ถ้าต้องการลบตัวแปร balance ออก

student$balance <- NULL
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40

การเพิ่มข้อมูลสามารถทำได้ดังนี้ ถ้ามีข้อมูลชุดใหม่ดังนี้คือ นักเรียนชื่อ Mod อายุ 14 ปี ได้รับเงินมาโรงเรียน 55 บาทแล้วใช้ไป 25 บาท

student[4,] <-c("Mod",14,55,25)
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25

หรืออีกใช้คำสั่ง rbind() ถ้าข้อมูลอีกชุดเป็นดังนี้ นักเรียนชื่อ Keaw อายุ 13 ปี ได้รับเงินมาโรงเรียน 65 บาทแล้วใช้ไป 35 บาท

student <-rbind(student,c("Keaw",13,65,35))
student
##    name age money expense
## 1   Aom  12    50      20
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25
## 5  Keaw  13    65      35

การลบข้อมูลบางแถวก็สามารถทำได้ เช่นถ้าทราบนักเรียนคนแรก ข้อมูลไม่เป็นความจริงและต้องการลบออก ทำได้ดังนี้

student <- student[-c(1),]
student
##    name age money expense
## 2 Nicha  13    45      30
## 3   Bua  12    60      40
## 4   Mod  14    55      25
## 5  Keaw  13    65      35

เป็นคำสั่งลบค่าที่ไม่ต้องการแล้วกำหนดให้กับตัวแปรตัวเดิม

พิจารณาค่าของตัวแปรที่เกิดขึ้น

str(student)
## 'data.frame':    4 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw"
##  $ age    : chr  "13" "12" "14" "13"
##  $ money  : chr  "45" "60" "55" "65"
##  $ expense: chr  "30" "40" "25" "35"

จะเห็นว่าตัวแปร age money และ expense ภายในกรอบข้อมูล student เปลี่ยนตัวอักษรทั้งหมด เพราะ การกำหนดค่าในแถวใหม่ เกิดจากเวคเตอร์ตัวษร เช่น

str(c("Mod",14,55,25))
##  chr [1:4] "Mod" "14" "55" "25"

ดังนี้ ทางแก้ทำได้สองทาง คือ ใช้ สร้างกรอบข้อมูลที่มีตัวแปรจำนวนเท่ากันขึ้นมา หรือ กำหนดค่าขนิดของข้อมูลที่ถูกต้องให้ตัวแปรถายในกรอบข้อมูลอีกครั้ง

student$age<-as.numeric(student$age)
student$money<-as.numeric(student$money)
student$expense<-as.numeric(student$expense)
str(student)
## 'data.frame':    4 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw"
##  $ age    : num  13 12 14 13
##  $ money  : num  45 60 55 65
##  $ expense: num  30 40 25 35

หรือ

new_data<-data.frame(name ="Pang",age=14,money=50,expense=40)
student<-rbind(student,new_data)
str(student)
## 'data.frame':    5 obs. of  4 variables:
##  $ name   : chr  "Nicha" "Bua" "Mod" "Keaw" ...
##  $ age    : num  13 12 14 13 14
##  $ money  : num  45 60 55 65 50
##  $ expense: num  30 40 25 35 40

การอ่านไฟล์นามสกุล .csv

ไฟล์นามสกุลนี้ สามารถอ่านได้ไม่จำเป็นต้องดึงชุดคำสั่งอื่น(package)มาใช้งาน โดยใช้คำสั่ง read.csv สามารถ download mtcars.csv ได้ที่นี่

car <- read.csv(file="/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/mtcars.csv")
str(car)
## 'data.frame':    32 obs. of  12 variables:
##  $ X   : chr  "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : int  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : int  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : int  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : int  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: int  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: int  4 4 1 1 2 1 4 2 2 4 ...

ข้อสังเกตุกรอบข้อมูล mtcars นั้นไม่มีตัวแปร X ปรากฎอยู่เพราะกลายเป็น จริงๆแล้วในภาษาอาร์นอกจะตั้งชื้อตัวแปรให้สดมภ์ได้แล้ว ยังสามารถตั้งชื่อให้แถวแต่ละแถวได้ด้วยโดยใช้คำสั่ง rownames

ถ้าแถวที่ 1 ไม่ได้ตั้งชื่อให้สดมภ์ใด ในสดมภ์นั้นภาษาอาร์จะตั้งชื่อให้อัตโนมัติ ถ้าต้องการตั้งชื่อให้กับตัวแปร X ใหม่เป็น car.model สามารถทำได้ดังนี้

colnames(car)[1]<-"car.model"
str(car)
## 'data.frame':    32 obs. of  12 variables:
##  $ car.model: chr  "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
##  $ mpg      : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl      : int  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp     : num  160 160 108 258 360 ...
##  $ hp       : int  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat     : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt       : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec     : num  16.5 17 18.6 19.4 17 ...
##  $ vs       : int  0 0 1 1 0 1 0 1 1 1 ...
##  $ am       : int  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear     : int  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb     : int  4 4 1 1 2 1 4 2 2 4 ...

ที่สั่งเช่นนี้เนื่องจากตัวแปร X อยู่ในลำดับที่ 1 ในกรณีที่ไม่ต้องการเก็บค่าชื่อในแถวลงไปด้วยก็สามารถทำได้ ด้วยเขียนคำสั่งเพิ่มลงไปดังนี้

write.csv(mtcars,
          file = "/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/mtcars.csv", 
          row.names =FALSE)

โดยจะได้ผลดังนี้

car<- read.csv(file="/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/mtcars.csv")
str(car)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : int  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : int  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : int  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : int  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: int  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: int  4 4 1 1 2 1 4 2 2 4 ...

การเก็บตัวแปรกรอบข้อมูลด้วยไฟล์นามสกุล csv

ที่พูดถึงการเก็บตัวแปรกรอบข้อมูลก่อน การอ่านไฟล์นามสกุล csv ก็เพราะต้องการให้ผู้อ่านไปหาข้อมูลมาเองแล้วสร้างไฟล์ csv ขึ้นมา แต่จะให้ใช้ข้อมูลที่มีอยู่แล้วในภาษาอาร์ก่อนเพื่อความสะดวก ตัวแปรกรอบข้อมูลมีชื่อว่า mtcars โดยมีค่าสังเกตุอยู่ 32 ชุดที่มีจำนวนตัวแปร 11 ตัว

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
write.csv(mtcars,
          file = "/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/mtcars.csv")

write.csv(mtcars , file = “/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/mtcars.csv”)

เป็นคำสั่งสำหรับการ save กรอบข้อมูล ข้อความที่อยู่ในวงเล็บ mtcars คือตัวแปรกรอบข้อมูลที่ต้องการจะเก็บ file = และข้อความที่อยู่ภายในเครื่องหมาย " " คือเส้นทางและ folder และชื่อไฟล์นามสกุล csv ที่ต้องการเก็บนั้นเอง เอง สำหรับที่อยู๋หรือ folder ที่ต้องการเก็บข้อมูลนั้น สามารถใช้โปรแกรม FileZilla ในการช่วยหาเส้นทางได้ที่ต้องการได้ จากตัวอย่าง

ตัวอย่างโปรแกรม FileZilla

คำเตือน สำหรับผู้ใช้ระบบปฏิบัติการ OSX และ LINUX จะไม่มีปัญหาในการ คัดลอกเส้นทางของที่อยู่ของไฟล์ที่ต้องการ แต่สำหรับผู้ใช้งานระบบ WINDOWS จะต้องเปลี่ยนเดรื่องหมาย \(\backslash\) (อ่านว่า backslash) เป็นเครื่องหมาย / (อ่านว่า slash)แทนเช่น ถ้าเส้นทางของไฟล์คือ C:\(\backslash\)download\(\backslash\) จะต้องเปลียนเป็น C:/download/ ถึงจะใช้งานได้

ในกรณีต้องการแค่ตัวแปรบางตัวมาใช้งาน ถ้าขนาดข้อมูลไม่ใหญ่มาก การสร้างตัวแปรใหม่ ก็อาจจะดีกว่าสำหรับมือใหม่ เช่นถ้าต้องการเพียงตัวแปร mpg และ disp และตั้งชื่อกรอบจ้อมูลใหม่ว่า car3 ก็ทำได้โดย

car3 <- mtcars[,c(1,3)]
str(car3)
## 'data.frame':    32 obs. of  2 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ disp: num  160 160 108 258 360 ...

หรือจะใช้จากชื่อก็ได้ สมมุตั้งชื่อใหม่ว่า car4

car4 <-mtcars[,c("mpg","disp")]
str(car4)
## 'data.frame':    32 obs. of  2 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ disp: num  160 160 108 258 360 ...

เมื่อได้มาแล้วก็สามารถใช้สั่งsummary เมื่อหาข้อมูลทางสถิติเบื้องต้น

summary(car4)
##       mpg             disp      
##  Min.   :10.40   Min.   : 71.1  
##  1st Qu.:15.43   1st Qu.:120.8  
##  Median :19.20   Median :196.3  
##  Mean   :20.09   Mean   :230.7  
##  3rd Qu.:22.80   3rd Qu.:326.0  
##  Max.   :33.90   Max.   :472.0

การใช้คำสั่ง sapply() เพื่อช่วยคำนวณค่าทางสถิติของทุกตัวแปรในกรอบข้อมูล

เช่นถ้าต้องการคำนวณความแปรปรวนของทุกตัวแปรในกรอบข้อมูล car4 ทำได้ดังนี้

sapply(car4,var)
##        mpg       disp 
##    36.3241 15360.7998

เทียบกับการคำนวณที่ตัวคือ

var(car4$mpg)
## [1] 36.3241
var(car4$disp)
## [1] 15360.8

ก็จะเห็นได้ว่า ถ้ากรอบข้อมูลมีจำนวนตัวแปรมาก คำสั่ง sapply ก็ช่วยประหยัดเวลาได้

ข้อสังเกตุ การใช้คำสั่ง sapply คำสั่งในการคำนวณค่าทางสถิติอื่นจะไม่ต้องใส่วงเล็บ

แบบฝึกหัด สำหรับการคำนวณค่าส่วนเบียงเบนมาตราฐานคือ sd()

sd(car4$mpg)
## [1] 6.026948

ให้ลองคำนวณค่าส่วนเบี่ยงมาตราฐานด้วยคำสั่ง sapply ของตัวแปรทั้งหมดในกรอบข้อมูล car4

กราฟด้วยอาร์เบื้องต้น

Scatterplot ง่าย

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยๆได้
plot(x=car4$disp,  # ข้อมูลแกน X
     y=car4$mpg,   # ข้อมูลแกน Y
     main="ขนาดความจุกระบอกสูบ vs ระยะที่รถวิ่งได้ต่อน้ำมัน 1 แกลลอน", #ชื่อกราฟ 
   xlab="ความจุกระบอกสูบ(disp) ", # ชื่อตัวแปรแกน X
   ylab="ระยะทางที่รถวิ้งได้(mpg)",  # ชื่อตัวแปรแกน Y
   pch =25) # สามารถเปลี่ยนตั้งแต่เลข 0 ถึง 25 หรืออย่างอื่น ดูที่รูปประกอบ

ถ้าต้องการให้เป็นสีทำได้โดยการเพิ่ม

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยๆได้
plot(x=car4$disp,  # ข้อมูลแกน X
     y=car4$mpg,   # ข้อมูลแกน Y
     main="ขนาดความจุกระบอกสูบ vs ระยะที่รถวิ่งได้ต่อน้ำมัน 1 แกลลอน", #ชื่อกราฟ 
   xlab="ความจุกระบอกสูบ(disp) ", # ชื่อตัวแปรแกน X
   ylab="ระยะทางที่รถวิ้งได้(mpg)",  # ชื่อตัวแปรแกน Y
   pch =16, # สามารถเปลี่ยนตั้งแต่เลข 0 ถึง 25
    col = "tomato3") # เลือก tomato3

ที่มาจาก https://www.statmethods.net

ที่มาจาก https://www.statmethods.net

สำหรับสีต่างๆ นั้นมีให้เลือกใช้ถึง 657 สี ถ้าอยากรู้ว่ามีสีอะไรบ้างให้ใช้ คำสั่ง colors()

Boxplots

กราฟชนิดนี้ แกน X ด้วยควรเป็นตัวแปรข้อชนิด ตัวอักษร หรือจำนวนนับ และแกน Y เป็นจำนวนจริงหรือตัวเลข จะใช้ตัวอย่างจากข้อมูลจาก chickwts

data(chickwts)
str(chickwts)
## 'data.frame':    71 obs. of  2 variables:
##  $ weight: num  179 160 136 227 217 168 108 124 143 140 ...
##  $ feed  : Factor w/ 6 levels "casein","horsebean",..: 2 2 2 2 2 2 2 2 2 2 ...
  • wieght คือน้ำหนักของไก่

  • feed คือชนิดของอาหารที่ไก่ได้กิน

ดังนี้ แกน X คือ feed และแกน Y คือ weight

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
boxplot(weight~feed, #Y~X
        data=chickwts, # ข้อมูลคือ chikwts
        main="อาหารต่างชนิดกับน้ำหนักของไก่",  # ชื่อกราฟ
        xlab="ชนิดของอาหารไก่",  # ชื่อแกน X
        ylab="น้ำหนักไก่")   # ชื่อแกน Y

ถ้าต้องการใช้สี ต้องใช้ถึง 6 สีตังนั้นต้องสร้างเวคเตอร์ของชื่อสี ขึ้นมาก่อนดังนี้

color <-colors()
str(color)
##  chr [1:657] "white" "aliceblue" "antiquewhite" "antiquewhite1" ...

สามารถนำไปใช้ได้ดังนี้

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
boxplot(weight~feed, #Y~X
        data=chickwts, # ข้อมูลคือ chikwts
        main="อาหารต่างชนิดกับน้ำหนักของไก่",  # ชื่อกราฟ
        xlab="ชนิดของอาหารไก่",  # ชื่อแกน X
        ylab="น้ำหนักไก่",  # ชื่อแกน Y
        col =color[c(10,15,18,657,20,100)]) # สามารถใช้ตัวเลขแทนชื่อสีก็ได้มีทั้งหมด

ให้ผู้อ่าน ลองเปลี่ยนตัวเลขของสีดู

bar plot

เป็นกราฟแท่ง แกน X ควรเป็นตัวอักษร หรือจำนวนนับ มีค่าซ้ำกันมากๆ นั่นคือ โดยทั่วไปจะเป็นการแสดงว่า ตัวแปรนั้นมีข้อมูลกี่ตัว แต่ละตัวซ้ำกันจำนวนเท่าไหร่ จากข้อมูล chickwts อาหารไก่ทั้ง 6 ชนิด มีข้อมูลจำนวนไก่ ของอาหารแต่ละชนิดกี่ตัว ถ้าไม่สร้างกราฟให้ใช้คำสั่งนี้

table(chickwts$feed)
## 
##    casein horsebean   linseed  meatmeal   soybean sunflower 
##        12        10        12        11        14        12

ก็จะได้ จำนวนไก่ออกมา ถ้าต้องการสร้าง bar plot หรือกราฟแท่ง ให้ใช้คำสั่ง

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
barplot(table(chickwts$feed), # จำนวนไก่แยกตามชนิดของอาหาร
        main=" จำนวนไก่แยกตามชนิดของอาหาร",  # ชื่อกราฟ
        xlab="ชนิดของอาหารไก่",  # ชื่อแกน X
        ylab="จำนวนไก่")  # ชื่อแกน Y

ถ้าต้องการสีก็ทำเหมือนเดิม

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
barplot(table(chickwts$feed), # จำนวนไก่แยกตามชนิดของอาหาร
        main=" จำนวนไก่แยกตามชนิดของอาหาร",  # ชื่อกราฟ
        xlab="ชนิดของอาหารไก่",  # ชื่อแกน X
        ylab="จำนวนไก่",       # ชื่อแกน Y
col =color[c(100,150,50,657,80,10)]) # สามารถใช้ตัวเลขแทนชื่อสีก็ได้ม        

ถ้าต้องการสลับแกน ก็ทำได้โดย

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
barplot(table(chickwts$feed), # จำนวนไก่แยกตามชนิดของอาหาร
        main=" จำนวนไก่แยกตามชนิดของอาหาร",  # ชื่อกราฟ
        ylab="ชนิดของอาหารไก่",  # ชื่อแกน Y
        xlab="จำนวนไก่",       # ชื่อแกน X
col =color[c(100,150,50,657,80,10)], # สามารถใช้ตัวเลขแทนชื่อสีก็ได้ม        
        horiz=TRUE) # สลับแกน

หมายเหตุ อย่างลืมเปลี่ยนชื่อแกน X และ แกน Y

การวิเคราะห์การถดถอยด้วยอาร์

  • \(Y\) คือตัวแปรตามที่เราสนใจ

  • \(X_1,X_2,\cdots,X_n\) คือตัวแปรตาม หรือต้นเหตุของสิ่งที่เราสนใจ ว่าจะส่งผลต่อตัวแปรตามอย่างไร

โดยทั่วไปเราเขียนอยู่ในสมการเชิงเส้น เรียกว่าสมการถดถอยเชิงเส้น เขียนได้ดังนี้ \[Y=a+b_1X_1+a_2X_2+\cdots+b_nX_n+\varepsilon \] ถ้ามีข้อมูล \((Y,X_1,X_2,\cdots,_Xn)\) อยู่จำนวน \(n\) ชุด ก็จะสามารถประมาณค่าพารามิเตอร์ \(a,b_1,\cdots,b_n\) ด้วยวิธี OLS หรือกำลังสองน้อยที่สุด จากกรอบข้อมูล car4 ที่สร้างไว้ถ้าเราสนใจความสัมพันธ์ดังนี้ \[ \text{mpg }=a+b\times\text{disp}+\varepsilon\] ในอาร์สามารถวิเคราะห์การถดถอยได้ดังนี้

lm(mpg~disp, # mpg=a+b*disp
  data=car4) # ข้อมูลคือ car4
## 
## Call:
## lm(formula = mpg ~ disp, data = car4)
## 
## Coefficients:
## (Intercept)         disp  
##    29.59985     -0.04122

ก็จะได้สมการการถดถอย \[ \text{mpg }= 29.59985-0.04122\text{disp}+\varepsilon\] ถ้าต้องการข้อมูลทางสถิติ อื่นๆ เพิ้มเติมก็ใช้คำสั่ง summary()

summary(lm(mpg~disp,data=car4))
## 
## Call:
## lm(formula = mpg ~ disp, data = car4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8922 -2.2022 -0.9631  1.6272  7.2305 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 29.599855   1.229720  24.070  < 2e-16 ***
## disp        -0.041215   0.004712  -8.747 9.38e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.251 on 30 degrees of freedom
## Multiple R-squared:  0.7183, Adjusted R-squared:  0.709 
## F-statistic: 76.51 on 1 and 30 DF,  p-value: 9.38e-10

ถ้าต้องการค่าพยากรณ์ หรือค่าคลาดเคลื่อนด้วยก็ควรสร้างตัวขึ้นใหม่เพื่อมาเก็บค่าไว้ก่อน ดังนี้ สมมุติตัวแปรชื่อ lm.car4

lm.car4 <-lm(mpg~disp,data=car4)
lm.car4
## 
## Call:
## lm(formula = mpg ~ disp, data = car4)
## 
## Coefficients:
## (Intercept)         disp  
##    29.59985     -0.04122

ถ้าต้องการให้แสดงค่าทางสถิติ

summary(lm.car4)
## 
## Call:
## lm(formula = mpg ~ disp, data = car4)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8922 -2.2022 -0.9631  1.6272  7.2305 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 29.599855   1.229720  24.070  < 2e-16 ***
## disp        -0.041215   0.004712  -8.747 9.38e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.251 on 30 degrees of freedom
## Multiple R-squared:  0.7183, Adjusted R-squared:  0.709 
## F-statistic: 76.51 on 1 and 30 DF,  p-value: 9.38e-10

ถ้าต้องการค่าพยากรณ์ให้ใช้ึคำสั่ง

lm.car4$fitted.values
##           Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive 
##            23.00544            23.00544            25.14862            18.96635 
##   Hornet Sportabout             Valiant          Duster 360           Merc 240D 
##            14.76241            20.32645            14.76241            23.55360 
##            Merc 230            Merc 280           Merc 280C          Merc 450SE 
##            23.79677            22.69220            22.69220            18.23272 
##          Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental 
##            18.23272            18.23272            10.14632            10.64090 
##   Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
##            11.46520            26.35622            26.47987            26.66946 
##       Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28 
##            24.64992            16.49345            17.07046            15.17456 
##    Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa 
##            13.11381            26.34386            24.64168            25.68030 
##      Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E 
##            15.13335            23.62366            17.19410            24.61283

ถ้าต้องการค่าคลาดเคลื่อนก็ให้ใช้คำสั่ง

lm.car4$residuals
##           Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive 
##          -2.0054356          -2.0054356          -2.3486218           2.4336462 
##   Hornet Sportabout             Valiant          Duster 360           Merc 240D 
##           3.9375884          -2.2264528          -0.4624116           0.8464033 
##            Merc 230            Merc 280           Merc 280C          Merc 450SE 
##          -0.9967659          -3.4922007          -4.8922007          -1.8327247 
##          Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental 
##          -0.9327247          -3.0327247           0.2536819          -0.2408996 
##   Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla 
##           3.2347980           6.0437752           3.9201298           7.2305403 
##       Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28 
##          -3.1499188          -0.9934466          -1.8704583          -1.8745628 
##    Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa 
##           6.0861932           0.9561397           1.3583242           4.7197032 
##      Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E 
##           0.6666524          -3.9236624          -2.1941036          -3.2128252

หมายเหตุ ที่ปรากฎชื่อ รถรุ่นหรือยี่ห้อต่างๆ เพราะมีการตั้งชื่อเอาไว้ ตัวอย่างต่อเ้ป็นยอดขาย Album ที่ขึ้นอยู่กับโฆษณา และระยะเวลาการออกอากาศ สามารถ โหลดไฟล์ได้จาก สามารถโหลดไฟล์ที่นี่

Album<- read.csv(file="/Users/somsak_mac2/Documents/thaiXelatex/Statistics with R/Album Sales.csv")
str(Album)
## 'data.frame':    200 obs. of  3 variables:
##  $ adverts: num  10.3 985.7 1445.6 1188.2 574.5 ...
##  $ sales  : int  330 120 360 270 220 170 70 210 200 300 ...
##  $ airplay: int  43 28 35 33 44 19 20 22 21 40 ...
  • adverts คือการโมษณา

  • sales คือยอดขาย

  • airplay คือระยะเวลาการออกอากาศ

ดังน้ั้นถ้าเราสนใจความสัมพันธ์ดังนี้ \[ \text{sales }=a+b_1*\text{adverts}+b_2*\text{airplay}+\varepsilon\] พิจารณาค่า correlation โดย

cor(Album)
##           adverts     sales   airplay
## adverts 1.0000000 0.5784877 0.1018828
## sales   0.5784877 1.0000000 0.5989188
## airplay 0.1018828 0.5989188 1.0000000

สามารถสร้างกราฟ scatter plot ของตัวแปรแต่คู่ทั้งหมดได้โดยใช้คำสั่ง

pairs(Album)

ถ้าต้องการให้เรียงรูปแบบของกราฟ โดยกำหนดตัวแปรเอง ทำได้ดังนี้

pairs(~sales+adverts+airplay,data=Album)

คำถาม ถ้่าต้องการวาดกราฟนี้ โดยไม่ใช้ตัวแปร airplay จะทำอย่างไร?

ถ้าต้องการใช้สี หรือเปลี่ยนรูปทรงของจุดในกราฟ ก็สามารถทำได้เหมือนกับคำสั่ง plot

pairs(~sales+adverts+airplay,data=Album,
      col ="blue",
      pch= 8)

การวิเคราะห์การถดถอยโดยอาร์ คือ

 lm(sales~adverts+airplay, #สมการ (sales =a+b1*adverts+b2*airplay)
    data=Album)            # ข้อมูล Album
## 
## Call:
## lm(formula = sales ~ adverts + airplay, data = Album)
## 
## Coefficients:
## (Intercept)      adverts      airplay  
##    41.12381      0.08689      3.58879

ถ้าต้องการข้อมูลทางสถิติด้วย

 summary( lm(sales~adverts+airplay,data=Album))
## 
## Call:
## lm(formula = sales ~ adverts + airplay, data = Album)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -112.121  -30.027    3.952   32.072  155.498 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 41.123811   9.330952   4.407 1.72e-05 ***
## adverts      0.086887   0.007246  11.991  < 2e-16 ***
## airplay      3.588789   0.286807  12.513  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 49.38 on 197 degrees of freedom
## Multiple R-squared:  0.6293, Adjusted R-squared:  0.6255 
## F-statistic: 167.2 on 2 and 197 DF,  p-value: < 2.2e-16

จากกรอบข้อมูล Album ถ้าเราจัดเรียงต้วแปรในกรอบข้อมูลให้ดี โดยใช้ตัวแปรตัวแรกเป็น ตัวแปรตาม หรือที่เหลือเป็นตัวแปรอิสระ เราจะสามารถ เขียนสมการถดถอยได้ง่ายขึ้น จากกรอบข้อมูล Album ตัวแปรแรก คือ adverts และตามด้วย sales และ airplay ถ้าเราเรียงข้อมูลใหม่ดังนี้

Album <-Album[,c(2,1,3)]
str(Album)
## 'data.frame':    200 obs. of  3 variables:
##  $ sales  : int  330 120 360 270 220 170 70 210 200 300 ...
##  $ adverts: num  10.3 985.7 1445.6 1188.2 574.5 ...
##  $ airplay: int  43 28 35 33 44 19 20 22 21 40 ...

จะเห็นว่า เราเรียงตัวแปรด้วยตัวแปรตาม และตามด้วยตัวแปรต้น ดังนั้น สามารถใช้คำสั่งเพื่อสร้างสมการถดถอยในคำสั่ง lm() ด้วยคำสั่ง

formula(Album)
## sales ~ adverts + airplay

เราสามารถใช้คำสั่ง formula นี้ในคำสั่ง lm ได้เลยดังนี้

lm(formula(Album),data =Album)
## 
## Call:
## lm(formula = formula(Album), data = Album)
## 
## Coefficients:
## (Intercept)      adverts      airplay  
##    41.12381      0.08689      3.58879

ในกรณีที่ตัวแปรเป็นจำนวนมากวิธีจะสะดวกมาก หรือจะใช้อีกคำสั่ง คือ

lm(sales~.,data =Album)
## 
## Call:
## lm(formula = sales ~ ., data = Album)
## 
## Coefficients:
## (Intercept)      adverts      airplay  
##    41.12381      0.08689      3.58879

ก็จะมีค่าเท่ากัน ความของคำสั่งนี้ คือ ตัวแปรตาม คือ sales และเครื่องหมาย . หลังตัว \(\sim\) หมายความว่า ใช้ตัวแปรที่เหลือทุกตัวในกรอบข้อมูล Album

การพยากรณ์ด้วยการถดถอยเดิมถ้ามีข้อมูลเพิ่มเข้ามา

ต้องสร้างกรอบข้อมูล โดยที่ ชื่อตัวแปรภายในกรอบข้อมูลต้องมีเขียนเดียวกับสมการการถดถอย และควรต้องเก็บค่าทั้งหมดที่ได้จากคำสั่ง lm ไว้ในตัวแปรใหม่

New.data <-data.frame(adverts= c(180,230, 250),
                      airplay=c(30,40, 45))

ก็จะพยากรณ์ได้โดยใช้คำสั่งนี้

Sale.fit<- lm(sales~adverts+airplay,data=Album)
predict(Sale.fit,         # ตัวแปรที่เก็บข้อมูลทั้งหมดจากการคำนวณหาสมการการถดถอย
        newdata= New.data)# ข้อมูลชุดใหม่ที่มี เมื่อต้องการพยากรณ์
##        1        2        3 
## 164.4272 204.6594 224.3411

ถ้าต้องการค่าคลาดเคลื่อนมาพิจารณาว่ามีการแจกแจงแบบปกติหรือโดยใช้ QQ plot ก็ควรต้องสร้างตัวแปร สมมุติให้ชื่อ lm.Album

lm.Album<- lm(sales~adverts+airplay, #สมการ (sales =a+b1*adverts+b2*airplay)
    data=Album)            # ข้อมูล Album

การพิจาณา QQ plot ของค่า error ทำได้โดยใช้คำสั่ง

par(family = "TH Sarabun New") # เลือกใช้ font เพื่อแสดงภาษาไทยได้
qqnorm(lm.Album$residuals, pch = 1)
qqline(lm.Album$residuals, col = "steelblue", lwd = 2,
               main="QQ plot ของค่าคลาดเคลื่อน")  # ชื่อกราฟ

## บทอื่นๆ