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

60 阅读6分钟

前言

💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜

一.开发工具简介

大数据框架: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

二.系统内容简介

《旅游上榜景点数据可视化分析系统》是一套基于大数据技术的智能旅游数据分析平台,采用Hadoop+Spark分布式计算框架为核心,运用Python语言开发,通过Django后端框架与Vue+ElementUI+Echarts前端技术构建完整的数据处理与可视化展示体系。系统整合MySQL数据库存储旅游景点相关数据,利用HDFS分布式文件系统管理海量旅游数据,通过Spark SQL进行高效数据查询与分析,结合Pandas和NumPy进行数据处理与统计计算。系统提供城市热度分析、景点特征分析、价格关联分析、专题决策分析以及可视化大屏五大核心功能模块,能够深度挖掘旅游景点数据价值,为旅游行业从业者、政府部门以及游客提供科学的数据分析支持和直观的可视化展示,帮助用户更好地理解旅游市场趋势、景点竞争力分析以及旅游消费特征,从而做出更加精准的决策判断。

三.系统功能演示

旅游上榜景点数据可视化分析系统

四.系统界面展示

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

五.系统源码展示


from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, sum, count, desc, asc, when, lit, round
from pyspark.sql.types import StructType, StructField, StringType, FloatType, IntegerType
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

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

def city_hotness_analysis(request):
    tourism_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "scenic_spots").option("user", "root").option("password", "password").load()
    city_stats = tourism_df.groupBy("city").agg(count("spot_id").alias("spot_count"), avg("rating").alias("avg_rating"), sum("visitor_count").alias("total_visitors"), avg("price").alias("avg_price"))
    city_hotness = city_stats.withColumn("hotness_score", round((col("spot_count") * 0.3 + col("avg_rating") * 0.4 + col("total_visitors") / 10000 * 0.3), 2))
    city_hotness = city_hotness.withColumn("hotness_level", when(col("hotness_score") >= 80, "热门").when(col("hotness_score") >= 60, "较热").when(col("hotness_score") >= 40, "一般").otherwise("冷门"))
    sorted_cities = city_hotness.orderBy(desc("hotness_score"))
    city_growth_data = tourism_df.groupBy("city", "year").agg(count("spot_id").alias("yearly_spots"), sum("visitor_count").alias("yearly_visitors"))
    city_growth_trend = city_growth_data.groupBy("city").agg(avg("yearly_visitors").alias("avg_yearly_visitors"), (max("yearly_visitors") - min("yearly_visitors")).alias("visitor_growth"))
    final_analysis = sorted_cities.join(city_growth_trend, "city", "left")
    result_data = final_analysis.select("city", "spot_count", "avg_rating", "total_visitors", "avg_price", "hotness_score", "hotness_level", "visitor_growth").collect()
    analysis_results = []
    for row in result_data:
        city_info = {"city": row["city"], "spot_count": row["spot_count"], "avg_rating": round(row["avg_rating"], 1), "total_visitors": row["total_visitors"], "avg_price": round(row["avg_price"], 0), "hotness_score": row["hotness_score"], "hotness_level": row["hotness_level"], "visitor_growth": row["visitor_growth"] if row["visitor_growth"] else 0}
        analysis_results.append(city_info)
    pandas_df = pd.DataFrame(analysis_results)
    correlation_matrix = pandas_df[["spot_count", "avg_rating", "total_visitors", "avg_price"]].corr()
    return JsonResponse({"status": "success", "city_analysis": analysis_results, "correlation_data": correlation_matrix.to_dict()})

def scenic_spot_feature_analysis(request):
    spots_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "scenic_spots").option("user", "root").option("password", "password").load()
    feature_analysis = spots_df.groupBy("category").agg(count("spot_id").alias("category_count"), avg("rating").alias("avg_category_rating"), avg("price").alias("avg_category_price"), sum("visitor_count").alias("category_visitors"))
    price_range_analysis = spots_df.withColumn("price_range", when(col("price") <= 50, "低价位").when(col("price") <= 150, "中价位").when(col("price") <= 300, "高价位").otherwise("豪华级"))
    price_feature_stats = price_range_analysis.groupBy("price_range").agg(count("spot_id").alias("range_count"), avg("rating").alias("range_rating"), avg("visitor_count").alias("range_visitors"))
    rating_distribution = spots_df.withColumn("rating_level", when(col("rating") >= 4.5, "优秀").when(col("rating") >= 4.0, "良好").when(col("rating") >= 3.5, "一般").otherwise("较差"))
    rating_stats = rating_distribution.groupBy("rating_level").agg(count("spot_id").alias("level_count"), avg("price").alias("level_avg_price"))
    seasonal_analysis = spots_df.groupBy("best_season").agg(count("spot_id").alias("season_spots"), avg("rating").alias("season_rating"), avg("price").alias("season_price"))
    facility_scores = spots_df.select("spot_id", "transportation_score", "accommodation_score", "dining_score", "shopping_score")
    facility_avg = facility_scores.agg(avg("transportation_score").alias("avg_transport"), avg("accommodation_score").alias("avg_accommodation"), avg("dining_score").alias("avg_dining"), avg("shopping_score").alias("avg_shopping"))
    category_results = feature_analysis.collect()
    price_results = price_feature_stats.collect()
    rating_results = rating_stats.collect()
    season_results = seasonal_analysis.collect()
    facility_result = facility_avg.collect()[0]
    comprehensive_features = {"category_analysis": [{"category": row["category"], "count": row["category_count"], "avg_rating": round(row["avg_category_rating"], 1), "avg_price": round(row["avg_category_price"], 0), "total_visitors": row["category_visitors"]} for row in category_results], "price_analysis": [{"price_range": row["price_range"], "count": row["range_count"], "avg_rating": round(row["range_rating"], 1), "avg_visitors": round(row["range_visitors"], 0)} for row in price_results], "rating_analysis": [{"rating_level": row["rating_level"], "count": row["level_count"], "avg_price": round(row["level_avg_price"], 0)} for row in rating_results], "seasonal_analysis": [{"season": row["best_season"], "spot_count": row["season_spots"], "avg_rating": round(row["season_rating"], 1), "avg_price": round(row["season_price"], 0)} for row in season_results], "facility_scores": {"transportation": round(facility_result["avg_transport"], 1), "accommodation": round(facility_result["avg_accommodation"], 1), "dining": round(facility_result["avg_dining"], 1), "shopping": round(facility_result["avg_shopping"], 1)}}
    return JsonResponse({"status": "success", "feature_analysis": comprehensive_features})

def price_correlation_analysis(request):
    price_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "scenic_spots").option("user", "root").option("password", "password").load()
    price_rating_correlation = price_df.select("price", "rating", "visitor_count", "city", "category")
    price_segments = price_rating_correlation.withColumn("price_segment", when(col("price") <= 80, "经济型").when(col("price") <= 200, "标准型").when(col("price") <= 400, "高端型").otherwise("奢华型"))
    segment_performance = price_segments.groupBy("price_segment").agg(count("*").alias("segment_count"), avg("rating").alias("segment_rating"), avg("visitor_count").alias("segment_visitors"), avg("price").alias("segment_avg_price"))
    city_price_analysis = price_segments.groupBy("city", "price_segment").agg(count("*").alias("city_segment_count"), avg("rating").alias("city_segment_rating"))
    category_price_analysis = price_segments.groupBy("category", "price_segment").agg(count("*").alias("category_segment_count"), avg("rating").alias("category_segment_rating"))
    visitor_price_correlation = price_df.select("price", "visitor_count").filter(col("visitor_count") > 0)
    price_elasticity = visitor_price_correlation.withColumn("price_tier", when(col("price") <= 100, 1).when(col("price") <= 200, 2).when(col("price") <= 300, 3).otherwise(4))
    elasticity_analysis = price_elasticity.groupBy("price_tier").agg(avg("visitor_count").alias("avg_visitors_tier"), avg("price").alias("avg_price_tier"))
    price_competition = price_df.groupBy("city", "category").agg(avg("price").alias("category_city_price"), count("*").alias("competition_level"))
    competitive_analysis = price_competition.withColumn("competition_intensity", when(col("competition_level") >= 20, "激烈").when(col("competition_level") >= 10, "中等").otherwise("较低"))
    segment_results = segment_performance.collect()
    city_price_results = city_price_analysis.collect()
    category_price_results = category_price_analysis.collect()
    elasticity_results = elasticity_analysis.collect()
    competition_results = competitive_analysis.collect()
    pandas_price_data = price_rating_correlation.toPandas()
    correlation_coefficient = pandas_price_data["price"].corr(pandas_price_data["rating"])
    visitor_price_corr = pandas_price_data["price"].corr(pandas_price_data["visitor_count"])
    price_analysis_results = {"segment_performance": [{"segment": row["price_segment"], "count": row["segment_count"], "avg_rating": round(row["segment_rating"], 1), "avg_visitors": round(row["segment_visitors"], 0), "avg_price": round(row["segment_avg_price"], 0)} for row in segment_results], "city_price_distribution": [{"city": row["city"], "price_segment": row["price_segment"], "count": row["city_segment_count"], "avg_rating": round(row["city_segment_rating"], 1)} for row in city_price_results], "category_price_analysis": [{"category": row["category"], "price_segment": row["price_segment"], "count": row["category_segment_count"], "avg_rating": round(row["category_segment_rating"], 1)} for row in category_price_results], "price_elasticity": [{"price_tier": row["price_tier"], "avg_visitors": round(row["avg_visitors_tier"], 0), "avg_price": round(row["avg_price_tier"], 0)} for row in elasticity_results], "market_competition": [{"city": row["city"], "category": row["category"], "avg_price": round(row["category_city_price"], 0), "competition_level": row["competition_level"], "competition_intensity": row["competition_intensity"]} for row in competition_results], "correlation_metrics": {"price_rating_correlation": round(correlation_coefficient, 3), "price_visitor_correlation": round(visitor_price_corr, 3)}}
    return JsonResponse({"status": "success", "price_correlation_analysis": price_analysis_results})

六.系统文档展示

在这里插入图片描述

结束

💕💕文末获取源码联系 计算机程序员小杨