ระหว่างนั่งรอเครื่องบินไปจังหวัดเชียงใหม่
เจอข้อมูลที่น่าสนใจจาก sensor เกี่ยวกับสภาวะอากาศ
จึงนำมาใช้ฝึกการ cleaning ข้อมูลด้วย Pandas library กันหน่อย
โดยขั้นตอนการทำงานประกอบไปด้วย
- อ่านข้อมูลจากไฟล์ CSV
- ทำการจัดเรียงข้อมูล
- ทำการ transform ข้อมูลในแต่ละ column
- ทำการจัดการเรื่อง missing value
- การ plotting หรือแสดงข้อมูลในรูปแบบ graph
มาเริ่มกันหน่อย
การอ่านข้อมูลจากไฟล์ CSV
ใน pandas นั้นจะมี function การอ่านข้อมูลจากไฟล์ CSV ให้ ดังนี้
ผลที่ออกมามันก็อ่านได้นะ
แต่ไม่เป็นไปตามที่ต้องการ
ทำไมมันมีเพียง 1 column ละ ?
จะเห็นได้ว่าข้อมูลในแต่ละ column แบ่งด้วย tab (\t)
ดังนั้นต้องใส่ parameter เพื่อกำหนดตัวแยกหรือ separator เป็น tab (\t)
เพิ่มเติมใน function read_csv() นั่นเอง ดังนี้
ผลที่ได้เป็นดังนี้
ซึ่งจะแยกข้อมูลออกเป็น column ตามที่ต้องการ
จากข้อมูลจะพบว่า มีข้อมูลบางตัวเป็นค่า (-) หรือไม่มีข้อมูลนั่นเอง
ดังนั้นสิ่งที่ต้องคิดและวิเคราะห์คือ จะเปลี่ยนเป็นอะไร เช่น NaN (Not a Number) เป็นต้น
แน่นอนว่า เราสามารถกำหนดใน function read_csv() ได้ ดังนี้
ได้ผลการทำงานดังนี้
มาถึงตรงนี้ สิ่งที่แปลก ๆ หน่อยคือ column Date และ Time แยกกัน !!
คำถามที่เกิดขึ้นมาคือ
มีการใช้งานข้อมูล Date และ Time หรือไม่ ? และใช้อย่างไร ?
ถ้าบอกว่าต้องใช้งาน และ จำเป็นต้องรวมทั้งสองให้เป็น column เดียวคือ DateTime
ก็สามารถทำใน function read_csv() ได้เช่นกัน
- parse_dates กำหนดว่า column ไหนบ้างที่จะเป็น date โดยกำหนดให้รวมเป็น column เดียว
- dayfirst กำหนดให้รูปแบบของข้อมูลให้วันที่อยู่หน้าเดือน เช่น
- infer_datetime_format กำหนดให้ Pandas library เดา format ของ date เอง
ดังนี้
ได้ผลการทำงานดังนี้
ทำการเรียงข้อมูลกันหน่อย
เนื่องจากข้อมูลของ sensor นั้น จะอยู่ในรูปแบบของ Time-serie
ดังนั้นสิ่งที่เราต้องทำคือ เรียงข้อมูลด้วย Datetime (index)
ซึ่งสามารถเขียน code ได้ดังนี้
แสดงผลการทำงานดังนี้
เมื่อลองสังเกตุจะเห็นว่าข้อมูล Datetime มีซ้ำด้วย !!
ทำการตรวจสอบในทุก ๆ วันพบว่ามีเวลาซ้ำกันคือ 00:00:00 (เที่ยงคืน)
เป็นข้อมูลของการเริ่มวันและสิ้นวัน
ดังนั้นทำการแก้ไขข้อมูลที่ซ้ำกันก่อน
โดยสามารถเลือกได้ว่าจะเก็บข้อมูลแรกหรือสุดท้าย
ได้ผลการทำงานดังนี้
มาถึงตรงนี้น่าจะเรียงข้อมูลได้ดีพอประมาณ
ทำการแปลงข้อมูลให้อยู่ในรูปแบบที่ประมวลผลได้ (Transform)
ปัญหาของข้อมูลส่วนใหญ่คือ
ข้อมูลที่จัดเก็บไม่สามารถนำมาประมวลผลได้
ตัวอย่างจากข้อมูลชุดนี้คือ column Wind dir (Wind direction) หรือทิศทางของลม
- ENE ?
- SSW ?
- SW ?
ค่าที่เป็นไปได้ของ Wind direction มีกี่ค่า ?
ดังนั้นมาดูหน่อยสิว่ามีค่าอะไรบ้าง
คำถามต่อมาคือ ค่าที่เป็นไปได้มีทั้งหมด 16 ค่า แล้วแต่ละตัวมันคืออะไร ?
เราจะทำการแปลงอย่างไร ?
เราจะทำการแปลงไปเป็นค่าตัวเลขอะไร ?
ปล.
อย่าลืมว่า เราต้องมีความรู้ความเข้าใจกับข้อมูลด้วยเสมอ
หรือถ้าไม่มีต้องมีผู้เชี่ยวชาญให้คำปรึกษาด้วยเสมอ
จากตัวอย่างทำการกำหนด Wind direction แต่ละตัวด้วยองศา
จากนั้นทำการเรียกใช้ method apply() ในแต่ละ column ดังนี้
ได้ผลการทำงานดังนี้
เมื่อทำการทำความสะอาดข้อมูลได้เป็นที่น่าพอใจแล้ว
ก็ลองทำการแสดงในรูปแบบกราฟหน่อยสิ
ด้วย library ที่ใคร ๆ ก็ใช้คือ matplotlib
เพื่อแสดงข้อมูลจาก column ต่าง ๆ
โดยใช้ข้อมูล 500 row แรกก็พอ เพื่อดูว่าข้อมูลมีปัญหาอะไรหรือไม่ ?
ผลการทำงานเป็นดังนี้
ถ้าสังเกตุดี ๆ จะเห็นว่ามีข้อมูลในบางช่วงไม่มี !!
ทำให้เส้นในกราฟมันขาด ๆ หาย ๆ เป็นช่วง ๆ
แสดงดังรูป
ดังนั้นสิ่งที่เราต้องทำคือ เพิ่มข้อมูลใหม่เข้ามา
เพื่อทำให้กราฟเส้นไม่ขาด
โดยใน pandas library นั้นจะมี Series.interpolate() ให้ใช้งาน
ผลที่ได้จะเป็นดังรูป
มาถึงตรงนี้น่าจะพอทำให้เห็นว่า
ข้อมูลเป็นอย่างไร
เริ่มเข้าใจรายละเอียดของข้อมูล
เริ่มจัดการข้อมูลต่าง ๆ ให้อยู่ในรูปแบบที่ประมวลผลได้
จากที่พาทำมาคือ ขั้นตอนของการเตรียมข้อมูลให้พร้อมต่อการวิเคราะห์
ซึ่งเป็นหัวใจของการวิเคราะห์ข้อมูลการเลย
ยังมีเรื่องอื่น ๆ อีก เช่น
- การตรวจสอบ missing data
- การจัดการข้อมูล missing data
- การ cleaning ข้อมูล
- การกรองข้อมูล
- การจัดกลุ่ม
ลองศึกษาเพิ่มเติมกันได้
ขอให้สนุกกับการ coding ครับ
ปล. ที่ทำมานั้นสามารถทำได้ใน Spreadsheet program ได้หมดนะ
แต่ถ้าข้อมูลมันเยอะ ๆ แล้ว Pandas library จะเหมาะมาก ๆ
Reference Websites
https://opensource.com/article/17/9/messy-sensor-data
https://www.oreilly.com/learning/handling-missing-data
https://chrisalbon.com/python/pandas_missing_data.html