[AICE ASSOCIATE] 고객 이탈 여부

동훈·2025년 1월 23일

AIVLE School 미니프로젝트

통신 서비스 이용 고객의 이탈 여부 예측 문제


[미션 안내]

  • 고객 관련 데이터를 분석한 후 고객의 서비스 중단 또는 경쟁업체로의 이탈 여부를 예측하는 머신러닝, 딥러닝 모델을 만들고 결과를 예측하세요.

[미션 안내]

  • 고객 관련 데이터를 분석한 후 고객의 서비스 중단 또는 경쟁업체로의 이탈 여부를 예측하는 머신러닝, 딥러닝 모델을 만들고 결과를 예측하세요.

1. scikit-learn 패키지는 머신러닝 교육을 위한 최고의 파이썬 패키지입니다.

scikit-learn를 별칭(alias) sk로 임포트하는 코드를 작성하고 실행하세요.

# 여기에 답안코드를 작성하세요.
import sklearn as sk

2. Pandas를 사용할 수 있도록 별칭(alias)을 pd로 해서 불러오세요.

# 여기에 답안코드를 작성하세요.
import pandas as pd

3. 모델링을 위해 분석 및 처리할 데이터 파일을 읽어오려고 합니다.

Pandas함수로 데이터 파일을 읽어 데이터프레임 변수명 df에 할당하는 코드를 작성하세요.

  • churn_data.csv 파일을 읽어 데이터 프레임 변수명 df에 할당하세요.
# 여기에 답안코드를 작성하세요.
df = pd.read_csv("churn_data.csv")
df

4. df에서 불필요한 customerID 컬럼을 삭제하고 df1에 저장하세요.

# 여기에 답안코드를 작성하세요.

df1 = df.drop('customerID', axis=1)

5. df1의 TotalCharges 컬럼의 타입을 float로 변경하세요.

  • TotalCharge의 컬럼 타입을 확인하는 코드를 작성하세요.
  • ' ' 값을 0으로 변환하고 컬럼 타입을 float로 변경하세요.
  • 전처리 후 데이터를 df2에 저장하세요.
# 여기에 답안코드를 작성하세요.

df1['TotalCharges'].dtype
df1['TotalCharges'].replace([' '], ['0'], inplace=True)
df1['TotalCharges'] = df1['TotalCharges'].astype(float)
df2=df1.copy()

6. df2에서 churn 컬럼의 데이터별 개수를 확인하는 코드를 작성하고 df2를 df3에 저장하세요.

df2의 churn 컬럼의 Yes, No를 각각 1, 0으로 변환한 후 df3의 churn컬럼에 저장하세요.

# 여기에 답안코드를 작성하세요.

df2['Churn'].value_counts()
df3 = df2.copy()
df3['Churn'] = df2['Churn'].replace(['Yes', 'No'], [1, 0])

7. df3의 모든 컬럼에 대해 결측치를 확인하는 코드를 작성하고 결측치를 처리하세요.

  • df3을 df4에 저장하세요.
  • df4의 결측치가 40% 이상인 컬럼은 컬럼을 삭제하세요.
  • df4의 결측치가 40% 미만인 컬럼은 결측치가 있는 row를 삭제하세요.
# 여기에 답안코드를 작성하세요.

print(df3.isnull().sum())
df4 = df3.copy()
df4.drop('DeviceProtection', axis=1, inplace=True)
df4.dropna(inplace=True)
df4.info()

8. df4에서 SeniorCitizen 컬럼을 bar 차트로 확인해보고 불균형을 확인해보세요.

SeniorCitizen 컬럼은 불균형이 심하므로 삭제하세요.

# 여기에 답안코드를 작성하세요.
df4['SeniorCitizen'].value_counts().plot(kind='bar')
df4.drop('SeniorCitizen', axis=1, inplace=True)
df4.info()

9. df4에서 다음의 가이드에 따라 데이터를 시각화 해보세요.

  • tenure (서비스 사용기간)에 대해 히스토그램으로 시각화 하세요.
  • tenure를 x 값으로 churn을 hue 값으로 사용하여 kdeplot으로 시각화 하고 '서비스 사용기간이 길어질 수록 이탈이 적다'에 대해 'O'인지 'X'인지 출력하세요.
  • 'tenure','MonthlyCharges','TotalCharges' 컬럼간의 상관관계를 확인하여 heatmap으로 시각화하고 가장 높은 상관계수 값을 출력하세요.
# 여기에 답안코드를 작성하세요.

import seaborn as sns
import matplotlib.pyplot as plt
sns.histplot(data=df4, x='tenure')
plt.show()

sns.kdeplot(data=df4, x='tenure', hue='Churn')
plt.show()
print('O')

sns.heatmap(df4[['tenure','MonthlyCharges','TotalCharges']].corr(), annot=True)
print(0.83)

10. df4에서 컬럼의 데이터 타입이 object인 컬럼들을 원-핫 인코딩하세요.

  • 컬럼의 데이터 타입이 object인 컬럼들을 object_cols 변수에 저장하세요.
  • object_cols 변수의 컬럼들을 원-핫 인코딩하세요.
  • 전처리된 데이터를 df5에 저장하세요.
# 여기에 답안코드를 작성하세요.

object_cols = df4.select_dtypes('object').columns.values
df5 = pd.get_dummies(data=df4, columns=object_cols)

11. df5에 대해 Scikit-learn의 train_test_split 함수로 훈련, 검증 데이터를 분리하세요.

  • 입력 : X, y (y에는 churn을 저장하고 X에는 churn을 제외한 나머지를 저장하세요)
  • Train : Test 비율 = 8:2
  • y Class 비율에 맞게 나누는 옵션을 추가하세요.
  • random_state=42 로 설정하세요.
  • 결과 : X_train, X_valid, y_train, y_valid에 저장하세요.
# 여기에 답안코드를 작성하세요.
from sklearn.model_selection import train_test_split

X = df5.drop('Churn', axis=1).values
y = df5['Churn'].values

X_train, X_valid, y_train, y_valid = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    stratify=y,
                                                    random_state=42)

12. MinMaxScaler 함수를 'scaler'로 정의하고 데이터를 정규화하세요.

# 여기에 답안코드를 작성하세요.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)

13. 고객 이탈 여부를 예측하는 머신러닝 모델을 만들려고 합니다.

아래 가이드에 따라 모델링하고 학습을 진행하세요.

  • LogisticRegression 모델 정의하고 학습시키세요.
  • KNN으로 모델을 정의하고 학습시키세요. (n_neighbors=5)
  • Decision Tree로 모델을 정의하고 학습시키세요. (max_depth=10, random_state=42)
  • RandomForest로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)
  • XGBoost로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)
  • Light GBM으로 모델을 정의하고 학습시키세요. (n_estimators=3, random_state=42)
  • 각각 다른 셀에 답안코드를 작성하세요.
# 여기에 답안코드를 작성하세요.

from sklearn.linear_model import LogisticRegression
lg = LogisticRegression()
lg.fit(X_train, y_train)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=10, random_state=42)
dt.fit(X_train, y_train)

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators=3, random_state=42)
rfc.fit(X_train, y_train)

!pip install xgboost
from xgboost import XGBClassifier
xgb = XGBClassifier(n_estimators=3, random_state=42)  
xgb.fit(X_train, y_train)

!pip install lightgbm
from lightgbm import LGBMClassifier
lgbm = LGBMClassifier(n_estimators=3, random_state=42)  
lgbm.fit(X_train, y_train)

14. 바로 위 Light GBM 모델의 성능을 평가하려고 합니다.

y값을 예측하여 confusion matrix를 구하고 heatmap 그래프로 시각화하세요.

그리고 Scikit-learn의 classification_report를 활용하여 성능을 출력하세요.

# 여기에 답안코드를 작성하세요.

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

y_pred = lgbm.predict(X_valid)
cm = confusion_matrix(y_valid, y_pred)
sns.heatmap(cm, annot=True)

print(classification_report(y_valid, y_pred, zero_division=1))
다음 문항을 풀기 전에 아래 코드를 실행하세요.
import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Activation, Dropout, BatchNormalization
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.utils import to_categorical

tf.random.set_seed(1)

15. 고객 이탈여부를 예측하는 딥러닝 모델을 만들려고 합니다.

아래 가이드에 따라 모델링하고 학습을 진행하세요.

  • Tensoflow framework를 사용하여 딥러닝 모델을 만드세요.
  • 히든레이어(hidden layer) 2개이상으로 모델을 구성하세요.
  • dropout 비율 0.2로 Dropout 레이어 1개를 추가해 주세요.
  • 하이퍼파라미터 epochs: 30, batch_size: 16으로 설정해주세요.
  • 각 에포크마다 loss와 metrics 평가하기 위한 데이터로 X_valid, y_valid 사용하세요.
  • 학습정보는 history 변수에 저장해주세요
# 여기에 답안코드를 작성하세요.

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', 
              loss='binary_crossentropy', 
              metrics=['accuracy']) 

es = EarlyStopping(monitor='val_loss', patience=5) 

checkpoint_path = 'best_model.keras'
mc = ModelCheckpoint(checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True)

history = model.fit(X_train, y_train, epochs=30, batch_size=16,
                   validation_data = (X_valid, y_valid),
                    callbacks=[es, mc]
                    )

16. 위 딥러닝 모델의 성능을 평가하려고 합니다.

Matplotlib 라이브러리 활용해서 학습 accuracy와 검증 accuracy를 그래프로 표시하세요.

  • 1개의 그래프에 학습 accuracy와 검증 accuracy 2가지를 모두 표시하세요.
  • 위 2가지 각각의 범례를 'acc', 'val_acc'로 표시하세요.
  • 그래프의 타이틀은 'Accuracy'로 표시하세요.
  • X축에는 'Epochs'라고 표시하고 Y축에는 'Acc'라고 표시하세요.
# 여기에 답안코드를 작성하세요.
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Acc')
plt.legend(['acc', 'val_acc'])
plt.show()
profile
성실함 한스쿱

0개의 댓글