สร้างโมเดลพยากรณ์น้ำท่วม ด้วยภาษา R

ในภาวะที่อากาศเปลี่ยนแปลงบ่อย วันหนึ่งมี 3 ฤดูก็เป็นได้ เช้าหนาว บ่ายร้อน เย็นฝนตก กลางคืนตกหนักกว่าเดิม จนตอนเช้า อ้าวเห้ย!! ไม่เหมือนที่คุยกันไว้นี่หว่า!!  น้ำท่วมซะงั้น ซึ่งในหลายๆปีที่ผ่านมาก็ได้เกิดเหตุการณ์เช่นนี้บ่อยครั้ง ทั้งในประเทศและต่างประเทศ หน่วยงานหลายหน่วยงานก็ได้มีการแจ้งเตือนปริมาณน้ำฝนที่จะตกในแต่ละพื้นที่ มีการแจ้งเตือนให้ป้องกัน ให้หลีกเลี่ยงเส้นทางน้ำท่วมต่างๆ แต่ในบางครั้งเราก็ไม่ทันได้ทราบข่าวได้ติดตาม ฝนตกลงมาหนัก น้ำก็ท่วมละสิ (ถ้าไม่เรียกน้ำท่วมก็ เรียก น้ำรอการระบาย ก็ได้นะ 555+ ก็รอระบายออกจริงๆ หนิ )

ถ้าเราสามารถคาดการณ์ปริมาณน้ำที่จะท่วมได้ละ มันจะดีมั้ย ก็เรามีข้อมูลของปริมาณน้ำ และ ปริมาณน้ำฝน จากกรมอุตินิยมวิทยาบ้านเรานี่เอง แต่ไม่ใช่ว่าเรารู้ ข้อมูลเหล่านี้จะบอกได้เลยว่า วันนี้ฝนจะตกหนัก วันนี้น้ำจะท่วม เราต้องมีเครื่องมือเข้ามาช่วย นั้นคือ นั่นคือ นั่นคือ (ยัง ยัง จะเล่นอีก 555+) R แล้ว ​R คืออะไร ติดตั้งยังได้ มาเริ่มกันเลยดีกว่า

R คืออะไร?

R เป็นภาษาทางโปรแกรมเมอร์ ทาง Data Scientist หลายคนที่เรียนมาในสาย statistic หรือ mathematic อาจเคยได้เรียน ได้ยิน ได้ลองจับมาวิเคราะห์ข้อมูลกันบ้าง R นั่นมีประโยชน์มาในการวิเคราะห์ข้อมูล ทำการพยากรณ์ และอื่นๆ อีกหลายอย่างที่เกี่ยวข้องกับเหล่าข้อมูลปริมาณเยอะๆ ที่มองด้วยตาก็ตาลายกันไปข้างหนึ่ง

 

R พยากรณ์ ​(มาอย่างกับหมอดูพยากรณ์) ได้อย่างไร?

เราก็จะใช้วิธีการทางสถิติ มาใช้เพื่อหารูปแบบพยากรณ์ของเรา ซึ่งจะต้องใช้ค่าของตัวแปรต่างๆที่มีความเกี่ยวข้องกัน (อ่านแล้วยัง งง มาดูตัวอย่างกันก่อน) เช่น เราต้องการหาราคาของบ้าน ตัวแปรที่จะส่งผลต่อราคาของบ้าน ได้แก่ ขนาด จำนวนห้อง ระยะทางใกล้/ไกลจากตัวเมือง ฯลฯ เป็นต้น

เมื่อเรารู้ตัวแปรเหล่านี้ก็สามารถนำมาหารูปแบบหรือโมเดลที่เหมาะสมในค่าของข้อมูลที่เราต้องการได้

เริ่มติดตั้ง R ละกัน

  • เริ่มแรกดาวน์โหลด และติดตั้ง https://www.rstudio.com/ ซึ่งเป็นเครื่องมือในการเขียนพร้อมรันกราฟ หรือใครจะใช้ command line โค้ดพร้อมรันเลยก็ได้ (ซึ่งในตัวอย่างต่อไปเราจะรันโดยใช้ command line นี่แหละ)
  • โหลดตัวย่างข้อมูลกันก่อน https://raw.githubusercontent.com/davidsalgado/BlogSamples/master/FirstPredictiveModelWithR/RentalFeatures.txt ข้อมูลตัวอย่างนี้จะแสดงข้อมูลเป็นรายปี

มาเริ่มเขียนพยาการณ์กันเลย เอ้ย!! พยากรณ์ เอ้ย!! ถูกแล้ว

ทดสอบ R ใน command line สักหน่อย

โอเคผ่าน มาเริ่มเขียนโค้ดได้

#ทำการอ่านข้อมูลจากไฟล์ตัวอย่าง RentalFeatures.txt ลงตัวแปร mydata

>mydata = read.table(“~/RentalFeatures.txt”, header=TRUE)

#ทำการกำหนดให้คอลัมน์แรกชื่อ Year

> colnames(mydata)[1] <- “Year”

# ปริ้นข้อมูลมาดูซักหน่อย

> head(mydata)

#สร้าง field ชื่อ FHoliday, FSnow และ FWeekDay

> mydata$FHoliday = factor(mydata$Holiday)

> mydata$FSnow = factor(mydata$Snow)

> mydata$FWeekDay = factor(mydata$WeekDay)

#สร้างตัวแปร train_data โดยเลือกปีที่ น้อยกว่า 2015

> train_data = mydata[mydata$Year < 2015,]

#สร้างตัวแปร test_data โดยเลือกปีที่ 2015

> test_data = mydata[mydata$Year == 2015,]

#สร้างตัวแปร test_counts โดยมาจากคอลัมน์ RentalCount ของ test_data

> test_counts <- test_data$RentalCount

รันโค้ดจากตัวอย่าง

ก่อนที่จะทำโมเดลพยากรณ์ มาลอง plot กราฟดู กันก่อน

> plot(mydata$Snow, mydata$RentalCount)

> plot(factor(mydata$Snow), mydata$RentalCount)

> plot(factor(mydata$WeekDay), mydata$RentalCount)

> plot(ISOdate(mydata$Year, mydata$Month, mydata$Day), mydata$RentalCount)

อาจงง ว่า ทำไมกราฟแต่ละกราฟออกมาเป็นรูปแบบที่ไม่เหมือนกันนั้นก็ขึ้นอยู่กับ ประเภทของข้อมูลซึ่งกราฟที่ถูกจัดเป็นกลุ่มๆ ก็จะใช้ คำสั่ง factor เพื่อแยกข้อมูลแต่ละแถวเป็นกลุ่ม

ทีนี้และทีนี้และก็ทีนี้ (จะเยอะไปไหน 555+)

สร้างโมเดลจากค่าตัวแปรที่เรามี let GO!!!

# lm (linear regression algorithm) เพื่อสร้างโมเดลจาก ค่าตัวแปรต่างๆที่เรามีอยู่

> model=lm(RentalCount ~ Month + Day + FWeekDay + FSnow + FHoliday, train_data,)

# predict ฟังก์ชันที่ใช้สำหรับ พยากรณ์ ซึ่งสามารถเลือกใช้ได้จาก R

> p = predict(model, test_data)

# สร้างโมเดลแล้วก็ปริ้นกราฟมาดูได้เลย

> plot(p – test_counts)

เห็นกราฟที่ปริ้นมา งง รึเปล่า? กราฟทำการ plot ตามค่าพยากรณ์ ที่ได้จาก โมเดลของฟังก์ชัน lm ซึ่งอาจดูยากได้ซักหน่อยแต่เดี๋ยวเราจะมา ใช้ predict แสดงค่าพยากรณ์แต่ละวันออกมา

อีกฟังก์ชันหนึ่งในการสร้างโมเดลพยากรณ์ rpath มาลองดูกัน

# เพิ่ม lib rpath มาก่อนเลย

> library(rpart)

# สร้างโมเดลจาก ฟังก์ชัน rpath

> model=rpart(RentalCount ~ Month + Day + FWeekDay + FSnow + FHoliday, train_data,)

# ลองปริ้นกราฟมาดูกัน

> p = predict(model, test_data)

> plot(p – test_counts)

จากกราฟทั้ง 2 ที่ใช้ฟังก์ชันการสร้างโมเดล lm และ rpath จะเห็นว่าทั้ง คู่สามารถพยากรณ์ออกมาได้ใกล้เคียงกัน แต่จะ lm จะค่อยมีการกระจายของมูลที่มากกว่า  rpath แล้วแต่ว่าเราจะเลือกใช้ฟังก์ชันไหนในการสร้างโมเดล

ทีนี้ก็หลังจากดูกราฟแล้วลองมาปริ้นเป็นค่าตามวันที่เราต้องการเลยดีกว่า

ใช้โมเดลจาก lm

> predict(model, data.frame(Month = 1, Day = 1, FWeekDay = factor(7), FSnow = factor(1), FHoliday = factor(0)))

#หาค่าพยากรณ์วันที่ 7 ของสัปดาห์ นั่นคือวันอาทิตย์

ได้ค่า 475.4587

 

ใช้โมเดลจาก rpath

> predict(model, data.frame(Month = 1, Day = 1, FWeekDay = factor(7), FSnow = factor(1), FHoliday = factor(0)))

ได้ค่า 645.7059

จากทั้งหมดนี้เราก็สามารถ ทำโมเดลการพยากรณ์ค่าต่างๆ ที่เราต้องการจากข้อมูลย้อนหลังได้โดยอาจมีการเปลี่ยนแปลงค่าข้อมูล ตามแต่เราสนในได้เลย จะทำการพยากรณ์ น้ำท่วม ฝนตก แดดออกก็ได้ (แดดออกนี่ไม่น่าใช่ 555+ เผื่อข้อมูลหลายๆ แบบ)

สำหรับบล็อกนี้ก็มีการอธิบายเพียงเท่านี้ เจอกันในบล็อกต่อๆไป 😀

. . . . . . . . . . .

หากว่าคุณกำลังสนใจการสร้างโมเดลพยากรณ์ หรือทำงานอื่นๆ ที่เกี่ยวกับ Big Data, ทีม บานาน่าโคดดิ้ง ของเรา มีทีมงานผู้เชี่ยวชาญที่จะช่วยให้งานของคุณสำเร็จได้อย่างสมบูรณ์ สามารถดูรายอะเอียดได้ที่ BananaCoding.com/big-data