毕业在即还没确定毕设方向?这套基于Hadoop的超市销售分析系统技术方案不容错过

61 阅读12分钟

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

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

🛠️ 专业服务 🛠️

  • 需求定制化开发

  • 源码提供与讲解

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

  • 项目答辩演示PPT制作 🌟 欢迎:点赞 👍 收藏 ⭐ 评论 📝

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

大数据实战项目

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

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

Python实战项目

Java实战项目

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

基于大数据的超市销售数据统计分析系统-功能介绍

基于大数据的超市销售数据统计分析系统是一套采用现代大数据技术栈构建的智能商业分析平台,该系统以Hadoop分布式存储框架和Spark大数据处理引擎为核心,实现对超市海量销售数据的高效存储、快速处理和深度分析。系统采用Python作为主要开发语言,后端基于Django框架构建RESTful API服务,前端运用Vue.js结合ElementUI组件库和Echarts可视化图表库,打造响应式的数据分析展示界面。在数据处理层面,系统充分利用HDFS分布式文件系统存储大规模销售数据,通过Spark SQL进行结构化数据查询,结合Pandas和NumPy进行数据清洗和统计计算,实现从原始数据到商业洞察的完整数据流转。系统功能覆盖五大核心分析维度:商品销售分析包含畅销商品TOP20统计、商品大类销售占比分析、单价区间分布和散称商品对比分析;时间维度分析涵盖销售趋势、周内销售模式和月度类别变化;促销效果分析评估促销提升率和敏感度;顾客消费行为分析基于RFM模型进行顾客分层和购物篮分析;商品关联分析通过关联规则挖掘商品间的潜在关系。整个系统通过MySQL数据库管理结构化数据,利用大数据技术的分布式计算优势,能够处理TB级别的销售数据,为超市管理者提供科学的数据驱动决策支持,实现从传统经验管理向智能数据分析的转型升级。

基于大数据的超市销售数据统计分析系统-选题背景意义

选题背景 随着消费市场的持续发展,我国零售业规模不断扩大,2023年超市Top100企业销售规模达到8680亿元,而2023年中国零售行业大数据市场支出规模达到4306亿元人民币,预计2027年将增长至9809亿元人民币,年均增长率为22.9%。传统超市经营过程中会产生海量的销售数据,包括商品信息、顾客消费记录、促销活动效果等多维度数据,这些数据蕴含着巨大的商业价值。然而,现有的超市管理系统大多依赖传统数据库进行简单的统计分析,无法有效处理TB级别的海量数据,更难以从中挖掘出深层次的商业洞察。面对日益激烈的市场竞争和消费者需求的多样化,超市经营者迫切需要利用现代大数据技术来分析销售数据,实现精细化运营管理。数字化时代下,高频次的零售交易会产生海量业务数据,但如何将这些数据付诸业务应用却面临着重大挑战,传统的Excel表格和单机数据库已经无法满足现代超市对数据处理速度和分析深度的要求,构建基于Hadoop和Spark等大数据技术的销售数据统计分析系统成为了行业发展的必然趋势。 选题意义 本课题的实际意义体现在多个层面的价值创造和问题解决上。从技术发展角度来看,该系统将Hadoop分布式存储、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

基于大数据的超市销售数据统计分析系统-视频展示

毕业在即还没确定毕设方向?这套基于Hadoop的超市销售分析系统技术方案不容错过

基于大数据的超市销售数据统计分析系统-图片展示

在这里插入图片描述 登录 在这里插入图片描述 大屏上 在这里插入图片描述 大屏下 在这里插入图片描述 超市销售数据 在这里插入图片描述 促销效果分析 在这里插入图片描述 顾客消费行为分析 在这里插入图片描述 商品关联分析 在这里插入图片描述 商品销售分析 在这里插入图片描述 时间维度销售分析

基于大数据的超市销售数据统计分析系统-代码展示

# 核心功能1:畅销商品TOP20分析

def get_top_selling_products(request):

    """使用Spark SQL分析畅销商品TOP20"""

    from pyspark.sql import SparkSession

    from pyspark.sql.functions import sum, desc, col, row_number

    from pyspark.sql.window import Window

    import pandas as pd

    # 获取查询参数

    start_date = request.GET.get('start_date', '2024-01-01')

    end_date = request.GET.get('end_date', '2024-12-31')

    analysis_type = request.GET.get('type', 'quantity')  # quantity或amount

    # 初始化Spark会话

    spark = SparkSession.builder.appName("TopSellingProducts").getOrCreate()

    # 从HDFS读取销售数据

    sales_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/supermarket/sales_data.csv")

    # 数据类型转换和过滤

    sales_df = sales_df.filter((col("sales_date") >= start_date) & (col("sales_date") <= end_date))

    sales_df = sales_df.withColumn("sales_quantity", col("sales_quantity").cast("integer"))

    sales_df = sales_df.withColumn("sales_amount", col("sales_amount").cast("double"))

    # 根据分析类型选择聚合字段

    if analysis_type == 'quantity':

        agg_col = sum("sales_quantity").alias("total_quantity")

        order_col = desc("total_quantity")

    else:

        agg_col = sum("sales_amount").alias("total_amount") 

        order_col = desc("total_amount")

    # 按商品分组统计

    product_stats = sales_df.groupBy("product_code", "product_name", "category_name").agg(

        agg_col,

        sum("sales_amount").alias("total_revenue"),

        sum("sales_quantity").alias("total_sold")

    ).orderBy(order_col).limit(20)

    # 添加排名窗口函数

    window_spec = Window.orderBy(order_col)

    ranked_products = product_stats.withColumn("rank", row_number().over(window_spec))

    # 转换为Pandas DataFrame进行进一步处理

    pandas_df = ranked_products.toPandas()

    pandas_df['avg_price'] = pandas_df['total_revenue'] / pandas_df['total_sold']

    pandas_df['market_share'] = pandas_df['total_revenue'] / pandas_df['total_revenue'].sum() * 100

    # 计算销售趋势(最近7天vs前7天)

    recent_trend_df = spark.sql("""

        SELECT product_code, 

               SUM(CASE WHEN sales_date >= date_sub(current_date(), 7) THEN sales_quantity ELSE 0 END) as recent_sales,

               SUM(CASE WHEN sales_date >= date_sub(current_date(), 14) AND sales_date < date_sub(current_date(), 7) THEN sales_quantity ELSE 0 END) as prev_sales

        FROM sales_data 

        WHERE product_code IN ({})

        GROUP BY product_code

    """.format(','.join([f"'{code}'" for code in pandas_df['product_code'].tolist()])))

    trend_pandas = recent_trend_df.toPandas()

    trend_pandas['trend_rate'] = ((trend_pandas['recent_sales'] - trend_pandas['prev_sales']) / trend_pandas['prev_sales'] * 100).fillna(0)

    # 合并趋势数据

    result_df = pandas_df.merge(trend_pandas[['product_code', 'trend_rate']], on='product_code', how='left')

    spark.stop()

    return JsonResponse({

        'status': 'success',

        'data': result_df.to_dict('records'),

        'analysis_period': f"{start_date} to {end_date}",

        'total_products_analyzed': len(result_df)

    })

# 核心功能2:顾客RFM价值分析

def analyze_customer_rfm(request):

    """基于RFM模型进行顾客价值分层分析"""

    from pyspark.sql import SparkSession

    from pyspark.sql.functions import max, sum, count, datediff, current_date, col, when

    from sklearn.cluster import KMeans

    import numpy as np

    import pandas as pd

    # 获取分析参数

    analysis_date = request.GET.get('analysis_date', '2024-12-31')

    cluster_num = int(request.GET.get('clusters', 5))

    # 初始化Spark会话

    spark = SparkSession.builder.appName("CustomerRFMAnalysis").getOrCreate()

    # 从HDFS读取顾客销售数据

    customer_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/supermarket/customer_sales.csv")

    # 数据预处理和类型转换

    customer_df = customer_df.withColumn("sales_date", col("sales_date").cast("date"))

    customer_df = customer_df.withColumn("sales_amount", col("sales_amount").cast("double"))

    customer_df = customer_df.filter(col("sales_date") <= analysis_date)

    # 计算RFM指标

    rfm_df = customer_df.groupBy("customer_id").agg(

        datediff(lit(analysis_date), max("sales_date")).alias("recency"),  # R: 最近购买间隔

        count("sales_date").alias("frequency"),  # F: 购买频次

        sum("sales_amount").alias("monetary")  # M: 购买金额

    ).filter(col("monetary") > 0)

    # 计算RFM分位数,用于分层

    recency_quantiles = rfm_df.select("recency").rdd.map(lambda x: x[0]).quantile([0.2, 0.4, 0.6, 0.8])

    frequency_quantiles = rfm_df.select("frequency").rdd.map(lambda x: x[0]).quantile([0.2, 0.4, 0.6, 0.8])

    monetary_quantiles = rfm_df.select("monetary").rdd.map(lambda x: x[0]).quantile([0.2, 0.4, 0.6, 0.8])

    # RFM评分计算(1-5分)

    def get_rfm_score(value, quantiles, reverse=False):

        if reverse:  # R值越小越好

            if value <= quantiles[0]: return 5

            elif value <= quantiles[1]: return 4

            elif value <= quantiles[2]: return 3

            elif value <= quantiles[3]: return 2

            else: return 1

        else:  # F,M值越大越好

            if value <= quantiles[0]: return 1

            elif value <= quantiles[1]: return 2

            elif value <= quantiles[2]: return 3

            elif value <= quantiles[3]: return 4

            else: return 5

    # 应用RFM评分

    rfm_scored = rfm_df.withColumn("r_score", 

                                   when(col("recency") <= recency_quantiles[0], 5)

                                   .when(col("recency") <= recency_quantiles[1], 4)

                                   .when(col("recency") <= recency_quantiles[2], 3)

                                   .when(col("recency") <= recency_quantiles[3], 2)

                                   .otherwise(1))

    rfm_scored = rfm_scored.withColumn("f_score",

                                       when(col("frequency") <= frequency_quantiles[0], 1)

                                       .when(col("frequency") <= frequency_quantiles[1], 2)

                                       .when(col("frequency") <= frequency_quantiles[2], 3)

                                       .when(col("frequency") <= frequency_quantiles[3], 4)

                                       .otherwise(5))

    rfm_scored = rfm_scored.withColumn("m_score",

                                       when(col("monetary") <= monetary_quantiles[0], 1)

                                       .when(col("monetary") <= monetary_quantiles[1], 2)

                                       .when(col("monetary") <= monetary_quantiles[2], 3)

                                       .when(col("monetary") <= monetary_quantiles[3], 4)

                                       .otherwise(5))

    # 计算综合RFM分数

    rfm_final = rfm_scored.withColumn("rfm_score", 

                                      col("r_score") * 100 + col("f_score") * 10 + col("m_score"))

    # 转换为Pandas进行K-means聚类

    pandas_rfm = rfm_final.select("customer_id", "recency", "frequency", "monetary", "rfm_score").toPandas()

    # 数据标准化

    from sklearn.preprocessing import StandardScaler

    scaler = StandardScaler()

    rfm_scaled = scaler.fit_transform(pandas_rfm[['recency', 'frequency', 'monetary']])

    # K-means聚类

    kmeans = KMeans(n_clusters=cluster_num, random_state=42, n_init=10)

    pandas_rfm['cluster'] = kmeans.fit_predict(rfm_scaled)

    # 顾客分层标签定义

    def assign_customer_segment(row):

        if row['rfm_score'] >= 555: return "Champions"

        elif row['rfm_score'] >= 454: return "Loyal Customers"

        elif row['rfm_score'] >= 344: return "Potential Loyalists"

        elif row['rfm_score'] >= 334: return "New Customers"

        elif row['rfm_score'] >= 223: return "Promising"

        elif row['rfm_score'] >= 155: return "Need Attention"

        elif row['rfm_score'] >= 144: return "About to Sleep"

        elif row['rfm_score'] >= 111: return "At Risk"

        else: return "Lost Customers"

    pandas_rfm['segment'] = pandas_rfm.apply(assign_customer_segment, axis=1)

    # 计算各分层统计信息

    segment_stats = pandas_rfm.groupby('segment').agg({

        'customer_id': 'count',

        'recency': 'mean',

        'frequency': 'mean', 

        'monetary': ['mean', 'sum']

    }).round(2)

    spark.stop()

    return JsonResponse({

        'status': 'success',

        'customer_segments': pandas_rfm.to_dict('records'),

        'segment_statistics': segment_stats.to_dict(),

        'total_customers': len(pandas_rfm),

        'analysis_date': analysis_date

    })

# 核心功能3:商品关联规则挖掘分析

def analyze_product_association(request):

    """使用FP-Growth算法挖掘商品关联规则"""

    from pyspark.sql import SparkSession

    from pyspark.ml.fpm import FPGrowth

    from pyspark.sql.functions import collect_list, col, size, explode

    import pandas as pd

    # 获取分析参数

    min_support = float(request.GET.get('min_support', 0.01))

    min_confidence = float(request.GET.get('min_confidence', 0.5))

    start_date = request.GET.get('start_date', '2024-01-01')

    end_date = request.GET.get('end_date', '2024-12-31')

    # 初始化Spark会话

    spark = SparkSession.builder.appName("ProductAssociationAnalysis").getOrCreate()

    # 从HDFS读取交易数据

    transaction_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/supermarket/transactions.csv")

    # 数据过滤和预处理

    filtered_df = transaction_df.filter((col("sales_date") >= start_date) & (col("sales_date") <= end_date))

    filtered_df = filtered_df.filter(col("product_name").isNotNull() & (col("product_name") != ""))

    # 按交易分组,收集每次购买的商品列表

    basket_df = filtered_df.groupBy("customer_id", "sales_date").agg(

        collect_list("product_name").alias("items")

    ).filter(size(col("items")) >= 2)  # 只分析包含2个以上商品的购物篮

    # 商品出现频次统计,过滤低频商品

    item_counts = filtered_df.groupBy("product_name").count().filter(col("count") >= 10)

    frequent_items = [row['product_name'] for row in item_counts.collect()]

    # 过滤购物篮,只保留高频商品

    def filter_basket(items):

        return [item for item in items if item in frequent_items]

    from pyspark.sql.functions import udf

    from pyspark.sql.types import ArrayType, StringType

    filter_basket_udf = udf(filter_basket, ArrayType(StringType()))

    clean_baskets = basket_df.withColumn("items", filter_basket_udf(col("items")))

    clean_baskets = clean_baskets.filter(size(col("items")) >= 2)

    # 应用FP-Growth算法

    fp_growth = FPGrowth(itemsCol="items", minSupport=min_support, minConfidence=min_confidence)

    model = fp_growth.fit(clean_baskets)

    # 获取频繁项集

    frequent_itemsets = model.freqItemsets

    frequent_itemsets_pandas = frequent_itemsets.toPandas()

    frequent_itemsets_pandas['itemset_size'] = frequent_itemsets_pandas['items'].apply(len)

    frequent_itemsets_pandas['support_percent'] = frequent_itemsets_pandas['freq'] / clean_baskets.count() * 100

    # 获取关联规则

    association_rules = model.associationRules

    rules_pandas = association_rules.toPandas()

    # 计算额外的规则评估指标

    def calculate_lift(antecedent, consequent, total_transactions):

        # 前项支持度

        antecedent_support = frequent_itemsets_pandas[

            frequent_itemsets_pandas['items'].apply(lambda x: set(antecedent).issubset(set(x)))

        ]['freq'].iloc[0] / total_transactions

        # 后项支持度  

        consequent_support = frequent_itemsets_pandas[

            frequent_itemsets_pandas['items'].apply(lambda x: set(consequent).issubset(set(x)))

        ]['freq'].iloc[0] / total_transactions

        # 置信度已由模型计算

        confidence = rules_pandas[

            (rules_pandas['antecedent'].apply(lambda x: set(x) == set(antecedent))) &

            (rules_pandas['consequent'].apply(lambda x: set(x) == set(consequent)))

        ]['confidence'].iloc[0]

        # Lift = 置信度 / 后项支持度

        return confidence / consequent_support if consequent_support > 0 else 0

    total_transactions = clean_baskets.count()

    rules_pandas['lift'] = rules_pandas.apply(

        lambda row: calculate_lift(row['antecedent'], row['consequent'], total_transactions), axis=1

    )

    # 规则质量评估

    rules_pandas['rule_strength'] = rules_pandas['confidence'] * rules_pandas['lift']

    rules_pandas['antecedent_str'] = rules_pandas['antecedent'].apply(lambda x: ' + '.join(x))

    rules_pandas['consequent_str'] = rules_pandas['consequent'].apply(lambda x: ' + '.join(x))

    # 按提升度排序,选择top规则

    top_rules = rules_pandas.nlargest(50, 'lift')

    # 生成商品推荐矩阵

    recommendation_matrix = {}

    for _, rule in top_rules.iterrows():

        for antecedent_item in rule['antecedent']:

            if antecedent_item not in recommendation_matrix:

                recommendation_matrix[antecedent_item] = []

            for consequent_item in rule['consequent']:

                recommendation_matrix[antecedent_item].append({

                    'recommended_item': consequent_item,

                    'confidence': round(rule['confidence'], 4),

                    'lift': round(rule['lift'], 4),

                    'rule_strength': round(rule['rule_strength'], 4)

                })

    # 清理重复推荐并排序

    for item in recommendation_matrix:

        recommendation_matrix[item] = sorted(

            recommendation_matrix[item], 

            key=lambda x: x['rule_strength'], 

            reverse=True

        )[:10]  # 每个商品最多推荐10个关联商品

    spark.stop()

    return JsonResponse({

        'status': 'success',

        'frequent_itemsets': frequent_itemsets_pandas.to_dict('records'),

        'association_rules': top_rules.to_dict('records'), 

        'product_recommendations': recommendation_matrix,

        'analysis_summary': {

            'total_transactions': total_transactions,

            'total_frequent_itemsets': len(frequent_itemsets_pandas),

            'total_rules_generated': len(rules_pandas),

            'min_support': min_support,

            'min_confidence': min_confidence,

            'analysis_period': f"{start_date} to {end_date}"

        }

    })

基于大数据的超市销售数据统计分析系统-结语

如果还有任何疑虑,欢迎在下方位置详细交流! 也可以主页交流!

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

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

大数据实战项目

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

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

Python实战项目

Java实战项目

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