问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于SARIMA模型的新能源汽车产销量分析

创作时间:
作者:
@小白创作中心

基于SARIMA模型的新能源汽车产销量分析

引用
CSDN
1.
https://m.blog.csdn.net/m0_73962294/article/details/138876620

本文通过一个实际案例,介绍了如何使用季节性自回归积分滑动平均模型(SARIMA)对新能源汽车的月产销量进行预测分析。通过2015-2023年的历史数据,预测了2024年的月产销量,展示了SARIMA模型在处理具有季节性变化的时间序列数据中的应用。

SARIMA模型简介

SARIMA模型是ARIMA模型的扩展,专门用于处理具有季节性变化的时间序列数据。它在ARIMA模型的基础上添加了季节性成分,可以更好地捕捉季节性变化的影响。季节性不仅局限于自然季节的周期性变化,任何类型的周期性都可以用SARIMA模型来处理,例如一天内的小时变化(24)、一周内的星期变化(7)、一个月内的日变化(30)、一年内的月变化(12)等。

数据准备

本案例使用2015年1月1日至2024年3月1日的新能源汽车月产销量数据。数据读入后,需要进行一些预处理,包括将时间列转换为周期索引格式。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
import seaborn as sns
from tqdm import tqdm  
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pyecharts.options as opts
from pyecharts.charts import Line
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.metrics import mean_squared_error

# 读取数据
df1 = pd.read_excel("2014-2024年新能源汽车产销量(月).xlsx", sheet_name = 0)

# 将时间列转换为日期格式
def date(para):
    if type(para) == int:
        delta = pd.Timedelta(str(int(para))+'days')
        time = pd.to_datetime('1899-12-30') + delta
        return time
    else:
        return para
df1['时间'] = df1['时间'].apply(date)
df1.set_index('时间', inplace=True)
df1.index = pd.DatetimeIndex(df1.index).to_period('M') # 设置周期频率

数据探索

检测空缺值

通过绘制产销量曲线,可以直观地查看数据的完整性和趋势。如果发现数据中存在空缺值,可以考虑使用SARIMA模型进行填补。

# 绘制产销量曲线
x_axis_data = [str(period) for period in df1.index.tolist()]
yields = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_axis_data)
    .add_yaxis(series_name="月产量", 
               is_smooth=True,
               y_axis=df1['产量(万辆)'].tolist(), 
               symbol_size=10)
    .add_yaxis(series_name="月销量", 
               is_smooth=True,
               y_axis=df1['销量(万辆)'].tolist(), 
               symbol_size=10)
    .set_global_opts(title_opts=opts.TitleOpts(title="2015年-2024年3月新能源汽车的月产销量"),
                     xaxis_opts=opts.AxisOpts(type_='category', name="时间"),
                     yaxis_opts=opts.AxisOpts(type_='value', name="产销量/万辆"))
)
yields.load_javascript()
yields.render_notebook()

检测异常值

通过绘制小提琴图,可以查看产销量的分布情况。如果数据分布异常,可能需要进行异常值处理。

custom_palette = ["#ff7f0e", "#2ca02c"]
sns.violinplot(data=df1, inner="quartile", palette=custom_palette)
plt.title('产销量小提琴图')
plt.xlabel('Groups')
plt.ylabel('Values')
plt.show()

检测平稳性

通过绘制每年月销量的趋势图,可以分析数据的平稳性。如果数据存在明显的趋势或季节性变化,需要进行相应的处理。

sales_data = [df1['产量(万辆)'].tolist()[i*12: (i+1)*12] for i in range(10)]
years = [str(i) for i in range(2015, 2025)]
line = Line()
for year, sales in zip(years, sales_data):
    line.add_xaxis(range(1, 13))
    line.add_yaxis(f"{year}", sales)
line.set_global_opts(
    title_opts=opts.TitleOpts(title="月产量"),
    xaxis_opts=opts.AxisOpts(type_="category", name="月份"),
    yaxis_opts=opts.AxisOpts(name="产量(万辆)"),
    tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
    legend_opts=opts.LegendOpts(pos_left="center", orient="horizontal")
)
line.load_javascript()
line.render_notebook()

SARIMA建模

参数选择

使用网格搜索法选择最优的SARIMA模型参数。这里我们限定p、d、q的参数范围,计算每组参数的均方根误差(RMSE),并选择误差最小的参数组。

train = df1[:108] # 选取完整的时序数据
p_range = range(0, 5)  
d_range = range(0, 3)  
q_range = range(0, 5)  
parameters = itertools.product(p_range, d_range, q_range)
best_score = float('inf')
best_params = None

for param in tqdm(parameters, total=len(p_range)*len(d_range)*len(q_range)):
    try:
        model = SARIMAX(train['产量(万辆)'], order=param, seasonal_order=(1, 1, 1, 12))
        result = model.fit()
        predicted_sales = result.predict(start=train.index[0], end=train.index[-1])
        rmse = np.sqrt(mean_squared_error(train['产量(万辆)'], predicted_sales))
        print("RMSE:", rmse)
        if rmse < best_score:
            best_score = rmse
            best_params = param
    except:
        continue
print("Best Parameters:", best_params)

模型训练与预测

使用选择的最优参数训练SARIMA模型,并对2024年的月产销量进行预测。

model = SARIMAX(train['产量(万辆)'], order=(2, 1, 4), seasonal_order=(1, 1, 1, 12))
result = model.fit()
predicted_sales = result.predict(start=predicted_index[0], end=predicted_index[-1])

# 绘制预测结果
x_axis_data = [str(period) for period in df1.index.tolist()]
predict = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_axis_data)
    .add_yaxis(series_name="月产量", 
               is_smooth=True,
               y_axis=df3['产量(万辆)'].tolist(), 
               symbol_size=10)
    .add_yaxis(series_name="预测产量", 
               is_smooth=True,
               y_axis=predicted_sales.tolist(), 
               symbol_size=10, 
               linestyle_opts=opts.LineStyleOpts(color="red"))
    .set_global_opts(title_opts=opts.TitleOpts(title="2015年-2024年3月新能源汽车的月产销量"),
                     xaxis_opts=opts.AxisOpts(type_='category', name="时间"),
                     yaxis_opts=opts.AxisOpts(type_='value', name="产量/万辆"))
)
predict.load_javascript()
predict.render_notebook()

2024年预测结果

设定预测区间为2024年1月到2024年12月,得到2024年每月新能源汽车产量的预测结果。

predicted_2024 = result.predict(start='2024-01', end='2024-12', freq='M')
predicted_2024 = [round(i, 2) for i in predicted_2024]

x_axis_data = [f'2024-{i}' for i in range(1, 13)]
predict_2024 = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(x_axis_data)
    .add_yaxis(series_name="预测产量", 
               is_smooth=True,
               y_axis=predicted_2024, 
               symbol_size=10, 
               label_opts=opts.LabelOpts(is_show=True))
    .set_global_opts(title_opts=opts.TitleOpts(title="2024年新能源汽车的月产量"),
                     xaxis_opts=opts.AxisOpts(type_='category', name="时间"),
                     yaxis_opts=opts.AxisOpts(type_='value', name="产量/万辆"))
)
predict_2024.load_javascript()

通过以上步骤,我们成功地使用SARIMA模型对新能源汽车的月产销量进行了预测分析。这个案例展示了SARIMA模型在处理具有季节性变化的时间序列数据中的应用,同时也提供了一个完整的数据处理和模型建立的流程。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号