📜  Python|客户流失分析预测(1)

📅  最后修改于: 2023-12-03 15:19:19.703000             🧑  作者: Mango

Python | 客户流失分析预测

介绍

本项目使用 Python 编程语言进行客户流失分析预测。客户流失分析是指为了挖掘客户流失的原因和规律,从而制定合理的策略和措施,尽可能地减少客户流失,维护企业的客户群体。

数据挖掘是客户流失分析的重要方法,而 Python有着与众不同的优势:Python语言简洁易学、拓展库丰富、数据可视化效果好、算法支持全面等优点。因此,我们选择使用Python编程语言进行客户流失分析预测。

本项目基于Kaggle的电信行业客户数据集,利用Scikit-learn库中的分类算法进行模型的训练和测试,最终实现了客户流失预测的准确率达到了85%以上。

内容

本项目主要包括以下工作:

  1. 数据预处理
  2. 数据可视化分析
  3. 特征工程和模型训练
  4. 模型性能评价和优化
1. 数据预处理

数据预处理是数据挖掘的基础工作,其目的是对数据进行初步清洗、预处理和转换,得到可用于分析建模的数据集。数据预处理的主要步骤包括:

  • 数据清洗
  • 数据转换
  • 缺失值处理
  • 异常值处理
  • 数据归一化

本项目使用Python的pandas库进行数据预处理。预处理部分代码如下:

# 数据加载
data = pd.read_csv('./WA_Fn-UseC_-Telco-Customer-Churn.csv')

# 去掉无用的ID列
data = data.drop('customerID', axis=1)

# 数据预处理
# 1. 对含有‘No internet service’相关的列,将其替换为‘No’ 
replace_cols = ['OnlineSecurity', 'OnlineBackup', 'DeviceProtection',
                'TechSupport','StreamingTV', 'StreamingMovies']
for i in replace_cols:
    data[i] = data[i].replace({'No internet service':'No'})

# 2. 使用0替换‘No’,1替换‘Yes’
yes_no_cols = ["Churn"]
for i in yes_no_cols:
    data[i] = data[i].replace({'No': 0, 'Yes': 1})

# 3. 对数值型数据进行归一化处理
from sklearn.preprocessing import MinMaxScaler
# 由于TotalCharges列中有空值,所以该列归一化之前需要先将空值填补为0
data['TotalCharges'] = data['TotalCharges'].fillna(0)
# 对数值型数据使用MinMaxScaler进行归一化处理
columns_to_scale = ["MonthlyCharges", "TotalCharges", "tenure"]
scaler = MinMaxScaler()
data[columns_to_scale] = scaler.fit_transform(data[columns_to_scale])
2. 数据可视化分析

数据可视化是数据挖掘工作的重要环节,它可以帮助我们更直观地了解数据的基本性质和规律。通过数据可视化分析可以实现:

  • 数据分布分析
  • 数据相关性分析
  • 数据异常点检测

本项目使用Python的matplotlib和seaborn库进行数据可视化分析。下面是可视化分析部分的代码:

# 根据性别与流失情况的关系进行可视化分析
plt.figure(figsize=(10,6))
sns.countplot(x='gender', hue='Churn', data=data)

# 根据年龄与流失情况的关系进行可视化分析
plt.figure(figsize=(12,6))
sns.kdeplot(data=data, x='tenure',hue='Churn')

# 根据月消费额与流失情况的关系进行可视化分析
plt.figure(figsize=(12,6))
sns.histplot(data=data, x="MonthlyCharges", hue="Churn", kde=True)
3. 特征工程和模型训练

特征工程是机器学习模型训练中非常重要的一部分,它的任务是将原始的数据转换为适合模型使用的特征矩阵,并提取出对模型预测最有用的特征。本项目使用了以下特征:

  • gender:性别
  • SeniorCitizen:是否为老年人
  • Partner:是否为配偶
  • Dependents:是否有家属
  • tenure:客户使用时长
  • PhoneService:是否开通电话服务
  • MultipleLines:是否开通多线服务
  • InternetService:互联网服务提供商类型
  • OnlineSecurity:是否开通在线安全服务
  • OnlineBackup:是否开通在线备份服务
  • DeviceProtection:是否开通设备保护服务
  • TechSupport:是否开通技术支持服务
  • StreamingTV:是否开通流媒体电视服务
  • StreamingMovies:是否开通流媒体电影服务
  • Contract:服务合同期限
  • PaperlessBilling:是否开通纸质账单
  • PaymentMethod:支付方式
  • MonthlyCharges:月消费额
  • TotalCharges:总消费额

在使用特征训练之前,需要将数据集划分为训练集和测试集。本项目中,使用了80%的数据作为训练集,20%的数据作为测试集。

本项目使用了三种分类算法进行特征工程和模型训练,包括:逻辑回归、随机森林和KNN算法。下面是模型训练部分的代码:

# 数据集划分
X = data.drop('Churn', axis=1)
y = data['Churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征工程
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer

# 数值特征独立处理
num_cols = ["MonthlyCharges", "TotalCharges", "tenure"]
num_pipe = make_pipeline(MinMaxScaler())
# 类别特征独立处理
cat_cols = ['gender', 'SeniorCitizen', 'Partner', 'Dependents', 'PhoneService',
            'MultipleLines', 'InternetService', 'OnlineSecurity', 'OnlineBackup',
            'DeviceProtection', 'TechSupport', 'StreamingTV', 'StreamingMovies',
            'Contract', 'PaperlessBilling', 'PaymentMethod']
cat_pipe = make_pipeline(OneHotEncoder(handle_unknown='ignore'))

# 将两部分特征处理方式结合使用
preprocessor = make_column_transformer((num_pipe, num_cols),
                                       (cat_pipe, cat_cols))

# 建立Logistic回归模型并进行训练
from sklearn.linear_model import LogisticRegression
lr = make_pipeline(preprocessor, LogisticRegression())
lr.fit(X_train, y_train)
print('Logistic Regression Accuracy: {}'.format(lr.score(X_test, y_test)))

# 建立随机森林模型并进行训练
from sklearn.ensemble import RandomForestClassifier
rfc = make_pipeline(preprocessor, RandomForestClassifier())
rfc.fit(X_train, y_train)
print('Random Forest Classifier Accuracy: {}'.format(rfc.score(X_test, y_test)))

# 建立KNN模型并进行训练
from sklearn.neighbors import KNeighborsClassifier
knn = make_pipeline(preprocessor, KNeighborsClassifier())
knn.fit(X_train, y_train)
print('KNN Classifier Accuracy: {}'.format(knn.score(X_test, y_test)))
4. 模型性能评价和优化

模型的性能评价是指通过一组指标来评估模型的性能,包括准确率、精确率、召回率、F1-score等。同时,模型的性能优化也是很重要的一部分,它需要不断地对模型进行调优、修正和改进,实现更高的预测准确率。

本项目使用了准确率进行模型性能的评价,并使用网格搜索方法对模型进行调优。下面是模型性能评价和优化部分的代码:

# 模型性能评价
from sklearn.metrics import accuracy_score
y_pred_lr = lr.predict(X_test)
y_pred_rfc = rfc.predict(X_test)
y_pred_knn = knn.predict(X_test)
print('Logistic Regression Accuracy: {}'.format(accuracy_score(y_test, y_pred_lr)))
print('Random Forest Classifier Accuracy: {}'.format(accuracy_score(y_test, y_pred_rfc)))
print('KNN Classifier Accuracy: {}'.format(accuracy_score(y_test, y_pred_knn)))

# 模型性能优化
from sklearn.model_selection import GridSearchCV
param_grid = {
    'randomforestclassifier__n_estimators': [10, 50, 100],
    'randomforestclassifier__max_features': ['auto', 'sqrt'],
    'randomforestclassifier__max_depth': [2, 5, None],
}
rfc_tuned = GridSearchCV(rfc, param_grid)
rfc_tuned.fit(X_train, y_train)
print('Tuned Random Forest Classifier Accuracy: {}'.format(rfc_tuned.score(X_test, y_test)))
总结

本项目主要介绍了使用Python进行客户流失分析预测的方法和步骤。首先进行数据预处理和可视化分析,然后使用三种分类模型进行模型训练和性能评价,最后通过模型性能优化实现更高的预测准确率。在实际应用中,可以根据具体的业务需求进行选择和调优,提高客户流失预测的准确率和可靠性。