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 เพื่อดูตัวอย่างการใช้งานฟังชั่นเหล่านี้ได้เลย

Leave a Reply