Problems Ngày nay, việc thu thập dữ liệu cũng như phân tích dữ liệu đang trở nên phổ biến cũng như rất cần thiết cho nhi ều mục đích khác nhau như phân tích thị trường, tìm hiểu các xu
Trang 1Final Project Technical Report Project Title: FACEBOOK DATA ANALYSIS
Name: Nguyen Phu Loc
Trang 2Final Project - Data Analysis with Python -
Nguyen Phu Loc
4.1 Predicting number of comments and shares based on number of reactions
4.2 Categorizing posts based post hour using K-means
5 Comments Sentiment analysis
6 Conclusion
1 Problems
Ngày nay, việc thu thập dữ liệu cũng như phân tích dữ liệu đang trở nên phổ biến cũng như rất cần thiết cho
nhi ều mục đích khác nhau như phân tích thị trường, tìm hiểu các xu hướng hay chỉ là tìm hiểu thói quen của
m ột người dùng, ….
Final Project yêu cầu crawl dữ liệu của một fanpage trên facebook và phân tích dữ liệu ấy để đưa ra những kết
luận chính xác từ đó giúp chúng ta hiểu hơn về sự hoạt động cũng như mức độ tương tác của người dùng về
page đó
2 Tools
Trang 3from facebook_scraper import get_posts
Sau quá trình xử lí xử liệu, việc trực quan hóa dữ liệu giúp ta có một cái nhìn trực quan hơn về dữ liệu so với việc
nhìn vào các dữ liệu dạng thô Python cho phép trực quan hóa dữ liệu thống qua các thư viện như ,
Đ ể thực hiện đề tài này, chúng ta sẽ sử dụng dữ liệu được crawl từ trang facebook v ới
16 tri ệu người theo dõi - một fanpage chuyên cập nhật tin tức về bóng đá bao gồm kết quả các trận đấu, câu
chuy ện hấp dẫn bên lề và đặc biệt là tin tức chuyển nhượng của các cầu thủ, …
numpy pandas
matplotlib seaborn wordcloud
F abrizio Romano
Trang 4for post in get_posts(FANPAGE_LINK,
options={"comments": True, "reactions": True, "allow_extra_requests": True},
extra_info=True, pages=PAGES_NUMBER, cookies=COOKIE_PATH):
Trang 5Tách Reactions ra t ừng loại và làm sạch dữ liệu
3.3 Statistics and Visualization
Th ời gian thu thập dữ liệu
Trang 6💡 Kho ảng thời gian thu thập dữ liệu trong vòng 6 ngày với 120 bài post, trung bình 20 post/ngày - một con
s ố khá lớn Có thể kết luận rằng fanpage này thường xuyên cập nhật thông tin với tần suất cao.
T ương tác hàng ngày
💡 Trong thời gian thu thập dữ liệu, sự tương tác đối với post thay đổi qua từng ngày Dễ thấy nhất với sự
chênh lệch lớn giữa số Reactions, ngày 27/11 cao nhất với gần 2 triệu lượt reactions, trong khi thấp nhấp ngày 25 với vỏn vẹn chỉ gần 250.000 lượt reations (tương đương 1/8 so với ngày 27) Đối với số lương lượt comments và shares có sự thay đổi nhẹ với sự nổi bật hơn trong ba ngày 26, 27 và 29
Th ống kê từng loại emotions qua từng ngày
df_emotions = df_reactions[['time', 'like', 'love', 'haha', 'wow', 'sad', 'angry', 'care']]
Trang 7Th ống kê số Post qua từng giờ
💡 Nhìn vào bi ểu đồ, ta có thể dễ dàng thấy được fanpage thường đăng post vào khoảng thời gian từ 14h
đêm đ ến 5h sáng hôm sau Đặc biệt tuần suất đăng vào thời gian 23h và 0h là cao nhất với 11 post
Ngoài ra, fanpage không đăng bài vào kho ảng thời gian từ 9h - 12h hằng ngày
Th ống kê số lượt tương tác đối với post được đăng vào các khung giờ trong ngày
Trang 8Post v ới số lượt reactions nhiều nhất
S ố post đạt trên 100.000 lượt reaction
💡 Trên t ổng số 120 post được đăng, có tới 16 post có trên 100.000 lượt reactions, chiếm 13,33% Nhìn
chung s ố lượt tương tác của fanpage qua các bài viết là khá lớn
Post v ới số lượng lượt Comments lớn nhất
Trang 9Post v ới số lượng Comments trên 2000 lượt
💡 Trên tổng số 120 post được đăng trong vòng 6 ngày, có tới 27 post có số lượt comments trên 2000
Post v ới số lượng lượt shares lớn nhất
Post v ới số lượng lượt share trên 1000
💡 Có 11 post với số lượng lượt chia sẻ (share) trên 1000
Theo th ống kê post với số lượng reactions, comments và shares lớn nhất, dễ thấy
m ột post có đủ 3 yếu tố trên với 484000 reactions, 16000 comments và 19000
shares D ự đoán trong 6 ngày dữ liệu được thu thập, có một sự kiện về bóng đá thu
hút đ ược nhiều người chú ý Đúng như dự đoán, vào ngày 26/11, trong trận đấu
gi ữa Manchester United và Everton, Alejandro Garnacho đã có một pha ngả bàn
đèn đ ẹp mắt mở tỉ số cho MU, và được so sánh với thần tượng của anh - một trong
Trang 10Th ống kê số lượt Comments, Shares qua các ngày
Trang 11💡 Dễ dàng nhận thấy, hai ngày 26 và 27, tỉ lệ số lượt comments và shares chiếm đa số, thể hiện sự tương
tác m ạnh trong 2 ngày này Dự đoán có sự kiện lớn liên quan đến bóng đá khiến nhiều người quan tâm
Th ống kê về tỉ lệ giữa các emotions
💡 Ng ười xem đa số ưa thích sử dụng 2 loại emotions chủ yếu là ‘like’ và ‘love’, trong khi số lượt like chiếm
t ới 82,5% tổng số lượt reactions Ngoài ra, các loại emotions còn lại như ‘haha’, ‘wow’, ‘sad’,… chiếm tỉ
tr ọng rất nhỏ
Th ống kê mật độ của tổng số lượt reactions
Trang 12Th ống kê mật độ của tổng số lượt Comments và Shares
M ối quan hệ giữa số emotions và reactions count
Trang 13💡 Bi ểu đồ scatter liên hệ giữa reaction_count và các yếu tố còn lại như số lượt like, love, comments,
shares, … D ựa vào biểu đồ, chúng ta có thể dễ dàng nhận thấy mối quan hệ tuyến tính giữa các yếu tố
Phân tích post text
df_text = raw_df[['post_id','post_text']]
text = str(df_text['post_text'])
df_text
from wordcloud import WordCloud, STOPWORDS
wordcloud = WordCloud(stopwords=STOPWORDS, background_color='white', max_words=300, width=500, height=300).generate(text)
plt.figure(figsize=(40,20))
plt.clf()
plt.imshow(wordcloud)
plt.axis('off')
Trang 14💡 M ột số từ khóa thường xuyên xuất hiện trong các post được đăng như : Havert, Arteta, Nico, Paz, Ten
Hag, moment, Bayer, Chelsea, Newcastle, ….
Phân tích Comments
from wordcloud import WordCloud, STOPWORDS
wordcloud = WordCloud(stopwords=STOPWORDS, background_color='white', max_words=300, width=500, height=300).generate(text)
Trang 154.1 Predicting number of comments and shares based on number of
Trang 16sns.histplot(df_interactions['like'], ax=axs[0, 0], label='like')
sns.histplot(df_interactions['love'], ax=axs[0, 1], label='love')
sns.histplot(df_interactions['wow'], ax=axs[0, 2], label='wow')
sns.histplot(df_interactions['haha'], ax=axs[1, 0], label='haha')
sns.histplot(df_interactions['care'], ax=axs[0, 3], label='care')
sns.histplot(df_interactions['angry'], ax=axs[1, 2], label='angry')
sns.histplot(df_interactions['sad'], ax=axs[1, 1], label='sad')
axs[1, 3].set_visible(False)
plt.suptitle('Biểu đồ thể hiện phân bố theo số lượng của từng loại cảm xúc', fontsize=20)
plt.show()
fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(24, 10))
sns.regplot(data=df_interactions, x="reaction_count", y="like", ax=axes[0, 0])
sns.regplot(data=df_interactions, x="reaction_count", y="love", ax=axes[0, 1])
sns.regplot(data=df_interactions, x="reaction_count", y="wow", ax=axes[0, 2])
sns.regplot(data=df_interactions, x="reaction_count", y="haha", ax=axes[0, 3])
sns.regplot(data=df_interactions, x="reaction_count", y="care", ax=axes[1, 0])
sns.regplot(data=df_interactions, x="reaction_count", y="angry", ax=axes[1, 1])
sns.regplot(data=df_interactions, x="reaction_count", y="comments", ax=axes[1, 2])
sns.regplot(data=df_interactions, x="reaction_count", y="shares", ax=axes[1, 3])
plt.suptitle("Biểu đồ thể hiện phân bố của từng loại reaction theo tổng số reactions")
plt.subplots_adjust(top=0.9)
plt.show()
Trang 17Bi ểu đồ liên hệ giữa các yếu tố
Trang 18from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)
Trang facebook đ ược đặt tại Đức với múi giờ GMT +1 Chúng ta chuẩn hóa đưa thời gian
v ề đúng thời gian đăng bài với múi giờ nước ngoài
Trang 19elif df_interactions['post_hour'].iloc[i] >= 4 and df_interactions['post_hour'].iloc[i] <= 12:
Convert categorical variable into integers
from sklearn.preprocessing import LabelEncoder
Trang 20correct_labels = sum(target == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, target.size))
print('Accuracy score: {0:0.2f}' format(correct_labels/float(target.size)))
5 Comments Sentiment Analysis
💡 Sử dụng model và data đã được huấn luyện từ trên để đưa vào phân tích comment của các
post đã được crawl về
Trang 21💡 Nh ận xét: Hầu hết các comments ở các post đề mang tích cực, không chứa những từ ngữ tiêu cực,
khiêu khích Điều đó cho thấy sự tương tác bằng comments đối với trang facebook này vừa đa dạng, thường xuyên vừa văn minh, lịch sự, các tin tức được đăng một cách chính xác, không gây ra các cuộc tranh cãi trên facebook
6 Conclusion
💡 Qua bài t ập phân tích dữ liệu của trang Facebook , có th ể thấy rằng trang fanpage
này đã đ ạt được những thành công đáng kể trong việc thu hút người dùng và đem lại một lượng thông tin
l ớn và chính xác
Về mặt người xem và tương tác, đã thu hút được hơn 16 triệu người theo dõi trên khắp
thế giới, đạt được một lượng tương tác rất khủng khiếp trên facebook với hằng trăm ngàn hoặc thậm chí hàng
triệu lượt reactions mỗi ngày Ngoài ra, người bình luận cũng rất văn minh khi mức độ tích cực của các
comments rất cao, cho thấy trang facebook đưa đến nội dung chính xác, không có sự tranh cãi.
Về mặt nội dung, trang Fanpage đã tập trung vào các tin tức liên quan đến bóng đá như kết quả các trận đấu
hấp dẫn, các câu chuyện bên lề sân cỏ Đặc biệt là tin tức chuyển nhượng trong giới cầu thủ Đây được đánh
giá là một trong những trang thông tin đưa tin nhanh và chính xác nhất và tất cả mọi mặt của bóng đá
F abrizioRomano
F abrizioRomano