大数据毕业设计选题方向|【基于大数据的燃油消耗数据可视化与分析】Hadoop+PySpark+FP-Growth

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖

文章目录

一、项目介绍

随着车辆出行规模持续扩大,燃油消耗与行程成本越来越受车队管理、出行规划与节能降耗关注,但原始记录往往分散在车型、路况、驾驶习惯等多维字段里,单靠表格汇总既慢也难看出规律。现有数据体量已达三十余万条,若仍靠人工统计,很难支撑分群、异常识别等深入分析。本文通过开发一个基于大数据的燃油消耗数据可视化与分析系统,用以帮助解决燃油消耗规律难发现、成本影响因素难量化的问题。

系统采用 Hadoop 存储原始数据,以 PySpark 完成 15 项统计分析,并引入 K-Means 驾驶聚类、FP-Growth 关联规则、Isolation Forest 异常检测与 PCA 主成分分析;后端用 Django 提供分析接口,前端以 Vue2 与 ECharts 搭建 4 页分析专题和可视化大屏,同时支持燃油数据的增删改查,以及登录、个人中心、密码修改等管理功能。

经过系统测试,本系统能满足交通运输相关从业者查看车型油耗对比、拥堵与空调对油费影响的需求,也能为计算机专业学生提供可运行的数据分析毕设样例,对把大数据挖掘结果落到 Web 可视化展示具有一定参考意义。

二、视频展示

大数据毕业设计选题方向|【基于大数据的燃油消耗数据分析

三、开发环境

  • 大数据技术:Hadoop、Spark、Hive
  • 开发技术:Python、Django框架、Vue、Echarts
  • 软件工具:Pycharm、DataGrip、Anaconda
  • 可视化 工具 Echarts

四、系统展示

系统页面模块展示:

五、代码展示

bash 复制代码
def driving_cluster_profile_analysis(input_df):
    logger.info('开始分析: 聚类分群')
    feature_cols = ['engine_size', 'cylinders', 'milage_kmpl', 'distance_km', 'fuel_cost']
    assembler = VectorAssembler(inputCols=feature_cols, outputCol='raw_features')
    assembled = assembler.transform(input_df.select(feature_cols))
    scaler = StandardScaler(inputCol='raw_features', outputCol='features', withMean=True, withStd=True)
    scaled = scaler.fit(assembled).transform(assembled)

    kmeans = KMeans(featuresCol='features', predictionCol='cluster_id', k=4, seed=42)
    clustered = kmeans.fit(scaled).transform(scaled)

    profile = clustered.groupBy('cluster_id').agg(
        spark_count(lit(1)).alias('sample_count'),
        spark_round(spark_avg('engine_size'), 2).alias('avg_engine_size'),
        spark_round(spark_avg('cylinders'), 2).alias('avg_cylinders'),
        spark_round(spark_avg('milage_kmpl'), 2).alias('avg_mileage_kmpl'),
        spark_round(spark_avg('distance_km'), 2).alias('avg_distance_km'),
        spark_round(spark_avg('fuel_cost'), 2).alias('avg_fuel_cost'),
    ).withColumn(
        'cluster_label',
        when(col('cluster_id') == 0, lit('簇群1-短途经济型'))
        .when(col('cluster_id') == 1, lit('簇群2-中途均衡型'))
        .when(col('cluster_id') == 2, lit('簇群3-长途高耗型'))
        .otherwise(lit('簇群4-高费异常型')),
    ).orderBy('cluster_id')
    _save_result_csv(profile, os.path.join(OUTPUT_DIR, 'driving_cluster_profile.csv'))

def driving_association_rules_analysis(input_df):
    logger.info('开始分析: 关联规则')
    basket_df = input_df.select(
        array(col('vehicle_class'), col('traffic_level'),
              col('driving_style'), col('ac_usage')).alias('items'))
    model = FPGrowth(itemsCol='items', minSupport=0.05, minConfidence=0.4).fit(basket_df)

    freq_map = {tuple(sorted(r['items'])): float(r['freq']) for r in model.freqItemsets.collect()}
    rule_rows = []
    for rule in model.associationRules.collect():
        antecedent, consequent = sorted(rule['antecedent']), sorted(rule['consequent'])
        rule_dict = rule.asDict()
        if rule_dict.get('support') is not None:
            support = round(float(rule_dict['support']), 2)
        else:
            ant_support = freq_map.get(tuple(antecedent), 0.01)
            support = round(float(rule['confidence']) * ant_support, 2)
        rule_rows.append({
            'antecedent': '、'.join(antecedent),
            'consequent': '、'.join(consequent),
            'support': support,
            'confidence': round(float(rule['confidence']), 2),
            'lift': round(float(rule['lift']), 2),
        })
    rule_rows.sort(key=lambda item: (item['lift'], item['confidence']), reverse=True)
    _save_result_csv(spark.createDataFrame(rule_rows[:20]),
                     os.path.join(OUTPUT_DIR, 'driving_association_rules.csv'))

def fuel_anomaly_detection_analysis(input_df):
    logger.info('开始分析: 异常识别')
    feature_cols = ['milage_kmpl', 'distance_km', 'fuel_cost', 'engine_size']
    row_count = input_df.count()
    sample_fraction = min(0.05, 50000.0 / max(row_count, 1))
    sample_pdf = input_df.select(feature_cols).sample(False, sample_fraction, 42).toPandas()

    features = SkStandardScaler().fit_transform(sample_pdf[feature_cols])
    iso = IsolationForest(n_estimators=100, contamination=0.05, random_state=42)
    iso.fit(features)
    sample_pdf['anomaly_score'] = (-iso.score_samples(features)).round(2)
    sample_pdf['score_bin'] = pd.cut(
        sample_pdf['anomaly_score'],
        bins=[-np.inf, 0.45, 0.55, 0.65, np.inf],
        labels=['低异常', '中低异常', '中高异常', '高异常'])

    summary = sample_pdf.groupby('score_bin', observed=False).agg(
        sample_count=('anomaly_score', 'count'),
        avg_mileage_kmpl=('milage_kmpl', 'mean'),
        avg_distance_km=('distance_km', 'mean'),
        avg_fuel_cost=('fuel_cost', 'mean'),
        avg_engine_size=('engine_size', 'mean'),
    ).reset_index().rename(columns={'score_bin': 'anomaly_score_range'})
    _save_result_csv(spark.createDataFrame(summary.to_dict(orient='records')),
                     os.path.join(OUTPUT_DIR, 'fuel_anomaly_detection.csv'))

def fuel_pca_components_analysis(input_df):
    logger.info('开始分析: 成分分析')
    feature_cols = ['engine_size', 'cylinders', 'milage_kmpl', 'distance_km', 'fuel_cost']
    sample_pdf = input_df.select(feature_cols).sample(
        False, min(0.05, 50000.0 / max(input_df.count(), 1)), 42).toPandas()
    scaled = SkStandardScaler().fit_transform(sample_pdf[feature_cols])
    pca = PCA(n_components=3, random_state=42)
    pca.fit(scaled)

    rows, cumulative = [], 0.0
    for idx, ratio in enumerate(pca.explained_variance_ratio_):
        ratio_val = round(float(ratio), 2)
        cumulative = round(cumulative + ratio_val, 2)
        loadings = [f'{METRIC_NAME_MAP[feature_cols[i]]}:{round(float(pca.components_[idx][i]), 2)}'
                    for i in range(len(feature_cols))]
        rows.append({
            'component': f'主成分{idx + 1}',
            'variance_ratio': ratio_val,
            'cumulative_ratio': cumulative,
            'loadings': ';'.join(loadings),
        })
    _save_result_csv(spark.createDataFrame(rows),
                     os.path.join(OUTPUT_DIR, 'fuel_pca_components.csv'))

def run_all_analyses():
    preprocessed_path = f'hdfs://127.0.0.1:9000/{PROJECT_NAME}/output/{CONCEPT_NAME}_preprocessed_data.csv'
    input_df = spark.read.csv(preprocessed_path, header=True, inferSchema=True)
    logger.info(f'从HDFS读取成功,行数: {input_df.count()}, 列数: {len(input_df.columns)}')
    for func in [
        vehicle_class_distribution_analysis, mileage_by_vehicle_class_analysis,
        traffic_impact_analysis, numeric_correlation_analysis,
        driving_cluster_profile_analysis, driving_association_rules_analysis,
        fuel_anomaly_detection_analysis, fuel_pca_components_analysis,
        # ... 其余 7 项分析函数同理注册
    ]:
        func(input_df)
    logger.info('全部分析函数执行完毕')

六、项目文档展示

七、项目总结

本课题围绕车辆燃油消耗数据,完成了从数据采集处理到 Web 可视化展示的完整链路建设。项目以约 34.2 万条行程记录为研究对象,涵盖车型、排量、行程距离、拥堵程度、驾驶风格、空调使用及燃油成本等维度,借助 Hadoop 完成原始数据存储,利用 PySpark 实现 15 项统计分析,并在挖掘层面引入 K-Means 驾驶聚类、FP-Growth 关联规则、Isolation Forest 异常检测与 PCA 主成分分析,从群体划分、行为共现、异常识别和指标降维等角度揭示燃油消耗规律。

在系统实现方面,后端基于 Django 与 MySQL 提供分析接口与数据管理能力,前端采用 Vue2 与 ECharts 搭建 4 页分析专题和可视化大屏,支持车型油耗对比、拥堵与驾驶行为影响、关联规则展示及聚类画像查看;同时配套燃油数据增删改查与登录、个人中心等基础功能,形成"大数据处理---结果入库---接口服务---图表展示"的闭环。

经测试,本系统能够较直观地呈现不同车型、路况与驾驶习惯下的油耗差异,为燃油成本管控和出行行为优化提供数据参考;对计算机专业学生而言,该项目也具备较好的毕设示范价值,体现了 Hadoop、Spark 挖掘算法与前后端可视化技术的综合应用。

大家可以帮忙点赞、收藏、关注、评论啦 👇🏻

💖🔥作者主页计算机毕设木哥🔥 💖

相关推荐
xiaotianyuanma1 小时前
【计算机毕业设计】基于SSM宠物用品交易网站的设计与实现
课程设计
cspttty1 小时前
会计专业大学期间考什么证
大数据·数据库·人工智能·数据挖掘
markvivv1 小时前
【译】适合在RTX 5090、DGX Spark或类似机器上可运行的最佳新模型是什么?
大数据·人工智能·spark
阿童木写作1 小时前
2026年8月跨境电商批量翻译工具推荐实战指南
大数据·跨境电商批量跨境翻译工具推荐
又折桃枝换酒钱2 小时前
HiLSVA:人在回路的科学可视化智能体系统(翻译与解读)
信息可视化
找方案2 小时前
Seedance 2.5突破30秒视频生成,AI视频赛道进入工业化时代
大数据·人工智能·字节跳动·可灵·ai视频生成·seedance2.5·工业化时代
数据智研2 小时前
【数据分享】中国农产品价格调查年鉴(2004-2025)
大数据·人工智能·数据分析·可视化·数据可视化
逸Y 仙X2 小时前
Spark SQL
java·大数据·sql·spark
千里码aicood2 小时前
大数据智慧农业场景下的种植技术可视化展示平台设计与实现
大数据