还在为大数据毕设发愁?汽车投诉分析系统手把手教你Spark+Python实战

64 阅读8分钟

🎓 作者:计算机毕设小月哥 | 软件开发专家

🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。

🛠️ 专业服务 🛠️

  • 需求定制化开发

  • 源码提供与讲解

  • 技术文档撰写(指导计算机毕设选题【新颖+创新】、任务书、开题报告、文献综述、外文翻译等)

  • 项目答辩演示PPT制作

🌟 欢迎:点赞 👍 收藏 ⭐ 评论 📝

👇🏻 精选专栏推荐 👇🏻 欢迎订阅关注!

大数据实战项目

PHP|C#.NET|Golang实战项目

微信小程序|安卓实战项目

Python实战项目

Java实战项目

🍅 ↓↓主页获取源码联系↓↓🍅

基于大数据的汽车各品牌投诉数据分析与可视化系统_-功能介绍

本系统是基于大数据技术构建的汽车各品牌投诉数据分析与可视化平台,采用Hadoop+Spark分布式计算框架处理海量投诉数据,通过Python进行数据预处理和分析建模,运用Django框架搭建后端服务架构,前端采用Vue+ElementUI+Echarts技术栈实现交互式可视化界面。系统核心功能涵盖品牌维度分析、车型维度分析、问题类型维度分析和文本挖掘维度分析四大模块,能够对汽车投诉数据进行多维度统计分析,包括品牌投诉量排名、车系投诉对比、问题类型分布统计、投诉关键词提取、情感强度分析等20余项具体分析功能。系统运用Spark SQL进行大数据查询优化,结合Pandas和NumPy进行数据科学计算,通过HDFS实现分布式存储,将分析结果以柱状图、折线图、热力图、词云图等多种可视化形式展现,为消费者购车决策、汽车厂商质量改进和监管部门政策制定提供数据支撑。

基于大数据的汽车各品牌投诉数据分析与可视化系统_-选题背景意义

选题背景 随着我国汽车市场的快速发展和消费者维权意识的不断提升,汽车投诉数据呈现出数量大、类型复杂、信息维度丰富的特点。传统的投诉处理方式主要依靠人工统计和简单的数据库查询,难以从海量投诉信息中挖掘出有价值的规律和趋势,也无法为消费者、厂商和监管部门提供科学的决策依据。现有的投诉分析系统多数功能单一,缺乏多维度的深入分析能力,特别是在文本挖掘和情感分析方面存在明显不足。大数据技术的快速发展为解决这一问题提供了新的技术路径,Hadoop和Spark等分布式计算框架能够高效处理大规模投诉数据,Python丰富的数据分析库为深度挖掘投诉信息提供了强大支撑,而现代前端可视化技术则能够将分析结果直观地呈现给用户,使复杂的数据分析变得易于理解和应用。 选题意义 本课题的研究具有一定的理论价值和实际应用意义。从技术角度来看,该系统将大数据处理技术与汽车投诉数据分析相结合,探索了Spark在文本数据处理和多维度分析中的应用方法,为类似的数据分析项目提供了技术参考。系统采用的分布式计算架构和多层次分析模型,在一定程度上丰富了大数据分析系统的设计思路。从实际应用层面,该系统能够帮助消费者更全面地了解各汽车品牌的质量状况和常见问题,为购车决策提供一些数据参考;对汽车厂商而言,系统提供的品牌对比分析和问题类型统计能够帮助企业识别产品缺陷和改进方向;对于相关监管部门,系统的安全隐患识别和投诉趋势分析功能可能为政策制定提供一些数据支持。当然,作为一个毕业设计项目,本系统在数据规模和分析深度方面还有待进一步完善,但其设计理念和技术实现方案仍具有一定的参考价值。

基于大数据的汽车各品牌投诉数据分析与可视化系统_-技术选型

大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL

基于大数据的汽车各品牌投诉数据分析与可视化系统_-图片展示

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

基于大数据的汽车各品牌投诉数据分析与可视化系统_-代码展示

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, desc, when, split, regexp_replace
from pyspark.ml.feature import Tokenizer, StopWordsRemover, CountVectorizer
import pandas as pd
import numpy as np
from django.http import JsonResponse
from collections import Counter
import jieba
import re

def brand_complaint_ranking_analysis(request):
    spark = SparkSession.builder.appName("BrandComplaintAnalysis").config("spark.sql.adaptive.enabled", "true").getOrCreate()
    complaint_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/car_complaint").option("dbtable", "complaint_data").option("user", "root").option("password", "password").load()
    brand_complaint_count = complaint_df.groupBy("投诉品牌").agg(count("*").alias("投诉总量")).orderBy(desc("投诉总量"))
    brand_ranking_result = brand_complaint_count.collect()
    total_complaints = complaint_df.count()
    ranking_data = []
    for i, row in enumerate(brand_ranking_result[:20]):
        brand_name = row["投诉品牌"]
        complaint_count = row["投诉总量"]
        percentage = round((complaint_count / total_complaints) * 100, 2)
        ranking_data.append({"rank": i+1, "brand": brand_name, "count": complaint_count, "percentage": percentage})
    brand_problem_df = complaint_df.groupBy("投诉品牌", "问题类型").agg(count("*").alias("问题数量")).orderBy("投诉品牌", desc("问题数量"))
    brand_problems = brand_problem_df.collect()
    brand_problem_dict = {}
    for row in brand_problems:
        brand = row["投诉品牌"]
        if brand not in brand_problem_dict:
            brand_problem_dict[brand] = []
        if len(brand_problem_dict[brand]) < 5:
            brand_problem_dict[brand].append({"problem_type": row["问题类型"], "count": row["问题数量"]})
    response_data = {"ranking": ranking_data, "brand_problems": brand_problem_dict, "total_brands": brand_complaint_count.count()}
    spark.stop()
    return JsonResponse(response_data, safe=False)

def complaint_text_mining_analysis(request):
    spark = SparkSession.builder.appName("ComplaintTextMining").config("spark.sql.adaptive.enabled", "true").getOrCreate()
    complaint_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/car_complaint").option("dbtable", "complaint_data").option("user", "root").option("password", "password").load()
    complaint_texts = complaint_df.select("投诉简述").rdd.map(lambda row: row[0]).collect()
    all_keywords = []
    emotion_scores = []
    for text in complaint_texts:
        if text and len(text.strip()) > 0:
            cleaned_text = re.sub(r'[^\u4e00-\u9fa5]', '', text)
            words = jieba.cut(cleaned_text)
            filtered_words = [word for word in words if len(word) >= 2 and word not in ['汽车', '车辆', '问题', '投诉', '希望', '处理']]
            all_keywords.extend(filtered_words)
            negative_words = ['故障', '损坏', '失效', '异响', '漏油', '死机', '卡顿', '不满意', '质量', '缺陷']
            positive_words = ['满意', '解决', '处理', '良好', '及时']
            negative_count = sum(1 for word in filtered_words if word in negative_words)
            positive_count = sum(1 for word in filtered_words if word in positive_words)
            emotion_score = negative_count - positive_count
            emotion_scores.append(emotion_score)
    keyword_counter = Counter(all_keywords)
    top_keywords = keyword_counter.most_common(50)
    avg_emotion_score = np.mean(emotion_scores) if emotion_scores else 0
    emotion_distribution = {"very_negative": 0, "negative": 0, "neutral": 0, "positive": 0}
    for score in emotion_scores:
        if score >= 3:
            emotion_distribution["very_negative"] += 1
        elif score >= 1:
            emotion_distribution["negative"] += 1
        elif score <= -1:
            emotion_distribution["positive"] += 1
        else:
            emotion_distribution["neutral"] += 1
    safety_keywords = ['制动', '刹车', '安全', '气囊', '转向', '轮胎', '爆胎', '失控', '碰撞', '燃烧']
    safety_complaints = []
    for text in complaint_texts:
        if text and any(keyword in text for keyword in safety_keywords):
            safety_complaints.append(text[:100] + "..." if len(text) > 100 else text)
    response_data = {"keywords": [{"word": word, "count": count} for word, count in top_keywords], "emotion_score": round(avg_emotion_score, 2), "emotion_distribution": emotion_distribution, "safety_complaints": safety_complaints[:10]}
    spark.stop()
    return JsonResponse(response_data, safe=False)

def problem_type_analysis(request):
    spark = SparkSession.builder.appName("ProblemTypeAnalysis").config("spark.sql.adaptive.enabled", "true").getOrCreate()
    complaint_df = spark.read.format("jdbc").option("url", "jdbc.mysql://localhost:3306/car_complaint").option("dbtable", "complaint_data").option("user", "root").option("password", "password").load()
    problem_distribution = complaint_df.groupBy("问题类型").agg(count("*").alias("问题数量")).orderBy(desc("问题数量"))
    problem_result = problem_distribution.collect()
    total_problems = sum([row["问题数量"] for row in problem_result])
    problem_data = []
    for row in problem_result:
        problem_type = row["问题类型"]
        problem_count = row["问题数量"]
        percentage = round((problem_count / total_problems) * 100, 2)
        problem_data.append({"type": problem_type, "count": problem_count, "percentage": percentage})
    complaint_df_with_date = complaint_df.withColumn("投诉年份", col("投诉日期").substr(1, 4)).withColumn("投诉月份", col("投诉日期").substr(6, 2))
    monthly_trends = complaint_df_with_date.groupBy("问题类型", "投诉年份", "投诉月份").agg(count("*").alias("月度投诉量")).orderBy("投诉年份", "投诉月份", "问题类型")
    trend_result = monthly_trends.collect()
    trend_data = {}
    for row in trend_result:
        problem_type = row["问题类型"]
        year_month = f"{row['投诉年份']}-{row['投诉月份']}"
        if problem_type not in trend_data:
            trend_data[problem_type] = []
        trend_data[problem_type].append({"period": year_month, "count": row["月度投诉量"]})
    critical_problems = complaint_df.filter(col("问题类型").isin(["制动系统", "转向系统", "安全气囊", "发动机", "变速箱"])).groupBy("问题类型", "投诉品牌").agg(count("*").alias("严重问题数量")).orderBy("问题类型", desc("严重问题数量"))
    critical_result = critical_problems.collect()
    critical_data = {}
    for row in critical_result:
        problem_type = row["问题类型"]
        if problem_type not in critical_data:
            critical_data[problem_type] = []
        if len(critical_data[problem_type]) < 10:
            critical_data[problem_type].append({"brand": row["投诉品牌"], "count": row["严重问题数量"]})
    response_data = {"problem_distribution": problem_data, "trend_analysis": trend_data, "critical_problems": critical_data, "total_problem_types": len(problem_data)}
    spark.stop()
    return JsonResponse(response_data, safe=False)

基于大数据的汽车各品牌投诉数据分析与可视化系统_-结语

🌟 欢迎:点赞 👍 收藏 ⭐ 评论 📝

👇🏻 精选专栏推荐 👇🏻 欢迎订阅关注!

大数据实战项目

PHP|C#.NET|Golang实战项目

微信小程序|安卓实战项目

Python实战项目

Java实战项目

🍅 ↓↓主页获取源码联系↓↓🍅