【有源码】基于大数据的药品多维度属性分析可视化系统 基于Spark的药品属性聚类与关联规则可视化分析系统

注意:该项目只展示部分功能,如需了解,文末咨询即可。

本文目录

  • [1 开发环境](#1 开发环境)
  • [2 系统设计](#2 系统设计)
  • [3 系统展示](#3 系统展示)
    • [3.1 功能展示视频](#3.1 功能展示视频)
    • [3.2 大屏页面](#3.2 大屏页面)
    • [3.3 分析页面](#3.3 分析页面)
    • [3.4 基础页面](#3.4 基础页面)
  • [4 更多推荐](#4 更多推荐)
  • [5 部分功能代码](#5 部分功能代码)

1 开发环境

发语言:python

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

数据库:MySQL

开发环境:PyCharm

2 系统设计

随着药品数据在名称、治疗类别、剂型、规格剂量、生产厂商、适应症和管控分类等维度上不断累积,传统单机统计方式在数据装载、清洗和多维交叉分析方面难以满足高效处理与稳定输出的需求。该背景下,本项目以 medicine 数据集为对象,依托 HDFS 完成数据装载与存储,结合 pandas 进行预处理,并使用 Spark 对药品多维度属性进行统计分析与模式挖掘,为药品大数据分析与可视化系统提供数据基础。

系统开发意义在于将分散的药品属性转化为可统计、可对比、可挖掘的结构化结果,通过品类结构、剂型分布、规格剂量、厂商格局、适应症谱和管控分类等分析,呈现药品市场与管控特征,并借助 K-Means 聚类、FP-Growth 关联规则和 Isolation Forest 异常检测发现属性组合模式与异常剂量,为药品数据可视化、结构洞察和辅助决策提供可靠依据。

本项目围绕药品多维度属性大数据分析与统计展开,以 medicine 数据集为对象,基于 HDFS 完成数据装载,利用 pandas 进行预处理,并通过 Spark 执行多维统计与模式挖掘。预处理阶段对表头进行英文化,统一为 snake_case 字段,清洗类别字段空值,解析 strength 中的 mg 数值并生成 strength_value,完成品类、剂型、适应症、管控分类和厂商的中文映射,数值保留两位小数,输出本地 CSV 并同步至 HDFS。分析阶段读取预处理数据,从品类结构、剂型分布、规格剂量、厂商格局、适应症谱、管控分类等角度开展占比、排名、交叉对比和差异分析,同时使用 K-Means 聚类、FP-Growth 关联规则和 Isolation Forest 异常检测进行模式洞察,输出各类 CSV 结果,为药品多维度属性可视化提供数据支撑。

数据装载与预处理:研究 HDFS 目录重建、文件上传、SafeMode 检查、pandas 清洗、字段规范化、剂量解析、中文枚举映射、本地与 HDFS 结果保存,为后续分析提供干净数据。

品类结构分析:研究治疗类别占比、品类数量排名、品类与管控分类对比、热门药名排名、品类与剂型交叉构成,呈现药品品类结构。

剂型分布分析:研究剂型数量占比、剂型与管控分类对比、剂型与适应症关系、剂型品类结构、主流剂型排名,反映剂型分布特征。

规格剂量分析:研究剂量低中高分箱、品类平均剂量、剂型平均剂量、管控分类剂量对比、厂商剂量水平,刻画规格剂量差异。

厂商格局分析:研究厂商产量排名、厂商品类布局、厂商非处方药占比、厂商剂型偏好、厂商适应症覆盖,展示厂商竞争与布局。

适应症谱分析:研究适应症数量占比、适应症与品类关联、适应症与管控分类对比、适应症剂型结构、适应症剂量水平,描绘适应症谱系。

管控分类分析:研究非处方药与处方药总体占比、管控分类下品类差异、剂型差异、适应症差异、剂量差异,比较管控分类特征。

模式洞察分析:研究药品属性 K-Means 分群、品类/剂型/适应症/管控组合的 FP-Growth 关联规则、基于 Isolation Forest 的异常剂量识别,挖掘潜在模式与异常。

3 系统展示

3.1 功能展示视频

基于大数据的药品多维度属性分析与可视化的设计与实现

!!!请点击这里查看功能演示!!!

3.2 大屏页面

3.3 分析页面

3.4 基础页面

4 更多推荐

计算机专业毕业设计新风向,2026年大数据 + AI前沿60个毕设选题全解析,涵盖Hadoop、Spark、机器学习、AI等类型

计算机专业毕业设计选题深度剖析,掌握这些技巧,让你的选题轻松通过,文章附35个优质选题助你顺利通过开题!

【避坑必看】26届计算机毕业设计选题雷区大全,这些毕设题目千万别选!选题雷区深度解析

紧跟风口!2026计算机毕设新赛道:精选三大热门领域下的创新选题, 拒绝平庸!毕设技术亮点+功能创新,双管齐下

纯分享!2026届计算机毕业设计选题全攻略(选题+技术栈+创新点+避坑),这80个题目覆盖所有方向,计算机毕设选题大全收藏

计算机专业毕业设计选题深度剖析,掌握这些技巧,让你的选题轻松通过,文章附35个优质选题助你顺利通过开题!

5 部分功能代码

python 复制代码
def medicine_attribute_cluster_analysis(input_df):
    """
    药品属性分群分析(K-Means)。
    特征:strength_value + 品类/剂型/适应症/管控 one-hot,标准化后聚类。
    """
    logger.info("开始分析: medicine_attribute_cluster_analysis")
    base = input_df.filter(
        col('strength_value').isNotNull()
        & col('category').isNotNull()
        & col('dosage_form').isNotNull()
        & col('indication').isNotNull()
        & col('classification').isNotNull()
    ).withColumn('strength_value', col('strength_value').cast('double'))

    cat_cols = ['category', 'dosage_form', 'indication', 'classification']
    staged = base
    index_cols = []
    for c in cat_cols:
        idx = f'{c}_idx'
        staged = StringIndexer(
            inputCol=c, outputCol=idx, handleInvalid='skip'
        ).fit(staged).transform(staged)
        index_cols.append(idx)

    assembler = VectorAssembler(
        inputCols=['strength_value'] + index_cols,
        outputCol='features_raw',
    )
    featured = assembler.transform(staged)
    scaler = StandardScaler(
        inputCol='features_raw', outputCol='features', withMean=True, withStd=True
    )
    featured = scaler.fit(featured).transform(featured)

    evaluator = ClusteringEvaluator(
        featuresCol='features', predictionCol='cluster_id', metricName='silhouette'
    )
    best_k, best_score, best_model, best_pred = 4, -1.0, None, None
    for k in [3, 4, 5, 6]:
        km = KMeans(featuresCol='features', predictionCol='cluster_id', k=k, seed=42)
        model = km.fit(featured)
        pred = model.transform(featured)
        score = float(evaluator.evaluate(pred))
        if score > best_score:
            best_k, best_score, best_model, best_pred = k, score, model, pred

    pred_pdf = best_pred.select(
        'cluster_id', 'strength_value', 'category', 'dosage_form', 'indication', 'classification'
    ).toPandas()

    rows = []
    cluster_stats = []
    for cid, g in pred_pdf.groupby('cluster_id'):
        avg_dose = float(round(g['strength_value'].mean(), 2))
        cluster_stats.append({
            'cluster_id': int(cid),
            'sample_count': int(len(g)),
            'avg_strength': avg_dose,
            'main_category': _mode_label(g, 'category'),
            'main_dosage_form': _mode_label(g, 'dosage_form'),
            'main_indication': _mode_label(g, 'indication'),
            'main_classification': _mode_label(g, 'classification'),
        })

    result_pdf = pd.DataFrame(cluster_stats)
    path = _write_csv_pattern_insight(result_pdf, 'medicine_attribute_cluster_analysis')
    logger.info(f"保存到: {path} 成功")
    return result_pdf


def attribute_association_analysis(input_df):
    """
    属性组合关联分析(FP-Growth)。
    每条记录视为事务:品类/剂型/适应症/管控 四项;过滤提升度≤1 的弱规则。
    """
    logger.info("开始分析: attribute_association_analysis")
    base = input_df.filter(
        col('category').isNotNull()
        & col('dosage_form').isNotNull()
        & col('indication').isNotNull()
        & col('classification').isNotNull()
    )
    n_rows = base.count()

    items_df = base.select(
        array(
            concat(lit('品类:'), col('category')),
            concat(lit('剂型:'), col('dosage_form')),
            concat(lit('适应症:'), col('indication')),
            concat(lit('管控:'), col('classification')),
        ).alias('items')
    )

    fp = FPGrowth(itemsCol='items', minSupport=0.02, minConfidence=0.3)
    model = fp.fit(items_df)
    rules = model.associationRules

    strong = rules.filter(col('lift') > 1.0)
    freq = model.freqItemsets.withColumn(
        'itemset_support', spark_round(col('freq') / lit(float(n_rows)), 2)
    )
    strong_str = strong.select(
        col('antecedent'),
        col('consequent'),
        spark_round(col('confidence'), 2).alias('confidence'),
        spark_round(col('lift'), 2).alias('lift'),
    )
    result = (
        strong_str.join(
            freq.select(
                col('items').alias('antecedent'),
                col('itemset_support').alias('support'),
            ),
            on='antecedent',
            how='left',
        )
        .select(
            concat_ws(' & ', col('antecedent')).alias('antecedent'),
            concat_ws(' & ', col('consequent')).alias('consequent'),
            col('support'),
            col('confidence'),
            col('lift'),
        )
        .orderBy(desc('lift'), desc('confidence'))
    )
    result = result.withColumn(
        'rule_desc',
        concat(col('antecedent'), lit(' → '), col('consequent')),
    )
    path = _write_csv_pattern_insight(result, 'attribute_association_analysis')
    logger.info(f"保存到: {path} 成功")
    return result


def anomaly_dose_detection_analysis(input_df):
    """
    异常剂量识别分析(Isolation Forest)。
    参数:n_estimators=200, contamination=0.05, random_state=42。
    """
    logger.info("开始分析: anomaly_dose_detection_analysis")
    base = input_df.filter(
        col('strength_value').isNotNull()
        & col('category').isNotNull()
        & col('dosage_form').isNotNull()
    ).select('strength_value', 'category', 'dosage_form', 'indication', 'classification', 'name')
    n_rows = base.count()

    staged = base.withColumn('strength_value', col('strength_value').cast('double'))
    for c in ['category', 'dosage_form']:
        staged = StringIndexer(
            inputCol=c, outputCol=f'{c}_idx', handleInvalid='skip'
        ).fit(staged).transform(staged)

    feat_pdf = staged.select(
        'strength_value', 'category_idx', 'dosage_form_idx',
        'category', 'dosage_form', 'indication', 'classification', 'name',
    ).toPandas()

    X = feat_pdf[['strength_value', 'category_idx', 'dosage_form_idx']].astype(float).values
    X_scaled = SkStandardScaler().fit_transform(X)

    clf = IsolationForest(
        n_estimators=200,
        contamination=0.05,
        random_state=42,
        n_jobs=-1,
    )
    pred = clf.fit_predict(X_scaled)
    scores = clf.decision_function(X_scaled)

    feat_pdf['anomaly_score'] = np.round(scores, 2)
    feat_pdf['is_anomaly'] = (pred == -1).astype(int)
    feat_pdf['anomaly_flag'] = feat_pdf['is_anomaly'].map(
        {1: '异常剂量', 0: '正常剂量'}
    )

    anom = feat_pdf[feat_pdf['is_anomaly'] == 1]
    if len(anom) == 0:
        result_pdf = pd.DataFrame(columns=[
            'category', 'dosage_form', 'anomaly_count', 'avg_anomaly_score',
            'avg_strength', 'anomaly_flag',
        ])
    else:
        result_pdf = (
            anom.groupby(['category', 'dosage_form'], as_index=False)
            .agg(
                anomaly_count=('is_anomaly', 'sum'),
                avg_anomaly_score=('anomaly_score', 'mean'),
                avg_strength=('strength_value', 'mean'),
            )
        )
        result_pdf['avg_anomaly_score'] = result_pdf['avg_anomaly_score'].round(2)
        result_pdf['avg_strength'] = result_pdf['avg_strength'].round(2)
        result_pdf['anomaly_count'] = result_pdf['anomaly_count'].astype(int)
        result_pdf['anomaly_flag'] = '异常剂量'
        result_pdf = result_pdf.sort_values('anomaly_count', ascending=False)

    path = _write_csv_pattern_insight(result_pdf, 'anomaly_dose_detection_analysis')
    logger.info(f"保存到: {path} 成功")
    return result_pdf

源码项目、定制开发、文档报告、PPT、代码答疑

希望和大家多多交流 ↓↓↓↓↓

相关推荐
pt10431 小时前
Cisco Splunk for AI Operations:AIOps机器学习
运维·网络·人工智能·机器学习
Q26433650231 小时前
【有源码】基于大数据的零售交易者行为特征与生存状况数据分析及可视化 Hadoop+Spark大数据项目
大数据·hadoop·信息可视化·数据挖掘·数据分析·spark·毕业设计
Q26433650234 小时前
【有源码】基于 Hadoop 生态的化妆品销售数据存储分析与可视化 面向化妆品行业的用户画像构建与销售机会识别研究
大数据·hadoop·python·机器学习·spark·毕业设计·课程设计
小王毕业啦13 小时前
2012-2024年 机构投资者实地调研数据 xlsx
大数据·人工智能·数据挖掘·数据分析·社科数据·实证分析·经管数据
workflower16 小时前
人形机器人安全伦理标准
人工智能·安全·机器学习·机器人·无人机
代码调试师17 小时前
【毕设分享】基于SpringBoot的旅游向导分配管理系统57145
spring boot·毕业设计·源码·课程设计·毕设·大作业·程序定制
vx_Biye_Design18 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
千里码aicood18 小时前
基于机器学习的雷达低慢小目标识别技术的研究
人工智能·机器学习
专业程序开发源18 小时前
springbootLivehouse票务系统-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·pygame