基于Hadoop+Spark的优衣库销售数据分析系统

117 阅读8分钟

💖💖作者:计算机编程小央姐 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜

💕💕文末获取源码

@TOC

基于Hadoop+Spark的优衣库销售数据分析系统-系统功能介绍

《基于大数据的优衣库销售数据分析系统》是一个综合运用Hadoop分布式存储和Spark大数据计算框架的零售数据分析平台。系统采用Python作为主要开发语言,结合Django后端框架构建RESTful API接口,前端使用Vue+ElementUI实现现代化的用户交互界面,通过ECharts图表库提供丰富的数据可视化展示。系统基于MySQL数据库存储海量销售数据,利用Spark SQL进行高效的数据查询和聚合计算,结合Pandas和NumPy进行精细化的数据处理和统计分析。核心功能涵盖整体经营业绩分析、产品维度深度剖析、客户价值与行为分析、区域与渠道运营分析以及消费模式关联性探索五大模块,能够从多维度解析优衣库的销售数据,为企业决策提供数据支撑。系统充分发挥大数据技术的优势,支持海量数据的并行处理和实时分析,通过HDFS实现数据的可靠存储,确保在处理大规模销售数据时的稳定性和高效性。

基于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+Spark的优衣库销售数据分析系统-系统背景意义

随着电子商务和新零售模式的快速发展,服装零售行业积累了海量的交易数据、客户行为数据和商品信息数据。优衣库作为全球知名的快时尚品牌,在全球范围内拥有数千家门店和庞大的线上销售渠道,每日产生的销售数据规模巨大且结构复杂。传统的数据分析方法已经难以有效处理如此庞大的数据集,企业迫切需要借助大数据技术来挖掘数据中蕴含的商业价值。Hadoop和Spark等大数据技术的成熟为处理这类大规模数据提供了强有力的技术支撑,能够实现对海量数据的高效存储、快速计算和深度分析。当前零售行业面临着消费者需求多样化、市场竞争激烈、库存管理复杂等挑战,企业需要通过数据驱动的方式来优化产品策略、提升客户体验、改善运营效率。大数据分析技术在零售行业的应用已经成为企业数字化转型的重要组成部分,为企业在激烈的市场竞争中获得优势提供了新的可能性。

本课题通过构建基于大数据技术的销售数据分析系统,能够为优衣库等零售企业提供科学的数据分析工具,帮助企业管理者更好地理解市场趋势和消费者行为。系统的整体经营业绩分析模块能够帮助企业实时掌握各项关键指标的变化情况,为制定经营策略提供量化依据。产品维度分析功能可以识别出畅销产品和滞销产品,指导企业优化产品组合和库存配置,降低库存成本并提高资金周转率。客户价值分析模块通过对不同客户群体消费行为的深入挖掘,能够帮助企业实现精准营销,提高客户满意度和忠诚度。区域与渠道分析功能为企业的市场布局和渠道管理提供决策支持,有助于企业合理配置资源并拓展市场份额。从技术角度来看,本系统展示了大数据技术在实际业务场景中的应用价值,验证了Hadoop+Spark技术栈在处理企业级数据分析任务时的可行性和有效性。作为一个毕业设计项目,它也为计算机专业学生提供了大数据技术学习和实践的平台,有助于培养学生的数据分析思维和大数据开发能力,为将来从事相关工作打下基础。

基于Hadoop+Spark的优衣库销售数据分析系统-系统演示视频

[演示视频]www.bilibili.com/video/BV1fU…)

基于Hadoop+Spark的优衣库销售数据分析系统-系统演示图片

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

基于Hadoop+Spark的优衣库销售数据分析系统-系统部分代码

from pyspark.sql import SparkSession

from pyspark.sql.functions import col, sum as spark_sum, avg, count, desc, asc, when, month, dayofweek, max as spark_max, min as spark_min

from pyspark.sql.types import StructType, StructField, StringType, IntegerType, FloatType, DateType

import pandas as pd

import numpy as np

from django.http import JsonResponse

from django.views import View

import json

spark = SparkSession.builder.appName("UniqloSalesAnalysis").master("local[*]").getOrCreate()

class OverallPerformanceAnalysis(View):

    def post(self, request):

        data = json.loads(request.body)

        start_date = data.get('start_date')

        end_date = data.get('end_date')

        sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/uniqlo").option("dbtable", "sales_data").option("user", "root").option("password", "password").load()

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

        core_metrics = filtered_df.agg(spark_sum("sales_amount").alias("total_sales"), spark_sum("profit").alias("total_profit"), count("order_id").alias("total_orders"), count("customer_id").alias("total_customers")).collect()[0]

        monthly_trends = filtered_df.withColumn("month", month("order_date")).groupBy("month").agg(spark_sum("sales_amount").alias("monthly_sales"), spark_sum("profit").alias("monthly_profit")).orderBy("month")

        weekly_patterns = filtered_df.withColumn("weekday", dayofweek("order_date")).groupBy("weekday").agg(spark_sum("sales_amount").alias("weekly_sales"), count("order_id").alias("weekly_orders")).orderBy("weekday")

        channel_performance = filtered_df.groupBy("channel").agg(spark_sum("sales_amount").alias("channel_sales"), spark_sum("profit").alias("channel_profit"), count("order_id").alias("channel_orders"))

        city_contribution = filtered_df.groupBy("store_city").agg(spark_sum("sales_amount").alias("city_sales"), spark_sum("profit").alias("city_profit")).orderBy(desc("city_sales")).limit(10)

        monthly_data = [{"month": row.month, "sales": row.monthly_sales, "profit": row.monthly_profit} for row in monthly_trends.collect()]

        weekly_data = [{"weekday": row.weekday, "sales": row.weekly_sales, "orders": row.weekly_orders} for row in weekly_patterns.collect()]

        channel_data = [{"channel": row.channel, "sales": row.channel_sales, "profit": row.channel_profit, "orders": row.channel_orders} for row in channel_performance.collect()]

        city_data = [{"city": row.store_city, "sales": row.city_sales, "profit": row.city_profit} for row in city_contribution.collect()]

        result_data = {"core_metrics": {"total_sales": core_metrics.total_sales, "total_profit": core_metrics.total_profit, "total_orders": core_metrics.total_orders, "total_customers": core_metrics.total_customers}, "monthly_trends": monthly_data, "weekly_patterns": weekly_data, "channel_performance": channel_data, "city_contribution": city_data}

        return JsonResponse(result_data)

class ProductDimensionAnalysis(View):

    def post(self, request):

        data = json.loads(request.body)

        analysis_type = data.get('analysis_type', 'sales_ranking')

        sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/uniqlo").option("dbtable", "sales_data").option("user", "root").option("password", "password").load()

        if analysis_type == 'sales_ranking':

            product_sales_ranking = sales_df.groupBy("product_category").agg(spark_sum("sales_amount").alias("category_sales"), spark_sum("product_quantity").alias("category_quantity")).orderBy(desc("category_sales"))

            ranking_data = [{"category": row.product_category, "sales": row.category_sales, "quantity": row.category_quantity} for row in product_sales_ranking.collect()]

            return JsonResponse({"product_sales_ranking": ranking_data})

        elif analysis_type == 'profit_ranking':

            product_profit_ranking = sales_df.groupBy("product_category").agg(spark_sum("profit").alias("category_profit"), avg("profit").alias("avg_profit_rate")).orderBy(desc("category_profit"))

            profit_data = [{"category": row.product_category, "profit": row.category_profit, "avg_profit_rate": row.avg_profit_rate} for row in product_profit_ranking.collect()]

            return JsonResponse({"product_profit_ranking": profit_data})

        elif analysis_type == 'negative_profit':

            negative_profit_products = sales_df.filter(col("profit") < 0).groupBy("product_category", "store_city").agg(spark_sum("profit").alias("loss_amount"), count("order_id").alias("loss_orders")).orderBy("loss_amount")

            loss_data = [{"category": row.product_category, "city": row.store_city, "loss_amount": row.loss_amount, "loss_orders": row.loss_orders} for row in negative_profit_products.collect()]

            return JsonResponse({"negative_profit_analysis": loss_data})

        elif analysis_type == 'seasonal_new_products':

            seasonal_products = sales_df.filter(col("product_category") == "当季新品").withColumn("month", month("order_date")).groupBy("month").agg(spark_sum("sales_amount").alias("seasonal_sales"), spark_sum("profit").alias("seasonal_profit")).orderBy("month")

            seasonal_data = [{"month": row.month, "sales": row.seasonal_sales, "profit": row.seasonal_profit} for row in seasonal_products.collect()]

            seasonal_trend_analysis = pd.DataFrame(seasonal_data)

            if not seasonal_trend_analysis.empty:

                seasonal_trend_analysis['sales_growth_rate'] = seasonal_trend_analysis['sales'].pct_change() * 100

                seasonal_trend_analysis['profit_growth_rate'] = seasonal_trend_analysis['profit'].pct_change() * 100

                seasonal_result = seasonal_trend_analysis.fillna(0).to_dict('records')

            else:

                seasonal_result = []

            return JsonResponse({"seasonal_new_products_performance": seasonal_result})

class CustomerBehaviorAnalysis(View):

    def post(self, request):

        data = json.loads(request.body)

        analysis_dimension = data.get('dimension', 'age_group')

        sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/uniqlo").option("dbtable", "sales_data").option("user", "root").option("password", "password").load()

        if analysis_dimension == 'age_group':

            age_group_analysis = sales_df.groupBy("age_group").agg(spark_sum("sales_amount").alias("group_sales"), count("customer_id").alias("customer_count"), avg("sales_amount").alias("avg_spending"))

            age_product_preference = sales_df.groupBy("age_group", "product_category").agg(spark_sum("product_quantity").alias("purchase_quantity")).orderBy("age_group", desc("purchase_quantity"))

            age_window = Window.partitionBy("age_group").orderBy(desc("purchase_quantity"))

            top_preferences = age_product_preference.withColumn("rank", row_number().over(age_window)).filter(col("rank") <= 3)

            age_data = [{"age_group": row.age_group, "total_sales": row.group_sales, "customer_count": row.customer_count, "avg_spending": row.avg_spending} for row in age_group_analysis.collect()]

            preference_data = [{"age_group": row.age_group, "preferred_category": row.product_category, "quantity": row.purchase_quantity, "rank": row.rank} for row in top_preferences.collect()]

            return JsonResponse({"age_group_analysis": age_data, "age_product_preferences": preference_data})

        elif analysis_dimension == 'gender_group':

            gender_group_analysis = sales_df.groupBy("gender_group").agg(spark_sum("sales_amount").alias("group_sales"), count("customer_id").alias("customer_count"), avg("sales_amount").alias("avg_spending"))

            gender_product_preference = sales_df.groupBy("gender_group", "product_category").agg(spark_sum("product_quantity").alias("purchase_quantity")).orderBy("gender_group", desc("purchase_quantity"))

            gender_data = [{"gender_group": row.gender_group, "total_sales": row.group_sales, "customer_count": row.customer_count, "avg_spending": row.avg_spending} for row in gender_group_analysis.collect()]

            gender_preference_data = [{"gender_group": row.gender_group, "preferred_category": row.product_category, "quantity": row.purchase_quantity} for row in gender_product_preference.collect()]

            return JsonResponse({"gender_group_analysis": gender_data, "gender_product_preferences": gender_preference_data})

        elif analysis_dimension == 'cross_analysis':

            cross_group_analysis = sales_df.groupBy("age_group", "gender_group").agg(spark_sum("sales_amount").alias("segment_sales"), count("customer_id").alias("segment_customers"), avg("sales_amount").alias("segment_avg_spending")).orderBy(desc("segment_sales"))

            customer_value_segments = cross_group_analysis.collect()

            segment_data = []

            for row in customer_value_segments:

                segment_info = {"age_group": row.age_group, "gender_group": row.gender_group, "total_sales": row.segment_sales, "customer_count": row.segment_customers, "avg_spending": row.segment_avg_spending}

                if row.segment_sales > 100000:

                    segment_info["value_level"] = "高价值客群"

                elif row.segment_sales > 50000:

                    segment_info["value_level"] = "中价值客群"

                else:

                    segment_info["value_level"] = "潜力客群"

                segment_data.append(segment_info)

            customer_lifetime_value = pd.DataFrame(segment_data)

            if not customer_lifetime_value.empty:

                customer_lifetime_value['sales_rank'] = customer_lifetime_value['total_sales'].rank(ascending=False)

                customer_lifetime_value['spending_rank'] = customer_lifetime_value['avg_spending'].rank(ascending=False)

                clv_result = customer_lifetime_value.to_dict('records')

            else:

                clv_result = []

            return JsonResponse({"cross_segment_analysis": clv_result})

基于Hadoop+Spark的优衣库销售数据分析系统-结语

💟💟如果大家有任何疑虑,欢迎在下方位置详细交流。