DataMining - Khai phá dữ liệu là một tập hợp, một hệ thống các phương pháp tính toán, thuật toán được áp dụng cho các cơ sở dữ liệu lớn và phức tạp, mục đích là loại bỏ các chi tiết ngẫu nhiên, chi tiết ngoại lệ, khám phá các mẫu, mô hình, quy luật tiềm ẩn, các thông tin có giá trị trong bộ dữ liệu. Datamining là thành quả của công nghệ tiên tiến ngày nay, là quá trình khám phá các kiến thức vô giá bằng cách phân tích khối lượng lớn dữ liệu đồng thời lưu trú chúng trên nhiều cơ sở dữ liệu khác nhau.
Cũng theo Data - Flair Data mining là một trong những lợi thế của các công ty trong ngành sản xuất, kinh doanh, marketing nếu họ biết cách ứng dụng hợp lý để tăng hiệu quả hoạt động. Do đó, nhu cầu xây dựng một hệ thống Data minning tiêu chuẩn ngày càng tăng cao. Các quy trình, mô hình Data mining phải có độ tin cậy cao và tạo điều kiện để các nhà kinh doanh - những ngừoi có thể không nắm rõ kiến thức chuyên môn về khoa học dữ liệu - Có thể sử dụng được.
Khai thác dữ liệu chính là trích xuất thông tin từ bộ dữ liệu khổng lồ. Nói cách khác, khai thác dữ liệu là quy trình khai thác, tiếp thu kiến thức từ dữ liệu. Chính vì vậy Data mining được ứng dụng vào nhiều lĩnh vực khác nhau.
Còn theo SAS - công ty chuyên cung cấp phần mềm, giải pháp lưu trữ và phân tích dữ liệu toàn cầu - Định nghĩa Data mining là quá trình tìm kiếm những chi tiết bất thường, các mẫu, các mô hình, quy luật của dữ liệu và mối tương quan giữa các tập dữ liệu để dự đoán hiệu quả, thiết lập các dự báo. Bằng cách áp dụng một loạt các kỹ thuật khác nhau, thông tin có được từ Data mining sẽ hỗ trợ tăng doanh thu, cắt giảm chi phí, cải thiện mối quan hệ khách hàng, giảm rủi ro,..
Các mẫu trong dữ liệu tiếng Anh gọi là “Data patterns”, là một phần của thống kê mô tả tức là một mẫu từ tổng thế, một mẫu dữ liệu phân tích đang thể hiện điều gì? Cụ thể Data patterns có thể được xác định thông qua các đồ thị đo lường mức độ tập trung, phân tán, biến động, các giá trị ngoại lệ, bất thường của dữ liệu.
Data patterns đóng vai trò cực kỳ quan trọng ở những bước đầu tiên của Data mining cho ta cái nhìn tổng quan về dữ liệu, mục đích của việc thu thập dữ liệu này là gì, tập dữ liệu có ý nghĩa phân tích không, dữ liệu nào cần quan tâm để phân tích để đem lại kết quả dự báo chính xác, dữ liệu nào cần loại bỏ để tránh nhiễu thông tin,..?
Ngày nay Big Data trỗi dậy và tác động đến mọi ngành, lĩnh vực các công ty phương pháp data mining ngày càng được biết đến, được ứng dụng rộng rãi và nhu cầu cải thiện ngày càng cao để có thể bắt kịp khả năng tính toán, tốc độ phân tích, khối lượng dữ liệu, sự đa dạng của Big Data.
Trong những năm qua sự tiến bộ của công nghệ kỹ thuật cung cấp các phần mềm với khả năng, tốc độ xử lý cực kỳ thông minh, cho phép nhiều công ty vượt ra khỏi các công việc thủ công, tẻ nhạt và tốn thời gian để phân tích dữ liệu nhanh chóng, dễ dàng và tự động. Các bộ dữ liệu được thu thập ngày càng phức tạp, nhưng lại chứa đựng nhiều thông tin hữu ích.
Các công ty bán lẻ, các ngân hàng, tổ chức tín dụng, công ty sản xuất kinh doanh, công ty viễn thông,… đang ứng dụng khai phá dữ liệu để phân tích mọi vấn đề từ tối ưu giá cả. Chương trình khuyến mãi, nhân khẩu học đến phân tích khách hàng, rủi ro, cạnh tranh, marketing đến truyền thông xã hội - ảnh hưởng đến mô hình kinh doanh, mối quan hệ khách hàng, doanh thu, hoạt động kinh doanh toàn tổ chức.
Xét về lợi ích sau cùng của Data mining trong quá trình phân tích dữ liệu:
Như đã nói ở trên do khối lượng dữ liệu mà mỗi công ty, tổ chức phải thu thập ngày nay cực kỳ lớn và phức tạp, đa dạng vô cùng nhưng lại chứa đựng những thông tin hữu ích đem lại các giá trị tiềm năng. Dưới đây là một số thách thức điển hình.
Dữ liệu sử dụng là westroxbury.csv ở textbook Wiley and SAS Business: Credit Risk Analytics: Measurement Techniques, Applications, and Examples in SAS.
Các thuật toán Machine Learning đòi hỏi cả features lẫn target phải là đầy đủ. Với dữ liệu trống (missing) thì có thể có nhiều phương pháp thay thế dữ liệu trống (imputation) cho từng loại feature khác nhau. Trước hết chúng ta đánh giá mức độ thiếu của hai nhóm dữ liệu:
#=================================
# chuẩn bị dữ liệu
#=================================
# tải một số thư viện chính
library(tidyverse)
library(dplyr)
library(knitr)
# xóa
rm(list = ls())
# Import dữ liệu:
westroxbury <- read_csv("https://raw.githubusercontent.com/reisanar/datasets/master/WestRoxbury.csv")
library(knitr)
westroxbury %>%
head() %>%
kable()
TOTAL VALUE | TAX | LOT SQFT | YR BUILT | GROSS AREA | LIVING AREA | FLOORS | ROOMS | BEDROOMS | FULL BATH | HALF BATH | KITCHEN | FIREPLACE | REMODEL |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
344.2 | 4330 | 9965 | 1880 | 2436 | 1352 | 2 | 6 | 3 | 1 | 1 | 1 | 0 | None |
412.6 | 5190 | 6590 | 1945 | 3108 | 1976 | 2 | 10 | 4 | 2 | 1 | 1 | 0 | Recent |
330.1 | 4152 | 7500 | 1890 | 2294 | 1371 | 2 | 8 | 4 | 1 | 1 | 1 | 0 | None |
498.6 | 6272 | 13773 | 1957 | 5032 | 2608 | 1 | 9 | 5 | 1 | 1 | 1 | 1 | None |
331.5 | 4170 | 5000 | 1910 | 2370 | 1438 | 2 | 7 | 3 | 2 | 0 | 1 | 0 | None |
337.4 | 4244 | 5142 | 1950 | 2124 | 1060 | 1 | 6 | 3 | 1 | 0 | 1 | 1 | Old |
# Kiểm tra số lượng giá trị missing trong bảng
sapply(westroxbury %>% select_if(is.character), function(x) {table(x, useNA = "ifany")})
## REMODEL
## None 4346
## Old 581
## Recent 875
# Kiểm tra tỷ lệ giá trị missing trong biến
sapply(westroxbury %>% select_if(is.numeric), function(x) {sum(is.na(x)) / length(x)})
## TOTAL VALUE TAX LOT SQFT YR BUILT GROSS AREA LIVING AREA
## 0 0 0 0 0 0
## FLOORS ROOMS BEDROOMS FULL BATH HALF BATH KITCHEN
## 0 0 0 0 0 0
## FIREPLACE
## 0
Tất cả các biến trong bảng dữ liệu đều không có giá trị missing do đó ta không cần phải thực hiện các giải pháp thống kê để thay những giá trị bị missing.
Giải thích sơ qua một chút về ý nghĩa của các biến trong bảng sau:
#---------------------------------------------------
# Kiểm tra dữ liệu
#---------------------------------------------------
names(westroxbury) # in tên biế
## [1] "TOTAL VALUE" "TAX" "LOT SQFT" "YR BUILT" "GROSS AREA"
## [6] "LIVING AREA" "FLOORS" "ROOMS" "BEDROOMS" "FULL BATH"
## [11] "HALF BATH" "KITCHEN" "FIREPLACE" "REMODEL"
t(t(names(westroxbury))) # list tên biến
## [,1]
## [1,] "TOTAL VALUE"
## [2,] "TAX"
## [3,] "LOT SQFT"
## [4,] "YR BUILT"
## [5,] "GROSS AREA"
## [6,] "LIVING AREA"
## [7,] "FLOORS"
## [8,] "ROOMS"
## [9,] "BEDROOMS"
## [10,] "FULL BATH"
## [11,] "HALF BATH"
## [12,] "KITCHEN"
## [13,] "FIREPLACE"
## [14,] "REMODEL"
colnames(westroxbury)[1] <- c("TOTAL_VALUE") # thay đổi tên cột đầu tiên
class(westroxbury$REMODEL) # REMODEL là biến factor
## [1] "character"
class(westroxbury[ ,14]) # tương tự câu trên.
## [1] "tbl_df" "tbl" "data.frame"
levels(westroxbury[, 14])
## NULL
class(westroxbury$BEDROOMS)
## [1] "numeric"
class(westroxbury[, 1])
## [1] "tbl_df" "tbl" "data.frame"
Sau bước kiểm tra dữ liệu, thì chúng ta có thể tạo thêm nhiều biến mới dựa vào biến ban đầu.Việc lựa chọn biến nhiều không hẳn là tốt cho mô hình, kiểm tra mức độ tương quan giữa các biến.
# Sử dụng model.matrix() để chuyển tất cả dữ liệu categorical thành dữ liệu bảng
# Chuyển tập hợp này thành biến giả sau đó chuyển từ ma trận sang khung dữ liệu để làm việc
xtotal <- model.matrix(~ 0 + BEDROOMS + REMODEL, data = westroxbury)
xtotal <- as.data.frame(xtotal)
t(t(names(xtotal))) # kiểm tra tên biến dummy
## [,1]
## [1,] "BEDROOMS"
## [2,] "REMODELNone"
## [3,] "REMODELOld"
## [4,] "REMODELRecent"
head(xtotal)
## BEDROOMS REMODELNone REMODELOld REMODELRecent
## 1 3 1 0 0
## 2 4 0 0 1
## 3 4 1 0 0
## 4 5 1 0 0
## 5 3 1 0 0
## 6 3 0 1 0
xtotal <- xtotal[, -4] # xóa cột thứ 4 trong bảng
Mô hình có quá nhiều biến thường gây khó khăn cho việc thu thập dữ liệu trong tương lai. Trực quan hóa dữ liệu, .. là những phương pháp giúp giảm thiểu biến để dư thừa và giảm chồng chéo thông tin.
Outlier là giá trị ngoại lai, có nhiều nguyên nhân, nhập sai dữ liệu, .. Nếu giá trị nhập sai nằm trong vùng của dữ liệu nó có thể vô hai, nhưng nếu dữ liệu không nằm trong tập dữ liệu sẽ gây hại và làm nhiễu. Một số nhà phân tích sử dụng quy tắc những giá trị mà nằm ngoài giá trị trung bình và 3 lần độ lệch chuẩn sẽ là giá trị ngoại lai.
Missing value trong một bảng dữ liệu thông thường sẽ chứa các bản ghi bị thiếu, nếu số lượng chiếm tỷ lệ thấp thì có thể bỏ qua. Nhưng nếu chúng ta có một lượng lớn các biến thì sẽ ảnh hưởng tương đối lớn đến dữ liệu. Có nhiều cách để bổ sung các giá trị thiếu này, như thay thế bằng giá trị trung bình của biến, hồi quy đơn biến, hay sử dụng giá trị gần nhất, trung vị,…
# Để minh họa các thủ tục dữ liệu bị thiếu trước tiên chuyển một số mục nhập BEBROOMS thành giá trị bị thiếu sau đó điền những giá trị thiếu nà bằng giá trị trung bình của nó.
rows.to.missing <- sample(row.names(westroxbury), 10)
westroxbury[rows.to.missing,]$BEDROOMS <- NA
summary(westroxbury$BEDROOMS) # Hiện tại có 10 giá trị bị thiếu.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.00 3.00 3.00 3.23 4.00 9.00 10
# Giá trị trung bình là 3
# Thay thế những giá trị bị thiếu thành những giá trị trung bình
# sử dụng hàm median() with na.rm = TRUE để chuyển những giá trị bị thiếu thành những giá trị trug bình.
westroxbury[rows.to.missing,]$BEDROOMS <- median(westroxbury$BEDROOMS, na.rm = TRUE)
summary(westroxbury$BEDROOMS)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 3.00 3.00 3.23 4.00 9.00
Phân phối chuẩn và giảm chiều dữ liệu là một yêu cầu thường thấy của người phân tích dữ liệu, để chuẩn hóa một dữ liệu ta lấy giá trị biến trừ đi giá trị trung bình sau đó chia cho độ lệch chuẩn. Hàm Scale() trong R có thể thực hiện thao tác này, đây còn được gọi là Z chuẩn hóa là dạng đưa tất các các biến về cùng một dạng thang đo. Một dạng khác là đưa tất cả các biến về dạng [0,1]. Điều này thực hiện bằng cách trừ đi giá trị nhỏ nhất và sau đó chia cho số lượng quan sát, trong R chúng ta có thể thực hiện bằng hàm rescale(). Hơn hết, chúng ta thay đổi kiểu dữ liệu để thực hiện phân tích tốt hơn.
Trong quá trình học tập có giám sát chúng ta thường muốn biết được hiệu quả của việc học tập này như thế nào khi ứng dụng vào dữ liệu mới. So sánh hiệu suất hoạt động của mô hình. Nếu mô hình học tập ban đầu có quá nhiều biến thì nguy cơ bị overfiting xảy ra cao hơn. Để giải quyết vấn đề bị overfiting chúng ta có thể phân chia dữ liệu của mình thành các lớp dữ liệu khác nhau, việc thực hiện này phải là ngẫu nhiên.
# Sử dụng set.seed() để tạo các nhóm dữ liệu giống nhau trong R
set.seed(1)
## Phân vùng thành 2 nhóm: Đào tạo (60%) và xác nhận (40%)
# lấy ngẫu nhiên 60% để đào tạo và 40% để xác nhận
train.rows <- sample(rownames(westroxbury), dim(westroxbury)[1]*0.6)
# gộp tất cả những cột ID có hàng huấn luyện vào tập huấn luyện
train.data <- westroxbury[train.rows, ]
# Gán các ID hàng chưa có trong tập huấn luyện vào xác thực
valid.rows <- setdiff(rownames(westroxbury), train.rows)
valid.data <- westroxbury[valid.rows, ]
# Mã thay thế để xác thực (chỉ hoạt động khi tên hàng là số)
# Thu thập tất các những cột không có ID hàng huấn luyện vào tập xác thức
#valid.data <- westroxbury[-train.rows, ] # does not work in this case
## phân vùng thành training (50%), validation (30%), test (20%)
# randomly sample 50% of the row IDs for training
train.rows <- sample(rownames(westroxbury), dim(westroxbury)[1]*0.5)
# mẫu 30% ID hàng trong tập xác thực, chỉ lấy từ các bản ghi
# chưa có trong tập huấn luyện
# sử setdiff() để tìm các bản ghi chưa có trong tập huấn luyện
valid.rows <- sample(setdiff(rownames(westroxbury), train.rows),
dim(westroxbury)[1]*0.3)
# chỉ định 20% ID hàng còn lại dùng làm thử nghiệm
test.rows <- setdiff(rownames(westroxbury), union(train.rows, valid.rows))
# Tạo 3 khung dữ liệu bằng cách thu thập tất cả các cột từ các hàng thích hợp
train.data <- westroxbury[train.rows, ]
valid.data <- westroxbury[valid.rows, ]
test.data <- westroxbury[test.rows, ]
Việc khai thác các thủ tục: Hồi quy đa tuyến:
reg <- lm(TOTAL_VALUE ~ ., data = westroxbury, subset = train.rows)
tr.res <- data.frame(train.data$TOTAL_VALUE, reg$fitted.values, reg$residuals)
head(tr.res)
## train.data.TOTAL_VALUE reg.fitted.values reg.residuals
## 1886 356.7 356.7174 -0.017443731
## 3515 333.3 333.2672 0.032786258
## 460 298.6 298.6112 -0.011213163
## 855 265.3 265.3050 -0.004994979
## 4094 575.1 575.0798 0.020195188
## 3581 348.0 347.9750 0.025022051
RMS (RMSE) - root mean squarederror lỗi trung bình bình phương là một hàm chi phí trên cơ sở xác định hiệu suất mô hình trong việc đưa ra dự đáon hoặc tìm ước tính. Giá trị này càng gần với 0, mô hình của càng tốt. RMSE được tính toán trên dữ liệu ước tính/ dự đoán bằng cách so sánh nó với các giá trị thực.
pred <- predict(reg, newdata = valid.data)
vl.res <- data.frame(valid.data$TOTAL_VALUE, pred, residuals =
valid.data$TOTAL_VALUE - pred)
head(vl.res)
## valid.data.TOTAL_VALUE pred residuals
## 1 318.0 318.0047 -0.004673323
## 2 498.7 498.6882 0.011815989
## 3 331.8 331.8371 -0.037078438
## 4 371.9 371.8998 0.000226353
## 5 436.2 436.2079 -0.007861767
## 6 280.2 280.1660 0.034003966
Tính chính xác của mô hình ra sao
library(forecast)
# máy tính tính độ chính xác của bảng đào tạo
accuracy(reg$fitted.values, train.data$TOTAL_VALUE)
## ME RMSE MAE MPE MAPE
## Test set 6.858406e-17 0.02273259 0.01969253 2.70331e-06 0.005303581
# tính độ chính xác của bảng kiểm tra
pred <- predict(reg, newdata = valid.data)
accuracy(pred, valid.data$TOTAL_VALUE)
## ME RMSE MAE MPE MAPE
## Test set -0.0001658837 0.02300693 0.01984708 -9.549559e-05 0.005331568
Chọn mô hình có lỗi thấp nhất trong các mô hình. Sau khi mô hình tốt nhất được chọn thì mô hình đó sẽ áp dụng cho dữ liệu mới để dự đoán tổng giá trị cho những ngôi nhà không xác định.
Kết thúc chương 1 về vấn đề mở đầu với khai phá dữ liệu.
Vẫn còn tiếp