TouchAI10Days_Draft_YourNam...
Có thể bạn quan tâm
- Home
- TouchAI10Days_Draft_YourName_yourphonenumber_20200626.pdf

- Author / Uploaded
- Tung Lam Nguyen
Đây là eBook của riêng bạn – đề nghị không chia sẻ cho ai khác! Giới thiệu Hiện tại tôi cảm thất rất may mắn sống trong
Views 1,005 Downloads 229 File size 9MB
Report DMCA / Copyright
DOWNLOAD FILE
Citation preview
Đây là eBook của riêng bạn – đề nghị không chia sẻ cho ai khác! Giới thiệu Hiện tại tôi cảm thất rất may mắn sống trong cuộc cách mạng công nghiệp lần thứ 4. Từ khóa mà tôi, bạn và hầu hết mọi người được nghe nói tới gần đây là Trí tuệ nhân tạo (AI – Artificial Intelligent), một cuộc cách mạng rất đặc biệt. (Nguồn: Internet) Cuốn eBook này được ra đời trong bối cảnh của một người mong muốn mang kiến thức về khoa học máy tính để đem lại giá trị cho khách hàng của mình. Tính từ năm 1998 khi tôi đi làm bán thời gian trong thời sinh viên đến bây giờ thì khái niệm “khách hàng” trong suy nghĩ của tôi cũng thay đổi nhiều: Ban đầu, khách hàng của tôi chính là Khách hàng của công ty tôi làm bán thời gian. Vài năm sau tôi hiểu và bổ sung thêm vào khái niệm Khách hàng bao gồm luôn cả công ty mà tôi đã và đang làm. Rồi vài năm sau nữa tôi hiểu các Đồng nghiệp, của tôi cũng chính là Khách hàng. Khi tôi nhận lời đi chia sẻ kiến thức, kinh nghiệm thực tiễn cho các lớp về Công nghệ thông tin thì Sinh viên chính là Khách hàng của tôi. Đặc biệt trong cuộc sống, tôi nhận ra Người bạn đời của mình cũng chính là Khách hàng của mình. Việc chăm sóc khách hàng như thế nào thì thú thật tôi phải học tập nhiều từ những người làm kinh doanh. Chủ đề khách hàng không nằm trong nội dung cuốn sách này. Nhưng qua đây, tôi rất cám ơn các khách hàng của mình. Nếu không có họ thì cuốn eBook này khó có thể ra đời ngay tại thời điểm này. Đặc biệt tôi biết ơn anh Nguyễn Văn Tuấn – người đã truyền cảm hứng cho tôi từ các lớp học, từ các chia sẻ của anh về Phân tích dữ liệu. Tôi cám ơn các Khách hàng đã thật sự tin cậy và đặt hàng ngay khi kế hoạch của eBook được phát thảo. Về cách trình bày nội dung của cuốn sách tôi sẽ viết theo phong cách của người đi làm, các từ ngữ chuyên môn thì tôi cố gắng giữ nguyên bản gốc tiếng Anh. Vì vậy câu cú có thể bao gồm cả tiếng Anh và tiếng Việt với mục tiêu cốt lõi là để bạn đọc nắm được vấn đề và tham khảo thêm tài liệu tiếng Anh sau này cũng dễ dàng hơn. Dù tôi sẽ cố gắng hết sức nhưng chắc chắn trong eBook này không tránh khỏi sai sót. Mọi góp ý xin nhắn về email [email protected] để phiên bản sau hoàn thiện hơn nữa. Lê Ngọc Thạch https://ThachLN.github.com/ebook.html 2 Đây là eBook của riêng bạn – đề nghị không chia sẻ cho ai khác! Chạm tới AI trong 10 ngày Mục lục Giới thiệu ............................................................................................................. ii Quy ước ............................................................................................................... 6 Ngày 1 – Chủ đề: Giới thiệu về ngôn ngữ thống kê, ngôn ngữ lập trình ............ 9 Bài 1: Tóm tắt về thống kê (Statistics) ................................................... 11 Bài 2: Ngôn ngữ lập trình Python và ngôn ngữ thống kê R ................... 17 Bài 3: Ngôn ngữ R và phần mềm RStudio ............................................. 25 Bài 4: Ngôn ngữ Python và phần mềm Anaconda ................................. 40 Bài 5: Cài đặt thêm phần mềm ............................................................... 58 Bài 6: Nhập liệu, biên tập, lưu trữ dữ liệu với R .................................... 60 Bài 7: Nhập liệu, biên tập, lưu trữ dữ liệu với Python ........................... 70 Ngày 2 – Chủ đề: Biểu đồ ................................................................................. 77 Bài 8: Các loại biểu đồ ........................................................................... 79 Bài 9: Vẽ biểu đồ trong R....................................................................... 85 Bài 10: Vẽ biểu đồ trong Python .......................................................... 117 Bài 11: Nguyên tắc soạn biểu đồ .......................................................... 132 Bài 12: Giới thiệu Matplotlib ............................................................... 134 Ngày 3 – Phân tích mô tả ................................................................................ 145 Bài 13: Phân tích mô tả dữ liệu Bank Marketing ................................. 147 Bài 14: So sánh 2 tỉ lệ ........................................................................... 182 Bài 15: Mô hình kiểm định giả thuyết.................................................. 193 Bài 16: Ứng dụng minh họa ................................................................. 194 Ngày 4 – Chủ đề: Dữ liệu lớn.......................................................................... 201 Bài 17: Cách xử lý tập hợp dữ liệu lớn ................................................ 202 Bài 18: Sử dụng Ubuntu ....................................................................... 236 Bài 19: Cài đặt Hadoop ........................................................................ 244 Bài 20: Trải nghiệm Hadoop với R và Python ..................................... 253 Ngày 5 – Chủ đề: Dự báo bằng mô hình hồi qui tuyến tính ........................... 267 Bài 21: Giới thiệu mô hình hồi qui tuyến tính ..................................... 268 Bài 22: Diễn giải mô hình hồi qui tuyến tính ....................................... 275 https://ThachLN.github.com/ebook.html 3 Đây là eBook của riêng bạn – đề nghị không chia sẻ cho ai khác! Bài 23: Mô hình hồi qui tuyến tính đa biến.......................................... 290 Bài 24: Tìm mô hình “tối ưu” .............................................................. 295 Bài 25: Dự báo bằng mô hình hồi qui tuyến tính ................................. 298 Ngày 6 – Chủ đề: Dự báo bằng mô hình hồi qui logistic ................................ 302 Bài 26: Giới thiệu mô hình hồi qui logistic .......................................... 303 Bài 27: Mô hình hồi qui logistic đa biến (Multiple logistic regression model) .............................................................................................................. 309 Bài 28: Tìm mô hình “tối ưu” .............................................................. 314 Bài 29: Dự báo bằng mô hình hồi qui logistic ..................................... 321 Ngày 7 – Chủ đề: Phân tích đa biến ................................................................ 328 Bài 30: Xử lý giá trị trống .................................................................... 329 Bài 31: Mô hình phân tích phân định (Linear discriminant analysis) .. 339 Bài 32: Mô hình thành phần (Principal Component Analysis) ............ 349 Bài 33: Mô hình phân tích cụm/nhóm (cluster analysis) ..................... 359 Ngày 8 – Chủ đề: Machine Learning .............................................................. 370 Bài 34: Giới thiệu Machine learning .................................................... 371 Bài 35: Mô hình SVM .......................................................................... 373 Bài 36: Mô hình Random Forest .......................................................... 386 Bài 37: Mô hình Artificial Neural Network ......................................... 391 Bài 38: Machine Learning với Python Tensorflow .............................. 397 Ngày 9 – Chủ đề: Recommendation................................................................ 426 Bài 39: Giới thiệu phương pháp gợi ý Collaborative filtering ............. 427 Bài 40: Triển phương pháp gợi ý Collaborative filtering bằng R ........ 437 Ngày 10 – Chủ đề: Natural Language Processing ........................................... 443 Bài 41: Các kỹ thuật cơ bản ................................................................. 444 Bài 42: Trích đặc trưng (Feature extraction) ........................................ 449 Bài 43: Giới thiệu ứng dụng phân tích cảm xúc (Sentiment Analysis) 459 Bài 44: Giới thiệu ứng dụng phân tích từ vựng (Word Embbeding) ... 470 Bài 45: Giới thiệu ứng dụng xác định chủ đề (Topic Modeling) ......... 480 Ngày 11 – Chủ đề: Computer Vision .............................................................. 489 Bài 46: Giới thiệu Face recognition ..................................................... 490 Bài 47: Giới thiệu mô hình CNN ......................................................... 505 https://ThachLN.github.com/ebook.html 4 Đây là eBook của riêng bạn – đề nghị không chia sẻ cho ai khác! Ngày 12 – Chủ đề: Nhận diện tiếng nói (Speech Recognition) ...................... 524 Bài 48: Giới thiệu đặc trưng của âm thanh .......................................... 525 Bài 49: Mô hình Chuyển giọng nói thành văn bản .............................. 531 Tạm kết thúc .................................................................................................... 533 https://ThachLN.github.com/ebook.html 5 Chạm tới AI trong 10 ngày Quy ước Một số nội dung trong tài liệu được trình bày với các định dạng khác nhau thì có ý nghĩa của nó, bạn đọc nên nắm thông tin này để tiện theo dõi. Mã nguồn Mã lệnh được viết và đóng khung với font chữ Courier New như sau: print('Xin chào độc giả của ebook Chạm tới AI trong 10 ngày.') print('Welcome to ebook Touch on AI in ten days.') print('{} + {} = {}'.format(1, 2, (1 + 2))) Code cho Python thì cũng tương tự như trên nhưng màu viền bên trái sẽ là vàng đậm như sau: print('Đây là code Python') Bạn có thể sao chép và dán (đôi khi trong tài liệu viết luôn tiếng Anh: copy & paste) vào phần mềm để chạy. Kết quả của lệnh, tùy theo phần mềm bạn sử dụng để chạy mã nguồn thì kết quả sẽ hiển thị ở các vị trí khác nhau. Phần văn bản kết xuất của phần mềm sẽ được trình bày theo khung màu đỏ gạch bên dưới: Xin chào độc giả của ebook Chạm tới AI trong 10 ngày. Welcome to ebook Touch on AI in ten days. 1 + 1 = 4 Lệnh thực thi trong hệ điều hành Trường hợp các lệnh thực thi trong môi trường hệ điều hành (phân biệt với các lệnh, hoặc mã nguồn của chương trình thực thi trong môi trường của R hoặc Python như RStudio hoặc Spyder như đã qui ước ở mục Mã nguồn) thì dấu hiệu như sau: Đối với lệnh thực thi trong dấu nhắc lệnh của Anaconda hoặc trong cửa sổ lệnh CMD của Windows, hoặc trong Terminal của Linux/MacOS thì khung màu vàng có 2 vạch đậm ở cạnh trái và phải như sau: pip install python-docx Cặp dấu nháy Các dữ liệu dạng chuỗi (string, text, char nói chung là có nghĩa giống nhau trong R và Python) được bao đóng trong dấu nháy đơn hoặc dấu nháy đôi. Trên bàn phím máy tính thì dấu nháy trái và phải là giống nhau. Tuy nhiên trong phần mềm soạn thảo văn bản như Microsoft Word thì gặp dấu nháy đơn và đôi được thay thế bằng ‘’, “” để tăng tính thẩm mỹ. Các dấu nháy thẩm mỹ này khác với kí tự ' và " trên bàn phím (phím bên trái phím Enter). https://ThachLN.github.com/ebook.html 6 Chạm tới AI trong 10 ngày Đôi khi bạn copy & paste mã nguồn vào các phần mềm như Microsoft Word thì các dấu nháy có thể bị “trang trí” lại như trên. Vì vậy khi copy mã ngồn từ Microsoft vào các phần mềm chạy R hoặc Python thì hãy thay thế lại cho đúng. Một qui ước khác liên quan đến dấu nháy đôi là khi dùng trong văn bản để bao đóng danh từ riêng, hoặc lệnh như: Bạn hãy thử gõ lệnh “quit()” trong cửa của sổ console để thoát chương trình R Studio. Trong câu hướng dẫn này thì lệnh quit() được gõ vào R Studio KHÔNG bao gồm cặp dấu nháy. Kí hiệu optional (không bắt buộc) Khi sử dụng hàm số thì có nhiều tham số (argument, parameter) không bắt buộc (optional) thì sử dụng cặp dấu ngoặc vuông []. Ví dụ hàm plot bên dưới không bắt buộc tham số x và format: plot([x], y, [format]) Cách viết trình tự bấm chọn menu Khi cần trình bày thứ tự các nút bấm, hoặc các mục cần bấm trong các thao tác thì sẽ dùng dấu lớn hơn >. Ví dụ khi hướng dẫn bạn vào trang web “https://github.com/vncorenlp/VnCoreNLP”, bấm vào nút “Clone”, sau đó bấm tiếp vào nút hoặc link “Download Zip” thì sẽ viết gọn như sau: Bấm vào nút Clone > nút Download Zip, hoặc nút Clone > Download Zip. Các từ viết tắt tiếng Anh thường xuyên được sử dụng trong sách AI: Artificial Intelligent - Trí thông minh nhân tạo. Nhiều người dịch là Trí Tuệ Nhân Tạo. Trong sách này tôi muốn dùng đúng nghĩa Intelligent có là Trí thông minh thôi vì khoảng cách từ Thông Minh đến Tuệ thì rất rất là xa. Trí thông minh nhân tạo tôi cho là phụ hợp nhất trong bối cảnh hiện nay. Có thể bạn và cả tôi quen với cách đọc Trí Tuệ Nhân Tạo vừa gọn và vừa sang. Tuy nhiên nếu khi cần nói thì vẫn nên dùng từ “Thông minh” để phản ánh đúng mức độ của nó để mà còn phấn đấu đến mức “Tuệ”. Đằng nào thi tôi cũng viết là AI thay vì viết tiếng Việt nên chắc không nhầm lẫn. Đường dẫn thư mục (Path) Trong Windows thì dấu cách thư mục là dấu xuyệt trái (back slash). Ví dụ: D\ai2020\data. Tuy nhiên ngôn ngữ R hoặc Python được thiết kế tương thích với các hệ điều hành khác như Macintosh, Linux. Các hệ điều hành thì thì dùng dấu xuyệt phải (right slash) để phân cách thư mục. Ví dụ: /mnt/d/ai2020. Vì vậy khi trình bày đường dẫn thư mục trong câu văn thì đôi lúc dùng \, hoặc đôi lúc dùng / do dữ liệu được minh họa trên Windows hoặc Linux. Nhưng trong mã nguồn (R hoặc Python) thì đều thống nhất là dùng dấu xuyệt phải / như: https://ThachLN.github.com/ebook.html 7 Chạm tới AI trong 10 ngày read.csv("D:/ai2020/data/test.csv") Trong Windows, code R hoặc Python có một cách khác là dùng hai (double) dấu \. Ví dụ: read.csv("D:\\ai2020\\data\\test.csv") Tuy nhiên code này không tương thích trong R và Python trên Linux và cả MacOS nên không khuyến khích dùng. Lời nhắn eBook này là của riêng bạn thông qua mua trực tiếp hoặc được tặng chính thức. Nên bạn được toàn quyền sử dụng và KHÔNG chia sẻ với bất kỳ ai khác nhé, KHÔNG lưu trữ trên internet nói chung để hạn chế đến tay người không thật sự cần nó nhé! Về nội dung bạn thu lượm được từ eBook dưới dạng các bài tóm tắt, đánh giá, hoặc đề nghị bổ sung thì rất được KHUYẾN KHÍCH chia sẻ công khai. Lê Ngọc Thạch https://ThachLN.github.com/ebook.html 8 Chạm tới AI trong 10 ngày Ngày 1 – Chủ đề: Giới thiệu về ngôn ngữ thống kê, ngôn ngữ lập trình Một bức tranh tôi cho là giúp chúng ta có cái nhìn khái quát về các lĩnh vực AI là từ cuốn sách Artificial Intelligence - Scope and Limitations, tạm dịch là “Trí thông minh nhân tạo – Năng lực và Giới hạn”. Hình 1: Bức tranh về các lĩnh vực liên quan đến AI (Nguồn: Artificial Intelligence - Scope and Limitations) AI là một ngành giao thoa giữa rất nhiều lĩnh vực. Trong đó sử dụng phần lớn các kỹ thuật của Khoa học máy tính (Computer science) kết hợp Thống kê (Statisics) và Phân tích dữ liệu (Analysis/Analytics). Ngày đầu tiên tôi sẽ thảo luận với các bạn vài điểm cơ bản về thống kê để các bạn có cơ hội ôn lại. Đối với các bạn mới thì cũng có đủ kiến thức cơ bản để hiểu và làm quen được nội dung trong ngày này. Tôi không đi sâu vào các khái niệm về toán học – vốn rất nhức đầu, dành cho giới hàn lâm mà sẽ tập trung vào các khái niệm cơ bản, rất cơ bản đủ để chúng ta làm quen với các công cụ phần mềm như Python và R. Sau ngày đầu tiên này chúng ta sẽ biết hoặc làm được các việc sau: https://ThachLN.github.com/ebook.html 9 Chạm tới AI trong 10 ngày Biết hoặc tự mô tả được các khái niệm thống kê vốn được sử dụng phổ biến trong đời sống như: Giá trị trung bình Giá trung vị Giá trị mode Phương sai Mối tương quan (correlation) Các cách để mô tả dữ liệu (data types) Tự cài phần mềm để thực hành với R hoặc Python. Làm việc với các lệnh cơ bản trong R hoặc Python. Đọc dữ liệu vào R và Python Ngày đầu tiên sẽ gồm 7 bài: Bài 1: Tóm tắt và giúp các bạn nhớ lại, hoặc làm quen với vài khái niệm thống kê đơn giản. Bài 2: Giới thiệu ngắn gọn về ngôn ngữ R và Python Bài 3: Hướng dẫn làm quen với ngôn ngữ R và phần mềm để thực hành R, RSudio Bài 4: Hướng dẫn làm quen với ngôn ngữ Python và phần mềm để thực hành Anaconda, Spyder. Bài 5: Chia sẻ thêm các trải nghiệm thực tế để giúp các bạn làm việc trên máy tính thuận tiện hơn. Bài 6: Hướng dẫn chuẩn bị dữ liệu, các thao tác biên tập cơ bản và lưu trữ dữ liệu với R. Bài 7: Hướng dẫn chuẩn bị dữ liệu, các thao tác biên tập cơ bản và lưu trữ dữ liệu với Python. Với mục tiêu của tài liệu là giúp các bạn tiếp cận, hoặc là chạm tới lĩnh vực AI trong một thời gian rất ngắn – 10 ngày nên tài liệu khá ôm đồm khi mong muốn đáp ứng nhu cầu sử dụng R và Python để học tập về Phân tích dữ liệu, AI nói chung. Đây là cuốn sách đầu tiên nên thật sự tôi cũng không biết là cách trình bày vừa cả Python và R có phù hợp với bạn đọc hay không? Cho dù các bạn thấy bối rối một chút nhưng tôi tin là việc trình bày các khái niệm về Data analytics, AI rất đời thường và hướng dẫn các bạn trải nghiệm ngay trên các phần mềm sẽ giúp các bạn chạm tới hai lĩnh vực này một cách hiệu quả. Bây giờ chúng ta có thể bắt đầu. https://ThachLN.github.com/ebook.html 10 Chạm tới AI trong 10 ngày Bài 1: Tóm tắt về thống kê (Statistics) Ôn tập khái niệm Thống kê (statistics) là công việc tổng hợp gồm nhiều việc nhỏ hơn như: đặt câu hỏi, thu thập dữ liệu, trình bày dữ liệu, phân tích dữ liệu, diễn giải dữ liệu và suy diễn (ra thông tin mới). Xác suất (probability) là một cách đo khả năng xảy ra của một biến cố và được ước lượng bằng một con số từ 0 đến 1 (tương ứng từ 0% đến 100%). Phân phối xác suất (probability distribution) là cách mô tả tất cả các khả năng xảy ra của biến cố. Phân phối xác suất rời rạc (discrete probability distribution) thể hiện tất cả giá trị mà một biến ngẫu nhiên có thể có cùng với xác suất của nó. Phân phối xác suất liên tục (continuous probability distribution): biểu diễn xác suất của mỗi giá trị có thể có của một biến ngẫu nhiên liên tục. Ví dụ hình bên dưới minh họa phân phối thời gian di chuyển từ chỗ làm về nhà. Trong đa số trường hợp thì mất khoảng 60 phút, nhưng thỉnh thoảng nhanh hơn vì không có kẹt xe, và thỉnh thoảng mất nhiều thời gian hơn nếu có kẹt xe. Đánh giá dữ liệu Một trong các cách để cảm nhận được dữ liệu là đánh giá chúng. Bạn nên làm quen với các khái niệm để đánh giá hoặc đo đạt (measure) dữ liệu như: Đo sự tập trung của dữ liệu (hoặc sự cô đặc của dữ liệu) Ngược lại với sự tập trung là sự phân tán của dữ liệu. Vì vậy ta cũng cần biết các khái niệm để đo sự phân tán của dữ liệu Đo sự tập trung dữ liệu (Measure of Central Tendency) Sự tập trung dữ liệu thường được đo bằng giá trị trung bình (average). Có 3 loại giá trị trung bình thường được sử dụng: https://ThachLN.github.com/ebook.html 11 Chạm tới AI trong 10 ngày Mean: Giá trị trung bình được tính bằng tổng của các giá trị chia cho số lượng các quan sát. Median gọi là trung vị. Đây chính là giá trị của phần tử ở chính giữa một dãy giá trị có xếp theo thứ tự. Trong tường hợp dãy có số phần tử là chẵn thì trung vị được tính là trung bình của 2 phần tử ở giữa của dãy có thứ tự. Mode: giá trị được lặp lại nhiều nhất. Ví dụ theo dõi giá trị một cổ phiếu được giao dịch theo lô trong một ngày gồm có các mức giá tại mười thời điểm như sau: 127, 128, 128, 126, 127, 128, 129, 128, 127, 126. Giá trị mean được tính bằng: (127 + 128 + 127 + 126 + 128 + 128 + 129 + 128 + 127 + 126) / 10 = 127.4 Để tìm giá trị median thì ta cần sắp lại thứ tự của mười mức giá: 126, 126, 127, 127, 127, 128, 128, 128, 128, 129 Nếu số phần tử là lẻ thì sau khi sắp thứ tự thì median sẽ là giá trị của phần tử chính giữa dãy. Tuy nhiên trong ví dụ này có 10 phần tử, nên median được tính bằng trung bình của 2 phần tử thứ 5 và 6 trong dãy đã xếp thứ tự: (127 + 128) / 2 = 127.5 Mode là giá trị 128 (được lặp lại 4 lần) Đo sự phân tán (Dispersion) Sự phân tán còn được gọi là tính dao động, hoặc mức độ dao động (varibility) của các giá trị. Phương sai (variance) dùng để đo độ lệch, hoặc là mức độ cách biệt của các giá trị so với giá trị mean. Quay lại mười mức giá của cổ phiếu ở trên thì câu hỏi đặt ra là các giá trị dao động như thế nào? Cụ thể trong bảng bên dưới chúng ta tính độ lệch bằng cách đo khoảng cách của Giá cổ phiếu và Giá trị trung bình ở dòng 3. Vì giá trị này có thể là số âm nên nếu tính tổng các độ lệch thì sẽ không phản ảnh được tổng các độ lệch của tất cả giá trị so với giá trung bình. Vì thế phải lấy bình phương các độ lệch sau đó chia cho 10. Kết quả phương sai là 0.84. Các mức giá cổ phiếu Giá trị mean 126 126 127 127 127 128 128 128 128 129 127.4 127.4 127.4 127.4 127.4 127.4 127.4 127.4 127.4 127.4 Khoảng cách của Giá và Mean -1.4 -1.4 -0.4 -0.4 -0.4 0.6 0.6 0.6 0.6 1.6 Bình phương của khoảng cách 1.96 1.96 0.16 0.16 0.16 0.36 0.36 0.36 0.36 2.56 0.84 Công thức tổng quát để tính phương sai là: https://ThachLN.github.com/ebook.html 12 Chạm tới AI trong 10 ngày 1 𝑛 Var(X) = ∑𝑖=0(𝑥𝑖 − 𝜇) 2 𝑁 Độ lệch chuẩn (standard deviation): được tính bằng căn bậc hai của phương sai. Range: là giá trị khác biệt giữa phần tử lớn nhất và phần tử nhỏ nhất. Interquartile range: là khoảng giữa hai trung vị 25% và 75%. Giá trị trung bình có trọng số của mẫu (sample) Weighted Arithmetic Mean Trung bình theo trọng số Ví dụ: Theo dõi giá cổ phiếu VNM (Công ty Sữa Việt Nam) giá thấp nhất và cao nhất trong 5 ngày từ 6/9/2019 đến 12/9/2019 Ngày 12/9/2019 11/9/2019 10/9/2019 9/9/2019 6/9/2019 Giá thấp nhất 121.4 122.1 123.3 122.5 122.0 Giá cao nhất 123.3 124.0 124.3 123.9 122.9 Mối tương quan (Correlation): Các khái niệm đã thảo luận ở phần trước dùng để đánh giá các biến đơn lẻ (single variable). Để đánh giá mối quan hệ xác suất giữa hai hay nhiều biến thì người ta dùng khái niệm correlation. Bài tập Nếu tra Internet có thể bạn sẽ thấy thông báo tuyển dụng lập trình viên của các công ty đưa ra nhiều mức lương tháng khác nhau như: $300, $400, $1000, $1200 và $700. Bạn có thể tính các giá trị sau: Giá trị trung bình (Mean) = $300+$400+$1000+$1200+$700 5 = $720 Trung vị (Median) = $700 2 (300−720)2 +(400−720)2 +(1000−720)2 +(1200−720)2 +(700−720)2 Độ lệch chuẩn (SD) = √ 5 =343 Range: $1200 - $300 = $900 Kiểu dữ liệu (Data Types) Từ theo đối tượng và thông tin chúng ta cần đo đạt, quan sát và phân tích thì có nhiều dạng thông tin khác nhau gọi Data Types. Có thể chia Data Types thành các nhóm như: https://ThachLN.github.com/ebook.html 13 Chạm tới AI trong 10 ngày Các thông tin mô tả vể đặt tính, đặc trưng của đối tượng như màu sắc, giới tính, v.v…gọi là kiểu dữ liệu Danh mục (Categorical data) hay còn gọi là dữ liệu Định tính (Qualitative data). - Các dữ liệu dạng Danh mục không có ý nghĩa về thứ tự (vd: màu sắc, giới tính) gọi là Nominal data. - Các dữ liệu về Danh mục nhưng có thêm ý nghĩa thứ tự như: các bậc học (Tiểu học, Phổ thông, Trung học, Đại học, Sau đại học) thì gọi là Ordinal data. Các thông tin mô tả về đối tượng dưới dạng con số như chiều cao, cân nặng, giá trị cổ phiếu, v.v…thì gọi là Numerical data hay còn gọi là dữ liệu Định lượng (Quantitative data). - Giá trị định lượng có thể là liên tục (Continuous data) như chiều cao, cân năng. - Giá trị định lượng có thể là rời rạc (Discrete data) như số chân của con vật. Ví dụ mô tả con mèo hàng xóm có các thông tin sau: - Màu sắc: đen (Nominal data) - Giống: cái (Nominal data) - Nặng: 1.3 kg (Quantitative data - Continous data) - Số chân: 4 (Quantitative data – Discrete data) Ngoài hai dạng dữ liệu Định tính và Định lượng mà bạn thường gặp ở trên thì còn có hai loại khác như: Dạng dữ liệu có đi kèm thêm yếu tố thời gian (Temporal data). Ví dụ giá cố phiếu. Khi nói đến giá cổ phiếu thì phải nói thêm giá vào ngày nào. Ví dụ giá cổ phiếu của VNM ngày 10/10/2019 là 127 nghìn đồng. Dạng dữ liệu liên quan đến vị trí địa lý (Spatial data). Ví dụ vị trí vật lý trên bản đồ (gồm có kinh độ và vĩ độ), hoặc đơn giản hơn là ví trí gồm x và y trong một hệ trục hai chiều. https://ThachLN.github.com/ebook.html 14 Chạm tới AI trong 10 ngày Sơ đồ bên dưới tổng hợp các loại dữ liệu: Các loại dữ liệu Định tính (Qualitative) Định lượng (Quantitative) Định danh (Nominal) Liên tục (Continuous) Có thứ tự (Ordinal) Rời rạc (Discrete) Thời gian (Temporal) Vị trí không gian (Spatial) Hình 2: Sơ đồ các loại dữ liệu Trên đây là các khái niệm phân loại dữ liệu ở mức trừu tượng. Để biểu diễn dữ liệu trong máy vi tính và để cho các phần mềm có thể xử lý được dễ dàng thì bạn cần nắm các loại dữ liệu cơ bản sau: - Số nguyên (Integer) - Số thực (Real / Double number) - Kí tự (Character) - Luận lý (Logical) - Chuỗi (String) - Thời gian (Date, Time) - Mảng (Array) Dùng khái niệm / thước đo nào để quan sát dữ liệu? Một trong các cách để có cái cảm nhận nhanh về dữ liệu là đo sự tập trung của dữ liệu (central tendency). Như phần trên đã trình bày thì có nhiều thước đo như Mean, Median, Mode. Cần ôn lại một chút là: • Mean để thấy giá trị trung bình https://ThachLN.github.com/ebook.html 15 Chạm tới AI trong 10 ngày • Median để thấy trung vị • Mode để thấy sự lặp lại của dữ liệu Câu hỏi đặt ra là với loại dữ liệu nào thì cần dùng thước đo nào? Bảng bên dưới sẽ gợi ý cho bạn nên dùng thước đo nào cho các kiểu dữ liệu khác nhau. Kiểu dữ liệu Đo sự tập trung của dữ Ghi chú liệu Nominal Mode Nominal là dữ liệu định danh không có thứ tự. Vì vậy cần biết là có bao nhiêu dữ liệu được lặp lại. Ví dụ hôm nay ra đường bạn thấy xem màu nào nhiều nhất. Tức ra đường bạn sẽ thấy rất nhiều xe với nhiều màu khác nhau. Nhưng tựu trung lại ngày hôm nay bạn thấy màu nào nhiều nhất! Nên dùng Mode để tính. Biết đâu màu xe mà bạn gặp nhiều nhất có tác động đến kết quả làm việc của ngày hôm đó? Ordinal Median Ordinal là dữ liệu danh mục có tính thứ tự. Ví dụ trong một doanh nghiệp thì có 5 cấp độ nhân viên lập trình (Dev 1, Dev 2, Dev 3, Dev 4, Dev 5) thì Median của Cấp độ lập trình viên là Dev 3. Numerical Mean/Median Đối với dữ liệu số thì dễ dàng tính giá trị trung bình và trung vị. Ví dụ trong nhóm bạn học của mình thì trung bình chiều cao là bao nhiêu? Nếu đứng xếp hàng theo thứ tự chiều cao thì bạn nào sẽ bạn đứng giữa cao bao nhiêu? (nếu số người là chẵn thì lấy chiều cao trung bình của 2 bạn đứng giữa). Biến phụ thuộc và biến tiên lượng Phần lớn các nghiên cứu, mô hình phân tích dữ liệu phân biệt hai loại biến số: • Biến phụ thuộc (dependent variable). Đôi khi gọi là outcome. • Biến độc lập (independent variabe). Đôi khi gọi là biến tiên lượng (predictor variable) https://ThachLN.github.com/ebook.html 16 Chạm tới AI trong 10 ngày Bài 2: Ngôn ngữ lập trình Python và ngôn ngữ thống kê R Để thực hành và trải nghiệm các nội dung trong sách này thì các bạn cần làm quen với Ngôn ngữ thống kê hoặc Ngôn ngữ lập trình trong máy tính và vài công cụ phần mềm. Phần này tôi sẽ giới thiệu cho các bạn hai ngôn ngữ là R và Python vừa đủ để các bạn trải nghiệm các khái niệm về thống kê, về kiểu dữ liệu đã học trong ngày hôm nay. Dù Python và R có nhiều khác biệt nhưng phần này tôi sẽ giới thiệu khái niệm chung nhất và cơ bản nhất để bạn có thể làm quen nhanh chóng với Python và R. Biến (variable) và Đối tượng (Object) Nếu bạn đã học lập trình thì Variable là một cái tên dùng để chỉ một vùng nhớ trong máy tính. Để đơn giản, bạn hãy tưởng tượng cái máy vi tính giống như não người, trong đó có vùng nhớ (memory) để lưu thông tin tạm thời (lúc máy tính đang bật). Một variable được xem như một cái ô nhớ để đựng một giá trị nào đó. Hình bên dưới là một thiết bị điện tử có trong máy tính của các bạn. Nó là một bản mạch gồm nhiều con chip có thể lưu trữ lại thông tin (bao gồm cả dữ liệu và lệnh) trong lúc máy tính có điện. Mọi người thưởng gọi ngắn gọn nó là thanh RAM. Hình 3: Thanh RAM – nơi lưu "Trí nhớ" tạm thời của máy tính Để các bạn hiểu hơn một chút về việc khai thác bộ nhớ của máy tính thì hãy tưởng tượng làm cách nào mà bạn bắt cái máy tính của bạn nhớ thông tin của một người bạn thân gồm các thông tin như sau: Tên Lê Ngọc Thạch Chiều cao 165 cao Cân nặng 72.5 kg Giới tính Nam Ngày sinh 29/9/1977 Các chữ số yêu thích 1, 2, 5, 10, 20, 50, 100 https://ThachLN.github.com/ebook.html 17 Chạm tới AI trong 10 ngày Các môn thể thao yêu Bóng bàn, bóng đá, thích Quần vợt (Bạn có thể thay bằng thông tin của chính mình cho chính xác hơn nhé!) Mỗi thông tin ở cột bên trái được gọi là một biến (variable). Bạn tưởng tượng là trong thanh RAM ở phần trước có rất nhiều ô nhỏ li ti. Mỗi ô nhỏ như vậy máy tính (cụ thể các phần mềm mà chúng ta sẽ thực hành ở phần tiếp theo) được đặt cho một cái tên (name) – gọi là tên biến (variable name). Mỗi biến như vậy sẽ có một vùng nhớ khác nhau để chứa thông tin. Để đơn giản cho máy tính thì chúng ta nên sử dụng tên tiếng Anh để đặt cho tên biến. Tên biến nên gồm các kí tự chữ cái thường, chữ cái HOA, dấu gạch chân (_) và có thể có kí số (ở giữa hoặc ở cuối tên biến). Để thống nhất cho các bạn khi thực hành thì tôi sử dụng quy trước theo thông lệ chung như sau: - Tên biến bắt đầu bằng chữ thường. - Kí tự Hoa và thường được hiểu là 2 kí tự khác nhau. Ví dụ tên biến là fullName sẽ khác với tên biến là FullName. Tức là có hai vùng nhớ khác nhau để chứa thông tin của 2 biến này. - Tên biến phải ngắn gọn và gợi nghĩa. - Khi tên biến gồm nhiều từ ghép lại (như Full name – 2 từ trong ví dụ trên) thì hãy viết Hoa kí tự của từ tiếp theo. Để mô tả thông tin trong ví dụ trên thì chúng ta có thể tự quy định tên biến như bảng sau: Thông tin Tên biến Tên fullName Chiều cao height Cân nặng weight Giới tính sex Ngày sinh birthday Các chữ số yêu thích favorNumbers Các môn thể thao yêu favorSports thích Trên đây là thông tin của một người, để mô tả thêm một người bạn nữa thì bạn phải làm sao? Bạn có thể đặt thêm một loạt biến nữa như: fullName1, height1, …Tức là bạn thêm số thứ tự phía sau để có bộ biến mới cho người mới. Tuy nhiên cách này không https://ThachLN.github.com/ebook.html 18 Chạm tới AI trong 10 ngày hay. Giới khoa học máy tính đưa ra khái niệm Object để giúp các bạn giải quyết nhu cầu này. Object là một khái niệm gom nhiều loại thông tin để mô tả một vật, một người hay nói chung là một đối tượng nào đó. Nói cụ thể hơn là Object sẽ chứa trong nó nhiều biến. Chúng ta mô tả lại ví dụ trình bày thông tin cho người bạn “Thạch” của chúng ta ở trên dưới dạng một object như sau: Object: myFriendThach fullName Lê Ngọc Thạch height 165 cao weight 72.5 kg sex Nam birthday 29/9/1977 favorNumbers 1, 2, 5, 10, 20, 50 favorSports Bóng bàn, bóng đá, Quần vợt Trong bảng trên xuất hiện từ myFriendThach, đây là một cái tên (name) được máy tính chỉ định (hoặc là trỏ tới) vùng nhớ của tất cả các thông tin về bạn Thạch. Như vậy đến đây bạn biết được khái niệm biến (variable) là một cái tên (name) trỏ tới một vùng nhớ chứa thông tin cơ bản nào đó của bạn Thạch (như tên, cân nặng, v.v…). Toàn bộ các biến liên quan đến bạn Thạch được gom lại trong một vùng nhớ (đương nhiên là rộng hơn) gọi lại Object. Hình minh họa bên dưới gồm 7 ô nhớ tương ứng với 7 biến để mô tả thông tin về bạn Thạch (kí hiệu v1 đến v7 tương ứng với fullName…favorSports). Hình chữ nhật màu xanh được bao gởi đường đứt nét được gọi là một vùng nhớ cũng được đặt tên là một đối tượng (Object) với tên là myFriendThach. Variable v1 Object v2 v3 v4 v5 v6 v7 Hình 4: Minh họa khái niệm biến (Variable) và đối tượng (Object) https://ThachLN.github.com/ebook.html 19 Chạm tới AI trong 10 ngày Variable có nghĩa là gì? Tra tự điển Nếu tra tự điển Oxford thì variable có thể là danh từ, có thể là tính từ. Tính từ variable: able to be changed or adapted (có thể được thay đổi hoặc điều chỉnh) Danh từ variable: an element, feature, or factor that is liable to vary or change (một yếu tố, một nét đặc trưng, hoặc một nhân tố có khả năng biến đổi hoặc thay đổi). Cũng trong Oxford, variable được định nghĩa trong lĩnh vực Computing (điện toán) như sau: a data item that may take on more than one value during the runtime of a program (một phần tử dữ liệu có thể mang một hoặc hơn một giá trị trong suốt thời gian thực thi của chương trình). Như vậy chữ variable có hai nghĩa mà các nhà khoa học máy tính và dịch giả Việt Nam đã dùng từ “biến” đã phản ánh đầy đủ rõ khái niệm “biến” trong máy tính. Cụ thể là từ vary có hàm ý là có thể biến đổi thành đối tượng khác. Đối tượng khác ở đây có nghĩa là bản chất thông tin thay đổi hẳn. Chữ change có hàm ý là thay đổi giá trị của ô nhớ. Tức là bản chất, loại thông tin không thay đổi, mà chỉ thay đổi về nội dung, về giá trị của chúng. Ví dụ: Biến height đang có giá trị là 72.5 thì có thể được thay đổi thành một giá trị khác (tùy theo ngữ cảnh, thời gian như là đo lại tại một thời điểm khác) như là 71, 70 (chúng ta hiểu đơn vị là kg). Sự thay đổi này gọi là change. Tuy nhiên, vì lý do nào đó trong ứng dụng phần mềm chúng ta muốn lưu trữ thông tin không phải là chiều cao nữa mà muốn lưu giá trị là một chức vụ cao nhất mà người đó đã từng làm. Tức là height sẽ được lưu giá trị là một tên của chức vụ (chứ không là một con số phản ánh chiều cao nữa). Lúc này biến height được biến đổi từ mục đích lưu con số phản ảnh chiều cao thành một tên phản ảnh chức vụ cao nhất. Cái này gọi là vary theo nghĩa trong tự điển Oxford. Sau khi bạn hiểu được khái niệm Variable rồi thì câu hỏi tiếp theo là làm sao thiết lập giá trị cho biến. Cụ thể như thiết lập giá trị cho các ô nhớ từ v1 đến v2 trong hình 4. Để làm được việc này thì bạn cần học thêm khái niệm gán (assign) trong phần tiếp theo. https://ThachLN.github.com/ebook.html 20 Chạm tới AI trong 10 ngày Lệnh gán (assign) Hình bên dưới minh họa các variable có tên level, score, name, birthday tương ứng với các ô nhớ (hãy xem như là một cái thùng) chứa bên trong nó các thông tin tương ứng. Để gán một giá trị cho Để thiết lập thông tin (hay còn gọi là dữ liệu) vào biến thì một biến trong R và sử dụng phép gán (assign). Cả Python và R đều dùng chung dấu Python thì dùng dấu bằng (=) để thực hiện phép gán. bằng “=”. Trong R, phép gán có thể sử dụng dấu mũi tên (gồm dấu Vd: bé hơn và dấu trừ: Exit • Gõ lệnh “quit()” (Không gõ gặp dấu nháy đôi và CÓ cặp dấu mở đóng ngoặc). Lệnh nhanh hơn là “q()” Trước khi thoát chương trình thì R hỏi như hộp thoại (dialog) bên dưới: Bạn nhấn “No” để thoát. https://ThachLN.github.com/ebook.html 27 Chạm tới AI trong 10 ngày Đúc kết Bạn đã biết cài đặt R và gõ lệnh vào R Console! Các lệnh bạn nên thực hành version Xem phiên bản của R và vài thông tin khác q() Thoát khỏi phần mềm R Cài đặt các gói phần mềm Một trong các điểm mạnh của R là một phần mềm tổ chức dưới dạng package (các gói phần mềm được phát triển và bổ sung vào R rất thuận tiện), còn gọi là library (thư viện). Trong R có rất nhiều package cung cấp các chức năng cho thống kê nói riêng, phân tích dữ liệu nói chung. Cụ thể trong tài liệu này sẽ khai thác vài packae thường được sử dụng như sau: Tên package Chức năng BMA Cài đặt phương pháp chọn mô hình bày Bayes ggplot2 Dùng để vẽ biểu đồ tables Phân tích dữ liệu dưới dạng bản số liệu Xlsx Đọc dữ liệu từ file Excel Để cài đặt package thì dùng lệnh: install.packages(' dim(df) [1] 26 3 Xem vài dòng dữ liệu đầu tiên của data frame "data": > head(df) 1 2 3 4 5 6 X age height 1 26 186 2 23 180 3 23 180 4 20 185 5 20 185 6 23 173 Xuất dữ liệu từ Excel ra file file csv Để làm quen với file CSV thì bạn có thể dùng phần mềm trang tính như Microsoft Excel hoặc Open Office Spreadsheet để soạn dữ liệu rồi lưu dưới dạng CSV. Ví dụ bạn có file Excel chứa danh sách các tuyển thủ bóng đá như hình bên dưới: https://ThachLN.github.com/ebook.html 64 Chạm tới AI trong 10 ngày Lưu thành file csv bằng cách vào menu File > Save As. Trong hộp thoại Save, mục Save as type bạn thấy có nhiều dạng file CSV như: CSV UTF-8 (Comma delimited) (*.cvs) Sau khi lưu xong, bạn nên mở lại file csv để xem lại dữ liệu bằng cách trong cửa sổ Windows Explore, nhấp phải chuột vào tên file (ví dụ: “TuyenVN-age.csv) chọn menu “Edit with Notepad++”. Đây là một sự tiện lợi với Notepad++ Nội dung file TuyenVN-age.csv: https://ThachLN.github.com/ebook.html 65 Chạm tới AI trong 10 ngày Có một điểm chú ý là do Microsoft Excel lưu file dạng UTF-8-BOM. File UTF8-BOM này có vài kí tự đặc biệt nên hiện tại thư viện trong phần mềm R không "hiểu" các kí tự đặc biệt này. Do đó bạn cần phải lưu lại file csv này này dạng UTF-8 without BOM bằng cách: Vào menu Encoding, chọn "Encode in UTF-8". Sau đó lưu lại file. Hãy thử dùng lệnh read.csv(file) để đọc lại file. Nhập liệu trực tiếp từ file Excel Có rất nhiều thư viện giúp bạn nạp dữ liệu từ file Excel. Trong phần này tôi giới thiệu cho bạn thư viện “readxl” (read excel) Ví dụ bạn có dữ liệu 24 cầu thủ của đội tuyển bóng đá Việt Nam trong file Excel như sau: Name Position Club BirthYear Height Weight Đặng Văn Lâm Thủ môn Nguyễn Tuấn Mạnh Thủ môn Muang Thong United 1993 186 76 Nga Khánh Hòa 1990 177 72 Thanh Hóa https://ThachLN.github.com/ebook.html 66 BirthPlace Chạm tới AI trong 10 ngày Phạm Văn Cường Thủ môn Quảng Nam 1990 186 70 Nghệ An Đỗ Duy Mạnh Hậu vệ Hà Nội 1996 180 70 Hà Nội Đoàn Văn Hậu Hậu vệ Hà Nội 1999 185 70 Thái Bình Trần Văn Kiên Hậu vệ Hà Nội 1996 168 64 Nghệ An Nguyễn Thành Chung Hậu vệ Hà Nội 1997 180 70 Tuyên Quang Vũ Văn Thanh Hậu vệ HAGL 1996 173 67 Hải Dương Nguyễn Hữu Tuấn Hậu vệ TP.HCM 1992 179 70 Đà Nẵng Nguyễn Trọng Hoàng Hậu vệ Viettel 1989 169 67 Nghệ An Bùi Tiến Dũng Hậu vệ Viettel 1995 176 75 Hà Tĩnh Quế Ngọc Hải Hậu vệ Viettel 1995 180 77 Nghệ An Phạm Đức Huy Tiền vệ Viettel 1995 73 65 Hải Dương Đỗ Hùng Dũng Tiền vệ Hà Nội 1993 170 67 Hà Nội Nguyễn Quang Hải Tiền vệ Hà Nội 1997 168 65 Hà Nội Nguyễn Tuấn Anh Tiền vệ HAGL 1995 176 65 Thái Bình Lương Xuân Trường Tiền vệ HAGL 1995 178 72 Tuyên Quang Nguyễn Phong Hồng Duy Tiền vệ HAGL 1996 168 67 Bình Phước Nguyễn Huy Hùng Tiền vệ Quảng Nam 1992 174 69 Hà Nội Nguyễn Anh Đức Tiền đạo Bình Dương 1985 181 72 Sông Bé Nguyễn Tiến Linh Tiền đạo Bình Dương 1997 178 67 Hải Dương Nguyễn Văn Toàn Tiền đạo HAGL 1996 170 61 Hải Dương Nguyễn Công Phượng Tiền đạo Sint Truidense 1995 168 65 Nghệ An Hà Minh Tuấn Tiền đạo Quảng Nam 1991 178 71 Quảng Nam # Cài đặt thư viện install.packages('readxl') # Sử dụng thư viện library('readxl') d = read_excel("D:/Temp/TuyenVN_2019.xlsx") head(d) # A tibble: 6 x 7 Name 1 Đặng Văn Lâm 2 Nguyễn Tuấn Mạnh 3 Phạm Văn Cường 4 Đỗ Duy Mạnh 5 Đoàn Văn Hậu 6 Trần Văn Kiên Position Club BirthYear Height Weight BirthPlace Thủ môn Muang Thong United 1993 186 76 Nga Thủ môn Khánh Hòa 1990 177 72 Thanh Hóa Thủ môn Quảng Nam 1990 186 70 Nghệ An Hậu vệ Hà Nội 1996 180 70 Hà Nội Hậu vệ Hà Nội 1999 185 70 Thái Bình Hậu vệ Hà Nội 1996 168 64 Nghệ An https://ThachLN.github.com/ebook.html 67 Chạm tới AI trong 10 ngày Xử lý dữ liệu nâng cao Phần này tôi gọi là nâng cao vì là ngày đầu tiên nên bạn có thể bỏ qua phần này. Nội dung nâng cao này sẽ được sử dụng cho các vấn đề phức tạp hơn trong các ngày tiếp theo. Tuy nhiên tôi vẫn trình bày ở đây để khi nào cần thiết thì bạn có thể tra cứu, bổ sung kỹ năng khi cần thiết. Lọc dữ liệu theo cột Bạn muốn trích xuất dữ liệu từ một data frame có sẵn bằng cách chỉ chọn một vài cột dữ liệu nào đó thôi. Sử dụng hàm select trong thư viện dplyr. Ví dụ: packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } df = read.csv("https://thachln.github.io/datasets/TuyenVN_2019.csv") library(dplyr) names(df) d1 = select(df, Height, Weight) head(d1) 1 2 3 4 5 6 Height Weight 186 76 177 72 186 70 180 70 185 70 168 64 Bỏ bớt cột dữ liệu Bỏ một cột Dùng cú pháp: dataframe[, -col_index] col_index: vị trí của cột dữ liệu (cột bên trái cùng tính từ 1) Bỏ một cột dùng thư viện dplyr Dùng thư viện dplyr với toán từ pipeline (%>%) dataframe %>% select(-starts_with("col_name")) https://ThachLN.github.com/ebook.html 68 Chạm tới AI trong 10 ngày Bỏ nhiều cột dùng thư viện dplyr Dùng thư viện dplyr với toán từ pipeline (%>%) drop_cols = c('colname1', 'colname2', 'colnameN') dataframe %>% select(-one_of(drop_cols)) https://ThachLN.github.com/ebook.html 69 Chạm tới AI trong 10 ngày Bài 7: Nhập liệu, biên tập, lưu trữ dữ liệu với Python Dữ liệu trong Python Dữ liệu trong Python thường được tổ chức dưới dạng mảng đa chiều (multidimensional arrays); hoặc các dữ liệu có cấu trúc với nhiều kiểu dữ liệu khác nhau. Trong Python, thư viện Pandas cung cấp rất nhiều hàm để thao tác với dữ liệu dạng DataFrame – khái niệm tương tự như trong R. Phần này sẽ giúp bạn làm quen với việc xử lý dữ liệu cơ bản với Python thông qua thư viện Pandas. Thư viện Pandas Để sử dụng thư viện Pandas bạn dùng lệnh sau: import pandas as pd Để đọc dữ liệu từ file csv vào biến data dùng lệnh sau data = pd.read_csv('D:/Data/R/TuyenVN.csv', index_col = 0) Xem dữ liệu của biết data thì gõ tên biến rồi nhấn Enter data https://ThachLN.github.com/ebook.html 70 Chạm tới AI trong 10 ngày Để xem số dòng và cột của dữ liệu "data", dùng lệnh: data.shape Kết quả: (26, 3) Để xem vài dòng dữ liệu đầu và cuối của data frame thì dùng hàm head() và tail(). Góc tiếng Anh: head: the part of the body on top of the neck containing the eyes, nose, mouth and brain tail: the part of sticks out and can be moved at the back of the body of a bird, an animal or a fish https://ThachLN.github.com/ebook.html 71 Chạm tới AI trong 10 ngày Để lấy ra cột dữ liệu "age" thì dùng cú pháp sau: data["age"] Để tính tuổi trung bình của các tuyển thủ thì dùng hàm mean như sau: data["age"].mean() https://ThachLN.github.com/ebook.html 72 Chạm tới AI trong 10 ngày Kết quả cho thấy tuổi trung bình của các tuyển thủ là xấp xỉ 23.8 tuổi. Tương tự, có thể tính nhanh chiều cao trung bình bằng lệnh sau: data["height"].mean() Kết quả là: 174.3846153846154 Đơn vị ở đây là cm. Tức là chiều cao trung bình của các tuyển thủ xấp xỉ 1 mét 74. Nếu gọi hàm mean cho data frame thì kết quả như sau: data.mean() age 23.769231 height 174.384615 dtype: float64 Thư viện Pandas sẽ tự tính trung bình các cột có kiểu số. Trong trường hợp này là age và height. Hãy thử chạy các lệnh sau: Lệnh Ghi chú data.columns Xem tên các cột của data frame. Xử lý dữ liệu nâng cao Tương tự như mục này trong bài trước của R, tôi gọi là nâng cao vì là ngày đầu tiên nên bạn có thể bỏ qua. Nội dung nâng cao này sẽ được sử dụng cho các vấn đề phức tạp hơn trong các ngày tiếp theo. Khi cần thiết thì tra cứu lại phần này. https://ThachLN.github.com/ebook.html 73 Chạm tới AI trong 10 ngày Đọc dữ liệu từ Internet và xem thông tin nhanh về dataframe Ví dụ sau đọc file csv từ internet bằng thư viện pandas và gọi hàm info() để xem thông tin về dataframe. Trong R thì có hàm glimpse trong thư viện dplyr. import pandas as pd iris = pd.read_csv('https://thachln.github.io/datasets/iris-data.csv') iris.info() RangeIndex: 150 entries, 0 to 149 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------------------- ----0 S.Length 150 non-null float64 1 S.Width 150 non-null float64 2 P.Length 150 non-null float64 3 P.Width 150 non-null float64 4 Species 150 non-null object dtypes: float64(4), object(1) memory usage: 6.0+ KB Đọc dữ liệu từ file nén kiểu zip Ví dụ sau đọc file .zip từ Internet, trong đó có file .csv với encoding (mã) của văn bản là latin-1. import pandas as pd fp = 'https://thachln.github.io/datasets/movie_reviews.zip' df = pd.read_csv(fp, compression='zip', encoding='latin-1') df.head() Chuyển kiểu dữ liệu sau khi đọc từ file csv hoặc Excel Khi dùng thư viện pandas đọc file csv hoặc Excel vào dataframe thì các cột dữ liệu số nguyên (int) mà có dữ liệu trống thì cột dữ liệu này sẽ bị tự động chuyển thành số thực (float). Để giữ đúng kiểu dữ liệu gốc ban đầu thì bạn phải kiểm tra lại cho chắc và tự ép kiểu. Ví dụ file Excel hoặc CSV lưu vài đơn hàng như sau: InvoiceNo StockCode Quantity InvoiceDate UnitPrice CustomerID Country 536365 85123A 6 12/1/2010 8:26 2.55 17850 United Kingdom 536365 84406B 8 12/1/2010 8:26 2.75 17850 United Kingdom 536365 84029G 6 12/1/2010 8:26 3.39 536365 84029E 6 12/1/2010 8:26 3.39 17850 United Kingdom 536365 22752 2 12/1/2010 8:26 7.65 17850 United Kingdom https://ThachLN.github.com/ebook.html United Kingdom 74 Chạm tới AI trong 10 ngày Trong đó cột InvoiceNo và CustomerID là mã số của hóa đơn và mã khách hàng. Kiểu dữ liệu là số nguyên. Tuy nhiên khi dùng thư viện pandas để đọc vào dataframe thì cột CustomerID là số thực như sau: import pandas as pd file_path = 'https://thachln.github.io/datasets/Online_Retail_1.xlsx' df = pd.read_excel(file_path) df.head() 0 1 2 3 4 InvoiceNo StockCode 536365 85123A 536365 84406B 536365 84029G 536365 84029E 536365 22752 Quantity 6 8 6 6 2 ... UnitPrice ... 2.55 ... 2.75 ... 3.39 ... 3.39 ... 7.65 CustomerID 17850.0 17850.0 NaN 17850.0 17850.0 United United United United United Country Kingdom Kingdom Kingdom Kingdom Kingdom [5 rows x 7 columns] Kết quả cột CustomerId có số lẻ .0. Để chuyển CustomerId trở về lại kiểu số nguyên (int) thì bạn phải xử lý giá trị trống rồi ép kiểu (type conversion) lại như sau: df = df.dropna(subset=['CustomerID']) df.CustomerID = df.CustomerID.astype(int) # Hoặc # df['CustomerID'] = df['CustomerID'].astype(int) df.head() Chú ý ở đây chỉ ví dụ xóa dòng dữ liệu có CustomerID bị trống. Trong thực tế thì bạn phải quyết định xử lý bằng thuật toán hay xóa là tùy mục tiêu phân tích. Lọc dữ liệu theo cột trong Pandas Ví dụ đọc dữ liệu nghiên cứu các loài hoa trong dự án iris. Sau đó lọc dữ liệu theo cột cho biến X, và outcome y: iris = pd.read_csv('https://thachln.github.io/datasets/iris-data.csv') iris.head() X = iris[['S.Length', 'S.Width', 'P.Length', 'P.Width']] y = iris.Species # Hoặc y = iris['Species'] Ghi nhớ: Sử dụng cú pháp dataframe[cols] với cols là tên của cột hoặc array của các tên cột. https://ThachLN.github.com/ebook.html 75 Chạm tới AI trong 10 ngày Lọc dữ liệu theo dòng với điều kiện cho trước Ví dụ: lọc các dòng dữ liệu trong iris với điều kiện cột S.Length > 7.6. df = pd.read_csv('https://thachln.github.io/datasets/iris-data.csv') df.loc[df['S.Length'] > 7.6] 117 118 122 131 135 S.Length 7.7 7.7 7.7 7.9 7.7 S.Width 3.8 2.6 2.8 3.8 3.0 P.Length 6.7 6.9 6.7 6.4 6.1 P.Width 2.2 2.3 2.0 2.0 2.3 Species I.virginica I.virginica I.virginica I.virginica I.virginica Lưu dataframe ra file csv Sử dụng hàm dataframe.to_csv(cvs path). Ví dụ: df.to_csv('out.csv') https://ThachLN.github.com/ebook.html 76 Chạm tới AI trong 10 ngày Ngày 2 – Chủ đề: Biểu đồ Có thể nói phân tích dữ liệu (Data Analysis) hoặc khai phá dữ liệu (Data Mining) là một quá trình gồm nhiều bước. Bước đầu tiên là xác định câu hỏi. Tức là xác định rõ vấn đề cần giải quyết với các mục tiêu cụ thể dưới dạng các giả thuyết (hypothesis). Bước thứ hai là đi tập hợp dữ liệu (Selecting data, hoặc Collecting data). Có dữ liệu rồi thì chưa chắc dữ liệu có đầy đủ thông tin, cần phải thực hiện bước thứ ba - tiền xử lý dữ liệu (Preprocessing data). Bước thứ tư là chuyển đổi dữ liệu (Transforming data). Đôi khi dữ liệu cá quá nhiều thuộc tính sẽ ảnh hưởng đến hiệu quả và sự phức tạp của các thuật toán. Cho nên việc giảm số lượng các thuộc tính để giúp cho quá trình phân tích hiệu quả hơn mà không làm mất mát thông tin là quan trọng. Bước thứ năm là lưu trữ dữ liệu (Storing data). Dữ liệu sau khi đã được chuyển đổi (transformed data) sẽ rất quý bởi vì đã tốn rất nhiều công sức và tiền của để có được dữ liệu "tốt" và "sạch sẽ". Vì thế lưu trữ để làm tài sản là đương nhiên. Đặc biệt là dạng thức (format) lưu trữ như thế nào để phục vụ tốt cho việc truy xuất, phân tích, và khai phá là rất quan trọng. Bước thứ sáu là phân tích (analysis) hoặc khai phá (mining) thông tin. Bước này là khâu để hiểu dữ liệu, đặc biệt là thấu hiểu dữ liệu thông qua các mối tương quan bằng nhiều phương pháp phân tích khác nhau, các phương pháp tham số (parametric), phi tham số (non-parametric) và các thuật toán máy học (machine-learning 3). Bước thứ bảy là đánh giá kết quả (Evaluate results). Bước này đánh giá khả năng tiên lượng (predictive capability) hoặc dự báo (forecast) của mô hình trên cơ sở dữ liệu đã có. Đặc biệt là điểm định lại giả thuyết đã đặt ra ở bước một, hoặc tìm câu trả lời cho câu hỏi đã xác định (dù là có, hoặc là không, hoặc một lý giải hợp lý). Đối với người làm về khoa học dữ liệu thì còn một bước nữa là làm báo cáo (Report). Trong giới nghiên cứu thì thông thường báo cáo là dạng bài báo khoa học (paper). Trong giới doanh nghiệp thì báo cáo thông thường là báo cáo kết quả cho cấp trên hoặc các bên liên quan. Để bắt đầu cho bước thứ Sáu thì nhìn dữ liệu dưới dạng biểu đồ một cách trực quan sẽ giúp chúng ta hiểu được bức tranh tổng thể của dữ liệu, đội khi có thể thay ngay các thông tin ẩn (hidden) đằng sau "bức tranh" mà nếu chỉ nhìn con số thì rất khó thấy. Ngày thứ hai này chúng ta sẽ dạo qua các loại biểu đồ và làm quen với công việc phân tích biểu đồ. Trong đó sẽ có các ví dụ minh học bằng ngôn ngữ R và cả Python để giúp các bạn khám phá cái hay, cái chưa hay của từng ngôn ngữ và phần mềm tương ứng. Ngày thứ hai này sẽ gồm 5 bài: 3 Bản thân tôi thì không thích dịch machine-learning là máy học hoặc học máy vì nó "tối nghĩa" sẽ dễ gây ảo tưởng. Tôi nghĩ dùng từ mô hình hóa bằng máy (nếu tiếng anh viết là machine-model) thì có lẽ dễ liên tưởng đến bản chất hơn. Tức là machine-learning về bản chất là xây dựng mô hình (thông thường là dự trên toán học, tức là thông qua các hàm số và các phép tính toán) để mô phỏng nguyên lý của dữ liệu từ đầu vào cho đến đầu ra. Tuy nhiên với công nghệ tính toán ngày càng mạnh và nhiều thiết bị điện tử có thể thu nhập nhiều thông tin (như camera, sensor – cảm biến) để chuyển cho máy xử lý và có thể thay đổi mô hình (model) cho phù hợp với ngoại cảnh. Tức là các mô hình toán học không còn có định nữa, mà có thay đổi để thích nghi với dữ liệu mới. Đây là "khả năng" tuyệt vời của máy theo hướng bắt chước con người chúng ta – đó là khả năng "học". Chính vì vậy dùng từ máy học thì không sai nhưng nếu hiểu là mô hình hóa bằng máy thì sẽ giúp chúng ta học chuyên sâu về phân tích dữ liệu và trí tuệ nhân tạo (Artificial Intelligent) nói chung sẽ ít nhầm lẫn và ảo tưởng hơn. https://ThachLN.github.com/ebook.html 77 Chạm tới AI trong 10 ngày Bài 8: Tóm tắt và giúp các bạn phân biệt được mục đích cơ bản của các loại biểu đồ. Bài 9: Giúp bạn làm quen và cảm nhận với cách vẽ biểu đồ bằng R. Đặc biệt sử dụng thư viện ggplot2 để vẽ biểu đồ chất lượng cao. Bài 10: Giúp bạn làm quen và cảm nhận với cách vẽ biểu đồ bằng Python. Trong bài này cũng giúp bạn sử dụng sử dụng ggplot2 (vốn là của R) trong Python. Bài 11: Sưu tầm vài nguyên tắc soạn biểu đồ. Bài 12: Giúp bạn làm quen với thư viện vẽ biều đồ rất phổ biến trong Python. https://ThachLN.github.com/ebook.html 78 Chạm tới AI trong 10 ngày Bài 8: Các loại biểu đồ Trong bối cảnh ngày nay có quá nhiều dữ liệu thì việc cảm nhận nhanh hoặc nắm bắt bức tranh tổng thể của dữ liệu rất là quan trọng. Việc nhìn dữ liệu dưới dạng hình ảnh chắc chắn sẽ sinh động hơn nhiều. Ngoài ra hình ảnh của dữ liệu có thể cho chúng ta khám phá nhiều thông tin đằng sau mà nếu chỉ có con số không thôi thì ta không biết được. Như vậy nếu bạn biết sử dụng được các kỹ thuật để trực quan hóa dữ liệu là một lợi thế lớn trong công việc của mình. Bài này sẽ giúp các bạn sử dụng biểu đồ nào phù hợp với mục đích của mình. Phần mã nguồn và cách sử dụng lệnh để vẽ biểu đồ bằng R và Python sẽ được trình bày tương ứng trong Bài 9 và Bài 10. Chúng ta cùng ôn lại mục đích của các loại biểu đồ mà ít nhiều các bạn đã từng biết hoặc đã làm quen. Bảng bên dưới trình bày mục đích hoặc chủ định của các bạn muốn làm gì ở cột bên trái. Tương ứng với chủ định thì cột bên phải sẽ cho biết nên dùng biểu đồ gì. Mục đích Biểu đồ Cần nhìn thấy bức tranh tổng thể về phân số dữ liệu Biểu diễn phân bố dữ liệu Histogram Tóm tắt thống kê: biểu diễn các 5 Boxplot giá trị quan trọng của dữ liệu: min, max, lower quartile, up quartile, mean (nhỏ nhất, lớn nhất, bách phân vị 25%, bách phân vị 75%, trung bình) Biểu diễn dữ liệu theo thời gian Time series Cần so sánh So sánh (giá trị) của nhiều biến, Bar chart/Bar plot: biểu đồ cột (tên khác là hoặc cần thấy tầng số dữ liệu. Column chart) So sánh giá trị một biến thay đổi Line chart: biểu đồ đường kẻ. theo thời gian. Trường hợp mốc thời gian ít Vertical bar chart: biểu đồ thanh đứng (dưới 10) So sánh nhiều biến hoặc nhiều Radar chart (tên khác là Spider chart): biểu đồ nhóm mạng nhện. Cần nhận biến sự tương quan giữa hai hoặc nhiều biến Tương quan giữa 2 biến Plot (dữ liệu của 2 biến lên 2 trục của biểu đồ). https://ThachLN.github.com/ebook.html 79 Chạm tới AI trong 10 ngày Scatterplot. Tương quan giữa 2 biến trong đó Scatterplot có chia nhóm. có chia theo nhóm Tương quan giữa nhiều biến Scatterplot nhiều biến. Biểu đồ phân bố dữ liệu (histogram) Khi bạn muốn nhìn các giá trị của một biến phân bố như thế nào thì chúng ta cần đến biểu đồ histogram. Ví dụ phân bố tuổi của đội tuyển bóng đá Nam của Việt Nam như sau: Biểu đồ này cho thấy có khoảng 3 tuyển thủ tuổi từ 20 đến 22, 8 tuyển thủ tuổi từ 22 đến 24 và vài tuyển (từ 1 đến 3) thủ trên 24. Như vậy có thể mường tượng tuổi của các tuyển thủ còn rất trẻ, phần lớn là từ 22 đến 24. Biểu đồ so sánh (Comparison Plots) Khi có nhu cầu so sánh nhiều biến, hoặc so sánh giá trị của biến theo thời gian thì dùng các biểu đồ so sánh. Biểu đồ thông dụng là biểu đồ thanh (Bar chart) hay còn gọi biểu đồ cột (column chart). Để nhìn dữ liệu theo thời gian thì biểu đồ Line là phù hợp. Trong trường hợp giá trị theo thời gian ít (dưới 10 cột mốc) thì có thể dùng biểu đồ thanh đứng (vertical bar chart). Trong trường hợp nhiều biến hoặc nhiều nhóm thì biểu đồ mạng nhện (Radar chart, Spider chart) được sử dụng. https://ThachLN.github.com/ebook.html 80 Chạm tới AI trong 10 ngày Line Chart Các line chart thường được dùng để hiển trị các giá trị định lượng (quantitative values) trong khoản thời gian liên tục. Trục x (x-axis) biểu diễn thời gian, trục y (y-axis) biểu diễn giá trị của biến cần quan sát. Cách dùng: ✓ Line chart phù hợp để so sánh giá trị của nhiều biến và trực quan hóa (visualizing) các xu hướng cho cả hai trường hợp có một biến hoặc nhiều biến. ✓ Đối với các chu kì thời gian nhỏ (cỡ 10 trở lại) thì các biểu đồ thanh đứng (vertical bar chart) có thể được sử dụng. Bar Chart – biểu đồ thanh Mỗi thanh trong biểu đồ thể hiện tương ứng với một giá trị. Có 2 dạng biểu đồ thanh: dạng thanh đứng (vertical bar) và dạng thanh ngang (horizontal bar). Cách dùng: • So sánh các biến trong các danh mục. Đôi khi biểu đồ thanh đứng được dùng để thể hiện giá trị của một biến thay đổi theo thời gian. Radar chart Radar chart có nhiều tên khác như spider chart (biểu đồ mạng nhện – do nó giống cái mạng nhện), hoặc web chart. Radar chart thể hiện nhiều biến trên một đa giác. Mỗi giá trị của biến tương ứng với mỗi đỉnh của đa giác. Sử dụng: • Radar chart dùng để so sánh nhiều giá trị biến định lượng trong một hoặc nhiều nhóm. • Radar chart cũng hữu ích khi cần hiển thị giá trị cao/thấp trong tập dữ liệu. Ví dụ: Để hiển thị điểm các kỹ năng của sinh viên hoặc ứng viên thì có thể dùng radar chart. Một ví dụ đơn giản là cần so sánh điểm ASK của hai ứng viên A và B thì có cái hình như sau: https://ThachLN.github.com/ebook.html 81 Chạm tới AI trong 10 ngày Ghi chú một chút ASK là viết tắt của Thái độ (Attitude), Kỹ năng (Skill) và Kiến thức (Knowled). ASK thường được các nhà tuyển dụng đánh giá ứng viên. Biểu đồ tương quan (Relation Plots) Khi bạn có nhu cầu thể hiện mối liên quan (relationships) giữa các biến thì các loại biểu đồ sau đây là hữu ích. Scatter plot đơn giản Scatter plot thể hiện các điểm (point) của hai biến số, hoặc nói cách khác là giá trị của một biết được thể hiện trong mối tương quan của hai trục x và y. Biểu đồ này cũng rất hữu ích khi cần quan sát mối tương quan giữa hay nhiều biến số trong nhiều nhóm. Để dễ hình dung thì tôi lấy câu “Vòng bụng càng lớn thì vòng đời càng ngắn” của người Việt chúng ta minh họa biểu đồ. Hình bên dưới là kết quả nghiên cứu của nhóm DataInDream4 theo dõi 3960 người có độ tuổi từ 18 đến 69 tuổi cho đến cuối đời. Để khách quan giữa người có chiều cao khác nhau thì cách so bụng có lớn hay không thì tính bằng cách lấy số đo vòng bụng (còn gọi là vòng eo – waist size) chia cho chiều cao được tính cùng đơn vị. Tỉ số này gọi là WhtR (Waist and heigth ratio). Đây là nhóm tôi tự đặt với ý là sẽ tự phịa ra dữ liệu để minh họa cho các bạn dễ nắm ý tưởng cần trình bày. Không phải tôi phịa lung tung mà sẽ cố gắng bám vào các nghiên cứu thực tế nhưng việc xin dữ liệu thật không mấy dễ dàng. Như vậy khi các bạn thấy chỗ nào tôi ghi nguồn dữ liệu từ nhóm này thì biết rồi đấy! Chỉ nên tập trung vào ý tưởng và kỹ thuật đang trình bày chứ không nên để ý tính chính xác của dữ liệu. 4 https://ThachLN.github.com/ebook.html 82 Chạm tới AI trong 10 ngày Khái niệm tương quan Hệ số tương quan Hệ số tương quan R2, tiếng Anh là R squared: là một chỉ số thống kê để đo của hai đối tượng (cá thể - nói theo ngôn ngữ thống kê). R squared dao động từ 0.0 đến 1.0. 0: có nghĩa là không có liên quan Giá trị càng cao cho thấy mức độ liên quan càng lớn. 1: Giá trị liên quan cao nhất. Ví dụ tính toán hệ số tương quan của 2 dãy số trong Python import numpy as np x_values = [1,2,3] y_values = [4,5,7] correlation_matrix = np.corrcoef(x_values, y_values) correlation_xy = correlation_matrix[0,1] r_squared = correlation_xy**2 print(r_squared) 0.9642857142857141 Trong các bài phân tính về hồi qui tuyến tính, hồi qui logistic chúng ta sẽ gặp lại khái niệm này và sẽ có cơ hội phân tích sâu hơn một chút. https://ThachLN.github.com/ebook.html 83 Chạm tới AI trong 10 ngày Biểu đồ dữ liệu theo thời gian Một loại dữ liệu đặc biệt là dữ liệu theo thời gian (time series). Ví dụ nếu bạn quan tâm đến chỉ số chứng khoán của Việt Nam (VNIndex) trong vài năm thì cần hình dung được bức tranh chung của nó như thế nào. Hình bên dưới là chỉ số VNIndex từ năm 2000 đến tháng 4/2020. https://ThachLN.github.com/ebook.html 84 Chạm tới AI trong 10 ngày Bài 9: Vẽ biểu đồ trong R Bài này trình bày mã nguồn R để giúp các bạn vẽ được các loại biểu đồ trong Bài 8. Mục đích của bài này là giúp bạn làm quen với kỹ thuật vẽ biểu đồ với R thôi chứ không đi sâu vào phân tích và giải thích. Vài khái niệm cơ bản Trong R, biểu đồ được xem như là một bức tranh do cách họa sĩ vẽ. Một biểu đồ gồm nhiều thành phần được xếp đặt theo một ý nghĩa nào đó giống như họa sĩ sắp đặt bức tranh. Ngoài thành phần chính là các loại biểu đồ và số liệu tương ứng thì các thành phần mang tính chất trang trí sau cũng là một phần rất quan trọng: Trang trí Chú pháp Ghi chú grid(nx, ny) Thêm lưới cho biểu đồ axis(side n,) Thêm trục x, y cho biểu đồ box(which=, ) Thêm box xung quanh biểu đồ legend Thêm ghú thích nhãn arrows(x,y) Thêm mũi tên, đường thẳng, kiểu của điểm ảnh (p, b, l, …) lines(x, y) points(x,y) abline(a,b) abline(h= or v=) Thêm đưởng biểu intercept; b: slope). diễn (a: h: horizontal; v: vertical segments(x0,x1,y0, y1) Thêm đoạn thẳng giữa 2 điểm (x0, y0) và (x1, y1) polygon(x,y) Thêm đa giác xác định bởi vector x và y text(x,y, "note") Thêm chữ trong biểu đồ https://ThachLN.github.com/ebook.html 85 Chạm tới AI trong 10 ngày Plot characters (pch) pch dùng để thể hiện kí hiệu tại điểm dữ liệu trên biểu đồ. R cung cấp 26 hình ảnh tương ứng với số thứ tự từ 0 đến 25 và có thể dùng thêm các kí tự (xem bảng bên phải) Loại đường kẻ (Line Type) Tham số lty sẽ chỉ định loại đường kẻ trong biểu đồ. lty có thể được khai báo dạng số thứ tự hoặc bằng tên (character string) như hình bên. https://ThachLN.github.com/ebook.html 86 Chạm tới AI trong 10 ngày Biểu đồ phân bố dữ liệu – Histogram Kết quả hai lệnh bên dưới: df = read.csv('https://thachln.github.io/datasets/TuyenVN.csv', header = T) hist(data$age, main = "Biểu đồ phân bố độ tuổi của tuyển bóng đá nam Việt Nam") Biểu đồ phân bố dữ liệu – Boxplot df = read.csv('https://thachln.github.io/datasets/TuyenVN.csv', header=T) boxplot(data$age, col = 'blue') https://ThachLN.github.com/ebook.html 87 Chạm tới AI trong 10 ngày Biểu đồ so sánh - Line Chart Ví dụ 1: Thống kê tăng trường GDP và CPI (đơn vị: %) của Việt Nam từ năm 2010 đến 2018 như sau Year 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 GDP 6.78 5.89 5.03 5.42 5.98 6.68 6.21 6.81 7.08 7.02 CPI 11.75 18.13 6.81 6.04 4.09 0.6 4.74 3.53 3.54 2.79 Để làm quen với các lệnh vẽ biểu đồ đơn giản trong R bạn cần tìm hiểu lệnh plot. Trong R để tìm hiểu một lệnh hoặc hàm thì dùng cú pháp ? Sau dấu hỏi có hoặc không có khoảng trắng. Ví dụ: https://ThachLN.github.com/ebook.html 88 Chạm tới AI trong 10 ngày > ? plot Sẽ cho hướng dẫn như sau: Bạn chưa quen với cách đọc hướng dẫn này thì cũng không sao. Cứ cố gắng đọc và dịch để hiểu nghĩa từ từ. Sau này quen dần sẽ thấy rất tiện lợi. Quay lại ví dụ về mức tăng trưởng GPD của chúng ta, để chuẩn bị dữ liệu thì chúng ta cần khai báo một biến gpd để chứa danh sách các giá trị: > gdp = c(6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02) > year = c(2010,2011,2012,2013,2014,2015,2016,2017,2018,2019) Sau đó dùng hàm plot với tham số type = ‘l’ (chữ l trong chữ line chứ không phải số 1 nhé, chú ý bao đóng chữ l trong cặp dấu ngoặc ‘’ hoặc “”). > plot(gdp, type = 'l') Kết quả sẽ có biểu đồ sau: https://ThachLN.github.com/ebook.html 89 Chạm tới AI trong 10 ngày Do chúng ta không ghi chú trục hoành (trục x) nên mặc định hàm plot sẽ lấy chỉ số (số thứ tự) của các giá trị làm trục hoành. Trục tung (trục y) chính là giá trị của biến đang vẽ, ở đây là biến gpd. Như vậy với một lệnh plot với type = ‘l’ thì chúng ta có ngay một biểu đồ line. Tuy nhiên, biểu đồ này còn rất thô sơ và chưa được trang trí gì cả. Ở đây chúng ta chỉ làm quen và bạn hãy cố gắng gõ lệnh vào R Studio để cảm nhận và quen tay. Thử dùng lệnh plot không có tham số type xem sao: > plot(gdp) Kết quả sẽ ra các điểm tròn như sau: https://ThachLN.github.com/ebook.html 90 Chạm tới AI trong 10 ngày type Hãy xem lại tài liệu hướng dẫn bằng lệnh “? = 'o' xem sao nhé! plot”. Sau đó thử plot lại gpd với plot(gdp, type = 'o') Nâng cấp thêm lệnh plot và trang trí một chút: https://ThachLN.github.com/ebook.html 91 Chạm tới AI trong 10 ngày plot(gdp ~ year, type = 'o', col = 'blue', xlab = 'Năm', ylab = '% Tăng trưởng GDP', main = 'Biểu đồ tăng trường GDP Việt Nam') Học thêm các tham số: • gdp ~ year: • type = 'o': • yêu cầu R plot giá trị gpd theo trục tung (y) theo các giá trị năm trên trục hoành (x). Type có giá trị là kí tự o thường yêu cầu R plot dấu tròn tại các giá trị của y. col = 'blue': • xlab, ylab: • main: (col viết tắt của color) vẽ màu xanh (lab viết tắt của label) cho biết nhẵn của trục x và trục y. cho biết tiêu đề của biểu đồ. Thử thách Hãy tạo dữ liệu cho chỉ số tăng trưởng CPI và dùng lệnh plot để vẽ điểu đồ line. Dùng lệnh ? để tìm hiểu thêm lệnh plot và thử dùng tham số type với các giá trị khác nhau. https://ThachLN.github.com/ebook.html 92 Chạm tới AI trong 10 ngày Biểu đồ so sánh - Bar Chart Ví dụ: Quay lại ví dụ chỉ số tăng trưởng GDP ở trên, chúng ta có thể vẽ biểu đồ thanh bằng lệnh barplot: > barplot(gdp) Tương tự lệnh plot ở trên, thêm vài tham số cho lệnh boxplot: barplot(gdp ~ year, col = 'blue', xlab = 'Năm', ylab = '% Tăng trưởng GDP', main = 'Biểu đồ tăng trường GDP Việt Nam') https://ThachLN.github.com/ebook.html 93 Chạm tới AI trong 10 ngày Ví dụ thống kê năm sinh (BirthYear), chiều cao (Height) và cân nặng (Weight) của các cầu thủ của đội tuyển nam Việt Nam trong năm 2019 như sau (Xem ví dụ trong Bài 6): Name Đặng Văn Lâm Nguyễn Tuấn Mạnh Phạm Văn Cường Đỗ Duy Mạnh Đoàn Văn Hậu Trần Văn Kiên Nguyễn Thành Chung Vũ Văn Thanh Nguyễn Hữu Tuấn Nguyễn Trọng Hoàng Bùi Tiến Dũng Quế Ngọc Hải Phạm Đức Huy Đỗ Hùng Dũng Nguyễn Quang Hải Nguyễn Tuấn Anh Lương Xuân Trường Nguyễn Phong Hồng Duy Nguyễn Huy Hùng Nguyễn Anh Đức Nguyễn Tiến Linh Nguyễn Văn Toàn Nguyễn Công Phượng Hà Minh Tuấn BirthYear Height Weight 1993 186 76 1990 177 72 1990 186 70 1996 180 70 1999 185 70 1996 168 64 1997 180 70 1996 173 67 1992 179 70 1989 169 67 1995 176 75 1995 180 77 1995 173 65 1993 170 67 1997 168 65 1995 176 65 1995 178 72 1996 168 67 1992 174 69 1985 181 72 1997 178 67 1996 170 61 1995 168 65 1991 178 71 Lệnh R để đọc file excel và vẽ biểu đồ cột đơn giản bằng barplot như sau: # install.packages('readxl') library('readxl') d = read_excel('D:/Temp/tuyenvn.xlsx') head(d) currYear = as.numeric(format(Sys.time(), "%Y")) currYear barplot(currYear - d$BirthYear) https://ThachLN.github.com/ebook.html 94 Chạm tới AI trong 10 ngày Lệnh install.packages('readxl') được đặt sau dấu # (đọc là thăng) có nghĩa là chú thích (R sẽ không thực thi lệnh này). Nếu bạn chưa cài thư viện readxl thì hãy bỏ dấu thăng đi. Lênh barplot được minh họa ở đây đơn giản gồm một biến tuổi. Tuổi được tính bằng cách lấy năm hiện tại trừ cho năm sinh. Ghi nhớ Để truy xuất một trường dữ liệu (field) hoặc cột (column) của data frame thì dùng dấu $ đặt giữa biến data frame và column. Để lấy thời gian hiện tại của máy thì dùng hàm Sys.time(). Sau đó dùng hàm format(.., "%Y") để lấy ra 4 kí tự của năm. Tiếp theo dùng hàm as.numeric để chuyển kí tự thành số. Kết quả năm hiện tại được gán vào biến currYear bởi lệnh sau: currYear = as.numeric(format(Sys.time(), "%Y")) Dấu đô la “$” trong biểu thức d$BirthYear có nghĩa là truy xuất cột dữ liệu BirthYear trong biến d (d ở đây là data frame). Biểu đồ so sánh - Radar Chart Code R sau hiển thị Radar chart để điểm ASK (Attitude, Skill, Knowledge – Thái độ, Kỹ năng, Kiến thức) của 2 ứng viên A và B. packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) https://ThachLN.github.com/ebook.html 95 Chạm tới AI trong 10 ngày } library('radarchart') labs = c('Knowledge', 'Skill', 'Attitude') scores = list( 'A' = c(8, 7.5, 6), 'B' = c(7, 8, 9.5) ) chartJSRadar(scores = scores, labs = labs, maxScale = 10) Biểu đồ tương quan đơn giản Đọc dữ liệu: df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) Xem vài dòng dữ liệu: head(df) id age sex height waist risk weight hit life 1 1 39 1 168 70 1 64 85 72.05 2 2 31 0 159 84 0 67 78 68.16 3 3 29 1 163 93 0 54 95 74.49 4 4 55 1 161 84 1 46 82 76.93 5 5 62 1 163 86 0 59 94 72.53 6 6 33 0 158 80 0 40 82 78.71 Chúng ta tự tính cột whtr rồi vẽ biểu đồ bằng hàm plot: df$whtr = df$waist / df$height plot(df$whtr, df$life, col = 'red', ylab = "Tuổi thọ", xlab = "Tỉ lệ vòng eo so với chiều cao", main = "Mối quan hệ 'tuổi thọ' và 'tỉ lệ vòng eo với chiều cao'") https://ThachLN.github.com/ebook.html 96 Chạm tới AI trong 10 ngày Biểu đồ tương quan scatterplot với thư viện car Chuyên nghiệp hơn một chút thì sử dụng hàm scatterplot trong thư viện “car” của R. Đoạn code bên dưới thực hiện cài thư viện “car” nếu máy bạn chưa có rồi đọc dữ liệu,vẽ biểu đồ: packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height library(car) scatterplot(df$life ~ df$whtr, col = 'red', ylab = "Tuổi thọ", xlab = "Tỉ lệ vòng eo so với chiều cao", main = "Mối quan hệ 'tuổi thọ' và 'tỉ lệ vòng eo với chiều cao'") https://ThachLN.github.com/ebook.html 97 Chạm tới AI trong 10 ngày Biểu đồ tương quan có phân nhóm Để phân nhóm theo giới tính thì thêm cú pháp “| sex” (dấu | là kí tự sọc đứng, phía trên phím Enter) như lệnh bên dưới. Cú pháp sử dụng dấu sọc đứng (broken bar) kết tiếp là một hoặc nhiều biến gọi là cú pháp tương tác. scatterplot(df$life ~ df$whtr | sex, col = c('red', 'blue'), ylab = "Tuổi thọ", xlab = "Tỉ lệ vòng eo so với chiều cao", main = "Mối quan hệ 'tuổi thọ' và 'tỉ lệ vòng eo với chiều cao'") https://ThachLN.github.com/ebook.html 98 Chạm tới AI trong 10 ngày Biểu đồ tương quan đa biến Scatterplot ở trên chỉ cung cấp biểu đồ thể hiện tương quan giữa 2 biến. Phức tạp hơn một chút, nến chúng ta muốn nhìn sự tương quan của nhiều biến trong một bộ dữ liệu thì dùng lệnh pairs.panels trong thư viện psych. packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } library(dplyr) # Lệnh bên dưới loại bỏ cột id df = df %>% select(-one_of(c('id'))) library(psych) pairs.panels(df) https://ThachLN.github.com/ebook.html 99 Chạm tới AI trong 10 ngày Biểu đồ dữ liệu theo thời gian Để minh họa vẽ biểu đồ theo thời gian thì tôi lấy dữ liệu chứng khoán Việt Nam làm ví dụ. Cụ thể là mã nguồn R bên dưới vẽ biểu đồ của chỉ số VNIndex cao nhất trong mỗi ngày từ năm 2000 đến thời điểm viết phần này. packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } df = read.csv('https://thachln.github.io/datasets/vnindex_20200424.txt', header = T) # Thêm cột strDate bằng cách lấy dữ liệu cột “X.DTYYYYMMDD.” chuyển thành kiểu kí tự (chuỗi). data$strDate = as.character(data$X.DTYYYYMMDD.) # Thêm cột data bằng cấy lấy dữ liệu cột “strDate” vừa thêm chuyển thành kiểu ngày bằng hàm as.Date(strDate, ‘%Y%m%d) https://ThachLN.github.com/ebook.html 100 Chạm tới AI trong 10 ngày data$date = as.Date(data$strDate, format = '%Y%m%d') library(zoo) head(data$X.High.) # Tạo dữ liệu x theo thời gian của giá trị cao nhất của VNIndex z = zoo(x = cbind(data$X.High.), order.by = data$date) # Vẽ biểu đồ VNIndex cao nhất theo ngày library(ggfortify) autoplot(z) Vẽ biểu đồ với ggplot2 Hadley Wickham, người New Zealand, là tác giả của ggplot2. Giới khoa học đánh giá ggplot2 như là cuộc cách mạng trong việc hiển thị dữ liệu. Phần này sẽ giúp các bạn hiểu được triết lý ggplot2 để tạo ra các biểu đồ chất lượng cao. https://ThachLN.github.com/ebook.html 101 Chạm tới AI trong 10 ngày Hadley Wickham đưa ra triết lý biểu đồ được xem như là bức tranh hoàn chỉnh. Để vẽ bức tranh thì đầu tiên phải bày ra canvas, giống như khung vải cho bức tranh. Thứ hai là phải có ý tưởng vẽ cái gì. Thứ ba là chọn màu sắc và ánh sáng, một yếu là quan trọng. Cách xây dựng biểu đồ giống như là vẽ bức tranh. Cụ thể gồm các thành phần sau: Thành phần Ghi chú Layer - Tầng Biểu đồ gồm nhiều layer: Layer 1: định nghĩ biến phân tích cần vẽ: aes() Layer 2: thể loại biểu đồ: geom_xxx() Layer 3: màu, kích thước, v.v…:theme_xxx() … Geometric objects (geom) – đối tượng hình học Geometric object Ý nghĩa geom_histogram(x=) Biểu đồ phân bố geom_boxplot(x=) Biểu đồ hộp geom_bar(x=) Biểu đồ thanh geom_point(x=, y=) Biểu đồ điểm geom_line(x=, y=) Biểu đồ đường thẳng goem_smooth(x=, y=) Biểu đồ smooth goem_density(x=, y=) Biểu đồ với xác suất phân b Aesthetics Data: dữ liệu (aes) – thẩm Color: màu sắc mỹ Size: kích thước https://ThachLN.github.com/ebook.html 102 Chạm tới AI trong 10 ngày Shape: Hình dạng Location: vị trí của biểu đồ Một biểu đồ đầu tiên có nhiều layer. Tiếp theo là đối tượng hình học. Đối tượng hình học có thể là bar, line, point, v.v… Tiếp theo là yếu tố thứ ba liên quan đến thẩm mỹ (màu sắc, kích thước, hình dạng, vị trí). Ba yếu tố tên kết hợp với các biến dữ liệu sẽ cho ra một biểu đồ như là một bức tranh. Văn phạm và thành tố của ggplot2: Để vẽ biểu đồ thì đầu tiên là phải có dữ liệu và lựa chọn biến số. Tiếp theo là phải suy nghĩ ra hình thức thể hiện. Tiếp theo là ghi cái nhãn cho trục x và y. Tiếp theo nữa là thiết lập cái theme (cảnh nền). Cuối cùng là có thể hoán chuyển như dữ liệu % thành log; hoặc hoán chuyển trục tung và trung hoành để thể hiện mối liên quan. Để minh họa thì chúng ta quay lại bộ dữ liệu nghiên cứu sức khỏe. Chúng ta đọc dữ liệu vào và tính cột tỉ số eo mông (whtr). Tiếp theo là chuyển cột sex thành kiểu yếu tố do biến sex gồm hai giá trị 0, 1 sẽ được lệnh read.csv hiểu là integer. Bạn có thể kiểm tra lại bằng lệnh class(df$sex). packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } library(ggplot2) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height df$sex = as.factor(df$sex) head(df) 1 2 3 4 5 6 id age sex height waist risk weight hit life whtr 1 23 0 148 69 0.0 38 77 77.50 0.4662162 2 26 1 171 82 0.0 57 95 75.37 0.4795322 3 66 1 164 86 0.0 77 89 66.09 0.5243902 4 55 1 170 89 0.0 73 90 69.59 0.5235294 5 30 0 154 76 0.0 59 83 70.01 0.4935065 6 27 1 173 79 0.6 66 91 72.76 0.4566474 Chúng ta cần thể hiện mối liên quan giữa tỉ số eo mông whtr và tuổi thọ life. Như vậy biến x = whtr, y = life. Lệnh sau sẽ chuẩn bị canvas gồm trục x là whtr và y là life. https://ThachLN.github.com/ebook.html 103 Chạm tới AI trong 10 ngày p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p Bước này giống như họa sỉ căng khung vải chuẩn bị cho bức tranh. Bước kế tiếp là thể hiện đối tượng hình học (geometry, xem danh sách các geometry ở trang trước). Ví dụ chọn đối tưởng hình học là “điểm” bằng cách ghép đối tượng p với geom_point() bằng phép toán cộng. p = p + geom_point() p https://ThachLN.github.com/ebook.html 104 Chạm tới AI trong 10 ngày Tiếp theo, thể hiện thêm biểu đồ bằng mô hình bằng cách vẽ chồng đối tượng geom_smooth() như sau: p = p + geom_smooth() p https://ThachLN.github.com/ebook.html 105 Chạm tới AI trong 10 ngày Hình trên có vẻ mối tương quan giữa tỉ số eo mông và tuổi thọ theo phương trình tuyến tính. Vùng mờ mờ xung quanh đường “tuyến tính” (giống đám mây) là khoảng tin cậy 95%. KTC 95% cho biết khoảng dao động. Với tỉ số eo mông dưới 0.4 và trên 0.6 thì khoảng tin cậy 95% rộng. Lý do là số đối tượng nghiên cứu ít, nên độ lệch chuẩn lớn. Vì thế khoảng tin cậy 95% cũng rộng ra. Đường kẻ liền nét là mô hình tuyến tính bậc 1. Nếu thử mô hình tuyến tính bậc 2 thì sao. Chúng ta bổ sung thêm tham số cho geom_smotth như sau: p = p + geom_smooth(method = "lm", formula = y~x + I(x^2)) p lm là linear model (linear đọc là lin-near, chứ không phải là lai-near) Quan sát kỹ thì mô hình tuyến tính bậc 2 cũng không khác mấy. Chỉ có nam (sex = 1) thì khi whtr > 0.63 thì tuổi thọ thấp xuống một chút. Bước 3: Thêm layer liên quan đến nhãn cho trục tung và trục hoành. Nếu trục tung, trục hoành là biến rời rạc (discrete) dùng dùng hàm scale như sau: scale_x_discrete(name=’xxx’, limits=c(‘A’, ‘B’, ‘C’) scale_y_discrete(name=’xxx’, limits=c(‘X’, ‘Y’, ‘Z’) Nếu trục tung, trục hoành là biến liên tục (continuous) dùng dùng hàm scale như sau: https://ThachLN.github.com/ebook.html 106 Chạm tới AI trong 10 ngày scale_x_continuous(name=’xxx’, limits=c(lower, upper), break = c(1, 2, 5, 10)) scale_y_continuous(name=’xxx’, limits=c(lower, upper), break = c(0, 5, 10, 20)) Cụ thể quay lại biểu đồ ở trên, thêm layer scale và code viết lại toàn bộ như sau: library(ggplot2) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() p = p + geom_smooth(method = "lm", formula = y~x + I(x^2)) p = p + scale_x_continuous(name = "whtr", limits = c(0.4, 0.6)) + scale_y_continuous(name='life', limits = c(60, 80)) p https://ThachLN.github.com/ebook.html 107 Chạm tới AI trong 10 ngày Lúc này x được scale từ 0.4 đến 0.6; x được scale từ 60 đến 80 tuổi. Bổ sung thêm break: library(ggplot2) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() p = p + geom_smooth(method = "lm", formula = y~x + I(x^2)) p = p + scale_x_continuous(name = "whtr", breaks=seq(0.4,0.6, 0.025)) + scale_y_continuous(name='life', breaks = seq(60, 80, 2)) p Kết hợp vừa breaks và limits như sau: library(ggplot2) https://ThachLN.github.com/ebook.html 108 Chạm tới AI trong 10 ngày df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() p = p + geom_smooth(method = "lm", formula = y~x + I(x^2)) p = p + scale_x_continuous(name = "whtr", breaks=seq(0.4,0.6, 0.025), limits = c(0.4, 0.6)) + scale_y_continuous(name='life', breaks = seq(60, 80, 2), limits = c(60, 80)) p Bước 4: Nhãn và tiêu đề • Nhãn cho trục x và y: xlab('Tỉ số eo mông') + ylab('Tuổi thọ') • Tiêu đề ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") https://ThachLN.github.com/ebook.html 109 Chạm tới AI trong 10 ngày • Vị trí của legends theme(legend.position = ‘xxx') xxx = ‘top’, ‘bottom’, ‘none’ Code mới như sau: library(ggplot2) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() + geom_smooth() p = p + theme(legend.position = 'top') p = p + xlab('Tỉ số eo mông') + ylab('Tuổi thọ') p = p + ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") p Lần này cái legend giải thích giới tính được chuyển lên trên để không gian vẽ biểu đồ rộng hơn. Ngoài ra, Nhãn của trục x, trục y và tiêu đề của biểu đồ cũng được thêm vào. https://ThachLN.github.com/ebook.html 110 Chạm tới AI trong 10 ngày Bước 4: Thêm text cho trục x và trục y Thêm định sạng màu sắc, kích thước chữ, góc nghiên chữ cho nhãn của trục x và y như sau: library(ggplot2) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() + geom_smooth() p = p + theme(legend.position = 'top', axis.text.x = element_text(face = 'bold', color = 'red', size = 14, angle = 45), axis.text.y = element_text(face = 'bold', color = 'blue', size = 15) ) p = p + xlab('Tỉ số eo mông') + ylab('Tuổi thọ') p = p + ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") p https://ThachLN.github.com/ebook.html 111 Chạm tới AI trong 10 ngày Trang trí thêm cho tiêu đề: packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } library(ggplot2) library(ggthemes) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() + geom_smooth() p = p + xlab('Tỉ số eo mông') + ylab('Tuổi thọ') p = p + ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") p = p + theme(legend.position = 'top', plot.title=element_text(hjust = 0.5, color='red', face = 'bold', size = 15)) p https://ThachLN.github.com/ebook.html 112 Chạm tới AI trong 10 ngày Sử dụng theme có sẵn của tòa báo Time Economist: packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } library(ggplot2) library(ggthemes) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() + geom_smooth() p = p + xlab('Tỉ số eo mông') + ylab('Tuổi thọ') p = p + ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") p = p + theme_economist() p https://ThachLN.github.com/ebook.html 113 Chạm tới AI trong 10 ngày Trong Rstudio thì nó đoán là bạn gõ cái gì thì nó sẽ hiện ra các theme tương tứng có sẵn trong thư viện đã cài. Bạn có thể chọn các theme khác để thử thêm như hình bên dưới: Nếu khó tính hơn nữa thì cần phải nhìn thêm histogram của dữ liệu tỉ số eo mông và tuổi thọ. Dùng thêm phần mềm ggExtra. packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } packages 0) { install.packages(setdiff(packages, rownames(installed.packages()))) } https://ThachLN.github.com/ebook.html 114 Chạm tới AI trong 10 ngày library(ggplot2) library(ggthemes) library(ggExtra) df = read.csv('https://thachln.github.io/datasets/sample_health_vn.csv', header = T) df$whtr = df$waist / df$height head(df) df$sex = as.factor(df$sex) p = ggplot(data=df, aes(x=whtr, y=life, fill=sex, color=sex)) p = p + geom_point() + geom_smooth() p = p + xlab('Tỉ số eo mông') + ylab('Tuổi thọ') p = p + ggtitle("Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.") p = p + theme(legend.position = 'top', plot.title=element_text(hjust = 0.5, color='red', face = 'bold', size = 15)) ggMarginal(p, type='histogram', col = 'white', fill = 'blue') Chú ý đoạn code trên có sự khác biệt một chút là lệnh ggMarginal sẽ vẽ luôn biểu đồ. Trong khi các đoạn code phía trước bạn phải gõ biến b ở dòng cuối cùng để vẽ biểu đồ trong đối tượng p. https://ThachLN.github.com/ebook.html 115 Chạm tới AI trong 10 ngày Một điểm chú ý nữa là title của biểu đồ không hiển thị hết dấu tiếng Việt. Cụ thể là các chữ có 2 dấu như ể, ồ, ố thì hiển thị mất một dấu. Đây là vấn đề xử lý chữ của thư viện ggplot2. Chúng ta khắc phục trong một bài khác. https://ThachLN.github.com/ebook.html 116 Chạm tới AI trong 10 ngày Bài 10: Vẽ biểu đồ trong Python Tương tự Bài 9, bài này giúp các bạn yêu thích Python có thể vẽ nhanh được các loại biểu đồ được giới thiệu trong Bài 8. Mục đích của bài này là giúp bạn làm quen với kỹ thuật vẽ biểu đồ với Python thôi chứ không đi sâu vào phân tích và giải thích. Biểu đồ phân bố dữ liệu - Histogram import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('https://thachln.github.io/datasets/TuyenVN.csv') plt.hist(df["age"]) Ghi chú: • Trong Python, cú pháp để truy xuất cột dữ liệu trong data frame là dùng cặp dấu ngoặc vuông [], bên trong cặp [] là tên cột bao đóng bởi cặp dấu nháy (nháy đơn hoặc đôi đều được. Ví dụ data: df["age"] • Còn trong R, thì cú pháp là dùng dấu $ ngay sau tên biến của data frame, tiếp theo là tên của cột mà không cần bao đóng bởi dấu nháy. Ví dụ: data$age Trang trí thêm trục x và y: import pandas as pd import matplotlib.pyplot as plt https://ThachLN.github.com/ebook.html 117 Chạm tới AI trong 10 ngày df = pd.read_csv('https://thachln.github.io/datasets/TuyenVN.csv') plt.xlabel('Tuổi') plt.ylabel('Số lượng') plt.hist(df['age']) Để trang trí thêm tiêu đề cho biểu đồ thì trong thư viện matplot cung cấp đối tượng Figure. import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('https://thachln.github.io/datasets/TuyenVN.csv') fig = plt.figure() fig.suptitle('Biểu đồ phân bố độ tuổi của tuyển bóng đá nam Việt Nam.') plt.xlabel('Tuổi') plt.ylabel('Số lượng') plt.hist(df['age']) https://ThachLN.github.com/ebook.html 118 Chạm tới AI trong 10 ngày Biểu đồ phân bố dữ liệu – Boxplot Thư viện pandas ngoài việc cung cấp chức năng đọc dữ liệu từ file vào data frame nó có luôn hàm xem dữ liệu dạng boxplot luôn. Dưới đây là ví dụ: import pandas as pd df = pd.read_csv('https://thachln.github.io/datasets/TuyenVN.csv') df.boxplot(column = ['age']) Bạn thấy với Python thì hàm boxplot được gọi trực tiếp từ đối tượng chứa dữ liệu (biến data) luôn chứa không cần phải qua hàm vẽ nào hết. Về logic thì rất dễ hiểu: lệnh df.boxplot(column = ['age']) ý nói là cho tôi thấy dữ liệu dạng boxplot với lựa chọn là chỉ vẽ cột ‘age’ thôi. Một cách khác là sử dụng thư viện Seaborn với code như sau: import pandas as pd https://ThachLN.github.com/ebook.html 119 Chạm tới AI trong 10 ngày import seaborn as sns df = pd.read_csv('https://thachln.github.io/datasets/TuyenVN.csv') sns.boxplot(y=df["age"]) Biểu đồ so sánh - Line Chart – 1 biến import pandas as pd import matplotlib.pyplot as plt gdp = [6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02] year = [2010,2011,2012,2013,2014,2015,2016,2017,2018,2019] # Tạo data frame df = pd.DataFrame({'gdp': gdp, 'year': year}) plt.figure().suptitle('Biểu đồ tăng trưởng GDP của Việt Nam từ năm 2010 đến 2019') plt.xlabel('Năm') plt.ylabel('Tăng trưởng GDP (%)') plt.plot(df['year'], df['gdp']) https://ThachLN.github.com/ebook.html 120 Chạm tới AI trong 10 ngày Biểu đồ so sánh tốc độ tăng trưởng GPD theo năm dùng biểu đồ thanh BarPlot Biểu đồ so sánh - Line Chart – 2 biến import pandas as pd import matplotlib.pyplot as plt gdp = [6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02] year = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,2019] cpi = [9.19,18.58, 9.21, 6.60, 4.09, 0.63, 2.66, 3.53, 3.54, 3.89] # Tạo data frame df = pd.DataFrame({'gdp': gdp, 'year': year, 'cpi': cpi}) plt.figure().suptitle('Biểu đồ tăng trưởng GDP của Việt Nam từ năm 2010 đến 2019') plt.xlabel('Năm') plt.ylabel('Tăng trưởng GDP (%)') plt.plot(df['year'], df['gdp'], label = 'GDP') plt.plot(df['year'], df['cpi'], label = 'CPI') plt.legend() https://ThachLN.github.com/ebook.html 121 Chạm tới AI trong 10 ngày Biểu đồ so sánh - Bar Chart Trong Python, để vẽ biểu đồ BarPlot thì dùng thư viện Seaborn. Seaborn không phải là một thư viện độc lập mà nó được phát triển trên nền của Matlibplot. Seaborn có thể dùng kết hợp với Matlibplot để vẽ nhiều biểu đồ hơn, nhiều lệnh để trang trí biểu đồ đẹp hơn. Chúng ta có thể kết hợp hai thư viện Matlib và Seaborn để vẽ và trang trí biểu đồ như bên dưới: import pandas as pd import matplotlib.pyplot as plt import seaborn as sns gdp = [6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02] year = [2010,2011,2012,2013,2014,2015,2016,2017,2018,2019] # Tạo data frame df = pd.DataFrame({'gdp': gdp, 'year': year}) plt.figure().suptitle('Biểu đồ tăng trưởng GDP của Việt Nam từ năm 2010 đến 2019') fig = sns.barplot(df['year'], df['gdp']) plt.xlabel('Năm') plt.ylabel('Tăng trưởng GDP (%)') https://ThachLN.github.com/ebook.html 122 Chạm tới AI trong 10 ngày Biểu đồ so sánh - Radar Chart Phần code này mang tính giới thiệu cho các bạn cảm nhận được cách vẽ biểu đồ radar. Tôi tạm bỏ qua phần giải thích vì nó mang tính kỹ thuật hơi nhiều. Tạm thời bạn hãy bỏ qua sự phức tạm kỹ thuật này. import numpy as np import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({ 'Employee': ['A', 'B'], 'Knowledge': [8, 7], 'Skill': [7.5, 8], 'Attitude': [6, 9.5] }) attributes = list(df.columns[1:]) values = list(df.values[:, 1:]) employees = list(df.values[:, 0]) angles = [n / float(len(attributes)) * 2 * np.pi for n in range(len(attributes))] # Close the plot angles += angles[:1] values = np.asarray(values) https://ThachLN.github.com/ebook.html 123 Chạm tới AI trong 10 ngày values = np.concatenate([values, values[:, 0:1]], axis=1) # Create figure plt.figure(figsize=(4, 4), dpi=150).suptitle('Biểu đồ so sánh tam giác ASK của 2 người.') # Create subplots for i in range(2): ax = plt.subplot(1, 1, 1, polar=True) ax.plot(angles, values[i], label = employees[i]) ax.set_yticks([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) ax.set_xticks(angles) ax.set_xticklabels(attributes) plt.legend() # Set tight layout plt.tight_layout() # Show plot plt.show() Biểu đồ tương quan đơn giản import pandas as pd import seaborn as sns import matplotlib.pyplot as plt https://ThachLN.github.com/ebook.html 124 Chạm tới AI trong 10 ngày df = pd.read_csv('https://thachln.github.io/datasets/sample_health_vn.csv') df.head() df['whtr'] = df['waist'] / df['height'] plt.figure().suptitle("Mối quan hệ 'tuổi thọ' và 'tỉ lệ vòng eo với chiều cao'") sns.set(style="ticks") sns.relplot(x="whtr", y="life", data=df) plt.xlabel('Tỉ số vòng eo và chiều cao') plt.ylabel('Tuổi thọ') Biểu đồ tương quan có phân nhóm import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.read_csv('https://thachln.github.io/datasets/sample_health_vn.csv') df.head() df['whtr'] = df['waist'] / df['height'] plt.figure().suptitle("Mối quan hệ 'tuổi thọ' và 'tỉ lệ vòng eo với chiều cao'") https://ThachLN.github.com/ebook.html 125 Chạm tới AI trong 10 ngày sns.set(style="ticks") sns.relplot(x="whtr", y="life", col="sex", data=df) plt.xlabel('Tỉ số vòng eo và chiều cao') plt.ylabel('Tuổi thọ') Trang trí thêm một chút bằng cách vẽ các điểm ảnh có tô màu khác nhau theo tuổi (age). Tuổi này là tuổi tại thời điểm bắt đầu nghiên cứu, khác với biến life là tuổi thọ. Lệnh bên dưới dùng thêm tham số hue = ‘age’: import seaborn as sns import pandas as pd df = pd.read_csv('https://thachln.github.io/datasets/sample_health_vn.csv') df.head() df['whtr'] = df['waist'] / df['height'] sns.set(style="ticks") sns.relplot(x="whtr", y="life", col="sex", hue='age', data=df) https://ThachLN.github.com/ebook.html 126 Chạm tới AI trong 10 ngày Một vài điểm quan sát từ dữ liệu trên: - Các chấm đen có thiên hướng lệch dần về bên phải. Tức là càng nhiều tuổi thì tì lệ whtr các lớn. Nói nôm nay càng lớn tuổi thì bụng càng phệ. - Xu hướng “Vòng eo càng lớn thì vòng đời càng ngắn” trong nam giới rõ ràng hơn là nữ giới. Biểu đồ tương quan đa biến Để vẽ biểu đồ trình bày mối tương quan của các biến trong data frame thì thư viện Seaborn cung cấp hàm pairplot. Đoạn code bên dưới xóa bớt các cột id, rish, hit sau khi đọc từ dữ liệu mẫu. import seaborn as sns import pandas as pd df = pd.read_csv('https://thachln.github.io/datasets/sample_health_vn.csv') # Lệnh bên dưới loại bỏ cột id df = df.drop(axis = '1', columns = ['id', 'risk', 'hit']) sns.pairplot(df) https://ThachLN.github.com/ebook.html 127 Chạm tới AI trong 10 ngày Biểu đồ dữ liệu theo thời gian import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('https://thachln.github.io/datasets/vnindex_20200424.txt') df.head() pd.to_datetime('13000101', format='%YYYY%mm%dd', errors='coerce') df['date'] = pd.to_datetime(df[''], format='%Y%m%d') plt.plot(df['date'], df['']) https://ThachLN.github.com/ebook.html 128 Chạm tới AI trong 10 ngày Vẽ biểu đồ với ggplot2 Trong R thì ggplot2 rất ư được sử dụng vì triết lý của nó rất hay “Xem biểu đồ như là một bức tranh hoàn thiện” nên có nhiều lệnh giúp người chủ động trang trí bức tranh. Còn trong Python thì cũng có nhiều thư viện để vẽ biểu đồ như tôi đã giới thiệu cho bạn làm quen ở trên. Có một câu hỏi đặt ra trong phần này là “Nếu tôi đã quen với ggplot2 trong R thì có cách nào để tôi vận dụng vào Python hay không?”. Đầu tiên là cần cài đặt thư viện rpy2 vào môi trường Python bằng các copy & paste lệch sau vào dấu nhắc của Anaconda: conda install -c r rpy2 Để chuẩn bị cho ví dụ thì cài đặt tiếp module tzlocal pip install tzlocal https://ThachLN.github.com/ebook.html 129 Chạm tới AI trong 10 ngày Tiếp theo cài đặt gói ggplot2: from rpy2.robjects.packages import importr utils = importr('utils') utils.install_packages('ggplot2') from rpy2.robjects.packages import importr import pandas as pd from rpy2.robjects import pandas2ri import rpy2.robjects.lib.ggplot2 as ggplot2 import uuid from IPython.core.display import Image, display grdevices = importr('grDevices') df = pd.read_csv('https://thachln.github.io/datasets/sample_health_vn.csv') df['whtr'] = df['waist'] / df['height'] df['sex'] = df['sex'].astype('category') df.head() pandas2ri.activate() r_dataframe = pandas2ri.py2ri(df) pp = ggplot2.ggplot(r_dataframe) + \ ggplot2.aes_string(x='whtr', y='life', col = 'sex') + \ ggplot2.geom_point() + \ ggplot2.geom_smooth(ggplot2.aes_string(group = 'sex'), method = 'lm') + \ ggplot2.labs(x='Tỉ số eo mông', y='Tuổi thọ', title='Biểu đồ tương quan giữa tỉ số eo mông và tuổi thọ.') fn = '{uuid}.png'.format(uuid = uuid.uuid4()) grdevices.png(fn, width = 600, height = 400) pp.plot() grdevices.dev_off() https://ThachLN.github.com/ebook.html 130 Chạm tới AI trong 10 ngày image = Image(filename=fn) display(image) https://ThachLN.github.com/ebook.html 131 Chạm tới AI trong 10 ngày Bài 11: Nguyên tắc soạn biểu đồ Từ Bài 8 đến Bài 11 bạn đã làm quen với các loại biểu đồ phổ biến. Trong đó đã giúp các bạn sử dụng các lệnh R và cả Python để trình bày được các biểu đồ. Nói chung các vấn đề kỹ thuật thì chắc các bạn cũng không gặp khó khăn gì. Bài này sẽ chia sẻ với các bạn vài hướng dẫn để giúp các bạn soạn biểu đồ có chất lượng cao. Phản ảnh trung thực dữ liệu Với góc nhìn của người phân tích dữ liệu thì chúng ta đi tìm thêm thông tin từ dữ liệu, thông thường là các con số. Nếu hình ảnh hóa tối đa thì có cơ may phát hiện thêm nhiều thông tin quí quá như: - Hình dung được bức tranh tổng thể của dữ liệu. Ví dụ sử dụng các biểu đồ histogram có thể mường tượng nhanh phân bố của giữ liệu. Plot hoặc boxplot có thể phát hiện nhanh các dữ liệu outliner (ngoại vi hay ngoại biên) - Phát hiện dược qui luật của dữ liệu. - Phát hiện được mối tương quan của dữ liệu. Vì thế cần phải trình bày biểu đồ sao cho rõ ràng, áp dụng đúng loại biểu đồ để phản ánh dữ liệu. Tiết kiệm mực in Có thể đây đơn thuần là bài toán kinh tế. Tức là trên một trang giấy nếu bạn dùng ít mực in mà cung cấp được nhiều thông tin nhất thì sẽ có lợi nhất. Vì vậy chúng ta cần chọn biểu đồ, màu sắc sao cho cung cấp cho người đọc nhiều thông tin nhất có thể. Nếu in ra giấy thì tiết kiệm mực nhất có thể. Bạn thử hình dung trong công ty, sếp của bạn yêu cầu bạn (Data Analyst hoặc Data Scientist) in tài liệu mà bạn đã phân tích về tình hình kinh doanh của công ty cho các nhà đầu tư xem trong lúc sếp trình chiếu. Nếu nhà đầu tư cầm bảng tài liệu như các hình minh họa bên trái dưới đây thì họ nghĩ gì? Có thể câu đầu tiên họ hỏi là sao các bạn không biết tiết kiệm mục in vậy? Câu này tôi tưởng tượng ra thôi, có thể lắm chứ? Nếu họ không hỏi như vậy thì chắc họ cũng đánh giá tài liệu không chuyên nghiệp? Một số minh họa NÊN và KHÔNG NÊN KHÔNG NÊN https://ThachLN.github.com/ebook.html NÊN 132 Chạm tới AI trong 10 ngày https://ThachLN.github.com/ebook.html 133 Chạm tới AI trong 10 ngày Bài 12: Giới thiệu Matplotlib Trong ngày đầu tiên bạn đã làm quen với các loại biểu đồ và đã biết thư viện matplotlib. Tuy nhiên bài này sẽ dành riêng để tìm hiểu về thư viện vẽ biểu đồ phổ biến trong Python này. Matplotlib rất phổ biến trong giới data science (khoa học dữ liệu) và machine learning (máy học). Matplotlib được John Hunter phát triển từ năm 2003, lấy ý tưởng từ phần mềm nổi tiếng MATLAB. Cốt lõi của Matplotlib Matplotlib xem biểu đồ gồm có 2 thành phần chính: • Figure: Figure được xem như là khung vải mà họa sĩ chuẩn bị để vẽ một bức tranh • Axes: Axes là đối tượng cần vẽ, giống như nội dung bức tranh. Trong bức tranh này có trục x, trục y, các giá trị cần thể hiện trong không gian x,y (Markers, Lines, Grid); các thành phần khác để trang trí như: tên trục x (x axis label), tên trục y (y axis label), tiêu đề bức tranh (title), ghi chú (Legend). Trên hai trục xy thì có thêm các kí hiệu chia đơn vị chính (Major stick), nhãn giá trị đơn vị chính (Major stick label); kí hiệu chia đơn vị phụ (Minor stick), nhãn giá trị đơn vị phụ (Minor stick label) https://ThachLN.github.com/ebook.html 134 Chạm tới AI trong 10 ngày Sub module pylot của Matplotlib Module pylot sẽ giúp chúng ta vẽ các biểu đồ mà không cần tốn nhiều thì giờ cho việc trang trí (sử dụng Figure và Axes). Để sử dụng sub module pylot của matplotlib thì dùng cú pháp sau: import matplotlib.pyplot as plt Nạp thư viện pyloy với tên viết tắt (alias) plt. Tạo figure tạo khung tranh Đầu tiên là là gọi hàm figure() để tạo ra đối tượng Figure: plt.figure() https://ThachLN.github.com/ebook.html 135 Chạm tới AI trong 10 ngày Mặc định Python sẽ tạo ra bức tranh có kích thước 432 x 288 (tương ứng width x height). Kích thước này tưng ứng với 6.4 inches chiều rộng và 4.8 inches chiều ngang với dpi là 100 (5). Để thay đổi kích thước của biểu đồ thì truyền thêm tham số # Thiết lập bề rộng và chiều cao plt.figure(figsize=(10, 5)) # Thiếp lập dpi: Số điểm ảnh trên một đơn vị Inch plt.figure(dpi=300) Out: Đóng figure tạo khung tranh Đối tượng figure được tạo dùng để vẽ tiếp chi tiết bức tranh. Khi không dùng nữa thì gọi hàm close() để đóng đối tượng. Tức là hủy đối tượng figure. Ví dụ bạn là họa sĩ trên Python, chuẩn bị bày tấm vải ra chuẩn bị vẽ biểu đồ thì có ai đó rủ đi café, đá bóng, tám chuyện thì vội đóng lại. Code Python như sau: import matplotlib.pyplot as plt # Thiết lập bề rộng và chiều cao plt.figure(figsize=(10, 5)) # Thiếp lập dpi: Số điểm ảnh trên một đơn vị Inch plt.figure(dpi=300) plt.close() Lệnh plt.close() không có tham số thì mặc định cái figure hiện tại sẽ bị hủy (đóng). Nếu có nhiều figure được tạo và muốn hủy tất cả thì truyền thêm tham số chuỗi ' all', hoặc "all" “all”) plt.close('all') Nếu muốn đóng một figure cụ thể thì chỉ rõ số thứ tự trong tham số num: import matplotlib.pyplot as plt Để chuyển đổi độ phân giải màn hình và dpi (Dots per Inch) sang kích thước thật thì không quá phức tạp. Tuy nhiên, bạn hãy tạm bỏ qua cái này. 5 https://ThachLN.github.com/ebook.html 136 Chạm tới AI trong 10 ngày # Tạo Figure với số 1. Thiết lập bề rộng và chiều cao plt.figure(num=1, figsize=(10, 5)) # Thiếp lập dpi: Số điểm ảnh trên một đơn vị Inch plt.figure(dpi=300) # Đóng Figure với số 1 plt.close(1) Cấu trúc format Format ở đây là định dạng của tham số thứ ba trong hàm plot([x], y, [format]) sẽ được giải thích ỏ mục tiếp theo. Format này gồm 3 phần [color][marker][line] được trình bày theo 2 dạng: - Dạng gọn: ‘bo--’ - Dạng đầy đủ: color='blue', marker='o', linestyle='dashed' Định dạng marker Marker là kí hiệu để vẽ biểu đồ. Maker phổ biến là điểm (point) tại giá trị của (xi, yj): Tra cứu kí hiệu marker tại link: https://matplotlib.org/3.1.1/api/markers_api.html Vài marker tiêu biểu: marke r symbo l description marke r symbo l description "." point "s" square "," pixel "p" pentagon "o" circle "P" plus (filled) "v" triangle_dow n "*" star "^" "h" triangle_up hexagon1 "" triangle_right "+" plus "1" "x" x tri_down "2" "X" tri_up x (filled) "3" "D" tri_left diamond "4" tri_right "d" thin_diamond "8" "|" vline octagon https://ThachLN.github.com/ebook.html 137 Chạm tới AI trong 10 ngày marke r symbo l description "_" hline Định dạng màu sắc Kí hiệu Màu Kí hiệu Màu b blue c cyan r red b black g green w white m magenta y yellow Định dạng loại đường kẻ (styleline) – nối các point Kí hiệu Mô tả Ví dụ '-' solid line style ⎯⎯⎯⎯⎯⎯⎯⎯ '--' dashed line style ------------------------ '-.' dash-dot line style ':' dotted line style Vẽ biểu đồ với 2 dãy x, y Hàm plot([x], y, [format]) sẽ vẽ biểu đồ gồm các điểm theo tọa độ của x, y. Nếu không có x thì mặc định x sẽ là dãy số 0, 1, 2, … [format] là định dạng 3 thông tin: color, marker và stylesline. Định dạng này có thể viết tắt gồm các kí hiệu đã mô tả trong phần trên: plt.plot(x, y, 'bo--') hoặc viết đầy đủ theo dạng truyền tham số thông thường: plt.plot(x, y, color='blue', marker='o', linestyle='dashed') Nhắc lại: kí hiệu [] bao đóng tham số cho biết là không bắt buộc được chỉ định (sẽ sử dụng gía trị mặc định). import matplotlib.pyplot as plt # Tạo Figure với số 1. Thiết lập bề rộng và chiều cao https://ThachLN.github.com/ebook.html 138 Chạm tới AI trong 10 ngày plt.figure(num=1, figsize=(10, 5)) # Thiếp lập dpi: Số điểm ảnh trên một đơn vị Inch plt.figure(dpi=300) x = [1, 2, 3, 5] y = [2, 4, 6, 8] plt.plot(x, y, 'o') Thử plot với format khác nhau để tự khám phá ý nghĩa các kí hiệu: plt.plot(x, y, 'bo--') plt.plot(x, y, color='blue', marker='o', linestyle='dashed') https://ThachLN.github.com/ebook.html 139 Chạm tới AI trong 10 ngày plt.plot(x, y, 'rv') plt.plot(x, y, color='magenta', marker='v') Lệnh này truyền 2 tham số color và marker, không truyền tham số styleline thì mặc định có kẻ đường nối giữa các point kề nhau. Vẽ biểu đồ với nhiều dãy x, y Có thể mở rộng gồm 2 bộ tham số: x1 = [1, 2, 3, 5] y1 = [2, 4, 6, 8] x2 = [1, 2, 4, 5] y2 = [3, 6, 7, 9] plt.plot(x1, y1, 'rv', x2, y2, 'bo--') https://ThachLN.github.com/ebook.html 140 Chạm tới AI trong 10 ngày Với 3 bộ tham số: x1 = [1, 2, 3, 5] y1 = [2, 4, 6, 8] x2 = [1, 2, 4, 5] y2 = [3, 6, 7, 9] x3 = [1, 2, 3, 4] y3 = [4, 7, 7, 10] plt.plot(x1, y1, 'rv', x2, y2, 'bo--', x3, y3, 'gp-.') Vẽ biểu đồ với data frame Dùng thư viện matplotlib.pylot kết thư viện pandas.DataFrame với cấu trúc sau: https://ThachLN.github.com/ebook.html 141 Chạm tới AI trong 10 ngày plt.plt(x_key, y_key, data=df) Quay lại ví dụ trong Bài 10, vẽ biểu đồ tăng trưởng GPD và CPI import pandas as pd import matplotlib.pyplot as plt gdp = [6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02] year = [2010,2011,2012,2013,2014,2015,2016,2017,2018,2019] # Tạo data frame df = pd.DataFrame({'gdp': gdp, 'year': year}) plt.figure().suptitle('Biểu đồ tăng trưởng GDP của Việt Nam từ năm 2010 đến 2019') plt.xlabel('Năm') plt.ylabel('Tăng trưởng GDP (%)') plt.plot('year', 'gdp', data = df) Bạn để ý so với Bài 10 thì khác ở dòng cuối dùng: vẽ với trục x là giá trị cột tên 'year', trục y là giá trị cột tên 'gdp', với data frame là df. Lưu biểu đồ Hàm plt.savefig(fname) sẽ lưu Figure hiện hành. Các tham số tùy chọn gồm dpi, format, transparent. import pandas as pd https://ThachLN.github.com/ebook.html 142 Chạm tới AI trong 10 ngày import matplotlib.pyplot as plt gdp = [6.78, 5.89, 5.03, 5.42, 5.98, 6.68, 6.21, 6.81, 7.08, 7.02] year = [2010,2011,2012,2013,2014,2015,2016,2017,2018,2019] # Tạo data frame df = pd.DataFrame({'gdp': gdp, 'year': year}) plt.figure().suptitle('Biểu đồ tăng trưởng GDP của Việt Nam từ năm 2010 đến 2019') plt.xlabel('Năm') plt.ylabel('Tăng trưởng GDP (%)') plt.plot('year', 'gdp', data = df) plt.savefig("D:/GPT_CPI_VN.png") Kết quả: Thử sửa lại dòng cuối cùng plt.savefig("D:/GPT_CPI_VN_dpi300.png", dpi=300) https://ThachLN.github.com/ebook.html 143 Chạm tới AI trong 10 ngày Hãy quan sát kích thước ảnh và Dimensions khác nhau giữa 2 lệnh trên. Thử thêm tham số transparent và kiểm tra tính trong suốt (transparent) của ảnh: plt.savefig("D:/GPT_CPI_VN_0.png", transparent = 0) plt.savefig("D:/GPT_CPI_VN_1.png", transparent = 0.1) plt.savefig("D:/GPT_CPI_VN_2.png", transparent = 0.5) plt.savefig("D:/GPT_CPI_VN_3.png", transparent = 1) https://ThachLN.github.com/ebook.html 144 Chạm tới AI trong 10 ngày Ngày 3 – Phân tích mô tả Trong ngày 2 chúng ta đã cảm nhận được phần nào các loại biểu đồ cơ bản trong phân tích dữ liệu. Đặc biệt là làm quen với cách thể hiện biểu đồ với R và Python. Trong bài này chúng ta trải nghiệm ở góc độ ứng dụng thông qua một số tình huống cụ thể. Từ đó chúng ta luyện tập thêm một số kỹ năng phân tích thông qua biểu đồ để mô tả dữ liệu trực quan hơn. Phân tích mô tả (Descriptive analysis) đúng như tên gọi của nó thì đây là hướng phân tích nhằm mô tả thông tin về dữ liệu. Cụ thể là phân tích một cách định lượng (quantitatively) và tổng hợp thông tin theo hướng thống kê (statistically) những gì mà dữ liệu có thể có. Ví dụ trong tay bạn có dữ liệu bán hàng của công ty bạn thì bạn sẽ phân tích để mô tả nhiều thông tin đáng giá bằng cách đi tìm câu trả lời cho các câu hỏi sau: Mặt hàng nào được bán chạy nhất? Tháng này tình hình kinh doanh có khác biệt so với tháng này năm ngoái? Doanh số trung bình của mỗi mặt hàng là bao nhiêu? Nếu kết hợp thêm chi phí tiền lương và thời gian làm việc của nhân viên thì bạn có thể trả lời thêm các câu hỏi phức tạp hơn như: Mỗi đồng lương bạn chi ra cho nhân viên thì sẽ mang lại doanh số bao nhiêu? Mỗi giờ làm việc trung bình của nhân viên thì sẽ mang lại cho công ty bao nhiêu tiền? Một năm kinh nghiệm trung bình của nhân viên tương ứng với doanh số bao nhiêu? Tổng hợp thông tin theo hướng thống kê cụ thể là chúng ta tính toán các chỉ số cơ bản mà tôi đã giúp các bạn làm quen, ôn lại trong Bài 1. Bài này tôi tóm tắt lại 10 chỉ số quan trong sau đây: Chỉ số Giải thích Mean Số trung bình Median Số trung vị Mode Giá trị lặp lại nhiều nhất Percentile Bách phân vị. Thường dùng bách phân vị 25%, 75%. Bách phân vị 50% chính là Median Quartiles Gồm 4 chỉ số: Minimum: Số nhỏ nhất https://ThachLN.github.com/ebook.html 145 Chạm tới AI trong 10 ngày Lower quartile: Bách phân vị 25% Upper quartile: Bách phân vị 75% Maximum: Số lớn nhất Standard deviation Độ lệch chuẩn Variance Phương sai Range Giải giá trị: được tính bằng hiệu của Maximum và Minimum Proportion Tỉ số Correlation Coefficient of correlation – Hệ số tương quan Ngày thứ ba này sẽ gồm 4 bài: Bài 13: Minh họa phân tích tả từ dữ liệu về một dự án (hay còn gọi là nghiên cứu) từ bộ phận Marketing của một Ngân hàng. Dữ liệu và code mẫu tham khảo từ cuốn sách Hands-On Data Science for Marketing (Packt Publishing, 2019) của Yoon Hyup Hwang. Bài 14: Giúp bạn nắm được cách so sánh hai tỉ lệ. Bài 15: Tóm tắt lại lý thuyết về Mô hình kiểm định giả thuyết. Bài 16: Mô tả một vài ứng dụng minh họa để quen với Phân tích phương sai, Phân tích t-test và Kiểm định giả thuyết. Bài 14, 15, 16 tôi dùng khá nhiều kiến thức, tài liệu từ các lớp học Phân tích dữ liệu cơ bản, Phân tích dữ liệu nâng cao của nhóm các Bác sĩ và anh Nguyễn Văn Tuấn. Các lớp học này tổ chức tại trường Đại Học Tôn Đức Thắng ở Sài Gòn. https://ThachLN.github.com/ebook.html 146 Chạm tới AI trong 10 ngày Bài 13: Phân tích mô tả dữ liệu Bank Marketing Dữ liệu Bank Marketing Để minh họa cho bài này tôi dùng dữ liệu về Bank Marketing của UCI 6. Tải 2 file bank.zip và bank-additional.zip trong mục Data Folder. Đây là dữ liệu thu thập được từ một dự án tìm kiếm khách hàng (direct marketing compaign) bằng điện thoại để chào một dịch vụ hoặc sản phẩm của ngân hàng cho khách hàng ở Bồ Đào Nha. Dịch vụ hoặc sản phẩm theo thuật ngữ ngân hàng ở đây là deposit. Dữ liệu gồm các biến đầu vào (input variables): # Biến Ý nghĩa (kiểu dữ liệu, giải thích) 1 age tuổi (numeric) 2 job nghề nghiệp 3 marital 4 education 5 default 6 housing 7 loan 8 contact 9 month 10 day_of_week 11 duration 12 campain Số lần liên lạc với khách hàng này. Giá trị số có nghĩa là lần liên lạc gần nhất) 13 pdays 6 Link: https://archive.ics.uci.edu/ml/datasets/bank+marketing https://ThachLN.github.com/ebook.html 147 Chạm tới AI trong 10 ngày 14 previous 15 poutcome 16 emp.var.rate 17 cons.prive.idx 18 cons.conf.idx 19 euribor3m 20 nr.employed Biến kết quả 22 y biến nhị phân: ‘yes’, ‘no’. Khách hàng đồng ý sử dụng dịch vụ yes, không đồng ý là no. Hai phần tiếp theo sẽ áp dụng các kiến thức đã học ở trên, đặc biệt là kỹ thuật vẽ biểu đồ để hỗ trợ phân tích mô tả cho dữ liệu Bank Marketing. Phần vẽ biểu đồ thì tôi không tập trung vào việc trang trí khi không cần thiết để code không quá rối. Bạn hoàn toàn có thể áp dụng các kỹ thuật trang trí biểu đồ ở phần trước để hoàn thiện hơn “bức tranh” theo ý bạn muốn. Phân tích mô tả Bank Marketing với R Thông qua phân tích dữ liệu Bank Marketing này tôi mong đợi là bạn sẽ làm quen tiếp các lệnh R. Cụ thể là đọc số liệu từ file csv, thực hiện mã hóa (thêm cột với kiểu dữ liệu mới) dữ liệu đơn giản. Trong phần phân tích này bạn sẽ được luyện tập thêm kỹ thuật pipeline của thư viện dplyr. Xem cột dữ liệu và làm quen với vài dữ liệu df = read.csv('https://thachln.github.io/datasets/bank/bankadditional-full.csv', sep=';') names(df) head(df) > names(df) [1] "age" "job" "marital" "education" lt" "housing" "loan" "contact" [9] "month" "day_of_week" "duration" "campaign" " "previous" "poutcome" "emp.var.rate" [17] "cons.price.idx" "cons.conf.idx" "euribor3m" "nr.employed" > head(df) age job marital education default housing loan contact month _week duration campaign pdays previous poutcome 1 56 housemaid married basic.4y no no no telephone may mon 261 1 999 0 nonexistent 2 57 services married high.school unknown no no telephone may mon 149 1 999 0 nonexistent 3 37 services married high.school no yes no telephone may mon 226 1 999 0 nonexistent https://ThachLN.github.com/ebook.html 148 "defau "pdays "y" day_of Chạm tới AI trong 10 ngày 4 40 admin. married basic.6y no no no telephone may mon 151 1 999 0 nonexistent 5 56 services married high.school no no yes telephone may mon 307 1 999 0 nonexistent 6 45 services married basic.9y unknown no no telephone may mon 198 1 999 0 nonexistent emp.var.rate cons.price.idx cons.conf.idx euribor3m nr.employed y 1 1.1 93.994 -36.4 4.857 5191 no 2 1.1 93.994 -36.4 4.857 5191 no 3 1.1 93.994 -36.4 4.857 5191 no 4 1.1 93.994 -36.4 4.857 5191 no 5 1.1 93.994 -36.4 4.857 5191 no 6 1.1 93.994 -36.4 4.857 5191 no Bằng hai lệnh names(df) và head(df) bạn sẽ phần nào biết được chút ít về bộ dữ liệu này. Một lệnh khác khá hữu ích trong thư viện dplyr là glimpse. glimpse(df) Rows: 41,188 Columns: 21 $ age 56, 57, 37, 40, 56, 45, 59, 41, 24, 25, 41, 25, 29, 57, 35, 54, 35, 46, 50, 39, 30, 55, 55, 41,... $ job "housemaid", "services", "services", "admin.", "services ", "services", "admin.", "blue-collar",... $ marital "married", "married", "married", "married", "married", " married", "married", "married", "single... $ education "basic.4y", "high.school", "high.school", "basic.6y", "h igh.school", "basic.9y", "professional.... $ default "no", "unknown", "no", "no", "no", "unknown", "no", "unk nown", "no", "no", "unknown", "no", "no... $ housing "no", "no", "yes", "no", "no", "no", "no", "no", "yes", "yes", "no", "yes", "no", "yes", "yes",... $ loan "no", "no", "no", "no", "yes", "no", "no", "no", "no", " no", "no", "no", "yes", "no", "no", "ye... $ contact "telephone", "telephone", "telephone", "telephone", "tel ephone", "telephone", "telephone", "tel... $ month "may", "may", "may", "may", "may", "may", "may", "may", "may", "may", "may", "may", "may", "may... $ day_of_week "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon", "mon... $ duration 261, 149, 226, 151, 307, 198, 139, 217, 380, 50, 55, 222 , 137, 293, 146, 174, 312, 440, 353, 19... $ campaign 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1,... $ pdays 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, 9 99, 999, 999, 999, 999, 999, 999, 999, ... $ previous 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,... $ poutcome "nonexistent", "nonexistent", "nonexistent", "nonexisten t", "nonexistent", "nonexistent", "none... $ emp.var.rate 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1 .1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, ... $ cons.price.idx 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994, 93.994,... $ cons.conf.idx -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.4, -36.... $ euribor3m 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.857, 4.85... $ nr.employed 5191, 5191, 5191, 5191, 5191, 5191, 5191, 5191, 5191, 51 91, 5191, 5191, 5191, 5191, 5191, 5191,... $ y "no", "no", "no", "no", "no", "no", "no", "no", "no", "n o", "no", "no", "no", "no", "no", "no",... https://ThachLN.github.com/ebook.html 149 Chạm tới AI trong 10 ngày Lệnh glimpse sẽ giúp bạn quan sát được tổng thể số dòng, số cột, tên các cột, kiểu dữ liệu tương ứng và vài dữ liệu được trình bày theo hàng ngang. Quan sát một số chỉ số cơ bản Lệnh Kết quả mean(df$age) 40.02406 median((df$age)) 38 findmode % mutate(ConversionRate=NumConversions/TotalCount*100.0) head(conversionsByAge, 10) # A tibble: 10 x 4 Age TotalCount NumConversions ConversionRate 1 2 3 4 5 6 7 8 9 10 17 18 19 20 21 22 23 24 25 26 5 28 42 65 102 137 226 463 598 698 2 12 20 23 29 36 48 86 93 122 40 42.9 47.6 35.4 28.4 26.3 21.2 18.6 15.6 17.5 Code tỉ lệ chuyển đổi theo độ tuổi thì phức tạp hơn một chút. Cú pháp %>% trong thư viện dplyr giúp ta xử lý dữ liệu liên tục rất hiệu quả theo trình tự như sau: Bước 1: Lệnh bên dưới sẽ đẩy từng dòng dữ liệu của df đi qua một đường ống (bạn hình dung cú pháp %>% giống như một đường ống, thuật ngữ gọi là pipeline). Trong đường ống này sẽ được hàm group_by(Age = age) gom nhóm dữ liệu theo độ tuổi. Tức là các dòng dữ liệu có age bằng nhau sẽ được gom lại thành một dòng thôi. Và cột tuổi được gom này được đặt lên là Age (chữ A hoa để phân biệt với cột age ban đầu) df %>% group_by(Age=age) Bước 2: Dữ liệu được gom nhóm ở bước một sẽ được tiếp tục xử lý bằng cách cho chạy qua một pipeline nữa (phần in đậm trong lệnh bên dưới). Pipeline trong bước 2 này sẽ làm nhiệm vụ tổng hợp (summarise) dữ liệu bằng cách tạo ra một biến mới là NumConversions có giá trị là tổng của biến conversion). https://ThachLN.github.com/ebook.html 156 Chạm tới AI trong 10 ngày df %>% group_by(Age=age) %>% summarise(NumConversions=sum(conversion)) # A tibble: 78 x 2 Age NumConversions 1 2 3 4 5 6 7 8 9 10 # ... 17 2 18 12 19 20 20 23 21 29 22 36 23 48 24 86 25 93 26 122 with 68 more rows Hãy nhớ là conversion là cột có giá trị 1 hoặc 0 (1 tức là người được gọi điện đã trở thành khách hàng; 0 là chưa thành khách hàng). Như vậy sum(conversion) sẽ cho ra tổng số người được gọi điện đã trở thành khách hàng. Quan sát kết quả bạn sẽ thấy dữ liệu của lệnh trên có 2 cột. Cột thứ nhất Age gồm các tuổi không lặp lại. Cột thứ hai NumConversions là tổng số chuyển đổi như đã giải thích ở trên. Đến đây chắc là bạn hình dung được lệnh %>% lợi hại phần nào rồi chứ? Nhưng chưa hết. Để tôi giải thích tiếp phần còn lại của bước 2. Trong bước 2 ở trên tôi chưa đề cập đến tham số TotalCount=n() trong hàm summarise. Hàm summarise cho phép bạn tổng hợp dữ liệu và tạo ra biến mới để chứa dữ liệu tổng hợp đó. Đặc biệt là cho phép tổng hợp nhiều dữ liệu được viết theo cú pháp sau: summarise(biến mới = hàm_tổng hợp(), biến mới = hàm_tổng_hợp(), …) Trong lệnh bên dưới tổng hợp hai biến mới là TotalCount và NumConversions. Hàm n() sẽ tính tổng các dòng tương ứng của cùng độ tuổi. Tức là tính tổng theo biến age đã được gom nhóm bởi pipeline trước đó. df %>% group_by(Age=age) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) Kết quả lệnh này như sau: # A tibble: 78 x 3 Age TotalCount NumConversions 1 2 3 4 5 6 7 8 9 10 # ... 17 5 18 28 19 42 20 65 21 102 22 137 23 226 24 463 25 598 26 698 with 68 more rows 2 12 20 23 29 36 48 86 93 122 https://ThachLN.github.com/ebook.html 157 Chạm tới AI trong 10 ngày Bạn thấy gồm có 3 cột cho biết theo từng độ tuổi, tổng số dòng dữ liệu tương ứng, tổng số dữ liệu “chuyển đổi”. Với bảng kết quả trên bạn hoàn toàn có thể tự tính tỉ lệ chuyển đổi theo độ tuổi. Sức mạnh của cú pháp pipleline %>% sẽ được phát huy tiếp trong bước 3 cho việc này. Bước 3: Dữ liệu sẽ được tiếp tục được đưa qua pipeline để tạo ra biến mới ConversionsRate như sau (phần in đậm) df %>% group_by(Age=age) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) Kết quả của 3 bước xử lý qua kỹ thuật pineline ở trên sẽ được lưu vào một data frame mới tên là conversionsByAge bởi phép gán như bạn đã biết: conversionsByAge = df %>% group_by(Age=age) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) Nhắc lại, phép gán ngoài cú pháp dấu bằng thì có thể dùng dấu % summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) Đặc biệt, với cú pháp pipeline (tôi tạm gọi là kỹ thuật đường ống cho bạn dễ mường tượng) thì bạn đang hình dung là dữ liệu đang được xử lý và chạy qua các pipleline. Như thế kết quả dữ liệu sẽ được chạy tiếp vào cái biến luôn cho thuận suy nghĩ. Để cho dữ liệu chạy vào biến thì dùng dấu mũi tên thuận sang phải ->. Lệnh trên có thể viết lại như sau: df %>% group_by(Age=age) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) -> conversionsByAge Tùy theo thói quen hoặc quy ước trong nhóm, trong tổ chức thì bạn chọn cách viết cho tiện với số đông. Xem dòng kết quả trong data frame conversionsByAge: https://ThachLN.github.com/ebook.html 158 Chạm tới AI trong 10 ngày head(conversionsByAge, 5) # A tibble: 5 x 4 Age TotalCount NumConversions ConversionRate 1 2 3 4 5 17 18 19 20 21 5 28 42 65 102 2 12 20 23 29 40 42.9 47.6 35.4 28.4 Xem biểu đồ # line chart ggplot(data=conversionsByAge, aes(x=Age, y=ConversionRate)) + geom_line() + ggtitle('Tỉ lệ chuyển đổi theo độ tuổi') + xlab("Tuổi") + ylab("Tỉ lệ chuyển đổi (%)") + theme(plot.title = element_text(hjust = 0.5)) Conversion rate theo số lần liên lạc Đến lúc này bạn có thể tự gõ, giải thích ý nghĩa của lệnh và khám phá kết quả tổng hợp cho câu hỏi sau “Theo từng độ tuổi thì tỉ lệ chuyển đổi bao nhiêu?”: conversionsByNumContact = df %>% https://ThachLN.github.com/ebook.html 159 Chạm tới AI trong 10 ngày group_by(NumContact=campaign) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) Xem 10 kết quả đầu tiên: head(conversionsByNumContact, 10) # A tibble: 10 x 4 NumContact TotalCount NumConversions ConversionRate 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 17642 10570 5341 2651 1599 979 629 400 283 225 2300 1211 574 249 120 75 38 17 17 12 13.0 11.5 10.7 9.39 7.50 7.66 6.04 4.25 6.01 5.33 Xem biểu đồ ggplot(data=head(conversionsByNumContact, 10), aes(x=NumContact, y=ConversionRate)) + geom_line() + ggtitle('Tỉ lệ chuyển đổi theo số lần liên lạc') + xlab("Số lần liên lạc") + ylab("Tỉ lệ chuyển đổi (%)") + ylim(c(0, 15)) + theme(plot.title = element_text(hjust = 0.5)) https://ThachLN.github.com/ebook.html 160 Chạm tới AI trong 10 ngày Conversion rate theo nhóm tuổi conversionsByAgeGroup = df %>% group_by(AgeGroup=cut(age, breaks= seq(20, 70, by = 10)) ) %>% summarise(TotalCount=n(), NumConversions=sum(conversion)) %>% mutate(ConversionRate=NumConversions/TotalCount*100.0) conversionsByAgeGroup$AgeGroup
×Report "TouchAI10Days_Draft_YourName_yourphonenumber_20200626.pdf"
Your name Email Reason -Select Reason- Pornographic Defamatory Illegal/Unlawful Spam Other Terms Of Service Violation File a copyright complaint Description Close Submit Our partners will collect data and use cookies for ad personalization and measurement. Learn how we and our ad partner Google, collect and use data. Agree & closeTừ khóa » Chạm Tới Ai Trong 10 Ngày Pdf
-
Chạm Tới AI Trong 10 Ngày - Touch On AI In Ten Days. - EBook
-
TouchAI10Days Draft YourName Yourphonenumber 20200626 | PDF
-
Facebook
-
Giới Thiệu EBook Chạm Tới AI Trong 10 Ngày (https://)
-
Kho Sách Hay PRC, EPUB, PDF (download) - Tinhte
-
Cuoc Song Khong Gioi Han[EBOOK-VTBT][1]
-
Thư Viện PDF - Trang Chủ
-
[PDF] Phi Lý Trí - MEKONG STARTUP
-
[PDF] XU HƯỚNG NGHIÊN CỨU VÀ ỨNG DỤNG TRÍ TUỆ NHÂN TẠO ...
-
[PDF] Nghệ Thuật Giao Tiếp Để Thành Công
-
Cách Chuyển File Pdf Sang File Cad
-
[Tải PDF] Osho - Trưởng Thành - Chạm Tới Bầu Trời Nội Tâm Của ...
-
[Tải PDF] Nơi Khu Rừng Chạm Tới Những Vì Sao PDF