วงแหวนเว็บ

neizod's speculation

insufficient data for meaningful answer

ประมาณค่าฝุ่น PM 2.5 ในกรุงเทพฯ ด้วยเทคนิค IDW

ไม่กี่สัปดาห์ก่อน กรุงเทพฯ ก็ได้ประสบพบเจอปัญหาฝุ่น PM 2.5 อีกครั้ง แน่นอนว่าเมืองใหญ่คนเยอะก็ย่อมมีการตื่นตัวสูงเป็นธรรมดา หนึ่งในสิ่งที่สะท้อนออกมาก็คือบัญชีทวิตเตอร์ @BangkokAQI ที่ทวีตภาพสรุปสถานการณ์ฝุ่นในพื้นที่ต่างๆ ทุก 3 ชั่วโมง ดังเช่นทวีตต่อไปนี้

แม้ผลลัพธ์จะออกมาสีสันสดใสสวยงาม อย่างไรก็ตามหากดูรายละเอียดภาพให้ดีแล้ว ก็คงปฏิเสธไม่ได้ว่ามันมีความผิดแผกแปลกไปจากธรรมชาติและการรับรู้ดั้งเดิมของเราอยู่มาก เช่นในช่วงข่าวฟ้าฝนพยากรณ์เรามักเห็นเส้นความกดอากาศตีวงโค้งเนียน ต่างจากภาพในทวีตที่แม้แต่ละเขตจะมีขอบที่เบลอ แต่เมื่อถอยออกมาดูแล้ว จะพบว่าเส้นต่างๆ เป็นเส้นตรงพร้อมมุมองศาชัดเจน

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

ปริมาณฝุ่น PM 2.5 ในกรุงเทพฯ ผ่านแผนภาพ Voronoi

อันที่จริงแล้วการวาดภาพแบ่งเขตฝุ่นด้วยแผนภาพ Voronoi คงไม่ใช่ตัวเลือกที่ดีเท่าไรนัก เพราะเราตีความให้ทุกจุดในแต่ละ cell มีค่าฝุ่นค่าเดียวกันหมด แม้ว่าจุดนั้นๆ จะห่างไกลจาก site แค่ไหนก็ตาม หากเรามีเครื่องมือวัดฝุ่นแบบเคลื่อนที่ เมื่อออกไปวัดฝุ่นในจุดที่อยู่ขอบ cell ก็มีโอกาสสูงมากที่จุดนั้นจะวัดค่าฝุ่นได้แตกต่างจากค่าฝุ่นจาก site นั้นๆ

เช่นนั้นแล้วเราจะมีวิธีประมาณค่าฝุ่นที่ดีกว่าวาดแผนภาพเช่นนี้หรือเปล่า? ก็ตอบได้ทันทีเลยว่ามี และมีหลากหลายวิธีมากๆ ด้วย กลุ่มเทคนิดการประมาณค่าตามพื้นที่เช่นนี้เรียกว่า multivariate interpolation โดยที่มีแผนภาพ Voronoi เป็นหนึ่งในเทคนิคพื้นฐาน (เทคนิคเพื่อนบ้านใกล้สุด)

สำหรับวิธีอื่นที่สามารถประมาณค่าและแสดงผลข้อมูลได้ (น่าจะ) ให้ผลลัพธ์ดูดีกว่าเทคนิคเดิมๆ คือการทำ invert distance weighting (IDW) ที่จะคาดเดาปริมาณฝุ่น ณ จุดใดๆ ผ่านการพิจารณาจุดทั้งหมดที่มีข้อมูลฝุ่นในแผนที่ ทั้งนี้เพื่อให้จุดที่อยู่ไกลไม่ส่งผลกระทบต่อการประมาณค่ามากเกินไป จึงให้น้ำหนักความสำคัญของข้อมูลแต่ละจุดแปรผกผันกับระยะห่างจากจุดที่ต้องการประมาณค่านั่นเอง

ซึ่งหัวใจสำคัญการคิดน้ำหนักในเทคนิค IDW สามารถหาได้ผ่านสมการ

\[w_i(x) = \frac1{d(x, x_i)^p}\]

โดยที่

  • $w_i$ คือน้ำหนักของข้อมูลตัวที่ $i$
  • $x_i$ คือตำแหน่งจุดข้อมูลตัวที่ $i$
  • $x$ คือตำแหน่งจุดที่เราต้องการประมาณค่า
  • $d$ ฟังก์ชันคำนวณระยะทางระหว่างจุด โดยส่วนมากจะใช้ Euclidean distance
  • $p$ ค่ากำลังของระยะทาง เป็นพารามิเตอร์ที่ผู้ใช้สามารถปรับค่าได้1

หลังจากนั้น ก็ประมาณค่า $u(x)$ ณ จุด $x$ ที่ต้องการ ด้วยสมการง่ายๆ ว่า

\[u(x) = \frac{ \sum\limits_{i=1}^N w_i(x)u_i }{ \sum\limits_{i=1}^N w_i(x) }\]

และจะได้ผลลัพธ์ออกมา ดังภาพต่อไปนี้2

ปริมาณฝุ่น PM 2.5 ในกรุงเทพฯ แบบประมาณด้วยเทคนิค IDW ที่ใช้ค่าน้ำหนักกำลัง 2

ดูสวยงามราบรื่นขึ้นเยอะ และน่าจะให้ผลลัพธ์ใกล้เคียงกับความเป็นจริงมากกว่าการใช้แผนภาพ Voronoi อย่างแน่นอน

แต่ถ้าอยากจะประมาณค่าให้ถูกต้องยิ่งขึ้นไปอีก ก็ควรต้องเพิ่มจำนวนสถานีวัดฝุ่นให้มีมากกว่านี้ ไม่ใช่ว่าใช้แค่ 4-5 สถานีมาประมาณค่าฝุ่นทั้งกรุงเทพฯ 😢😢😢

  1. หาก $p$ มีค่าเข้าใกล้ $+\infty$ จะได้ว่าผลลัพธ์กลายเป็นเป็นแผนภาพ Voronoi 

  2. สำหรับโค้ดวาดภาพการประมาณฝุ่นในภาษา Python สามารถดูได้ที่ gist นี้ 

Revision notes:

  • April 11, 2020:

    คุณ @zntfdr ผู้พัฒนา @BangkokAQI แจ้งมาว่าได้อัพเดทระบบให้ใช้ IDW ตามคำแนะนำของบทความนี้แล้ว เมื่อวันที่ 11 เมษายนครับ 🎉🎉🎉

neizod

author