ToB企服应用市场:ToB评测及商务社交产业平台

标题: 某大型商超客户采购数据分析(Spark实战) [打印本页]

作者: 老婆出轨    时间: 2024-11-14 14:47
标题: 某大型商超客户采购数据分析(Spark实战)
写了一些使用sparksql以及spark机器学习来进行数据分析的东西,盼望能给大家做一些参考
项目需求:对某大型商超客户采购数据集进行数据分析
数据来源:https://www.heywhale.com/mw/dataset/656069b19a74cc18269207c4/content


起首使用Spark读入数据集,读入文件前要先将文件转为csv格式
  1. val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
  2. val sc = new SparkContext(sparConf) //建立Spark连接
  3. val spark = SparkSession.builder().getOrCreate()
  4. val df = spark.read.option("header", "true").csv("E:\\ShuJu\\sparkinput\\SuperStore\\SuperStore.csv") //读入文件
复制代码
总体贩卖情况
  1. df.agg(count("Order ID"), sum("Quantity"), sum("Sales"), sum("Profit")).show()
  2. //对数据进行一次总体统计
复制代码


5.1万个订单,贩卖商品总数为19.8万件,贩卖额1261.8万刀,利润146.7万刀

对各个地域市场的贩卖情况进行统计
  1. df.groupBy("Market").agg(count("Order ID"), sum("Quantity"), sum("Sales"), sum("Profit"))
  2.   .show()
  3. //对各个地区市场的销售情况进行统计
复制代码


按照国家进行分组,按照订单个数进行递减排序,获取订单量前10的国家
  1. val TopCountry = df.groupBy("Country").count() //提取出国家-订单个数的表格
  2. TopCountry.sort(TopCountry("count").desc).show(10) //输出订单个数前10的国家
复制代码

从图中可以看出美国对该商超的需求比较大,断层领先的第一名,必要优先对其客户进行关注。

对订单数排名前五的国家进行一次统计
  1. val sumOrder = df.count() //sumOrder为所有订单个数的总和
  2. val sumResult = TopCountry.select("count") //sumResult为订单数前五名国家的订单数总和
  3.   .filter("count > 2000")
  4.   .rdd
  5.   .map(row => row(0).asInstanceOf[Long])
  6.   .reduce((a, b) => a + b)
  7. val headConsumer = 1.0*sumResult/sumOrder
  8. println("订单数前五名的国家在所有订单数中的占比为"+headConsumer*100+"%")
复制代码
前五名为美国、澳大利亚、法国、墨西哥、德国,在全球总订单数中占比为39.7%


对订单商品类别进行检察
  1. df.groupBy("Category").count().show() //查看所有产品类别
  2. df.groupBy("Sub-Category").count().show() //查看所有子类别
复制代码

在该数据集中共有三种产品类别,此中“办公用品”的销量最高,共产生了3万件订单,其次是“科技产品”和“家具”,分别有1万件和9千件

对产品类别下面的子类别进行统计
  1. val SubCategory = df.groupBy("Sub-Category").count() //提取出子类别-订单个数的表格
  2. SubCategory.sort(SubCategory("count").desc).show(10) //查看子类别中,销量最高的前十名
复制代码

从销量榜上来看,粘结剂,储物盒,艺术品,纸张,椅子,手机等具有很高的销量数据。

对每一个子类别的总贩卖额进行统计分析
  1. val SubCategorySale = df.select("Sub-Category", "Sales", "Quantity")
  2.   .withColumn("ASale", df("Sales") * df("Quantity")) //计算每一个类别的总销售额
  3.   .groupBy("Sub-Category") //以类别进行分组
  4.   .sum("ASale") //提取出子类别-销售额的表格
  5. SubCategorySale.sort(SubCategorySale("sum(ASale)").desc) //对每一个子类别的总销售额进行排序
  6.   .withColumnRenamed("sum(ASale)", "AllSale") //重命名列名
  7.   .show(10) //查看子类别中,销量额最高的前十名
复制代码

从图片中可以看出手机、椅子、复印机、书架、储物盒、家用电器、配件、机器、桌子、文件夹的贩卖额从高到低,占有前十名


机器学习部门
这里的数据使用了前一千条来进行测试

对贩卖额进行预测
数据处理
  1.     val cleanedData = df.na.fill(Map(
  2.       "Postal Code" -> "Unknown",
  3.       "Sales" -> "0",
  4.       "Profit" -> "0",
  5.       "Quantity" -> "0",
  6.       "Shipping Cost" -> "0",
  7.       "Discount" -> "0"
  8.     ))
  9.     // 转换为数值类型
  10.     val transformedData = cleanedData
  11.       .withColumn("Sales", col("Sales").cast("Double"))
  12.       .withColumn("Profit", col("Profit").cast("Double"))
  13.       .withColumn("Quantity", col("Quantity").cast("Double"))
  14.       .withColumn("Shipping Cost", col("Shipping Cost").cast("Double"))
  15.       .withColumn("Discount", col("Discount").cast("Double"))
  16.     // 检查转换后的数据类型
  17.     transformedData.printSchema()
  18.     // 删除包含 null 值的行
  19.     val nonNullData = transformedData.na.drop(Seq("Quantity", "Shipping Cost", "Discount"))
复制代码
回归预测
  1.     // 特征选择
  2.     val featureCols = Array("Quantity", "Shipping Cost", "Discount")
  3.     val assembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")
  4.     val featureData = assembler.transform(nonNullData)
  5.     // 划分数据集
  6.     val Array(trainingData, testData) = featureData.randomSplit(Array(0.8, 0.2))
  7.     // 训练模型
  8.     val lr = new LinearRegression()
  9.       .setLabelCol("Sales")
  10.       .setFeaturesCol("features")
  11.     val model = lr.fit(trainingData)
  12.     // 进行预测并查看结果
  13.     val predictions = model.transform(testData)
  14.     predictions.select("features", "Sales", "prediction").show()
  15.     // 评估模型
  16.     val trainingSummary = model.summary
  17.     println(s"RMSE: ${trainingSummary.rootMeanSquaredError}")
  18.     println(s"R2: ${trainingSummary.r2}")
复制代码


  1. sc.stop()//关闭Spark连接
复制代码



手动关键词Spark数据分析,Spark项目,Spark机器学习,sparksql,大数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4