Missing data là dữ liệu bị thiếu, được hiển thị như NaN, Nat, Null, N/A,… Missing Data xuất hiện do nhiều nguyên nhân như: Người dùng quên điền Dữ liệu bị mất trong quá trình chuyển
Trang 4LỜI CẢM ƠN
Để hoàn thành tiểu luận này, em xin gửi lời cảm ơn chân thành đến:
Các thầy cô trong khoa Công nghệ thông tin đã cung cấp các kiến thức nền tảng để ápdụng và nghiên cứu thông tin trong bài tiểu luận
Em xin bày tỏ lòng biết ơn sâu sắc đến thầy Bùi Thanh Hùng người đã trực tiếp giảngdạy và hướng dẫn tạo mọi điều kiện thuận lợi giúp đỡ em trong quá trình thực hiện đềtài
Tuy đã có nhiều cố gắng, nhưng chắc chắn tiểu luận của em còn có vài điểm sai sót.Rất mong nhận được sự nhận xét, ý kiến đóng góp, phê bình từ phía Thầy để bài tiểuluận được hoàn thiện hơn
Xin chân thành cám ơn!
Trang 5LỜI CAM ĐOAN
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi và được sự hướng dẫn củaBui Thanh Hung Các kết quả trong đề tài này là trung thực và chưa công bố dưới bất
kỳ hình thức nào trước đây Những số liệu trong các bảng biểu phục vụ cho việc phântích, nhận xét, đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõtrong phần tài liệu tham khảo
Ngoài ra, trong tiểu luận còn sử dụng một số nhận xét, đánh giá cũng như sốliệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồngốc
Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm
về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có)
TP Hồ Chí Minh, ngày 31 tháng 03 năm 2022
Tác giả (ký tên và ghi rõ họ tên)
Nguyễn Văn Tài
Trang 6PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm
(kí và ghi họ tên)
Trang 8TÓM TẮT
Trang 9MỤC LỤC
LỜI CẢM ƠN i
LỜI CAM ĐOAN ii
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN iii
TÓM TẮT iv
MỤC LỤC 1
DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT 2
DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ 3
CHƯƠNG I - THU THẬP DỮ LIỆU 4
1 Viết code cào dữ liệu từ trang Web, lưu kết quả vào 1 file tương ứng và mô tả ngắn gọn về cấu trúc của trang Web trên 4
1.1 Code cào dữ liệu 4
1.2 Cấu trúc trang Web 5
2 Với dữ liệu bạn vừa cào về, bạn hãy thực hiện các yêu cầu sau: 5
2.1 Hãy đọc tất cả các thẻ html (div) với lớp là "quote" và lưu nó trong biến 'result’, hiển thị giá trị biến 'result’ ra màn hình? 5
2.2 Hãy tìm trong biến 'result’ vừa rồi các dữ liệu có chứa nhãn "small" với class là "author" và in kết quả ra màn hình? 6
2.3 Hãy viết hàm tacgiaLink() để lấy nội dung của mỗi tác giả Với mỗi tác giả in ra màn hình các nội dung 6
2.4 Hãy lưu kết quả ở câu c vào file Quote.csv tương ứng, với mỗi tác giả là 1 dòng dữ liệu Bạn được yêu cầu thu thập ít nhất 40 câu nói nổi tiếng từ trang web trên một cách tự động theo code của các ý trên? 7
CHƯƠNG II - KHAI PHÁ DỮ LIỆU 8
1 Xử lý dữ liệu- Data Imputation 8
Trang 101.1 Giới thiệu: 8
1.2 Một số giá trị của dữ liệu Trường ngày sinh chưa có, bạn hãy đề xuất cách điền? 8
1.3 Bạn hãy thêm vào Trường Tuoi (Tuổi) và đề xuất cách điền tuổi của các tác giả? 10
2 Khám phá dữ liệu- Data Exploration 10
2.1 Giới thiệu 10
2.2 Thống kê về tác giả và câu nói nổi tiếng có trong bộ dữ liệu 13
2.3 Thống kê về năm sinh và độ tuổi của các tác giả 14
2.4 Thống kê về các câu nói nổi tiếng như: câu dài nhất, ngắn nhất, số từ .14
2.5 Thống kê về các từ được sử dụng trong các câu nói 14
2.6 Phân tích, trực quan mối quan hệ giữa giữa tác giả và câu nói nổi tiếng 14
2.7 Phân tích, trực quan mối quan hệ giữa các tác giả với nhau 15
3 Suy luận 16
3.1 Bạn được yêu cầu phân loại câu nói theo tên người nổi tiếng và tính độ tương đồng phong cách nói giữa các tác giả theo 2 yêu cầu sau: 16
3.2 Hãy dự đoán tên của người nổi tiếng theo câu nói dựa trên các đặc trưng bạn trích xuất ở trên và đánh giá trên bộ dữ liệu đã cho với tỉ lệ Train/Test và các độ đo phù hợp? 16
Trang 11DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT
Trang 12DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ
Trang 13CHƯƠNG I - THU THẬP DỮ LIỆU
1 Viết code cào dữ liệu từ trang Web, lưu kết quả vào 1 file tương ứng
và mô tả ngắn gọn về cấu trúc của trang Web trên
1.1 Code cào dữ liệu
from bs4 import BeautifulSoup
import urllib request
import pandas as pd
import numpy as np
url = 'https://quotes.toscrape.com/'
page = urllib request urlopen ( url )
soup = BeautifulSoup ( page , 'html.parser' )
def crawlingData ( soup , tag , attrs , getText , isLink , isTag ):
datas = []; dictionary = {}; i = 0
for data in soup find_all( tag , attrs = attrs ):
if getText == True :
datas append ( data text.strip())
elif isLink == True :
if data find( 'a' ) != None and data find( 'a' ).text == '(about)' : datas append ( 'https://quotes.toscrape.com' +
data find( 'a' ).get( 'href' ))
elif isTag == True :
dictionary setdefault ( , [])
for tag in ( data find_all( 'a' )):
dictionary [ ].append( tag text.strip())
#lưu vào file kết quả
structure = crawlingData ( soup , 'html' , {}, False , False , False )
with open ( 'kq.txt' , 'w' , encoding = 'utf-8' ) as :
f write ( str ( structure ) replace ( '[' , '' ) replace ( ']' , '' ))
Trang 141.2 Cấu trúc trang Web
2 Với dữ liệu bạn vừa cào về, bạn hãy thực hiện các yêu cầu sau:
2.1 Hãy đọc tất cả các thẻ html (div) với lớp là "quote" và lưu nó trong biến 'result’, hiển thị giá trị biến 'result’ ra màn hình?
result = crawlingData ( soup , 'div' , { 'class' : 'quote' }, True , False , False )
print ( 'result: ' , result )
Trang 152.2 Hãy tìm trong biến 'result’ vừa rồi các dữ liệu có chứa nhãn "small" với class là "author" và in kết quả ra màn hình?
def execute ( result ):
authors = []; links = []; quotes = []; tags = []
for in range ( int ( 40 / len ( result ))):
page = urllib request urlopen ( url + 'page/' + str ( + ) + '/' )
soup = BeautifulSoup ( page , 'html.parser' )
authors += crawlingData ( soup , 'small' , { 'class' : 'author' }, True ,
False , False )
links += crawlingData ( soup , 'span' , {}, False , True , False )
quotes += crawlingData ( soup , 'span' , { 'class' : 'text' }, True , False ,
False )
tags += crawlingData ( soup , 'div' , { 'class' : 'tags' }, False , False ,
True )
return authors , links , quotes , tags
authors , links , quotes , tags = execute ( result )
print ( 'author: ' , authors )
2.3 Hãy viết hàm tacgiaLink() để lấy nội dung của mỗi tác giả Với mỗi tác giả in ra màn hình các nội dung
def tacgiaLink ( link ):
page = urllib request urlopen ( link + '/' )
soup = BeautifulSoup ( page , 'html.parser' )
datas = crawlingData ( soup , 'span' , { 'class' : 'author-born-date' }, True ,
False , False )
return datas [ ]
def redirect ( links ):
datas = []
for link in links :
datas append ( tacgiaLink ( link ))
return datas
bDate = redirect ( links )
Trang 16for in range ( len ( authors )):
print ( '+++++++++++++++++++++++' )
print ( 'Tên tác giả: ' , authors [ ])
print ( 'Đường link của tác giả: ' , links [ ])
print ( 'Ngày tháng năm sinh: ' , bDate [ ])
print ( 'Câu nói nổi tiếng: ' , quotes [ ])
2.4 Hãy lưu kết quả ở câu c vào file Quote.csv tương ứng, với mỗi tác giả là
1 dòng dữ liệu Bạn được yêu cầu thu thập ít nhất 40 câu nói nổi tiếng từ trang web trên một cách tự động theo code của các ý trên?
data = { 'Tacgia' : authors , 'Link' : links , 'Namsinh' : bDate , 'Quote' : quotes }
df = pd DataFrame ( data )
df to_csv ( 'Quote.csv' , index = False )
Trang 17CHƯƠNG II - KHAI PHÁ DỮ LIỆU
1 Xử lý dữ liệu- Data Imputation
1.1 Giới thiệu:
Missing Data là gì?
Missing data là dữ liệu bị thiếu, được hiển thị như NaN, Nat, Null, N/A,… Missing
Data xuất hiện do nhiều nguyên nhân như:
Người dùng quên điền
Dữ liệu bị mất trong quá trình chuyển thủ công từ cơ sở dữ liệu cũ
Lỗi của chương trình
Thiếu dữ liệu do trùng hợp
Missing Data có thể được phân thành 3 loại:
Missing at Random (dữ liệu khuyết ngẫu nhiên)
Missing Completely at Random (dữ liệu thiếu hoàn toàn ngẫu nhiên)
Missing Not at Random (dữ liệu khuyết không ngẫu nhiên)
1.2 Một số giá trị của dữ liệu Trường ngày sinh chưa có, bạn hãy đề xuất cách điền?
Thực tế trong bộ dữ liệu cào về trong trường năm sinh không có dữ liệu nào mất Nhưng giả định một vài trường hợp bị null sẽ xử lý như sau:
Bước 1 : Khởi tạo dữ liệu null
# initialize null df
df_null = df copy ()
df_null loc [ df_null Tacgia == 'Albert Einstein' , 'Namsinh' ] = np nan
df_null
Bước 2 : Xử lý dữ liệu null bằng cách giảm số lượng cột trong dataframe sẽ xảy
ra việc mất dữ liệu => không phù hợp
Trang 18# handle
# dropna(): missing datas aren't neccessary or taking up a smail part of the dataframe
df_null dropna () reset_index ( drop = True )
# reduce the number of rows in dataframe => Lost other datas => unsuitable
Bước 3 : Trong trường hợp chúng ta không sử dụng cột “Namsinh”, giải pháp là chúng ta bỏ cột “Namsinh” Nhưng sẽ không tính được tuổi nếu không có dữ kiện năm sinh => không phù hợp
# incase we don't need to use column "Namsinh", the solution is to drop this column
df_null drop ( 'Namsinh' , axis = ) # can't calculate age without birthdate => unsuitable
Bước 4 : Loại bỏ các dữ liệu không liên quan nhưng có ảnh hưởng đến các dữ liệu khác Nhưng cũng không tính được tuổi của tác giả => không phù hợp
# fillna(): missing datas aren't necessary, but effect other datas
df_null fillna ( ) # can't calculate age too => unsuitable
Bước 5 : Dùng phương pháp ffill : lấy giá trị dòng trên chèn xuống dòng dưới Nếu dòng trên bị null thì không thể thay thế => không phù hợp
df_null fillna ( method = 'ffill' ) # the first value is still null => unsuitable
Bước 6 : Dùng phương pháp bfill : lấy giá trị dòng dưới chèn lên dòng trên Nếu dòng dưới bị null thì không thể thay thế => không phù hợp
df_null fillna ( method = 'bfill' ) # if the last value is null, it will be null forever => unsuitable
Trang 19Bước 7 : Lấy giá trị xuất hiện nhiều nhất trong mảng sẽ thay những chỗ còn lại.
Do đó sẽ điền được tất cả trường trong dataframe mà không bị bỏ sót ô nào => phù hợp
df_null.fillna(df_null.mode().iloc[ 0 ]) # fill missing value with the most frequent value => suitable
1.3 Bạn hãy thêm vào Trường Tuoi (Tuổi) và đề xuất cách điền tuổi của các tác giả?
from datetime import date, datetime
def calculateAge ( birthDate ):
Pandas là một thư viện Python cung cấp các cấu trúc dữ liệu nhanh, mạnh mẽ, linh hoạt
và mang hàm ý Tên thư viện được bắt nguồn từ panel data (bảng dữ liệu) Pandas được thiết kế để làm việc dễ dàng và trực quan với dữ liệu có cấu trúc (dạng bảng, đa chiều, có tiềm năng không đồng nhất) và dữ liệu chuỗi thời gian
Trang 20Mục tiêu của pandas là trở thành khối căn bản (building block) cấp cao cơ bản cho công việc thực tế, phân tích dữ liệu thế giới thực trong Python, và rộng hơn là trở thànhcông cụ thao tác / phân tích mã nguồn mở mạnh mẽ và linh hoạt nhất có sẵn trong bất
kỳ loại ngôn ngữ lập trình nào
Pandas rất phù hợp với nhiều loại dữ liệu khác nhau:
Dữ liệu dạng bảng với các cột được nhập không đồng nhất, như trong bảng SQLhoặc bảng tính Excel
Dữ liệu chuỗi thời gian theo thứ tự và không có thứ tự (không nhất thiết phải có tần số cố định)
Dữ liệu ma trận tùy ý (được nhập đồng nhất hoặc không đồng nhất) với nhãn hàng và cột
Bất kỳ hình thức khác của các bộ dữ liệu quan sát / thống kê Dữ liệu thực sự không cần phải được dán nhãn vào cấu trúc dữ liệu pandas
Pandas được xây dựng dựa trên NumPy Hai cấu trúc dữ liệu chính của pandas
là Series (1 chiều) và DataFrame (2 chiều) xử lý được phần lớn các trường hợp điển hình trong tài chính, thống kê, khoa học xã hội và nhiều lĩnh vực kỹ thuật.Dưới đây là một số chức năng của pandas sẽ sử dụng phổ biến :
1 reset_index
2 sort_values
3 groupBy
Trang 21Khi bạn lần đầu tiên nhận được một bộ dữ liệu mới, bạn muốn nhanh chóng khám phá
nó và có được cảm giác về nội dung của nó Pandas có một số phương pháp cho việc này Đầu tiên là đầu, trả về vài hàng đầu tiên của DataFrame Chức năng đầu được sử dụng để xem vài hàng đầu tiên của bộ dữ liệu
sort_values()
Điều đầu tiên bạn có thể làm là thay đổi thứ tự của các hàng bằng cách sắp xếp chúng sao cho dữ liệu thú vị nhất nằm ở đầu DataFrame Bạn có thể sắp xếp hàng bằng phương pháp sort_values, đi qua trong tên cột mà bạn muốn sắp xếp theo
reset_index()
Nếu bạn muốn chuyển đổi bất kỳ cột nào của bộ dữ liệu làm chỉ mục của nó, nó có thể được thực hiện thông qua set_index Trong ví dụ dưới đây, id hành khách được đặt làmcột chỉ mục Điều này rất hữu ích khi bạn muốn đặt một trong các cột làm chỉ mục
loc & iloc
Với loc và iloc, bạn có thể thực hiện hầu hết mọi thao tác lựa chọn dữ liệu trên
DataFrames loc dựa trên nhãn, có nghĩa là bạn phải chỉ định hàng và cột dựa trên nhãnhàng và cột của chúng iloc dựa trên chỉ số số nguyên, vì vậy bạn phải chỉ định các
Trang 22hàng và cột theo chỉ số số nguyên của chúng loc và iloc cũng cho phép bạn chọn cả hàng và cột từ DataFrame
groupBy()
Pandas groupBy() hàm được sử dụng để chia dữ liệu thành các nhóm bằng cách sử dụng một số tiêu chí được xác định trước Trong ví dụ dưới đây, chúng tôi sẽ tính thu nhập trung bình của các ứng cử viên bằng cách nhóm nó theo độ tuổi
replace()
Hàm replace() trả về một bản sao của chuỗi ban đầu sau khi đã thay thế các chuỗi con
cũ bằng chuỗi con mới
Trang 232.2 Thống kê về tác giả và câu nói nổi tiếng có trong bộ dữ liệu
Cách tiếp cận:
Nhóm dataframe theo tác giả
Đếm số lần xuất hiện của từng tác giả (tương ứng với số câu nói của tácgiả đó)
df groupby ( 'Tacgia' ) size () reset_index ( name = 'So cau noi' )
2.3 Thống kê về năm sinh và độ tuổi của các tác giả
Cách tiếp cận:
Nhóm dataframe theo tác giả
Hiển thị trường tuổi và năm sinh theo tác giả
Sắp xếp theo thứ tự tăng dần tuổi
df groupby ( 'Tacgia' ) first ()[[ 'Namsinh' , 'Tuoi' ]] sort_values ( 'Tuoi' ,
Lấy câu có số từ nhiều nhất và số từ ít nhất
df [ 'Length' ] = [ len ( quote split()) for quote in df Quote]
quoteByLength = df [[ 'Quote' , 'Length' ]] sort_values ( 'Length' ,
ascending = False ) reset_index ( drop = True )