AI+大数据成热点,基于K-Means聚类分析的脑卒中风险因素挖掘与可视化系统成为新宠!

93 阅读7分钟

注意:该项目只展示部分功能

1.开发环境

发语言:python

采用技术:Spark、Hadoop、Django、Vue、Echarts等技术框架

数据库:MySQL

开发环境:PyCharm

2 系统设计

脑卒中作为全球范围内致残率和死亡率较高的疾病之一,其风险评估与预防工作一直是医疗健康领域关注的重点问题。传统的脑卒中风险评估往往依赖于医生的临床经验和单一指标判断,这种方式在面对复杂多样的患者症状组合时显得有些局限,难以全面挖掘各种风险因素之间的潜在关联性。随着信息技术的不断发展,大数据分析技术逐渐在医疗健康领域展现出独特的应用价值,特别是Python、Spark、Hadoop等技术栈的成熟,为处理和分析大规模医疗数据提供了强有力的技术支撑。与此同时,数据可视化技术也日益完善,Echarts、Vue等前端技术能够将复杂的数据分析结果以直观、易懂的图表形式呈现出来。在这样的技术背景下,将大数据分析方法应用于脑卒中风险评估,并通过可视化手段展示分析结果,成为一个值得探索的研究方向。

本课题的研究意义主要体现在几个方面的实践探索上,从技术角度来看,这个系统尝试将大数据处理技术与医疗数据分析相结合,通过实际的开发实践,可以加深对Spark分布式计算、Python数据挖掘以及机器学习算法在医疗场景下应用的理解,对提升个人的大数据技术应用能力有一定帮助。从应用层面来说,系统通过多维度的数据分析和可视化展示,能够为医疗数据的深度挖掘提供一种可行的技术思路,虽然规模有限,但也算是对现有脑卒中风险评估方法的一种技术补充。对于医疗工作者而言,这样的可视化分析工具可能会为他们观察患者风险因素提供一些新的视角,便于更直观地理解不同症状与风险之间的关联关系。当然,基于K-Means聚类分析的脑卒中风险因素挖掘与可视化系统作为一个毕业设计项目,它更重要的价值在于通过完整的系统开发过程,锻炼从需求分析、技术选型到系统实现的综合能力,为后续在相关技术领域的深入学习和工作实践打下基础。

基于K-Means聚类分析的脑卒中风险因素挖掘与可视化系统是一个集数据挖掘、机器学习与可视化展示于一体的综合性医疗大数据分析平台,该系统采用Python作为核心开发语言,结合Spark分布式计算框架和Hadoop大数据存储架构,对海量脑卒中风险数据进行深度挖掘与智能分析。系统前端采用Vue框架配合Echarts图表库构建交互式可视化界面,后端使用MySQL数据库存储分析结果,形成完整的大数据处理链路。 功能方面,基于K-Means聚类分析的脑卒中风险因素挖掘与可视化系统实现了五大核心分析模块:首先通过整体人口特征与风险概览模块,展示总体风险人群分布、性别构成、年龄结构及各项临床症状的普遍性统计;其次基于核心人口统计学维度,深入分析不同性别平均风险对比、风险百分比随年龄变化趋势、不同年龄段性别风险差异及各年龄段高发症状分布;第三个模块专注临床症状深度挖掘,量化单一症状对中风风险的影响度、探索症状数量与风险水平关系、运用Apriori算法挖掘高风险人群症状组合模式,并生成症状间相关性热力图;第四模块构建高风险人群精准画像,包括年龄分布特征、性别构成分析、最普遍的五大症状识别及与低风险人群的症状差异对比;最后通过基于算法的潜在模式发现模块,利用K-Means聚类算法对患者进行症状分群,分析各聚类群组风险画像与特征症状,并运用SHAP算法量化关键风险因素贡献度,为脑卒中预防与早期干预提供科学的数据支撑与决策依据。

3 系统展示

3.1 大屏页面

大屏上.png

大屏下.png

3.2 分析页面

差异分析.png

关联分析.png

聚类分析.png

人群画像.png

3.3 基础页面

登录.png

数据管理.png

4 更多推荐

计算机专业毕业设计新风向,2026年大数据 + AI前沿60个毕设选题全解析,涵盖Hadoop、Spark、机器学习、AI等类型 基于大数据技术的慢性肾病数据可视化分析系统 基于Hadoop的软科大学排名可视化分析系统 基于大数据和Python的金融风险评估与数据可视化分析系统 于Hadoop的教育数据与职业成功因素挖掘研究

5 部分功能代码

spark = SparkSession.builder.appName("StrokeRiskAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()

def analyze_risk_by_age_trend(data_path):
    df = spark.read.option("header", "true").option("inferSchema", "true").csv(data_path)
    age_risk_df = df.select("age", "stroke_risk_percentage").filter(col("age").isNotNull() & col("stroke_risk_percentage").isNotNull())
    age_grouped = age_risk_df.groupBy("age").agg(avg("stroke_risk_percentage").alias("avg_risk"), count("*").alias("count_people")).filter(col("count_people") >= 3)
    age_sorted = age_grouped.orderBy("age")
    age_trend_data = age_sorted.collect()
    trend_analysis = []
    previous_risk = None
    for row in age_trend_data:
        current_age = row['age']
        current_risk = row['avg_risk']
        people_count = row['count_people']
        if previous_risk is not None:
            risk_change = current_risk - previous_risk
            change_rate = (risk_change / previous_risk) * 100 if previous_risk != 0 else 0
            trend_analysis.append({
                'age': current_age,
                'avg_risk': round(current_risk, 2),
                'people_count': people_count,
                'risk_change': round(risk_change, 2),
                'change_rate': round(change_rate, 2)
            })
        else:
            trend_analysis.append({
                'age': current_age,
                'avg_risk': round(current_risk, 2),
                'people_count': people_count,
                'risk_change': 0,
                'change_rate': 0
            })
        previous_risk = current_risk
    risk_threshold_analysis = age_sorted.select("age", "avg_risk").filter(col("avg_risk") > 50).collect()
    high_risk_ages = [row['age'] for row in risk_threshold_analysis]
    return {'trend_data': trend_analysis, 'high_risk_ages': high_risk_ages}

def cluster_patients_by_symptoms(data_path):
    df = spark.read.option("header", "true").option("inferSchema", "true").csv(data_path)
    symptom_columns = ["chest_pain", "dizziness", "headache", "weakness", "numbness", "confusion", "vision_problems", "speech_difficulty", "balance_issues", "nausea", "fatigue", "shortness_of_breath", "heart_palpitations", "sweating", "anxiety_doom", "high_blood_pressure"]
    symptom_df = df.select(["age", "gender", "stroke_risk_percentage"] + symptom_columns).na.fill(0)
    assembler = VectorAssembler(inputCols=symptom_columns, outputCol="symptom_features")
    feature_df = assembler.transform(symptom_df)
    kmeans = KMeans().setK(4).setSeed(42).setFeaturesCol("symptom_features").setPredictionCol("cluster_id")
    model = kmeans.fit(feature_df)
    clustered_df = model.transform(feature_df)
    cluster_analysis = clustered_df.groupBy("cluster_id").agg(
        count("*").alias("patient_count"),
        avg("age").alias("avg_age"),
        avg("stroke_risk_percentage").alias("avg_risk"),
        sum(col("gender") == "Male").alias("male_count"),
        sum(col("gender") == "Female").alias("female_count")
    ).collect()
    cluster_results = []
    for cluster_row in cluster_analysis:
        cluster_id = cluster_row['cluster_id']
        cluster_patients = clustered_df.filter(col("cluster_id") == cluster_id)
        symptom_stats = {}
        for symptom in symptom_columns:
            symptom_sum = cluster_patients.agg(sum(symptom).alias("symptom_total")).collect()[0]['symptom_total']
            symptom_rate = (symptom_sum / cluster_row['patient_count']) * 100
            symptom_stats[symptom] = round(symptom_rate, 1)
        top_symptoms = sorted(symptom_stats.items(), key=lambda x: x[1], reverse=True)[:5]
        cluster_info = {
            'cluster_id': cluster_id,
            'patient_count': cluster_row['patient_count'],
            'avg_age': round(cluster_row['avg_age'], 1),
            'avg_risk': round(cluster_row['avg_risk'], 1),
            'male_ratio': round((cluster_row['male_count'] / cluster_row['patient_count']) * 100, 1),
            'female_ratio': round((cluster_row['female_count'] / cluster_row['patient_count']) * 100, 1),
            'top_symptoms': top_symptoms
        }
        cluster_results.append(cluster_info)
    return sorted(cluster_results, key=lambda x: x['avg_risk'], reverse=True)

def analyze_single_symptom_impact(data_path):
    df = spark.read.option("header", "true").option("inferSchema", "true").csv(data_path)
    symptom_columns = ["chest_pain", "dizziness", "headache", "weakness", "numbness", "confusion", "vision_problems", "speech_difficulty", "balance_issues", "nausea", "fatigue", "shortness_of_breath", "heart_palpitations", "sweating", "anxiety_doom", "high_blood_pressure"]
    symptom_impact_results = []
    for symptom in symptom_columns:
        symptom_df = df.select(symptom, "stroke_risk_percentage", "at_risk").filter(col("stroke_risk_percentage").isNotNull())
        has_symptom = symptom_df.filter(col(symptom) == 1)
        no_symptom = symptom_df.filter(col(symptom) == 0)
        has_symptom_stats = has_symptom.agg(
            avg("stroke_risk_percentage").alias("avg_risk"),
            count("*").alias("count"),
            sum("at_risk").alias("high_risk_count")
        ).collect()[0]
        no_symptom_stats = no_symptom.agg(
            avg("stroke_risk_percentage").alias("avg_risk"),
            count("*").alias("count"),
            sum("at_risk").alias("high_risk_count")
        ).collect()[0]
        if has_s

源码项目、定制开发、文档报告、PPT、代码答疑 希望和大家多多交流