精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
一、项目介绍
基于Spark的强迫症特征影响因素数据分析系统是一个综合运用大数据技术进行心理健康数据分析的完整解决方案。该系统采用Hadoop分布式存储架构作为数据底层支撑,利用Spark强大的内存计算能力处理包含33个字段的强迫症问卷数据集,通过Python语言结合Django框架构建后端数据处理服务,前端采用Vue框架配合Echarts可视化组件实现交互式图表展示。系统核心功能涵盖四个主要分析维度:强迫症患者人口学特征分析通过年龄、性别、教育水平等维度描绘患者群体画像;临床特征与严重程度分析深入探索每日仪式行为时长、痛苦程度、功能损害等指标与病情严重性的关联关系;诊断治疗情况分析统计历史诊断比例和不同治疗方案的分布状况;症状聚类与群体画像分析运用K-Means算法基于强迫行为、检查行为、对称排序、侵入性思维四类核心症状进行患者分群,识别不同的强迫症亚型特征。整个系统从数据预处理、特征工程到可视化展示形成完整的数据分析流水线,为强迫症研究提供了一套基于大数据技术的量化分析工具。
选题背景
强迫症作为一种常见的精神障碍疾病,在全球范围内影响着大量人群的心理健康和生活质量。传统的强迫症研究多依赖小样本临床观察和简单统计分析,难以深入挖掘患者群体的复杂特征模式和潜在影响因素。随着心理健康领域数据收集技术的不断完善,研究者能够获得包含丰富维度信息的大规模问卷数据,这些数据往往具有字段众多、关系复杂、数据量庞大的特点。现有的数据分析方法在处理此类多维度心理健康数据时存在明显局限性,传统统计软件在面对大规模数据集时计算效率低下,而简单的描述性统计分析无法揭示数据中隐藏的深层模式和群体特征。同时,心理健康研究中缺乏有效的患者分群和亚型识别方法,研究者难以准确把握不同症状表现模式下的患者特征差异。在这种背景下,运用大数据技术特别是Spark分布式计算框架来处理和分析强迫症特征数据,能够有效解决传统方法面临的计算瓶颈和分析深度不足问题。
选题意义
本课题的研究意义主要体现在技术实践和应用探索两个层面。从技术角度来看,该系统展示了大数据技术在心理健康领域的实际应用潜力,通过Spark分布式计算处理多维度问卷数据,验证了内存计算技术在心理健康数据分析中的有效性和可行性。系统集成了完整的大数据技术栈,从Hadoop分布式存储到Spark数据处理,再到Django后端服务和Vue前端展示,为后续类似项目提供了可参考的技术架构方案。从应用价值角度分析,该系统通过深入的数据挖掘和聚类分析,能够帮助研究者更好地理解强迫症患者群体的特征分布和症状模式,为临床诊断和治疗方案制定提供一定的数据支持。系统的可视化功能使得复杂的统计分析结果能够以直观的图表形式呈现,降低了专业人员理解和应用分析结果的门槛。虽然作为一个毕业设计项目,该系统在实际临床应用中还需要进一步的验证和完善,但它为大数据技术在心理健康研究领域的应用探索提供了有益的尝试,展现了跨学科技术融合的实践价值。
二、视频展示
Hadoop大数据毕设推荐:基于Spark的强迫症特征影响因素数据分析系统【源码+文档+调试】
三、开发环境
- 大数据技术:Hadoop、Spark、Hive
- 开发技术:Python、Django框架、Vue、Echarts
- 软件工具:Pycharm、DataGrip、Anaconda
- 可视化 工具 Echarts
四、系统展示
登录模块:

管理模块展示:








五、代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import VectorAssembler
from django.http import JsonResponse
import json
spark = SparkSession.builder.appName("OCDAnalysis").config("spark.sql.adaptive.enabled", "true").getOrCreate()
def demographic_analysis(request):
df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/ocd_data/OCD-Questionnaire.csv")
df_cleaned = df.na.fill({"age": df.select(avg("age")).collect()[0][0], "gender": "未知", "education": "未知"})
age_severity_analysis = df_cleaned.groupBy("age", "ocd_severity").count().orderBy("age", "ocd_severity")
age_ranges = df_cleaned.withColumn("age_group", when(col("age") < 25, "18-24岁").when(col("age") < 35, "25-34岁").when(col("age") < 45, "35-44岁").otherwise("45岁以上"))
age_distribution = age_ranges.groupBy("age_group", "ocd_severity").count().withColumn("percentage", round(col("count") * 100.0 / age_ranges.count(), 2))
gender_analysis = df_cleaned.withColumn("gender_cn", when(col("gender") == "Male", "男").when(col("gender") == "Female", "女").otherwise("未知"))
gender_severity = gender_analysis.groupBy("gender_cn", "ocd_severity").count().withColumn("severity_percentage", round(col("count") * 100.0 / gender_analysis.groupBy("gender_cn").count().collect()[0]["count"], 2))
education_mapping = {"High school": "高中", "Bachelor": "本科", "Master": "硕士", "PhD": "博士", "未知": "未知"}
education_analysis = df_cleaned.withColumn("education_cn", when(col("education").isin(list(education_mapping.keys())), col("education")).otherwise("未知"))
education_severity = education_analysis.groupBy("education_cn", "ocd_severity").count().orderBy("education_cn", "ocd_severity")
result_data = {"age_distribution": age_distribution.collect(), "gender_analysis": gender_severity.collect(), "education_analysis": education_severity.collect()}
age_distribution.coalesce(1).write.mode("overwrite").option("header", "true").csv("hdfs://localhost:9000/analysis_results/demographic_analysis")
return JsonResponse({"status": "success", "data": result_data})
def symptom_clustering_analysis(request):
df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/ocd_data/OCD-Questionnaire.csv")
symptom_cols = [f"C{i}" for i in range(1, 6)] + [f"CH{i}" for i in range(1, 6)] + [f"S{i}" for i in range(1, 6)] + [f"IT{i}" for i in range(1, 6)]
for col_name in symptom_cols:
col_mean = df.select(avg(col_name)).collect()[0][0]
df = df.na.fill({col_name: col_mean})
df_with_totals = df.withColumn("compulsion_total", sum([col(f"C{i}") for i in range(1, 6)])).withColumn("checking_total", sum([col(f"CH{i}") for i in range(1, 6)])).withColumn("symmetry_total", sum([col(f"S{i}") for i in range(1, 6)])).withColumn("intrusive_total", sum([col(f"IT{i}") for i in range(1, 6)]))
feature_cols = ["compulsion_total", "checking_total", "symmetry_total", "intrusive_total"]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
df_vectorized = assembler.transform(df_with_totals)
kmeans = KMeans(k=4, seed=42, featuresCol="features", predictionCol="cluster")
model = kmeans.fit(df_vectorized)
clustered_df = model.transform(df_vectorized)
cluster_analysis = clustered_df.groupBy("cluster").agg(avg("compulsion_total").alias("avg_compulsion"), avg("checking_total").alias("avg_checking"), avg("symmetry_total").alias("avg_symmetry"), avg("intrusive_total").alias("avg_intrusive"), count("*").alias("patient_count"))
cluster_with_labels = cluster_analysis.withColumn("cluster_label", when(col("cluster") == 0, "强迫行为主导型").when(col("cluster") == 1, "检查行为主导型").when(col("cluster") == 2, "对称排序主导型").otherwise("侵入思维主导型"))
demographic_by_cluster = clustered_df.groupBy("cluster", "gender", "education").count().withColumn("demo_percentage", round(col("count") * 100.0 / clustered_df.groupBy("cluster").count().collect()[0]["count"], 2))
severity_by_cluster = clustered_df.groupBy("cluster", "ocd_severity").count().withColumn("severity_distribution", round(col("count") * 100.0 / clustered_df.groupBy("cluster").count().collect()[0]["count"], 2))
result_data = {"cluster_features": cluster_with_labels.collect(), "demographic_distribution": demographic_by_cluster.collect(), "severity_distribution": severity_by_cluster.collect()}
cluster_with_labels.coalesce(1).write.mode("overwrite").option("header", "true").csv("hdfs://localhost:9000/analysis_results/symptom_clustering")
return JsonResponse({"status": "success", "clustering_results": result_data})
def clinical_severity_analysis(request):
df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/ocd_data/OCD-Questionnaire.csv")
df_cleaned = df.na.fill({"hours_rituals_per_day": df.select(avg("hours_rituals_per_day")).collect()[0][0], "distress_level_0_10": df.select(avg("distress_level_0_10")).collect()[0][0], "impairment_work_school_0_10": df.select(avg("impairment_work_school_0_10")).collect()[0][0]})
severity_distribution = df_cleaned.groupBy("ocd_severity").count().withColumn("percentage", round(col("count") * 100.0 / df_cleaned.count(), 2)).orderBy(desc("count"))
ritual_severity_analysis = df_cleaned.groupBy("ocd_severity").agg(avg("hours_rituals_per_day").alias("avg_ritual_hours"), stddev("hours_rituals_per_day").alias("std_ritual_hours")).orderBy("ocd_severity")
distress_severity_analysis = df_cleaned.groupBy("ocd_severity").agg(avg("distress_level_0_10").alias("avg_distress"), stddev("distress_level_0_10").alias("std_distress"), min("distress_level_0_10").alias("min_distress"), max("distress_level_0_10").alias("max_distress"))
impairment_severity_analysis = df_cleaned.groupBy("ocd_severity").agg(avg("impairment_work_school_0_10").alias("avg_impairment"), stddev("impairment_work_school_0_10").alias("std_impairment"), count("*").alias("patient_count"))
correlation_analysis = df_cleaned.select(corr("hours_rituals_per_day", "distress_level_0_10").alias("ritual_distress_corr"), corr("distress_level_0_10", "impairment_work_school_0_10").alias("distress_impairment_corr"), corr("hours_rituals_per_day", "impairment_work_school_0_10").alias("ritual_impairment_corr"))
severity_mapping = {"None/Minimal": "无/轻微", "Mild": "轻度", "Moderate": "中度", "Severe": "重度", "Extreme": "极重度"}
severity_cn = df_cleaned.withColumn("severity_cn", when(col("ocd_severity").isin(list(severity_mapping.keys())), col("ocd_severity")).otherwise("未知"))
comprehensive_analysis = severity_cn.groupBy("severity_cn").agg(avg("hours_rituals_per_day").alias("平均仪式时长"), avg("distress_level_0_10").alias("平均痛苦程度"), avg("impairment_work_school_0_10").alias("平均功能损害"), count("*").alias("患者数量"))
treatment_effectiveness = df_cleaned.groupBy("treatment_status", "ocd_severity").count().withColumn("treatment_ratio", round(col("count") * 100.0 / df_cleaned.groupBy("treatment_status").count().collect()[0]["count"], 2))
result_data = {"severity_stats": severity_distribution.collect(), "ritual_analysis": ritual_severity_analysis.collect(), "distress_analysis": distress_severity_analysis.collect(), "impairment_analysis": impairment_severity_analysis.collect(), "correlations": correlation_analysis.collect(), "comprehensive_stats": comprehensive_analysis.collect()}
comprehensive_analysis.coalesce(1).write.mode("overwrite").option("header", "true").csv("hdfs://localhost:9000/analysis_results/clinical_severity_analysis")
return JsonResponse({"status": "success", "clinical_data": result_data})
六、项目文档展示

七、项目总结
基于Spark的强迫症特征影响因素数据分析系统通过整合现代大数据技术栈,为心理健康领域的数据分析提供了一个相对完整的解决方案。该系统运用Hadoop分布式存储和Spark内存计算的技术优势,有效处理了包含33个字段的复杂问卷数据,实现了从数据预处理到可视化展示的全流程自动化分析。通过人口学特征分析、临床严重程度评估、症状聚类识别等核心功能模块,系统能够多角度揭示强迫症患者群体的特征分布和影响因素关联模式。虽然作为毕业设计项目,该系统在实际应用中还存在一定的局限性,比如数据来源的单一性和算法模型的相对简单,但它成功展示了大数据技术在心理健康研究中的应用潜力。系统采用的技术架构具有良好的可扩展性,为后续功能增强和性能优化奠定了基础。同时,该项目也为计算机专业学生提供了一个跨学科应用实践的案例,展现了技术与实际问题结合的价值。总体而言,这个系统在有限的范围内实现了预期的分析目标,为强迫症特征研究提供了一定的技术支持和数据洞察。
大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖

被折叠的 条评论
为什么被折叠?



