ระหว่างนั่งรอเครื่องบินไปจังหวัดเชียงใหม่
เจอข้อมูลที่น่าสนใจจาก sensor เกี่ยวกับสภาวะอากาศ
จึงนำมาใช้ฝึกการ cleaning ข้อมูลด้วย Pandas library กันหน่อย
โดยขั้นตอนการทำงานประกอบไปด้วย
- อ่านข้อมูลจากไฟล์ CSV
- ทำการจัดเรียงข้อมูล
- ทำการ transform ข้อมูลในแต่ละ column
- ทำการจัดการเรื่อง missing value
- การ plotting หรือแสดงข้อมูลในรูปแบบ graph
การอ่านข้อมูลจากไฟล์ CSV
ใน pandas นั้นจะมี function การอ่านข้อมูลจากไฟล์ CSV ให้ ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="1.py"] ผลที่ออกมามันก็อ่านได้นะ แต่ไม่เป็นไปตามที่ต้องการ ทำไมมันมีเพียง 1 column ละ ? จะเห็นได้ว่าข้อมูลในแต่ละ column แบ่งด้วย tab (\t) ดังนั้นต้องใส่ parameter เพื่อกำหนดตัวแยกหรือ separator เป็น tab (\t) เพิ่มเติมใน function read_csv() นั่นเอง ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="2.py"] ผลที่ได้เป็นดังนี้ ซึ่งจะแยกข้อมูลออกเป็น column ตามที่ต้องการ จากข้อมูลจะพบว่า มีข้อมูลบางตัวเป็นค่า (-) หรือไม่มีข้อมูลนั่นเอง ดังนั้นสิ่งที่ต้องคิดและวิเคราะห์คือ จะเปลี่ยนเป็นอะไร เช่น NaN (Not a Number) เป็นต้น แน่นอนว่า เราสามารถกำหนดใน function read_csv() ได้ ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="2.py"] ได้ผลการทำงานดังนี้ มาถึงตรงนี้ สิ่งที่แปลก ๆ หน่อยคือ column Date และ Time แยกกัน !! คำถามที่เกิดขึ้นมาคือ มีการใช้งานข้อมูล Date และ Time หรือไม่ ? และใช้อย่างไร ? ถ้าบอกว่าต้องใช้งาน และ จำเป็นต้องรวมทั้งสองให้เป็น column เดียวคือ DateTime ก็สามารถทำใน function read_csv() ได้เช่นกัน- parse_dates กำหนดว่า column ไหนบ้างที่จะเป็น date โดยกำหนดให้รวมเป็น column เดียว
- dayfirst กำหนดให้รูปแบบของข้อมูลให้วันที่อยู่หน้าเดือน เช่น
- infer_datetime_format กำหนดให้ Pandas library เดา format ของ date เอง
ทำการแปลงข้อมูลให้อยู่ในรูปแบบที่ประมวลผลได้ (Transform)
ปัญหาของข้อมูลส่วนใหญ่คือ ข้อมูลที่จัดเก็บไม่สามารถนำมาประมวลผลได้ ตัวอย่างจากข้อมูลชุดนี้คือ column Wind dir (Wind direction) หรือทิศทางของลม- ENE ?
- SSW ?
- SW ?
ปล. อย่าลืมว่า เราต้องมีความรู้ความเข้าใจกับข้อมูลด้วยเสมอ หรือถ้าไม่มีต้องมีผู้เชี่ยวชาญให้คำปรึกษาด้วยเสมอจากตัวอย่างทำการกำหนด Wind direction แต่ละตัวด้วยองศา จากนั้นทำการเรียกใช้ method apply() ในแต่ละ column ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="8.py"] ได้ผลการทำงานดังนี้
เมื่อทำการทำความสะอาดข้อมูลได้เป็นที่น่าพอใจแล้ว
ก็ลองทำการแสดงในรูปแบบกราฟหน่อยสิ ด้วย library ที่ใคร ๆ ก็ใช้คือ matplotlib เพื่อแสดงข้อมูลจาก column ต่าง ๆ โดยใช้ข้อมูล 500 row แรกก็พอ เพื่อดูว่าข้อมูลมีปัญหาอะไรหรือไม่ ? [gist id="b055f158ce622d0a1d2d145523774309" file="9.py"] ผลการทำงานเป็นดังนี้ ถ้าสังเกตุดี ๆ จะเห็นว่ามีข้อมูลในบางช่วงไม่มี !! ทำให้เส้นในกราฟมันขาด ๆ หาย ๆ เป็นช่วง ๆ แสดงดังรูป ดังนั้นสิ่งที่เราต้องทำคือ เพิ่มข้อมูลใหม่เข้ามา เพื่อทำให้กราฟเส้นไม่ขาด โดยใน pandas library นั้นจะมี Series.interpolate() ให้ใช้งาน [gist id="b055f158ce622d0a1d2d145523774309" file="10.py"] ผลที่ได้จะเป็นดังรูปมาถึงตรงนี้น่าจะพอทำให้เห็นว่า
ข้อมูลเป็นอย่างไร เริ่มเข้าใจรายละเอียดของข้อมูล เริ่มจัดการข้อมูลต่าง ๆ ให้อยู่ในรูปแบบที่ประมวลผลได้ จากที่พาทำมาคือ ขั้นตอนของการเตรียมข้อมูลให้พร้อมต่อการวิเคราะห์ ซึ่งเป็นหัวใจของการวิเคราะห์ข้อมูลการเลยยังมีเรื่องอื่น ๆ อีก เช่น
- การตรวจสอบ missing data
- การจัดการข้อมูล missing data
- การ cleaning ข้อมูล
- การกรองข้อมูล
- การจัดกลุ่ม
ปล. ที่ทำมานั้นสามารถทำได้ใน 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