ภาษา R พื้นฐานสำหรับ Excel Users

R เป็นหนึ่งในภาษาที่ได้รับความนิยมสูงมากสำหรับงาน data science เรียนรู้ง่าย ทำงานได้รวดเร็ว เกิดมาพร้อมกับความสามารถด้านสถิติ (ภาษาอังกฤษ เราเรียก R ว่า fast data crunching language)

R เหมาะสำหรับคนที่ใช้ Excel ในการทำงานอยู่แล้ว ถ้าอยากจะเริ่มเขียนโปรแกรม แอดแนะนำ R เป็นภาษาแรกเพราะ logic ในการทำงานของเครื่องมือสองตัวนี้คล้ายกันมาก (การเรียกใช้งานฟังชั่นเหมือนกันเกือบ 100%)

บทความนี้จะเปรียบเทียบความเหมือน/ แตกต่างของทั้งสองโปรแกรม และอธิบายการทำงานเบื้องต้นของ R ให้กับ Excel users ได้เข้าใจ ไม่ต้องเคยเขียนโปรแกรมมาก่อน ก็อ่านรู้เรื่อง ทำตามได้เลย 😛

Getting Software

สำหรับเพื่อนๆที่อยากทำตาม tutorial วันนี้ต้องติดตั้งโปรแกรมฟรีสองตัวคือ R และ RStudio Desktop ติดตั้งเสร็จแล้วเปิดโปรแกรม RStudio ขึ้นมา และเริ่มเขียนโค้ดในหน้าต่าง console ตามตัวอย่างด้านล่างได้เลย

คลิกที่รูปเพื่อขยาย หรือเปลี่ยนความละเอียดเป็นแบบ HD

นักเรียนสามารถดาวน์โหลดไฟล์ csv สำหรับบทความนี้ได้ที่นี่

ข้อมูล example_data.csv มีทั้งหมด 6 columns x 100 rows

R Works Like Excel

สำหรับเพื่อนๆที่ใช้ Excel เป็นอยู่แล้ว (รู้ว่า Excel function และ formula คืออะไร?) สามารถเริ่มเขียนภาษา R ได้ง่ายๆ เพราะวิธีการทำงานของทั้งสองโปรแกรมนี้เหมือนกันโดยเฉพาะการใช้งาน functions

output = function( input1, input2, input3, … )

ตารางเปรียบเทียบการเขียนฟังชั่นใน Excel vs. R สิ่งที่แตกต่างกันอย่างแรกคือ Excel เก็บข้อมูลใน spreadsheets เช่น cell A1:A10 แต่ R เก็บข้อมูลด้วยตัวแปร (variable) เช่น ตัวแปร x มีค่าเท่ากับ 1:10

ExcelR Programming
=AVERAGE(A1:A10)mean(x)
=STDEV.S(A1:A10)sd(x)
=SUM(A1:A10)sum(x)

Tip – สิ่งแรกที่ Excel Users ทุกคนต้องรู้คือ R เป็นภาษาแบบ case sensitive แปลว่าตัวพิมพ์ใหญ่/ ตัวพิมพ์เล็กมีผลกับการรันโค้ด R เขียนผิดนิดเดียวโค้ดจะรันไม่ออกเลย (error)

Read CSV File

มาลอง import csv file เข้าโปรแกรม RStudio กันก่อน

  • Unzip ไฟล์ .zip ที่ดาวน์โหลดมาไปวางไว้ที่ path ของฟังชั่น getwd() i.e. working directory
  • เสร็จแล้วใช้ฟังชั่น read.csv() เพื่อ import “example_data.csv” ไปเก็บไว้ที่ตัวแปร df ใน R (ชื่อตัวแปรจะตั้งว่าอะไรก็ได้ แต่แอดแนะนำให้ตั้งชื่อแบบเข้าใจง่าย และเป็นตัวพิมพ์เล็กทั้งหมด)

พอ import ไฟล์ข้อมูลเสร็จแล้ว เราสามารถเรียกดู structure ของ dataframe ด้วยฟังชั่น str() หรือจะแสดงผล 6 แถวแรกของ dataframe ใน console ด้วยฟังชั่น head()

## save csv fiels in this folder
getwd()
## read a csv file into R
df <- read.csv("example_data.csv")
## inspect data frame
str(df)
head(df)
view raw excel_readcsv.R hosted with ❤ by GitHub

Tip – R เก็บข้อมูลตัวแปรต่างๆใน RAM ถ้าข้อมูล csv ของเรามีขนาด 500mb R ก็จะจัดสรร RAM 500mb บวกลบนิดหน่อยเพื่อเก็บข้อมูลนี้ i.e. อะไรที่อยู่บน RAM ก็จะทำงานได้เร็วขึ้น นี่คือเหตุผลที่ R วิเคราะห์ข้อมูลได้เร็วกว่า Excel มาก โดยเฉพาะเวลาข้อมูลมีขนาดใหญ่กว่า 1,000,000 records

Basic Statistics

R ถูกพัฒนาขึ้นมาสำหรับการวิเคราะห์ผลสถิติโดยเฉพาะ ถ้าต้องการหาค่าเฉลี่ยของคอลัมน์ age ใน df เราจะเขียน syntax แบบนี้ mean(df$age) ลองดูตัวอย่างฟังชั่นอื่นๆด้านล่าง mean, median, sd และ sum

## summary statistics
summary(df)
## basic statistics
mean(df$age)
median(df$age)
sd(df$age)
sum(df$age)

Tip – เราใช้ $ เพื่อเลือกคอลัมน์ที่เราต้องการจาก data frame

If-else

การเขียนเงื่อนไขใน R จะใช้ฟังชั่น ifelse() โดย syntax จะเหมือนกับฟังชั่น IF() ของ Excel โดยฟังชั่นนี้จะรับ 3 inputs ดังนี้ ifelse(condition, TRUE, FALSE) คลิปด้านล่าง แอดใช้ฟังชั่น ifelse เพื่อสร้างคอลัมน์ใหม่ชื่อว่า age_group เพิ่มไปที่ df และใช้ฟังชั่น table() เพื่อสร้างตารางความถี่ของคอลั่มใหม่

ExcelR Programming
=IF(gpa>=25, “Senior”, “Junior”)ifelse(df$gpa >= 25, “Senior”, “Junior”)

Install New Packages

เราสามารถดาวน์โหลดและติดตั้ง package (functions) ใหม่ๆ เพื่อเพิ่มความสามารถของ R ใน laptop ของเราด้วยฟังชั่น install.packages() พอติดตั้งเสร็จแล้ว เรียกใช้งาน package นั้นๆด้วยฟังชั่น library()

## install packages
install.packages("dplyr")
library(dplyr)

Data Transformation

package ที่เราเพิ่งติดตั้งชื่อว่า dplyr เป็น package หลักสำหรับทำ data transformation เช่น การเลือกคอลัมน์ (select) ฟิลเตอร์ข้อมูล (filter) หรือสุ่มตัวอย่าง (sample_n) เป็นต้น โค้ดด้านล่างเราใช้ pipe operator (%>%) เป็น syntax มาตรฐานที่ช่วยให้เราเขียนโค้ด R ได้ง่ายขึ้น อย่างเช่นโค้ด line 6-8 เราเลือกคอลัมน์ id, student_name, gender เสร็จแล้วฟิลเตอร์ข้อมูลให้แสดงเฉพาะผู้ชาย gender == “M”

## select columns
df %>%
select(id, student_name, gender)
## filter rows
df %>%
select(id, student_name, gender) %>%
filter(gender == "M")
## sample rows n=30
df %>%
sample_n(30)

Tip – หลัง %>% เรานิยมเคาะ enter หนึ่งครั้งเพื่อขึ้นบรรทัดใหม่ df %>% select() %>% filter() เป็นเทคนิคการเขียนเชื่อมโค้ดเราเข้าด้วยกันใน R (เรียกว่า chained functions)

Pivot Table

Pivot Table คือการหมุนวิเคราะห์ข้อมูลง่ายๆ เช่น การนับจำนวนความถี่ (n) ของแต่ละกลุ่ม หรือคำนวณค่าสถิติแยกตามกลุ่ม เป็นต้น ตัวอย่างด้านล่างเราใช้ฟังชั่น count() เพื่อสร้างตารางความถี่ i.e. count values ของคอลัมน์ที่เราต้องการ หรือใช้ syntax df %>% group_by() %>% summarise() เพื่อคำนวณค่าสถิติแยกตามกลุ่ม

## count gender i.e. number of male and female students
df %>%
count(gender)
## count grouped gender and nationality
df %>%
count(gender, nationality)
## compute average age by gender group i.e. male age vs. female age
df %>%
group_by(gender) %>%
summarise(avg_age = mean(age))

VLOOKUP

Excel ใช้ฟังชั่น VLOOKUP() เพื่อดึงข้อมูลจากตารางที่เราต้องการด้วย lookup value (ดูตัวอย่างการเขียน vlookup ได้ที่นี่) ส่วน R ใช้ฟังชั่น left_join() ของ dplyr เพื่อดึงข้อมูลจากสองตารางพร้อมๆกัน ได้ผลเหมือนกับการเขียน vlookup แต่ยืดหยุ่นและใช้งานง่ายกว่า ลองดูตารางเปรียบเทียบ syntax ด้านล่าง

ExcelR Programming
=VLOOKUP(value, table, col_index, FALSE)left_join(table1, table2, by = “id”)
## read a lookup table into R
lookup_state <- read.csv("lookup_table.csv")
## filter only US students
df_us <- filter(df, nationality == "US")
## we can use left_join to do vlookup in R
df_us %>%
left_join(lookup_state, by = c("id" = "us_students")) %>%
slice(1:10)
view raw excel_vloopup.R hosted with ❤ by GitHub

Visualization

R มีความสามารถในการทำ visualization ได้หลายรูปแบบโดยเฉพาะ 2D graphics โค้ดด้านล่างเราลองสร้างกราฟ histogram, bar plot และ scatter plot ตามลำดับ ลองดู gallery แบบเต็มๆได้ที่นี่

## histogram
hist(df$age, breaks = 3)
## barplot
barplot(table(df$nationality))
## scatter plot
plot(df$age, df$gpa, pch = 16)

Summary

Tutorial นี้รีวิวฟังชั่นพื้นฐานใน R สำหรับวิเคราะห์ข้อมูลเบื้องต้น และเปรียบเทียบความเหมือน/ แตกต่างระหว่าง Excel vs. R

  • R ทำงานกับข้อมูลขนาดใหญ่ได้เร็วกว่า Excel เพราะว่าเก็บข้อมูลบน RAM/ memory
  • import csv file เข้าสู่โปรแกรม RStudio ด้วยฟังชั่น read.csv()
  • คำนวณค่าสถิติง่ายๆด้วยฟังชั่น mean(), median(), sd() และ sum()
  • เขียนเงื่อนไขด้วยฟังชั่น ifelse()
  • ติดตั้งและเรียกใช้งาน package ใหม่ใน R ด้วยฟังชั่น install.packages() และ library()
  • สร้าง Pivot Table ง่ายๆสไตล์ R ด้วยฟังชั่น count(), group_by() และ summarise()
  • เขียน vlookup สองตารางด้วยฟังชั่น left_join()
  • สร้าง basic visualization ด้วยฟังชั่น hist(), barplot() และ plot()

Appendix – Simulated Data

ด้านล่างเป็น R code ที่แอดใช้สร้าง example_data.csv และ lookup_table.csv ที่สอนในบทความนี้ ข้อดีของ R คือความง่ายในการ simulate new dataset ด้วยฟังชั่นพื้นฐานอย่าง sample() หรือ rnorm() ถ้าใครอยากเรียน R แบบเต็มๆ เข้าเรียนฟรี Data Analyst Bootcamp (R Track) ได้ที่นี่

## generate vectors
set.seed(99)
id <- 1:100
student_name <- replicate(100, paste0(sample(LETTERS, size = 5, replace = T), collapse = ""))
gender <- factor(sample(c(0,1), size = 100, replace = T, prob = c(.7, .3)),
labels = c("M", "F"))
age <- sample(19:32, size = 100, replace = T)
gpa <- rnorm(n = 100, mean = 3.15, sd = 0.25)
gpa <- ifelse(gpa > 4, 4.00, gpa)
nationality <- factor(sample(c(0,1,2), size = 100, replace = T, prob = c(0.5, 0.3, 0.2)),
labels = c("TH", "US", "CH"))
## create a dataframe from vectors
df <- data.frame(id, student_name, gender, age, gpa, nationality)
head(df)
## create a lookup table in this example
set.seed(99)
us_students <- df %>% filter(nationality == "US") %>% .[["id"]]
lookup_state <- data.frame(us_students,
states = sample(state.name, size = length(us_students), replace = TRUE))

Leave a Reply