Bài 4 phần 1 hôm trước chúng ta đã đi qua 2 bước số 1 và 2 về việc chuẩn bị biến và đã lựa chọn được một số thông tin hữu ích như là Biến phụ thuộc tỷ lệ nợ xấu NPL có quan hệ cao nhất với Biến kinh tế vĩ mô GDP.
Hôm nay chúng ta sẽ đi tiếp các bước còn lại trong việc triển khai một mô hình dự báo đơn giản với 2 biến trên.
Phần 5 – Xử lý các biến không đạt chuẩn
Kết thúc Bước 2 ở bài trước chúng ta đã xác định được biến theo các tiêu chí:
- Biến phụ thuộc (Y) trong mô hình phải là biến liên tục
- Có mối quan hệ tuyến tính giữa biến phụ thuộc Y với các biến độc lập X
- Dữ liệu không có chứa các điểm dị biệt/ outliers
- Không có sự đa cộng tuyến giữa các biến độc lập X. Điều đó có nghĩa các biến độc lập trong mô hình không có sự tương quan cao với nhau.
Có rất nhiều các vấn đề xẩy ra với biến và không có chuẩn mực nào cho mọi trường hợp xử lý biến vì vậy trong các trường hợp chúng ta sẽ cần cân nhắc xem vấn đề biến không đạt chuẩn là vì sao:
- Nếu đó là giá trị bất thường, nhưng sau khi xem xét thấy rằng ở thời điểm đó nó bất thường là chính xác thì có thể cân nhắc giữ lại
- Nếu giá trị bất thường đó thực sự có vấn đề và bộ mẫu dữ liệu lớn ta có thể xóa bỏ, thay thế bằng giá trị khác
- Nếu các mối quan hệ không tốt, phân phối dữ liệu không tốt, có thể cân nhắc chia nhỏ các mối quan hệ/ biến hoặc tìm kiếm các mối quan hệ/ biến mới
Giả định trong bài tập này là tôi sẽ không hiệu chỉnh các biến không đạt chuẩn vì lý do là các biến đã thu thập được chính xác, các thời kỳ đột biến dữ liệu là phù hợp với các cuộc khủng hoảng kinh tế.
Ghi chú: Như đã nói từ ban đầu, chất lượng của mô hình phụ thuộc rất nhiều vào chất lượng của dữ liệu, vì vậy việc chuẩn bị dữ liệu, kiểm định biến tốt sẽ có tác động lớn đến kết quả, thời gian làm việc này thông thường sẽ chiếm 80% thời lượng xây dựng 1 mô hình.
Phần 6 – Xây dựng mô hình
Đối với bài tập này theo tôi thấy xây dựng mô hình đơn biến giữa biến phụ thuộc Y và biến độc lập X = GDP là phù hợp, tuy nhiên trong góc độ bài tập kỹ thuật chúng ta có thể mở rộng xây dựng các mô hình đa biến và tổ hợp các trường hợp mô hình có thể xẩy ra để xem xét kết quả.
Mẫu source code xây dựng mô hình đơn biến để làm dự báo kết quả của biến tỷ lệ nợ xấu Y và biến kinh tế vĩ mô X như sau. Trong phần này tôi dung sklearn để xây dựng mô hình dự báo và dung statsmodels để in các giá trị hồi quy tuyến tính bằng phương pháp bình phương tối thiểu (OLS)
# MÔ HÌNH VÀ PHÂN TÍCH KẾT QUẢ
# Chọn biến đưa vào mô hình: Biến X = GDP và Y = NPL
X_Train = df['GDP'][:14].values.reshape(-1,1)
Y_Train = df['NPL'][:14].values.reshape(-1,1)
# Xây dựng mô hình linear với sklearn
regr = linear_model.LinearRegression()
regr.fit(X_Train, Y_Train)
# Dự báo kết quả Tỷ lệ nợ xấu trên số liệu dự báo của GPD 4 năm tiếp theo với sklearn
X_Test = df['GDP'][-4:].values.reshape(-1, 1)
print('GDP dự tính cho 4 năm tiếp theo: \n', X_Test)
Y_Pred = regr.predict(X_Test)
print('Dự đoán tỷ lệ nợ xấu NPL theo biến động của GDP: \n', Y_Pred)
# In các giá trị của hàm Hồi quy để kiểm tra mô hình
# In giá trị Hệ số chặn/ Hằng số Intercept và Hệ số góc Coefficients
print('Intercept: \n', regr.intercept_)
print('Coefficients: \n', regr.coef_)
# In kết quả hồi quy tuyến tính thông qua phương pháp OLS với statsmodels
X_Train = sm.add_constant(X_Train) # adding a constant
model = sm.OLS(Y_Train, X_Train , alpha=0.05).fit()
print_model = model.summary()
print(print_model)
# Tính phần dư Residual từ OLS
res_ols = model.resid # residuals
print(res_ols)
# Vẽ phân phối dữ liệu của phần dư Residual để phân tích kết quả
df_hist_ols =pd.DataFrame(res_ols)
df_hist_ols.rename(columns={df_hist_ols.columns[0]: "Residual"}, inplace=True)
print(df_hist_ols)
print(df_hist_ols.describe())
df_gdp = df ['GDP'][:14]
df_res = pd.concat([df_hist_ols, df_gdp], axis=1, sort=False)
print("-----------Kết quả pearson giữa Residual và GDP---------------")
print(df_res.corr(method='pearson', min_periods=1))
print("------------Kết quả spearman giữa Residual và GDP--------------")
print(df_res.corr(method='spearman'))
df_hist_ols.plot(kind='hist', stacked=True, bins=5)
df_hist_ols.plot(kind='box')
df_hist_ols.plot.density(figsize=(8, 6), linewidth=4)
fig = sm.qqplot(res_ols, line='r')
plt.show()
sys.exit()
Code language: PHP (php)
Như vậy bằng hàm Regression trên Python ta có kết quả dự báo tỷ lệ nợ xấu của các năm tiếp theo trên kết quả biến động của GDP như sau:
Phần 7 – Kiểm tra mô hình
Với kết quả mô hình ta thu được ở trên, chúng ta cùng đi qua một số kỹ thuật để kiểm tra xem mô hình trả kết quả này có tin cậy được không nhé. Dựa vào kết quả của đoạn Code đã chạy ở bước 4, chúng ta cùng đến Bước 5 – Kiểm tra mô hình bằng cách phân tích các kết quả trả ra.
Một số điều kiện có thể sử dụng để kiểm tra sự tin cậy của mô hình như:
- Đánh giá mức độ phù hợp của mô hình hồi quy tuyến tính thông qua kiểm tra giá trị R Square/ Adjusted R Square
- Có sự độc lập giữa các quan sát trong phần dư, không có sự tương quan giữa các quan sát của phần dư theo thời gian. Sự độc lập giữa các quan sát có thể được kiểm tra qua kiểm định Durbin-Watson.
- Phương sai của phần dư bằng nhau hay có sự đồng nhất về phương sai của phần dư. Phần dư (residual errors) có phân phối chuẩn hoặc xấp xỉ phân phối chuẩn. Có thể kiểm tra bằng các kết quả thống kê giá trị của phần dư
- Đánh giá về mức độ phù hợp của mô hình hồi quy tuyến tính này có suy rộng và áp dụng được cho tổng thể hay không thông qua kiểm định F và kiểm định T. Ý nghĩa của việc này đó là chúng ta dùng 1 tệp dữ liệu để làm mẫu xây dựng mô hình và coi như kết quả mô hình với tệp dữ liệu mẫu là tin cậy, bây giờ chúng ta kiểm tra xem nó có còn tin cậy với các trường hợp khác ngoài mẫu không.
Trên cơ sở đó, ứng dụng vào kết quả phân tích từng kết quả mô hình trên đây ta có:
Kết quả hồi quy tuyến tính thông qua phương pháp OLS với statsmodels, ta thu được bảng giá trị kết quả hồi quy như sau:
Phân tích R Square hoặc Adjusted R Square:
- R-squared (R2) là một thước đo thống kê đại diện cho tỷ lệ phương sai cho một biến phụ thuộc được giải thích bởi một biến độc lập hoặc các biến trong mô hình hồi quy. Trong bài toán này nó giải thích cho việc phụ thuộc của biến Y tỷ lệ nợ xấu vào biến X GDP. Một mô hình tốt là mô hình mà Y được giải thích bởi X cao
- Không có giá trị R Square/ Adjusted R Square chính xác là bao nhiêu thì mô hình đạt yêu cầu. Chỉ số này càng tiến về 1 thì mô hình càng có ý nghĩa, càng tiến về 0 thì ý nghĩa mô hình càng yếu. Thông thường mô hình tốt sẽ chọn giá trị từ 0.7 trở lên
- Càng đưa thêm nhiều biến vào mô hình, mặc dù chưa xác định biến đưa vào có ý nghĩa hay không thì giá trị R square sẽ tăng. Lý do là khi càng đưa thêm biến giải thích vào mô hình thì sẽ càng khiến phần dư giảm xuống.
- Adjusted R Square: được tính từ R Square thường được sử dụng hơn vì giá trị này phản ánh sát hơn mức độ phù hợp của mô hình hồi quy tuyến tính. Adjusted R Square không nhất thiết tăng lên khi ta đưa thêm biến độc lập vào mô hình, hạn chế được trường hợp thồi phồng mức độ phù hợp của mô hình.
Kết luận đối với kết quả mô hình trên:
Kiểm định Durbin-Watson để kiểm định tính tự tương quan của các sai số ε_i
Trong đó du, dl là các giá trị được tra cứu tại bảng phân phối Durbin Watson dựa vào các tham số: ), số quan sát n và số biến độc lập k. Thông thường người ta sẽ chọn alpha = 1% hoặc 5% tương đương với kỳ vọng mức độ tin cậy là 99% hoặc 95%.
Với trường hợp trong ví dụ ta đang giả sử ta kỳ vọng alpha = 5%, số lượng quan sát n = 14, số lượng biến độc lập k = 1. Ta có kết luận như sau.
Tra bảng theo Durbin-Watson bên dưới để tìm ta có dl = 1.045 và du=1.350:
Dóng theo công thức Kiểm định Durbin-Watson trên đây ta có:
Kết luận đối với kết quả mô hình trên:
Kiểm định Phần dư (residual errors)
Kiểm định Phần dư (residual errors) có phân phối chuẩn hoặc xấp xỉ phân phối chuẩn không thông qua việc thực hiện thống kê dữ liệu và vẽ một số các biểu đồ thống kê phân tích
- Phần dư (residual errors): Khi vẽ đường thẳng hồi qui, ta thấy các trị số quan sát y nằm trên hoặc xung quanh đường thẳng. Vì có các điểm không nằm trên đường thẳng và sự liên hệ giữa xi và yi không còn là 100% vì có sự sai lệch tại các điểm nằm ngoài đường tuyến tính. Sự sai lệch này trong thống kê gọi là phần dư (residual) hoặc errors e_i.
- Khi đó phương trình hồi qui tuyến tính được viết dưới dạng tổng quát như sau: Y’ = βxᵢ + + Ɛᵢ à như vậy nếu phần dư càng nhỏ và ổn định thì sự liên hệ giữa x, y càng lớn và ngược lại.
- Trong phần này tôi nhắc lại một số các kỹ thuật đã được dùng để kiểm định biến trong bài trước, sau khi chạy xong mô hình, xác định được các phân dư (qua hàm model.resid theo phương pháp bình phương nhỏ) chúng ta sử dụng các kỹ thuật thống kê describe, correlation, vẽ biểu đồ Histogram, vẽ biểu đồ Box, biểu đồ Density, biểu đồ QQ
Lấy giá trị Describe của phần dư
count 14.000000
mean 0.004368
std 0.023688
min -0.028399
25% -0.009350
50% -0.002104
75% 0.014034
max 0.061649
Mối quan hệ giữa phần dư và biến X
Biểu đồ Histogram
Biểu đồ Box
Biểu đồ Density
Biểu đồ QQ
Kết luận đối với kết quả mô hình trên:
- Trên đường phân phối của phần dư ta thấy đường có hình dạng phân phối tương đối tốt như một đường Bell Curve
- Phân tích tiếp đến kết quả describe ta thấy mean khá tốt (bằng 0.004368) tiệm cận đến 0, nhưng giá trị độ lệch chuẩn standard deviation lại rất thấp (bằng 0.023688) trong khi đường phân phối chuẩn nên có mean = 0 và std = 1
- Phân tích tiếp đến mối quan hệ giữa X và phân dư ta cũng thấy 2 chuỗi giá trị có quan hệ rất mạnh, điều này sẽ ảnh hưởng không tốt đến mô hình, bởi ta luôn kỳ vọng Y chỉ phụ thuộc vào sự biến đổi của X mà ít bị ảnh hưởng bởi phần error, trong khi đó nếu phần error có quan hệ mạnh với X có nghĩa là nó thay đổi theo giá trị của X nhiều và sẽ làm cho Y biến động theo, đồng thời cũng làm kết quả mô hình kém chính xác.
Để tìm hiểu mối quan hệ giữa biến phụ thuộc và các biến độc lập dựa trên phương trình hồi quy, đánh giá về mức độ phù hợp của mô hình hồi quy tuyến tính này có suy rộng và áp dụng được cho tổng thể hay không người ta dùng Kiểm định giả thuyết (Hypothesis Testing). Có thể coi bài toán kiểm định giả thuyết như phép biện chứng, để chứng minh được là sai thì đầu tiên ta giả sử là đúng, sau đó sẽ tìm các bằng chứng để chưng điều đã giả sử này là sai. Trong thống kê, các bằng chứng này được coi là các biến ngẫu nhiên có ít xác suất xẩy ra, nếu xác suất xẩy ra là ít thì ta có thể chấp nhận mức độ rủi ro có thể cho phép được khi đưa ra kết luận rằng điều giả sử là sai).
Để chứng minh trong bài viết này tôi đề cập đến 2 phương pháp kiểm định sau đây
- Kiểm định F: là phương pháp phân tích ANOVA để tìm hiểu mối quan hệ giữa biến phụ thuộc và các biến độc lập dựa trên phương trình hồi quy, đánh giá về mức độ phù hợp của mô hình hồi quy tuyến tính này có suy rộng và áp dụng được cho tổng thể hay không?
- Kiểm định t: tương tự như kiểm định f, kiểm định t dùng để đánh giá về mức độ phù hợp của mô hình hồi quy tuyến tính này có suy rộng và áp dụng được cho tổng thể hay không
Kết luận chung: qua các đánh giá về kết quả của mô hình như trên đây, ta có thể thấy mô hình cho kết quả tích cực ở điểm không có tự tương quan (kiểm định Durbin-Watson), mô hình cho kết quả bác bỏ giả thuyết nghĩa là nó có áp dụng với tổng thể các trường hợp, không phải chỉ với bộ dữ liệu mẫu (kiểm định F và T). Tuy nhiên mô hình cho kết quả R Square ở mức trung bình và đặc biệt là phần dư không có phân phối chuẩn (standard deviation nhỏ hơn 1 rất nhiều), X và phần dư cũng có quan hệ mạnh với nhau từ đó làm giảm ảnh hưởng của X lên Y. Trên thực tế ta thấy GDP đúng là có ảnh hưởng lớn đến tình hình nợ xấu trong Ngân hàng, tuy nhiên để xây dựng một mô hình phản ảnh tốt về biến động nợ xấu, ta nên xem xét việc bổ sung thêm các biến khác và tư đó cũng có thể làm chất lượng mô hình tốt lên.
Ghi chú: Như đã trao đổi ở trên, chúng ta có thể chạy mô hình và in kết quả hồi quy theo phương pháp bình phương nhỏ nhất để đánh giá tất cả các phương án hồi quy mà chúng ta có thể tạo được. Mẫu source code như sau:
# ------------------------IN TỔ HỢP CÁC KẾT QUẢ HỒI QUY
df_combi = df[:14]
print(df1)
arr = ['Inflation', 'Lending_Interest_Rate', 'Unemployment', 'GDP']
i = 0
for r in range(1, 5):
for sub in rSubset(arr, r):
i += 1
print("Model : ", i, np.asarray(sub))
# 5. Xác định multi regression
X = df_combi[np.asarray(sub)]
Y = df_combi['NPL']
# with sklearn
regr = linear_model.LinearRegression()
regr.fit(X, Y)
print('Intercept: \n', regr.intercept_)
print('Coefficients: \n', regr.coef_)
# with statsmodels
X = sm.add_constant(X) # adding a constant
model = sm.OLS(Y, X).fit()
print_model = model.summary()
print(print_model)
sys.exit()
Code language: PHP (php)
Một số nguồn dữ liệu tham khảo:
- Chi tiết mô tả ý nghĩa từng thông số của làm OLS: https://www.datarobot.com/blog/ordinary-least-squares-in-python/
- Giải thích các thuật ngữ sử dụng trong Hypothesis testing: https://people.richland.edu/james/lecture/m113/def_testing.html
Hẹn gặp lại các bạn trong các bài tiếp theo! Chúc các bạn thành công!
Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: https://miai.vn
Youtube: http://bit.ly/miaiyoutube