Bảng kết quả dự báo quý năm 2020 đến 2026

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG PHÂN TÍCH DỰ BÁO DOANH THU DOANH NGHIỆP GOLF (Trang 39 - 58)

- Biểu đồ minh họa của quá trình thực hiện mơ hình dự báo được thể hiện như Hình 6 :

4.2 Xây dựng ứng dụng dự báo theo mơ hình ARIMA

4.2.1 Xây dựng chương trình phân tích và dự báo dự báo doanh thu hiện thực bằng Python thu hiện thực bằng Python

4.2.1.1 Khai báo thư viện và xử lý số liệu :

- Khai báo thư viện : # coding=utf-8 import warnings import itertools import pandas as pd import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt plt.style.use('bmh')

import statsmodels.api as sm import

statsmodels.tsa.api as smt import statsmodels.formula.api as smf

from statsmodels.graphics.tsaplots import plot_acf from statsmodels.graphics.tsaplots import plot_pacf from statsmodels.tsa.stattools import adfuller

from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.tsa.ar_model import AR

from statsmodels.tsa.arima_model import ARMA, ARIMA from statsmodels.tsa.statespace.sarimax import

SARIMAX from math import sqrt ,[8]

Khai báo đường dẫn file CSV và tạo datafarm [9],[10]:

df =

pd.read_csv('d:\caohoc\CODELUANVAN\ARIMA_Yt.csv') dates = pd.date_range(start='2003-01-01', freq='MS',

periods=len(df))

# Tạo thời gian dữ liệu từ file csv

import calendar

df['Month'] = dates.month

df['Month'] = df['Month'].apply(lambda x: calendar.month_abbr[x])

df['Year'] = dates.year

# Xóa file dữ liệu và tạo lại data

df.drop(['Month-Year'], axis=1, inplace=True)

df.rename(columns={'Sales_Yt':'Golf-Sales'}, inplace=True) df = df[['Month', 'Year', 'Golf-Sales']]

# Tạo dataframe, Set time-series dataframe

df.set_index(dates, inplace=True)

df2 = df['Golf-Sales']

- Vẽ biểu đồ với số liệu doanh thu Golf: # Tạo biểu đồ số liệu ban đầu

df2.plot(figsize=(15, 6))

plt.ylabel('Doanh thu golf theo tháng qua các năm') plt.xlabel('Thời gian từ 01-2003 đến 03-2019')

plt.title('Doanh thu golf đơn vị tính 1.000.000 vnđ') plt.show()

- Biểu đồ doanh thu golf như Hình 7 :

Hình 7: Biểu đồ minh họa doanh thu golf theo số liệu thực

4.2.1.2 Xây dựng các mơ hình trung bình (Moving Average):

- Xây dựng mơ hình dự báo theo MA với trung bình theo 4, 6, 8, 12 tháng qua các năm.

# Trung bình tháng 4, 6, 8, 12

fig, axes = plt.subplots(2, 2, sharey=False, sharex=False) fig.set_figwidth(16)

fig.set_figheight(8)

# Trung bình 4 tháng

axes[0][0].plot(df2.index, df2, label='Số liệu ban đầu (Original)') axes[0][0].plot(df2.index, df2.rolling(window=4).mean(), label='Trung

bình 4 tháng')

axes[0][0].set_xlabel("Năm 2003 đến 2018")

axes[0][0].set_ylabel("Doanh thu golf 2003 đến 2018 ") axes[0][0].set_title(" Trung bình 4 tháng (4MA)")

# Trung bình 6 tháng

axes[0][1].plot(df2.index, df2, label='Số liệu ban đầu (Original)') axes[0][1].plot(df2.index, df2.rolling(window=6).mean(), label='Trung

bình 6 tháng')

axes[0][1].set_xlabel("Năm 2003 đến 2018")

axes[0][1].set_ylabel("Doanh thu golf 2003 đến 2018") axes[0][1].set_title("Trung bình 6 tháng (6MA)")

axes[0][1].legend(loc='best')

# Trung bình 8 tháng

axes[1][0].plot(df2.index, df2, label='Số liệu ban đầu (Original)') axes[1][0].plot(df2.index, df2.rolling(window=8).mean(), label='Trung

bình 8 tháng')

axes[1][0].set_xlabel("Năm 2003 đến 2018")

axes[1][0].set_ylabel("Doanh thu golf 2003 đến 2018") axes[1][0].set_title(" Trung bình 8 tháng (8MA)") axes[1][0].legend(loc='best')

# Trung bình 12 tháng

axes[1][1].plot(df2.index, df2, label='Số liệu ban đầu (Original)') axes[1] [1].plot(df2.index, df2.rolling(window=12).mean(), label='Trung bình 12

tháng')

axes[1][1].set_xlabel("Năm 2003 đến 2018")

axes[1][1].set_ylabel("Doanh thu golf 2003 đến 2018") axes[1][1].set_title("Trung bình 12 tháng (12MA)") axes[1][1].legend(loc='best')

plt.tight_layout() plt.show()

- Kết quả của mơ hình dự báo theo 4, 6, 8,12 Hình 8:

- Độ lệch chuẩn và đường trung bình của 12 tháng :

✓ Xây dựng code độ lệch trung bình :

# Độ lệch trung bình và độ lệch chuẩn (Rolling Mean & Standard

Deviation)

rolmean = y.rolling(window=12).mean() rolstd = y.rolling(window=12).std() #Plot

rolling statistics:

orig = plt.plot(y, label='Dữ liệu gốc (Original)')

mean = plt.plot(rolmean, label='Độ lệch trung bình Mean') std = plt.plot(rolstd, label = 'Độ lệch chuẩn Std')

plt.legend(loc='best')

plt.title('Độ lệch trung bình và độ lệch chuẩn') plt.show()

✓ Kết quả độ lệch chuẩn trung bình 12 tháng theo Hình 9 :

Hình 9: Kết quả dự báo trung bình MA

- Thử nghiệm (Dickey –Fuller Test) :

✓ Xây dựng đoạn code thử nghiệm :

# Perform Dickey-Fuller test: (Mơ hình Test Dickey)

from statsmodels.tsa.stattools import adfuller

print('Results of Dickey-Fuller Test:')

dftest = adfuller(df2, autolag='AIC') dfoutput = pd.Series(dftest[0:4], index=['Test Statistic', 'p-

value', '#lags Used', 'Giá trị Observations Used'])

dfoutput['Critical Value (%s)'%key] = value

print(dfoutput)

✓ Kết quả thử nghiệm Dickey - Fuller Test với P- Value : 0.927364 và giá trị dự thử nghiệm như sau :

Results of Dickey-Fuller Test: Test Statistic -0.286720

P-value 0.927364

#lags Used 13.000000 Giá trị Observations Used 181.000000 Critical Value (1%) -3.467005 Critical Value (5%) -2.877644 Critical Value (10%) -2.575355 - Tính thời vụ và phân rã doanh thu Golf theo tháng :

✓ Xây dựng code phân rã doanh thu theo tháng

# Dữ liệu doanh thu Golf hàng tháng phân loại theo năm 2003 đến 2019

year_sales = pd.pivot_table(df, values ="Golf-Sales", columns =

"Month", index = "Year")

year_sales = year_sales[['Jan','Feb','Mar', 'Apr', 'May', 'Jun', 'Jul',

'Aug', 'Sep', 'Oct', 'Nov', 'Dec']] print(year_sales)

year_sales.boxplot()

✓ Biểu đồ phâ tích kết quả phân rã doanh thu theo tháng theo Hình 10:

- Phân rã doanh thu theo hồi quy tuyến tính theo : Xu hướng, mùa, Random

✓ Phân rã doanh thu theo thời gian

# Phân rã dữ liệu theo cấp số nhân decomposition

= sm.tsa.seasonal_decompose(df2,

model='multiplicative')

fig = decomposition.plot() fig.set_figwidth(12)

fig.set_figheight(8)

fig.suptitle('Phân tích số liệu cấp số nhân theo thời gian

(Multiplicative time series)')

plt.show()

✓ Kết quả theo biểu đồ phân tích số liệu theo thời gian theo Hình 11:

4.2.1.3 Xây dựng mơ hình ARIMA kết hợp

Xây dựng mơ hình ARIMA sự kết hợp của 3 phần gồm AR (Auto Regressive), I (Integrated), MA (Moving Average). Ký hiệu cho mơ hình ARIMA(p,d,q). Các ký hiệu p, d và q là ứng với từng phần AR, I và MA.

Xây dựng với công thức với I (Integrated): Xây dựng thử nghiệm với khơng có sự khác biệt d = 0, có sự khác biệt d = 1, … Khơng có sự khác biệt, d = 0: Y't = Yt

Có sự khác biệt thứ 1 với, d = 1: Y' t = Yt – Y t-1

Sự khác biệt thứ 2 với, d = 1: Y' t = Yt – Y t-1 - (Y t-1 - Y t- 2) = Y t - 2 * Y t-1 + Y t-2 - Xây dựng dòng lệnh phân tích sự khác biệt với cùng một số liệu.

# Doanh thu Golf theo mơ hình doanh thu và 1 khác

fig, axes = plt.subplots(1, 2, sharey=False, sharex=False) fig.set_figwidth(12)

fig.set_figheight(4)

axes[0].plot(df.index, df['Golf-Sales']) axes[0].set_xlabel("Year")

axes[0].set_ylabel("Goft-Sales") axes[0].set_title("Doanh thu Golf")

axes[1].plot(df.index, df['Golf-Sales'].diff(periods=1)) axes[1].set_xlabel("Year")

axes[1].set_ylabel("Differenced Doanh thu Golf ")

axes[1].set_title("1$^{st}$ Differenced Doanh thu Golf") plt.tight_layout()

plt.show()

- Biểu đồ doanh thu và kết quả khác biệt 1 theo Hình 12:

- Xây dựng doanh thu loại bỏ xu hướng:

# Loại bỏ xu hướng 1st Differencing (d=1) | Yt′=Yt−Yt−1

plt.figure(figsize=(10, 5)) plt.plot(df2.diff(periods=1)) plt.xlabel('Năm (Year)')

plt.ylabel('Doanh thu Golf (Golf Sales)')

-Biểu đồ donah thu loại bỏ xu hướng như Hình 13:

Hình 13: Biểu đồ doanh thu loại bỏ xu hướng

- Xây dựng số liệu cố định phương sai, phương trình sau đây biến đổi Log của dữ liệu doanh thu Golf: Ytnew

= log10(Yt)

# Ytnew =log10(Yt)

plt.figure(figsize=(10, 5)) plt.plot(np.log10(df2))

plt.xlabel('Year') plt.ylabel('Log

(Doanh thu Golf)')

-Biểu đồ biến đổi Log của doanh thu như Hình 14:

- Xây dựng số liệu cố định phương sai với sự khác biệt d = 1 với phương trình biến đổi Log của dữ liệu doanh thu Golf: Ytnew = log10(Yt) - log10(Yt -1)

# Ytnew=log10(Yt)−log10(Yt−1) với d=1

plt.figure(figsize=(10, 5))

plt.plot(np.log10(df2).diff(periods=1)) plt.xlabel('Year')

plt.ylabel('Differenced Log Yt - Yt -1 (Doanh thu Golf)')

- Biểu đồ biến đổi Log khác 1 như Hình 15:

Hình 15: Biểu đồ biến đổi với Log khác 1

- Vẽ sơ đồ ACF và PACF để xác định mơ hình AR và MA tiềm năng:

✓ Xây dựng dịng lệnh của chương trình tạo sơ đồ hệ số tự tương quang (ACF) và tương quan một phần (PACF) để xác định các mẫu ổn định trong dữ liệu:

# same as ts_log_diff = ts_log - ts_log.shift(periods=1)

df2_log = np.log10(df2) df2_log.dropna(inplace=True) df2_log_diff = df2_log.diff(periods=1)

df2_log_diff.dropna(inplace=True)

fig, axes = plt.subplots(1, 2, sharey=False,

sharex=False)

fig.set_figwidth(12) fig.set_figheight(4)

smt.graphics.plot_acf(df2_log_diff, lags=30, ax=axes[0],

alpha=0.5)

smt.graphics.plot_pacf(df2_log_diff, lags=30, ax=axes[1],

alpha=0.5)

✓ Sơ đồ hệ số tự tương quan (ACF) và một phần (PACF) như Hình 16:

Hình 16: Sơ đồ tự tương quan (AFC) và (PACF)

4.2.1.4 Xác định mơ hình ARIMA phù hợp nhất

- Để phù hợp dữ liệu doanh thu Golf theo chuỗi thời gian với mơ hình ARIMA theo mùa ta xác định các gía trị của mơ hình ARIMA (p, d, q) (P, D, Q) để tối ứu hóa số liệu quan tâm AIC hoặc BIC. Ta gắn kết mơ hình ARIMA với chức SARIMAX đánh giá các điểm tốt nhất cảu AIC, BIC.

- Xây dựng các dịng lệnh mơ hình:

# Mơ hình SARIMAX

p = d = q = range(0, 2)

pdq = list(itertools.product(p, d, q))

seasonal_pdq = [(x[0], x[1], x[2], 4) for x in list(itertools.product(p, d, q))]

print('Mơ hình ARIMA theo mùa:')

print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1])) print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2])) print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3])) print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))

for param in pdq:

for param_seasonal in seasonal_pdq: try: mod = sm.tsa.statespace.SARIMAX(df2, order=param, seasonal_order=param_seasonal, enforce_stationarity=False, enforce_invertibility=False)

results = mod.fit()

print('Best ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))

except: continue mod = sm.tsa.statespace.SARIMAX(df2, order=(1, 1, 1), seasonal_order=(1, 1, 1, 4), enforce_stationarity=False, enforce_invertibility=False) results = mod.fit() print(results.summary().tables[1])

- Mơ hình ARIMA theo mùa: SARIMAX: (0, 0, 1) x (0, 0, 1, 4) SARIMAX: (0, 0, 1) x (0, 1, 0, 4) SARIMAX: (0, 1, 0) x (0, 1, 1, 4) SARIMAX: (0, 1, 0) x (1, 0, 0, 4) - Mơ hình ARIMA tốt nhất: ARIMA (1, 1, 1) x (1, 1, 1, 4) 4 - AIC: 751.7326182697827

- Dự đốn doanh thu bằng mơ hình ARIMA phù hợp nhất như Hình 17:

- Các sai số dự báo MSE, RMSE:

# MSE The Mean Squared Error of our forecasts is

y_forecasted = pred.predicted_mean y_truth = y['2018-01-01':]

mse = ((y_forecasted - y_truth) ** 2).mean()

print(' MSE of our forecasts {}'.format(round(mse, 2)))

# RMSE The Root Mean Squared Error of

print('RMSE our forecasts is {}'.format(round(np.sqrt(mse), 2))) MSE là: 3.23

RMSE là: 1.8

- Vẽ sơ đồ Log của AFC và PACF với ARIMA (1, 1, 1) x (1, 1, 1, 4) 4 - AIC: 751.7326182697827

results.plot_diagnostics(figsize=(16, 8)) plt.show()

4.2.1.5 Dự báo doanh thu Golf

- Dự báo trước 1 bước:

## Dự báo

pred = results.get_prediction(start=pd.to_datetime('2018-01-01'),

dynamic=False)

pred_ci = pred.conf_int()

ax = y['2003':].plot(label='Quan sát (observed)')

pred.predicted_mean.plot(ax=ax, label='Dự báo trước 1 bước (One-

step ahead Forecast)', alpha=.7, figsize=(14, 7))

ax.fill_between(pred_ci.index, pred_ci.iloc[:, 0],

pred_ci.iloc[:, 1], color='k', alpha=.2) ax.set_xlabel('Year')

ax.set_ylabel('Doanh thu Golf (Golf Sales)') plt.legend()

plt.show()

-Kết quả dự báo trước 1 bước như Hình 19:

- Dự báo doanh thu Golf trong vòng 10 năm tiếp theo

# Dự báo tiếp

pred_uc = results.get_forecast(steps=100) pred_ci = pred_uc.conf_int()

ax = y.plot(label='Quan sát (observed)', figsize=(14, 7))

pred_uc.predicted_mean.plot(ax=ax, label='Dự báo (Forecast)') ax.fill_between(pred_ci.index,

pred_ci.iloc[:, 0],

pred_ci.iloc[:, 1], color='k', alpha=.25) ax.set_xlabel('Date')

ax.set_ylabel('Doanh thu Golf ( Golf Sales') plt.legend()

plt.show()

-Kết quả dự báo doanh thu trong vịng 10 năm tiếp theo như Hình 20:

4.3 Xây dựng ứng dụng dự báo theo mơ hình mạng Long short-term memory (LSTM) term memory (LSTM)

4.3.1 Khai báo thư viện

Khai báo thư viện

import numpy as np import pandas as pd

import matplotlib.pyplot as plt

from sklearn.preprocessing import MinMaxScaler from keras.preprocessing.sequence import

TimeseriesGenerator from keras.models import Sequential

from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout from tensorflow import keras import warnings

warnings.filterwarnings("ignore") [11]

Khai báo dữ liệu ban đầu

data = pd.read_csv('D:\CAOHOC\CODEANN\ARIMA2_Yt.csv') plt.plot(data.Sales_Yt.values, color='orange', label='Doanh thu Golf') plt.title('Doanh thu Golf 1.000.000 vnđ')

plt.xlabel('Thời gian [Month]') plt.ylabel('Doanh thu Sales Golf') plt.legend(loc='best')

plt.show()

Biểu đồ số liệu ban đầu như Hình 21 :

4.3.2 Xây dựng số liệu Dataset

Xây dựng tập số liệu traning [12]

data_end = int(np.floor(0.8*(data.shape[0]))) train = data[0:data_end]['Sales_Yt']

train =train.values.reshape(-1)

test = data[data_end:]['Sales_Yt'].values.reshape(-1) date_test = data[data_end:]['Year'].values.reshape(-1)

Xây dựng tập số liệu kiểm thử ( dữ liệu Test)

# xây dựng bộ dữ liệu test

def get_data(train,test,time_step,num_predict,Year): x_train= list() y_train = list() x_test = list() y_test = list() date_test= list()

for i in range(0,len(train) - time_step - num_predict):

x_train.append(train[i:i+time_step])

y_train.append(train[i+time_step:i+time_step+num_predict])

for i in range(0, len(test) - time_step - num_predict):

x_test.append(test[i:i+time_step])

y_test.append(test[i+time_step:i+time_step+num_predict]) date_test.append(Year[i+time_step:i+time_step+num_predict])

return np.asarray(x_train), np.asarray(y_train), np.asarray(x_test),

np.asarray(y_test), np.asarray(date_test)

x_train, y_train, x_test, y_test, date_test = get_data(train,test,3,1, date_test)

4.3.3 Xử lý số liệu

Xử lý tập số liệu Traning

# dua ve 0->1 cho tap train

scaler = MinMaxScaler()

x_train = x_train.reshape(-1,3)

x_train = scaler.fit_transform(x_train) y_train = scaler.fit_transform(y_train)

# dua ve 0->1 cho tap test

x_test = x_test.reshape(-1,3)

x_test = scaler.fit_transform(x_test) y_test = scaler.fit_transform(y_test)

# Reshape lai cho dung model

x_train = x_train.reshape(-1,3,1) y_train = y_train.reshape(-1,1)

#reshape lai cho test

x_test = x_test.reshape(-1,3,1) y_test = y_test.reshape(-1,1) date_test = date_test.reshape(-1,1)

4.3.4 Xây dựng mơ hình mạng LSTM

Bước đầu tiên khởi tạo lớp Sequential. Đây sẽ là lớp mơ hình và sẽ thêm các lớp LSTM, Dropout và Dense cho mơ hình này. Thêm vào 3 lớp LSTM liên tiếp và cứ qua 1 lớp là có 1 dropout 0.3. Cuối cùng ta cho qua một tầng Dense với đầu ra là 1 chiều. Sử dụng hàm loss bình phương trung bình là hàm mất mát và để tối ưu hóa thuật tốn, chúng tơi sử dụng trình tối ưu hóa adam.

#dau vao 3 doan 1

n_input = 3 n_features = 1 model = Sequential() model.add(LSTM(units=50,activation='relu', input_shape=(n_input, n_features), return_sequences=True)) model.add(Dropout(0.3)) model.add(LSTM(units=50, return_sequences=True)) model.add(Dropout(0.3)) model.add(LSTM(units=50)) model.add(Dropout(0.3)) model.add(Dense(1)) model.compile(optimizer='adam', loss='mse')

4.3.5 Huấn luyện mơ hình mạng

model.fit(x_train, y_train, epochs=500,

validation_split=0.2, verbose=1, batch_size=30) model.save('D:/CAOHOC/CODEANN/30_to_1.h5') model = keras.models.load_model('D:/CAOHOC/CODEANN/30_to_1.h5') test_output = model.predict(x_test) 4.3.6 Kết quả thử nghiệm # print(test_output) test_1 = scaler.inverse_transform(test_output) test_2=scaler.inverse_transform(y_test) plt.plot(test_1[:100], color='r') plt.plot(test_2[:100] ,color='b') plt.title("Sales Golf") plt.xlabel("STT")

plt.ylabel("Doanh thu Golf")

plt.legend(('Doanh thu dự đoán', 'Doanh thu thực tế'),loc='upper right') plt.show()

- Kết quả mơ hình LSTM như Hình 22:

Hình 22: Kết quả thư nghiệm mơ hình mạng LSTM

5.1 Kết quả dự báo

5.1.1 Kết quả xây dựng với mơ hình nhân :

Phương trình hồi quy Tt = 20.778, 56346 + 811,8253497*t căn cứ theo Bảng :

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG PHÂN TÍCH DỰ BÁO DOANH THU DOANH NGHIỆP GOLF (Trang 39 - 58)

w