综合python案例,谁更有机会晋级?

wen python案例 2

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

综合python案例,谁更有机会晋级?

项目:晋级概率分析系统

数据模拟与生成

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,置信度高

案例特点:

  1. 数据驱动决策:基于历史数据而非主观判断
  2. 多维评估体系:综合技能、经验、项目、面试、团队评价
  3. 概率建模:使用蒙特卡洛模拟预测
  4. 可视化展示:直观展示分析结果
  5. 可扩展性:可以添加更多维度和算法

这个案例展示了Python在数据分析、概率统计和决策支持中的综合应用,非常适合评估候选人或进行类似的预测分析任务。

上一篇这个python案例的核心判断依据是什么?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!