在Python Pandas中使用时间序列分析显示下降趋势数据集的绘图

在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模型来对数据集进行分析和预测。这些技术可以帮助我们更好地理解时间序列数据的趋势和周期性,从而做出更准确的预测和决策。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程