💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目
@TOC
基于大数据的超市销售数据统计分析系统介绍
《基于大数据的超市销售数据统计分析系统》面向大四计算机专业学生,以Hadoop、HDFS、Spark为核心,通过Spark SQL高速计算与Pandas、NumPy本地分析双引擎并行,对超市全量销售数据进行分布式存储与批处理;Django或Spring Boot后端提供商品销售、顾客消费行为、商品关联、促销效果及多时间维度五个分析模块的REST接口,MySQL持久化原始与结果数据;Vue+ElementUI前端调用Echarts实时渲染动态数据大屏,支持按日、周、月钻取展示销售额、销量、客单价、关联规则及促销ROI,并辅以系统公告、轮播图、用户信息、密码修改等管理功能,实现从数据上传、清洗、建模、可视化到权限控制的完整毕设级闭环,帮助学生深入掌握大数据采集、处理、分析与可视化全流程。
基于大数据的超市销售数据统计分析系统演示视频
基于大数据的超市销售数据统计分析系统演示图片
基于大数据的超市销售数据统计分析系统代码展示
# 顾客消费行为分析:RFM模型批处理
def rfm_analysis(spark, orders_df):
rfm = orders_df.groupBy("customer_id").agg(
datediff(current_date(), max("order_date")).alias("recency"),
count("*").alias("frequency"),
sum("amount").alias("monetary")
)
quantiles = rfm.approxQuantile(["recency","frequency","monetary"],[0.33,0.66],0.01)
rfm = rfm.withColumn("R", when(col("recency")<=quantiles[0][0],3).when(col("recency")<=quantiles[0][1],2).otherwise(1)) \
.withColumn("F", when(col("frequency")>=quantiles[1][1],3).when(col("frequency")>=quantiles[1][0],2).otherwise(1)) \
.withColumn("M", when(col("monetary")>=quantiles[2][1],3).when(col("monetary")>=quantiles[2][0],2).otherwise(1))
rfm = rfm.withColumn("rfm_score", concat(col("R"),col("F"),col("M")))
segment_map = {"333":"重要价值","331":"重要发展","313":"重要保持","311":"重要挽留",
"133":"一般价值","131":"一般发展","113":"一般保持","111":"流失风险"}
mapping_expr = create_map([lit(x) for x in chain(*segment_map.items())])
rfm = rfm.withColumn("segment", mapping_expr[col("rfm_score")])
rfm.write.mode("overwrite").jdbc(url, "customer_rfm", properties)
return rfm
# 商品关联分析:Apriori频繁项集
def apriori(spark, basket_df, min_support=0.01):
basket_rdd = basket_df.rdd.map(lambda row: row.items)
model = FPGrowth.train(basket_rdd, minSupport=min_support, numPartitions=4)
freq_items = model.freqItemsets().collect()
rules = []
for itemset in freq_items:
if len(itemset.items) > 1:
for i in range(1, len(itemset.items)):
for ant in combinations(itemset.items, i):
ant = frozenset(ant)
con = frozenset(itemset.items) - ant
support = itemset.freq / basket_rdd.count()
ant_support = next(x.freq for x in model.freqItemsets().collect() if frozenset(x.items)==ant)
confidence = support / (ant_support / basket_rdd.count())
if confidence > 0.3:
rules.append((",".join(ant), ",".join(con), round(confidence,2)))
rules_df = spark.createDataFrame(rules, ["antecedent","consequent","confidence"])
rules_df.write.mode("overwrite").jdbc(url, "association_rules", properties)
# 促销效果分析:增量销售归因
def promotion_effect(spark, sales_df, promo_df):
joined = sales_df.join(promo_df, ["product_id","date"], "left")
joined = joined.withColumn("is_promo_day", when(col("promo_id").isNotNull(),1).otherwise(0))
window = Window.partitionBy("product_id").orderBy("date").rowsBetween(-7,7)
joined = joined.withColumn("baseline", avg(when(col("is_promo_day")==0, col("qty"))).over(window))
joined = joined.withColumn("incremental", col("qty") - col("baseline"))
promo_summary = joined.filter(col("is_promo_day")==1) \
.groupBy("promo_id") \
.agg(sum("incremental").alias("lift_qty"),
sum("qty").alias("total_qty"),
avg("baseline").alias("avg_base"),
(sum("incremental")/sum("baseline")).alias("lift_ratio"))
promo_summary.write.mode("overwrite").jdbc(url, "promotion_effect", properties)
基于大数据的超市销售数据统计分析系统文档展示
💖💖作者:计算机毕业设计小途 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目