วิเคราะห์ข้อมูล Facebook Page ด้วย R (2019)

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
หน้า interface ของ Graph API Explorer เพื่อขอ access token

หมายเหตุ – ตอนนี้เราสามารถดึงข้อมูลได้เฉพาะ 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
photo306.85
video206.73
link195.60
status153.83
event104.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 เพื่อดูตัวอย่างการใช้งานฟังชั่นเหล่านี้ได้เลย

5 thoughts on “วิเคราะห์ข้อมูล Facebook Page ด้วย R (2019)

  1. ถ้าต้องการดึงข้อมูลจาก public page อื่นๆ ต้องทำเรื่องขอ access token แบบ Page Public Content Access
    ต้องทำยังไงหรอค่ะ

    1. ต้องขอ token แบบ page public content access ซึ่งจะยากกว่าแบบธรรมดามากเลยครับ ต้องมีเขียนจดหมายอธิบายเหตุผลการใช้งาน และก็เอกสารอีกหลายอย่าง ใช้เวลาค่อนข้างนานในการ approve อ่านเพิ่มเติมได้ที่นี่ครับ https://developers.facebook.com/docs/apps/review/feature/#reference-PAGES_ACCESS

      1. แต่ก่อน page public content access ทำได้ง่ายๆ ไม่ต้อง review แต่วันนี้ 4 ก.ย. 2019 FB แบนทั่วโลกแล้ว ไม่รู้จะทำยังไงดีครับ

  2. อันนี้เหมือนใช้ไม่ได้แล้วหรอครับ มันขึ้นประมาณนี้ครับ

    Error in callAPI(url = url, token = token, api = api) :
    (#12) type field is deprecated for versions v3.3 and higher

Leave a Reply