Khóa học
Trong hướng dẫn này, tôi sẽ dẫn bạn qua cách tạo và tùy chỉnh biểu đồ tần suất (histogram) trong ngôn ngữ R. Chúng ta sẽ đề cập histogram là gì, cách chuẩn bị dữ liệu, cách dựng một histogram cơ bản, và cách điều chỉnh màu sắc, nhãn, số ngăn (bins) và giới hạn trục.
Chúng ta sẽ dùng base R mà không cần gói bổ sung. Cách này đặc biệt hữu ích khi bạn không thể dùng thêm gói hoặc khi cần phân tích thăm dò nhanh. Trong các trường hợp khác, bạn có thể cân nhắc dùng ggplot2, như đã đề cập trong hướng dẫn Cách tạo biểu đồ tần suất ggplot2 trong R.
Tóm tắt nhanh
-
Dùng
hist(x)để tạo một histogram cơ bản trong base R mà không cần gói bổ sung -
Tùy chỉnh giao diện với
col(màu tô),border(viền),main(tiêu đề),xlabvàylab -
Kiểm soát cách chia ngăn bằng đối số
breaks: truyền một số, một vector mốc chia, hoặc tên phương pháp ("Sturges","Scott","Freedman-Diaconis") -
Chồng các thống kê mô tả bằng
abline()cho giá trị trung bình vàlines(density())cho đường mật độ -
Với histogram theo nhóm hoặc chất lượng xuất bản, hãy chuyển sang
ggplot2
Histogram là gì?
Histogram là một biểu đồ cho thấy phân bố tần suất của các biến liên tục (số). Histogram cho phép chúng ta thấy số quan sát trong dữ liệu rơi vào các khoảng giá trị mà biến bao phủ.
Histogram trông giống biểu đồ cột. Khác biệt chính là biểu đồ cột gắn giá trị với một danh mục cụ thể hoặc biến rời rạc, trong khi histogram trực quan hóa tần suất cho các biến liên tục.
Chuẩn bị dữ liệu cho histogram
Chúng ta sẽ dùng bộ dữ liệu nhà ở bao gồm thông tin về các tin rao bán nhà, như diện tích, số phòng, giá và vị trí. Ta có thể đọc dữ liệu bằng hàm read.csv(), trực tiếp từ URL hoặc tải tệp csv về một thư mục rồi đọc từ bộ nhớ cục bộ. Ta cũng có thể chỉ định chỉ lưu các cột dùng trong hướng dẫn này: price và condition.
home_data <- read.csv("https://raw.githubusercontent.com/rashida048/Datasets/master/home_data.csv")[ ,c('price', 'condition')]
Hãy xem vài dòng đầu của dữ liệu bằng hàm head().
head(home_data, 5)

Tạo histogram với Base R
Tiếp theo, chúng ta sẽ tạo một histogram bằng hàm hist() để xem phân bố giá trong bộ dữ liệu.
hist(home_data$price)
Histogram cơ bản của giá nhà. Ảnh: Tác giả.
Thêm thống kê mô tả
Chúng ta có thể thêm các thống kê mô tả vào histogram bằng hàm abline(). Hàm này thêm một đường thẳng đứng vào biểu đồ.
-
Đặt đối số
vbằng vị trí trên trục x cho đường thẳng đứng. Ở đây, ta lấy giá nhà trung bình bằngmean(). -
Đối số
colđặt màu đường, ở đây là đỏ. -
Đối số
lwdđặt độ dày đường. Giá trị 3 làm đường dày hơn để dễ thấy.
hist(home_data$price)
abline(v = mean(home_data$price), col='red', lwd = 3)
Vẽ đường mật độ xác suất
Để thêm đường mật độ xác suất vào histogram, trước hết ta đổi trục y sang tỉ lệ mật độ. Trong lời gọi hist(), đặt đối số probability thành TRUE.
Đường mật độ xác suất được tạo bằng kết hợp density(), hàm tính vị trí đường cong mật độ, và lines(), hàm thêm đường vào biểu đồ hiện có.
hist(home_data$price, probability = TRUE)
abline(v = mean(home_data$price), col='red', lwd = 3)
lines(density(home_data$price), col = 'green', lwd = 3)

Histogram giá nhà với giá trị trung bình được làm nổi bật. Ảnh: Tác giả.
Lưu ý rằng các con số trên trục y đã thay đổi.
Tùy chỉnh màu sắc
Tham số col của hist() đặt màu tô của các cột, và border đặt màu viền. Ở đây tôi sẽ đặt màu tô là xanh dương và viền là trắng.
hist(home_data$price, col = 'blue', border = "white")
Histogram giá nhà với màu sắc. Ảnh: Tác giả.
Thêm nhãn và tiêu đề
Chúng ta có thể thay đổi nhãn trên biểu đồ để dễ đọc và trình bày hơn. Điều này hữu ích khi bạn chia sẻ biểu đồ với người khác.
-
xlabđặt nhãn trục x -
ylabđặt nhãn trục y -
mainđặt tiêu đề biểu đồ
hist(home_data$price, xlab = 'Price (USD)', ylab = 'Number of Listings', main = 'Distribution of House Prices')
Histogram giá nhà với nhãn trục. Ảnh: Tác giả.
Chia ngăn bằng breaks
Với các đối số mặc định, thật khó để thấy trọn vẹn phân bố giá nhà trên toàn dải giá. Ta thấy chúng tập trung ở vài ngăn đầu, nhưng chưa mấy diễn giải được.
Ta có thể thêm nhiều ngăn hơn bằng tham số breaks. Với đối số này, ta có thể truyền một vector các mốc chia cụ thể, một hàm tính mốc chia, một số lượng ngăn mong muốn, hoặc một hàm tính số ô.
Trong ví dụ này, ta sẽ truyền số ngăn mong muốn. Con số này phụ thuộc ngữ cảnh dựa trên điều bạn muốn thể hiện trong biểu đồ.
hist(home_data$price, breaks = 100)
Histogram giá nhà với bề rộng ngăn thay đổi. Ảnh: Tác giả.
Với breaks đặt là 100, chúng ta nhìn rõ hơn đáng kể phân bố trong vài nhóm đầu.
Ta cũng có thể chỉ định số ngăn bằng tên các phép tính thường dùng để xác định số ngăn tối ưu cho histogram. Mặc định, hist() dùng phương pháp “Sturges”. Ở đây ta chỉ định rõ phương pháp.
hist(home_data$price, breaks = "Sturges")
Histogram giá nhà dùng phương pháp Sturges. Ảnh: Tác giả.
Ta cũng có thể truyền “Scott” làm đối số cho thuộc tính breaks để dùng phương pháp Scott.
hist(home_data$price, breaks = "Scott")

Histogram giá nhà dùng phương pháp Scott. Ảnh: Tác giả.
Cuối cùng, ta cũng có thể dùng phương pháp Freedman-Diaconis (FD).
hist(home_data$price, breaks = "Freedman-Diaconis")
Histogram giá nhà dùng phương pháp Freedman-Diaconis. Ảnh: Tác giả.
So sánh các phương pháp chia ngăn
Bảng dưới đây tóm tắt ba phương pháp chia ngăn có tên sẵn trong hist(). Mặc định là Sturges.
| Phương pháp | Cách hoạt động | Phù hợp nhất cho |
|---|---|---|
| Sturges | Số ngăn = 1 + log₂(n). Giả định dữ liệu xấp xỉ chuẩn. | Tập dữ liệu nhỏ đến vừa, phân bố gần chuẩn |
| Scott | Bề rộng ngăn = 3,49 × sd × n⁻¹ᐟ³. Tối thiểu hóa sai số bình phương trung bình tích phân. | Dữ liệu phân bố chuẩn, khi phương sai quan trọng |
| Freedman-Diaconis | Bề rộng ngăn = 2 × IQR × n⁻¹ᐟ³. Dùng khoảng tứ phân vị thay cho độ lệch chuẩn. | Dữ liệu lệch hoặc có ngoại lệ |
Đặt giới hạn trục
Chúng ta có thể đặt giới hạn trục x của biểu đồ bằng đối số xlim để phóng to vùng dữ liệu quan tâm. Ví dụ, đôi khi hữu ích khi tập trung vào phần trung tâm của phân bố, thay vì phần đuôi dài như khi xem toàn bộ biểu đồ.
Thay đổi giới hạn trục y cũng khả thi (dùng đối số ylim), nhưng điều này ít hữu ích với histogram vì các giá trị tính tự động hầu như luôn hợp lý.
Chúng ta sẽ phóng to khoảng giá từ $0 đến $2M.
hist(home_data$price, breaks = 100, xlim = c(0, 2000000))
Histogram giá nhà với giới hạn trục thay đổi. Ảnh: Tác giả.
Các bước tiếp theo trong trực quan hóa histogram
Khi bạn quen hơn với R, bạn có thể thử các gói trực quan hóa chuyên dụng mang lại nhiều quyền kiểm soát hơn về thẩm mỹ, bố cục và tính tương tác. Thư viện rất phổ biến và dễ dùng để vẽ trong R là ggplot2. Dưới đây, chúng ta tạo một góc nhìn thú vị về phân bố giá theo số phòng ngủ của ngôi nhà.
Histogram giá nhà dùng ggplot2. Ảnh: Tác giả.
ggplot2 là gói trực quan hóa được dùng rộng rãi nhất trong R. Bạn có thể học cách tạo histogram với gói này trong hướng dẫn Cách tạo biểu đồ tần suất ggplot2 trong R, hoặc khám phá hướng dẫn Đồ họa với ggplot2 để có phần giới thiệu rộng hơn. Xem thêm khóa Nhập môn ggplot2 và ggplot2 trung cấp để học sâu hơn.
Kết luận
Trong hướng dẫn này, chúng ta đã học rằng histogram là trực quan hóa tuyệt vời để xem phân bố của các biến liên tục. Chúng ta đã học cách tạo histogram trong R, cách vẽ các thống kê tóm tắt lên trên histogram, cách tùy chỉnh các yếu tố như tiêu đề trục, màu sắc, cách chia ngăn trên trục x và cách đặt giới hạn trục. Cuối cùng, chúng ta đã minh họa phần nào sức mạnh của thư viện ggplot2.
Để đọc thêm trên DataCamp và tham khảo tài nguyên, hãy xem các khóa học tương tác sau:
Tác giả về Khoa học Dữ liệu | Chuyên viên Phân tích Tiếp thị Kỹ thuật Cấp cao tại Wayfair | Thạc sĩ Khoa học Dữ liệu tại University of Pennsylvania
