1. 程式人生 > 實用技巧 >Python對商店資料進行lstm和xgboost銷售量時間序列建模預測分析

Python對商店資料進行lstm和xgboost銷售量時間序列建模預測分析

原文連結:http://tecdat.cn/?p=17748

在資料科學學習之旅中,我經常處理日常工作中的時間序列資料集,並據此做出預測。

我將通過以下步驟:

探索性資料分析(EDA)

  • 問題定義(我們要解決什麼)
  • 變數識別(我們擁有什麼資料)
  • 單變數分析(瞭解資料集中的每個欄位)
  • 多元分析(瞭解不同領域和目標之間的相互作用)
  • 缺失值處理
  • 離群值處理
  • 變數轉換

預測建模

  • LSTM
  • XGBoost

問題定義

我們在兩個不同的表中提供了商店的以下資訊:

  • 商店:每個商店的ID
  • 銷售:特定日期的營業額(我們的目標變數)
  • 客戶:特定日期的客戶數量
  • StateHoliday:假日
  • SchoolHoliday
    :學校假期
  • StoreType:4個不同的商店:a,b,c,d
  • CompetitionDistance:到最近的競爭對手商店的距離(以米為單位)
  • CompetitionOpenSince[月/年]:提供最近的競爭對手開放的大致年份和月份
  • 促銷:當天促銷與否
  • Promo2:Promo2是某些商店的連續和連續促銷:0 =商店不參與,1 =商店正在參與
  • PromoInterval:描述促銷啟動的連續區間,並指定重新開始促銷的月份。

利用所有這些資訊,我們預測未來6周的銷售量。

  1. # 讓我們匯入EDA所需的庫:
  2. import numpy as np # 線性代數
  3. import pandas as pd # 資料處理,CSV檔案I / O匯入(例如pd.read_csv)
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. from datetime import datetime
  7. plt.style.use("ggplot") # 繪圖
  8. #匯入訓練和測試檔案:
  9. train_df = pd.read_csv("../Data/train.csv")
  10. test_df = pd.read_csv("../Data/test.csv")
  11. #檔案中有多少資料:
  12. print("在訓練集中,我們有", train_df.shape[0], "個觀察值和", train_df.shape[1], 列/變數。")
  13. print("在測試集中,我們有", test_df.shape[0], "個觀察值和", test_df.shape[1], "列/變數。")
  14. print("在商店集中,我們有", store_df.shape[0], "個觀察值和", store_df.shape[1], "列/變數。")

在訓練集中,我們有1017209個觀察值和9列/變數。
在測試集中,我們有41088個觀測值和8列/變數。
在商店集中,我們有1115個觀察值和10列/變數。

首先讓我們清理訓練資料集。

  1. #檢視資料
  2. train_df.head().append(train_df.tail()) #顯示前5行。

  1. train_df.isnull().all()
  2. Out[5]:
  3. Store False
  4. DayOfWeek False
  5. Date False
  6. Sales False
  7. Customers False
  8. Open False
  9. Promo False
  10. StateHoliday False
  11. SchoolHoliday False
  12. dtype: bool

讓我們從第一個變數開始->銷售量

  1. opened_sales = (train_df[(train_df.Open == 1) #如果商店開業
  2. opened_sales.Sales.describe()
  3. Out[6]:
  4. count 422307.000000
  5. mean 6951.782199
  6. std 3101.768685
  7. min 133.000000
  8. 25% 4853.000000
  9. 50% 6367.000000
  10. 75% 8355.000000
  11. max 41551.000000
  12. Name: Sales, dtype: float64
  13. <matplotlib.axes._subplots.AxesSubplot at 0x7f7c38fa6588>

看一下顧客變數

  1. In[9]:
  2. train_df.Customers.describe()
  3. Out[9]:
  4. count 1.017209e+06
  5. mean 6.331459e+02
  6. std 4.644117e+02
  7. min 0.000000e+00
  8. 25% 4.050000e+02
  9. 50% 6.090000e+02
  10. 75% 8.370000e+02
  11. max 7.388000e+03
  12. Name: Customers, dtype: float64
  13. <matplotlib.axes._subplots.AxesSubplot at 0x7f7c3565d240>

train_df[(train_df.Customers > 6000)]

我們看一下假期變數。

train_df.StateHoliday.value_counts()
  1. 0 855087
  2. 0 131072
  3. a 20260
  4. b 6690
  5. c 4100
  6. Name: StateHoliday, dtype: int64

train_df.StateHoliday_cat.count()

1017209

train_df.tail()

  1. train_df.isnull().all() #檢查缺失
  2. Out[18]:
  3. Store False
  4. DayOfWeek False
  5. Date False
  6. Sales False
  7. Customers False
  8. Open False
  9. Promo False
  10. SchoolHoliday False
  11. StateHoliday_cat False
  12. dtype: bool

讓我們繼續進行商店分析

store_df.head().append(store_df.tail())

  1. #缺失資料:
  2. Store 0.000000
  3. StoreType 0.000000
  4. Assortment 0.000000
  5. CompetitionDistance 0.269058
  6. CompetitionOpenSinceMonth 31.748879
  7. CompetitionOpenSinceYear 31.748879
  8. Promo2 0.000000
  9. Promo2SinceWeek 48.789238
  10. Promo2SinceYear 48.789238
  11. PromoInterval 48.789238
  12. dtype: float64
  13. In[21]:

讓我們從缺失的資料開始。第一個是CompetitionDistance

  1. store_df.CompetitionDistance.plot.box()

讓我看看異常值,因此我們可以在均值和中位數之間進行選擇來填充NaN

缺少資料,因為商店沒有競爭。 因此,我建議用零填充缺失的值。
  1. store_df["CompetitionOpenSinceMonth"].fillna(0, inplace = True)

讓我們看一下促銷活動。

store_df.groupby(by = "Promo2", axis = 0).count() 

如果未進行促銷,則應將“促銷”中的NaN替換為零

我們合併商店資料和訓練集資料,然後繼續進行分析。

第一,讓我們按銷售量、客戶等比較商店。

  1. f, ax = plt.subplots(2, 3, figsize = (20,10))
  2. plt.subplots_adjust(hspace = 0.3)
  3. plt.show()

從圖中可以看出,StoreType A擁有最多的商店,銷售和客戶。但是,StoreType D的平均每位客戶平均支出最高。只有17家商店的StoreType B擁有最多的平均顧客。

我們逐年檢視趨勢。

  1. sns.factorplot(data = train_store_df,
  2. # 我們可以看到季節性,但看不到趨勢。 該銷售額每年保持不變
  3. <seaborn.axisgrid.FacetGrid at 0x7f7c350e0c50>


我們看一下相關圖。

  1. "CompetitionOpenSinceMonth", "CompetitionOpenSinceYear", "Promo2
  2. <matplotlib.axes._subplots.AxesSubplot at 0x7f7c33d79c18>

我們可以得到相關性:

  • 客戶與銷售(0.82)
  • 促銷與銷售(0,82)
  • 平均顧客銷量 vs促銷(0,28)
  • 商店類別 vs 平均顧客銷量 (0,44)

我的分析結論:

  • 商店類別 A擁有最多的銷售和顧客。
  • 商店類別 B的每位客戶平均銷售額最低。因此,我認為客戶只為小商品而來。
  • 商店類別 D的購物車數量最多。
  • 促銷僅在工作日進行。
  • 客戶傾向於在星期一(促銷)和星期日(沒有促銷)購買更多商品。
  • 我看不到任何年度趨勢。僅季節性模式。

最受歡迎的見解

1.在python中使用lstm和pytorch進行時間序列預測

2.python中利用長短期記憶模型lstm進行時間序列預測分析

3.使用r語言進行時間序列(arima,指數平滑)分析

4.r語言多元copula-garch-模型時間序列預測

5.r語言copulas和金融時間序列案例

6.使用r語言隨機波動模型sv處理時間序列中的隨機波動

7.r語言時間序列tar閾值自迴歸模型

8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類

9.python3用arima模型進行時間序列預測