0 of 16 lessons complete (0%)
Exit Course

Lesson 9 – Predict customer churn

📝 คอร์สนี้ไม่ใช่คอร์สสอน coding/ programming นะครับ แอดแค่ยก code มาให้ดูเป็นตัวอย่างว่าเราเขียนโค้ดสร้าง ML models ยังไง ถ้าใครอยากเรียน code เต็มๆ มาลงเรียน bootcamp กับแอด 555+

Churn Modeling

มาลองดู churn prediction กันบ้าง ตัวอย่างนี้จะเป็น binary classification โดยเราจะทำนายว่าลูกค้าจะอยู่กับเราต่อเดือนหน้าหรือเปล่า (yes/no)

Churn Rate ที่มาจาก Google

ความหมายของ churn rate ในทางการตลาดคือ % ลูกค้าที่เลิกใช้บริการเรา เช่น AIS มี churn rate 5% แปลว่าลูกค้าย้ายค่ายไป TRUE/ dtac (อันนี้ตัวเลขสมมตินะครับ 555+)

Churn Dataset

ตัวอย่าง dataset แอดไปค้นมาจากเว็บไซต์ data.world นักเรียนจะชอบถามว่าหาข้อมูลจากไหนดี แอดแนะนำเว็บนี้เลยครับ พรีเมียม มี free dataset ให้เราดาวน์โหลดมาเล่นเยอะมาก

เว็บไซต์ data.world ไว้หา free dataset

ตัวอย่าง churn dataset ที่เราจะใช้เทรนโมเดล classification ในบทนี้แอดใช้ Logistic Regression เป็น baseline model นะครับ

preview churn dataset

Review Basic ML Workflow

ขั้นตอนการเทรนโมเดลเหมือนกับบทมะกี้เลย พอเราเทรนโมเดลแรกได้แล้ว โมเดลต่อไปก็ง่ายเลย สุดยอด!

Basic ML Workflow

Full Code ที่เราใช้เทรนโมเดล logistic regression glm มีเปลี่ยนจากตอนเทรน linear regression นิดเดียว

Code Demo
# load library
library(tidyverse)
library(caret)

# read csv data
url <- "https://raw.githubusercontent.com/toyeiei/datarockieblog/main/course/ml4e/churn.csv"
df <- read_csv(url)

# convert column churn to factor
df$churn <- as.factor(df$churn)

# split data
set.seed(42)
id <- sample(1:nrow(df), 0.8*nrow(df))
train_df <- df[id, ]
test_df <- df[-id, ]

# train model
model <- train(churn ~ ., data = train_df, method = "glm")

# predict new data
pred_price <- predict(model, newdata = test_df)

# evaluate model
confusionMatrix(pred_price, test_df$churn, positive = "TRUE")

What Changes?

สิ่งที่แตกต่างจากตอนเทรน Linear Regression มีอยู่สามจุด

1 – R จะเทรนโมเดล classification ก็ต่อเมื่อคอลัมน์ churn เป็น factor (categorical data)

# convert column churn to factor
df$churn <- as.factor(df$churn)

2 – เราเปลี่ยน method ในฟังก์ชัน train() เป็น glm ย่อมาจาก generalized linear model ตัว default ของ glm คือ Logistic Regression

# train model
model <- train(churn ~ ., data = train_df, method = "glm")

3 – เราเปลี่ยนวิธีการ evaluate model มาใช้ confusion matrix ซึ่งเป็นท่ามาตรฐานในการวัดผล classification model อ่านวิธีการอธิบายผลได้ในหัวข้อถัดไป

# evaluate model
confusionMatrix(pred_price, test_df$churn, positive = "TRUE")

Confusion Matrix

Confusion matrix จะเอาผลทำนายมา cross กับค่าจริง (prediction x actual) ผลรวมของเส้นทแยงมุม diagonal line หารด้วยผลรวมของทั้งตารางคือค่า overall accuracy ของโมเดล

Overall Accuracy = (835 + 31) / (835 + 113 + 21 + 31) = 86.6%

📝 นอกจากค่า accuracy ยังมี metrics อื่นๆ เช่น recall, precision, F1-score และ AUC ให้เราใช้วัดผลอีกด้วย

Churn is More Difficult Than You Think

ปัญหา churn ยากกว่าที่เราคิดเยอะเลยในชีวิตจริง

ปัญหา churn ดูเผินๆเหมือนจะง่าย แต่จริงๆมันมีความยากแอบซ่อนอยู่ เพราะความน่าจะเป็นที่ลูกค้าจะ churn มีน้อยมาก เช่น 95:5 หรือ 90:10 เราเรียกปัญหานี้ว่า Imbalanced Classification

ในตัวอย่างนี้ ถ้าแอดไม่ใช้โมเดลอะไรเลย แต่ใช้แค่ descriptive statistics ธรรมดา (No Model) >> ทำนายว่าทุกคนจะอยู่ต่อ no churn เราจะทายถูก overall accuracy 85.86%

LabelNPercentage
Churn70714.14%
No Churn429385.86%

📝 Logistic Regression มี test accuracy อยู่ที่ 86.6% แปลว่ามันดีกว่า No Model 85.86% อยู่ไม่ถึง 1% เอง

มีโมเดลแล้วดีขึ้นไหม? ดีขึ้น แต่ดีขึ้นเยอะไหม? ยังมีการบ้านให้ทีมเราทำอีกเยอะเลยครับ

บางปัญหาก็ยากกว่าที่ตาเราเห็น โดยเฉพาะ Imbalanced Classification ที่ทุกคนจะต้องเจอแน่ๆตอนทำงานจริง

Formative Quiz