计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】

发布于:2025-08-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖

一、项目介绍

选题背景

糖尿病已成为全球性的重大公共卫生挑战,根据国际糖尿病联盟(IDF)最新发布的数据显示,2021年全球糖尿病患者人数已达5.37亿,预计到2045年将增至7.83亿。在我国,情况同样严峻,《中国成人糖尿病流行与控制现状》调研报告指出,我国成人糖尿病患病率高达11.2%,患者总数超过1.4亿,位居世界首位。更令人担忧的是,约有50.1%的糖尿病患者未被诊断,错失了早期干预的宝贵时机。面对如此庞大的患者群体和复杂多样的影响因素,传统的单维度分析方法已难以满足现代医疗健康管理的需求。随着医疗信息化程度不断提升,各类健康数据呈现爆炸式增长态势,这些海量数据中蕴含着丰富的疾病发病规律和风险预测信息。如何有效整合患者的基础特征、生理指标、生活方式等多维度数据,运用先进的大数据技术进行深度挖掘和智能分析,已成为当前糖尿病防控领域亟待解决的关键问题。

选题意义

构建基于Spark的综合糖尿病健康数据分析系统具有重要的理论价值和实践意义。从技术创新角度来看,该系统将Hadoop分布式存储与Spark内存计算技术相结合,能够高效处理大规模医疗健康数据,为慢性疾病的大数据分析提供了新的技术路径和解决方案。在临床应用层面,系统通过对患者年龄、性别、BMI、血糖、血压等27个维度数据的综合分析,可以帮助医疗机构识别糖尿病高风险人群,实现疾病的早期预警和精准干预,有效降低医疗成本和提升治疗效果。对于公共卫生管理部门而言,系统提供的人群流行病学特征分析和风险因素关联性研究结果,能够为制定针对性的糖尿病防控策略和健康政策提供科学依据。同时,系统采用Python、Django、Vue等主流开发技术栈,具有良好的可扩展性和实用性,不仅可以应用于糖尿病领域,还能够为其他慢性疾病的数据分析提供参考模式,推动智慧医疗和精准医学的发展进步。

二、开发环境

  • 大数据技术:Hadoop、Spark、Hive
  • 开发技术:Python、Django框架、Vue、Echarts
  • 软件工具:Pycharm、DataGrip、Anaconda
  • 可视化 工具 Echarts

三、视频展示

计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】

四、项目展示

登录模块:

在这里插入图片描述

可视化模块:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、代码展示

# 核心功能1:不同年龄段人群糖尿病发病率分析
def analyze_age_diabetes_relationship(spark_session, data_path):
    # 读取糖尿病数据集
    df = spark_session.read.csv(data_path, header=True, inferSchema=True)
    
    # 定义年龄段分组函数
    def categorize_age(age):
        if age < 30:
            return "青年组"
        elif age < 50:
            return "中年组"
        else:
            return "老年组"
    
    # 注册UDF函数
    age_categorize_udf = udf(categorize_age, StringType())
    
    # 添加年龄段分组列
    df_with_age_group = df.withColumn("age_group", age_categorize_udf(col("Age")))
    
    # 按年龄段分组统计糖尿病发病情况
    age_stats = df_with_age_group.groupBy("age_group").agg(
        count("*").alias("total_count"),
        sum(when(col("Diagnosis") == 1, 1).otherwise(0)).alias("diabetes_count"),
        avg("Age").alias("avg_age"),
        stddev("Age").alias("age_stddev")
    )
    
    # 计算发病率并格式化结果
    age_analysis_result = age_stats.withColumn(
        "incidence_rate", 
        round((col("diabetes_count") / col("total_count") * 100), 2)
    ).withColumn(
        "avg_age_formatted",
        round(col("avg_age"), 1)
    )
    
    # 按发病率降序排列
    final_result = age_analysis_result.orderBy(desc("incidence_rate"))
    
    # 收集结果并转换为字典格式
    result_data = final_result.collect()
    analysis_summary = []
    
    for row in result_data:
        summary_dict = {
            "age_group": row["age_group"],
            "total_patients": row["total_count"],
            "diabetes_patients": row["diabetes_count"],
            "incidence_rate": row["incidence_rate"],
            "average_age": row["avg_age_formatted"],
            "risk_level": "高风险" if row["incidence_rate"] > 15 else "中风险" if row["incidence_rate"] > 8 else "低风险"
        }
        analysis_summary.append(summary_dict)
    
    return analysis_summary

# 核心功能2:BMI指数与糖尿病关系分析
def analyze_bmi_diabetes_correlation(spark_session, data_path):
    # 加载数据
    diabetes_df = spark_session.read.csv(data_path, header=True, inferSchema=True)
    
    # 定义BMI分类函数
    def classify_bmi(bmi):
        if bmi < 18.5:
            return "体重过轻"
        elif bmi < 24.0:
            return "正常体重"
        elif bmi < 28.0:
            return "超重"
        else:
            return "肥胖"
    
    # 创建BMI分类UDF
    bmi_classify_udf = udf(classify_bmi, StringType())
    
    # 添加BMI分类列并过滤异常值
    processed_df = diabetes_df.filter(
        (col("BMI").isNotNull()) & (col("BMI") > 10) & (col("BMI") < 60)
    ).withColumn("bmi_category", bmi_classify_udf(col("BMI")))
    
    # 按BMI类别进行分组统计
    bmi_diabetes_stats = processed_df.groupBy("bmi_category").agg(
        count("*").alias("total_samples"),
        sum(when(col("Diagnosis") == 1, 1).otherwise(0)).alias("positive_cases"),
        avg("BMI").alias("mean_bmi"),
        min("BMI").alias("min_bmi"),
        max("BMI").alias("max_bmi"),
        avg("Age").alias("mean_age")
    )
    
    # 计算各BMI类别的糖尿病发病率
    bmi_analysis = bmi_diabetes_stats.withColumn(
        "diabetes_rate",
        round((col("positive_cases") / col("total_samples") * 100), 3)
    ).withColumn(
        "mean_bmi_rounded",
        round(col("mean_bmi"), 2)
    )
    
    # 计算相对风险比(以正常体重为基准)
    normal_weight_rate = bmi_analysis.filter(col("bmi_category") == "正常体重").select("diabetes_rate").collect()[0]["diabetes_rate"]
    
    bmi_risk_analysis = bmi_analysis.withColumn(
        "relative_risk",
        round(col("diabetes_rate") / normal_weight_rate, 2)
    )
    
    # 按糖尿病发病率排序
    sorted_bmi_result = bmi_risk_analysis.orderBy(desc("diabetes_rate"))
    
    # 构建分析结果数据结构
    bmi_results = sorted_bmi_result.collect()
    correlation_analysis = []
    
    for bmi_row in bmi_results:
        analysis_record = {
            "bmi_category": bmi_row["bmi_category"],
            "sample_count": bmi_row["total_samples"],
            "diabetes_cases": bmi_row["positive_cases"],
            "incidence_rate": bmi_row["diabetes_rate"],
            "average_bmi": bmi_row["mean_bmi_rounded"],
            "bmi_range": f"{bmi_row['min_bmi']:.1f}-{bmi_row['max_bmi']:.1f}",
            "relative_risk": bmi_row["relative_risk"],
            "risk_assessment": "极高风险" if bmi_row["relative_risk"] > 2.5 else "高风险" if bmi_row["relative_risk"] > 1.5 else "中等风险" if bmi_row["relative_risk"] > 1.0 else "低风险"
        }
        correlation_analysis.append(analysis_record)
    
    return correlation_analysis

# 核心功能3:糖尿病高风险人群聚类分析
def perform_diabetes_risk_clustering(spark_session, data_path):
    from pyspark.ml.feature import VectorAssembler, StandardScaler
    from pyspark.ml.clustering import KMeans
    from pyspark.ml.evaluation import ClusteringEvaluator
    
    # 读取并预处理数据
    raw_data = spark_session.read.csv(data_path, header=True, inferSchema=True)
    
    # 选择关键特征进行聚类分析
    feature_columns = ["Age", "BMI", "FastingBloodSugar", "HbA1c", "SystolicBP", 
                      "DiastolicBP", "CholesterolTotal", "PhysicalActivity"]
    
    # 数据清洗:处理缺失值和异常值
    cleaned_data = raw_data.filter(
        reduce(lambda x, y: x & y, [col(c).isNotNull() for c in feature_columns])
    ).filter(
        (col("Age") > 0) & (col("Age") < 120) &
        (col("BMI") > 10) & (col("BMI") < 60) &
        (col("FastingBloodSugar") > 50) & (col("FastingBloodSugar") < 500) &
        (col("HbA1c") > 3) & (col("HbA1c") < 20)
    )
    
    # 特征向量化
    vector_assembler = VectorAssembler(inputCols=feature_columns, outputCol="features_raw")
    vectorized_data = vector_assembler.transform(cleaned_data)
    
    # 特征标准化
    scaler = StandardScaler(inputCol="features_raw", outputCol="scaled_features")
    scaler_model = scaler.fit(vectorized_data)
    normalized_data = scaler_model.transform(vectorized_data)
    
    # K-means聚类分析(设置聚类数为4)
    kmeans_model = KMeans(featuresCol="scaled_features", predictionCol="cluster_id", k=4, seed=42)
    trained_model = kmeans_model.fit(normalized_data)
    clustered_data = trained_model.transform(normalized_data)
    
    # 计算聚类评估指标
    evaluator = ClusteringEvaluator(featuresCol="scaled_features", predictionCol="cluster_id")
    silhouette_score = evaluator.evaluate(clustered_data)
    
    # 分析各聚类群体特征
    cluster_characteristics = clustered_data.groupBy("cluster_id").agg(
        count("*").alias("cluster_size"),
        avg("Age").alias("avg_age"),
        avg("BMI").alias("avg_bmi"),
        avg("FastingBloodSugar").alias("avg_fbs"),
        avg("HbA1c").alias("avg_hba1c"),
        avg("SystolicBP").alias("avg_systolic"),
        avg("DiastolicBP").alias("avg_diastolic"),
        sum(when(col("Diagnosis") == 1, 1).otherwise(0)).alias("diabetes_count")
    )
    
    # 计算各聚类的糖尿病发病率
    cluster_analysis = cluster_characteristics.withColumn(
        "diabetes_rate",
        round((col("diabetes_count") / col("cluster_size") * 100), 2)
    ).withColumn("avg_age", round(col("avg_age"), 1)
    ).withColumn("avg_bmi", round(col("avg_bmi"), 1)
    ).withColumn("avg_fbs", round(col("avg_fbs"), 1)
    ).withColumn("avg_hba1c", round(col("avg_hba1c"), 2))
    
    # 根据发病率对聚类进行风险等级划分
    risk_classified_clusters = cluster_analysis.withColumn(
        "risk_level",
        when(col("diabetes_rate") > 30, "极高风险群体")
        .when(col("diabetes_rate") > 20, "高风险群体")
        .when(col("diabetes_rate") > 10, "中风险群体")
        .otherwise("低风险群体")
    )
    
    # 按风险等级排序
    final_clustering_result = risk_classified_clusters.orderBy(desc("diabetes_rate"))
    
    # 构建聚类分析结果
    clustering_results = final_clustering_result.collect()
    risk_groups_analysis = []
    
    for cluster_info in clustering_results:
        group_profile = {
            "cluster_id": f"群体{cluster_info['cluster_id'] + 1}",
            "population_size": cluster_info["cluster_size"],
            "diabetes_incidence": cluster_info["diabetes_rate"],
            "risk_classification": cluster_info["risk_level"],
            "demographic_profile": {
                "average_age": cluster_info["avg_age"],
                "average_bmi": cluster_info["avg_bmi"],
                "average_fasting_glucose": cluster_info["avg_fbs"],
                "average_hba1c": cluster_info["avg_hba1c"],
                "average_systolic_bp": round(cluster_info["avg_systolic"], 1),
                "average_diastolic_bp": round(cluster_info["avg_diastolic"], 1)
            },
            "diabetes_cases": cluster_info["diabetes_count"],
            "intervention_priority": "紧急干预" if cluster_info["diabetes_rate"] > 25 else "重点关注" if cluster_info["diabetes_rate"] > 15 else "预防指导"
        }
        risk_groups_analysis.append(group_profile)
    
    # 返回完整的聚类分析结果
    return {
        "clustering_quality": round(silhouette_score, 4),
        "total_samples": sum([group["population_size"] for group in risk_groups_analysis]),
        "risk_groups": risk_groups_analysis,
        "analysis_summary": f"成功识别出{len(risk_groups_analysis)}个不同风险特征的人群聚类"
    }


六、项目文档展示

在这里插入图片描述

七、总结

本研究基于Spark大数据技术构建了综合性的糖尿病健康数据分析系统,通过整合患者基础特征、生理指标、生活方式等多维度数据,实现了对糖尿病发病规律的深度挖掘和智能分析。系统运用Hadoop分布式存储架构处理海量医疗数据,结合Spark内存计算优势,显著提升了数据处理效率和分析准确性。在技术实现方面,采用Python作为主要开发语言,Django框架构建后端服务,Vue框架打造用户界面,Echarts实现数据可视化,形成了完整的技术解决方案。

系统核心功能涵盖年龄段发病率分析、BMI与糖尿病关联研究、高风险人群聚类识别等七大模块,能够从不同角度揭示糖尿病的发病机制和风险因素。通过对27个关键指标的综合分析,系统可以准确识别糖尿病高危人群,为医疗机构提供精准的预警信息和干预建议。实际应用表明,该系统不仅提升了糖尿病筛查的效率和准确性,还为制定个性化治疗方案和公共卫生政策提供了科学依据。这一研究成果为慢性疾病的大数据分析提供了新的思路和方法,具有重要的理论价值和广阔的应用前景,推动了智慧医疗和精准医学的发展进程。

大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖


网站公告

今日签到

点亮在社区的每一天
去签到