04. ์ดํ ์์ธก (Churn Prediction)
1. ์ดํ(Churn)์ด๋?
๊ณ ๊ฐ์ด ์๋น์ค๋ฅผ ๊ทธ๋ง๋๋ ๊ฒ์ **์ดํ(Churn)**์ด๋ผ๊ณ ํฉ๋๋ค. ์ ๊ท ๊ณ ๊ฐ์ ์ ์นํ๋ ๋น์ฉ์ ๊ธฐ์กด ๊ณ ๊ฐ์ ์ ์งํ๋ ๋น์ฉ๋ณด๋ค 5~25๋ฐฐ ๋ ๋น์๋๋ค. ๋ฐ๋ผ์ ์ดํํ ๊ฒ ๊ฐ์ ๊ณ ๊ฐ์ ๋ฏธ๋ฆฌ ์์ธกํ๊ณ , ํํ์ ์ฃผ์ด ์ก๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
2. ๋ฐ์ดํฐ ์ค๋น ๋ฐ ์ ์ฒ๋ฆฌ
์ดํ ์์ธก์ Classification(๋ถ๋ฅ) ๋ฌธ์ ์ ๋๋ค. ์ดํ ์ฌ๋ถ(1: ์ดํ, 0: ์ ์ง)๋ฅผ ์์ธกํฉ๋๋ค.
โ ๋ฌธ์ 1: ๋ฒ์ฃผํ ๋ณ์ ๋ณํ
Q. โPriorityโ์ โChannelโ ์ปฌ๋ผ์ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ด ์ดํดํ ์ ์๋๋ก ์ซ์๋ก ๋ณํํ์ธ์. (Label Encoding ๋ฑ ํ์ฉ)
์ด๋ก ์ฐธ๊ณ : Classification & NLP Concepts
Python (Scikit-Learn)
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# ๋ฐ์ดํฐ ๋ก๋ (๊ฐ์ ๋ฐ์ดํฐ)
df = pd.DataFrame({
'user_id': [1, 2, 3, 4],
'priority': ['High', 'Low', 'Medium', 'High'],
'channel': ['Email', 'Chat', 'Email', 'Phone'],
'churned': [1, 0, 0, 1]
})
# Label Encoding
le = LabelEncoder()
df['priority_encoded'] = le.fit_transform(df['priority'])
# ๊ฒฐ๊ณผ ํ์ธ
print(df[['priority', 'priority_encoded']])priority priority_encoded 0 High 0 1 Low 1 2 Medium 2 3 High 0
3. ๋ชจ๋ธ ํ์ต (Logistic Regression)
๋ก์ง์คํฑ ํ๊ท๋ ์ดํ ํ๋ฅ (0~1)์ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ๋ง์ผํ ์ ํ์ฉํ๊ธฐ ์ข์ต๋๋ค.
โ ๋ฌธ์ 2: ๋ชจ๋ธ ํ์ต ๋ฐ ์ค์ ๋ณ์ ํ์ธ
Q. ๋ก์ง์คํฑ ํ๊ท ๋ชจ๋ธ์ ํ์ต์ํค๊ณ , ์ด๋ค ๋ณ์๊ฐ ์ดํ์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋์ง(Coefficient) ํ์ธํ์ธ์.
Python (Scikit-Learn)
from sklearn.linear_model import LogisticRegression
# X(Feature)์ y(Target) ๋ถ๋ฆฌ
X = df[['priority_encoded']] # ์์๋ฅผ ์ํด 1๊ฐ ๋ณ์๋ง ์ฌ์ฉ
y = df['churned']
# ๋ชจ๋ธ ํ์ต
model = LogisticRegression()
model.fit(X, y)
# ํ๊ท ๊ณ์(Coefficient) ํ์ธ
# ์์(+)๋ฉด ์ดํ ํ๋ฅ ์ ๋์ด๋ ์์ธ, ์์(-)๋ฉด ๋ฎ์ถ๋ ์์
๋๋ค.
print(f"Priority Coefficient: {model.coef_[0][0]:.4f}")Priority Coefficient: -0.9156
4. ํ๊ฐ (Evaluation)
๋จ์ ์ ํ๋(Accuracy)๋ณด๋ค **์ฌํ์จ(Recall)**์ด ์ค์ํ ์ ์์ต๋๋ค. ์ค์ ์ดํํ ๊ณ ๊ฐ์ ๋์น์ง ์๊ณ ์ฐพ์๋ด๋ ๊ฒ์ด ์ดํ ๋ฐฉ์ง ๋ง์ผํ ์ ํต์ฌ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ก ์ฐธ๊ณ : Model Evaluation Metrics