写在前面:在数学建模竞赛中,精准的数据预处理、严密的特征选择、稳健的模型构建以及可落地的商业决策是冲击一等奖的核心要素。本文围绕华数杯经典赛题"电动汽车目标客户销售策略研究"展开,系统拆解一套获得高分的完整建模体系,提供可直接运行的 Python 源码,并对 2026 年华数杯的命题趋势进行深度预测。
一、 华数杯赛题演变与 2026 年命题趋势预测
1.1 历年赛题演进逻辑
回顾近年华数杯数学建模竞赛(以 C 题/大数据类题目为例),题目从早期单纯的统计描述与基础分类,逐步演变为"复杂数据清洗 + 跨模态特征工程 + 高维不平衡分类 + 约束下的多目标运筹优化"的复合型架构:
-
2021 年 (电动汽车目标客户销售策略):侧重于客户体验数据清洗、多品牌偏好归因、不平衡数据挖掘与服务难度约束下的营销优化。
-
近年趋势:引入了更多时空潮汐特征、新能源与碳中和背景、微观行为建模及系统协同调度(如能源-建筑-车辆协同管理)。
1.2 2026 年华数杯命题方向预测
基于国家"双碳"战略深化与工业人工智能的快速普及,针对 2026 年华数杯建模竞赛进行以下前瞻性预测:
+-----------------------------------------------------------------------------------+
| 2026 华数杯核心命题预测方向 |
+-----------------------------------------------------------------------------------+
| 1. 车网互动 (V2G) 与源-网-荷-储协同调度: 结合电价波动与微观出行行为的确定性/不确定性优化 |
| 2. 多模态用户画像与生成式营销推荐: 融合文本评论、行为轨迹与生理体验数据的深度学习拟合 |
| 3. 供应链韧性与绿色全生命周期 (LCA) 评估: 考虑碳足迹与零部件衰减的多目标 Pareto 前沿求解 |
+-----------------------------------------------------------------------------------+
二、 一等奖方案全景架构与解题逻辑
为了完美解答"电动汽车目标客户销售策略"这一典型问题,设计了一套环环相扣的五阶段解题架构:
【数据输入】(1964位体验者数据: a1-a8满意度 + B1-B17个人特征)
│
▼
【阶段一:逻辑校验与非参数数据清洗】
├── 基于业务逻辑的条件约束校验 (如家庭收入 >= 个人收入)
├── 基于箱线图 (IQR) 的四分位极值修复[cite: 1, 10]
└── 条件缺失值填补 (基于婚姻状态 B6 推导孩子数 B7)
│
▼
【阶段二:采样平衡与多模型投票特征提取】
├── SMOTE / ADASYN 自适应过采样处理标签极度不平衡问题
├── 惩罚项嵌入法 (LASSO / LinearSVM / LR)
├── 树模型嵌入法 (Random Forest / LightGBM)
└── 5 模型票选机制 (Majority Voting) 提取各品牌核心因子
│
▼
【阶段三:贝叶斯超参数调优与高精度挖掘】
├── 搭建 LightGBM / XGBoost / CatBoost / 随机森林分类器
├── 基于 F1-Score 与 ROC-AUC 的贝叶斯优化求解最优超参数
└── 输出 15 名潜在目标客户的购买概率
│
▼
【阶段四:服务难度与转化率组合优化】
├── 建立网格搜索/规划模型:限定总满意度提升百分比不超过 5%
└── 最小化服务提升难度系数,最大化客户购买概率转化
│
▼
【阶段五:精准营销决策矩阵与商业落地】
└── 输出针对合资、自主、新势力三大品牌的差异化战略建议
三、 实战建模拆解与 Python 代码实现
本部分针对问题的四个核心阶段,提供符合工程规范、可移植运行的 Python 代码。
3.1 阶段一:数据清洗与非参数统计分析 (针对问题一)
解题思路
-
逻辑约束校验:在真实场景中,家庭年收入应大于等于个人年收入和可支配收入。如果发现逻辑矛盾,优先采用中位数比例进行逻辑修复。
-
条件缺失值填补:缺失值 B7(孩子数量)与 B6(婚姻状态)强相关。未婚或独身状态下直接填补为 0,已婚状态下利用非缺失数据的中位数填补。
-
满意度分布检验 :由于满意度评分得分往往不严格服从正态分布,采用 Kruskal-Wallis 检验 与 Wilcoxon 秩和检验 代替传统方差分析,比较不同品牌(合资、自主、新势力)在 a1 \\sim a8 各维度上的满意度差异。
Python 实现:数据预处理与差异性分析
Python
python
import numpy as np
import pandas as pd
from scipy import stats
def clean_ev_dataset(df):
"""
电动汽车体验数据清洗与逻辑修复函数
"""
df_clean = df.copy()
# 1. 满意度得分上限截断 (满分100分)
score_cols = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8']
for col in score_cols:
if col in df_clean.columns:
mean_val = df_clean.loc[df_clean[col] <= 100, col].mean()
df_clean.loc[df_clean[col] > 100, col] = mean_val
# 2. 收入逻辑校验与修复 (B13:家庭收入, B14:个人收入, B15:可支配收入)
if set(['B13', 'B14', 'B15']).issubset(df_clean.columns):
# 计算有效数据中家庭收入与个人收入的比例中位数
valid_mask = (df_clean['B13'] >= df_clean['B14']) & (df_clean['B13'] >= df_clean['B15'])
ratio_b14 = (df_clean.loc[valid_mask, 'B13'] / (df_clean.loc[valid_mask, 'B14'] + 1e-5)).median()
# 修复逻辑异常项
invalid_mask = ~valid_mask
df_clean.loc[invalid_mask, 'B13'] = df_clean.loc[invalid_mask, 'B14'] * ratio_b14
# 3. 缺失值条件填补 (B6:婚姻状态, B7:孩子数量)
if 'B7' in df_clean.columns and 'B6' in df_clean.columns:
# 未婚/单身(设定取值为1,2,3,4,8)的孩子数填补为0
single_mask = df_clean['B6'].isin([1, 2, 3, 4, 8]) & df_clean['B7'].isnull()
df_clean.loc[single_mask, 'B7'] = 0
# 其余缺失项采用中位数填补
median_children = df_clean.loc[df_clean['B7'].notnull(), 'B7'].median()
df_clean['B7'].fillna(median_children, inplace=True)
return df_clean
# 假设模拟创建数据集并执行
np.random.seed(42)
data_sim = pd.DataFrame({
'brand_type': np.random.choice([1, 2, 3], 100),
'a1': np.random.uniform(50, 95, 100),
'a2': np.random.uniform(50, 95, 100),
'B6': np.random.choice([1, 5], 100),
'B7': [np.nan if i % 5 == 0 else 1 for i in range(100)],
'B13': np.random.uniform(10, 50, 100),
'B14': np.random.uniform(5, 60, 100) # 存在逻辑异常
})
data_cleaned = clean_ev_dataset(data_sim)
# Kruskal-Wallis 检验不同品牌在 a1 指标上的差异
stat, p_val = stats.kruskal(
data_cleaned[data_cleaned['brand_type'] == 1]['a1'],
data_cleaned[data_cleaned['brand_type'] == 2]['a1'],
data_cleaned[data_cleaned['brand_type'] == 3]['a1']
)
print(f"Kruskal-Wallis 检验 H统计量: {stat:.4f}, P值: {p_val:.4f}")
3.2 阶段二:多模型集成特征选择 (针对问题二)
解题思路
单个特征选择算法(如纯皮尔逊相关系数或单一树模型)极易受到共线性和噪声干扰。一等奖方案采用 多算法组合票选机制:
-
先利用 SMOTE 算法对极度不平衡的购买标签(购买者仅占约 5%)进行过采样。
-
引入 5 种异构模型独立筛选重要特征:逻辑回归(L1 惩罚)、线性 SVM(L1 惩罚)、LASSO 回归、随机森林(Gini 增益)、LightGBM(Split 增益)。
-
统计各特征在 5 个模型中的得票数,保留获得 2 票及以上的特征作为该品牌的核心影响因子。
核心特征投票矩阵表
以下为利用多模型投票得出的不同品牌关键影响因子提取结果:
| 品牌类型 | 核心影响因子得票 ≥4 的特征 | 得票 ≥2 的次要影响特征 | 商业含义分析 PDF |
|---|---|---|---|
| 合资品牌 (1) | a1 (电池), B16 (房贷比), B17 (车贷比) | a2 (舒适), a3 (经济), a4 (安全), B12 (职务) | 客户最看重电池续航与财务杠杆压力。 |
| 自主品牌 (2) | a1 (电池), a3 (经济), B16 (房贷比), B17 (车贷比) | a5 (动力), a7 (外观), B11 (单位性质), B15 (可支配收入) | 对性价比与综合实用性高度敏感。 |
| 新势力品牌 (3) | a2 (舒适), B16 (房贷比), a1 (电池), a5 (动力) | a6 (操控), B10 (工龄), B17 (车贷比) | 更加关注驾乘舒适度、智能化与动力体验。 |
Python 实现:SMOTE 与多模型投票特征提取
Python
python
from imblearn.over_sampling import SMOTE
from sklearn.linear_model import LogisticRegression, LassoCV
from sklearn.svm import LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
import lightgbm as lgb
def ensemble_feature_selection(X, y, feature_names, top_k=8):
"""
五模型投票法特征选择
"""
# 1. 过采样处理
smo = SMOTE(sampling_strategy=0.6, random_state=42)
X_res, y_res = smo.fit_resample(X, y)
votes = pd.Series(0, index=feature_names)
# 模型 1: Logistic Regression (L1)
lr = LogisticRegression(penalty='l1', solver='liblinear', C=1.0)
sfm_lr = SelectFromModel(lr, max_features=top_k).fit(X_res, y_res)
votes[feature_names[sfm_lr.get_support()]] += 1
# 模型 2: Linear SVM (L1)
svm = LinearSVC(penalty='l1', dual=False, C=0.5, random_state=42)
sfm_svm = SelectFromModel(svm, max_features=top_k).fit(X_res, y_res)
votes[feature_names[sfm_svm.get_support()]] += 1
# 模型 3: LASSO
lasso = LassoCV(cv=3).fit(X_res, y_res)
sfm_lasso = SelectFromModel(lasso, max_features=top_k).fit(X_res, y_res)
votes[feature_names[sfm_lasso.get_support()]] += 1
# 模型 4: Random Forest
rf = RandomForestClassifier(n_estimators=100, random_state=42).fit(X_res, y_res)
sfm_rf = SelectFromModel(rf, max_features=top_k).fit(X_res, y_res)
votes[feature_names[sfm_rf.get_support()]] += 1
# 模型 5: LightGBM
lgb_model = lgb.LGBMClassifier(n_estimators=100, random_state=42, verbose=-1).fit(X_res, y_res)
sfm_lgb = SelectFromModel(lgb_model, max_features=top_k).fit(X_res, y_res)
votes[feature_names[sfm_lgb.get_support()]] += 1
# 筛选得票数 >= 2 的特征
selected_features = votes[votes >= 2].index.tolist()
return votes, selected_features
# 模拟运行
X_dummy = np.random.randn(200, 10)
y_dummy = np.array([1]*15 + [0]*185)
feats = [f'Feat_{i}' for i in range(10)]
vote_scores, selected = ensemble_feature_selection(X_dummy, y_dummy, feats)
print("特征得票情况:\n", vote_scores)
print("最终保留的核心特征:", selected)
3.3 阶段三:基于贝叶斯优化的客户挖掘建模 (针对问题三)
解题思路
对品牌 1、品牌 2 和品牌 3 的客户分别建立分类预测模型。比较随机森林、LightGBM、XGBoost、CatBoost 的表现,引入 贝叶斯优化 (Bayesian Optimization) 搜索最优超参数,以 ROC-AUC 与 F1-Score 作为调优目标。
预测性能对比表
通过 5 折交叉验证,各模型优化后的最终评估表现如下:
| 品牌 | 最佳匹配模型 PDF | 最佳超参数组合 | F1-Score PDF | ROC-AUC PDF | 评语 |
|---|---|---|---|---|---|
| 合资品牌 (1) | 随机森林 | max_depth=5, n_estimators=70, min_samples_leaf=3 |
0.959 | 0.978 | 泛化性能极稳定,抗噪能力强。 |
| 自主品牌 (2) | LightGBM | learning_rate=0.015, num_leaves=35, max_depth=7 |
0.963 | 0.971 | 对非线性高维组合特征拟合极佳。 |
| 新势力品牌 (3) | 随机森林 / XGBoost | max_depth=8, n_estimators=100, min_samples_split=3 |
0.918 | 0.960 | 样本特征较稀疏,树深度需适度控制。 |
Python 实现:LightGBM 模型训练与贝叶斯优化
Python
python
import lightgbm as lgb
from bayes_opt import BayesianOptimization
from sklearn.metrics import f1_score, roc_auc_score
from sklearn.model_selection import train_test_split
def tune_and_train_lgb(X, y):
"""
LightGBM 贝叶斯超参数优化与模型训练
"""
X_train, X_val, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
def lgb_eval(num_leaves, max_depth, learning_rate, n_estimators):
params = {
'num_leaves': int(num_leaves),
'max_depth': int(max_depth),
'learning_rate': float(learning_rate),
'n_estimators': int(n_estimators),
'objective': 'binary',
'metric': 'auc',
'verbose': -1,
'random_state': 42
}
clf = lgb.LGBMClassifier(**params)
clf.fit(X_train, y_train)
preds = clf.predict_proba(X_val)[:, 1]
return roc_auc_score(y_test, preds)
# 设定参数搜索空间
pbounds = {
'num_leaves': (15, 63),
'max_depth': (3, 10),
'learning_rate': (0.01, 0.2),
'n_estimators': (50, 200)
}
optimizer = BayesianOptimization(f=lgb_eval, pbounds=pbounds, random_state=42, verbose=0)
optimizer.maximize(init_points=5, n_iter=15)
best_params = optimizer.max['params']
best_params['num_leaves'] = int(best_params['num_leaves'])
best_params['max_depth'] = int(best_params['max_depth'])
best_params['n_estimators'] = int(best_params['n_estimators'])
best_params['objective'] = 'binary'
best_params['verbose'] = -1
final_model = lgb.LGBMClassifier(**best_params)
final_model.fit(X_train, y_train)
return final_model, best_params
# 模拟建模调用
X_dummy_train = np.random.randn(500, 8)
y_dummy_train = np.random.choice([0, 1], 500, p=[0.7, 0.3])
model, params = tune_and_train_lgb(X_dummy_train, y_dummy_train)
print("最优贝叶斯调参结果:", params)
附件三 15 名目标客户预测结果表 (模拟/标准示范)
基于阶段三训练完成的模型,对附件三中的 15 名客户进行可能性推断:
| 客户编号 | 对应品牌 DOCX | 预测购买概率 PDF+ 1 | 预测判定 PDF+ 1 | 核心决策归因 |
|---|---|---|---|---|
| 1 | 品牌 1 (合资) | 67.8% | 购买 | 满意度各项评分均衡,财务杠杆较低。 |
| 2 | 品牌 1 (合资) | 8.0% | 不购买 | 车贷占比过高,电池满意度低。 |
| 3 | 品牌 1 (合资) | 2.5% | 不购买 (Q4选定) | 经济性得分严重落后于均值。 |
| 6 | 品牌 2 (自主) | 92.3% | 购买 | 经济性与安全满意度得分极高。 |
| 9 | 品牌 2 (自主) | 3.4% | 不购买 (Q4选定) | 电池体验得分存在短板。 |
| 14 | 品牌 3 (新势力) | 6.1% | 不购买 (Q4选定) | 舒适性评价偏低,无房贷车贷压力。 |
3.4 阶段四:服务难度约束下的多目标优化 (针对问题四)
解题思路
题目要求:在短时间内提升 a1 \\sim a8 各指标满意度得分(提升上限不超过 5%),且提升 5% 的服务难度是提升 1% 的 5 倍(即服务难度与提升百分点成正比)。在每个品牌中选出 1 名未购买的客户实施针对性策略。
建立优化决策逻辑:
-
目标 1:最小化总服务提升难度:\\text{Min } \\sum c_i \\cdot \\Delta x_i
cite: 9, 10
-
目标 2:最大化客户购买概率转化率:\\text{Max } \\Delta P(y=1)
cite: 9, 10
-
约束条件:总满意度提升比例 \\le 5\\%,且单项得分提升后不超过 100 分cite: 4, 9, 10。
从附件三中选定 3 名未购买的目标客户cite: 4, 9:
-
品牌 1 :选择 3号客户
-
品牌 2 :选择 9号客户
-
品牌 3 :选择 14号客户
Python 实现:基于网格搜索的服务提升优化
Python
python
def optimize_marketing_strategy(model, customer_profile, score_indices, max_diff_budget=5):
"""
营销服务提升多目标优化求解器
"""
base_profile = customer_profile.copy()
base_pred = model.predict_proba([base_profile])[0][1]
best_conversion = 0
best_strategy = None
min_difficulty = float('inf')
# 构建满意度增加值的组合网格 (假设每个指标增加 0~10分)
grid_search_space = [0, 2, 4, 6, 8, 10]
from itertools import product
for increments in product(grid_search_space, repeat=len(score_indices)):
# 计算总提升服务难度 (与百分点成正比)
total_increment_pct = sum(increments) / len(score_indices)
if total_increment_pct > max_diff_budget:
continue # 超过 5% 的服务难度预算上限
temp_profile = base_profile.copy()
valid_flag = True
for idx, inc in zip(score_indices, increments):
temp_profile[idx] = min(100, temp_profile[idx] + inc)
# 预测调整后的购买概率
new_pred = model.predict_proba([temp_profile])[0][1]
prob_gain = new_pred - base_pred
# 求解准则:优先追求成功转换(购买概率升至临界点以上)或增益最大且难度最小
if prob_gain > best_conversion:
best_conversion = prob_gain
best_strategy = increments
min_difficulty = sum(increments)
return base_pred, base_pred + best_conversion, best_strategy, min_difficulty
# 模拟优化运行
mock_customer = np.array([76.2, 74.6, 66.7, 88.8, 88.8, 91.6, 99.9, 99.9])
score_idx = [0, 1, 2, 3] # 关注 a1-a4
base_p, opt_p, strat, diff = optimize_marketing_strategy(model, mock_customer, score_idx)
print(f"优化前概率: {base_p:.4f} -> 优化后概率: {opt_p:.4f}")
print("各维度满意度得分推荐提升值 (a1-a4):", strat)
四、 决策建议与商业落地 (针对问题五)
根据定量建模与归因分析结果,向销售部门提交如下精准营销决策建议(控制在 500 字以内)cite: 4:
📝 销售部门电动汽车精准营销策略建议书
1. 品牌差异化资源配置
合资品牌 (主推策略):目标客户满意度基础最高。应主打"高保障与低使用成本",重点针对客户关心的电池耐用度(a1)与经济保值率(a3)展开宣传cite: 9, 10,推荐提供"电池终身质保"或"免费充电额度"以消除财务顾虑。
自主品牌 (性价比策略):客户对车辆安全(a4)与动力表现(a5)极为敏感cite: 9, 10。建议在试驾环节增设复杂路况爬坡与紧急制动体验,并联合金融机构推出免息低首付方案,对冲车贷(B17)带来的购买阻力cite: 9。
新势力品牌 (体验驱动策略):客户核心痛点在于驾乘舒适度(a2)与操控智能化(a6)cite: 9, 10。销售端应着重营造车载舒适空间,提供免费试驾与高级座舱选装包福利。
2. 目标客群精准画像与转化 优先锁定本地户口、已婚、自由职业或中等收入家庭cite: 9。对于潜在临界客户(如 3 号、9 号、14 号)cite: 9,无需全维度提升满意度,只需将 80% 的服务资源集中于其核心短板维度(如单独提升合资品牌客户的经济性体验)cite: 9,即可在不超过 5% 的服务难度成本下实现客户购买概率的最大化飞跃cite: 4, 9, 10。
五、 竞赛总结与国奖论文加分项
5.1 论文写作与排版避坑指南
-
纯学术表达:正文中切忌粘贴原始代码段,应将算法过程转化为伪代码框图、算法流程图或逻辑步骤说明。
-
图表占位与高精可视化 :所有图表均须标注图图题与表头,如
图 1: 多模型特征选择投票得分直方图,使用 Seaborn/Nature 学术配色提升视觉质感。 -
数据敏感性检验:在论文后半部分主动增加"灵敏度分析"章节,微调 SMOTE 采样比例或优化权重,验证分类概率的波动范围,展现模型的严谨性与鲁棒性。
本文方案逻辑与 Python 源码框架均遵循数学建模国奖标准,可作为自动化数据分析与精准营销类赛题的通用解题模板。