ข้อมูลมันสกปรกอะไรขนาดนั้น ทำไมต้องเสียเวลามากมายทำความสะอาด?

เป็นเรื่องที่รู้กันในวงการ data science ว่าการทำความสะอาดข้อมูลนั้นกินเวลาถึง 70–80% ของการทำงาน นักวิทยาศาสตร์ข้อมูล (data scientist) หลายคนถึงกับบอกว่าตัวเองเป็น data janitor หรือภารโรงข้อมูล ซะมากกว่า

ทำความสะอาดข้อมูลคือทำอะไร?

เวลาพูดว่า “ทำความสะอาด”หลายๆคนมักจะนึกถึงเพียงการแก้ไขข้อมูลที่ผิดพลาด เช่น สะกดชื่อผิด ตัวเลขไม่ถูกต้อง เป็นต้น จริงๆแล้วนั่นเป็นเพียงส่วนหนึ่งของกระบวนการทั้งหมด เป้าหมายคือทำให้ข้อมูลดิบอยู่ในรูปแบบที่ใช้งานได้และให้ผลลัพธ์ที่ถูกต้อง ในงานวิจัยจะเรียกกระบวนการนี้ว่า “data wrangling หรือ “การทะเลาะกับข้อมูล” ซึ่งให้ความหมายครอบคลุมกว่า แต่ปกติก็จะเรียกกันง่ายๆว่า “data cleaning” นั่นแหละ

แล้วมีปัจจัยอะไรบ้างที่ทำให้ต้องทำความสะอาดกันอุตลุดแบบนั้น ลองมาดูกันครับ

1. ข้อมูลถูกเก็บไว้ในหลากหลายประเภทไฟล์

ประเภทไฟล์ข้อมูลแต่ละแบบมีความยากง่ายในการนำมาใช้ต่างกัน ทั้งนี้ก็ขึ้นอยู่กับเครื่องมือที่ใช้ในการวิเคราะห์ด้วยว่ารองรับ input ในรูปแบบไหนบ้าง เราก็ต้องแปลงให้ตรงตามนั้น

  • standard text files (.csv, .tsv, .json, .xml) — พวกนี้ค่อนข้างพร้อมใช้งาน เครื่องมือส่วนใหญ่รองรับ
  • text files ใน format อื่นๆที่ไม่ใช่มาตรฐาน — แบบนี้ก็มีงานเพิ่มครับ เพราะว่าต้องดูก่อนว่า format แปลกประหลาดที่ได้มานี้เป็นยังไง ก่อนจะแปลงให้อยู่ในรูปแบบที่ใช้งานได้
  • spreadsheet (Excel/Google sheets) — พวกนี้ก็ยังเอาออกมาใช้งานได้ไม่ยาก สามารถแปลงเป็น csv หรือ tsv ได้ค่อนข้างสะดวก
  • PDF — เป็นประเภทเจ้าปัญหา เพราะเอามาใช้ทันทีไม่ได้ ต้องหาทางแปลงกลับเป็น format อื่นๆ เช่น excel ก่อน เนื่องจาก PDF เป็น format ที่ออกแบบมาให้เหมือนกระดาษ คือ ไม่ว่าเปิดเครื่องไหนก็หน้าตาเหมือนเดิม แต่ไม่ได้ออกแบบมาให้ copy ข้อมูลออกไปทำอย่างอื่นได้สะดวก
  • ฐานข้อมูล (database)— มีความยากง่ายในการเอาข้อมูลออกมาตามความซับซ้อนของฐานข้อมูล เช่น ฐานข้อมูลที่มี 100 tables จะหาว่าสิ่งที่เราต้องการอยู่ใน table ไหนก็อาจจะต้องใช้เวลาสักพัก
  • website — บางทีเราจะพบว่ามีข้อมูลที่เราต้องการอยู่ในหน้าเว็บเช่น wikipedia เราก็ต้อง copy ด้วยมือ หรือเขียน script เพื่อไปดึงข้อมูลจากหน้าเว็บ (web scraping) มาลงไฟล์

บางทีเราก็ต้องใช้ข้อมูลจากหลายๆแหล่งซึ่งอยู่ใน format ที่ต่างกันร่วมกัน อาจจะต้องแปลงให้เป็น format เดียวกันก่อน

นอกจากนี้ ถ้าทำเว็บ ขนาดไฟล์ข้อมูลมีความสำคัญมาก ต้องรวมให้เล็กที่สุดเพื่อให้โหลดเร็วๆ ถ้าข้อมูลชุดหนึ่งเป็น json อีกอันเป็น csv เราก็อาจจะพิจารณาแปลง csv เป็น json แล้วรวมไฟล์ทั้งสองเข้าด้วยกันจะได้ลดจำนวนไฟล์ และกำจัดสิ่งไม่จำเป็นออกจากไฟล์ไปให้หมด

2. ข้อมูลไม่อยู่ในรูปแบบที่ต้องการ

เมื่อเดือนก่อนผมได้ร่วมทำงานชิ้นหนึ่งเกี่ยวกับข้อมูลกรุงเทพฯ (https://tvirot.github.io/bkkviz/) และต้องการเปรียบเทียบจำนวนวัดกับอาบอบนวด ข้อมูลที่หามาได้มีพิกัด (latitude, longitude) ของวัดทุกแห่ง แต่อาบอบนวดมีเพียงจำนวนตามเขต เราจึงต้องแปลงพิกัดของวัดเป็นเขต แล้วนับจำนวนวัดแบ่งตามเขต เพื่อจะให้ข้อมูลทั้งสองชุดเปรียบเทียบกันได้

3. การเก็บข้อมูลมักมีข้อผิดพลาด

ข้อมูลที่เก็บโดยคนก็มีข้อจำกัดของมนุษย์ทั่วไป ลืมบ้าง ขี้เกียจบ้าง สะกดผิดบ้าง จดผิดบ้าง กะเอาแล้วผิดพลาดบ้าง ยิ่งถ้าบวกกับการแปลงจากเอกสารเขียนมือเป็นอิเล็กทรอนิคส์อีกขั้นตอนหนึ่งก็เพิ่มความสนุกสนานได้ไม่น้อย

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

นอกจากนี้การเก็บข้อมูลอัตโนมัติบางครั้งก็มีข้อจำกัด เช่น app บางตัวรวบรวม log การใช้งาน (click, change page, scroll, etc.) แล้วส่งไปที่ server ทุกๆ 1 นาที ดังนั้นแม้จะส่ง log ไป 100 events แต่ timestamp ที่ถูกบันทึกลงใน database ของทั้ง 100 events นั้นก็เป็นเวลาเดียวกัน คือเวลาที่มาถึง server ไม่ใช่เวลาที่ event นั้นเกิดขึ้นจริงๆ ถ้าจะเอามาเรียงลำดับก่อนหลังว่าเกิดอะไรขึ้นบนเครื่อง user ก็ลำบาก

การจัดการกับข้อมูลที่ผิดพลาดมีความยากง่ายต่างกันไปแล้วแต่กรณี บางครั้งก็ต้องตัดสินใจว่าจะทำอย่างไรกับข้อมูลที่กรอกมาไม่ครบ จะโยนทิ้งไปเฉยๆหรือว่าใส่ค่า default เข้าไปแทน ถ้าข้อมูลหายไปจะทำอย่างไร ใช้ข้อมูลวันอื่นแทนได้ไหม ถ้าข้อมูลผิด สามารถแก้เป็นข้อมูลที่ถูกได้ไหม

4. นิยามของคำว่า “สะอาด” ต่างกันไปในแต่ละโครงการ

ลองดูข้อมูลให้คะแนนร้านอาหารข้างล่างนี้

user  restaurant  rating
A     mcdonald’s  3
B     mcdonalds   3
C     mcdonald    4
D     mcdonalds   5
E     KFC         4
f     subway      4
  • ถ้าถามว่ามีรีวิวกี่อัน ก็ถือว่าสะอาดพอและสามารถตอบได้ทันที
  • แต่ถ้าถามว่ามีร้านอาหารในระบบกี่ร้าน ก็ต้องไปทำความสะอาดชื่อ McDonald’s ให้เขียนเหมือนกันเสียก่อนถึงจะตอบได้

ในการทำงานจริงๆก็เป็นแบบนี้แหละ ตอนแรกอยากรู้อย่างนึง ทำความสะอาดจนตอบได้ เกิดคำถามใหม่ พบปัญหาในข้อมูลใหม่ ก็ต้องทำความสะอาดก่อน ถึงจะวิเคราะห์กันต่อได้

ต่อให้หลายคนทำงานบนชุดข้อมูลเดียวกัน แต่ถ้าคนละโครงการ ขอบเขตของคำถามก็อาจจะแตกต่างกันไป ทำให้สุดท้ายแล้ว สะอาดของผม กับ สะอาดของคุณ ก็ไม่เหมือนกันอยู่ดี

5. ข้อมูลจำนวนมากก็ปัญหามาก

ปัญหาอย่างแรกคือไม่รู้ว่ามีปัญหา ข้อมูลที่ใหญ่มากๆ เราไม่สามารถนั่งไล่อ่านจนหมด เช่น ถ้าข้อมูลรีวิวร้านอาหารข้างบนมีสักหนึ่งล้านแถว เราอาจจะไม่รู้ก็ได้ว่ามีคนสะกด McDonald’s ผิด

เมื่อหลายเดือนก่อนผมเคยทำงานชิ้นหนึ่งเกี่ยวกับ Game of Thrones ซึ่งส่วนหนึ่งต้องนับว่าตัวละครถูกพูดถึงบน Twitter บ่อยแค่ไหนในแต่ละตอน ในตอนนึงตัวละครที่ชื่อ Ramsay มีบทบาทเด่นมาก และเมื่อนับว่า “Ramsay” ปรากฏในทวีตกี่ครั้งก็แสดงให้เห็นว่าถูกกล่าวถึงบ่อยทีเดียว อยู่มาวันนึงผมก็เอะใจขึ้นมาว่าจะมีคนสะกด Ramsay ผิดเป็น Ramsey รึเปล่านะ ผลที่ได้คือเพียบเลยครับ ต้องแก้งานใหม่เพราะตัวเลขเพิ่มขึ้นเกือบเท่าตัว

ปัญหาถัดไปคือใช้เวลามาก

  • ข้อมูลเล็กมากๆ นั่งแก้ไขด้วยมือได้
  • ข้อมูลเล็กๆ เขียน script เพื่อทำความสะอาดสามารถรันเสร็จในไม่กี่วิ
  • ข้อมูลใหญ่ขึ้นมาหน่อย รัน script ทำความสะอาดเสร็จในไม่กี่นาที
  • big data รัน script แล้วไปกินข้าวกลับมายังไม่เสร็จเลย

6. ยิ่งวิเคราะห์ไป ปัญหาก็ยิ่งเผยตัวออกมาเรื่อยๆ

บ่อยครั้งเหลือเกินที่คุณนึกว่าทำความสะอาดเรียบร้อยแล้ว เมื่อนำไปใช้งาน ก็พบว่ามีบางอย่างน่าสงสัย สุดท้ายก็เจอว่ามันคือปัญหาในข้อมูล ต้องกลับไปนั่งปัดกวาดขยะอีกรอบ ทำวนไปครับ นี่แหละชีวิต

ผมเคยทำงานเปรียบเทียบระหว่างแต่ละรัฐของสหรัฐอเมริกา ดึงข้อมูล แปลงข้อมูล ทำทุกอย่างจนวาดแผนที่ลงสีได้เรียบร้อยสวยงาม จากนั้นก็ใส่ tooltip ให้ดูจำนวนข้อมูลในแต่ละรัฐ ทำเสร็จก็นั่งกดเล่นดูด้วยความสบายใจว่าจะเสร็จแล้ว ปรากฏว่าเฮ้ยทำไมรัฐ Kansas มันมีคนเยอะขนาดนี้ คือ Kansas นี่อยู่กลางประเทศและไม่มีเมืองใหญ่ๆเลย ถ้าจะมีข้อมูลเยอะกว่า New York หรือ California นี่เป็นอะไรที่แปลกพึลึกมาก ไล่ถามย้อนไปมาสรุปว่าชุดข้อมูลที่ใช้เนี่ย ความแม่นยำของพิกัดการันตีที่ระดับประเทศ พูดง่ายๆคือถ้าเกิด user คนไหนไม่มีตำแหน่งที่ละเอียดพอ รู้แค่ว่าอยู่อเมริกา ก็จะใส่พิกัดให้เขาคนนั้นเป็น กลางประเทศอเมริกา นั่นละครับ Kansas

Kansas map
Kansas

ข้อแนะนำ

ในเมื่อรู้แล้วว่าเป็นแบบนี้ ก็จงคิดเสมอว่าต้องทำหลายรอบแน่นอนครับ จะหวังทำความสะอาดรอบเดียวเสร็จนี่ยาก

  • พยายามอย่าแก้โดยการถึกมือ หรือถ้าทำก็จดบันทึกไว้ด้วยว่าทำอะไรลงไป ถ้าได้ข้อมูลมาใหม่จะได้ทำซ้ำได้
  • เขียน script ที่รันซ้ำได้ทันทีถ้าได้ข้อมูลมาใหม่
  • แบ่ง script เป็นส่วนย่อยๆ ที่สามารถนำมาใช้ซ้ำได้กับปัญหาแบบเดิมในอนาคต

มี tool หลายตัวเหมือนกัน ที่พยายามแก้ปัญหาเหล่านี้ จะลองใช้ดูก็ได้ครับ

  • Mr. Data Converter — เป็น tool ง่ายๆที่เอาไว้ copy paste จาก excel เป็น csv, xml, json, etc.
  • Trifacta Wrangler — เป็นผลิตภัณฑ์ที่ต่อยอดมากจากงานวิจัยที่มหาวิทยาลัย Stanford โหลดมาลองใช้ได้ฟรีครับ
  • Open Refine (หรือ Google Refine ในอดีต) — เป็น Open Source ที่เคยได้รับการสนับสนุนโดย Google

ถ้าเป็น library

  • dplyr — สำหรับคนที่ใช้ R
  • panda — สำหรับสาวก python
  • ส่วนผมใช้ node.js ซะเยอะ ส่วนมากก็ใช้ lodash ครับ และใช้ d3-dsv สำหรับ parse csv,tsv

หรือถ้าใครมีเทคนิคอะไรดีๆอื่นๆก็แนะนำกันได้ใน comment ข้างล่างครับ

Leave a Reply

Your email address will not be published. Required fields are marked *