原文鏈接: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周的銷售量。
-
# 讓我們導入EDA所需的庫:
-
-
import numpy as np # 線性代數
-
import pandas as pd # 數據處理,CSV文件I / O導入(例如pd.read_csv)
-
import matplotlib.pyplot as plt
-
import seaborn as sns
-
from datetime import datetime
-
plt.style.use("ggplot") # 繪圖
-
-
-
#導入訓練和測試文件:
-
train_df = pd.read_csv("../Data/train.csv")
-
test_df = pd.read_csv("../Data/test.csv")
-
-
-
#文件中有多少數據:
-
print("在訓練集中,我們有", train_df.shape[0], "個觀察值和", train_df.shape[1], 列/變量。")
-
print("在測試集中,我們有", test_df.shape[0], "個觀察值和", test_df.shape[1], "列/變量。")
-
print("在商店集中,我們有", store_df.shape[0], "個觀察值和", store_df.shape[1], "列/變量。")
-
在訓練集中,我們有1017209個觀察值和9列/變量。
在測試集中,我們有41088個觀測值和8列/變量。
在商店集中,我們有1115個觀察值和10列/變量。
首先讓我們清理 訓練數據集。
-
#查看數據
-
train_df.head().append(train_df.tail()) #顯示前5行。

-
train_df.isnull().all()
-
Out[5]:
-
-
Store False
-
DayOfWeek False
-
Date False
-
Sales False
-
Customers False
-
Open False
-
Promo False
-
StateHoliday False
-
SchoolHoliday False
-
dtype: bool
讓我們從第一個變量開始-> 銷售量
-
-
-
opened_sales = (train_df[(train_df.Open == 1) #如果商店開業
-
opened_sales.Sales.describe()
-
Out[6]:
-
-
count 422307.000000
-
mean 6951.782199
-
std 3101.768685
-
min 133.000000
-
25% 4853.000000
-
50% 6367.000000
-
75% 8355.000000
-
max 41551.000000
-
Name: Sales, dtype: float64
-
-
-
<matplotlib.axes._subplots.AxesSubplot at 0x7f7c38fa6588>

看一下顧客變量
-
In [9]:
-
-
train_df.Customers.describe()
-
Out[9]:
-
-
count 1.017209e+06
-
mean 6.331459e+02
-
std 4.644117e+02
-
min 0.000000e+00
-
25% 4.050000e+02
-
50% 6.090000e+02
-
75% 8.370000e+02
-
max 7.388000e+03
-
Name: Customers, dtype: float64
-
-
<matplotlib.axes._subplots.AxesSubplot at 0x7f7c3565d240>

train_df[(train_df.Customers > 6000)]

我們看一下假期 變量。
train_df.StateHoliday.value_counts()
-
0 855087
-
0 131072
-
a 20260
-
b 6690
-
c 4100
-
Name: StateHoliday, dtype: int64
train_df.StateHoliday_cat.count()
1017209
train_df.tail()

-
-
train_df.isnull().all() #檢查缺失
-
Out[18]:
-
-
Store False
-
DayOfWeek False
-
Date False
-
Sales False
-
Customers False
-
Open False
-
Promo False
-
SchoolHoliday False
-
StateHoliday_cat False
-
dtype: bool
讓我們繼續進行商店分析
store_df.head().append(store_df.tail())

-
#缺失數據:
-
-
-
Store 0.000000
-
StoreType 0.000000
-
Assortment 0.000000
-
CompetitionDistance 0.269058
-
CompetitionOpenSinceMonth 31.748879
-
CompetitionOpenSinceYear 31.748879
-
Promo2 0.000000
-
Promo2SinceWeek 48.789238
-
Promo2SinceYear 48.789238
-
PromoInterval 48.789238
-
dtype: float64
-
In [21]:
-
讓我們從缺失的數據開始。第一個是 CompetitionDistance
-
-
store_df.CompetitionDistance.plot.box()
讓我看看異常值,因此我們可以在均值和中位數之間進行選擇來填充NaN

缺少數據,因為商店沒有競爭。 因此,我建議用零填充缺失的值。
-
-
store_df["CompetitionOpenSinceMonth"].fillna(0, inplace = True)
讓我們看一下促銷活動。
store_df.groupby(by = "Promo2", axis = 0).count()

如果未進行促銷,則應將“促銷”中的NaN替換為零
我們合並商店數據和訓練集數據,然后繼續進行分析。
第一,讓我們按銷售量、客戶等比較商店。
-
f, ax = plt.subplots(2, 3, figsize = (20,10))
-
-
plt.subplots_adjust(hspace = 0.3)
-
plt.show()

從圖中可以看出,StoreType A擁有最多的商店,銷售和客戶。但是,StoreType D的平均每位客戶平均支出最高。只有17家商店的StoreType B擁有最多的平均顧客。
我們逐年查看趨勢。
-
sns.factorplot(data = train_store_df,
-
# 我們可以看到季節性,但看不到趨勢。 該銷售額每年保持不變
-
-
-
<seaborn.axisgrid.FacetGrid at 0x7f7c350e0c50>


我們看一下相關圖。
-
"CompetitionOpenSinceMonth", "CompetitionOpenSinceYear", "Promo2
-
-
<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進行時間序列預測分析
