CRM Campaign Response Project – Data Analysis & Power BI Dashboard

โปรเจกต์นี้เป็นการวิเคราะห์ประสิทธิภาพของแคมเปญการตลาดในกลุ่มลูกค้าต่าง ๆ โดยใช้ข้อมูลสมมุติจากระบบ CRM
ฉันใช้เครื่องมืออย่าง SQL, Python และ Power BI เพื่อเตรียมข้อมูล วิเคราะห์รูปแบบ และสร้างแดชบอร์ดแสดงผลลัพธ์ เช่น ROI และ Conversion Rate รวมถึงการวิเคราะห์ทางสถิติเพื่อหาความแตกต่างและความสัมพันธ์ของข้อมูลในเชิงลึก
แม้ข้อมูลจะไม่ใช่ของจริง แต่ทุกขั้นตอนสะท้อนกระบวนการวิเคราะห์ CRM ที่เกิดขึ้นจริงในงานด้าน Data Analytics


Dataset Description

  • แหล่งข้อมูล : ชุดข้อมูลสมมุติ (Synthetic Data) ที่สร้างขึ้นเพื่อจำลองสถานการณ์การทำแคมเปญการตลาดของธุรกิจ
  • การจัดการข้อมูล : ข้อมูลนี้ถูกนำเข้าและจัดเก็บในฐานข้อมูล MySQL (ผ่าน AWS RDS) จากนั้นนำมาใช้วิเคราะห์และสร้างแดชบอร์ดด้วย Power BI
  • การเตรียมข้อมูลสำหรับการทดสอบทางสถิติ: การสร้างตารางแยกเฉพาะเพื่อใช้ในการวิเคราะห์ความสัมพันธ์ เช่น
    • ANOVA: ROI ~ Campaign Type
    • Chi-Square: Channel Used × Customer Segment
  • Link Source : Marketing Campaign Performance Dataset

Process

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

นำเข้าข้อมูล (Data Acquisition) ข้อมูลเราจะดำเนินการนำขึ้นบน MySQL (AWS RDS)
โดยการใช้ Beekeeper Studio และ SQL เพื่อสร้างตารางบน Database และนำข้อมูล CSV ไป Map บน AWS RDS

พร้อมทำ Data Validation (ตรวจสอบความถูกต้องของข้อมูล) และ Data Cleaning /Preprocessing

Code SQL — Data Validation
-- Data Validation
-- Check rows
SELECT COUNT(*) AS total_rows FROM customer_segmentation;

-- Check Duplicated (DISTINCT)
SELECT campaign_id, COUNT(*) 
FROM customer_segmentation
GROUP BY campaign_id
HAVING COUNT(*) > 1;

-- Chenk Missing (IS NULL)
SELECT 
  SUM(campaign_type IS NULL) AS missing_campaign_type,
  SUM(channel_used IS NULL) AS missing_channel,
  SUM(target_audience IS NULL) AS missing_audience,
  SUM(customer_segment IS NULL) AS missing_segment,
  SUM(conversion_rate IS NULL) AS missing_conversion,
  SUM(engagement_score IS NULL) AS missing_engagement,
  SUM(acquisition_cost IS NULL) AS missing_cost,
  SUM(roi IS NULL) AS missing_roi,
  SUM(date IS NULL) AS missing_date
FROM customer_segmentation;

-- Chenk Conversion Rate & ROI
SELECT * FROM customer_segmentation
WHERE conversion_rate > 1;
SELECT * FROM customer_segmentation
WHERE roi < -100 OR roi > 100;

-- Show dataset 10 row
SELECT * FROM customer_segmentation LIMIT 10;
Code SQL — Data Cleaning /Preprocessing
-- Data Cleaning
-- Delete rows with incomplete data
DELETE FROM customer_segmentation
WHERE campaign_type IS NULL 
   OR customer_segment IS NULL 
   OR conversion_rate IS NULL;
   
-- Adjust conversion_rate if greater than 1  
UPDATE customer_segmentation
SET conversion_rate = conversion_rate / 100
WHERE conversion_rate > 1;

-- Convert format date column
UPDATE customer_segmentation
SET date = STR_TO_DATE(date, '%d/%m/%Y')
WHERE date LIKE '%/%';

-- Create a separate column by Quarter (Q1, Q2...)
ALTER TABLE customer_segmentation ADD COLUMN campaign_quarter VARCHAR(3);

UPDATE customer_segmentation
SET campaign_quarter = 
  CASE 
    WHEN MONTH(date) BETWEEN 1 AND 3 THEN 'Q1'
    WHEN MONTH(date) BETWEEN 4 AND 6 THEN 'Q2'
    WHEN MONTH(date) BETWEEN 7 AND 9 THEN 'Q3'
    WHEN MONTH(date) BETWEEN 10 AND 12 THEN 'Q4'
    ELSE 'N/A'
  END;

เตรียมข้อมูลสำหรับการทดสอบทางสถิติ สร้าง Dataframe สำหรับ ANOVA และ Chi-Square write to csv.

Code SQL — One-way ANOVA
-- One-way ANOVA type_ROI
SELECT 
  campaign_type,
  roi
FROM customer_segmentation
WHERE campaign_type IS NOT NULL
  AND roi IS NOT NULL;

-- AVG ROI by Campaign Type  
SELECT 
  campaign_type,
  COUNT(*) AS n,
  AVG(roi) AS avg_roi,
  STDDEV(roi) AS std_dev
FROM customer_segmentation
GROUP BY campaign_type;

-- One-way ANOVA rate_segment
SELECT 
  customer_segment,
  conversion_rate
FROM customer_segmentation
WHERE customer_segment IS NOT NULL
  AND conversion_rate IS NOT NULL;

-- One-way ANOVA type_score
SELECT 
  campaign_type,
  engagement_score
FROM customer_segmentation
WHERE campaign_type IS NOT NULL
  AND engagement_score IS NOT NULL;
Code SQL — Chi-Square
-- chi_channel_segment
SELECT 
  channel_used,
  customer_segment,
  COUNT(*) AS count
FROM customer_segmentation
GROUP BY channel_used, customer_segment
ORDER BY channel_used, customer_segment;
  
-- chi_type_segment
SELECT 
  campaign_type,
  customer_segment,
  COUNT(*) AS count
FROM customer_segmentation
GROUP BY campaign_type, customer_segment
ORDER BY campaign_type, customer_segment;

-- chi_channel_type
SELECT 
  campaign_type,
  channel_used,
  COUNT(*) AS count
FROM customer_segmentation
GROUP BY campaign_type, channel_used
ORDER BY campaign_type, channel_used;

Statistical Testing

วิเคราะห์ข้อมูลเบื้องต้นและทำการทดสอบทางสถิติ เช่น ANOVA และ Chi-Square ด้วยภาษา Python ผ่านไลบรารี scipy.stats เพื่อค้นหาความสัมพันธ์และความแตกต่างของกลุ่มข้อมูล

  • สมมติฐานตั้งต้น (H₀):
    ไม่มีความแตกต่างหรือความสัมพันธ์อย่างมีนัยสำคัญระหว่างกลุ่มที่ศึกษา
  • สมมติฐานทางเลือก (H₁):
    มีความแตกต่างหรือความสัมพันธ์อย่างมีนัยสำคัญระหว่างกลุ่มที่ศึกษา

การแปลผล:
หากค่า p-value < 0.05 แสดงว่ามีความแตกต่างหรือความสัมพันธ์อย่างมีนัยสำคัญทางสถิติ (ปฏิเสธ H₀)
หากค่า p-value ≥ 0.05 แสดงว่าไม่พบความแตกต่างหรือความสัมพันธ์อย่างมีนัยสำคัญ (ไม่ปฏิเสธ H₀)

Test ANOVA with Python
import pandas as pd

# read_df
df_anova_type_roi = pd.read_csv('/data/notebook_files/data/anova_type_roi.csv')
df_anova_rate_segment = pd.read_csv('/data/notebook_files/data/anova_segment_rate.csv')
df_anova_type_score = pd.read_csv('/data/notebook_files/data/anova_type_score.csv')

# Check df
print(df_anova_type_score.head())

# Analysis ANOVA
from scipy.stats import f_oneway

def run_anova(df, group_col, value_col):
    groups = []
    for name, group in df.groupby(group_col):
        groups.append(group[value_col].dropna().values)  # handle missing values if any
    
    f_stat, p_val = f_oneway(*groups)
    print(f"ANOVA for '{value_col}' by '{group_col}':")
    print(f"F-statistic: {f_stat:.4f}")
    print(f"P-value: {p_val:.4f}\n")

# anova_type_roi
run_anova(df_anova_type_roi, 'campaign_type', 'roi')

# anova_rate_segment
run_anova(df_anova_rate_segment, 'customer_segment', 'conversion_rate')

# anova_type_score
run_anova(df_anova_type_score, 'campaign_type', 'engagement_score')
Test Chi-Square with Python
import pandas as pd

# read_df
df_chi_channel_segment = pd.read_csv('/data/notebook_files/data/chi_contingency_table.csv')
df_chi_type_segment = pd.read_csv('/data/notebook_files/data/chi_test_type_segment.csv')
df_chi_channel_type = pd.read_csv('/data/notebook_files/data/chi_test_channel_type.csv')

# Check df
print(df_chi_channel_type.head())

from scipy.stats import chi2_contingency

def run_chi_square(df, index_col, columns_col, values_col='count'):
    
    contingency = df.pivot(index=index_col, columns=columns_col, values=values_col).fillna(0)
    chi2, p_val, dof, expected = chi2_contingency(contingency)
    
    print(f"Chi-square Test for '{index_col}' vs '{columns_col}':")
    print(f"Chi-square statistic: {chi2:.4f}")
    print(f"Degrees of freedom: {dof}")
    print(f"P-value: {p_val:.4f}\n")
    
# Chi-square Test 1
run_chi_square(df_chi_channel_segment, 'channel_used', 'customer_segment')

# Chi-square Test 2
run_chi_square(df_chi_type_segment, 'campaign_type', 'customer_segment')

# Chi-square Test 3
run_chi_square(df_chi_channel_type, 'channel_used', 'campaign_type')

CRM Project Report with Datalore

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


Dashboard with Power BI

หลังจากทำความสะอาดและวิเคราะห์ข้อมูลแล้ว ข้อมูลที่จัดเก็บไว้ใน AWS RDS (MySQL Database) ถูกนำเข้ามายัง Power BI เพื่อสร้างแดชบอร์ดแสดงผลลัพธ์ของแต่ละแคมเปญอย่างชัดเจน เช่น ค่า ROI, Conversion Rate และ Engagement Score

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

หมายเหตุ: เนื่องจากการใช้ Power BI ในเวอร์ชันฟรี (Free License) ไม่สามารถใช้ฟีเจอร์ Publish to Web ได้โดยตรง ดังนั้นแดชบอร์ดในโปรเจกต์นี้จึงถูก Export ออกมาในรูปแบบภาพ (PDF/PNG) เพื่อแสดงผลเท่านั้น ไม่สามารถโต้ตอบแบบ Interactive ได้เหมือนใน Power BI Service CRM Dashboard PDF


Key Insights

  • ทุกประเภทแคมเปญมีประสิทธิภาพใกล้เคียงกันทั้งในด้าน ROI และ Conversion Rate
  • ไม่พบความแตกต่างอย่างมีนัยสำคัญระหว่างกลุ่มลูกค้าหรือประเภทแคมเปญ จากการทดสอบทางสถิติ (ANOVA และ Chi-Square)
  • แสดงให้เห็นว่าชุดข้อมูลนี้มีการกระจายตัวอย่างสมดุล เหมาะสำหรับการฝึกวิเคราะห์ CRM และการสร้างแดชบอร์ดด้วย Power BI
  • แม้ข้อมูลจะเป็นข้อมูลสมมุติ แต่การวิเคราะห์ที่ดำเนินการนั้นสะท้อนถึงกระบวนการวิเคราะห์ในงานจริงได้อย่างดี

แม้โปรเจกต์นี้จะยังไม่ใช่งานจากประสบการณ์ทำงานจริง แต่ก็เป็นความตั้งใจของผมในการฝึกฝนทักษะด้านการวิเคราะห์ข้อมูลแบบครบขั้นตอน ตั้งแต่การจัดการข้อมูล การวิเคราะห์ทางสถิติ ไปจนถึงการนำเสนอผลลัพธ์ผ่านแดชบอร์ด Power BI
ผมหวังว่าโปรเจกต์นี้จะเป็นตัวอย่างที่ดีในระดับผู้เริ่มต้น และเป็นส่วนหนึ่งของ Portfolio ที่สะท้อนความตั้งใจในการพัฒนาตัวเองเพื่อเข้าสู่สายงาน Data อย่างจริงจังครับ


Report PDF : CRM Campaign Response Project
GitHub Project : Customer Segmentation CRM PowerBI


Comments

Leave a Reply

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