【数据挖掘】数据挖掘综合案例—银行精准营销

要求:

1、根据相关的信息预测通过电话推销,用户是否会在银行进行存款

2、数据bank.csv,约4520条数据,17个属性值 提示: 17个属性,分别是年龄,工作类型,婚姻状况,受教育背景,信用情况,房贷,个人贷款,联系电话是手机还是固定电话,最后联系月份,最后联系日,通话持续时间,本次活动中联系的次数,最后一次接触距离上一次接触的时间,以前的活动中联系的次数,上一次活动成功与否,是否会进行存款

代码实现:

python 复制代码
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix, roc_auc_score
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False    

#加载本地的数据
file_path = r'D:\课程\数据挖掘\实验八\实验8-bank.csv'
df = pd.read_csv(file_path, sep=';', quotechar='"')

#进行数据预处理
df = df.replace('unknown', np.nan)
for col in ['default', 'housing', 'loan', 'y']:
    df[col] = df[col].map({'yes': 1, 'no': 0, 'unknown': np.nan})

#处理缺失值
mode_values = {
    'job': df['job'].mode()[0] if not df['job'].mode().empty else 'unknown',
    'education': df['education'].mode()[0] if not df['education'].mode().empty else 'unknown',
    'contact': df['contact'].mode()[0] if not df['contact'].mode().empty else 'unknown',
    'poutcome': df['poutcome'].mode()[0] if not df['poutcome'].mode().empty else 'unknown'
}
df = df.fillna(mode_values)
#标识特征
df['pdays'] = df['pdays'].replace(-1, 999)  #未联系过的特殊标记
df['contacted_before'] = np.where(df['pdays'] != 999, 1, 0)  #是否曾经联系过

#检查并处理目标变量中的NaN
print(f"目标变量y中的缺失值数量: {df['y'].isna().sum()}")
df = df.dropna(subset=['y']) 

#特征编码
categorical_features = ['job', 'marital', 'education', 'contact', 'month', 'poutcome']
numeric_features = ['age', 'balance', 'day', 'duration', 'campaign', 'pdays', 'previous']

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(handle_unknown='ignore', sparse_output=False), categorical_features)
    ])

X = df.drop('y', axis=1)
y = df['y']

#进行数据集划分
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

#模型训练
rf = RandomForestClassifier(
    n_estimators=100, 
    max_depth=8,
    min_samples_split=5,
    class_weight='balanced',
    random_state=42
)

X_train_processed = preprocessor.fit_transform(X_train)
rf.fit(X_train_processed, y_train)

#模型评估
X_test_processed = preprocessor.transform(X_test)
y_pred = rf.predict(X_test_processed)
y_proba = rf.predict_proba(X_test_processed)[:, 1]

print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print(f"F1分数: {f1_score(y_test, y_pred):.4f}")
print(f"AUC: {roc_auc_score(y_test, y_proba):.4f}")

#混淆矩阵可视化
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=['不会存款', '会存款'], 
            yticklabels=['不会存款', '会存款'])
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.title('混淆矩阵')
plt.show()

#获取特征名称
cat_encoder = preprocessor.named_transformers_['cat']
cat_features = cat_encoder.get_feature_names_out(categorical_features)
all_features = np.concatenate([numeric_features, cat_features])

#绘制特征重要性
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1][:15]

plt.figure(figsize=(12, 8))
plt.title("Top 15 特征重要性")
plt.barh(range(15), importances[indices][::-1], align='center')
plt.yticks(range(15), all_features[indices][::-1])
plt.xlabel('重要性')
plt.tight_layout()
plt.show()

#精准营销建议
def marketing_recommendation(model, preprocessor, customer_data):
    processed_data = preprocessor.transform(customer_data)
    proba = model.predict_proba(processed_data)[0][1]
    return proba > 0.4 
#客户数据
sample_customer = pd.DataFrame({
    'age': [42],
    'job': ['management'],
    'marital': ['married'],
    'education': ['tertiary'],
    'default': [0],
    'balance': [1500],
    'housing': [1],
    'loan': [0],
    'contact': ['cellular'],
    'day': [15],
    'month': ['may'],
    'duration': [300],
    'campaign': [2],
    'pdays': [100],
    'previous': [3],
    'poutcome': ['success']
})

if marketing_recommendation(rf, preprocessor, sample_customer):
    print("推荐对该客户进行存款营销")
else:
    print("不建议对该客户进行存款营销")

运行结果:

混淆矩阵:

Top15特征重要性

控制台输出,推荐对该客户进行存款营销

相关推荐
TG:@yunlaoda360 云老大8 分钟前
腾讯WAIC发布“1+3+N”AI全景图:混元3D世界模型开源,具身智能平台Tairos亮相
人工智能·3d·开源·腾讯云
这张生成的图像能检测吗12 分钟前
(论文速读)Fast3R:在一个向前通道中实现1000+图像的3D重建
人工智能·深度学习·计算机视觉·3d重建
兴趣使然黄小黄3 小时前
【AI-agent】LangChain开发智能体工具流程
人工智能·microsoft·langchain
出门吃三碗饭3 小时前
Transformer前世今生——使用pytorch实现多头注意力(八)
人工智能·深度学习·transformer
l1t3 小时前
利用DeepSeek改写SQLite版本的二进制位数独求解SQL
数据库·人工智能·sql·sqlite
ζั͡山 ั͡有扶苏 ั͡✾4 小时前
从零搭建 Data-Juicer:一站式大模型数据预处理与可视化平台完整教程
python·data-juicer
说私域4 小时前
开源AI智能名片链动2+1模式S2B2C商城小程序FAQ设计及其意义探究
人工智能·小程序
SkylerHu4 小时前
tornado+gunicorn部署设置max_body_size
python·tornado·gunicorn
开利网络4 小时前
合规底线:健康产品营销的红线与避坑指南
大数据·前端·人工智能·云计算·1024程序员节
非著名架构师4 小时前
量化“天气风险”:金融与保险机构如何利用气候大数据实现精准定价与投资决策
大数据·人工智能·新能源风光提高精度·疾风气象大模型4.0