精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
文章目录
一、项目介绍
选题背景
糖尿病已成为全球性的重大公共卫生挑战,根据国际糖尿病联盟(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个关键指标的综合分析,系统可以准确识别糖尿病高危人群,为医疗机构提供精准的预警信息和干预建议。实际应用表明,该系统不仅提升了糖尿病筛查的效率和准确性,还为制定个性化治疗方案和公共卫生政策提供了科学依据。这一研究成果为慢性疾病的大数据分析提供了新的思路和方法,具有重要的理论价值和广阔的应用前景,推动了智慧医疗和精准医学的发展进程。
大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖