在Python Pandas中使用时间序列分析显示下降趋势数据集的绘图
在数据分析中,时间序列分析是一项非常重要的技能。时间序列是指在时间上连续的观测值,时间序列分析通常用来研究数据在时间上的趋势、周期性和季节性。本文将会介绍如何使用Python Pandas库中的时间序列分析功能来显示下降趋势数据集的绘图。
数据准备
我们首先需要准备一些数据,这里我们以一个电子商务公司的销售情况为例。数据包含了从2017年1月到2021年6月的每月销售额。
import pandas as pd
# 导入数据
data = pd.read_csv('sales_data.csv')
# 将日期列转换成datetime格式
data['date'] = pd.to_datetime(data['date'])
# 将日期列设置为索引
data.set_index('date', inplace=True)
# 输出前几行数据
print(data.head())
这段代码首先导入了Pandas库,并导入了我们准备好的数据。我们将数据中的 date
列转换成了 datetime
格式,并将其设置为数据集的索引。
绘制时间序列图
一旦准备好了数据,我们就可以使用Pandas的 plot()
函数来绘制时间序列图。
import matplotlib.pyplot as plt
# 绘制销售额时间序列图
plt.figure(figsize=(10, 6))
plt.plot(data.index, data['sales'])
plt.title("Sales Trend")
plt.xlabel("Year")
plt.ylabel("Sales (in Millions)")
plt.show()
这段代码使用了Matplotlib库绘制了销售额时间序列图。我们可以看到,从2017年到2021年的销售额呈现明显下降趋势。
时间序列分解
为了更好地理解销售额下降趋势的原因,我们可以使用时间序列分解技术来将其分解为趋势、周期和噪声三个部分。
from statsmodels.tsa.seasonal import seasonal_decompose
# 对销售额进行时间序列分解
result = seasonal_decompose(data['sales'], model='multiplicative', period=12)
# 绘制分解后的时间序列图
plt.figure(figsize=(10, 12))
plt.subplot(4,1,1)
plt.plot(data['sales'], label='Original')
plt.legend()
plt.subplot(4,1,2)
plt.plot(result.trend, label='Trend')
plt.legend()
plt.subplot(4,1,3)
plt.plot(result.seasonal, label='Seasonality')
plt.legend()
plt.subplot(4,1,4)
plt.plot(result.resid, label='Residuals')
plt.legend()
plt.show()
这段代码使用了Statsmodels库的 seasonal_decompose()
函数来对销售额进行时间序列分解,其中 model
参数选择了“multiplicative”,表示使用乘性模型进行分解;period
参数设置为12,表示我们认为销售额具有每年12个月的周期性。
从上图中可以看出,该数据集具有明显的下降趋势和每年12个月的周期性。其中,第一个子图是原始时间序列,第二个子图显示了趋势,第三个子图显示了季节性,第四个子图则显示了噪声。
可加性和乘性模型
在时间序列分析中,我们通常使用可加性或乘性模型来对时间序列进行分解。可加性模型表示:
y(t) = T(t) + S(t) + e(t)
其中,y(t) 是时间序列在时间 t 的值,T(t) 是时间序列在时间 t 的趋势部分,S(t) 是在时间 t 的季节性部分,e(t) 是在时间 t 上的噪声。可加性模型假定趋势、季节和噪声都是相互独立的,可以将它们相加得到整个时间序列。
乘性模型则表示:
y(t) = T(t) x S(t) x e(t)
其中,每个部分的意义和上面相同。不同的是,乘性模型假定季节性和趋势是相互依赖的,即季节性的变化幅度会随着时间的增加而改变。因此,乘性模型对于数据的变化更为敏感,可能更适合于波动幅度较大的时间序列。
在本例中,我们使用了乘性模型进行时间序列分解。
差分序列
通过对时间序列进行分解,我们可以更好地理解数据集的下降趋势和季节性变化。接下来,我们可以使用差分序列来提取数据中的趋势信息。
# 对销售额进行一阶差分
diff = data['sales'].diff(1)
# 绘制差分序列图
plt.figure(figsize=(10, 6))
plt.plot(diff, label='Differenced Sales (1st Order)')
plt.title("Differenced Sales Trend")
plt.xlabel("Year")
plt.ylabel("Differenced Sales")
plt.legend()
plt.show()
这段代码首先使用了Pandas的 diff()
函数来对原始销售额序列进行一阶差分。然后,我们绘制了差分序列图,可以看到该数据集的差分序列具有较为稳定的趋势,这说明销售额的下降趋势可能在未来也会持续。
自相关函数和偏自相关函数
除了时间序列分解和差分序列,我们还可以使用自相关函数(ACF)和偏自相关函数(PACF)来进一步分析数据集的趋势和周期性。ACF是指一个时间序列与它滞后版本之间的相关性,PACF是指去除中间滞后影响的序列和它本身之间的相关性。
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# 绘制ACF和PACF图
plt.figure(figsize=(12, 6))
plt.subplot(2,1,1)
plot_acf(data['sales'], ax=plt.gca(), lags=50)
plt.subplot(2,1,2)
plot_pacf(data['sales'], ax=plt.gca(), lags=50)
plt.show()
这段代码使用了Statsmodels库的 plot_acf()
和 plot_pacf()
函数来分别绘制数据集的ACF和PACF图。我们可以看到,在ACF图中,每隔12个月出现一个峰值,这和我们之前分解得到的季节性信息一致。在PACF图中,我们可以看到第1个滞后值的显著性,这表示每月的销售额可能受到前一个月销售额的影响。
建立时间序列模型
通过分析数据集的趋势、周期和自相关函数,我们可以建立时间序列模型来对销售额进行预测。这里我们选择ARIMA模型,它是一种广泛应用于时间序列分析中的模型,适用于没有季节性变化且具有明显的趋势和自相关性的时间序列。
from statsmodels.tsa.arima.model import ARIMA
# 拟合ARIMA模型
model = ARIMA(data['sales'], order=(1, 1, 1))
model_fit = model.fit(disp=False)
# 打印模型概要
print(model_fit.summary())
# 绘制拟合结果
plt.figure(figsize=(10, 6))
model_fit.plot_predict(dynamic=False)
plt.title("ARIMA Model Fit")
plt.xlabel("Year")
plt.ylabel("Sales (in Millions)")
plt.show()
这段代码使用了Statsmodels库的 ARIMA()
函数来构建ARIMA模型,其中 order
参数指定了ARIMA模型的阶数。最后,我们使用 plot_predict()
函数来绘制模型拟合结果。
ARIMA模型的 order
参数指定了3个值,分别为(p, d, q)。其中,p是AR模型的滞后阶数,d是一阶差分的次数,q是MA模型的滞后阶数。在本例中,我们使用(1,1,1)作为ARIMA模型的阶数。
ARIMA模型的 summary()
方法可以输出拟合结果的详细信息,包括各个参数的系数、标准误差、显著性等。这些信息可以帮助我们评估模型的拟合效果和可靠性。
最后,我们可以看到ARIMA模型成功地拟合了销售额的下降趋势,并对未来几个月的销售额进行了预测。
结论
在本文中,我们介绍了如何使用Python Pandas库中的时间序列分析功能来显示下降趋势数据集的绘图。我们通过绘制时间序列图、时间序列分解、差分序列、自相关函数和偏自相关函数,以及建立ARIMA模型来对数据集进行分析和预测。这些技术可以帮助我们更好地理解时间序列数据的趋势和周期性,从而做出更准确的预测和决策。