Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

[Python] เตรียมข้อมูลให้พร้อมสำหรับการวิเคราะห์ ด้วย Pandas library กัน

$
0
0

ระหว่างนั่งรอเครื่องบินไปจังหวัดเชียงใหม่ เจอข้อมูลที่น่าสนใจจาก sensor เกี่ยวกับสภาวะอากาศ จึงนำมาใช้ฝึกการ cleaning ข้อมูลด้วย Pandas library กันหน่อย โดยขั้นตอนการทำงานประกอบไปด้วย
  1. อ่านข้อมูลจากไฟล์ CSV
  2. ทำการจัดเรียงข้อมูล
  3. ทำการ transform ข้อมูลในแต่ละ column
  4. ทำการจัดการเรื่อง missing value
  5. การ 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 เอง
ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="4.py"] ได้ผลการทำงานดังนี้ ทำการเรียงข้อมูลกันหน่อย เนื่องจากข้อมูลของ sensor นั้น จะอยู่ในรูปแบบของ Time-serie ดังนั้นสิ่งที่เราต้องทำคือ เรียงข้อมูลด้วย Datetime (index) ซึ่งสามารถเขียน code ได้ดังนี้ [gist id="b055f158ce622d0a1d2d145523774309" file="5.py"] แสดงผลการทำงานดังนี้ เมื่อลองสังเกตุจะเห็นว่าข้อมูล Datetime มีซ้ำด้วย !! ทำการตรวจสอบในทุก ๆ วันพบว่ามีเวลาซ้ำกันคือ 00:00:00 (เที่ยงคืน) เป็นข้อมูลของการเริ่มวันและสิ้นวัน ดังนั้นทำการแก้ไขข้อมูลที่ซ้ำกันก่อน โดยสามารถเลือกได้ว่าจะเก็บข้อมูลแรกหรือสุดท้าย [gist id="b055f158ce622d0a1d2d145523774309" file="6.py"] ได้ผลการทำงานดังนี้ มาถึงตรงนี้น่าจะเรียงข้อมูลได้ดีพอประมาณ

ทำการแปลงข้อมูลให้อยู่ในรูปแบบที่ประมวลผลได้ (Transform)

ปัญหาของข้อมูลส่วนใหญ่คือ ข้อมูลที่จัดเก็บไม่สามารถนำมาประมวลผลได้ ตัวอย่างจากข้อมูลชุดนี้คือ column Wind dir (Wind direction) หรือทิศทางของลม
  • ENE ?
  • SSW ?
  • SW ?
ค่าที่เป็นไปได้ของ Wind direction มีกี่ค่า ? ดังนั้นมาดูหน่อยสิว่ามีค่าอะไรบ้าง [gist id="b055f158ce622d0a1d2d145523774309" file="7.py"] คำถามต่อมาคือ ค่าที่เป็นไปได้มีทั้งหมด 16 ค่า แล้วแต่ละตัวมันคืออะไร ? เราจะทำการแปลงอย่างไร ? เราจะทำการแปลงไปเป็นค่าตัวเลขอะไร ?
ปล. อย่าลืมว่า เราต้องมีความรู้ความเข้าใจกับข้อมูลด้วยเสมอ หรือถ้าไม่มีต้องมีผู้เชี่ยวชาญให้คำปรึกษาด้วยเสมอ
จากตัวอย่างทำการกำหนด 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 ข้อมูล
  • การกรองข้อมูล
  • การจัดกลุ่ม
ลองศึกษาเพิ่มเติมกันได้ ขอให้สนุกกับการ 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

Viewing all articles
Browse latest Browse all 1997

Trending Articles