สรุปจากการหัดเขียนภาษา R ผ่าน CodeSchool
บทความนี้เป็นการบันทึกการเรียนรู้พื้นฐาน R จากเว็บไซต์ tryr.codeschool.com/ หลังจากได้ยินชื่อภาษา R มานานละ แต่ไ่มรู้ว่ามันคืออะไร รู้แต่ว่ามันใช้งานในด้าน Big Data วิเคราะห์ข้อมูล ซึ่งปัจจุบันกำลังสนใจแนวๆนี้อยู่ได้ ด้านล่างก็เป็นสิ่งที่ได้เรียนรู้จากเว็บข้างบนนั่นแหละ ไม่ได้ติดตั้ง R ลงในเครื่องแต่อย่างใด เรียนผ่าน Website แบบคร่าวๆเท่านั้น ส่วน Compiler ก็เลยใช้ตัว R Compiler Online ที่ r-fiddle.org สะดวกดี ซึ่งทั้งหมดสรุปได้ดังนี้ อาจจะมีมั่วบ้างโปรดใช้วิจารณญาณในการอ่านเอาเองเด้อ
Ch 1 : R Syntax
- Expressions เหมือนกับภาษาอื่นๆ
- boolean ใช้คีย์เวิร์ด
TRUE
และFALSE
(ตัวพิมพ์ใหญ่ทั้งหมด) TRUE
และFALSE
เขียนแบบ short hand ได้ด้วยT
และF
- ประกาศตัวแปรและกำหนดค่าด้วยเครื่องหมาย
<-
เช่นx <- 20
สามารถ re-assign ได้ - ฟังค์ชัน ใช้คล้ายๆภาษาอื่น คือ ชื่อตามด้วยวงเล็บเปิด/ปิด เช่น
sum(4, 5, 6)
help(functionname)
และexample(functionname)
เอาไว้เปิดอ่าน doc ช่วยชีวิต- รัน script ไฟล์ .R ด้วยคำสั่ง
source(filename)
Ch 2 : Vectors
- เก็บข้อมูล vector ใช้ syntax
c(1, 2, 3)
(c ย่อมาจาก combine) - vector เก็บข้อมูลชนิดอะไรก็ได้
c('a', 'b', 'c')
แต่ต้องเป็นชนิดเดียวกัน - vector ถ้าเก็บข้อมูลต่างชนิดกัน
c(1, TRUE, "three")
ทั้งหมดจะถูกแปลงเป็น characters - sequence vector
5:9
มีค่าเท่ากับseq(5, 9)
ผลลัพธ์คือ5 6 7 8 9
seq()
สามารถกำหนดค่าที่ต้องการจะ increase ได้seq(5, 9, 0.5)
ผลลัพธ์คือ5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0
- การ access ค่าที่อยู่ใน vector ใช้ index เหมือนกับภาษาอื่น แต่ต่างกันที่ ภาษา R เริ่มที่ index = 1
- access multiple ได้ เช่นเลือก index 1 และ 3
sentence[c(1, 3)]
- สามารถตั้งชื่อ key ให้กับ vector ได้ด้วยฟังค์ชัน
names()
ตัวอย่าง
ผลลัพธ์
- ฟังค์ชัน
barplot
เอาไว้วาด Bar Graph จากค่า vectors ได้เลย (มี built-in ฟังค์ชันวาดกราฟมาด้วย เท่มาก)
- ถ้าเกิดใส่
names()
ให้กับ vector มันก็จะใช้ชื่อเป็น label ของ graph
- การเพิ่มค่าให้กับ vector จะเพิ่มค่าให้ทุกตัวใน vector ด้วย เช่น
- บวกค่า vector 2 ตัวที่มีจำนวนเท่ากัน
- ในกรณีที่ จำนวนค่าใน vector ไม่เท่ากัน ลองทดสอบดูจาก r-fiddle มันจะก็อปค่า vector ที่สั้นกว่า ให้ยาวเท่ากับ vector อันยาว แล้วถึงทำ operator เช่น
ได้ผลลัพธ์เท่ากับ [1] 3 7 6 2 4 9 8
เพราะว่า มันจะกลายเป็น
- (ถ้า vector b ยาวมากๆ vector a ก็จะมีค่า 1, 2, 3, 1, 2, 3, … ไล่ไปเรื่อยๆ จนกว่าความยาวจะเท่ากับ vector b อันนี้ตามความเข้าใจจากการลองเล่นดูผ่าน r-fiddle ไม่รู้ถูกมั้ย :)
- เปรียบเทียบ vector ด้วย
==
จะเป็นการเปรียบเทียบค่าแต่ละตัวใน vector - ฟังค์ชันสามารถรับ args เป็น vector ได้ เช่น
sqrt(c(2, 4, 16))
หรือsin(c(2, 3, 4))
- ฟังชัน
plot
รับ args เป็น vector 2 ตัว คือ ค่าแกน x และค่าแกน yplot(x, y)
NA
คือ Not Available หากบวกค่าด้วยNA
จะได้ผลลัพธ์เป็นNA
ต้องกำหนดna.rm = TRUE
ซะก่อน
Ch 3 : Matrices
matrix(0, 3, 4)
ทำการสร้าง matrix ขนาด 3 แถว 4 คอลัม ทั้งหมดมีค่าเป็น 0- สร้าง matrix จาก vector ด้วย
- สร้าง matrix ด้วยฟังค์ชัน
dim()
โดยการรับ args เป็น vector และ assign ค่าเป็น vector ที่ระบุ แถวและคอลัม เช่น
Ch 4 : Summary Statistics
mean()
หาค่าเฉลี่ยของเซตข้อมูล เช่นmean(c(2, 3, 4, 5, 6))
abline()
เอาไว้สำหรับ draw line โดยรับ args เป็น h เช่น
median()
คือการหาค่า median วิธีการหาค่า median คือ ทำการ sort ข้อมูลเรียงลำดับจากน้อยไปมากก่อน แล้วจากนั้นเลือกค่ากึ่งกลางมา ถ้าค่ากึ่งกลางมี 2 ค่าก็ให้เฉลี่ยจากค่า 2 ค่านั้นอีกทีหนึ่ง
Standard Deviation
หรือ sd คือค่าเบี่ยงเบนมาตรฐาน เป็นการกระจายข้อมูลและแจกแจงความน่าจะเป็น คุ้นๆเหมือนเคยเรียนตอนสมัยมัธยม :) ส่วนวิธีการลืมหมดแล้ว
Ch 5 : Factors
factor()
เป็นการรวมกลุ่มของ vector ให้เป็น unique โดยมีLevels
กำกับ- ค่าของ Levels ใน Factor ไม่ได้เป็น String แต่เป็น integer reference
as.integer()
เอาไว้ใช้แสดง integer reference ของ factorlevels()
แสดงเฉาพะ factor level- Plot graph ด้วยการใช้ 2 factors ก็ได้
แต่ว่าจะดูไม่ออกว่าข้อมูลไหนคือ weights หรือ prices ถ้าหากมีข้อมูลเยอะๆ
- ใช้
pch
เป็น args เพื่อแสดงสัญลักษณ์ข้อมูลที่แตกต่างกัน (วงกลม, สามเหลี่ยม, บวก) legend()
เอาไว้อธิบายเพิ่มเติมว่า แต่ละสัญลักษณ์มันคืออะไร เช่น แสดงที่บนขวามือของกราฟ
เปลี่ยน legend()
ที่เป็น hard code อยู่ เป็น
Ch 6 : Data Frames
- Data Frame ในภาษา R เปรียบเสมือนฐานข้อมูล เช่น ตัวอย่างอธิบายว่าหากเก็บข้อมูล
weights
,prices
และtypes
หากเพิ่มค่าใดค่าหนึ่ง ก็ต้องจำและเพิ่มมค่าอื่นๆตามด้วย จึงใช้ Data Frame เข้ามาช่วยรวมข้อมูลทั้ง 3 เป็น Data Structure ตัวเดียวกัน
จากข้อมูลด้านล่าง types
, weights
และ prices
เมื่อเก็บข้อมูลเป็น Data Frames จะเป็นแบบนี้
- การ access data frame ทำเหมือนกันกับ matrix แต่ว่า ใช้
[[]]
(double brackets)
- ใช้
$
เพื่อ access data frame โดยระบุชื่อของ data คล้ายๆกับ dot notation ของภาษาอื่นๆ
read.csv(filename)
เอาไว้สำหรับโหลดไฟล์ .csv โดยชื่อไฟล์ ได้มาจากlist.files()
- ข้อมูลที่ไม่ใช่ comma seperate แต่คั่นด้วยอย่างอื่น เช่น | หรือแท็ป จะใช้ฟังค์ชัน
read.table()
โดยรับ args 2ตัว คือชื่อไฟล์ และsep
สัญลักษณ์ที่ใช้คั่นข้อมูล
โดยจะมี Column Header V1
, V2
, … Vn
แทรกมา วิธีการก็ต้องเพิ่มอีก args ลงไป
merge()
ใช้สำหรับรวม Data Frame เข้าด้วยกัน โดยการรวม column ที่ชื่อเหมือนกัน
Ch 7 : Working With Real-World Data
- แสดงตัวอย่าง Real World Data โดยมีข้อมูล GDP ของแต่ละประเทศ และเปอเซนการใช้ซอฟแวร์ละเมิดลิขสิทธิ์ของแต่ละประเทศ เมื่อโหลดข้อมูลผ่าน
read.table()
และทำการmerge()
แล้วplot()
กราฟออกมาได้เหมือนในรูป
- จากกราฟแสดงว่าประเทศที่มี GDP สูง จะมีเปอร์เซนการใช้ซอฟแวร์เถื่อนต่ำ แต่ว่าข้อมูลแค่นี้จะเพียงพอต่อหรือไม่?
cor.test()
เป็นฟังค์ชันที่เราไว้ทดสอบความสัมพันธ์ของ 2 vectors
-
ค่า
p-value
คือ Probability Value เหมือนเคยเรียนวิชา Probability คุ้นๆมากแต่ลืมว่ามันคืออะไร เอาเป็นว่าเป็นผลการทดสอบสมมติฐานหรือยอมรับสมมติฐาน ซึ่งในบทเรียนเค้าบอก ถ้าน้อยกว่า 0.05 แสดงว่ายอมรับในสมมติฐาน ซึ่งตามข้อมูล ก็คือ GDP มันแปรผกผันกับซอฟแวร์ละเมิดลิขสิทธิ์อยู่ -
lm()
เป็นฟังค์ชันที่รับ args เป็น model formula คือรับค่า response variable (เปอเซนการละเมิดลิขสิทธิ์) กับpredictor variable
(GDP) โดยมี~
คั่นกลาง
ggplot2
เป็น graphic package ที่ช่วยให้กราฟดูสวยขึ้น- การติดตั้งและเรียกใช้ package ด้วย
install.packages("ggplot2")
- ตัวอย่างเมื่อใช้
ggplot2
สรุป
หลังจากได้ทดลองเรียน R Language แล้วรู้สึกว่ามันเป็นภาษาที่เหมาะกับด้าน Data โดยตรงเลย นอกจากความรู้เรื่องโปรแกรมมิ่งแล้ว ยังต้องมีพวก Math มาเกี่ยวข้องด้วย ตอนที่ได้ลองอ่านก็ได้เจอศัพท์คุ้นๆที่เคยได้เรียน ได้ผ่านมาสมัยมัธยมปลายเพียบเลย คงต้องกลับไปทบทวนกันยกใหญ่เลยทีเดียว :)
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust