ลองใช้ Exponential smoothing model หาผู้ติดเชื้อ COVID-19 ในอีก 10 วันข้างหน้า
เขียนวันที่ 2 April 2020
ยังอยู่ในเรื่องของ COVID-19 วนไปวนมาและมันก็ดูเหมือนจะรุนแรงขึ้นเรื่อย ๆ ซะด้วยสิ วันนี้เลยจะมาลองทำ Model หาจำนวนผู้ติดเชื้อ COVID-19 ของไทย ในอีก 10 วันต่อจากนี้
จริง ๆ มีวิธีการหลากหลายมากในการทำ Model ทำนายผลออกมาสักค่านึง เดี๋ยววันหลังจะลองทำ Model หลาย ๆ แบบมาเทียบผลกัน แต่วันนี้มาลองใช้วิธี Exponential smoothing กันก่อน วิธีการดึงข้อมูลเคยทำให้ดูแล้ว ใน Blog ตอน ใช้ Python ดึงข้อมูล API ของ Corona-virus (COVID-19) แต่ว่าอย่าลืมเปลี่ยน API เป็น v2 นะ
โค้ดต่อจาก Blog ตอนนั้นได้เลย พอได้ข้อมูลมาแล้วก็เลือกเอาเฉพาะประเทศไทย เพื่อให้รันโมเดล ใช้ .loc[]
เลือกออกมาได้เลย
Code
เริ่มจาก Import
packages ทั้งหลายที่จำเป็นในการใช้ทำโมเดลในครั้งนี้ จากนั้นก็สร้าง list
ว่างเอาไว้เพื่อเก็บข้อมูลจาก loop
ที่กำลังจะเขียนต่อไป
เริ่มทำเพิ่มขึ้นครั้งละ 10 วัน เพื่อทำนายผลในอีก 10 วันข้างหน้า
อันนี้คือ Assumption ของโมเดล ดังนั้นเลยจำเป็นต้องเลือกข้อมูลเพิ่มขึ้นทีละ 10 วัน โดยเริ่มจากวันแรกที่มีข้อมูล คือ 22/01/2020 บวกไปอีก 10 วัน สามารถใช้ timedelta(day = x)
ในการหา x
วันข้างหน้าได้
คำถามต่อไปคือ เราจะต้องหาทั้งหมดกี่วัน? ง่าย ๆ คือนับข้อมูลทั้งหมด แล้วหารด้วย 10 เราก็จะได้จำนวนที่เราต้องทั้งหมด ในกรณีที่หารไม่ลงตัว ผมเลยใช้ math.ceil()
ในการ always roundup ตัวเลข จากนั้นก็ใช้มันเป็น parameter ใน for loop
ที่เหลือก็จะเป็นการ .fit()
model แล้ว ซึ่งสามารถเขียนตามได้เลย ที่อยากให้สนใจ คือ option ต่าง ๆ ในตัว Package เช่น trend=’add’, seasonal=’add’, seasonal_periods=10
ซึ่งพวกนี้สามารถปรับให้ effect ในโมเดลเบาหรือแรงได้เช่นกัน แต่วันนี้ไม่ได้เพิ่ม effect อะไรให้โมเดล แค่สั่งให้มันใส่ตัว trend และ seasonal เข้าไปด้วยเท่านั้น จากนั้นก็เป็นการจัดข้อมูลให้อยู่ในรูปของ Dataframe
เท่านั้นเอง
มาดูค่าที่ได้จากโมเดลกันบ้าง
การทดลอง .fit()
model รอบแรกจะเห็นว่าเส้นสีเขียว ยังเป็น Trend เดียวกับข้อมูลจริงอยู่ น่าจะมาจากจำนวนเคสของไทยยังไม่เยอะ และ Trend ของข้อมูลยังง่ายอยู่
การทดลองรอบที่ 2 ค่าจริงกับค่า Forecast เริ่มห่างจากันแล้ว เนื่องจากผู้ติดเชื้อในไทยยังไม่ได้เพิ่มขึ้นมาก ณ ช่วงเวลานั้น
การทดลองรอบที่ 3 ค่า Forecast กำลังจะกลับลงมาให้เป็นไปตามข้อมูลจริง แต่ว่า ณ เวลานั้นไทยกลับมีผู้ติดเชื้อเพิ่มมากขึ้น มันเลยมาเจอกันที่ตรงกลาง
การทดลองรอบที่ 4 ผู้ติดเชื้อไทยในไทย เพิ่มสูงมากแบบมาก ๆ เส้น Forecast ที่กำลังกลับลงมา Shift ตามไม่ทันเลย
การทดลองครั้งที่ 5 ผู้ติดเชื้อในไทยก็พุ่งอย่างก้าวกระโดด เส้น Forecast จับไม่ทันเลยจริง ๆ รูปนี้ไม่สวยเลย
การทดลองครั้งที่ 6 ผู้ติดเชื้อยังเพิ่มขึ้นอย่างต่อเนื่อง และเส้น Forecast เริ่มจะเห็น Trend ดังกล่าวแล้ว เลยกำลังเชิดหัวขึ้นเช่นกัน
การทดลองครั้งสุดท้าย ครั้งที่ 7 เพราะว่ามีข้อมูลถึงเท่านี้นะครับ จากโมเดลบอกว่าในอีก 10 ต่อจากนี้ (วันนี้วันที่ 02/04/2020) ประเทศไทยจะมีผู้ติดเชื้อสะสมทั้งหมด 2,056 คน ข้อมูลจำนวนผู้ติดเชื้อ ณ วันที่ 01/04/2020 คือ 1,771 ดังนั้นผู้ติดเชื้อในไทยในอีก 10 วันข้างหน้าจะเพิ่มขึ้นอีกราว ๆ 250 คน
ก็รอดูว่าจะใกล้เคียงไหม…