สายการบินควรแก้ปัญหาไหนก่อน
ทวีต 14,640 ข้อความที่ลูกค้าส่งถึง 6 สายการบินสหรัฐเมื่อ ก.พ. 2015 ฉันทำความสะอาดข้อมูล ติดหมวดให้ทุกทวีตด้วย AI ที่ทดสอบกับคำตอบของฉันเอง แล้วทำรายงาน Power BI ที่จัดลำดับว่าควรแก้อะไรก่อน
- 14,375ทวีตเสียงลูกค้าที่วิเคราะห์
- 91.7%หมวดจาก AI ตรงกับคำตอบของฉัน (κ 0.90)
- 21 จาก 21ยอดรายสายการบิน × sentiment ที่ตรงกับไฟล์ดิบ
- 2 ใน 3ของทวีตเชิงลบเป็นเรื่องบริการหรือดีเลย์
Case study
- คำถาม
- ทีมดูแลลูกค้าของสายการบินควรแก้ปัญหาไหนก่อน และสายการบินไหนมีปัญหาต้องแก้มากที่สุด
- ข้อมูล
- Twitter US Airline Sentiment (Kaggle, CC BY-NC-SA 4.0) ทวีต 14,640 ข้อความถึง 6 สายการบินสหรัฐ ช่วง 16–24 ก.พ. 2015 พร้อม sentiment ที่คนเป็นผู้ติดป้าย และยอดผู้โดยสารจากสำนักงานสถิติการขนส่งของสหรัฐ (BTS)
- วิธีทำ
- ตรวจและทำความสะอาดข้อมูลด้วย Power Query ติดหมวดให้ทุกทวีตจาก 9 หมวด สร้าง star schema และ measure ด้วย DAX ตรวจทุกตัวเลขกับไฟล์ดิบ แล้วตอบคำถามธุรกิจ 7 ข้อ
- สิ่งที่พบ
- เรื่องบริการกับดีเลย์รวมกันเป็นสองในสามของทวีตเชิงลบ ทุกสายการบินมีเสียงลบมากกว่าบวก และเสียงลบพุ่งตอนเที่ยวบินมีปัญหา
- ข้อเสนอแนะ
- ตอบลูกค้าให้เร็วขึ้นช่วงที่เที่ยวบินมีปัญหา แจ้งสถานะดีเลย์ก่อนลูกค้าถาม แล้วแก้จุดอ่อนเฉพาะของแต่ละสาย
โจทย์
ทีม Customer Experience ของสายการบินอยากรู้ว่าลูกค้าพูดถึงแบรนด์ตัวเองและคู่แข่งบน Twitter อย่างไร ปัญหาไหนควรแก้ก่อน และเสียงบ่นพุ่งช่วงไหน ฉันทำรายงานให้ผู้อ่าน 2 กลุ่ม คือผู้บริหารที่ต้องการหน้าเดียวจบ และหัวหน้าทีมที่ต้องการเห็นทวีตจริงเบื้องหลังตัวเลขแต่ละตัว
ก่อนแตะข้อมูล ฉันเขียนคำถามธุรกิจ 7 ข้อ ตัวชี้วัดที่ใช้ตอบ และสมมติฐาน 3 ข้อว่าคาดว่าจะเจออะไร พร้อมเกณฑ์ว่าแบบไหนถือว่าข้อมูลสนับสนุน ข้อสรุปจึงมาจากข้อมูล ไม่ใช่เลือกเรื่องเล่าทีหลัง
ฉันทำอย่างไร
1ตรวจข้อมูลก่อนแก้
ฉันตรวจทุกคอลัมน์และบันทึกปัญหา 13 ข้อ พร้อมจำนวนแถวที่แต่ละข้อกระทบ ข้อที่ใหญ่ที่สุดคือ ทวีตที่ติดป้าย Delta 2,218 จาก 2,222 ข้อความส่งถึง JetBlue ป้ายนี้จึงหมายถึง JetBlue จริง ๆ นอกจากนั้นมี tweet ID ซ้ำ 155 รายการ วันที่ 16 และ 24 ก.พ. มีข้อมูลไม่เต็มวัน และมีบางบัญชีเป็นบอตข่าว ไม่ใช่ลูกค้า
2ทำความสะอาดแบบที่ใครก็ทำซ้ำได้
การแก้ทุกข้อเป็นขั้นตอนใน Power Query ที่ตั้งชื่อตามปัญหาที่แก้ และไม่แก้ไฟล์ดิบเลย ทุกแถวมีที่มาที่ไป: 14,640 แถว หักที่ซ้ำ 155 เหลือ 14,485 ทวีต เพิ่ม 361 แถวสำหรับสายการบินอื่นที่ทวีตพูดถึง ส่วน 110 ทวีตที่ไม่ใช่เสียงลูกค้ายังอยู่ในข้อมูลแต่ไม่ถูกนับ
3ติดหมวดให้ทุกทวีต
ข้อมูลมีเหตุผลเฉพาะทวีตที่บ่น ฉันจึงเขียน codebook 9 หมวด แปลงเหตุผลที่คนระบุไว้เป็นหมวด แล้วให้ AI ติดหมวดส่วนที่เหลือ เมื่อเทียบกับ 363 ทวีตที่ฉันติดหมวดเอง AI ตรงกับฉันแค่ 49% ฉันจึงเขียนขอบเขตของแต่ละหมวดใหม่ และเมื่อวัดกับชุดใหม่ 362 ทวีต ความตรงกันขึ้นเป็น 91.7%
| Codebook | ทวีตที่ฉันติดหมวดเอง | AI ตรงกับฉัน | Cohen's kappa |
|---|---|---|---|
| ฉบับที่ 1 | 363 | 49.0% | 0.29 |
| ฉบับที่ 2 | 362 | 91.7% | 0.90 |
4เทียบสายการบินอย่างยุติธรรม
สายการบินใหญ่ได้ทวีตมากกว่าเพราะขนคนมากกว่า ฉันจึงประมาณยอดผู้โดยสารของแต่ละสายในช่วง 7 วันเต็มเดียวกันจากข้อมูลของรัฐบาลสหรัฐ แล้วเทียบเป็นทวีตเชิงลบต่อผู้โดยสาร 1 ล้านคน
5สร้างโมเดลและรายงาน
โมเดลเป็น star schema มี fact table 14,846 แถว (ทวีต × สายการบิน) และ dimension ของสายการบิน วันที่ และหมวด ฉันตรวจทุก measure ใน DAX กับการนับนอก Power BI ก่อนสร้างหน้ารายงาน รายงานมี 5 หน้า คือ Home, Overview, Topic × Sentiment, Trend และ Insight และคลิกขวาที่ตัวเลขไหนก็เปิดทวีตเบื้องหลังตัวเลขนั้นได้
6ตรวจทุกอย่างก่อนเผยแพร่
ฉันไล่ยอดทุกช่องของสายการบิน × sentiment จากไฟล์ดิบจนถึงรายงาน ตรงกันครบ 21 ช่อง อ่านทวีต 941 ข้อความที่ผู้อ่านเห็นได้โดยไม่ต้องเลื่อน และแก้หมวด 102 ข้อความ ให้ AI ติดหมวดใหม่ 1,047 ทวีตที่มาจากเหตุผลซึ่งผิดบ่อย และทดสอบว่าอันดับปัญหาเปลี่ยนไหมเมื่อป้ายหมวดเปลี่ยน ปัญหา 2 อันดับแรกไม่เปลี่ยนในทุกการทดสอบ
DAX ที่ใช้
measure 4 ตัวนี้คือหัวใจของรายงาน จัดรูปด้วย DAX Formatter
Volume
กฎเดียวว่าอะไรนับเป็นเสียงลูกค้า: แถวที่มีเหตุผลให้ตัดออก (บัญชีข่าวและบอต คำตอบของสายการบิน ทวีตที่ส่งถึง Delta) ยังอยู่ในโมเดลแต่ไม่ถูกนับ จึงไม่ต้องลบแถวใดเลย
Volume =
CALCULATE ( COUNTROWS ( Fact_Tweets ), ISBLANK ( Fact_Tweets[Exclude_Reason] ) )
Negative per 1M Passengers
เทียบสายการบินอย่างเป็นธรรม: ทวีตเชิงลบใน 7 วันเต็ม หารด้วยผู้โดยสารที่ประมาณไว้ในช่วงเดียวกัน 2 วันที่ข้อมูลไม่เต็มวันจึงไม่ทำให้ตัวเลขเพี้ยน
Negative per 1M Passengers =
DIVIDE (
CALCULATE ( [Negative], Dim_Date[Is_Partial_Day] = FALSE () ),
SUM ( Dim_Brand[Passengers_17_23Feb] )
) * 1000000
Topic Share
สัดส่วนของแต่ละหมวดภายใต้ตัวกรองที่เลือกอยู่ (สายการบิน, sentiment): REMOVEFILTERS บนตารางหมวดให้ตัวหาร และ + 0 ทำให้หมวดที่ไม่มีทวีตแสดงเป็น 0% แทนช่องว่าง
Topic Share =
DIVIDE ( [Volume] + 0, CALCULATE ( [Volume], REMOVEFILTERS ( Dim_Topic ) ) )
QA Primary Check
ตรวจคุณภาพข้อมูลด้วย DAX: นับทวีตที่ไม่มีแถวสายการบินหลักหนึ่งแถวพอดี หน้า QA แสดงค่า 0
QA Primary Check =
COUNTROWS (
FILTER (
VALUES ( Fact_Tweets[tweet_id] ),
CALCULATE ( COUNTROWS ( Fact_Tweets ), Fact_Tweets[Is_Primary] = TRUE () ) <> 1
)
) + 0
ฉันใช้ AI อย่างไร
AI ทำงานที่ซ้ำและใช้เวลานาน ส่วนฉันเป็นคนตัดสินใจและตรวจผลทุกชิ้น
- AI (Claude) ติดหมวดทวีตที่ไม่มีหมวด โค้ดสายการบินอื่นในทวีตที่พูดถึงหลายสาย และร่างเอกสารให้ฉันอนุมัติ
- ผลจาก AI ทุกชิ้นมีตัวเลขกำกับ คือความตรงกันกับป้ายที่ฉันติดเอง หรือการตรงกับการนับแยกอีกทาง
- สคริปต์ Python ที่ใช้ตรวจเหล่านั้น AI เป็นคนเขียน ฉันตรวจผลลัพธ์กับ Power BI และ Excel
- ฉันเป็นคนกำหนดหมวด เลือกวิธีแก้ข้อมูล ตัดสินว่าอะไรนับเป็นเสียงลูกค้า และเลือกข้อเสนอแนะ
สิ่งที่พบ
- การบริการและดีเลย์คือปัญหาหลัก Customer Service กับ Delay & Cancellation รวมกันเป็นสองในสามของทวีตเชิงลบ (36.5% และ 30.3%) และเป็นสองหมวดเดียวที่ทั้งเกิดบ่อยและเป็นลบมาก (78.2% และ 84.3%)
- ทุกสายการบินมีเสียงลบมากกว่าบวก Net Sentiment Score ตั้งแต่ −68.2 (US Airways) ถึง −4.6 (Virgin America) และในสายที่มีข้อมูลครบ 7 วัน US Airways ได้ทวีตเชิงลบต่อผู้โดยสารมากที่สุด (2,165.9 ต่อผู้โดยสาร 1 ล้านคน)
- เสียงลบพุ่งตอนเที่ยวบินมีปัญหา วันอาทิตย์ 22 ก.พ. มีทวีตเชิงลบ 2,316 ข้อความ (73.4%) ลูกค้าบ่นว่าติดต่อแล้วไม่มีใครตอบ ดีเลย์โดยไม่มีอัปเดต และไม่เชื่อเหตุผลเรื่องสภาพอากาศ
สมมติฐาน 3 ข้อที่เขียนไว้ก่อนวิเคราะห์:
| สิ่งที่คาดไว้ | ผล |
|---|---|
| ปัญหาที่ถูกบ่นมากที่สุดคือดีเลย์หรือกระเป๋า | ไม่สนับสนุน: เรื่องบริการมาก่อน (36.5% กับ 30.3%) |
| สายการบินต้นทุนต่ำกับสายการบินใหญ่ถูกบ่นเรื่องเดียวกัน | สนับสนุน: 3 อันดับแรกเหมือนกันและเรียงเหมือนกัน |
| เรื่องที่ถูกชมมากที่สุดคือบริการหรือความสะดวกบนเครื่อง | สนับสนุนแบบเฉียดฉิว: Customer Service นำคำขอบคุณทั่วไปแค่ 3 ทวีต |
ข้อเสนอแนะ
- ตอบลูกค้าให้เร็วขึ้นช่วงที่เที่ยวบินดีเลย์หรือยกเลิก
- แจ้งสถานะดีเลย์และยกเลิกก่อนลูกค้าถาม พร้อมสาเหตุและเวลาอัปเดตครั้งถัดไป
- แก้จุดอ่อนเฉพาะสาย: United เรื่องกระเป๋า (13.3% ของทวีตเชิงลบ) · Virgin America ขั้นตอนจองและคืนเงิน (18.1%) · US Airways ขั้นตอนที่สนามบิน (เป็นลบ 86.3%)
- รักษาจุดแข็ง In-flight Experience หมวดที่มีสัดส่วนทวีตเชิงบวกสูงสุด (37.3%)
ข้อจำกัด
- ข้อมูล 9 วันของเดือน ก.พ. 2015 และไม่รู้วิธีเก็บทวีต จึงอ่านผลเป็นรูปแบบ ไม่ใช่ภาพทั้งปี
- ทวีตถึง American มีเกือบทั้งหมดแค่ 22–24 ก.พ. จึงเทียบ American กับสายอื่นตรง ๆ ไม่ได้
- หมวดราวครึ่งหนึ่งมาจาก AI เมื่อทดสอบแล้วปัญหา 2 อันดับแรกไม่เปลี่ยน แต่อันดับ 3 เปลี่ยนได้
- ยอดผู้โดยสารเป็นค่าประมาณ และไม่รวมเที่ยวบินของสายการบินพันธมิตร
ไฟล์
- รายงาน Power BI (.pbix, 2.9 MB)
- Executive brief: อังกฤษ · ไทย (PDF)
- เอกสารประกอบ (Excel: Issue log, Data dictionary, Decision log และอื่น ๆ) · Codebook หมวด (Excel)
- ไฟล์ต้นทางสำหรับ Refresh (zip, 1.3 MB)
- README วิธีเปิดและ Refresh