Kanchana Songklod

สายการบินควรแก้ปัญหาไหนก่อน

ทวีต 14,640 ข้อความที่ลูกค้าส่งถึง 6 สายการบินสหรัฐเมื่อ ก.พ. 2015 ฉันทำความสะอาดข้อมูล ติดหมวดให้ทุกทวีตด้วย AI ที่ทดสอบกับคำตอบของฉันเอง แล้วทำรายงาน Power BI ที่จัดลำดับว่าควรแก้อะไรก่อน

หน้า Insight ในรายงาน Power BI: scatter chart ของหมวดปัญหา 9 หมวดตามจำนวนทวีตและสัดส่วนทวีตเชิงลบ คู่กับข้อค้นพบ 3 ข้อและสิ่งที่ควรทำ 4 ข้อ
หน้า Insight ของรายงาน แต่ละวงคือหนึ่งหมวด วงที่อยู่ขวาบนคือเกิดบ่อยและเป็นลบมาก จึงควรแก้ก่อน

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 ก.พ. มีข้อมูลไม่เต็มวัน และมีบางบัญชีเป็นบอตข่าว ไม่ใช่ลูกค้า

ตารางการแก้ไข 5 ข้อ แสดงค่าก่อนและหลังแก้ เช่น ป้าย Delta กลายเป็น JetBlue และคำว่า Cancelled Flightled กลายเป็น cancelled
ตัวอย่างการแก้ไข 5 ข้อ ก่อนและหลัง

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
ฉบับที่ 136349.0%0.29
ฉบับที่ 236291.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 และคลิกขวาที่ตัวเลขไหนก็เปิดทวีตเบื้องหลังตัวเลขนั้นได้

หน้า Topic × Sentiment: heatmap สัดส่วนของแต่ละหมวดในทวีตเชิงลบและเชิงบวกแยกตามสายการบิน และกราฟสัดส่วน sentiment ของแต่ละหมวด
หน้า Topic × Sentiment: แต่ละสายการบินถูกบ่นและถูกชมเรื่องอะไร

6ตรวจทุกอย่างก่อนเผยแพร่

ฉันไล่ยอดทุกช่องของสายการบิน × sentiment จากไฟล์ดิบจนถึงรายงาน ตรงกันครบ 21 ช่อง อ่านทวีต 941 ข้อความที่ผู้อ่านเห็นได้โดยไม่ต้องเลื่อน และแก้หมวด 102 ข้อความ ให้ AI ติดหมวดใหม่ 1,047 ทวีตที่มาจากเหตุผลซึ่งผิดบ่อย และทดสอบว่าอันดับปัญหาเปลี่ยนไหมเมื่อป้ายหมวดเปลี่ยน ปัญหา 2 อันดับแรกไม่เปลี่ยนในทุกการทดสอบ

ตารางกระทบยอดจากไฟล์ดิบถึง Power BI แยกตามสายการบินและ sentiment ส่วนต่างเป็น 0 ทุกแถว
จากไฟล์ดิบถึงรายงาน หนึ่งแถวต่อสายการบินและ sentiment ส่วนต่างเป็น 0 ทุกแถว

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
  • ฉันเป็นคนกำหนดหมวด เลือกวิธีแก้ข้อมูล ตัดสินว่าอะไรนับเป็นเสียงลูกค้า และเลือกข้อเสนอแนะ

สิ่งที่พบ

  1. การบริการและดีเลย์คือปัญหาหลัก Customer Service กับ Delay & Cancellation รวมกันเป็นสองในสามของทวีตเชิงลบ (36.5% และ 30.3%) และเป็นสองหมวดเดียวที่ทั้งเกิดบ่อยและเป็นลบมาก (78.2% และ 84.3%)
  2. ทุกสายการบินมีเสียงลบมากกว่าบวก Net Sentiment Score ตั้งแต่ −68.2 (US Airways) ถึง −4.6 (Virgin America) และในสายที่มีข้อมูลครบ 7 วัน US Airways ได้ทวีตเชิงลบต่อผู้โดยสารมากที่สุด (2,165.9 ต่อผู้โดยสาร 1 ล้านคน)
  3. เสียงลบพุ่งตอนเที่ยวบินมีปัญหา วันอาทิตย์ 22 ก.พ. มีทวีตเชิงลบ 2,316 ข้อความ (73.4%) ลูกค้าบ่นว่าติดต่อแล้วไม่มีใครตอบ ดีเลย์โดยไม่มีอัปเดต และไม่เชื่อเหตุผลเรื่องสภาพอากาศ
หน้า Overview: ทวีตเชิงลบต่อผู้โดยสาร 1 ล้านคนแยกตามสายการบิน US Airways สูงสุด และ Net Sentiment Score ติดลบทั้ง 6 สาย
หน้า Overview หมายเหตุด้านล่างอธิบายว่าทำไม American เทียบกับสายอื่นตรง ๆ ไม่ได้

สมมติฐาน 3 ข้อที่เขียนไว้ก่อนวิเคราะห์:

สิ่งที่คาดไว้ผล
ปัญหาที่ถูกบ่นมากที่สุดคือดีเลย์หรือกระเป๋าไม่สนับสนุน: เรื่องบริการมาก่อน (36.5% กับ 30.3%)
สายการบินต้นทุนต่ำกับสายการบินใหญ่ถูกบ่นเรื่องเดียวกันสนับสนุน: 3 อันดับแรกเหมือนกันและเรียงเหมือนกัน
เรื่องที่ถูกชมมากที่สุดคือบริการหรือความสะดวกบนเครื่องสนับสนุนแบบเฉียดฉิว: Customer Service นำคำขอบคุณทั่วไปแค่ 3 ทวีต

ข้อเสนอแนะ

  1. ตอบลูกค้าให้เร็วขึ้นช่วงที่เที่ยวบินดีเลย์หรือยกเลิก
  2. แจ้งสถานะดีเลย์และยกเลิกก่อนลูกค้าถาม พร้อมสาเหตุและเวลาอัปเดตครั้งถัดไป
  3. แก้จุดอ่อนเฉพาะสาย: United เรื่องกระเป๋า (13.3% ของทวีตเชิงลบ) · Virgin America ขั้นตอนจองและคืนเงิน (18.1%) · US Airways ขั้นตอนที่สนามบิน (เป็นลบ 86.3%)
  4. รักษาจุดแข็ง In-flight Experience หมวดที่มีสัดส่วนทวีตเชิงบวกสูงสุด (37.3%)

ข้อจำกัด

  • ข้อมูล 9 วันของเดือน ก.พ. 2015 และไม่รู้วิธีเก็บทวีต จึงอ่านผลเป็นรูปแบบ ไม่ใช่ภาพทั้งปี
  • ทวีตถึง American มีเกือบทั้งหมดแค่ 22–24 ก.พ. จึงเทียบ American กับสายอื่นตรง ๆ ไม่ได้
  • หมวดราวครึ่งหนึ่งมาจาก AI เมื่อทดสอบแล้วปัญหา 2 อันดับแรกไม่เปลี่ยน แต่อันดับ 3 เปลี่ยนได้
  • ยอดผู้โดยสารเป็นค่าประมาณ และไม่รวมเที่ยวบินของสายการบินพันธมิตร

ไฟล์