某大型商超客戶採購資料分析(Spark實戰)

你这过氧化氢掺水了發表於2024-11-14

寫了一些使用sparksql以及spark機器學習來進行資料分析的東西,希望能給大家做一些參考

專案需求:對某大型商超客戶採購資料集進行資料分析
資料來源:https://www.heywhale.com/mw/dataset/656069b19a74cc18269207c4/content

首先使用Spark讀入資料集,讀入檔案前要先將檔案轉為csv格式

val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf) //建立Spark連線
val spark = SparkSession.builder().getOrCreate()
val df = spark.read.option("header", "true").csv("E:\\ShuJu\\sparkinput\\SuperStore\\SuperStore.csv") //讀入檔案

總體銷售情況

df.agg(count("Order ID"), sum("Quantity"), sum("Sales"), sum("Profit")).show()
//對資料進行一次總體統計

5.1萬個訂單,銷售商品總數為19.8萬件,銷售額1261.8萬刀,利潤146.7萬刀


對各個地區市場的銷售情況進行統計

df.groupBy("Market").agg(count("Order ID"), sum("Quantity"), sum("Sales"), sum("Profit"))
  .show()
//對各個地區市場的銷售情況進行統計


按照國家進行分組,按照訂單個數進行遞減排序,獲取訂單量前10的國家

val TopCountry = df.groupBy("Country").count() //提取出國家-訂單個數的表格
TopCountry.sort(TopCountry("count").desc).show(10) //輸出訂單個數前10的國家

從圖中可以看出美國對該商超的需求比較大,斷層領先的第一名,需要優先對其客戶進行關注。


對訂單數排名前五的國家進行一次統計

val sumOrder = df.count() //sumOrder為所有訂單個數的總和
val sumResult = TopCountry.select("count") //sumResult為訂單數前五名國家的訂單數總和
  .filter("count > 2000")
  .rdd
  .map(row => row(0).asInstanceOf[Long])
  .reduce((a, b) => a + b)
val headConsumer = 1.0*sumResult/sumOrder
println("訂單數前五名的國家在所有訂單數中的佔比為"+headConsumer*100+"%")

前五名為美國、澳大利亞、法國、墨西哥、德國,在全球總訂單數中佔比為39.7%


對訂單商品類別進行檢視

df.groupBy("Category").count().show() //檢視所有產品類別
df.groupBy("Sub-Category").count().show() //檢視所有子類別

在該資料集中共有三種產品類別,其中“辦公用品”的銷量最高,共產生了3萬件訂單,其次是“科技產品”和“傢俱”,分別有1萬件和9千件


對產品類別下面的子類別進行統計

val SubCategory = df.groupBy("Sub-Category").count() //提取出子類別-訂單個數的表格
SubCategory.sort(SubCategory("count").desc).show(10) //檢視子類別中,銷量最高的前十名

從銷量榜上來看,粘結劑,儲物盒,藝術品,紙張,椅子,手機等具有很高的銷量資料。


對每一個子類別的總銷售額進行統計分析

val SubCategorySale = df.select("Sub-Category", "Sales", "Quantity")
  .withColumn("ASale", df("Sales") * df("Quantity")) //計算每一個類別的總銷售額
  .groupBy("Sub-Category") //以類別進行分組
  .sum("ASale") //提取出子類別-銷售額的表格

SubCategorySale.sort(SubCategorySale("sum(ASale)").desc) //對每一個子類別的總銷售額進行排序
  .withColumnRenamed("sum(ASale)", "AllSale") //重新命名列名
  .show(10) //檢視子類別中,銷量額最高的前十名

從圖片中可以看出手機、椅子、影印機、書架、儲物盒、家用電器、配件、機器、桌子、資料夾的銷售額從高到低,佔有前十名



機器學習部分
這裡的資料使用了前一千條來進行測試


對銷售額進行預測
資料處理

    val cleanedData = df.na.fill(Map(
      "Postal Code" -> "Unknown",
      "Sales" -> "0",
      "Profit" -> "0",
      "Quantity" -> "0",
      "Shipping Cost" -> "0",
      "Discount" -> "0"
    ))

    // 轉換為數值型別
    val transformedData = cleanedData
      .withColumn("Sales", col("Sales").cast("Double"))
      .withColumn("Profit", col("Profit").cast("Double"))
      .withColumn("Quantity", col("Quantity").cast("Double"))
      .withColumn("Shipping Cost", col("Shipping Cost").cast("Double"))
      .withColumn("Discount", col("Discount").cast("Double"))
    // 檢查轉換後的資料型別
    transformedData.printSchema()
    // 刪除包含 null 值的行
    val nonNullData = transformedData.na.drop(Seq("Quantity", "Shipping Cost", "Discount"))

迴歸預測

    // 特徵選擇
    val featureCols = Array("Quantity", "Shipping Cost", "Discount")
    val assembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")

    val featureData = assembler.transform(nonNullData)

    // 劃分資料集
    val Array(trainingData, testData) = featureData.randomSplit(Array(0.8, 0.2))

    // 訓練模型
    val lr = new LinearRegression()
      .setLabelCol("Sales")
      .setFeaturesCol("features")

    val model = lr.fit(trainingData)

    // 進行預測並檢視結果
    val predictions = model.transform(testData)
    predictions.select("features", "Sales", "prediction").show()

    // 評估模型
    val trainingSummary = model.summary
    println(s"RMSE: ${trainingSummary.rootMeanSquaredError}")
    println(s"R2: ${trainingSummary.r2}")


sc.stop()//關閉Spark連線




手動關鍵詞

Spark資料分析,Spark專案,Spark機器學習,sparksql,大資料

相關文章