【大数据】皮肤癌数据可视化分析系统 计算机毕业设计项目 Hadoop+Spark环境配置 数据科学与大数据技术 附源码+文档+讲解

58 阅读6分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊

二、系统介绍

大数据框架:Hadoop+Spark(Hive需要定制修改) 开发语言:Java+Python(两个版本都支持) 数据库:MySQL 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+Echarts+HTML+CSS+JavaScript+jQuery

《皮肤癌数据可视化分析系统》是一个基于Hadoop+Spark大数据框架开发的医疗数据分析平台,采用Python作为主要开发语言,后端使用Django框架构建RESTful服务接口,前端通过Vue+ElementUI+Echarts技术栈实现交互界面和图表展示。系统利用HDFS分布式文件系统存储海量皮肤癌病例数据,通过Spark SQL进行高效数据查询和分析,结合Pandas、NumPy等科学计算库实现复杂的统计建模。功能模块涵盖用户权限管理、皮肤癌信息录入与管理、多维度可视化分析、诊断交叉验证分析、皮肤病变特征提取分析、就诊患者画像构建、患癌风险因素挖掘、系统公告发布以及可视化大屏展示等核心业务场景。系统通过对皮肤癌患者的年龄分布、病变类型、病理特征、就诊时间等多维度数据进行深度挖掘和关联分析,为医疗机构提供辅助决策支持,帮助医生更直观地了解患者群体特征和疾病发展趋势,同时为皮肤癌的预防和早期筛查提供数据参考依据。

三、视频解说

皮肤癌数据可视化分析系统

四、部分功能展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、部分代码展示


from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, avg, when, sum as spark_sum, round as spark_round, concat_ws, collect_list, explode, split, desc, row_number, dense_rank
from pyspark.sql.window import Window
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from django.http import JsonResponse
from django.views import View
import json
import numpy as np
import pandas as pd
spark = SparkSession.builder.appName("SkinCancerAnalysis").config("spark.sql.warehouse.dir", "/user/hive/warehouse").config("spark.executor.memory", "2g").config("spark.driver.memory", "1g").getOrCreate()
class LesionFeatureAnalysisView(View):
    def get(self, request):
        df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/skin_cancer_db").option("driver", "com.mysql.cj.jdbc.Driver").option("dbtable", "skin_cancer_info").option("user", "root").option("password", "password").load()
        df = df.filter(col("is_deleted") == 0)
        df = df.withColumn("asymmetry_score", when(col("asymmetry") == "对称", 1).when(col("asymmetry") == "轻度不对称", 2).when(col("asymmetry") == "中度不对称", 3).otherwise(4))
        df = df.withColumn("border_score", when(col("border") == "规则", 1).when(col("border") == "轻度不规则", 2).when(col("border") == "中度不规则", 3).otherwise(4))
        df = df.withColumn("color_score", when(col("color_variation") == "单一", 1).when(col("color_variation") == "两种", 2).when(col("color_variation") == "三种", 3).otherwise(4))
        df = df.withColumn("diameter_score", when(col("diameter") < 3, 1).when((col("diameter") >= 3) & (col("diameter") < 6), 2).when((col("diameter") >= 6) & (col("diameter") < 10), 3).otherwise(4))
        df = df.withColumn("total_abcd_score", col("asymmetry_score") + col("border_score") + col("color_score") + col("diameter_score"))
        df = df.withColumn("risk_level", when(col("total_abcd_score") <= 6, "低风险").when((col("total_abcd_score") > 6) & (col("total_abcd_score") <= 10), "中风险").otherwise("高风险"))
        lesion_type_dist = df.groupBy("lesion_type").agg(count("*").alias("count"), spark_round(avg("total_abcd_score"), 2).alias("avg_score")).orderBy(desc("count"))
        lesion_type_list = [{"lesion_type": row["lesion_type"], "count": row["count"], "avg_score": float(row["avg_score"])} for row in lesion_type_dist.collect()]
        risk_distribution = df.groupBy("risk_level").agg(count("*").alias("count")).orderBy(desc("count"))
        risk_dist_list = [{"risk_level": row["risk_level"], "count": row["count"]} for row in risk_distribution.collect()]
        feature_correlation = df.groupBy("asymmetry", "border").agg(count("*").alias("count")).orderBy(desc("count")).limit(10)
        correlation_list = [{"asymmetry": row["asymmetry"], "border": row["border"], "count": row["count"]} for row in feature_correlation.collect()]
        high_risk_cases = df.filter(col("risk_level") == "高风险").select("patient_name", "lesion_type", "total_abcd_score", "diagnosis_date").orderBy(desc("total_abcd_score")).limit(20)
        high_risk_list = [{"patient_name": row["patient_name"], "lesion_type": row["lesion_type"], "total_abcd_score": row["total_abcd_score"], "diagnosis_date": str(row["diagnosis_date"])} for row in high_risk_cases.collect()]
        return JsonResponse({"lesion_type_distribution": lesion_type_list, "risk_distribution": risk_dist_list, "feature_correlation": correlation_list, "high_risk_cases": high_risk_list})
class PatientPortraitAnalysisView(View):
    def get(self, request):
        df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/skin_cancer_db").option("driver", "com.mysql.cj.jdbc.Driver").option("dbtable", "skin_cancer_info").option("user", "root").option("password", "password").load()
        df = df.filter(col("is_deleted") == 0)
        df = df.withColumn("age_group", when(col("age") < 18, "未成年").when((col("age") >= 18) & (col("age") < 30), "青年").when((col("age") >= 30) & (col("age") < 45), "中年").when((col("age") >= 45) & (col("age") < 60), "中老年").otherwise("老年"))
        df = df.withColumn("visit_month", col("diagnosis_date").substr(6, 2))
        df = df.withColumn("visit_season", when(col("visit_month").isin(["03", "04", "05"]), "春季").when(col("visit_month").isin(["06", "07", "08"]), "夏季").when(col("visit_month").isin(["09", "10", "11"]), "秋季").otherwise("冬季"))
        age_gender_dist = df.groupBy("age_group", "gender").agg(count("*").alias("count")).orderBy("age_group", "gender")
        age_gender_list = [{"age_group": row["age_group"], "gender": row["gender"], "count": row["count"]} for row in age_gender_dist.collect()]
        occupation_cancer_type = df.groupBy("occupation", "cancer_type").agg(count("*").alias("count")).orderBy(desc("count")).limit(15)
        occupation_list = [{"occupation": row["occupation"], "cancer_type": row["cancer_type"], "count": row["count"]} for row in occupation_cancer_type.collect()]
        season_visit_trend = df.groupBy("visit_season").agg(count("*").alias("patient_count"), spark_round(avg("age"), 1).alias("avg_age")).orderBy("visit_season")
        season_list = [{"visit_season": row["visit_season"], "patient_count": row["patient_count"], "avg_age": float(row["avg_age"])} for row in season_visit_trend.collect()]
        region_cancer_dist = df.groupBy("region", "cancer_type").agg(count("*").alias("count")).orderBy(desc("count")).limit(20)
        region_list = [{"region": row["region"], "cancer_type": row["cancer_type"], "count": row["count"]} for row in region_cancer_dist.collect()]
        window_spec = Window.partitionBy("age_group").orderBy(desc("count"))
        lesion_by_age = df.groupBy("age_group", "lesion_type").agg(count("*").alias("count"))
        lesion_by_age = lesion_by_age.withColumn("rank", row_number().over(window_spec)).filter(col("rank") <= 3).orderBy("age_group", "rank")
        lesion_age_list = [{"age_group": row["age_group"], "lesion_type": row["lesion_type"], "count": row["count"], "rank": row["rank"]} for row in lesion_by_age.collect()]
        return JsonResponse({"age_gender_distribution": age_gender_list, "occupation_cancer_type": occupation_list, "season_visit_trend": season_list, "region_cancer_distribution": region_list, "lesion_by_age_ranking": lesion_age_list})
class RiskFactorAnalysisView(View):
    def post(self, request):
        df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/skin_cancer_db").option("driver", "com.mysql.cj.jdbc.Driver").option("dbtable", "skin_cancer_info").option("user", "root").option("password", "password").load()
        df = df.filter(col("is_deleted") == 0)
        df = df.withColumn("sun_exposure_numeric", when(col("sun_exposure") == "极少", 1).when(col("sun_exposure") == "偶尔", 2).when(col("sun_exposure") == "经常", 3).otherwise(4))
        df = df.withColumn("family_history_numeric", when(col("family_history") == "无", 0).otherwise(1))
        df = df.withColumn("smoking_numeric", when(col("smoking_history") == "不吸烟", 0).when(col("smoking_history") == "已戒烟", 1).when(col("smoking_history") == "偶尔吸烟", 2).otherwise(3))
        df = df.withColumn("is_malignant", when(col("cancer_type").isin(["黑色素瘤", "基底细胞癌", "鳞状细胞癌"]), 1).otherwise(0))
        sun_exposure_malignancy = df.groupBy("sun_exposure").agg(spark_sum("is_malignant").alias("malignant_count"), count("*").alias("total_count"))
        sun_exposure_malignancy = sun_exposure_malignancy.withColumn("malignancy_rate", spark_round((col("malignant_count") / col("total_count")) * 100, 2))
        sun_exposure_list = [{"sun_exposure": row["sun_exposure"], "malignant_count": row["malignant_count"], "total_count": row["total_count"], "malignancy_rate": float(row["malignancy_rate"])} for row in sun_exposure_malignancy.collect()]
        family_history_impact = df.groupBy("family_history").agg(spark_sum("is_malignant").alias("malignant_count"), count("*").alias("total_count"), spark_round(avg("age"), 1).alias("avg_diagnosis_age"))
        family_history_list = [{"family_history": row["family_history"], "malignant_count": row["malignant_count"], "total_count": row["total_count"], "avg_diagnosis_age": float(row["avg_diagnosis_age"])} for row in family_history_impact.collect()]
        smoking_cancer_relation = df.groupBy("smoking_history", "cancer_type").agg(count("*").alias("count")).orderBy(desc("count")).limit(12)
        smoking_list = [{"smoking_history": row["smoking_history"], "cancer_type": row["cancer_type"], "count": row["count"]} for row in smoking_cancer_relation.collect()]
        train_df = df.select("sun_exposure_numeric", "family_history_numeric", "smoking_numeric", "age", "is_malignant").na.drop()
        assembler = VectorAssembler(inputCols=["sun_exposure_numeric", "family_history_numeric", "smoking_numeric", "age"], outputCol="features")
        train_data = assembler.transform(train_df)
        train_set, test_set = train_data.randomSplit([0.7, 0.3], seed=42)
        lr = LogisticRegression(featuresCol="features", labelCol="is_malignant", maxIter=10)
        model = lr.fit(train_set)
        predictions = model.transform(test_set)
        evaluator = MulticlassClassificationEvaluator(labelCol="is_malignant", predictionCol="prediction", metricName="accuracy")
        accuracy = evaluator.evaluate(predictions)
        coefficients = model.coefficients.toArray()
        factor_importance = [{"factor": "阳光暴露", "coefficient": float(coefficients[0])}, {"factor": "家族史", "coefficient": float(coefficients[1])}, {"factor": "吸烟史", "coefficient": float(coefficients[2])}, {"factor": "年龄", "coefficient": float(coefficients[3])}]
        return JsonResponse({"sun_exposure_analysis": sun_exposure_list, "family_history_impact": family_history_list, "smoking_cancer_relation": smoking_list, "model_accuracy": float(accuracy), "risk_factor_importance": factor_importance})

六、部分文档展示

在这里插入图片描述

七、END

💕💕文末获取源码联系计算机编程果茶熊