计算机毕设展示会上的亮点项目:校园霸凌数据可视化系统的大数据技术让同学羡慕不已

77 阅读12分钟

✍✍计算机毕设指导师**

⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡有什么问题可以在主页上或文末下联系咨询博客~~ ⚡⚡Java、Python、小程序、大数据实战项目集](blog.csdn.net/2301_803956…) ⚡⚡获取源码主页-->:计算机毕设指导师

校园霸凌数据可视化分析系统-简介

基于Hadoop+Django的校园霸凌数据可视化分析系统是一个融合了大数据处理技术与现代Web开发框架的综合性数据分析平台。该系统采用Hadoop分布式存储架构处理大规模校园霸凌相关数据,通过Spark分布式计算引擎进行高效的数据处理和分析,结合Django后端框架提供稳定的业务逻辑支撑,前端采用Vue+ElementUI+Echarts技术栈实现直观的数据可视化展示。系统从霸凌现状基础分析、人口统计学特征关联、霸凌影响因素以及体重状况关系四个核心维度对校园霸凌数据进行深度挖掘,能够统计不同类型霸凌的发生率分布、分析性别年龄与霸凌现象的关联模式、评估霸凌对学生心理健康和学业表现的影响程度,并通过多维度交叉分析识别高风险人群特征。系统运用Pandas和NumPy进行数据预处理,通过Spark SQL实现复杂的关联查询,最终以丰富的图表形式展现分析结果,为教育管理部门制定针对性的校园霸凌防控策略提供科学的数据支撑。

校园霸凌数据可视化分析系统-技术

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

校园霸凌数据可视化分析系统-背景

校园霸凌作为一种普遍存在的校园暴力现象,已经成为影响青少年身心健康发展的重要社会问题。传统的校园霸凌研究多依赖小样本调查和定性分析,缺乏对大规模数据的系统性处理和深度挖掘,难以全面揭示霸凌现象的复杂规律和影响机制。随着教育信息化程度的提升,学校积累了大量与学生行为、心理状态、学业表现相关的数据,这些数据中蕴含着丰富的霸凌现象相关信息,但传统的数据处理方式已无法满足海量数据的分析需求。同时,现有的校园霸凌研究工具大多功能单一,缺乏多维度综合分析能力,无法为教育管理者提供全面的决策支持。大数据技术的快速发展为解决这一问题提供了新的技术路径,通过构建基于Hadoop和Spark的分布式数据处理平台,可以实现对校园霸凌相关数据的高效处理和深度分析,为深入理解校园霸凌现象提供强有力的技术支撑。

构建基于大数据技术的校园霸凌数据可视化分析系统具有重要的实际应用价值和理论探索意义。从教育管理角度来看,该系统能够帮助学校和教育部门更准确地识别校园霸凌的高发群体和高风险区域,通过数据驱动的方式制定更加精准的预防和干预措施,提高校园霸凌防控工作的科学性和有效性。从技术应用角度分析,系统将Hadoop分布式存储、Spark大数据处理与Django Web开发框架有机结合,为大数据技术在教育领域的应用提供了实践案例,验证了大数据技术在处理复杂社会问题中的可行性和优越性。从学术研究层面思考,系统通过多维度数据分析揭示了校园霸凌现象的内在规律和影响因素,为相关领域的理论研究提供了数据支撑和分析工具。虽然作为毕业设计项目在规模和复杂度上存在一定局限性,但该系统的设计思路和技术架构为后续更深入的研究和系统开发奠定了基础,同时也为计算机专业学生提供了将大数据技术应用于解决实际社会问题的学习实践平台。

校园霸凌数据可视化分析系统-视频展示

www.bilibili.com/video/BV1YV…

校园霸凌数据可视化分析系统-图片展示

2 计算机毕业设计选题推荐:基于Hadoop+Django的校园霸凌数据可视化分析系统源码.png

霸凌影响分析.png

霸凌状态分析.png

登录.png

人口统计分析.png

数据大屏上.png

数据大屏下.png

体重与霸凌分析.png

用户.png

校园霸凌数据可视化分析系统-代码展示

from pyspark.sql.functions import col, when, count, avg, sum, desc, asc
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views import View
import json

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

class BullyingStatusAnalysisView(View):
    def post(self, request):
        data = json.loads(request.body)
        df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://hadoop-cluster/campus_bullying_data.csv")
        df.createOrReplaceTempView("bullying_data")
        school_bullying_rate = spark.sql("SELECT COUNT(CASE WHEN school_bullying = 'Yes' THEN 1 END) * 100.0 / COUNT(*) as rate FROM bullying_data").collect()[0]['rate']
        outside_bullying_rate = spark.sql("SELECT COUNT(CASE WHEN outside_bullying = 'Yes' THEN 1 END) * 100.0 / COUNT(*) as rate FROM bullying_data").collect()[0]['rate']
        cyber_bullying_rate = spark.sql("SELECT COUNT(CASE WHEN cyber_bullying = 'Yes' THEN 1 END) * 100.0 / COUNT(*) as rate FROM bullying_data").collect()[0]['rate']
        total_bullying_count = spark.sql("SELECT COUNT(*) as total, COUNT(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1 END) as bullied FROM bullying_data").collect()[0]
        overall_rate = (total_bullying_count['bullied'] * 100.0) / total_bullying_count['total']
        type_comparison = spark.sql("""
            SELECT 
                SUM(CASE WHEN school_bullying = 'Yes' THEN 1 ELSE 0 END) as school_count,
                SUM(CASE WHEN outside_bullying = 'Yes' THEN 1 ELSE 0 END) as outside_count,
                SUM(CASE WHEN cyber_bullying = 'Yes' THEN 1 ELSE 0 END) as cyber_count
            FROM bullying_data
        """).collect()[0]
        frequency_analysis = spark.sql("""
            SELECT 
                CASE 
                    WHEN school_bullying = 'Yes' AND outside_bullying = 'Yes' AND cyber_bullying = 'Yes' THEN 'all_three'
                    WHEN (school_bullying = 'Yes' AND outside_bullying = 'Yes') OR 
                         (school_bullying = 'Yes' AND cyber_bullying = 'Yes') OR 
                         (outside_bullying = 'Yes' AND cyber_bullying = 'Yes') THEN 'two_types'
                    WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 'single_type'
                    ELSE 'none'
                END as frequency_type,
                COUNT(*) as count
            FROM bullying_data
            GROUP BY frequency_type
            ORDER BY count DESC
        """).collect()
        violence_correlation = spark.sql("""
            SELECT 
                bullying_type,
                AVG(CASE WHEN physical_attack = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as attack_rate,
                AVG(CASE WHEN physical_fighting = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as fighting_rate
            FROM (
                SELECT *, 'school' as bullying_type FROM bullying_data WHERE school_bullying = 'Yes'
                UNION ALL
                SELECT *, 'outside' as bullying_type FROM bullying_data WHERE outside_bullying = 'Yes'
                UNION ALL
                SELECT *, 'cyber' as bullying_type FROM bullying_data WHERE cyber_bullying = 'Yes'
            ) 
            GROUP BY bullying_type
        """).collect()
        loneliness_analysis = spark.sql("""
            SELECT 
                bullying_status,
                AVG(CASE WHEN felt_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as loneliness_rate,
                AVG(CASE WHEN most_time_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as chronic_loneliness_rate
            FROM (
                SELECT *, 
                    CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' 
                    THEN 'bullied' ELSE 'not_bullied' END as bullying_status,
                    felt_lonely, most_time_lonely
                FROM bullying_data
            )
            GROUP BY bullying_status
        """).collect()
        result_data = {
            'overall_statistics': {
                'school_bullying_rate': round(school_bullying_rate, 2),
                'outside_bullying_rate': round(outside_bullying_rate, 2),
                'cyber_bullying_rate': round(cyber_bullying_rate, 2),
                'overall_bullying_rate': round(overall_rate, 2)
            },
            'type_distribution': {
                'school_count': type_comparison['school_count'],
                'outside_count': type_comparison['outside_count'],
                'cyber_count': type_comparison['cyber_count']
            },
            'frequency_distribution': [{'type': row['frequency_type'], 'count': row['count']} for row in frequency_analysis],
            'violence_correlation': [{'type': row['bullying_type'], 'attack_rate': round(row['attack_rate'], 2), 'fighting_rate': round(row['fighting_rate'], 2)} for row in violence_correlation],
            'psychological_impact': [{'status': row['bullying_status'], 'loneliness_rate': round(row['loneliness_rate'], 2), 'chronic_loneliness_rate': round(row['chronic_loneliness_rate'], 2)} for row in loneliness_analysis]
        }
        return JsonResponse(result_data)

class DemographicAnalysisView(View):
    def post(self, request):
        data = json.loads(request.body)
        df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://hadoop-cluster/campus_bullying_data.csv")
        df.createOrReplaceTempView("demographic_data")
        gender_bullying_analysis = spark.sql("""
            SELECT 
                gender,
                COUNT(*) as total_students,
                SUM(CASE WHEN school_bullying = 'Yes' THEN 1 ELSE 0 END) as school_bullied,
                SUM(CASE WHEN outside_bullying = 'Yes' THEN 1 ELSE 0 END) as outside_bullied,
                SUM(CASE WHEN cyber_bullying = 'Yes' THEN 1 ELSE 0 END) as cyber_bullied,
                SUM(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1 ELSE 0 END) as any_bullied
            FROM demographic_data
            GROUP BY gender
        """).collect()
        age_bullying_analysis = spark.sql("""
            SELECT 
                CASE 
                    WHEN age <= 12 THEN '12_and_under'
                    WHEN age BETWEEN 13 AND 15 THEN '13_to_15'
                    WHEN age BETWEEN 16 AND 18 THEN '16_to_18'
                    ELSE 'over_18'
                END as age_group,
                COUNT(*) as total_students,
                AVG(CASE WHEN school_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as school_bullying_rate,
                AVG(CASE WHEN outside_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as outside_bullying_rate,
                AVG(CASE WHEN cyber_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as cyber_bullying_rate
            FROM demographic_data
            GROUP BY age_group
            ORDER BY age_group
        """).collect()
        age_gender_cross_analysis = spark.sql("""
            SELECT 
                CASE 
                    WHEN age <= 12 THEN '12_and_under'
                    WHEN age BETWEEN 13 AND 15 THEN '13_to_15'
                    WHEN age BETWEEN 16 AND 18 THEN '16_to_18'
                    ELSE 'over_18'
                END as age_group,
                gender,
                COUNT(*) as count,
                AVG(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as bullying_rate
            FROM demographic_data
            GROUP BY age_group, gender
            ORDER BY age_group, gender
        """).collect()
        gender_psychological_impact = spark.sql("""
            SELECT 
                gender,
                AVG(CASE WHEN felt_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as loneliness_rate,
                AVG(CASE WHEN most_time_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as chronic_loneliness_rate,
                COUNT(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1 END) as bullied_count
            FROM demographic_data
            GROUP BY gender
        """).collect()
        high_risk_clustering = spark.sql("""
            SELECT 
                gender,
                CASE 
                    WHEN age <= 12 THEN '12_and_under'
                    WHEN age BETWEEN 13 AND 15 THEN '13_to_15'
                    WHEN age BETWEEN 16 AND 18 THEN '16_to_18'
                    ELSE 'over_18'
                END as age_group,
                COUNT(*) as group_size,
                SUM(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1 ELSE 0 END) as bullied_count,
                AVG(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as risk_percentage
            FROM demographic_data
            GROUP BY gender, age_group
            HAVING COUNT(*) >= 10
            ORDER BY risk_percentage DESC
            LIMIT 5
        """).collect()
        processed_gender_data = []
        for row in gender_bullying_analysis:
            total = row['total_students']
            processed_gender_data.append({
                'gender': row['gender'],
                'total_students': total,
                'school_bullying_rate': round((row['school_bullied'] * 100.0) / total, 2),
                'outside_bullying_rate': round((row['outside_bullied'] * 100.0) / total, 2),
                'cyber_bullying_rate': round((row['cyber_bullied'] * 100.0) / total, 2),
                'overall_bullying_rate': round((row['any_bullied'] * 100.0) / total, 2)
            })
        result_data = {
            'gender_analysis': processed_gender_data,
            'age_analysis': [{'age_group': row['age_group'], 'total_students': row['total_students'], 'school_bullying_rate': round(row['school_bullying_rate'], 2), 'outside_bullying_rate': round(row['outside_bullying_rate'], 2), 'cyber_bullying_rate': round(row['cyber_bullying_rate'], 2)} for row in age_bullying_analysis],
            'age_gender_cross': [{'age_group': row['age_group'], 'gender': row['gender'], 'count': row['count'], 'bullying_rate': round(row['bullying_rate'], 2)} for row in age_gender_cross_analysis],
            'psychological_impact_by_gender': [{'gender': row['gender'], 'loneliness_rate': round(row['loneliness_rate'], 2), 'chronic_loneliness_rate': round(row['chronic_loneliness_rate'], 2), 'bullied_count': row['bullied_count']} for row in gender_psychological_impact],
            'high_risk_groups': [{'gender': row['gender'], 'age_group': row['age_group'], 'group_size': row['group_size'], 'bullied_count': row['bullied_count'], 'risk_percentage': round(row['risk_percentage'], 2)} for row in high_risk_clustering]
        }
        return JsonResponse(result_data)

class WeightBullyingAnalysisView(View):
    def post(self, request):
        data = json.loads(request.body)
        df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://hadoop-cluster/campus_bullying_data.csv")
        df.createOrReplaceTempView("weight_bullying_data")
        weight_bullying_risk = spark.sql("""
            SELECT 
                weight_status,
                COUNT(*) as total_count,
                SUM(CASE WHEN school_bullying = 'Yes' THEN 1 ELSE 0 END) as school_bullying_count,
                SUM(CASE WHEN outside_bullying = 'Yes' THEN 1 ELSE 0 END) as outside_bullying_count,
                SUM(CASE WHEN cyber_bullying = 'Yes' THEN 1 ELSE 0 END) as cyber_bullying_count,
                AVG(CASE WHEN school_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as school_bullying_rate,
                AVG(CASE WHEN outside_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as outside_bullying_rate,
                AVG(CASE WHEN cyber_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as cyber_bullying_rate
            FROM (
                SELECT *,
                    CASE 
                        WHEN underweight = 'Yes' THEN 'underweight'
                        WHEN overweight = 'Yes' THEN 'overweight'
                        WHEN obese = 'Yes' THEN 'obese'
                        ELSE 'normal'
                    END as weight_status
                FROM weight_bullying_data
            )
            GROUP BY weight_status
        """).collect()
        weight_bullying_type_correlation = spark.sql("""
            SELECT 
                weight_status,
                bullying_type,
                COUNT(*) as case_count,
                AVG(CASE WHEN bullying_occurred = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as occurrence_rate
            FROM (
                SELECT *, 'school' as bullying_type, school_bullying as bullying_occurred FROM (
                    SELECT *,
                        CASE 
                            WHEN underweight = 'Yes' THEN 'underweight'
                            WHEN overweight = 'Yes' THEN 'overweight'
                            WHEN obese = 'Yes' THEN 'obese'
                            ELSE 'normal'
                        END as weight_status
                    FROM weight_bullying_data
                )
                UNION ALL
                SELECT *, 'outside' as bullying_type, outside_bullying as bullying_occurred FROM (
                    SELECT *,
                        CASE 
                            WHEN underweight = 'Yes' THEN 'underweight'
                            WHEN overweight = 'Yes' THEN 'overweight'
                            WHEN obese = 'Yes' THEN 'obese'
                            ELSE 'normal'
                        END as weight_status
                    FROM weight_bullying_data
                )
                UNION ALL
                SELECT *, 'cyber' as bullying_type, cyber_bullying as bullying_occurred FROM (
                    SELECT *,
                        CASE 
                            WHEN underweight = 'Yes' THEN 'underweight'
                            WHEN overweight = 'Yes' THEN 'overweight'
                            WHEN obese = 'Yes' THEN 'obese'
                            ELSE 'normal'
                        END as weight_status
                    FROM weight_bullying_data
                )
            )
            GROUP BY weight_status, bullying_type
            ORDER BY weight_status, bullying_type
        """).collect()
        weight_psychological_burden = spark.sql("""
            SELECT 
                weight_status,
                COUNT(*) as total_students,
                AVG(CASE WHEN felt_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as loneliness_rate,
                AVG(CASE WHEN most_time_lonely = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as chronic_loneliness_rate,
                AVG(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as overall_bullying_rate,
                SUM(CASE WHEN (felt_lonely = 'Yes' OR most_time_lonely = 'Yes') AND (school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes') THEN 1 ELSE 0 END) as dual_burden_count
            FROM (
                SELECT *,
                    CASE 
                        WHEN underweight = 'Yes' THEN 'underweight'
                        WHEN overweight = 'Yes' THEN 'overweight'
                        WHEN obese = 'Yes' THEN 'obese'
                        ELSE 'normal'
                    END as weight_status
                FROM weight_bullying_data
            )
            GROUP BY weight_status
        """).collect()
        weight_social_support = spark.sql("""
            SELECT 
                weight_status,
                AVG(CASE WHEN close_friends >= 3 THEN 1.0 ELSE 0.0 END) * 100 as strong_friendship_rate,
                AVG(CASE WHEN student_kindness = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as peer_support_rate,
                AVG(close_friends) as avg_close_friends,
                COUNT(*) as group_size
            FROM (
                SELECT *,
                    CASE 
                        WHEN underweight = 'Yes' THEN 'underweight'
                        WHEN overweight = 'Yes' THEN 'overweight'
                        WHEN obese = 'Yes' THEN 'obese'
                        ELSE 'normal'
                    END as weight_status
                FROM weight_bullying_data
            )
            GROUP BY weight_status
        """).collect()
        weight_coping_strategies = spark.sql("""
            SELECT 
                weight_status,
                AVG(CASE WHEN physical_fighting = 'Yes' THEN 1.0 ELSE 0.0 END) * 100 as fighting_back_rate,
                AVG(CASE WHEN missed_school_days >= 3 THEN 1.0 ELSE 0.0 END) * 100 as frequent_absence_rate,
                AVG(missed_school_days) as avg_missed_days,
                COUNT(CASE WHEN school_bullying = 'Yes' OR outside_bullying = 'Yes' OR cyber_bullying = 'Yes' THEN 1 END) as bullied_in_group
            FROM (
                SELECT *,
                    CASE 
                        WHEN underweight = 'Yes' THEN 'underweight'
                        WHEN overweight = 'Yes' THEN 'overweight'
                        WHEN obese = 'Yes' THEN 'obese'
                        ELSE 'normal'
                    END as weight_status
                FROM weight_bullying_data
            )
            GROUP BY weight_status
        """).collect()
        result_data = {
            'weight_bullying_risk': [{'weight_status': row['weight_status'], 'total_count': row['total_count'], 'school_bullying_rate': round(row['school_bullying_rate'], 2), 'outside_bullying_rate': round(row['outside_bullying_rate'], 2), 'cyber_bullying_rate': round(row['cyber_bullying_rate'], 2)} for row in weight_bullying_risk],
            'weight_type_correlation': [{'weight_status': row['weight_status'], 'bullying_type': row['bullying_type'], 'case_count': row['case_count'], 'occurrence_rate': round(row['occurrence_rate'], 2)} for row in weight_bullying_type_correlation],
            'psychological_burden': [{'weight_status': row['weight_status'], 'total_students': row['total_students'], 'loneliness_rate': round(row['loneliness_rate'], 2), 'chronic_loneliness_rate': round(row['chronic_loneliness_rate'], 2), 'overall_bullying_rate': round(row['overall_bullying_rate'], 2), 'dual_burden_count': row['dual_burden_count']} for row in weight_psychological_burden],
            'social_support_analysis': [{'weight_status': row['weight_status'], 'strong_friendship_rate': round(row['strong_friendship_rate'], 2), 'peer_support_rate': round(row['peer_support_rate'], 2), 'avg_close_friends': round(row['avg_close_friends'], 2), 'group_size': row['group_size']} for row in weight_social_support],
            'coping_strategies': [{'weight_status': row['weight_status'], 'fighting_back_rate': round(row['fighting_back_rate'], 2), 'frequent_absence_rate': round(row['frequent_absence_rate'], 2), 'avg_missed_days': round(row['avg_missed_days'], 2), 'bullied_in_group': row['bullied_in_group']} for row in weight_coping_strategies]
        }
        return JsonResponse(result_data)

校园霸凌数据可视化分析系统-结语

计算机毕业设计选题推荐 基于Hadoop+Django的校园霸凌数据可视化分析系统源码 毕业设计/选题推荐/深度学习/数据分析/机器学习/数据挖掘/随机森林

如果遇到具体的技术问题或其他需求,你也可以问我,我会尽力帮你分析和解决问题所在,支持我记得一键三连,再点个关注,学习不迷路!

⚡⚡获取源码主页-->:计算机毕设指导师 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡如果遇到具体的技术问题或其他需求,你也可以问我,我会尽力帮你分析和解决问题所在,支持我记得一键三连,再点个关注,学习不迷路!~~