
Trong hướng dẫn này, bạn sẽ khám phá một số phương pháp trực quan hóa dữ liệu và những thống kê nền tảng của chúng. Đặc biệt là cách nhận diện xu hướng và mối quan hệ giữa các biến trong một data frame.
Đúng vậy, bạn sẽ tập trung vào các khái niệm như tương quan và hồi quy! Trước hết, bạn sẽ được giới thiệu về tương quan trong R. Sau đó, bạn sẽ xem cách vẽ ma trận tương quan trong R bằng các gói như ggplot2 và GGally. Cuối cùng, bạn sẽ thấy các loại tương quan khác nhau và ý nghĩa của chúng đối với phân tích tiếp theo của bạn.
Nếu bạn muốn đào sâu hơn chủ đề này, hãy cân nhắc khóa học Tương quan và Hồi quy của DataCamp.
Bối cảnh
Trong bài hướng dẫn hôm nay, bạn sẽ làm việc với một tập dữ liệu về phim lấy từ Kaggle để khám phá cách hiểu rõ hơn mối quan hệ giữa các biến.
Tôi đã tinh chỉnh nhẹ dữ liệu để phân tích được “táo so với táo” bằng cách đảm bảo những thứ như đơn vị tiền tệ dùng cùng chuẩn. Nếu không có bước đó, phân tích thống kê của chúng ta với các biến như gross, budget và profit sẽ gây hiểu nhầm. Bạn có thể truy cập tập dữ liệu gốc.
Nhập dữ liệu
Để truy cập tập dữ liệu movies và sử dụng nó, bạn có thể dùng hàm read.csv() để nhập dữ liệu vào một data frame và lưu vào biến với cái tên “độc đáo” movies!
movies <- read.csv(url("http://s3.amazonaws.com/dcwoods2717/movies.csv"))
Chỉ vậy là bạn có thể bắt đầu rồi!
Khám phá dữ liệu cơ bản
Một ý hay là sau khi đã nhập data frame, bạn nên có cái nhìn tổng quan về dữ liệu. Trước hết, hãy xem cấu trúc dữ liệu đang được khảo sát. Bên dưới là kết quả khi dùng hàm cực kỳ đơn giản mà hữu ích str():
str(movies)
## 'data.frame': 2961 obs. of 11 variables:
## $ title : Factor w/ 2907 levels "10 Cloverfield Lane",..: 1560 2143 34 2687 1405 1896 2633 894 1604 665 ...
## $ genre : Factor w/ 17 levels "Action","Adventure",..: 6 12 5 5 5 3 2 8 3 8 ...
## $ director : Factor w/ 1366 levels "Aaron Schneider",..: 474 472 781 828 175 1355 1328 1328 968 747 ...
## $ year : int 1920 1929 1933 1935 1936 1937 1939 1939 1940 1946 ...
## $ duration : int 110 100 89 81 87 83 102 226 88 144 ...
## $ gross : int 3000000 2808000 2300000 3000000 163245 184925485 22202612 198655278 84300000 20400000 ...
## $ budget : int 100000 379000 439000 609000 1500000 2000000 2800000 3977000 2600000 8000000 ...
## $ cast_facebook_likes: int 4 109 995 824 352 229 2509 1862 1178 2037 ...
## $ votes : int 5 4546 7921 13269 143086 133348 291875 215340 90360 6304 ...
## $ reviews : int 2 107 162 164 331 349 746 863 252 119 ...
## $ rating : num 4.8 6.3 7.7 7.8 8.6 7.7 8.1 8.2 7.5 6.9 ...
Trong data frame này, từ console bạn có thể thấy có 2961 quan sát của 11 biến.
Nhân tiện, kể cả nếu mỗi bộ phim chỉ dài một giờ, bạn sẽ phải xem phim liên tục hơn bốn tháng mới hết tất cả!
Console cũng liệt kê tên từng biến, lớp của biến, và một vài giá trị ví dụ. Điều này giúp ta có cái nhìn khá rõ về nội dung của data frame, mà hiểu được điều đó là rất quan trọng cho nỗ lực phân tích.
Một hàm tuyệt vời khác giúp tổng quan nhanh ở mức cao về data frame là summary(). Lưu ý những điểm giống và khác giữa kết quả của str().
summary(movies)
## title genre
## Home : 3 Comedy :848
## A Nightmare on Elm Street : 2 Action :738
## Across the Universe : 2 Drama :498
## Alice in Wonderland : 2 Adventure:288
## Aloha : 2 Crime :202
## Around the World in 80 Days: 2 Biography:135
## (Other) :2948 (Other) :252
## director year duration
## Steven Spielberg : 23 Min. :1920 Min. : 37.0
## Clint Eastwood : 19 1st Qu.:1999 1st Qu.: 95.0
## Martin Scorsese : 16 Median :2004 Median :106.0
## Tim Burton : 16 Mean :2003 Mean :109.6
## Spike Lee : 15 3rd Qu.:2010 3rd Qu.:119.0
## Steven Soderbergh: 15 Max. :2016 Max. :330.0
## (Other) :2857
## gross budget cast_facebook_likes
## Min. : 703 Min. : 218 Min. : 0
## 1st Qu.: 12276810 1st Qu.: 11000000 1st Qu.: 2241
## Median : 34703228 Median : 26000000 Median : 4604
## Mean : 58090401 Mean : 40619384 Mean : 12394
## 3rd Qu.: 75590286 3rd Qu.: 55000000 3rd Qu.: 16926
## Max. :760505847 Max. :300000000 Max. :656730
##
## votes reviews rating
## Min. : 5 Min. : 2.0 Min. :1.600
## 1st Qu.: 19918 1st Qu.: 199.0 1st Qu.:5.800
## Median : 55749 Median : 364.0 Median :6.500
## Mean : 109308 Mean : 503.3 Mean :6.389
## 3rd Qu.: 133348 3rd Qu.: 631.0 3rd Qu.:7.100
## Max. :1689764 Max. :5312.0 Max. :9.300
##
Chỉ với một lệnh, bạn đã để R trả về một số thông tin thống kê then chốt cho mỗi biến trong data frame. Giờ thì khi đã biết mình đang làm việc với gì, hãy đào sâu và khám phá dữ liệu thêm nhé!
Kỹ thuật đặc trưng: Tính lợi nhuận
Xem xét các biến hiện có, có vẻ một số biến số có thể thao tác để mang lại góc nhìn mới cho data frame.
Chẳng hạn, bạn có biến gross và budget, vậy tại sao không dùng một chút tính toán để ra lợi nhuận cho mỗi bộ phim?
Bạn có thể tính lợi nhuận bằng công thức profit = gross - budget. Hãy thử trong ô DataCamp Light bên dưới!
Tuyệt!
Bạn có thể thấy có khá nhiều phim “hái ra tiền” và cũng không ít “hố lỗ” trong data frame.
profit của các phim có lẽ sẽ hữu ích cho vài phân tích thú vị sau này, nên hãy thêm profit như một cột mới vào data frame.
Tương quan
Giờ khi profit đã được thêm như một cột mới trong data frame, đã đến lúc xem kỹ hơn các mối quan hệ giữa những biến trong tập dữ liệu.
Hãy xem profit biến động như thế nào so với rating của mỗi bộ phim.
Cho việc này, bạn có thể dùng các hàm dựng sẵn của R là plot và abline, trong đó plot sẽ cho biểu đồ phân tán và abline sẽ thêm đường hồi quy hay “đường hồi quy tốt nhất” do ta truyền mô hình tuyến tính như bạn sẽ thấy bên dưới.
Kết quả có đúng như bạn kỳ vọng không?

Nhìn chung, có vẻ các phim có rating cao hơn có xu hướng profit cao hơn. Nói cách khác, tồn tại một tương quan dương giữa rating và profit, ít nhất là trong data frame của chúng ta.
Tuy vậy, chỉ thoáng nhìn đồ thị cũng thấy có nhiều phim được đánh giá rất cao nhưng không hẳn là bom tấn, và cũng có nhiều phim lợi nhuận rất lớn nhưng điểm đánh giá lại khá thấp.
Tương quan KHÔNG đồng nghĩa với quan hệ nhân quả!
Một giai thoại giúp phân biệt tương quan và nhân quả như sau: Tôi bán kem ở bãi biển. Số người băng qua đường sai luật trong thành phố có xu hướng tăng khi doanh số kem của tôi tăng, nhưng liệu kem của tôi có làm người ta phớt lờ luật giao thông, hay do yếu tố khác? Kem của tôi quả là ngon, nhưng nắng đẹp ngoài trời có lẽ khiến người ta vừa muốn ăn kem vừa không muốn đứng dưới nắng ở vạch qua đường. Có tồn tại mối liên hệ (tương quan) giữa doanh số kem và số người băng qua đường sai luật, nhưng bạn không thể khẳng định đó là quan hệ nhân quả.
Hãy ghi nhớ cách lập luận này khi bạn tiếp tục với hướng dẫn!
Tính tương quan trong R
Vậy có những kiểu quan hệ nào giữa các biến trong movies, và bạn có thể đánh giá định lượng những quan hệ đó thế nào?
Cách đầu tiên là tạo các hệ số tương quan và ma trận tương quan với cor():
Lưu ý bạn cũng có thể chỉ định phương pháp để xác định hệ số tương quan muốn tính. Hãy cẩn thận, vì luôn có những giả định đi kèm: phương pháp Kendall và Spearman chỉ phù hợp với dữ liệu có thứ tự. Điều này nghĩa là bạn cần sắp xếp dữ liệu trước khi tính hệ số tương quan.
Thêm nữa, phương pháp mặc định là tương quan Pearson, giả định rằng các biến của bạn phân phối chuẩn, tồn tại quan hệ tuyến tính giữa từng cặp biến và dữ liệu phân phối chuẩn quanh đường hồi quy.
Cũng lưu ý bạn có thể dùng rcorr() trong gói Hmisc để tính mức ý nghĩa cho tương quan Pearson và Spearman.
Bạn cũng sẽ thấy ma trận tương quan thực chất là một bảng hiển thị hệ số tương quan giữa các tập biến. Đây đã là một cách rất hay để nắm bắt sơ bộ những quan hệ nào tồn tại giữa các biến trong tập dữ liệu, nhưng ta sẽ đào sâu hơn ở phần tiếp theo.
Khám phá tương quan trực quan: Ma trận tương quan trong R
Ở bước tiếp theo này, bạn sẽ vẽ một ma trận tương quan dùng các biến có trong data frame movies. Biểu đồ đơn giản này giúp bạn nhanh chóng hình dung biến nào có tương quan âm, dương, yếu hay mạnh với các biến khác.
Để làm điều này, bạn sẽ dùng một gói tiện lợi tên là GGally và hàm ggcorr().
Dạng lời gọi hàm là ggcorr(df), trong đó df là tên data frame bạn áp dụng. Kết quả là một ma trận hình tam giác, mã màu và có nhãn tên biến. Hệ số tương quan của mỗi biến so với biến khác có thể tìm bằng cách đọc theo hàng và/hoặc cột của ma trận, tùy vị trí biến trong ma trận.
Nghe có vẻ rắc rối, nhưng thực tế rất đơn giản, hãy thử ở ô mã sau!

Trong ma trận tương quan bạn vừa tạo (làm tốt lắm!), bạn có thể chuyển tới hàng hoặc cột ứng với một biến như year và xem hệ số tương quan của nó qua màu ô tương ứng với biến khác.
Ví dụ khi xem year, bạn sẽ thấy có tương quan dương yếu với budget và tương quan âm yếu tương tự với rating.
Các hệ số tương quan luôn nằm trong khoảng từ -1 đến 1, bao gồm cả hai đầu. Hệ số -1 cho biết sự khớp âm hoàn hảo, trong đó giá trị y giảm đúng bằng tốc độ x tăng. Hệ số 1 cho biết sự khớp dương hoàn hảo, trong đó giá trị y tăng đúng bằng tốc độ x tăng.
Trong đa số trường hợp, như ví dụ year ở trên, hệ số tương quan sẽ nằm đâu đó giữa -1 và 1.
Bạn có nhận ra điều gì hơi lạ về các biến hiển thị trong ma trận tương quan không?
Không phải tất cả biến trong movies đều có mặt!
Đó là vì không phải biến nào trong movies cũng là số. Hàm ggcorr tự động bỏ qua biến không phải số, tiết kiệm thời gian cho người dùng khỏi phải “lọc bỏ” chúng trước khi tạo ma trận.
Nếu bạn muốn ma trận tương quan “nổi bật” hơn (hoặc bạn hơi mù màu như tôi), có vài tinh chỉnh đơn giản để tạo các ma trận trực quan, giàu thông tin hơn.
Trong ô mã sau, bạn thêm tham số label, có thể đặt bằng TRUE hoặc FALSE. Mặc định là FALSE, nhưng nếu thêm label = TRUE, hệ số tương quan của mỗi quan hệ sẽ được hiển thị trong ô tương ứng. Nhờ vậy bạn không phải đoán giá trị dựa vào thang màu.
Tham số label_alpha cho phép tăng/giảm độ mờ của từng nhãn dựa trên độ mạnh của hệ số tương quan. Điều này rất hữu ích cho phân tích trực quan nhanh.
Đừng chỉ nghe tôi nói, hãy tự thử!
Giờ hãy vẽ một ma trận tương quan “ngon” hơn:

Ở các biểu đồ tiếp theo, bạn sẽ thấy khi vẽ một quan hệ “mạnh”, độ dốc của đường hồi quy (x/y) sẽ gần 1/1 hoặc -1/1 hơn, trong khi quan hệ “yếu” có đường hồi quy gần như không dốc. Độ dốc gần 1/1 hoặc -1/1 ngụ ý hai biến có liên hệ chặt chẽ.
Với data frame movies, một đường hồi quy như vậy có thể đem lại góc nhìn mạnh mẽ về bản chất các biến và có thể cho thấy sự phụ thuộc lẫn nhau giữa chúng.
Ví dụ, ở biểu đồ profit theo rating trước đó, bạn thấy đường hồi quy có độ dốc dương vừa phải. Nhìn lại ma trận tương quan, bạn thấy hệ số tương quan của hai biến này là 0.3.
Hợp lý, phải không?
Các loại tương quan
Giờ hãy xem thêm những biểu đồ minh họa các loại tương quan khác nhau mà bạn đã thấy ở phần trước!
Tương quan mạnh: Vẽ Votes so với Reviews
Hãy bắt đầu bằng cách vẽ hai biến có tương quan dương mạnh.
Dựa vào ma trận tương quan, có vẻ votes so với reviews đáp ứng tiêu chí với giá trị tương quan 0.8. Nghĩa là độ dốc của ta sẽ tương đối gần 1/1.
Bạn sẽ dùng gói ggplot2 trong bài tập này và các bài sau. Gói ggplot2 là bộ công cụ linh hoạt để tạo các trực quan hóa dữ liệu hấp dẫn.
Trong trường hợp này, bạn sẽ tận dụng hàm qplot trong ggplot2, có thể tạo nhiều loại biểu đồ tùy kiểu được truyền vào tham số geom (hình học).
Trong ô mã sau, geom được đặt là một vector gồm hai kiểu, point và smooth, trong đó point tạo biểu đồ phân tán và smooth tạo đường xu hướng. Bạn cũng sẽ thấy method đặt là lm, nghĩa là đường xu hướng sẽ là đường hồi quy thẳng quen thuộc như ở biểu đồ profit theo years trước đó.
Tóm lại, bạn sắp thấy việc tạo các trực quan hóa dữ liệu ấn tượng nhanh đến thế nào!

Có thể bạn nhận ra tham số alpha trong hàm qplot ở trên. Việc dùng alpha trong qplot áp dụng một mức độ mờ dần cho các điểm trong biểu đồ phân tán, tương tự cách nó thay đổi độ mờ của nhãn hệ số tương quan trong ggcorr.
Với cấu hình bạn dùng, một điểm chỉ đạt độ đậm hoàn toàn khi bị chồng lên bởi 5 điểm khác. Tăng/giảm mẫu số của alpha sẽ ảnh hưởng số điểm chồng lên cần thiết để thay đổi độ mờ. Lý do dùng thẩm mỹ này là nó giúp người xem nhanh chóng nhận ra nơi có mật độ điểm dữ liệu cao trong biểu đồ, từ đó gợi mở những hiểu biết mới chỉ bằng một cái nhìn.
Cứ thoải mái chỉnh mã và xem nó hoạt động ra sao!
Tương quan yếu: Vẽ Profit theo Years
Giờ hãy xem một tương quan âm “yếu” trông thế nào bằng cách vẽ profit so với years. Lần này không chỉ định method, nên đường xu hướng sẽ thay đổi theo dữ liệu theo kiểu cong (đường fitted), đây là mặc định của hàm. Bạn sẽ thấy dọc theo một số đoạn của đường xu hướng có vùng xám nhạt to nhỏ tùy theo khoảng tin cậy của đường xu hướng.
Nếu bạn chưa quen với khái niệm khoảng tin cậy, đừng lo! R sẽ làm giúp bạn, và khái niệm này sẽ được giải thích rõ hơn sau bài tập này.
Hiện tại, chỉ cần điền mã cần thiết và quan sát!

Giờ khi bạn đã thấy khoảng tin cậy và đường làm mượt hoạt động, bạn rút ra điều gì?
- Thứ nhất, ở phần đầu biểu đồ,
profitdường như tăng theo từngyear. - Thứ hai, bạn nhận thấy vùng xám lệch khỏi đường làm mượt ban đầu khá lớn trong khi số điểm dữ liệu (quan sát) khá ít.
- Thứ ba, khi đường tiến vào vùng có nhiều quan sát hơn, vùng xám thu hẹp và gần như ôm sát đường, rồi đường bắt đầu giảm ở những
yearsau.
Kết luận, vẽ khoảng tin cậy cùng với đường làm mượt cho phép ta thấy mức độ bất định đi kèm với đường hồi quy. Mức bất định đó tăng khi ít quan sát và giảm khi nhiều quan sát.
Điều này rất hữu ích để hình dung mối quan hệ giữa các biến thay đổi thế nào trong toàn bộ data frame và cho thấy mật độ quan sát ảnh hưởng ra sao tới đường vẽ.
Lưu ý là biểu đồ có thể hơi gây hiểu nhầm, vì khó phân biệt bằng mắt thường là tương quan dương hay âm.
Giờ hãy vẽ profit theo year giống như bạn đã vẽ votes so với reviews: chỉ cần thay “…..” trong từng tham số để year nằm trên trục x và profit trên trục y. Nhớ chỉ định data frame cho “data” nhé!

Nhìn lại ma trận tương quan, bạn thấy hệ số tương quan của profit và year là -0.1, có lẽ dễ hình dung hơn ở biểu đồ có đường hồi quy tốt nhất so với biểu đồ dùng đường fitted cong.
Kết nối mọi thứ
Giờ hãy xem một hàm mạnh khác trong GGally là ggpairs. Hàm này rất hay vì cho phép tạo một ma trận hiển thị hệ số tương quan của nhiều biến cùng với biểu đồ phân tán (kèm đường hồi quy tốt nhất và khoảng tin cậy) và biểu đồ mật độ.
Chỉ với một hàm, bạn có thể gói gọn mọi thứ trong hướng dẫn này một cách ngắn gọn và dễ hiểu.
Trong ô mã sau, chọn ba biến bạn thích nhất từ data frame (không cần lọc!), cắm vào và trải nghiệm!

Như bạn đoán, có rất nhiều kịch bản mỗi loại biểu đồ là tối ưu – chìa khóa là học các kỹ thuật trực quan hóa sẵn có, cách dùng chúng, và ý nghĩa của kết quả!
Tiếp tục
Bạn đã đi qua rất nhiều nội dung trong hướng dẫn này, chúc mừng bạn đã hoàn thành đến cuối!
Hy vọng bạn có thể áp dụng các khái niệm này vào những hành trình phân tích của riêng mình! Đây thật sự là những nền tảng của khám phá dữ liệu trong R và còn rất nhiều thứ bạn có thể làm để hiểu dữ liệu tốt trước khi bắt đầu phân tích và mô hình hóa. Sao không nâng tầm nỗ lực của bạn và bắt đầu khóa Phân tích Dữ liệu Khám phá của DataCamp?
Trong lúc đó, tôi khuyến khích bạn ghé Kaggle và tìm một tập dữ liệu phong phú, thú vị để tự mình khám phá nếu bạn không muốn tiếp tục với tập movies!