基于Hadoop+Spark的城镇居民食品消费量数据分析与可视化系统-基于海量消费数据的居民饮食结构可视化分析平台

134 阅读10分钟

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

1.开发环境

发语言:python 采用技术:Spark、Hadoop、Django、Vue、Echarts等技术框架 数据库:MySQL 开发环境:PyCharm

2 系统设计

随着我国城镇化进程的快速推进和居民收入水平的持续提升,城镇居民食品消费结构正在发生深刻变化。根据国家统计局发布的《中国统计年鉴》数据显示,2015年至2021年期间,我国城镇居民人均食品烟酒消费支出从2223元增长至3536元,年均增长率达8.1%,其中肉类、水产品、奶制品等高品质食品消费增长尤为显著。与此同时,各地区间食品消费差异明显,东部沿海省份城镇居民年人均食品消费普遍超过4000元,而中西部地区则相对较低,地区差异系数达到0.34。传统的食品消费数据分析方法已难以应对海量、多维度的消费数据处理需求,面对涉及31个省份、多年时间序列、十余种食品类别的庞大数据集,急需运用现代大数据技术进行深度挖掘与分析。当前食品消费数据分析普遍存在处理效率低、可视化程度不足、分析维度单一等问题,缺乏能够全面反映城镇居民食品消费规律和区域特征的综合性分析平台。

构建基于Hadoop+Spark的城镇居民食品消费量数据分析与可视化系统具有重要的理论价值和现实指导意义。从政府决策层面来看,该系统能够为相关部门制定食品安全政策、农产品供应链规划以及区域性营养干预措施提供科学的数据支撑,特别是在应对突发公共卫生事件时,可以快速分析食品消费变化趋势,为应急响应提供决策依据。对于食品产业发展而言,系统通过深度分析不同地区消费偏好和结构变化,能够帮助食品企业精准把握市场需求,优化产品布局和营销策略,推动食品产业转型升级。在学术研究方面,系统运用Hadoop+Spark等前沿大数据技术,结合多维度统计分析方法,为食品消费行为研究提供了新的技术路径和分析工具。同时,系统生成的可视化分析报告有助于提升公众对健康饮食的认知水平,引导居民形成更加科学合理的食品消费习惯。通过构建这一综合性分析平台,不仅能够推动大数据技术在民生领域的深度应用,更能为保障国家食品安全、促进居民营养健康、实现可持续消费发展贡献技术力量。

基于Hadoop+Spark的城镇居民食品消费量数据分析与可视化系统是一套采用Hadoop+Spark大数据技术架构的综合性数据分析平台,系统运用Python作为主要开发语言,结合Django后端框架构建稳定的服务层,前端采用Vue+ElementUI+Echarts技术栈实现交互式数据可视化界面。系统核心功能涵盖五大分析维度:时间维度分析包括年度食品消费总量变化趋势、各类食品消费量年度变化率、食品消费结构时间演变、季节性消费波动分析以及疫情影响专项分析;空间维度分析实现省级食品消费量分布、区域聚类分析、南北方食品消费差异对比、经济发达与欠发达地区消费对比及省会与非省会城市消费分析;食品类别维度深入剖析主食与副食消费比例、动物性与植物性食品消费对比、高价值食品消费趋势、蛋白质来源多样性、食品消费互补性及健康食品消费指数;消费者行为维度通过食品消费多样性指数、消费弹性分析、食品消费现代化指数、高品质食品消费偏好及饮食结构合理性评价全面解读居民消费行为。系统利用HDFS进行海量数据存储,通过Spark SQL和Pandas、NumPy进行高效数据处理与统计分析,最终通过MySQL数据库管理分析结果,为政府部门制定食品安全策略、农产品市场调控及公共营养政策提供科学的数据支撑和决策依据。

3 系统展示

3.1 功能展示视频

3.1 大屏页面

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

3.2 分析页面

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述转存失败,建议直接上传图片文件 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.3 基础页面

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

4 更多推荐

计算机专业毕业设计新风向,2026年大数据 + AI前沿60个毕设选题全解析,涵盖Hadoop、Spark、机器学习、AI等类型 基于spark+hadoop+python的癌症数据分析与可视化系统 spark+hadoop+K-Means算法基于机器学习的医保药品目录分析与可视化系统 基于 Python 和大数据框架的气象站数据深度分析与可视化系统 基于Spark的酒店客户行为分析与个性化推荐系统

5 部分功能代码

# 核心功能1:年度食品消费总量变化趋势分析
def analyze_annual_consumption_trend():
    # 连接Spark会话
    spark = SparkSession.builder.appName("FoodConsumptionAnalysis").getOrCreate()
    
    # 从HDFS读取食品消费数据
    df = spark.read.option("header", "true").csv("hdfs://localhost:9000/data/food_consumption.csv")
    
    # 数据类型转换和清洗
    df = df.withColumn("year", col("year").cast("int")) \
           .withColumn("consumption_per_capita", col("consumption_per_capita").cast("double")) \
           .withColumn("population", col("population").cast("long"))
    
    # 计算全国年度总消费量
    annual_total = df.groupBy("year") \
                     .agg(sum(col("consumption_per_capita") * col("population")).alias("total_consumption"),
                          sum("population").alias("total_population")) \
                     .withColumn("national_per_capita", col("total_consumption") / col("total_population")) \
                     .orderBy("year")
    
    # 计算年度增长率
    window_spec = Window.orderBy("year")
    annual_growth = annual_total.withColumn("prev_consumption", 
                                          lag("total_consumption").over(window_spec)) \
                                .withColumn("growth_rate", 
                                          (col("total_consumption") - col("prev_consumption")) / col("prev_consumption") * 100) \
                                .filter(col("prev_consumption").isNotNull())
    
    # 预测未来趋势(简单线性回归)
    consumption_data = annual_total.select("year", "total_consumption").collect()
    years = [row.year for row in consumption_data]
    consumptions = [row.total_consumption for row in consumption_data]
    
    # 使用numpy计算线性回归系数
    A = np.vstack([years, np.ones(len(years))]).T
    slope, intercept = np.linalg.lstsq(A, consumptions, rcond=None)[0]
    
    # 预测未来3年数据
    future_years = [2022, 2023, 2024]
    predictions = []
    for year in future_years:
        predicted_consumption = slope * year + intercept
        predictions.append({"year": year, "predicted_consumption": predicted_consumption})
    
    # 计算置信区间
    residuals = [consumptions[i] - (slope * years[i] + intercept) for i in range(len(years))]
    std_error = np.std(residuals)
    confidence_interval = 1.96 * std_error
    
    result_data = {
        "annual_trend": [row.asDict() for row in annual_total.collect()],
        "growth_rates": [row.asDict() for row in annual_growth.collect()],
        "predictions": predictions,
        "confidence_interval": confidence_interval,
        "trend_analysis": {
            "slope": slope,
            "avg_growth_rate": sum([row.growth_rate for row in annual_growth.collect()]) / annual_growth.count()
        }
    }
    
    return result_data

# 核心功能2:省级食品消费量分布与区域聚类分析
def analyze_provincial_consumption_clustering():
    spark = SparkSession.builder.appName("ProvincialAnalysis").getOrCreate()
    
    # 读取并处理省级数据
    df = spark.read.option("header", "true").csv("hdfs://localhost:9000/data/provincial_food_data.csv")
    
    # 数据预处理和特征工程
    provinces_df = df.groupBy("province") \
                     .agg(avg("grain_consumption").alias("avg_grain"),
                          avg("meat_consumption").alias("avg_meat"),
                          avg("vegetable_consumption").alias("avg_vegetable"),
                          avg("fruit_consumption").alias("avg_fruit"),
                          avg("dairy_consumption").alias("avg_dairy"),
                          avg("seafood_consumption").alias("avg_seafood")) \
                     .na.fill(0)
    
    # 转换为pandas进行聚类分析
    pandas_df = provinces_df.toPandas()
    feature_columns = ["avg_grain", "avg_meat", "avg_vegetable", "avg_fruit", "avg_dairy", "avg_seafood"]
    
    # 数据标准化
    scaler = StandardScaler()
    scaled_features = scaler.fit_transform(pandas_df[feature_columns])
    
    # K-means聚类分析
    optimal_k = 4  # 基于肘部法则确定的最优聚类数
    kmeans = KMeans(n_clusters=optimal_k, random_state=42, n_init=10)
    cluster_labels = kmeans.fit_predict(scaled_features)
    pandas_df['cluster'] = cluster_labels
    
    # 分析每个聚类的特征
    cluster_analysis = {}
    for i in range(optimal_k):
        cluster_data = pandas_df[pandas_df['cluster'] == i]
        cluster_analysis[f'cluster_{i}'] = {
            'provinces': cluster_data['province'].tolist(),
            'province_count': len(cluster_data),
            'characteristics': {
                'avg_grain': float(cluster_data['avg_grain'].mean()),
                'avg_meat': float(cluster_data['avg_meat'].mean()),
                'avg_vegetable': float(cluster_data['avg_vegetable'].mean()),
                'avg_fruit': float(cluster_data['avg_fruit'].mean()),
                'avg_dairy': float(cluster_data['avg_dairy'].mean()),
                'avg_seafood': float(cluster_data['avg_seafood'].mean())
            },
            'dominant_food_type': max(feature_columns, 
                                    key=lambda x: cluster_data[x].mean())
        }
    
    # 计算省份间消费相似度矩阵
    similarity_matrix = {}
    provinces_list = pandas_df['province'].tolist()
    for i, province1 in enumerate(provinces_list):
        similarity_matrix[province1] = {}
        for j, province2 in enumerate(provinces_list):
            if i != j:
                # 使用余弦相似度计算相似性
                vec1 = scaled_features[i]
                vec2 = scaled_features[j]
                similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
                similarity_matrix[province1][province2] = float(similarity)
    
    # 识别消费模式异常的省份
    cluster_centers = kmeans.cluster_centers_
    distances_to_center = []
    for i, point in enumerate(scaled_features):
        center = cluster_centers[cluster_labels[i]]
        distance = np.linalg.norm(point - center)
        distances_to_center.append({
            'province': provinces_list[i],
            'distance_to_center': float(distance),
            'cluster': int(cluster_labels[i])
        })
    
    # 按距离排序,识别异常值
    distances_to_center.sort(key=lambda x: x['distance_to_center'], reverse=True)
    outliers = distances_to_center[:5]  # 前5个最远离聚类中心的省份
    
    return {
        'cluster_analysis': cluster_analysis,
        'similarity_matrix': similarity_matrix,
        'outlier_provinces': outliers,
        'provincial_rankings': pandas_df.sort_values('avg_meat', ascending=False).to_dict('records')
    }

# 核心功能3:食品消费健康指数构建与评估
def calculate_health_consumption_index():
    spark = SparkSession.builder.appName("HealthIndexAnalysis").getOrCreate()
    
    # 读取食品消费和营养数据
    consumption_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/data/food_consumption_detailed.csv")
    nutrition_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/data/nutrition_standards.csv")
    
    # 数据类型转换
    consumption_df = consumption_df.withColumn("grain", col("grain").cast("double")) \
                                   .withColumn("meat", col("meat").cast("double")) \
                                   .withColumn("vegetable", col("vegetable").cast("double")) \
                                   .withColumn("fruit", col("fruit").cast("double")) \
                                   .withColumn("dairy", col("dairy").cast("double")) \
                                   .withColumn("seafood", col("seafood").cast("double"))
    
    # 定义各类食品的健康权重系数(基于营养学标准)
    health_weights = {
        'grain': 0.15,      # 主食适量即可
        'vegetable': 0.25,  # 蔬菜权重最高
        'fruit': 0.20,      # 水果权重较高
        'meat': 0.10,       # 肉类适量
        'seafood': 0.20,    # 海鲜营养价值高
        'dairy': 0.10       # 奶制品适量
    }
    
    # 定义推荐消费量标准(单位:千克/年/人)
    recommended_consumption = {
        'grain': 130,
        'vegetable': 146,
        'fruit': 73,
        'meat': 27,
        'seafood': 18,
        'dairy': 36
    }
    
    # 计算各类食品的健康得分
    health_scored_df = consumption_df
    for food_type in health_weights.keys():
        recommended = recommended_consumption[food_type]
        weight = health_weights[food_type]
        
        # 计算偏离推荐值的程度,使用高斯函数评分
        health_scored_df = health_scored_df.withColumn(
            f"{food_type}_health_score",
            weight * exp(-0.5 * pow((col(food_type) - recommended) / (recommended * 0.3), 2)) * 100
        )
    
    # 计算综合健康指数
    health_score_columns = [f"{food_type}_health_score" for food_type in health_weights.keys()]
    health_scored_df = health_scored_df.withColumn(
        "total_health_index",
        sum([col(score_col) for score_col in health_score_columns])
    )
    
    # 计算营养均衡性指数
    health_scored_df = health_scored_df.withColumn(
        "balance_index",
        1 / (1 + sqrt(sum([pow(col(f"{food_type}_health_score") - 
                              (100 * health_weights[food_type]), 2) 
                           for food_type in health_weights.keys()])))
    )
    
    # 按地区聚合健康指数
    regional_health = health_scored_df.groupBy("province") \
                                     .agg(avg("total_health_index").alias("avg_health_index"),
                                          avg("balance_index").alias("avg_balance_index"),
                                          count("*").alias("sample_count")) \
                                     .orderBy(desc("avg_health_index"))
    
    # 计算全国健康指数分布统计
    health_stats = health_scored_df.agg(
        avg("total_health_index").alias("national_avg_health"),
        stddev("total_health_index").alias("health_std_dev"),
        min("total_health_index").alias("min_health"),
        max("total_health_index").alias("max_health"),
        expr("percentile_approx(total_health_index, 0.25)").alias("q25_health"),
        expr("percentile_approx(total_health_index, 0.75)").alias("q75_health")
    ).collect()[0]
    
    # 识别健康饮食模式的关键因子
    correlation_analysis = {}
    food_types = list(health_weights.keys())
    pandas_health_df = health_scored_df.select(*food_types, "total_health_index").toPandas()
    
    for food_type in food_types:
        correlation = pandas_health_df[food_type].corr(pandas_health_df['total_health_index'])
        correlation_analysis[food_type] = {
            'correlation_with_health': float(correlation),
            'importance_rank': 0  # 将在后面计算
        }
    
    # 按相关性排序,确定重要性排名
    sorted_correlations = sorted(correlation_analysis.items(), 
                                key=lambda x: abs(x[1]['correlation_with_health']), 
                                reverse=True)
    for rank, (food_type, data) in enumerate(sorted_correlations, 1):
        correlation_analysis[food_type]['importance_rank'] = rank
    
    # 生成健康饮食建议
    recommendations = {}
    regional_data = regional_health.collect()
    for region in regional_data:
        province = region.province
        health_score = region.avg_health_index
        
        if health_score >= 75:
            level = "优秀"
            advice = "继续保持当前健康的饮食结构"
        elif health_score >= 60:
            level = "良好"
            advice = "适当增加蔬菜水果摄入,减少肉类消费"
        elif health_score >= 45:
            level = "一般"
            advice = "需要显著改善饮食结构,增加蔬果和海鲜比例"
        else:
            level = "较差"
            advice = "饮食结构需要全面调整,建议咨询营养专家"
            
        recommendations[province] = {
            'health_level': level,
            'advice': advice,
            'score': float(health_score)
        }
    
    return {
        'regional_health_rankings': [row.asDict() for row in regional_health.collect()],
        'national_health_statistics': health_stats.asDict(),
        'food_health_correlation': correlation_analysis,
        'health_recommendations': recommendations,
        'health_distribution': {
            'excellent': len([r for r in recommendations.values() if r['score'] >= 75]),
            'good': len([r for r in recommendations.values() if 60 <= r['score'] < 75]),
            'average': len([r for r in recommendations.values() if 45 <= r['score'] < 60]),
            'poor': len([r for r in recommendations.values() if r['score'] < 45])
        }
    }

源码项目、定制开发、文档报告、PPT、代码答疑 希望和大家多多交流