thaiall logomy background ภาษา R เพื่อใช้ในการวิเคราะห์ข้อมูลทางสถิติ
my town
web2

ภาษา R

ภาษาอาร์ (R Language) คือ ภาษาโปรแกรมที่ถูกออกแบบมา เพื่อใช้ในการวิเคราะห์ข้อมูลทางสถิติ และนำเสนอข้อมูลเป็นกราฟได้ รวมทั้งสามารถนำมาวิเคราะห์ข้อมูลขนาดใหญ่ หรืองานที่ซับซ้อนได้ มี Application ที่เปิดให้นำมาใช้งานได้ รองรับการประมวลผลแบบ GUI
SPSS | SPSS16 | Taro Yamane | T-Test | Chi-Square | Correlation | Onewayanova | Regression | วิจัยคืออะไร | Peer Review | TCI-1140 | TCI-1243 | R
R คือ ภาษาหนึ่งที่ทำงานบนโปรแกรม R
R เป็นภาษาโปรแกรม เพื่อใช้ในการวิเคราะห์ข้อมูลทางสถิติ และนำเสนอข้อมูลเป็นกราฟได้ รวมทั้งสามารถนำมาวิเคราะห์ข้อมูลขนาดใหญ่ (Big data) หรืองานที่ซับซ้อนได้ เช่น แผนที่ทางภูมิศาสตร์ที่สำคัญ ซึ่งภาษา R ถูกใช้บนโปรแกรม R ที่ใช้งานได้ฟรี ไม่มีค่าใช้จ่าย จึงเป็นโปรแกรมที่ได้รับความนิยมในวงวิชาการ
R เป็นโปรแกรมประเภท Open source ทำให้มีการร่วมพัฒนาต่อยอดให้มีความสามารถที่หลากหลายอย่างต่อเนื่อง ใช้ได้ทั้งบนระบบปฏิบัติการ Windows , Mac OS และ Linux โดยการทำงานของ R เป็นที่นิยม เนื่องจากมี built-in function ทางด้านสถิติจำนวนมาก รวมถึงมีสถิติที่ใช้ในการวิเคราะห์ข้อมูลขนาดใหญ่ และสามารถแสดงผลการทำงานในรูปแบบกราฟได้ง่าย ซึ่งปัจจุบันโปรแกรม R มี package กว่า 10,000 package จึงทำให้โปรแกรม R ได้รับความนิยม
ดาวน์โหลด R-4.3.3 for Windows : 78.8 MB
ตัวอย่างแฟ้ม เพื่อฝึกวิเคราะห์ข้อมูลสุขภาพ ตามคู่มือฯ สสส.
psncd.csv
person_35_random.csv
ncdscreen_35_random.csv
blevel.csv
psncd person_35_random ncdscreen_35_random blevel
พบว่ามี การวิเคราะห์ข้อมูลสุขภาพ
ใน ระบบสาธารณสุขไทย
ที่ใช้โปรแกรม R
[1]p.24
R คือ ภาษาโปรแกรม นังสือ The data series - evolution of the programming language นำเสนอแผนภาพ เรื่อง Top Programming Language และ Most in-demand languages ในหน้าที่ 12 เขียนโดย Louise Maynard-Atem ซึ่งพบว่าภาษา R เป็นภาษาโปรแกรมอีกภาษาหนึ่งที่ได้รับความนิยมในการจัดการข้อมูล และเว็บไซต์ computerhope.com ได้ให้นิยามไว้ว่า "R is an interpreted language, and its principle user interface is a command line. Native data structures of R include vectors, scalars, matrices, lists, and data frames, which are similar to a table in a relational database. R performs matrix arithmetic with a speed comparable to MATLAB. R supports generic functions, which means a function performs the same general procedure, using different code depending on the data type."
https://doi.org/10.1080/2058802X.2018.1526443
/r-stats-mean-median-mode/cheatsheet
data types in R language
list in R language
Anova in R language
# C:\Program Files\R\R-4.3.3\bin
โครงสร้างข้อมูล 4 แบบ ตามหน้า 32 หนังสือ ม.สงขลา ามหนังสือ การวิเคราะห์ข้อมูลสุขภาพในระบบสาธารณสุขไทยโดยใช้โปรแกรมอาร์ พบว่า หน้า 32 อธิบายโครงสร้างข้อมูล ไว้ 4 แบบ คือ เวกเตอร์ เมทริกซ์ อาร์เรย์ และ กรอบข้อมูล ซึ่งตัวอย่างข้างล่างนี้ แสดงการจัดการข้อมูลตามโครงสร้างข้อมูลในหนังสือ แต่เลือกใช้งานบนเว็บไซต์ที่ให้บริการจำลองตัวแปลภาษาที่ programiz.com ซึ่งสะดวกสำหรับผู้ต้องการทดสอบสั่งงานด้วยภาษาอาร์ และยังไม่ได้ติดตั้งตัวแปลภาษาบนเครื่องของตน
blog
tiktok
# programiz.com
msg <-"hello world"
print(msg)
age <- c(10,20,30,40,50)
print(age)
sx <- c("m","m","f","m","f")
print(sx)
person <- cbind(age,sx)
print(person)
print(person[1,2]) # sx m
print(person[1,1]) # age 10
print(person[2,1]) # age 20
print(person[3,2]) # sx f
dat <- data.frame(person)
print(dat)
print(dat$sx)
summary(dat)

# Output
[1] "hello world"
[1] 10 20 30 40 50
[1] "m" "m" "f" "m" "f"
     age  sx 
[1,] "10" "m"
[2,] "20" "m"
[3,] "30" "f"
[4,] "40" "m"
[5,] "50" "f"
 sx 
"m" 
 age 
"10" 
 age 
"20" 
 sx 
"f" 
  age sx
1  10  m
2  20  m
3  30  f
4  40  m
5  50  f
[1] "m" "m" "f" "m" "f"
     age                 sx           
 Length:5           Length:5          
 Class :character   Class :character  
 Mode  :character   Mode  :character
 
อ่านแฟ้ม sam400.dat ข้อมูลตัวอย่าง 400 รายการใน 36 คอลัม สร้างขึ้นด้วยการกรอกข้อมูลบน excel แล้ว copy & paste ไปวางใน spss เพื่อประมวลผล แล้วนำไปวางใน notepad แล้วบันทึกเป็น sam400.dat เพื่อใช้งานใน R Language เมื่อใช้คำสั่ง read.table นำเข้าใน R Gui พบว่า ข้อมูลจะอยู่ในรูปของ list การเรียกใช้แต่ละ column ต้องใช้การอ้างอิง เช่น t.test(t1[[8]],t1[[7]]) ซึ่งเป็นคะแนนก่อนเรียน และคะแนนหลังเรียน ชื่อตาราง[[ชื่อคอลัม]] หากส่งให้ T-Test สามารถใช้คำสั่ง เช่น
> t1 <- read.table("d:/sam400.dat",header=TRUE,sep="\t",fill=TRUE,blank.lines.skip=TRUE)
> summary(t1)
       id          VAR00001           VAR00002           VAR00003        
 Min.   :  1.0   Length:400         Length:400         Length:400        
 1st Qu.:100.8   Class :character   Class :character   Class :character  
 Median :200.5   Mode  :character   Mode  :character   Mode  :character  
 Mean   :200.5                                                           
 3rd Qu.:300.2                                                           
 Max.   :400.0                                                           
   VAR00004           VAR00005            VAR00006       VAR00007    
 Length:400         Length:400         Min.   :3.00   Min.   : 6.00  
 Class :character   Class :character   1st Qu.:4.00   1st Qu.: 8.00  
 Mode  :character   Mode  :character   Median :6.00   Median : 9.00  
                                       Mean   :6.09   Mean   : 8.56  
                                       3rd Qu.:8.00   3rd Qu.: 9.00  
                                       Max.   :9.00   Max.   :10.00  
> print(t1) 
> t1["VAR00001"]
    VAR00001
1          m
2          m
> summary(t1["VAR00005"])
   VAR00005        
 Length:400        
 Class :character  
 Mode  :character  
> summary(t1["VAR00006"])
    VAR00006   
 Min.   :3.00  
 1st Qu.:4.00  
 Median :6.00  
 Mean   :6.09  
 3rd Qu.:8.00  
 Max.   :9.00  
> typeof(t1["VAR00006"])
[1] "list"
> t1["VAR00006"]
    VAR00006
1          3
2          4
> print(t1[2])
    VAR00001
1          m
2          m
> print(t1[[2]])
  [1] "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m"
 [25] "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m" "m"
> print(t1[[2]][201])
[1] "m"
> print(t1[[2]][202])
[1] "f"
> print(t1[[7]][0])
integer(0)
> print(t1[[7]][1])
[1] 3
> typeof(t1[[7]][1])
[1] "integer"
> typeof(t1[[7]])
[1] "integer"
> is.numeric(t1[[7]])
[1] TRUE
> mean(t1[[7]])
[1] 6.09
> median(t1[[7]])
[1] 6
> summary(t1[[7]])
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   3.00    4.00    6.00    6.09    8.00    9.00 
> t.test(t1[[8]],t1[[7]])

        Welch Two Sample t-test

data:  t1[[8]] and t1[[7]]
t = 22.236, df = 662.1, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 2.251886 2.688114
sample estimates:
mean of x mean of y 
     8.56      6.09 

> t.test(t1[[8]],t1[[7]],paired = T)

        Paired t-test

data:  t1[[8]] and t1[[7]]
t = 28.513, df = 399, p-value < 2.2e-16
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 2.2997 2.6403
sample estimates:
mean difference 
           2.47 
> tb <- table(t1[[2]])
> print(tb)
  f   m 
199 201 
> tb <- table(t1[[9]])
> print(tb)
  0   1 
  8 392 
> tb <- table(t1[[13]])
> print(tb)
  1   2   3   4   5 
  8   1   1   1 389 
> one.way <- aov(t1[[1]] ~ t1[[36]],data = t1)
> summary(one.way)
             Df  Sum Sq Mean Sq F value Pr(>F)
t1[[36]]      1     767     767   0.057  0.811
Residuals   398 5332533   13398               
> one.way <- aov(t1[[34]] ~ t1[[36]],data = t1)
> summary(one.way)
             Df Sum Sq Mean Sq F value  Pr(>F)   
t1[[36]]      1    9.5   9.473   7.963 0.00501 **
Residuals   398  473.5   1.190                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> one.way <- aov(t1[[35]] ~ t1[[36]],data = t1)
> summary(one.way)
             Df Sum Sq Mean Sq F value  Pr(>F)   
t1[[36]]      1   22.6  22.585   9.623 0.00206 **
Residuals   398  934.1   2.347                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
>   
การพล็อตกราฟ อ่านหนังสือ ของ ผศ.วราฤทธิ์ [3]p.19 พบตัวอย่างฟังก์ชัน plot graph และตัวอย่างผลลัพธ์ เช่น t<-c(30,20,25,15,20); plot(t,type="h") หมายถึง พบว่า เป็นภาษาที่สร้างกราฟได้ง่าย ด้วยฟังก์ชันเพียงบรรทัดเดียว หากสั่งสร้างหลาย graph ด้วยฟังก์ชัน plot() ใน R Console แบบเรียงต่อกัน พบว่า มีหน้าต่าง R Graphic ปรากฎเพียงหน้าต่างเดียว แม้จะสั่ง plot หลายครั้ง ผลลัพธ์จะแสดงทับหน้าต่างเดิม ส่วนหน้า R Editor มีหลายหน้าต่างได้ เมื่อสั่งประมวลผล (Ctrl-R = Run line or selection) ก็จะส่งฟังก์ชันไปหน้า R Console ที่เป็นหน้าหลัก แล้วประมวลผลตามฟังก์ชันที่ถูกเลือก
ทดสอบ เพศกับอายุ / ก่อนกับหลัง ด้วย T-Test หรือ Z-Test
บตัวอย่างเรื่องค่าเฉลี่ยเพศกับอายุ จากเอกสารของ ดร.วนิดา [4]p.41 เช่น "คนไทยผู้ชายและผู้หญิงมีอายุขัยโดยเฉลี่ยแตกต่างกันหรือไม่" เพราะถ้าพบว่าต่าง ก็แสดงว่า เพศสัมพันธ์กับการมีอายุยืน หรือ "ผู้ชายไทยมีรายได้เฉลี่ยต่อปีมากกว่าผู้หญิงหรือไม่" ซึ่งข้อมูลที่จะนำมาทดสอบทางสถิติ จำแนกลักษณะได้ 2 ประเภท
1. ตัวอย่างสองกลุ่มที่สุ่มมาเป็นอิสระกัน (Independent samples)
เช่น อายุกับเพศเป็นอิสระกัน
ค่าสถิติสำหรับประชากร 2 กลุ่ม เมื่อกลุ่มตัวอย่างเป็นอิสระต่อกัน
- แบบนี้จะใช้ z-test ถ้ากลุ่มตัวอย่างขนาดใหญ่หรือมากกว่า 30 และทราบค่าเบี่ยงเบนมาตรฐานทั้ง 2 กลุ่ม
- แบบนี้จะใช้ t-test ถ้ากลุ่มตัวอย่างขนาดเล็กน้อยกว่าหรือเท่ากับ 30 และแจกแจงปกติ
ซึ่งการใช้ t-test ก็ยังแบ่งเป็น 2 กรณี คือ ค่าเบี่ยงเบนมาตรฐาน เท่ากัน และไม่เท่ากัน หากหาค่านี้ใช้ z-test ได้ [4]p.43
2. ตัวอย่างสองกลุ่มที่สุ่มไม่เป็นอิสระกัน (Dependent samples)
เช่น น้ำหนักเฉลี่ยก่อนและหลังเข้าโปรแกรมลดน้ำหนัก
หรือ คะแนนก่อนเรียน กับหลักเรียนของนิสิตกลุ่มเดียวกัน หรือ midterm กับ final [4]p.45
ใช้ Match paired t-test
ทดสอบ มากกว่า 2 กลุ่ม ด้วย Anova
บตัวอย่างเรื่องเปรียบเทียบมากกว่า 2 กลุ่ม ที่ใช้ one-way anova เช่น ดูผลสัมฤทธิ์ของนักเรียนกลุ่มต่าง ๆ หลังได้ใช้วิธีการสอนต่างกัน แต่ถ้ามี dependent variable หลายตัว เช่น ดูผลสัมฤทธิ์และทัศนคติของนักเรียนกลุ่มต่าง ๆ แบบนี้ใช้ manova (Multivariate analysis of variance) จากเอกสารของ วิโรจน์ [2]p.29 แต่ถ้ามี independent variable หลายตัว ก็จะใช้ two-way หรือ three-way เช่น ใช้วิธีการสอนต่างกันและดูปัจจัยทางเพศด้วย ก็จะใช้ two-way ซึ่งการใช้ฟังก์ชันทางสถิติ กรณีข้อมูลมาจากผู้ทรงคุณวุฒิ 3 คน ตรวจสอบได้ด้วย data.frame() แต่หากจะส่งให้กังฟังก์ชัน oneway.test() จะต้องนำข้อมูลของผู้ทรงทั้ง 3 ท่านมารวมเป็นตารางเดียวก่อน ด้วยฟังก์ชัน stack() อ่านเพิ่มเติมได้ที่ อ.วิธรจน์ [2]p.30
T-Test
หน้า 24 ของ วิโรจน์ อรุณมานะกุล
T-test เป็นสถิติพื้นฐานตัวหนึ่งที่ใช้กันแพร่หลาย
สามารถใช้เปรียบเทียบค่าเฉลี่ยของกลุ่มตัวอย่างกับค่าเฉลี่ยขงอประชากรเพื่อตัดสินว่า
กลุ่มตัวอย่างนี้มาจากประชากรนี้หรือไม่
หรือเปรียบเทียบค่าเฉลี่ยของกลุ่มตัวอย่างสองกลุ่มว่ามาจากประชากรเดียวกันหรือไม่
t-test เป็นที่นิยมใช้ในกรณีที่กลุ่มตัวอย่างมีจำนวนไม่มาก
เช่น น้อยกว่า 30 ทำให้การคำนวณโดยใช้ z-test ไม่สามารถใช้ได้
โปรแกรม R มีฟังก์ชันพื้นฐานสำหรับคำนวณสถิติ t.test 
---
ทดสอบสมมติฐานค่าเฉลี่ยของหนึ่งประชากร
กำหนดให้ H0 มีค่ามิว=30 และ H1มีค่ามิวไม่เท่ากับ 30
One Sample t-test
ตามตัวอย่างของ ในเอกสารของ ผศ.วราฤทธิ์ พานิชกิจโกศลกุล 
หน้า 24
x <- c(26,32,24,37,28,29,33,31,34,36)
t.test(x,mu = 30) 
---
data: x
t = 0.7454, df = 9, p-value = 0.4751
alternative hypothesis: true mean is not equal to 30
95 percent confidence interval: 27.965 34.035
sample estimates: mean of x =  31 
ซึ่ง p-value = 0.4751 > α = 0.05 จึงยอมรับ
---

> x <- c(26,32,24,37,28,29,33,31,34,26)
> t.test(x,mu = 30) 

        One Sample t-test

data:  x
t = 0, df = 9, p-value = 1
alternative hypothesis: true mean is not equal to 30
95 percent confidence interval:
 27.06016 32.93984
sample estimates: mean of x = 30 
ซึ่ง p-value = 1 > α = 0.05 จึงยอมรับ
---
 x <- c(20,21,22,25,23); t.test(x,mu = 30) 

        One Sample t-test

data:  x
t = -9.0673, df = 4, p-value = 0.00082
alternative hypothesis: true mean is not equal to 30
95 percent confidence interval:
 19.81161 24.58839
sample estimates: mean of x =  22.2 
ซึ่ง p-value = 0.00082 < α = 0.05 จึงไม่ยอมรับ
-------------
ทดสอบค่าเฉลี่ยของสองประชากร หน้า 25
ที่เป็นอิสระต่อกัน
และทราบความแปรปรวนของทั้งสองกลุ่มไม่แตกต่างกัน
gardenA <- c(3,4,4,3,2,3,1,3,5,2)
gardenB <- c(5,5,6,7,4,4,3,5,6,5) 
t.test(grardenA,gardenB)

        Welch Two Sample t-test

d
t = -3.873, df = 18, p-value = 0.001115
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -3.0849115 -0.9150885
sample estimates:
mean of x mean of y 
        3         5 
เพราะ p-test น้อยกว่า 0.00115 จึงปฏิเสธ H0
ดังนั้นปฏิเสธสมมติฐานหลัก
จึงสรุปว่าค่าเฉลี่ยของประชากรทั้งสองกลุ่มแตกต่างกัน
-------------
ทดสอบค่าเฉลี่ยของสองประชากร หน้า 26
ที่ไม่เป็นอิสระต่อกัน
และทราบความแปรปรวนของทั้งสองกลุ่มไม่แตกต่างกัน
down<-c(20,15,10,5,20,15,10,5,20,15,10,5,20,15,10,5)
up<-c(23,16,10,4,22,15,12,7,21,16,11,5,22,14,10,6)
t.test(down,up,paired = T)
Paired t-test

data:  down and up
t = -3.0502, df = 15, p-value = 0.0081
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.4864388 -0.2635612
sample estimates:
mean of the differences 
                 -0.875 
เพราะ p-test น้อยกว่า 0.0081 จึงปฏิเสธ H0
ดังนั้นปฏิเสธสมมติฐานหลัก
จึงสรุปว่า ค่าเฉลี่ยของข้อมูลมีความแตกต่างกัน และมีช่วงความเชื่อมั่น 95% ของผลต่างระหว่างค่าเฉลี่ยของประชากรคือ (-1.4864, -0.2636) 
---
ที่ไม่เป็นอิสระต่อกัน
และทราบความแปรปรวนของทั้งสองกลุ่มไม่แตกต่างกัน
ต.ย. การเปรียบเทียบค่าเฉลี่ยของประชากร 2 กลุ่มที่ไม่เป็นอิสระต่อกัน 
เช่น การเปรียบเทียบค่าเฉลี่ยคะแนนความรู้ของผู้ป่วย x ที่อาศัยอยู่ใน
ชุมชน ก่อนและหลังดำเนินโครงการอบรม
before<-c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2)
after<-c(1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,2)
t.test(before,after,paired = T)
เพราะ p-test มากกว่า 0.5805 จึงยอมรับ H0
ดังนั้นยอมรับสมมติฐานหลัก
จึงสรุปว่า ค่าเฉลี่ยของข้อมูลหรือความรู้ไม่แตกต่างกัน คือ ไม่ได้รู้มากขึ้นเลย รู้เท่า ๆ เดิม
และมีช่วงความเชื่อมั่น 95% ของผลต่างระหว่างค่าเฉลี่ยของประชากรคือ ( -0.2983079  0.1733079) 
บันทึกเกี่ยวกับการใช้โปรแกรม r
c(1,0,1,1,0) สร้างข้อมูล
x<-c(1,0,1,1,0) สร้างตัวแปร หรือเวกเตอร์เก็บข้อมูล
x แสดงค่าที่เก็บในตัวแปร
factor(x) แสดงองค์ประกอบของข้อมูลในตัวแปร
x.f<-factor(x) สร้างตัวแปรเก็บค่าแฟคเตอร์
y<-c("m","m","m","f","m")
z.dat<-data.frame(x,y) จัดเก็บข้อมูลแบบตาราง ไฟล์ หรือเฟรมแบ่งตามสดมภ์ (Column) และแถว (Row)
z.dat แสดงข้อมูลตาม frame ที่กำหนด
summary(z.dat) สรุปข้อมูล
save.image("E:\\xyz.RData") จัดเก็บข้อมูลในแฟ้มแบบ RData
s1<-seq(1,10,by=0.5) สร้างเวกเตอร์ชื่อ s1 เก็บข้อมูลตามลำดับจำนวน 19 ข้อมูล คือ 1.0 - 10.0
summary(s1) สรุปข้อมูลเป็นค่าต่าง ๆ เช่น Min Max.
s2<-rep(1,times=5) สร้างเลข 1 จำนวน 5 ข้อมูล
load("E:\\xyz.RData")
read.table("e:\\xyz.txt",header=TRUE,sep=",",fill=TRUE,blank.lines.skip=TRUE)
s3<-read.table("e:\\xyz.txt",header=TRUE,sep=",",fill=TRUE,blank.lines.skip=TRUE)
s3.dat<-read.table("e:\\xyz.txt",header=TRUE,sep=",",fill=TRUE,blank.lines.skip=TRUE)
s4<-seq(1,10,by=0.5)
quantile(s4)
ภาพประกอบ
เอกสารอ้างอิง (Reference)

[1] กมลทิพย์ วิจิตรสุนทรกุลและคณะ. (2563). "การวิเคราะห์ข้อมูลสุขภาพในระบบสาธารณสุขไทย โดยใช้โปรแกรม R". ไอคิวมีเดีย.

[2] วิโรจน์ อรุณมานะกุล. (2560). "สถิติและการใช้โปรแกรม R". คณะอักษรศาสตร์ จุฬาลงกรณ์มหาวิทยาลัย.

[3] วราฤทธิ์ พานิชกิจโกศลกุล. (2550). "การใช้โปรแกรม R ในงานวิจัยด้านทฤษฎีสถิติ". คณะวิทยาศาสตร์และเทคโนโลยี มหาวิทยาลัยธรรมศาสตร์.

[4] วนิดา พงษ์ศักดิ์ชาติ. (2559). "การใช้โปรแกรม R เพื่อการวิจัย". ภาควิชาคณิตศาสตร์ มหาวิทยาลัยบูรพา.

Thaiall.com