Cup E Analysis Using Rfacebook

Chaiyasit Bunnag
5 min readMar 14, 2018

--

สวัสดีค้าบผู้อ่าน เนื่องจาก Facebook เปิดให้ดึง API เพื่อดึงข้อมูลในเพจต่างๆ มาใช้ได้ฟรี เพียงแค่ลงชื่อใช้งานเป็น Facebook Developer ก็สามารถดึงมาใช้เพื่อวิเคราะห์เพจต่างๆ ได้เรยย เมื่อรู้ว่าทำได้ผมก็ไม่รอช้าเข้าไปดึงเพจที่คิดว่า ผช ไทยหลายคนน่าจะกด Follow กันอยู่ นั่นคือ Cup E 😏

สิ่งที่ผมทำคือดึงข้อมูลแล้วมาทำ Analysis ใน R เพื่อตอบคำถามต่อไปนี้ครับ :

  1. ใครกลับมาเป็นนางแบบซ้ำให้กับ Page มากที่สุด
  2. ใครคือนางแบบที่มียอด Likes, Shares, Comments มากที่สุด
  3. ใครคือช่างกล้องที่กลับมาฝากผลงานมากที่สุด
  4. ช่วงความถี่ของจำนวน Likes, Shares, Comments ที่สาวๆ ได้รับกัน
  5. นางแบบคนไหนทำงานกับช่างกล้องหลากหลายที่สุด

Data ที่ผมดึงมาใช้ตั้งแต่วันที่ 1 มกราคม 2561–10 มีนาคม 2561 ครับ โดยขึ้นตอนการทำประกอบด้วย : การดึงข้อมูล > การ Clean ข้อมูล > การทำ Visualisation

เรามาเริ่มกันเลยครับ :’)

#ดึงข้อมูลจาก Page Cup E

ลำดับแรกเราต้องลงทะเบียนเป็น Facebook Developer ได้ที่ลิ้งค์นี้ครับ :

หลังจากนั้นให้เราไปที่ Add Products แล้วกด + เลยครับ

เลือก Product ชื่อว่า Facebook Login เมื่อแอดเรียบร้อยจะเข้ามาอยู่ใต้ Products ของเราครับ

หลังจากนั้นใต้ Product Facebook Login ให้เลือก Settings แล้วทำการ Add Site URL : ตามรูปครับ

เมือ Add แล้วกด Save Changes ได้เลยครับ

คราวนี้เราต้องมาทำให้ R มันคุยกับ Facebook API รู้เรื่องครับโดย Download Packages Rfacebook และ RCurl เหล่านี้ (ส่วน tidyverse ผมใช้ในการ Clean และ Visualise ครับ)

Install แล้วก็เรียกใช้ Packages ครับ

ต่อมาให้กลับไปยังที่ Facebook Developer เพื่อเอาเลข App ID และ App Secret ตามรูปครับ :

ไปที่ Settings > Basic

หลังจากได้เลขแล้วให้เราเอามาใส่ใน Script เพื่อยืนยันตัวใน R Script ครับ โดยใช้ Code ดังรูปข้างล่าง

นำ App Id & App Secret มาวาง ผมได้ฝาก Script การยืนยันตัวไว้ใน Object ที่ชื่อว่า fb_oauth

หลังจากกด Run ไปแล้วจะขึ้นหน้าตาฝั่ง Console ตามรูปล่างครับ

หลังจากกด Enter แล้วเราจะเด้งไปยัง Browser เพื่อรับแจ้งว่าเราได้ทำการยืนยันและเชื่อมต่อเรียบร้อยตามรูปครับ

ถ้ายืนยันสำเร็จบน Browser จะขึ้นข้อความแบบนี้ครับ 😏

ต่อมาให้เราทำการ Get Data มาจาก Page ครับ โดยเป้าหมายของเราคือ Cup E โดยใช้ Script ด้านล่างนี้ครับ

ผมทำการ Store Data ไว้ใน Object CupE โดย Token ให้เราใส่เป็น Object ที่เราฝากไว้ตอนยืนยันตัวครับ สำหรับ n ผมใส่ให้มันเยอะๆ เพราะไม่รู้ว่ามันมีจำนวน Post ตั้งแต่ต้นปีเท่าไร แต่มันจะดึงมาให้แค่เท่าที่มีนะครับ หลังจากนั้นรอมัน Run จน Fetch Data เสร็จ สำหรับชื่อ Page ที่ถูกต้องนั้นเราสามารถดูได้ตามหลัง Domain Facebook ครับ เช่น https://www.facebook.com/cupemag

เมื่อใช้คำสั่ง View(Data)เราจะเห็นว่ามันถูกเก็บให้อยู่ในรูปของ Table เรียบร้อยครับ

หน้าตาของ Data ที่เรา Get มาได้ครับ ซึ่งจะวิเคราะห์เลยไม่ได้นะครับเพราะ Column “post” แม่งโคดเละ 555 (เลข 5 มีน้ำตาซ่อนอยู่ 😢)

#Clean Data

ผมเริ่มจากการเปลี่ยนชื่อ Column ก่อนครับ โดยใช้ dplyrซึ่งเป็น Package ย่อยในตัวแม่ tidyverse

เปลี่ยนชื่อตามชอบเรยย

หลังจากนั้นผมจัดการไอ้การเว้นบรรทัดที่ R มันอ่านเป็น \n ครับ

จงหายไปเจ้า \n

ต่อมาผมจะ Extract เอาชื่อนางแบบออกมาโดยใช้ tidyrซึ่งเป็น Package ย่อยใน tidyverseครับ

แต่ชื่อที่ถูก Split ออกมายัง Column Model มันยังปนกับชื่อช่างภาพอยู่

ดังนั้นผมจะ Split ชื่อช่างภาพไปอยู่อีก Column นึงครับ โดยใช้ Regex เข้ามาช่วย

ในโพสต์สิ่งที่ Indicate ชื่อช่างภาพคือ Photo ครับ แต่ไม่ใช่ทุกโพสที่จะใช้คำว่า Photo 😿

เรายังไม่ได้ชื่อช่างภาพมานะครับ เราต้องตัดพวก Chunks หรือ Text ที่ไม่เกี่ยวข้องออกไปด้วย ซึ่งผมใช้ Regex ในการตัด ที่ยกมาเป็นส่วนหนึ่งของการตัดคำนะครับ แต่ไม่ใช่ทั้งหมดนะ ตามรูปด้านล่างเรยย

เราต้องค่อยๆ ทำความเข้าใจว่า Pattern ไหนใน Column เป็นตัวแบ่งระหว่าง Information ที่เราต้องการและไม่ต้องการ

ต่อมาก็ถึงขั้นตอนทำความสะอาดน้องๆ กันนะครับ (หมายถึง Clean Data นะ อิอิ) โดยหลังจาก Clean ตากล้องเสร็จผมก็ฝากไว้ใน Object ใหม่ ที่ชื่อว่า CupE.extNames3

ที่จริงมีการคลีนน้องๆ เกิดขึ้นอีกเยอะเลยครับ เราต้องค่อยๆ ทำความเข้าใจรูปแบบของ Text ใน Column นั้นไปเรื่อยๆ ถ้าหยิบมาหมดเด๋วยาว 555

** หลังจาก Cleaned Data เสร็จแล้วให้เรา Export ออกมาเป็น .csv ใน Directory ก่อนนะครับ ไม่งั้นถ้า Restart คอมพ์ใหม่ Object หายหมด เพราะเราต้องไป Fetch Data จาก Facebook ใหม่นั่นเองครับ (โดนมากับตัวเลยครับ 😲) **

Export เป็น .csv เก็บไว้เรยย

#Visualisation

#ใครกลับมาเป็นนางแบบซ้ำให้กับ Page มากที่สุด

ผมเริ่มจากการ Subset ข้อมูลโดยใช้ Count การนับ Row ที่เจอชื่อนางแบบซ้ำ ก่อนทำ Chart ครับ

Count of Comebacks คือจำนวนการกลับมาถ่าย

ต่อมาก็เป็นหน้าตาหลังจาก Visualise โดยใช้ ggplot2ซึ่งเป็นหนึ่งใน Package ย่อยของ tidyverse

คนที่กลับมาถ่ายเยอะสุดคือน้อง Pichana Yoosuk

น้อง Pichana Yoosuk

งดงามมากคั้บ 😊

#ช่างกล้องที่กลับมาฝากผลงานบ่อยที่สุด

Script ในการ Run

Visualise ออกมาได้ …

Gee Nikon คือคนที่กลับมาฝากผลงานกับ Cup E มากสุด

#แล้วน้องคนไหนได้ Likes, Shares, Comments เยอะสุด

ผมใช้ชุดนี้เป็น Template แล้วเปลี่ยนตัวแปรที่ต้องการหาค่าออกมาครับ

Visualise ออกมาเป็น …

เนื่องจากกลับมาถ่ายเยอะน้อง Pichana Yookul เลยครองจำนวนไลค์เยอะสุดไปรร ~~

มาดูกันว่าถ้าเปลี่ยนมาเป็นแชร์เป็นน้องคนเดิมป่าวน๊าา 😕

คราวนี้เป็นน้อง Jajah Wantrana

น้อง Jajah Wantrana

อยากเป็นใบบัวจุง 😉

แล้วใครน๊าาได้ Comments เยอะสุดจากพี่ๆ ใน Page

คราวนี้เป็นน้อง สุกัญญา กออิน

น้อง สุกัญญา กออิน

เชื่อว่าพี่ๆ คงแพ้ชุด นศ. กันมากมายย 😙

#ช่วงความถี่ของจำนวน Likes, Shares, Comments ที่สาวๆ ได้รับกันในแต่ละโพสต์

คราวนี้มาดูกันว่าแต่ละโพสต์ของน้องๆ นั้นไปกองกันที่จำนวน Likes, Shares, Comments ที่จำนวนเท่าไรกัน

Distribution Code Template

ผมปรับ binwidth เพื่อให้เหมาะสมแต่ละช่วงของแต่ละ Metric นะครับ โดย Likes binwidth = 1,000, Shares binwidth = 100, Comments binwidth = 50

Likes Distribution

จะเห็นว่าจำนวนไลค์ของแต่ละโพสต์จะไปกระจุกตัวอยู่ที่ 4–7 พัน (binwidth แต่ละแท่งคือ 1,000) และจะเห็นได้ว่าข้อมูลไม่วิ่งเป็น Normal Distribution หรือมีพวก Extreme Values อยู่ค่อนข้างเยอะ

Shares Distribution

จะเห็นว่ามีน้องๆ บางคนนั้นคนแชร์กันเป็นหลักหมื่นต่อโพสต์ หรือ Right-Skewed เป็นอย่างมาก ชาร์ตนี้ผมปรับ Binwidth อยู่ที่ 100

Comments Distribution

Comments ก็เป็นไปใน Pattern เดียวกันคือเบ้ขวา เพราะมีน้องๆ บางคนนั้นคนเม้นท์กันเป็นพันต่อโพสต์ ชาร์ตนี้ผมปรับ Binwidth = 50 เพื่อให้เห็น Distribution ชัดขึ้น

เมื่อทำ Shapito Test เพื่อเช็คว่ามันไม่เป็น Bell Curve จริงๆ นะ ผมเลยเขียน function shapiro.test + format adjust p-value ทีเดียวเลยครับ ได้เป็นรูปด้านล่าง

ทำงานง่ายๆ ครับ เมื่อ Test เสร็จแล้วให้ Turn P-value เป็นตัวเลขธรรมดาไม่เป็นเลขฐานวิทยาศาสตร์

Findings คือ ทั้ง Likes, Shares, Comments นั้นวิ่งไม่เป็น Normal Distribution โดยทั้งสามตัวให้ P-value < 0.05 หมดเลยครับ ล้ม Null Hypothesis ที่ว่าแต่ละตัวนั้น Normally Distributed

เมื่อ Distribution มันเอียงไปทางขวามากผมจึงเลือก Trim ข้อมูลที่ 20% เพื่อหาค่าเฉลี่ย โดยเขียน Function ขึ้นมาตามรูปล่างครับ

เขียนง่ายๆ เลยครับ Trim ข้อมูลที่ 20% แล้วค่อยหาค่า Mean หลังจากนั้นให้ Round เป็นจำนวนเต็ม ต่อมาผมจำกัด Vector ให้ Length อยู่แค่ Numeric สุดท้ายใช้ map_dbl() เพื่อทำ Loop Function ที่เขียนไปทุก Column ครับ
ค่าเฉลี่ยของ Engagement Metric ต่างๆ

Average Likes ที่สาวๆ ได้รับต่อโพสต์ = 5,756

Average Shares ที่สาวๆ ได้รับต่อโพสต์ = 423

Average Comments ที่สาวๆ ได้รับต่อโพสต์ = 79

#นางแบบคนไหนทำงานกับช่างกล้องหลากหลายที่สุด

เริ่มแรกผมทำการสร้าง Table เพื่อจับคู่น้องๆ กับช่างกล้องด้วย Script ด้านล่างครับ

เพื่อทำการหาว่าน้องคนนี้ได้ร่วมงานกับช่างภาพคนนี้กี่ครั้ง
หน้าตาของ Table จากตารางนี้หมายความว่าถ้ามีชื่อน้องปรากฏอีกครั้งในอีก Row คือเป็นการร่วมงานกับช่างภาพอีกคนครับ

หลังจากนั้นมาดูว่าใครทำงานกับช่างกล้องหลายคนที่สุด

อาจเป็นไปได้ว่าน้อง Pichana Yoosuk กลับมาถ่ายให้กับ Cup E มากที่สุด จึงมีโอกาสได้ร่วมงานกับช่างภาพหลายท่านครับ
และนี่คือนามช่างภาพที่น้อง Pichana Yoosuk เคยร่วมงานด้วยครับ

สรุป

การดึง API เพียงแค่คุณเป็นคนเล่น Facebook ก็สามารถทำได้ครับ และเรื่องการเขียน Code เป็นเรื่องที่ฝึกทีหลังได้ แต่สิ่งที่สำคัญกว่าคือ ความรู้พื้นฐานทางสถิติ และความรู้ในสายอาชีพคุณ ยิ่งคุณรู้สิ่งเหล่านี้เยอะ คุณก็จะสามารถตั้งคำถามสำคัญได้อีกมากมาย และค่อยใช้ Tool ไม่ว่าจะเป็น Python, R ในการหาคำตอบครับ ผมก็เป็นในหนึ่งคนที่จบไม่ตรงสาย (ภาษาศาสตร์) แต่ผมเชื่อว่าถ้าคุณตั้งใจแล้วล่ะก็ ฝึกและเก่งได้แน่นอนครับ สู้ๆ ครับทุกคล 👊 🔥

Consistency หรือความสม่ำเสมอในการฝึกฝนนั้นสำคัญมากครับ

Answer the questions that make an impact on the business, and don’t make things complicated — Jonathan Ma, Ex-facebook Data Scientist

--

--

Chaiyasit Bunnag

a Data Analyst with no related degrees T^T; an Analogical Thinker