tutorial วันนี้มาลองดูวิธีการเขียน R เพื่อดึงข้อมูล post, comment, like, share จาก facebook page ที่เราเป็นแอดมิน code ง่ายๆแค่ไม่กี่บรรทัดด้วย package Rfacebook
โดย Pablo Barbera [github] ลองอ่านบทความเมื่อปีที่แล้วของเราได้ที่ Facebook Page Analysis Using R (2018)
code วันนี้เราจะมาต่อยอดจากปีก่อน ลงลึกในเชิง analysis ด้วย package dplyr
และ ggplot2
facebook ในปีที่ผ่านเข้มงวดเรื่อง privacy ขึ้นมาก user ที่ต้องการดึงข้อมูลจาก page ต้องขอ access token จาก facebook Graph API ก่อน ซึ่งทำได้ง่ายๆเพียง 3 ขั้นตอน
- เข้าไปที่ https://developers.facebook.com/tools/explorer
User or Page
– ให้เลือกชื่อ page ที่เราเป็นแอดมินGet Access Token
– copy token ของเราเพื่อใช้ดึงข้อมูล page ใน RStudio

หมายเหตุ – ตอนนี้เราสามารถดึงข้อมูลได้เฉพาะ page ที่เราเป็นแอดมินเท่านั้น ถ้าต้องการดึงข้อมูลจาก public page อื่นๆ ต้องทำเรื่องขอ access token แบบ Page Public Content Access
Four Lines of Code
เขียนโค้ดแค่ 4 lines ก็เสร็จเลย !!
เปิด RStudio ขึ้นมาแล้วลอง copy & run code ด้านล่างใน console เราใช้ฟังชั่น getPage()
เพื่อดึงข้อมูลจาก page โดยฟังชั่นนี้ต้องการ 3 arguments (page_name, token, n) โดยที่ n คือจำนวน posts ที่เราต้องการดึงออกมา
# Rfacebook package | |
install.packages("Rfacebook", dependencies = TRUE) | |
library(Rfacebook) | |
# get your token from https://developers.facebook.com/tools/explorer | |
# replace "AAAABBBBCCCC" with your access token | |
token <- "AAAABBBBCCCC" | |
# fetch data from fb page | |
page <- getPage("DataRockie", token, n=1000) |
ลองเรียกดู content เบื้องต้นของ page เราได้แค่ใช้ฟังชั่น head(page) ใน console
Page Analysis
ตอนนี้ข้อมูล posts ทั้งหมดถูกเก็บไว้ที่ page
object เราสามารถใช้ฟังชั่นสถิติง่ายๆใน R เพื่อหา insight เบื้องต้น เช่น ค่าเฉลี่ย likes, shares, comments หรือสัดส่วนการโพสต์ content ประเภทต่างๆ (event, link, photo, status, video) ฯลฯ
# total number of posts (DataRockie since 2015) | |
nrow(page) | |
# average like, share, post | |
mean(page$likes_count) | |
mean(page$comments_count) | |
mean(page$shares_count) | |
# total like, share, post | |
sum(page$likes_count) | |
sum(page$comments_count) | |
sum(page$shares_count) | |
# proportion of content | |
table(page$type) |
DataRockie เขียน post ทั้งหมดจำนวน 801 posts (ตั้งแต่ปี ก.พ. 2015) เป็นรูปภาพ 55.43% mean_like = 249.85 mean_share = 131.16 และ mean_comment = 13.02
Deeper Insights
dplyr
คือ package ที่แอดใช้บ่อยที่สุดใน R สำหรับทำ data wrangling ถ้าใครยังไม่เคยใช้ dplyr ลองอ่านบทความสอนทำ data wrangling with R ของเราก่อน
Tip – เวลาเขียน dplyr เราจะใช้ %>%
(pipe operator) เพื่อ chain code ของเราเข้าด้วยกันตามลำดับ ตัวอย่างเช่น template ด้านล่างคือการเขียนเชื่อม 3 operations ต่อกันให้ได้ output อย่างที่เราต้องการ i.e. ค่าสถิติที่คำนวณจาก dataframe นั้นๆ
dataframe %>%
select(column) %>%
mutate(new_column) %>%
summarise(stat_function(new_column))
code ตัวอย่างด้านล่าง เราทำ analysis 2 อย่างด้วย dplyr
[1] line 14-20 คำนวณค่าเฉลี่ย ratio share per like ของเพจ DataRockie = 0.322 และมีค่า median = 0.211 แปลว่าทุกๆหนึ่ง like มีความน่าจะเป็นที่ user จะกด share ประมาณ 21-32%
[2] line 23-26 คำนวณค่าเฉลี่ยยอด like แบ่งตามประเภท content พบว่า photo ได้ mean_like สูงที่สุดเท่ากับ 306.85 รองลงมาคือ video 206.73 และ link 195.60 ตามลำดับ
# dplyr package | |
install.packages("dplyr") | |
library(dplyr) | |
# review page structure | |
glimpse(page) | |
# select these four columns for our analysis | |
small_page <- page %>% select(type, like=likes_count, comment=comments_count, share=shares_count) | |
small_page$type <- as.factor(small_page$type) | |
# do some deeper analysis | |
# 1. compute the ratio of share per like | |
small_page %>% | |
mutate(like = like + 1, share = share + 1) %>% | |
mutate(ratio_share_like = share / like) %>% | |
summarise(avg_ratio = mean(ratio_share_like), | |
median_ratio = median(ratio_share_like), | |
max_ratio = max(ratio_share_like), | |
min_ratio = min(ratio_share_like)) | |
# 2. what kind of content get most likes | |
small_page %>% | |
group_by(type) %>% | |
summarise(avg_like = mean(like)) %>% | |
arrange(desc(avg_like)) |
ตัวอย่าง output ที่ได้จาก dplyr จะออกมาเป็น tibble (หรือ dataframe)
ประเภทของ content | ค่าเฉลี่ยยอด like per post |
photo | 306.85 |
video | 206.73 |
link | 195.60 |
status | 153.83 |
event | 104.71 |
Simple Visualization
อีกหนึ่ง package ที่เราใช้คู่กับ dplyr สำหรับทำ data visualization คือ ggplot2
โค้ดด้านล่างเราใช้ฟังชั่น geom_col()
เพื่อทำ bar chart ง่ายๆ
# package ggplot2 | |
install.packages("ggplot2") | |
library(ggplot2) | |
# create bar plot | |
small_page %>% | |
group_by(type) %>% | |
summarise(avg_like = mean(like)) %>% | |
arrange(desc(avg_like)) %>% | |
ggplot(aes(x = reorder(type, avg_like), y = avg_like)) + | |
geom_col(fill = "#3b5998") + | |
theme_minimal() + | |
labs(title = "Most popular content on DataRockie", | |
x = "content type", | |
y = "average like per post", | |
subtitle = "Photo posts received most averrage likes, followed by video and link respectively", | |
caption = "source: DataRockie FB Page") |
แกน x คือ content type ส่วนแกน y คือ average like per post
ggplot2 สามารถทำกราฟได้มากกว่า 30 แบบ ลองดูพรีวิวการเขียน ggplot2 ได้ที่นี่

Analysis made simple with R
สรุปขั้นตอนการดึงข้อมูล posts จาก facebook page ที่เราเป็นแอดมิน
- ขอ access token ใช้ได้ประมาณ 2 ชั่วโมงก่อนที่จะหมดอายุ และต้องขอใหม่
- ใช้ package Rfacebook ร่วมกับ dplyr (และ ggplot2) ในการทำ analysis
- ถ้าต้องการ export ข้อมูลที่เราดึงมาเป็น csv file เช่น object page ในตัวอย่างวันนี้ ให้เราใช้ฟังชั่น write.csv(page, “filename.csv”)
- Rfacebook ยังมีอีกหลายฟังชั่น เช่น
getPost()
และgetCommentReplies()
ลองพิมพ์ help(package = “Rfacebook”) ใน console เพื่อดูตัวอย่างการใช้งานฟังชั่นเหล่านี้ได้เลย
ถ้าต้องการดึงข้อมูลจาก public page อื่นๆ ต้องทำเรื่องขอ access token แบบ Page Public Content Access
ต้องทำยังไงหรอค่ะ
ต้องขอ token แบบ page public content access ซึ่งจะยากกว่าแบบธรรมดามากเลยครับ ต้องมีเขียนจดหมายอธิบายเหตุผลการใช้งาน และก็เอกสารอีกหลายอย่าง ใช้เวลาค่อนข้างนานในการ approve อ่านเพิ่มเติมได้ที่นี่ครับ https://developers.facebook.com/docs/apps/review/feature/#reference-PAGES_ACCESS
แต่ก่อน page public content access ทำได้ง่ายๆ ไม่ต้อง review แต่วันนี้ 4 ก.ย. 2019 FB แบนทั่วโลกแล้ว ไม่รู้จะทำยังไงดีครับ
อันนี้เหมือนใช้ไม่ได้แล้วหรอครับ มันขึ้นประมาณนี้ครับ
Error in callAPI(url = url, token = token, api = api) :
(#12) type field is deprecated for versions v3.3 and higher
facebook เปลี่ยน graph API ตลอดเลยครับ โค้ดเก่าอาจจะใช้ไม่ได้แล้วครับ