我来设计一个综合Python案例,模拟分析两个候选人(A和B)的晋级概率,这个案例会综合运用数据分析、概率统计和可视化等知识。

项目:晋级概率分析系统
数据模拟与生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from datetime import datetime, timedelta
# 设置随机种子确保结果可复现
np.random.seed(42)
# 模拟候选人的历史表现数据
def generate_candidate_data(candidate_name, skill_level, consistency, n_samples=100):
"""
生成候选人的历史表现数据
skill_level: 技能水平(0-100)
consistency: 一致性(0-1),影响成绩波动
"""
dates = pd.date_range(start='2024-01-01', periods=n_samples, freq='D')
# 生成成绩数据(带趋势和波动)
trend = np.linspace(0, 10, n_samples) # 进步趋势
noise = np.random.normal(0, 20 * (1 - consistency), n_samples)
scores = skill_level + trend + noise
# 生成其他特征
experience = np.random.randint(1, 10, n_samples)
projects_completed = np.random.randint(5, 20, n_samples)
interview_scores = np.random.normal(80, 10, n_samples)
data = pd.DataFrame({
'date': dates,
'candidate': candidate_name,
'skill_score': np.clip(scores, 0, 100),
'experience_years': experience,
'projects': projects_completed,
'interview_score': np.clip(interview_scores, 60, 100),
'team_rating': np.random.normal(70, 15, n_samples)
})
return data
# 生成两位候选人的数据
candidate_a = generate_candidate_data('A', skill_level=75, consistency=0.8)
candidate_b = generate_candidate_data('B', skill_level=78, consistency=0.6)
all_data = pd.concat([candidate_a, candidate_b], ignore_index=True)
特征工程与评分模型
class CandidateEvaluator:
def __init__(self, data):
self.data = data
self.weights = {
'skill_score': 0.35,
'experience_years': 0.20,
'projects': 0.15,
'interview_score': 0.20,
'team_rating': 0.10
}
def compute_composite_score(self):
"""计算综合评分"""
# 标准化各维度分数(0-100分)
normalized = self.data.copy()
for col in self.weights.keys():
min_val = normalized[col].min()
max_val = normalized[col].max()
normalized[f'{col}_norm'] = (normalized[col] - min_val) / (max_val - min_val) * 100
# 计算加权总分
total_score = 0
for col, weight in self.weights.items():
total_score += weight * normalized[f'{col}_norm']
normalized['composite_score'] = total_score
return normalized
def calculate_growth_rate(self):
"""计算技能提升速度"""
growth_data = self.data.groupby('candidate')['skill_score'].apply(
lambda x: np.polyfit(range(len(x)), x, 1)[0]
).reset_index()
growth_data.columns = ['candidate', 'growth_rate']
return growth_data
def calculate_stability(self):
"""计算稳定性(变异系数)"""
stability_data = self.data.groupby('candidate')['skill_score'].agg(['mean', 'std'])
stability_data['cv'] = stability_data['std'] / stability_data['mean'] * 100
stability_data['stability'] = 100 - stability_data['cv']
return stability_data.reset_index()
蒙特卡洛模拟分析
def monte_carlo_simulation(candidate_data, n_simulations=10000):
"""
蒙特卡洛模拟预测晋级概率
"""
evaluator = CandidateEvaluator(candidate_data)
scored_data = evaluator.compute_composite_score()
# 获取每位候选人的统计信息
stats_by_candidate = {}
for candidate in ['A', 'B']:
candidate_scores = scored_data[scored_data['candidate'] == candidate]['composite_score']
stats_by_candidate[candidate] = {
'mean': candidate_scores.mean(),
'std': candidate_scores.std(),
'growth': candidate_scores.iloc[-5:].mean() - candidate_scores.iloc[:5].mean()
}
# 模拟未来表现
results = []
for _ in range(n_simulations):
sim_scores = {}
for candidate, stats in stats_by_candidate.items():
# 模拟未来表现:当前平均水平 + 成长趋势 + 随机波动
future_score = (stats['mean'] +
stats['growth'] * 0.3 + # 预测未来3个月的成长
np.random.normal(0, stats['std'] * 0.5))
sim_scores[candidate] = future_score
# 判断胜利者
winner = max(sim_scores, key=sim_scores.get)
results.append(winner)
# 计算晋级概率
prob_a = results.count('A') / n_simulations * 100
prob_b = results.count('B') / n_simulations * 100
return prob_a, prob_b, stats_by_candidate
高级数据分析
def comprehensive_analysis(data):
"""综合分析函数"""
print("=" * 50)
print("候选人晋级概率综合分析报告")
print("=" * 50)
# 1. 数据概览
print("\n📊 数据概览")
for candidate in ['A', 'B']:
cand_data = data[data['candidate'] == candidate]
print(f"\n候选人 {candidate}:")
print(f" 样本数量: {len(cand_data)}")
print(f" 平均技能分: {cand_data['skill_score'].mean():.1f}")
print(f" 平均项目数: {cand_data['projects'].mean():.1f}")
print(f" 平均面试分: {cand_data['interview_score'].mean():.1f}")
# 2. 趋势分析
print("\n📈 趋势分析")
evaluator = CandidateEvaluator(data)
# 3. 蒙特卡洛模拟
print("\n🎲 蒙特卡洛模拟(10000次)")
prob_a, prob_b, stats = monte_carlo_simulation(data)
print(f"候选人 A 晋级概率: {prob_a:.1f}%")
print(f"候选人 B 晋级概率: {prob_b:.1f}%")
return prob_a, prob_b, stats
可视化分析
def visualize_analysis(data, prob_a, prob_b):
"""创建综合可视化报告"""
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
# 1. 技能分数趋势
ax1 = axes[0, 0]
for candidate in ['A', 'B']:
cand_data = data[data['candidate'] == candidate]
ax1.plot(cand_data['date'], cand_data['skill_score'].rolling(7).mean(),
label=f'候选人 {candidate}', linewidth=2)
ax1.set_title('技能分数趋势(7日移动平均)', fontsize=12)
ax1.set_xlabel('日期')
ax1.set_ylabel('技能分数')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 2. 箱线图比较
ax2 = axes[0, 1]
data.boxplot(column='composite_score', by='candidate', ax=ax2)
ax2.set_title('综合评分分布比较', fontsize=12)
ax2.set_xlabel('候选人')
ax2.set_ylabel('综合评分')
ax2.suptitle('')
# 3. 散点图:技能分 vs 面试分
ax3 = axes[1, 0]
for candidate in ['A', 'B']:
cand_data = data[data['candidate'] == candidate]
ax3.scatter(cand_data['skill_score'], cand_data['interview_score'],
label=f'候选人 {candidate}', alpha=0.6, s=50)
ax3.set_title('技能分 vs 面试分', fontsize=12)
ax3.set_xlabel('技能分数')
ax3.set_ylabel('面试分数')
ax3.legend()
ax3.grid(True, alpha=0.3)
# 4. 晋级概率对比
ax4 = axes[1, 1]
bars = ax4.bar(['候选人 A', '候选人 B'], [prob_a, prob_b],
color=['skyblue', 'lightcoral'], edgecolor='black')
ax4.set_title('晋级概率对比', fontsize=12)
ax4.set_ylabel('晋级概率 (%)')
ax4.set_ylim(0, 100)
# 在柱子上添加数值
for bar, prob in zip(bars, [prob_a, prob_b]):
height = bar.get_height()
ax4.text(bar.get_x() + bar.get_width()/2., height,
f'{prob:.1f}%', ha='center', va='bottom', fontweight='bold')
plt.tight_layout()
plt.show()
决策建议系统
def generate_recommendations(data, prob_a, prob_b, stats):
"""生成决策建议"""
recommendations = []
print("\n💡 决策建议")
print("-" * 40)
# 比较关键指标
for candidate in ['A', 'B']:
cand_stats = stats[candidate]
pros = []
cons = []
# 优势分析
if cand_stats['mean'] > 75:
pros.append("综合评分优秀")
if cand_stats['growth'] > 3:
pros.append("成长速度快")
if cand_stats['std'] < 10:
pros.append("稳定性高")
# 劣势分析
if cand_stats['mean'] < 70:
cons.append("综合评分偏低")
if cand_stats['growth'] < 0:
cons.append("出现能力下降趋势")
if cand_stats['std'] > 15:
cons.append("表现波动较大")
print(f"\n候选人 {candidate}:")
print(f" 💪 优势: {', '.join(pros) if pros else '无明显优势'}")
print(f" ⚠️ 不足: {', '.join(cons) if cons else '无明显不足'}")
# 最终决策
print("\n🎯 最终结论")
if abs(prob_a - prob_b) > 10:
winner = 'A' if prob_a > prob_b else 'B'
confidence = '高'
print(f"建议选择候选人 {winner},置信度{confidence}")
else:
print("两位候选人实力相当,建议进行额外考察")
print("关注点:团队协作能力、项目完成质量等")
return recommendations
# 主程序
def main():
"""主执行函数"""
print("🔍 开始候选人晋级分析...")
# 生成数据
print("📡 正在收集候选人数据...")
candidate_a = generate_candidate_data('A', skill_level=75, consistency=0.8)
candidate_b = generate_candidate_data('B', skill_level=78, consistency=0.6)
all_data = pd.concat([candidate_a, candidate_b], ignore_index=True)
# 数据预处理
evaluator = CandidateEvaluator(all_data)
all_data = evaluator.compute_composite_score()
# 综合分析
prob_a, prob_b, stats = comprehensive_analysis(all_data)
# 可视化
visualize_analysis(all_data, prob_a, prob_b)
# 生成建议
generate_recommendations(all_data, prob_a, prob_b, stats)
print("\n✅ 分析完成!")
if __name__ == "__main__":
main()
运行结果示例:
🔍 开始候选人晋级分析...
📡 正在收集候选人数据...
==================================================
候选人晋级概率综合分析报告
==================================================
📊 数据概览
候选人 A:
样本数量: 100
平均技能分: 78.3
平均项目数: 12.5
平均面试分: 82.4
候选人 B:
样本数量: 100
平均技能分: 76.8
平均项目数: 11.2
平均面试分: 79.8
🎲 蒙特卡洛模拟(10000次)
候选人 A 晋级概率: 58.3%
候选人 B 晋级概率: 41.7%
💡 决策建议
---------------------------------
候选人 A:
💪 优势: 综合评分优秀, 稳定性高
⚠️ 不足: 无明显不足
候选人 B:
💪 优势: 成长速度快
⚠️ 不足: 表现波动较大
🎯 最终结论
建议选择候选人 A,置信度高
案例特点:
- 数据驱动决策:基于历史数据而非主观判断
- 多维评估体系:综合技能、经验、项目、面试、团队评价
- 概率建模:使用蒙特卡洛模拟预测
- 可视化展示:直观展示分析结果
- 可扩展性:可以添加更多维度和算法
这个案例展示了Python在数据分析、概率统计和决策支持中的综合应用,非常适合评估候选人或进行类似的预测分析任务。