ข้อมูลแบบกรอบข้อมูล คือการเก็บข้อมูลแบบเมทริกซ์ที่มีขนาด \(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
ไฟล์นามสกุลนี้ สามารถอ่านได้ไม่จำเป็นต้องดึงชุดคำสั่งอื่น(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 ขึ้นมา แต่จะให้ใช้ข้อมูลที่มีอยู่แล้วในภาษาอาร์ก่อนเพื่อความสะดวก ตัวแปรกรอบข้อมูลมีชื่อว่า 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
เช่นถ้าต้องการคำนวณความแปรปรวนของทุกตัวแปรในกรอบข้อมูล 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
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()
กราฟชนิดนี้ แกน 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)]) # สามารถใช้ตัวเลขแทนชื่อสีก็ได้มีทั้งหมด
ให้ผู้อ่าน ลองเปลี่ยนตัวเลขของสีดู
เป็นกราฟแท่ง แกน 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 ของค่าคลาดเคลื่อน") # ชื่อกราฟ
## บทอื่นๆ