10.4 实际案例分析


文档摘要

10.4 实际案例分析 10.4 Pandas 实际案例分析:客户流失预测 本节将通过一个实际案例,演示如何使用 Pandas 进行数据处理、特征工程,并结合其他库构建一个简单的客户流失预测模型。我们将使用一份模拟的电信客户流失数据集,其中包含客户的基本信息、服务使用情况以及是否流失的标签。 10.4.1 数据集介绍 我们使用一个模拟的电信客户流失数据集,该数据集包含以下特征: CustomerID: 客户ID。 Gender: 性别。 SeniorCitizen: 是否老年人 (1为是,0为否)。 Partner: 是否有配偶。 Dependents: 是否有家属。 tenure: 在网时长(月)。 PhoneService: 是否开通电话服务。

10.4 实际案例分析

10.4 Pandas 实际案例分析:客户流失预测

本节将通过一个实际案例,演示如何使用 Pandas 进行数据处理、特征工程,并结合其他库构建一个简单的客户流失预测模型。我们将使用一份模拟的电信客户流失数据集,其中包含客户的基本信息、服务使用情况以及是否流失的标签。

10.4.1 数据集介绍

我们使用一个模拟的电信客户流失数据集,该数据集包含以下特征:

  • CustomerID: 客户ID。

  • Gender: 性别。

  • SeniorCitizen: 是否老年人 (1为是,0为否)。

  • Partner: 是否有配偶。

  • Dependents: 是否有家属。

  • tenure: 在网时长(月)。

  • PhoneService: 是否开通电话服务。

  • MultipleLines: 是否开通多线电话服务。

  • InternetService: 网络服务类型。

  • OnlineSecurity: 是否开通在线安全服务。

  • OnlineBackup: 是否开通在线备份服务。

  • DeviceProtection: 是否开通设备保护服务。

  • TechSupport: 是否开通技术支持服务。

  • StreamingTV: 是否开通流媒体电视服务。

  • StreamingMovies: 是否开通流媒体电影服务。

  • Contract: 合同类型。

  • PaperlessBilling: 是否开通无纸化账单。

  • PaymentMethod: 付款方式。

  • MonthlyCharges: 月费用。

  • TotalCharges: 总费用。

  • Churn: 是否流失(目标变量)。

10.4.2 数据导入与初步探索

首先,我们使用 Pandas 导入数据并进行初步的探索性分析。

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report import matplotlib.pyplot as plt import seaborn as sns # 导入数据 df = pd.read_csv('telecom_churn.csv') # 假设数据文件名为 telecom_churn.csv # 显示前几行数据 print(df.head()) # 查看数据信息 print(df.info()) # 描述性统计 print(df.describe()) # 检查缺失值 print(df.isnull().sum())

代码解释:

  1. 我们导入了 Pandas, NumPy, scikit-learn (用于模型训练和评估), Matplotlib 和 Seaborn。

  2. pd.read_csv() 用于读取 CSV 文件。请确保 telecom_churn.csv 文件位于您的工作目录中,或者提供文件的完整路径。

  3. df.head() 显示数据的前几行,让我们快速了解数据的结构。

  4. df.info() 提供数据的基本信息,包括列名、数据类型和非空值数量。

  5. df.describe() 提供数值列的描述性统计信息,如均值、标准差、最小值、最大值等。

  6. df.isnull().sum() 检查每列的缺失值数量。

10.4.3 数据清洗与预处理

在数据预处理阶段,我们将处理缺失值、转换数据类型、处理异常值,并进行必要的特征工程。

# 处理 TotalCharges 列的缺失值和数据类型转换 df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan) # 将空格替换为 NaN df['TotalCharges'] = pd.to_numeric(df['TotalCharges']) df['TotalCharges'] = df['TotalCharges'].fillna(df['TotalCharges'].median()) # 用中位数填充缺失值 # 将 Churn 列转换为数值类型 (0 和 1) df['Churn'] = df['Churn'].map({'Yes': 1, 'No': 0}) # 删除 CustomerID 列(如果不需要) df = df.drop('customerID', axis=1)

代码解释:

  1. TotalCharges 列存在空格,需要先替换为 NaN,然后转换为数值类型。

  2. 使用 df['TotalCharges'].fillna(df['TotalCharges'].median()) 用中位数填充 TotalCharges 列中的缺失值。 中位数对于异常值不敏感,因此比平均值更适合。

  3. Churn 列是字符串类型,需要转换为数值类型,方便后续模型训练。

  4. customerID 列通常不包含有用的信息,可以删除。

10.4.4 特征工程

接下来,我们进行特征工程,将分类特征转换为数值特征,并创建新的特征。

# 对分类特征进行独热编码 categorical_cols = df.select_dtypes(include='object').columns df = pd.get_dummies(df, columns=categorical_cols, drop_first=True) # drop_first=True 防止共线性 # 创建新的特征 (例如:每月的平均费用) df['AvgMonthlyCharge'] = df['TotalCharges'] / df['tenure'] df['AvgMonthlyCharge'] = df['AvgMonthlyCharge'].replace([np.inf, -np.inf], 0) #处理inf值

代码解释:

  1. df.select_dtypes(include='object').columns 选择所有 object 类型的列(即分类特征)。

  2. pd.get_dummies() 对分类特征进行独热编码。 drop_first=True 可以防止多重共线性。

  3. 创建 AvgMonthlyCharge 特征,计算每月的平均费用。

  4. 使用df['AvgMonthlyCharge'] = df['AvgMonthlyCharge'].replace([np.inf, -np.inf], 0)处理计算过程中可能产生的无穷值。

10.4.5 数据可视化

通过可视化,我们可以更直观地了解数据分布和特征之间的关系。

# 可视化流失客户的比例 sns.countplot(x='Churn', data=df) plt.title('Churn Distribution') plt.show() # 可视化特征与流失率的关系 plt.figure(figsize=(12, 6)) sns.boxplot(x='Churn', y='tenure', data=df) plt.title('Churn vs. Tenure') plt.show()

代码解释:

  1. sns.countplot() 用于绘制计数图,显示不同类别的数量。

  2. sns.boxplot() 用于绘制箱线图,显示特征的分布情况以及与目标变量的关系。

10.4.6 模型训练与评估

现在,我们将使用处理后的数据训练一个简单的逻辑回归模型,并评估其性能。

# 分割数据集为训练集和测试集 X = df.drop('Churn', axis=1) y = df['Churn'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练逻辑回归模型 model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 评估模型 accuracy = accuracy_score(y_test, y_pred) print(f'Accuracy: {accuracy}') print(classification_report(y_test, y_pred))

代码解释:

  1. train_test_split() 将数据集分割为训练集和测试集。

  2. LogisticRegression() 创建一个逻辑回归模型。 max_iter 参数设置最大迭代次数。

  3. model.fit() 使用训练数据训练模型。

  4. model.predict() 使用测试数据进行预测。

  5. accuracy_score() 计算准确率。

  6. classification_report() 提供更详细的分类报告,包括精确率、召回率、F1 值等。

10.4.7 模型解释

我们可以查看模型的系数,了解哪些特征对客户流失有重要影响。

# 查看特征系数 coefficients = pd.DataFrame(model.coef_[0], index=X.columns, columns=['Coefficient']) coefficients = coefficients.sort_values('Coefficient', ascending=False) print(coefficients)

代码解释:

  1. model.coef_[0] 获取模型的系数。

  2. 创建一个 DataFrame 来显示特征及其对应的系数。

  3. 对系数进行排序,以便了解哪些特征对预测结果影响最大。

10.4.8 完整代码

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report import matplotlib.pyplot as plt import seaborn as sns # 导入数据 df = pd.read_csv('telecom_churn.csv') # 处理 TotalCharges 列的缺失值和数据类型转换 df['TotalCharges'] = df['TotalCharges'].replace(' ', np.nan) df['TotalCharges'] = pd.to_numeric(df['TotalCharges']) df['TotalCharges'] = df['TotalCharges'].fillna(df['TotalCharges'].median()) # 将 Churn 列转换为数值类型 (0 和 1) df['Churn'] = df['Churn'].map({'Yes': 1, 'No': 0}) # 删除 CustomerID 列 df = df.drop('customerID', axis=1) # 对分类特征进行独热编码 categorical_cols = df.select_dtypes(include='object').columns df = pd.get_dummies(df, columns=categorical_cols, drop_first=True) # 创建新的特征 (例如:每月的平均费用) df['AvgMonthlyCharge'] = df['TotalCharges'] / df['tenure'] df['AvgMonthlyCharge'] = df['AvgMonthlyCharge'].replace([np.inf, -np.inf], 0) # 分割数据集为训练集和测试集 X = df.drop('Churn', axis=1) y = df['Churn'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练逻辑回归模型 model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 评估模型 accuracy = accuracy_score(y_test, y_pred) print(f'Accuracy: {accuracy}') print(classification_report(y_test, y_pred)) # 查看特征系数 coefficients = pd.DataFrame(model.coef_[0], index=X.columns, columns=['Coefficient']) coefficients = coefficients.sort_values('Coefficient', ascending=False) print(coefficients) # 可视化流失客户的比例 sns.countplot(x='Churn', data=df) plt.title('Churn Distribution') plt.show() # 可视化特征与流失率的关系 plt.figure(figsize=(12, 6)) sns.boxplot(x='Churn', y='tenure', data=df) plt.title('Churn vs. Tenure') plt.show()

10.4.9 模型流程图 (Mermaid)

图表解释:

  • 数据导入 (A): 从 CSV 文件或其他来源加载数据。

  • 数据清洗 (B): 处理缺失值、异常值和数据类型转换。

  • 特征工程 (C): 创建新的特征或转换现有特征。

  • 数据分割 (D): 将数据分割为训练集和测试集。

  • 模型训练 (E): 使用训练数据训练模型。

  • 模型预测 (F): 使用测试数据进行预测。

  • 模型评估 (G): 评估模型的性能。

  • 模型解释 (H): 解释模型的结果,了解特征的重要性。

10.4.10 总结与展望

通过这个案例,我们演示了如何使用 Pandas 进行数据处理、特征工程,并结合其他库构建一个简单的客户流失预测模型。 实际应用中,可以尝试更复杂的模型、更多的特征工程方法以及更精细的参数调优,以提高模型的预测精度。 此外,还可以将模型部署到生产环境中,实现自动化的客户流失预警。

这个案例只是 Pandas 在实际应用中的一个例子。 Pandas 强大的数据处理能力使其成为数据分析和机器学习领域不可或缺的工具。 通过学习和实践,您可以掌握 Pandas 的各种技巧,并将其应用于更广泛的领域。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U