บทนำ

เอกสาร R Markdown ภาษาไทยชุดนี้อธิบาย การทำงานของโปรแกรม R/RStudio programming หัวข้อเรื่อง Introduction to R programming ในรายวิชา 2104525 Compuational Methods for IE เอกสารภาษาไทยชุดนี้ประกอบด้วย 3 ส่วน ได้แก่

Topics: การวิเคราะห์และแสดงข้อมูลเบื้องต้น


01: Explore

ในส่วนนี้จะเป็นการแนะนำ ฐานข้อมูล iris ซึ่งเป็นข้อมูลขนาดของกลีบดอก (patel) กลีบใบ (saple) และประเภทของดอกไอริส 3 ประเภท ข้อมูลดังกล่าวได้ติดตั้งที่อยู่ใน base ของโปรแกรม R

Meta

ก่อนการวิเคราะห์ข้อมูลนักวิเคราะห์ควรเข้าใจถึงโครงสร้างและที่มาข้อมูล

  • คำสัง ‘str()’ สามารถใช้ตรวจสอบประเภทของข้อมูลได้
  • คำสัง ‘summary()’ สามารถใช้สรุปการกระจายข้อมูล (Descriptive Statistic)
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

handling

ความผิดพลาดของข้อมูล
  • Missing ข้อมูลบางรายการ บางรายการหายไป (Not Applicable: NA) การตรวจสอบความผิดพลาดดังกล่าวสังเกตได้ง่าย โดยคำสั่ง which() ควบคู่กับ is.na() และมักนำไปสู่การลบข้อมูลด้งกล่าว หรือ แทนค่า
  • Duplicate ข้อมูลบางแถวมีความซ้ำซ้อนกัน การตรวจสอบความผิดพลาดดังกล่าว สามารถจัดการได้โดยคำสั่ง unique() หรือ duplicated()
  • Incorrect ข้อมูลบางรายการมีค่าไม่ถูกต้อง คุณสมบัติไม่เหมาะสม หรือ ไม่สอดคล้อง เช่น c(ชาย, male, M, Gender0) การตรวจสอบความผิดพลาดดังกล่าวต้องอาศัยการสังเกตของนักวิเคราะห์
    which(iris=='')                   ## แสดงตำแหน่งของข้อมูลที่เป็นช่องว่าง ('')   
## integer(0)
    which(is.na(iris),arr.ind=T)      ## แสดงแถว และ คอลัมภ์ ของข้อมูลหายไป (NA)
##      row col
    (1:nrow(iris))[duplicated(iris)]    ## แสดงข้อมูลที่ซ้ำซ้อนกัน 
## [1] 143

data.frame

โครงสร้างของ data.frame โครงสร้างฐานข้อมูลพื้นฐานในโปรแกรม R/RStudio ผสมระหว่าง Matrix และ List ซึ่งแต่ละคอลัมภ์ ข้อมูล

\[ DF[\ll row\gg,\ll col \gg]\]

  • row แสดงหมายเลขหรือเซตของแถว ที่ต้องการ
  • col แสดงหมายเลขหรือเซตของคอลัมภ์ ที่ต้องการ
head(iris[[1]])          ## เข้าถึงแบบ ลำดับของ List    
## [1] 5.1 4.9 4.7 4.6 5.0 5.4
head(iris$Sepal.Length) ## เข้าถึงแบบ ชื่อของ List 
## [1] 5.1 4.9 4.7 4.6 5.0 5.4
head(iris[,1])               ## เข้าถึงแบบ Matrix 
## [1] 5.1 4.9 4.7 4.6 5.0 5.4

คำสั่ง str() และ summary() สามารถใช้ตรวจสอบประเภทและสถิติของข้อมูลได้

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
ฟังก์ชั่นที่สำคัญ
  • cbind หรือrbind รวมฐานข้อมูล ตามคอลัมภ์ หรือ ตามแถว
  • data.frame() สร้าง data.frame จากการป้อนค่า หรือ ตัวแปรอื่น
  • as.data.frame() เปลี่ยนข้อมูลให้อยู่ในรูป data.frame
  • is.data.frame() ตรวจสอบว่าข้อมูลให้อยู่ในรูป data.frame หรือไม่

summarytools

การสรุปข้อมูลสามารถทำได้โดย summarytools package

require(summarytools)

##-- general stat+dist summary of data 
print(summarytools::dfSummary(iris),method = "render")

Data Frame Summary

iris

Dimensions: 150 x 5
Duplicates: 1
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 Sepal.Length [numeric] Mean (sd) : 5.8 (0.8) min < med < max: 4.3 < 5.8 < 7.9 IQR (CV) : 1.3 (0.1) 35 distinct values 150 (100.0%) 0 (0.0%)
2 Sepal.Width [numeric] Mean (sd) : 3.1 (0.4) min < med < max: 2 < 3 < 4.4 IQR (CV) : 0.5 (0.1) 23 distinct values 150 (100.0%) 0 (0.0%)
3 Petal.Length [numeric] Mean (sd) : 3.8 (1.8) min < med < max: 1 < 4.3 < 6.9 IQR (CV) : 3.5 (0.5) 43 distinct values 150 (100.0%) 0 (0.0%)
4 Petal.Width [numeric] Mean (sd) : 1.2 (0.8) min < med < max: 0.1 < 1.3 < 2.5 IQR (CV) : 1.5 (0.6) 22 distinct values 150 (100.0%) 0 (0.0%)
5 Species [factor] 1. setosa 2. versicolor 3. virginica
50(33.3%)
50(33.3%)
50(33.3%)
150 (100.0%) 0 (0.0%)

Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10

##-- numeric desc stat summary of data 
print(summarytools::descr(iris),method = "render")

Descriptive Statistics

iris

N: 150
Petal.Length Petal.Width Sepal.Length Sepal.Width
Mean 3.76 1.20 5.84 3.06
Std.Dev 1.77 0.76 0.83 0.44
Min 1.00 0.10 4.30 2.00
Q1 1.60 0.30 5.10 2.80
Median 4.35 1.30 5.80 3.00
Q3 5.10 1.80 6.40 3.30
Max 6.90 2.50 7.90 4.40
MAD 1.85 1.04 1.04 0.44
IQR 3.50 1.50 1.30 0.50
CV 0.47 0.64 0.14 0.14
Skewness -0.27 -0.10 0.31 0.31
SE.Skewness 0.20 0.20 0.20 0.20
Kurtosis -1.42 -1.36 -0.61 0.14
N.Valid 150 150 150 150
Pct.Valid 100.00 100.00 100.00 100.00

Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10

##-- factor summary of data 
print(summarytools::freq(iris$Species),method = "render")

Frequencies

iris$Species

Type: Factor
Valid Total
Species Freq % % Cum. % % Cum.
setosa 50 33.33 33.33 33.33 33.33
versicolor 50 33.33 66.67 33.33 66.67
virginica 50 33.33 100.00 33.33 100.00
<NA> 0 0.00 100.00
Total 150 100.00 100.00 100.00 100.00

Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10

ฟังก์ชั่นที่สำคัญ
  • dfSummary() เป็นการสรุปสถิติและการกระจายของข้อมูล
  • descr() เป็นการสรุปสถิติของข้อมูลประเภทตัวเลข (numeric)
  • freq() เป็นการสรุปสถิติของข้อมูลความถี่ (factor)
  • ctree() เป็นการสรุปสถิติของข้อมูลความถี่ (factor) สองกลุ่ม

02: ‘data.table’

Basic

โครงสร้างของ data.table ในโปรแกรม R/RStudio

\[ DT[\ll condition \gg,\ll operation\gg,\text{by}=\ll col_{grouped}\gg,\text{on}= \ll col_{jointed} \gg ]\]

  • condition แสดงหมายเลขหรือเซตของแถว ที่ต้องการ
  • operation แสดงหมายเลขหรือเซตของคอลัมภ์ ที่ต้อ
  • col_{grouped} แสดงหมายเลขหรือเซตของแถว ที่ต้องการ
  • col_{jointed} แสดงหมายเลขหรือเซตของคอลัมภ์ ที่ต้องการ

Create

การสร้าง object ใน package data.table สามารถทำโดยการ cast จาก data.frame() ด้วยคำสั่ง as.data.table()

require(data.table)
## Loading required package: data.table
iris.DT <- as.data.table(iris)

iris.DT
##      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
##   1:          5.1         3.5          1.4         0.2    setosa
##   2:          4.9         3.0          1.4         0.2    setosa
##   3:          4.7         3.2          1.3         0.2    setosa
##   4:          4.6         3.1          1.5         0.2    setosa
##   5:          5.0         3.6          1.4         0.2    setosa
##  ---                                                            
## 146:          6.7         3.0          5.2         2.3 virginica
## 147:          6.3         2.5          5.0         1.9 virginica
## 148:          6.5         3.0          5.2         2.0 virginica
## 149:          6.2         3.4          5.4         2.3 virginica
## 150:          5.9         3.0          5.1         1.8 virginica

การเรียก object จะเป็นแสดงเฉพาะ 5 แรกแถว และ 5 ท้ายแถวของชุดข้อมูล

Filter

การกรองข้อมูลตามเงือนไขสามารถทำได้โดยการ ระบุเงื่อนไขที่ต้องการตามหลัง object ใน data.table package อนึ่งการเพิ่มเงือนไขทำได้โดยการซ้อน []

iris.DT[Sepal.Length <= 4.5 & Sepal.Width >= 3.0 ]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1:          4.3         3.0          1.1         0.1  setosa
## 2:          4.4         3.0          1.3         0.2  setosa
## 3:          4.4         3.2          1.3         0.2  setosa
iris.DT[Sepal.Length <= 4.5 & Species=='setosa'][order(-Sepal.Width)]
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1:          4.4         3.2          1.3         0.2  setosa
## 2:          4.3         3.0          1.1         0.1  setosa
## 3:          4.4         3.0          1.3         0.2  setosa
## 4:          4.4         2.9          1.4         0.2  setosa
## 5:          4.5         2.3          1.3         0.3  setosa
ฟังก์ชั่นที่สำคัญ
  • between() เป็นการระบุช่วงการค้นหาตัวเลข
  • %like% เป็นการหาคำคล้าย

Query

การสรุปข้อมูลสามารถทำได้โดยการฟังก์การสรุป พร้อมกลุ่มข้อมูลหลัง , แรกของ object ใน data.table package

iris.DT[, mean(Sepal.Length), by=Species ]
##       Species    V1
## 1:     setosa 5.006
## 2: versicolor 5.936
## 3:  virginica 6.588

หากต้องการสรุปด้วยฟังก์ชั่นเดียวกันมากกว่า 1 คอลัมภ์ ใช้ .SD หรือ .SDCols ระบุคอลัมภ์ที่ต้องการ

iris.DT[,lapply(.SD,mean), by=Species ]
##       Species Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1:     setosa        5.006       3.428        1.462       0.246
## 2: versicolor        5.936       2.770        4.260       1.326
## 3:  virginica        6.588       2.974        5.552       2.026
iris.DT[,lapply(.SD,sd), .SDcols=c("Sepal.Length","Sepal.Width"),by=Species ]
##       Species Sepal.Length Sepal.Width
## 1:     setosa    0.3524897   0.3790644
## 2: versicolor    0.5161711   0.3137983
## 3:  virginica    0.6358796   0.3224966

หากต้องการสรุปหลายฟังก์ชั่นสามารถทำโดยใช้ .() ในการแยก

iris.DT[,.(avgSep=mean(Sepal.Width),sdSep=sd(Sepal.Width)), by=Species ]
##       Species avgSep     sdSep
## 1:     setosa  3.428 0.3790644
## 2: versicolor  2.770 0.3137983
## 3:  virginica  2.974 0.3224966

New Column

การสร้างคอลัมภ์ใหม่สามารถทำได้โดยใช้เครื่องหมาย :=

iris.DT[,sText:= fcase(
  Sepal.Length < 5.0 , "<5",
  Sepal.Length > 7.0 , "7+",
  default = "5-7"
  )  ]

## iris.DT[,sTest:= cut(Sepal.Length,c(0.0,5.0,7.0,20.0),
##                     label=c("<5","5-7","7+") )]

iris.DT[,.(mean(Sepal.Length),.N),by=.(Species,sText)]
##       Species sText       V1  N
## 1:     setosa   5-7 5.230000 30
## 2:     setosa    <5 4.670000 20
## 3: versicolor   5-7 5.957143 49
## 4: versicolor    <5 4.900000  1
## 5:  virginica   5-7 6.345946 37
## 6:  virginica    7+ 7.475000 12
## 7:  virginica    <5 4.900000  1
คำสั่งที่ใกล้เคียงกับ fcase() และการประยกุต์ใช้
  • ifelse() เป็นการสร้างเงือนไข ifelse(Sepal.Length<5.0,"<5",ifelse(Sepal.Length>7,"7+","5-7") )
  • cut( _cRange_,_cLabel_) เป็นการกำหนดช่วงและสร้าง label cut(Sepal.Length,c(0.0,5.0,7.0,20.0),label=c("<5","5-7","7+"))

03: String

package stringr ควบคู่ไปกับ data.table ในการจัดการข้อมูลได้

 require(stringr)
 
 iris.DT[ ,tSp:= str_sub(Species,1,3)]

 xtabs(~tSp+sText,iris.DT) 
##      sText
## tSp   <5 5-7 7+
##   set 20  30  0
##   ver  1  49  0
##   vir  1  37 12
 print(summarytools::ctable(iris.DT$tSp,iris.DT$sText ),method = "render")

Cross-Tabulation, Row Proportions

tSp * sText

Data Frame: iris.DT
sText
tSp <5 5-7 7+ Total
set 20 ( 40.0% ) 30 ( 60.0% ) 0 ( 0.0% ) 50 ( 100.0% )
ver 1 ( 2.0% ) 49 ( 98.0% ) 0 ( 0.0% ) 50 ( 100.0% )
vir 1 ( 2.0% ) 37 ( 74.0% ) 12 ( 24.0% ) 50 ( 100.0% )
Total 22 ( 14.7% ) 116 ( 77.3% ) 12 ( 8.0% ) 150 ( 100.0% )

Generated by summarytools 0.9.8 (R version 3.6.3)
2021-09-10

หมายเหตุ

  • stringr::str_c() เป็นการรวม string ของคอลัมภ์ที่กำหนด
  • stringr::str_sub() เป็นการดึง sub string ของคอลัมภ์ที่กำหนด

04: Visualize

ggplot ควบคู่ไปกับ data.table และ dplyr ในการแสดงข้อมูลเป็นรูปภาพ หรือ กราฟ

 require(ggplot2)
 require(dplyr)

 ##-- plot contour
 ggplot(iris.DT,aes(x=Sepal.Width,y=Sepal.Length,color=Species)) +  geom_density_2d()

 ##-- seperate data filter and query 
 iris.DT[Species %like% "color"] %>%
   ggplot(aes(x=Sepal.Width,y=Sepal.Length,color=Species)) + geom_point()

หมายเหตุ

  • %>% คือเครื่องหมายในการส่งข้อมูล (pipe) ใน package dplyr


Copyright 2019   Oran Kittithreerapronchai.   All Rights Reserved.   Last modified: 2021-49-10,