Coming soon . . .
Category: R Programing
-
Data Transformation
เมื่อสักครู่ที่ GAME PAO YING CHUB จะเป็นการนำความรู้จากพื้นฐานโปรแกรมมิ่ง มาต่อ ยอดเป็นการเขียน Function การทำงานเพื่อให้คุ้นชินกับ R Language มาถึงตรงนี้จะเป็นการนำเอาพื้นฐานของทางด้าน Data Transformation ใน R Language มาเพื่อจำลองการวิเคราะห์และจัดการข้อมูลตาม Requirement ของ User ซึ่งในที่นี้เป็นตัวผู้เขียนที่จะลองยกตัวอย่างความต้องการต่างๆ จาก dataset จำลอง

สำหรับ dataset ที่เราจะใช้กันวันนี้คือ mtcars ที่เป็น dataset สำเร็จรูปใน Rstudio

ขั้นตอนแรกก่อนที่จะเริ่มทำงาน เราจะทำการ load library หรือ packages สำหรับการวิเคราะห์ข้อมูล ได้แก่ tidyverse และ dplyr

เริ่มต้นเราจะดูก่อนว่า dataset นี้ประกอบด้วยข้อมูล Column ชื่ออะไรบ้าง และความสัมพันธ์ของแต่ละ Column มีอะไรที่น่าสังเกต และเราสามารถเล่นกับก้อนข้อมูลนี้ได้อย่างไรบ้าง
จะเห็นได้ว่า Column ที่เป็นชื่อรถยนต์ ไม่ได้มีการระบุชื่อ Column ไว้ เราจะทำการสร้างชื่อ Column ให้กับ Column ชื่อรถยนต์นี้กัน

- เราทำการเรียก rownames(mtcars) เพื่อดูข้อมูลชื่อรถยนต์ในแถวแรกของ dataset นี้ทั้งหมด
- จากนั้นเรากำหนดให้ car_name คือตัวแปรของ rownames(mtcars)
- และทำการ Create Column ใหม่ใน dataset นี้ โดยการใช้คำสั่ง mtcars$model (“คำว่า model ไม่มีอยู่ใน dataset เริ่มต้น โปรแกรมจึงมองว่าเป็นการ create column ใหม่ที่ชื่อว่า mdel ขึ้นมาแทน)

เมื่อได้ column ใหม่แล้ว หากตรวจสอบจะพบว่าตอนนี้ใน dataset เราจะมีก้อนข้อมูลที่เป็น Column ชื่อรถยนต์ด้วยกัน 2 column ต่อไปเราจะทำการลบ Column ที่ไม่มีชื่อทิ้งไปก่อน โดยการระบุคำสั่ง rownames(mtcars) <- NULL เพื่อลบ rownames(mtcars) แถวที่เป็นชื่อรถยนต์ทิ้งไป

เมื่อลบข้อมูลเรียบร้อย จะเหลือเพียง 1 Column เท่านั้น
ในลำดับถัดไปเราจะทำการ วิเคราะห์ข้อมูลและจัดเรียงข้อมูลให้ตรงกับ Requirement กัน โดยวิธีการสร้าง data-pipeline เพื่อให้ง่ายต่อการเขียน Filter ต่างๆ
คำถามที่ 1 :: ต้องการข้อมูลชื่อรถยนต์ และจำนวนเกียร์ในตัวรถ จาก dataset นี้ ที่มีค่าน้ำหนักตัวรถตั้งแต่ 3.5 (wt) ขึ้นไป และ แรงม้ามากกว่า 180 (hp)

จากคำถาม เราจะเห็นว่า โจทย์ User อยากรู้ 2 อย่างได้แก่ ชื่อรถยนต์ (model) และ จำนวนเกียร์ (gear) ทีนี้เงื่อนไขเพิ่มเติม คือ User ต้องการให้เอาเฉพาะน้ำหนักตัวรถตั้งแต่ 3.5 (wt) ขึ้นไป และ แรงม้ามากกว่า 180 (hp) ขึ้นไปเท่านั้น ผมจึงทำการเพิ่ม column มาอีก 2 ค่าได้แก่ wt และ hp เพื่อให้ User ได้เห็นข้อมูลว่าตรงตาม Requirement แน่ชัด
และนี้คือข้อมูลที่ได้. . .

คำถามที่ 2 :: จงหาชื่อรถยนต์ , ประเภทเกียร์ (อัตโนมัติ , กระปุก) และ น้ำหนักตัวรถ จาก dataset นี้ โดยต้องการเฉพาะข้อมูลที่แรงม้ามากกว่า 200 ขึ้นไป และแรงม้าต่ำกว่า 100 เท่านั้น ไม่เอาระหว่าง 100 – 200 และจงระบุว่า คันไหนใช้เกียร์แบบไหน

จากโจทย์ User อยากได้ข้อมูล ชื่อรถยนต์ แและ ประเภทเกียร์ โดยมีเงื่อนไขเป็น แรงม้า ผมจึงทำการระบุ เงื่อนไขก่อน โดยการกำหนดว่าแรงม้าที่ User ต้องการ ต้องน้อยกว่า 100 หรือไม่ก็มากกว่า 200 ไปเลย จากนั้น จะดึงข้อมูลโดยเอาชื่อรถยนต์ จำนวนแรงม้า น้ำหนักตัวรถ และประเภทเกียร์มาแสดง
และนี้คือข้อมูลที่ได้. . .

จะเห็นได้ว่าข้อมูลพอดูได้ แต่ User อยากให้ระบุว่า คันไหนใช้เกียร์แบบไหน จึงทำการสร้างข้อมูลเพิ่ม โดยการใช้คำสั่ง function : mutate ร่วมกับ ifelse() เพื่อกำหนดเงื่อนไข หากเป็นจริง ให้แสดงข้อมูลนี้ และไม่เป็นจริงให้แสดงข้อมูลนี้

จากการที่เพิ่ม function : mutate ร่วมกับ ifelse() อธิบายตรงนี้ว่า ให้ am_gear คือการแสดงข้อมูลของ am ถ้า am เท่ากับ 0 ให้แสดงค่า “auto” แต่ถ้าไม่ ให้แสดงค่า “manual”
และทำการเรียงข้อมูลเพื่อให้สวยงามด้วย Function arrange
และนี้คือข้อมูลที่ได้. . .

. . . การจำลองการวิเคราะห์ข้อมูล และการ Transformation ใน R Language ก็จะเป็นประมาณนี้ หวังว่าจะมีประโยชน์ต่อผู้อ่านทุกท่านไม่มากก็น้อยนะครับ ขอบพระคุณครับ ♥
-
PAO YING CHUB in R-Programing
หลังจากที่ได้เรียน และศึกษาทางด้าน R-Language มาพอสมควร พอมาถึงตอนนี้ได้รับโจทย์ให้ลองเขียน Function สำหรับการเล่นเกมส์ง่ายๆ คือการเป่ายิ้งฉุบ และมีการนับคะแนน แพ้/ชนะ ระหว่างผู้เล่น และ บอท เดี๋ยวเรามาลองดู Function กัน และเดี๋ยวจะมีการอธิบายว่า Code ที่ระบุในแต่ละขั้นตอน ใช้ทำอะไรกันบ้างนะครับ

ภาพด้านบนจะเป็น Code ทั้งหมดที่ผมทำการเขียนเพื่อใช้เรียก Function การเล่นเกมส์นี้
ทีนี้เรามาย่อย และทำความเข้าใจ Code ในแต่ละ กระบวนการกันนะครับ
hand <- c("rock", "paper", "scis")- code ในบรรทัดแรก จะเป็นการสร้างตัวแปล hand เพื่อใช้ในการเก็บค่าตัวเลือกที่เป็นไปได้ทั้งหมด ในทีนี้คือ ค้อน(“rock”) กรรไกร(“scis”) และกระดาษ(“paper”)
play_game <- function() { user_score <- 0 Bot_score <- 0 print("Welcome to a New World") print("Let's Play a game!!")- code ถัดมาจะเป็นการระบุว่า จะสร้าง Function ที่ชื่อว่า “play_game()” หากพิมพ์ตามนี้จะเป็นการต้อนรับพร้อมกับเปิดการเล่นเกมส์ และนอกเหนือจากนั้น จะมีการนับ Score ด้วย โดยเริ่มต้นใน Score ของผู้เล่น และ บอท เริ่มที่ 0 คะแนนเท่ากัน
for (round in 1:10) { print(paste0("for_round: ",round)) user_h <- readline("You turn ..and (rock,paper,scis): ") while(!(tolower(user_h) %in% hand)) { user_h <- readline("Please choose again (rock, paper, scis): ") } bot_h <- sample(hand, 1) print(paste0("for round bot choose: ",bot_h))- สำหรับส่วนนี้จะเป็นส่วนสำคัญคือการเล่นเกมส์ และการนับจำนวนรอบ โดยสามารถอธิบายได้ดังนี้
- for (round in 1:10) {
print(paste0(“for_round: “,round))
จะเป็นการวนลูปการเล่น จำนวน 10 รอบ และประกาศว่าอยู่รอบที่เท่าไหร่อยู่ ณ ตอนนี้ - user_h <- readline(“You turn ..and (rock,paper,scis): “)
จะเป็นการขอให้ผู้เล่นป้อนตัวเลือก ว่าจะออก ค้อน กรรไกร หรือ กระดาษ - while(!(tolower(user_h) %in% hand)) {
user_h <- readline(“Please choose again (rock, paper, scis): “)
}
จะเป็นการตรวจสอบว่าตัวเลือกที่ผู้เล่นป้อน ตรงกับตัวเลือกที่ระบุในตอนต้นหรือไม่ (rock, paper, scis) หากไม่ใช่ ผู้เล่นจะต้องป้อนใหม่จนกว่าจะถูกต้อง - bot_h <- sample(hand, 1)
จะเป็นการที่ บอท จะทำการสุ่มตัวเลือก ตามที่มีระบุในตอนต้น (rock, paper, scis) - print(paste0(“for round bot choose: “,bot_h))
เป็นการแสดงตัวเลือกที่คอมพิวเตอร์เลือก
if (tolower(user_h) == bot_h) { print("Draw") } else if ((tolower(user_h) == "rock" && bot_h == "paper") | (tolower(user_h) == "paper" && bot_h == "scis") | (tolower(user_h) == "scis" && bot_h == "rock")) { print("You lose this round") Bot_score <- Bot_score + 1 } else { print("You win in this round!!!") user_score <- user_score + 1 } }- ส่วนรองสุดท้ายนี้จะเป็นการตัดสินผลแพ้ชนะในแต่ละรอบการเล่น โดยเป็นการกำหนดเงื่อนไขว่า
– หากตัวเลือกที่ผู้เล่นและบอท เลือกเป็นตัวเดียวกัน ประกาศผลว่า เสมอกัน
– หากตัวเลือกที่ผู้เล่นเลือก เป็นฝ่ายแพ้ บอท ประกาศว่า บอทชนะในรอบนั้นๆ
– หากตัวเลือกที่ผู้เล่นเลือก เป็นฝ่ายชนะ บอท ประกาศว่า ผู้เล่นชนะในรอบนั้นๆ
print("Final score") print(paste0("Your score: ", user_score )) print(paste0("Bot score: ", Bot_score)) if (user_score > Bot_score) { print("YOU A WINNER !!!") } else if (user_score == Bot_score) { print("DRAW Try Agian") } else { print("BOT WINNER !!!") } }- ส่วนสุดท้าย เป็นการแสดงผลคะแนน และประกาศผู้ชนะเมื่อเล่นครบ 10 รอบการแข่งขัน
- ถ้าหาก คะแนนผู้เล่น มากกว่าให้ประกาศว่าผู้เล่นชนะ
ถ้าหาก คะแนนบอท มากกว่าให้ประกาศว่าบอทชนะ และ
หากคะแนนเท่ากันให้ประกาศว่าเสมอกัน
