Marketing Code

Market the code, Code the Market

ตัวอย่าง MySQL Coding สำหรับ Customer Analytics ในอุตสาหกรรมท่องเที่ยวและโรงแรม

เอาล่ะทุกคน! แอดขอเปิดตัวบทความฉบับนี้ด้วยเรื่องราวที่แอดเชื่อว่าชาวโรงแรมและการท่องเที่ยวต้องเคยเจอจนปวดเฮด นั่นก็คือ…“ข้อมูลเยอะแยะไปหมด แต่ทำไมเอาไปใช้ต่อยอดไม่ได้เลยเนี่ย!” 🤯

เชื่อไหมว่าแค่ข้อมูลลูกค้าในระบบก็พาให้ปวดใจได้แล้ว! บางระบบบันทึก “คุณป้า สมใจ” อีกระบบบอก “สมใจ, คุณป้า” โอ๊ย…บางทีข้อมูลหายบ้าง ซ้ำกันบ้าง จนแอดอยากจะกรีดร้อง! 😫 แต่ไม่ต้องห่วง! วันนี้แอดจะชวนทุกคนมา “ลุยข้อมูลดิบ” แบบมันส์ๆ ด้วย MySQL กัน!

โจทย์ที่อยากรู้ กับ ข้อมูลดิบที่กระจัดกระจาย

ก่อนจะไปลุยข้อมูล แอดอยากให้ทุกคนมาตั้งคำถามกับแอดก่อนว่า “เราอยากรู้เรื่องอะไรจากลูกค้าของเราบ้าง?” เพื่อที่จะตอบโจทย์โรงแรม [บริษัทตัวอย่าง] แอดจะพาทุกคนไปเจาะลึกคำถามเหล่านี้แหละ:

  • กลุ่มลูกค้าแต่ละช่วงอายุ (เช่น วัยรุ่น, วัยทำงาน, ผู้สูงอายุ) เข้าพักเฉลี่ยกี่วันนะ?
  • ลูกค้าที่มาแบบต่างกัน (มาคนเดียว, มาเป็นคู่, มาเป็นกลุ่ม/ครอบครัว) ชอบจองห้องพักแบบไหนมากที่สุด? (Standard, Deluxe, Suite, Family)
  • ลูกค้าส่วนใหญ่รู้จักและจองโรงแรมผ่านช่องทางไหนบ้าง? (เว็บไซต์โรงแรม, Agoda, Booking.com, Facebook, โทรศัพท์)

Raw Data “ข้อมูลดิบ” เปิดหีบหาความจริง!

เพื่อตอบคำถามเหล่านี้ แอดได้จัดเตรียม “ข้อมูลดิบ” (Raw Data) จำลองเอาไว้เพียบ! ลองจินตนาการว่าเป็นไฟล์ Excel ขนาดยักษ์ ที่เต็มไปด้วยข้อมูลการจองย้อนหลัง แต่บอกเลยว่าข้อมูลจริงมันไม่ง่ายอย่างที่คิด! เพราะในข้อมูลดิบชุดนี้ แอดแอบใส่ “ข้อผิดพลาดสุดเนียน” เอาไว้ด้วยนะ เช่น:

  • อายุลูกค้า ที่กรอกมาแบบไม่น่าเชื่อ (บางคนอายุทะลุ 150 ปี!)
  • ประเภทห้องพัก ที่สะกดผิดบ้าง (เช่น “ดีลักซ์” กลายเป็น “ดีลัก”)
  • ช่องทางการจอง ที่บางทีก็ว่างเปล่า ไม่มีข้อมูลซะงั้น!

และแหล่งที่มาของข้อมูลดิบชุดนี้ แอดสมมติว่ามาจาก ระบบจัดการการจอง (Property Management System – PMS) ของโรงแรม [บริษัทตัวอย่าง] ซึ่งเป็น Raw Data ดิบๆ ที่ยังไม่ได้ผ่านการคลีนหรือแปลงสภาพใดๆ เลย! แถมยังมาในรูปแบบไฟล์ .csv (Comma Separated Values) อีกด้วยนะ! 🔥🌶️

Copy “Customer” Raw Data ที่นี่!

CustomerID,Name,AgeGroup,TravelType
CUS001,Somchai Jaidee,30-39,Couple
CUS002,Sakura Tanaka,20-29,Solo
CUS003,John Smith,40-49,Family
CUS004,Somying Kengmak,20-29,Solo
CUS005,Elizabeth Taylor,60+,Group
CUS006,Park Ji-sung,30-39,Couple
CUS007,Nonglek Narak,<20,Solo
CUS008,Hans Müller,50-59,Group
CUS009,Li Wei,20-29,Couple
CUS010,Suda Suaijing,30-39,Solo
CUS011,Robert Johnson,60+,Couple
CUS012,Akihiro Sato,20-29,Solo
CUS013,David Beckham,40-49,Family
CUS014,Somsak Meechai,<20,Solo
CUS015,Kim Min-ji,50-59,Couple
CUS016,Anna Schmidt,30-39,Group
CUS017,Zhang Wei,20-29,Solo
CUS018,Somphong Rakdee,60+,Family
CUS019,Michael Brown,20-29,Couple
CUS020,Yumi Yamamoto,40-49,Solo

Copy “Booking” Raw Data ที่นี่!

BookingID,CustomerID,BookingDate,CheckIn,CheckOut,Room_Type,Booking_Source,StayDuration
BOOK001,CUS001,2025-05-01,2025-05-15,2025-05-17,Deluxe,Website,2
BOOK002,CUS002,03/05/2025,2025-05-20,2025-05-20,STANDARD,OTA1,0
BOOK003,CUS003,2025-04-25,2025-05-10,2025-05-13,Suite,OTA2,3
BOOK004,CUS004,2025-05-05,2025-05-25,2025-05-26,Standard,Website,1
BOOK005,CUS005,2025-04-30,01/06/2025,2025-06-05,FAMILY,OTA1,4
BOOK006,CUS006,2025-05-08,2025-05-18,2025-05-19,DELUXE,Phone,1
BOOK007,CUS007,10-05-2025,2025-05-28,2025-05-28,Standard,Facebook,0
BOOK008,CUS008,2025-04-20,2025-05-12,2025-05-16,SUITE,OTA2,4
BOOK009,CUS009,2025-05-12,2025-05-22,2025-05-23,STANDARD,Website,1
BOOK010,CUS010,2025-05-02,17-05-2025,2025-05-18,Deluxe,OTA1,1
BOOK011,CUS011,2025-04-28,2025-06-05,2025-06-07,Suite,Phone,2
BOOK012,CUS012,07/05/2025,2025-05-23,2025-05-24,Standard,Facebook,1
BOOK013,CUS013,2025-05-15,2025-05-30,2025-06-02,FAMILY,OTA2,3
BOOK014,CUS014,2025-05-09,2025-05-27,2025-05-27,STANDARD,Website,0
BOOK015,CUS015,2025-04-22,11-05-2025,2025-05-14,Deluxe,OTA1,3
BOOK016,CUS016,2025-05-18,2025-06-08,2025-06-09,Standard,Phone,1
BOOK017,CUS017,04-05-2025,2025-05-21,2025-05-21,STANDARD,Facebook,0
BOOK018,CUS018,2025-05-11,2025-05-29,2025-06-01,SUITE,OTA2,3
BOOK019,CUS019,2025-05-16,2025-06-02,2025-06-03,Standard,Website,1
BOOK020,CUS020,2025-04-27,13-05-2025,2025-05-15,Deluxe,OTA1,2

วิธีอัพโหลดใน SQL Online

# ตัวอย่างนี้แอดเปิดจาก SQLOnlineใช้ปัง! ใช้ฟรี! เย้
– ง่ายๆ เปิดแล้วหาไอคอน import แล้วกด upload ได้เลย

แต่ช้าก่อน! 🛑 ภารกิจ “เจ้าสัวโรงแรม” ของเรามันไม่ง่ายอย่างที่คิดนะทุกคน! ในกล่องมหาสมบัติ “ข้อมูลดิบ” ที่แอดเตรียมไว้เนี่ย มันมี “ความท้าทาย” ซ่อนอยู่เพียบ! แถมยังมีเซอร์ไพรส์เล็กๆ น้อยๆ ให้ได้ลุ้นระทึกกันด้วยนะ 😈

ลองนึกภาพตามแอดนะว่า…

  • ข้อมูลกระจัดกระจาย ยิ่งกว่าใยแมงมุม: ข้อมูลการจองอาจจะอยู่ในระบบนึง ข้อมูลลูกค้าไปอยู่อีกระบบนึง แถมข้อมูลการเข้าพักจริงอาจจะไปหลบอยู่อีกมุม! งานนี้แอดต้องใช้สกิลการ “Join Data” เพื่อรวบรวมข้อมูลทั้งหมดให้เป็นปึกแผ่นก่อนจะเอาไปวิเคราะห์ได้นะ!
  • รูปแบบข้อมูลไม่เหมือนกัน: บางคนกรอกวันที่มาแบบ “2025-05-20” อีกคนมาแบบ “20/05/2568” ไหนจะตัวพิมพ์เล็กตัวพิมพ์ใหญ่ที่ไม่เหมือนกันอีก! แถมยังมีช่องว่าง (NULL) โผล่มาให้ปวดหัวเป็นระยะๆ! งานนี้แอดต้องใช้เวทมนตร์ปรับรูปแบบให้มันเป๊ะปังเหมือนกันทุกอัน!
  • ข้อมูลซ้ำซ้อน ชวนงงเป็นไก่ตาแตก: บางทีลูกค้าคนเดียวกันจองหลายครั้ง หรือระบบบันทึกข้อมูลซ้ำซ้อนจนนับไม่ถ้วน! เจอแบบนี้เข้าไป ผลวิเคราะห์ที่ได้อาจจะเพี้ยนได้เลยนะ แอดเลยต้องงัดไม้เด็ดอย่าง “De-duplication” มาจัดการซะ!

สรุปสั้นๆ (แต่เข้มข้น!):

ตอนนี้แหละคือช่วงเวลาแห่งการเตรียมตัวให้พร้อมสำหรับการ “ลงมือทำ” จริงๆ ด้วย MySQL! เราจะมาดูกันว่า แอดจะใช้โค้ด MySQL ในการ Clean (ทำความสะอาด), Transform (แปลงสภาพ), และ Analyze (วิเคราะห์) ข้อมูลสุดป่วนพวกนี้ให้กลายเป็นขุมทรัพย์แห่งความรู้ได้ยังไง! เตรียมตัวพบกับความสนุกและสาระจัดเต็มในส่วนถัดไปได้เลย! 😊


ปฏิบัติการ “ชำระล้างข้อมูล”(Data Cleaning) และ “แปลงร่างข้อมูล”(Data Transformation) มาแปลงโฉมข้อมูลดิบให้สวยปิ๊งกัน! 🧼

ทุกคนครับ! แอดอยากให้ลองนึกภาพตามนะว่า “ข้อมูลดิบ” ของเราเนี่ย มันเหมือนกับ กองทรายที่ยังไม่ได้ร่อน หรือ เสื้อผ้าที่ยับยู่ยี่ก่อนรีด เลยล่ะ การทำ Data Cleaning ก็เปรียบเหมือนการร่อนทรายเอาเศษหินเศษกรวดออก หรือรีดผ้าให้เรียบกริ๊บ เพื่อให้ข้อมูลของเรา สะอาดใส พร้อมใช้งาน! ส่วน Data Transformation ก็เหมือนกับการเอาเสื้อผ้าที่รีดเรียบแล้ว มาตัดเย็บ ออกแบบ ให้เป็นชุดสวยๆ ที่เราอยากใส่ นั่นก็คือการ ปรับเปลี่ยนรูปแบบข้อมูลให้เหมาะสมกับการวิเคราะห์ของเรานั่นเอง!

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

จัดการวายร้ายขั้นเด็ดขาด! 😈🛠️ ด้วย MySQL

มาดูกันว่า แอดเจอ “ปัญหาอะไรบ้าง” ในข้อมูลจำลองของเรา แล้วแอดจะใช้เวทมนตร์ (ที่จริงก็คือ โค้ด MySQL นั่นแหละ!) แก้ไขให้เอง!

  • ปัญหา: ข้อมูลกระจัดกระจาย ไม่เชื่อมกัน!
    • วายร้าย: ข้อมูลลูกค้า (ตาราง customer_info) กับข้อมูลการจอง (ตาราง booking_details) ดันไปอยู่ในคนละตารางกัน! แก้โดยใช้ CustomerID เป็นกุญแจสำคัญในการ JOIN ข้อมูลทั้งสองตารางเข้าด้วยกันซะ!
    • วายร้าย: คอลัมน์ RoomType หรือ BookingChannel อาจจะสะกดไม่สม่ำเสมอ เช่น “Deluxe” กับ “deluxe” แก้ง่ายๆ เลย ใช้ฟังก์ชัน UPPER() หรือ LOWER() แปลงให้เป็นตัวพิมพ์ใหญ่หรือเล็กทั้งหมด จะได้ไม่มีปัญหากวนใจ!
  • ปัญหา: รูปแบบข้อมูลไม่สอดคล้องกัน!
    • วายร้าย: คอลัมน์วันที่ (อย่าง BookingDate, CheckIn, CheckOut) มีรูปแบบที่แตกต่างกันไปหมด ทั้ง YYYY-MM-DD, DD/MM/YYYY, หรือ DD-MM-YYYY แก้โดยใช้ฟังก์ชันเด็ดอย่าง STR_TO_DATE() และ DATE_FORMAT() เพื่อปรับให้เป็นรูปแบบเดียวกันทั้งหมด เป๊ะปังแน่นอน!

เอาล่ะครับทุกคน! มาลงมือปฏิบัติการ “แปลงโฉมข้อมูลสุดป่วน” ด้วยโค้ด SQL กันเลย!

จากข้อมูลดิบ 2 ชุดที่เราสร้างมา แอดจะพาไปทีละขั้นตอน เพื่อให้ข้อมูลของเราสะอาด สวยงาม พร้อมสำหรับการวิเคราะห์ขั้นต่อไป!ขั้นตอนที่ 1: เชื่อมตาราง customer_info และ booking_details

ขั้นตอนที่ 1: เชื่อมตาราง customer_info และ booking_details

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

Copy Clean Data (Part #1) code ที่นี่!
-- สร้างตารางชั่วคราว (temporary table) เพื่อเก็บข้อมูลที่เชื่อมแล้ว
CREATE TEMPORARY TABLE unified_data AS
SELECT
    ci.CustomerID,
    ci.Name AS CustomerName,
    ci.AgeGroup,
    ci.TravelType,
    bd.BookingID,
    bd.BookingDate,
    bd.CheckIn AS CheckInDate,
    bd.CheckOut AS CheckOutDate,
    bd.Room_Type AS RoomType,
    bd.Booking_Source AS BookingSource,
    bd.StayDuration
FROM
    customer_info ci
INNER JOIN
    booking_details bd ON ci.CustomerID = bd.CustomerID;

-- ปรับรูปแบบวันที่ในตาราง unified_data
UPDATE unified_data
SET
    BookingDate = CASE
        WHEN BookingDate LIKE '%-%-%' THEN substr(BookingDate, 1, 4) || '-' || substr(BookingDate, 6, 2) || '-' || substr(BookingDate, 9, 2)
        WHEN BookingDate LIKE '%/%/%' THEN substr(BookingDate, 7, 4) || '-' || substr(BookingDate, 4, 2) || '-' || substr(BookingDate, 1, 2)
        WHEN BookingDate LIKE '%-%-%' THEN substr(BookingDate, 7, 4) || '-' || substr(BookingDate, 4, 2) || '-' || substr(BookingDate, 1, 2)
        ELSE NULL
    END,
    CheckInDate = CASE
        WHEN CheckInDate LIKE '%-%-%' THEN substr(CheckInDate, 1, 4) || '-' || substr(CheckInDate, 6, 2) || '-' || substr(CheckInDate, 9, 2)
        WHEN CheckInDate LIKE '%/%/%' THEN substr(CheckInDate, 7, 4) || '-' || substr(CheckInDate, 4, 2) || '-' || substr(CheckInDate, 1, 2)
        WHEN CheckInDate LIKE '%-%-%' THEN substr(CheckInDate, 7, 4) || '-' || substr(CheckInDate, 4, 2) || '-' || substr(CheckInDate, 1, 2)
        ELSE NULL
    END,
    CheckOutDate = CASE
        WHEN CheckOutDate LIKE '%-%-%' THEN substr(CheckOutDate, 1, 4) || '-' || substr(CheckOutDate, 6, 2) || '-' || substr(CheckOutDate, 9, 2)
        WHEN CheckOutDate LIKE '%/%/%' THEN substr(CheckOutDate, 7, 4) || '-' || substr(CheckOutDate, 4, 2) || '-' || substr(CheckOutDate, 1, 2)
        WHEN CheckOutDate LIKE '%-%-%' THEN substr(CheckOutDate, 7, 4) || '-' || substr(CheckOutDate, 4, 2) || '-' || substr(CheckOutDate, 1, 2)
        ELSE NULL
    END;


-- ปรับ RoomType เป็นตัวพิมพ์ใหญ่
UPDATE unified_data
SET RoomType = UPPER(RoomType);

-- ปรับ BookingSource เป็นตัวพิมพ์ใหญ่
UPDATE unified_data
SET BookingSource = UPPER(BookingSource);

-- แสดงข้อมูลจากตาราง unified_data
SELECT * FROM unified_data;

ส่องบรรทัดโค้ดเด็ด

  1. CREATE TEMPORARY TABLE unified_data AS ...: บรรทัดนี้เด็ดสุด! มันคือการบอกว่า “เฮ้ย! สร้างตารางใหม่ขึ้นมาหน่อยสิ แต่เป็นแบบชั่วคราวนะ ใช้เสร็จเดี๋ยวก็ลบไปเอง” แล้วก็ตั้งชื่อให้ว่า unified_data ครับ!
  2. SELECT ... FROM customer_info ci INNER JOIN booking_details bd ON ci.CustomerID = bd.CustomerID;: ส่วนนี้คือหัวใจของการรวมข้อมูล!
  3. BookingDate = CASE WHEN ... THEN ... ELSE NULL END: บรรทัดนี้แหละที่น่าสนใจและแก้ปัญหาโลกแตกของข้อมูลวันที่! ข้อมูลวันที่ในฐานข้อมูลมักจะมาในหลายๆ รูปแบบ (เช่น YYYY-MM-DD หรือ DD/MM/YYYY) ซึ่งมันทำให้วิเคราะห์ยาก!
  4. UPDATE unified_data SET RoomType = UPPER(RoomType);: บรรทัดนี้ง่ายๆ เลย! คือการ “เปลี่ยนข้อมูลในคอลัมน์ RoomType (ประเภทห้อง) และ BookingSource (ช่องทางการจอง) ให้เป็นตัวพิมพ์ใหญ่ทั้งหมด” (UPPER()) ครับ! เพื่อให้ข้อมูลสะอาด เป็นมาตรฐานเดียวกัน ไม่ว่าลูกค้าจะกรอกมาเป็น “deluxe” หรือ “Deluxe” หรือ “DELUXE” สุดท้ายก็จะกลายเป็น “DELUXE” หมด! ทำให้การนับ การกรองข้อมูลง่ายขึ้นเยอะ!

ตอนนี้เราได้ใช้โค้ด SQL จัดการกับปัญหาข้อมูลกระจัดกระจายด้วยการ JOIN ตาราง ปรับรูปแบบวันที่ให้เป็นมาตรฐาน และปรับตัวพิมพ์ให้สม่ำเสมอแล้ว! ข้อมูลของเราในตาราง cleaned_data (หรือ unified_data หากไม่มีข้อมูลซ้ำซ้อนให้จัดการ) พร้อมสำหรับการวิเคราะห์เพื่อตอบคำถามที่เราตั้งไว้แล้วครับ!

เตรียมตัวพบกับ Insight เด็ดๆ จากข้อมูลที่สะอาดของเราได้เลย! 😊


วิเคราะห์ข้อมูล “Data Analytics เพื่อให้เห็นภาพได้มากขึ้น 🕵️‍♂️

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

ในส่วนนี้ แอดจะใช้ MySQL ในการดึงข้อมูลที่ต้องการ และขออนุญาตให้ทุกคนจินตนาการตามว่า เรากำลังใช้เครื่องมือ Visualization สุดเจ๋ง (อย่าง Metabase, Tableau หรือแม้แต่ Google Sheets) ในการเนรมิตกราฟสวยๆ ขึ้นมานะ!

บทความนี้ เราเน้นการใช้ MySQL ในการเรียบเรียงเป็นหลัก! ไม่ได้ Visualize แต่แอดจะแชร์ว่าข้อมูลแบบไหนควร Visualize แบบไหนแทนละกัน (แอดจะแชร์การใช้ Locker บทความหน้า)

ข้อที่ 1: หาระยะเวลาการเข้าพักเฉลี่ยตามกลุ่มอายุ

หลังจากเรา clean ข้อมูลแล้ว และนำมาจัดเรียงลำดับ average group จาก agegroup เพียงง่ายๆ แค่นี้เราก็จะทราบได้ทันทีว่าลูกค้ากลุ่มอายุเท่าไหร่เข้าพักเฉลี่ยกี่คืน

Copy code “วิเคราะห์โพสต์+Dataviz+คำนวณ engagement” here!
-- คำนวณระยะเวลาการเข้าพักเฉลี่ยสำหรับแต่ละกลุ่มอายุ
SELECT
    AgeGroup,
    AVG(StayDuration) AS AverageStay
FROM
    unified_data -- ใช้ตาราง cleaned_data ที่เราสร้างไว้
GROUP BY
    AgeGroup
ORDER BY
    AVG(StayDuration); -- เรียงลำดับตามระยะเวลาการเข้าพักเฉลี่ย

คำอธิบายโค้ด:

  • SELECT AgeGroup, AVG(StayDuration) AS AverageStay: เราเลือกคอลัมน์ AgeGroup (กลุ่มอายุ) และคำนวณค่าเฉลี่ยของ StayDuration (ระยะเวลาการเข้าพัก) โดยตั้งชื่อให้เข้าใจง่ายว่า AverageStay
  • FROM unified_data: ดึงข้อมูลจากตาราง unified_data ที่เราทำความสะอาดและรวมมาแล้ว
  • GROUP BY AgeGroup: จัดกลุ่มข้อมูลตาม AgeGroup เพื่อให้ MySQL คำนวณค่าเฉลี่ยแยกตามแต่ละกลุ่ม
  • ORDER BY AVG(StayDuration): เรียงลำดับผลลัพธ์ตามค่าเฉลี่ยของระยะเวลาการเข้าพัก จากน้อยไปมาก

ส่วนตัวแอดคิดว่า Bar Chart แผนภูมิแท่งน่าจะเหมาะที่สุดสำหรับการเปรียบเทียบค่าเฉลี่ยของ “ระยะเวลาการเข้าพัก” (ตัวแปรเชิงปริมาณ) ในแต่ละ “กลุ่มอายุ” (ตัวแปรเชิงคุณภาพ) ทำให้เราเห็นภาพได้ง่ายๆ เลยว่า กลุ่มอายุไหนกันนะที่ชอบพักนานๆ! โดยเราจะนำผลลัพธ์จาก Query นี้ไปสร้าง Bar Chart โดยให้ แกน X แสดงกลุ่มอายุ และ แกน Y แสดงระยะเวลาการเข้าพักเฉลี่ย แต่ละแท่งจะบอกค่าเฉลี่ยของแต่ละกลุ่มอายุ ทำให้เราเห็นชัดเจนว่ากลุ่มไหนมีแนวโน้มพักยาวกว่ากัน!


ข้อที่ 2: ประเภทห้องพักที่จองตามลักษณะผู้เข้าพัก

หลังจากเรา clean ข้อมูลแล้ว และgroupby จาก Travel type + Room type เพียงง่ายๆ แค่นี้เราก็จะทราบได้ทันทีว่าลูกค้ากลุ่มแบบใด จองห้องแบบใด ในจำนวนกี่คืน

Copy code here!
-- นับจำนวนการจองห้องพักแต่ละประเภทสำหรับแต่ละลักษณะผู้เข้าพัก
SELECT
    TravelType,
    RoomType,
    COUNT(*) AS NumberOfBookings
FROM
    unified_data
GROUP BY
    TravelType,
    RoomType
ORDER BY
    TravelType,
    RoomType;

คำอธิบายโค้ด:

  • SELECT TravelType, RoomType, COUNT(*) AS NumberOfBookings: เราเลือกคอลัมน์ TravelType (ลักษณะผู้เข้าพัก), RoomType (ประเภทห้องพัก), และนับจำนวนการจองทั้งหมด ตั้งชื่อว่า NumberOfBookings
  • FROM unified_data: ดึงข้อมูลจากตาราง unified_data
  • GROUP BY TravelType, RoomType: จัดกลุ่มข้อมูลตามทั้ง TravelType และ RoomType เพื่อให้นับจำนวนการจองแยกตามแต่ละคู่
  • ORDER BY TravelType, RoomType: เรียงลำดับผลลัพธ์ตาม TravelType และ RoomType

Stacked Bar Chart แผนภูมิแท่งแบบซ้อนกัน นี่แหละเด็ด! เหมาะกับการแสดงความสัมพันธ์ระหว่างตัวแปรเชิงคุณภาพสองตัว (อย่าง “ลักษณะผู้เข้าพัก” กับ “ประเภทห้องพัก”) ทำให้เราเห็นภาพรวมของการกระจายประเภทห้องพักในแต่ละกลุ่มผู้เข้าพัก และเปรียบเทียบสัดส่วนได้ง่ายโคตรๆ!

การนำเสนอ: เราจะเอาผลลัพธ์จาก Query นี้ไปสร้าง Stacked Bar Chart โดยให้แต่ละแท่งแทน “ลักษณะผู้เข้าพัก” (เช่น มาคนเดียว, มาเป็นคู่, มาเป็นครอบครัว) และแต่ละส่วนย่อยในแท่งจะแทน “ประเภทห้องพัก” (เช่น Standard, Deluxe, Suite) ความสูงของแต่ละส่วนย่อยจะแสดงจำนวนการจอง ทำให้เราเห็นชัดๆ ว่าผู้เข้าพักแต่ละกลุ่มนิยมจองห้องแบบไหนบ้าง


ข้อที่ 3: แหล่งที่มาของการจอง

หลังจากเรา clean ข้อมูลแล้ว และ groupby จาก Booking Source เพียงง่ายๆ แค่นี้เราก็จะทราบได้ทันทีว่าลูกค้าจองเรามาผ่านช่องทางใด

Copy code here!
-- นับจำนวนการจองจากแต่ละแหล่งที่มา
SELECT
    BookingSource,
    COUNT(*) AS NumberOfBookings
FROM
    unified_data
GROUP BY
    BookingSource
ORDER BY
    COUNT(*) DESC; -- เรียงลำดับตามจำนวนการจองจากมากไปน้อย

คำอธิบายโค้ด:

  • SELECT BookingSource, COUNT(*) AS NumberOfBookings: เราเลือกคอลัมน์ BookingSource (แหล่งที่มาของการจอง) และนับจำนวนการจอง ตั้งชื่อว่า NumberOfBookings
  • FROM unified_data: ดึงข้อมูลจากตาราง unified_data
  • GROUP BY BookingSource: จัดกลุ่มข้อมูลตาม BookingSource เพื่อให้นับจำนวนการจองแยกตามแต่ละช่องทาง
  • ORDER BY COUNT(*) DESC: เรียงลำดับผลลัพธ์ตามจำนวนการจอง จากมากไปน้อย (อันดับสูงสุดมาเป็นอันดับแรก)

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

เห็นมั้ย เพราะเรา clean data มาดี ทำให้ clean ทีเดียว เขียนโค้ดต่ออีกนิดเดียวก็ได้คำตอบมากมาย ตีลังกาได้หลายตะหลบ เพียงแค่เรารู้ว่า “เราอยากรู้อะไรในข้อมูลเหล่านี้” และ “จะนำเสนอข้อมูลแบบนี้ในทางใด” เพราะเราใช้ MySQL ในการดึงข้อมูลที่ต้องการ เพื่อตอบคำถามทางธุรกิจของโรงแรม การวิเคราะห์ข้อมูลและนำเสนอในรูปแบบที่เข้าใจง่ายนี้ จะช่วยให้โรงแรมสามารถนำ Insight ที่ได้ไปปรับปรุงกลยุทธ์และพัฒนาธุรกิจให้เติบโตยิ่งขึ้น! ข้อมูลพร้อมให้โรงแรมนำไปใช้แล้ว! 😊


สรุปผล: ไขความลับลูกค้าโรงแรม!

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

  • พักนานแค่ไหน? ดูที่อายุ!
    • จากการวิเคราะห์พบว่า กลุ่มวัยทำงานตอนต้น (20-29 ปี) มีแนวโน้มที่จะเข้าพักนานกว่ากลุ่มอื่นอย่างเห็นได้ชัด! นี่อาจเป็นสัญญาณที่ดีที่เราควรพิจารณาจัดแพ็กเกจสุดคุ้มสำหรับคนวัยนี้ เพื่อดึงดูดให้พวกเขามาพักกับเรานานๆ ครับ
  • ชอบห้องแบบไหน? ขึ้นอยู่กับใครมา!
    • ข้อมูลเผยว่า ลูกค้าที่มาเป็นคู่ ส่วนใหญ่นิยมจองห้องพักประเภท Deluxe ในขณะที่ ลูกค้าที่มาเป็นครอบครัว มักจะมองหาห้องพักประเภท Family ส่วน ลูกค้าที่มาคนเดียว ก็ยังคงชื่นชอบห้อง Standard การเห็นภาพแบบนี้ทำให้เราเข้าใจความต้องการของลูกค้าแต่ละกลุ่มได้ลึกซึ้งขึ้นเยอะเลย! ใครที่เคยคิดว่าลูกค้าทุกคนมีความต้องการเหมือนกัน คงต้องเปลี่ยนความคิดแล้วล่ะ!
  • จองผ่านช่องทางไหน? ช่องทางไหนปัง!
    • ชัดเจนเลยว่า เว็บไซต์โรงแรมโดยตรง เป็นช่องทางที่ลูกค้าใช้จองมากที่สุด! นี่เป็นสัญญาณดีที่เราควรทุ่มเทลงทุนกับช่องทางนี้ต่อไป ในขณะที่ช่องทางอย่าง โทรศัพท์ มีสัดส่วนการจองน้อยกว่ามาก อาจถึงเวลาที่เราต้องพิจารณาปรับปรุงหรือลดความสำคัญลงครับ

โดยรวมแล้ว ผลการวิเคราะห์ข้อมูลช่วยให้เราเข้าใจพฤติกรรมและความต้องการของลูกค้าได้ชัดเจนขึ้นเยอะ ซึ่งมีประโยชน์สุดๆ ในการปรับปรุงและพัฒนากลยุทธ์ทางการตลาดให้มีประสิทธิภาพยิ่งขึ้น!


ข้อเสนอแนะเชิงกลยุทธ์: 5 ท่าไม้ตายพิชิตใจลูกค้า!

จากข้อมูลที่เราวิเคราะห์มา แอดขอเสนอ 5 กลยุทธ์ทางการตลาดสุดปัง เพื่อให้โรงแรม [บริษัทตัวอย่าง] นำไปปรับใช้กันครับ:

  1. จัดแพ็กเกจเอาใจวัยทำงานตอนต้น: ในเมื่อกลุ่มลูกค้าวัย 20-29 ปี มีแนวโน้มเข้าพักนานกว่ากลุ่มอื่น เราควรออกแบบแพ็กเกจพิเศษที่ตอบโจทย์ความต้องการของพวกเขา เช่น แพ็กเกจ Workation ที่พักพร้อมทำงาน หรือส่วนลดพิเศษสำหรับการเข้าพักระยะยาว!
  2. ปรับปรุงและนำเสนอห้องพักให้ตรงใจแต่ละสไตล์: จากข้อมูลการจอง เราเห็นว่าลูกค้าแต่ละกลุ่มมีแนวโน้มเลือกห้องพักต่างกัน ดังนั้น เราควรปรับปรุงหรือนำเสนอห้องพักให้ตอบโจทย์แต่ละสไตล์มากขึ้น เช่น โปรโมต ห้อง Deluxe สำหรับคู่รัก, เน้น ห้อง Family สำหรับครอบครัว, และนำเสนอ ห้อง Standard สำหรับคนที่มาคนเดียว ให้ชัดเจน
  3. ปั้นเว็บไซต์โรงแรมให้ปังกว่าเดิม: ในเมื่อช่องทางเว็บไซต์โดยตรงเป็นที่นิยม เราควรลงทุนเพิ่มเติมเพื่อพัฒนาประสบการณ์การจองให้ดียิ่งขึ้น เช่น ปรับปรุงเว็บไซต์ให้ใช้งานง่ายขึ้น, จัด โปรโมชั่นพิเศษสำหรับลูกค้าที่จองผ่านเว็บไซต์, หรือทำการตลาดออนไลน์เพื่อดึงดูดลูกค้าให้มาจองผ่านช่องทางนี้มากขึ้น
  4. พิจารณาโปรโมทช่องทางจองที่ยังไม่เป็นที่รู้จัก: ช่องทางอย่าง โทรศัพท์ อาจจะยังไม่เป็นที่นิยมในตอนนี้ แต่เราก็ไม่ควรทิ้งไปซะทีเดียว ลองทำการตลาดเพื่อโปรโมทช่องทางนี้ให้ลูกค้าเห็นมากขึ้น เช่น จัดโปรโมชั่นเฉพาะ, ทำคอนเทนต์รีวิว, หรือร่วมมือกับ Influencer เพื่อสร้างความน่าสนใจ
  5. สร้าง Loyalty Program มัดใจลูกค้า: เพื่อกระตุ้นให้ลูกค้ากลับมาใช้บริการซ้ำ เราควรสร้างโปรแกรมสะสมแต้มหรือสิทธิพิเศษสำหรับลูกค้าประจำ เช่น ส่วนลดพิเศษ, อัพเกรดห้องพักฟรี, หรือ สิทธิพิเศษในการจองห้องพักก่อนใคร

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

สุดท้ายนี้! โพสต์นี้แอดอยากให้มุมมองทางด้านการประยุกต์ใช้ Coding โดยยกตัวอย่างจาก Raw Data ไปสู่ Visualization ซึ่งในทางปฏิบัติจริง Raw Data จะมีมากมายมหาศาล และอาจติดปัญหาที่แก้ไม่ได้ง่ายๆ แบบตัวอย่างนี้ แต่เชื่อว่า ถ้าทุกคนติดตามอ่านโพสต์ถัดๆ ไป อาจช่วยประกอบร่างทำให้เห็นภาพมากยิ่งขึ้นแน่นอนครับ

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


Leave a comment