ลองวิเคราะห์ข้อมูล Twitter ตามสไตล์โอตะ BNK ด้วย Tweepy, Pandas และ NLP Part 1

Wasin Faengrit
botnoi-classroom
Published in
5 min readFeb 8, 2020

สวัสดีคุณผู้อ่านทุกท่านที่เข้ามาอ่านบทความนี้นะครับ ก่อนอื่นผมขอสารภาพเลยว่าผมเป็นหนึ่งในคนที่ค่อนข้างชื่นชอบและตามวง BNK หรือหลายๆ คนก็จะเรียกกันว่าโอตะนั่นเอง สืบเนื่องมาจากวันหนึ่งขณะผมไล่ดูฟีดหน้าเฟสบุ๊คระหว่างอยู่บน BTS ผมก็ไปเห็นว่าเกิดปรากฏการณ์ที่ชื่อของHashtag #JibBNK48 หนึ่งในสมาชิกวง BNK ที่ผมชื่นชอบติดเทรนด์ฮิตของ twitter ทว่าด้วยอะไรหลายๆ อย่างทำให้ผมไม่สามารถที่จะตามข่าวได้อย่างเต็มที่ ด้วยความอยากรู้และการนึกสนุกของผม หลังจากนั้นประมาณสองอาทิตย์ผมจึงได้ลองสร้าง Challenge สนุกๆ ขึ้นว่า “ลองมาดึงข้อมูลจาก Twitter เกี่ยวกับจิ๊บมาวิเคราะห์แบบเร็วๆ ดีกว่า” และเมื่อทำเสร็จผมเลยอยากจะแชร์สิ่งที่ทำขึ้น เพราะผมเห็นว่าสิ่งที่ผมกำลังทำอยู่นั้นสามารถเอาไปประยุกต์ใช้กับข้อมูลอื่นๆ ได้ด้วย ไม่ว่าจะเป็นเรื่องกระแสต่างๆ ที่เกิดขึ้นใน Twitter หรือพวกข่าวสารต่างๆ ที่เกิดขึ้นอย่างมากมาย ด้วยเหตุนี้เลยทำให้เกิดบทความนี้ขึ้นนั้นเอง

รูป Jib BNK48 จากเพจFacebook สามารถติดตามได้ทาง https://www.facebook.com/pg/bnk48official.jib

สิ่งที่ผมทำและผลลัพธ์ที่ได้

ก่อนที่จะเข้าสู้เนื้อหาอย่างจริงจัง ผมอยากจะเกริ่นถึงสิ่งที่จะปรากฏในบทความนี้ก่อนว่าจะมีอะไรเกิดขึ้นบ้าง เพื่อเป็นตัวช่วยตีกรอบคร่าวๆ สำหรับผู้สนใจด้านเชิงเทคนิคหรือด้าน Data Science และก็อยากจะเล่าถึงข้อมูลที่ผมได้รับจากการวิเคราะห์สำหรับผู้ที่ไม่ได้อยู่ในสายงานเหล่านี้ แต่อยากรู้ว่าผมได้ข้อมูลอะไรออกมาบ้างนะครับ

สำหรับผลลัพธ์ที่ผมได้จากการวิเคราะห์ เนื่องจากผมตั้งโจทย์กับตัวเองไว้ว่าอยากรู้เรื่องที่คนส่วนมากคุยกันเยอะๆ เกี่ยวกับจิ๊บ รวมถึงสิ่งที่คนส่วนใหญ่ชอบกันเกี่ยวกับเหตุการณ์ที่เกิดขึ้น และพวกสิ่งของ ผู้คนหรือเหตุการณ์ที่ถูกพูดขึ้นร่วมด้วย ผมเลยตั้งเป้าที่จะวิเคราะห์เกี่ยวข้อมูล 5 อย่างเหล่านี้ได้แก่ 1.จำนวนการทวิตและรีทวิตในแต่ละวัน 2.ทวิตที่มีการ Retweet สูง 3.ทวิตที่มียอด Favourite สูง 4.Hashtag ที่ถูกกล่าวถึงด้วยบ่อยๆ 5.คำที่ถูกพบบ่อยใน Hashtag #JibBNK48

โดยข้อมูลที่ผมนำมาใช้วิเคราะห์เป็นข้อมูลทวิตระหว่างวันที 20 ถึง 27 มกราคม 2563 ซึ่งผลที่ได้ก็ตามด้านล่างนี้เลยครับ

  • จำนวนการทวิตและรีทวิต: ในระหว่างช่วง 20 -27 มกราคม ผมพบว่าในช่วง 7 วันดังกล่าว Hashtag #JibBNK48 ถูกทวิตไปเกือบ 1 ล้าน 5 แสนครั้ง โดยมีการพูดถึงมากที่สุดในวันที่ 21 ซึ่งมีจำนวนทวิตถึง 5 แสน 9 พันกว่าครั้ง
  • ทวิตที่มีการ Retweet และ Favourite สูงสุด : สำหรับ 2 หัวข้อนี้ผมพบว่าทวิตที่ได้รับการสนใจแล้วเกิดการ Retweet และกด Favourite อันดับต้นๆ จะคล้ายคลึงกัน ซึ่งทวิตที่คนพูดถึงกันมากที่สุดจะเป็นเรื่องเกี่ยวกับเพลงเดี่ยวของจิ๊บ และรองลงมาจะเป็นเรื่องเหตุการณ์ที่เกิดขึ้นใน Digital Live Studio ที่จิ๊บได้เข้าร่วม
ตัวอย่าง 10 อันดับทวิตที่มีHashtag #JibBNK48 ซึ่งมีการรีทวิตสูงสุด 10 อันดับในช่วงวันที่ 20–27 มกราคม 2563
  • Hashtag ที่ถูกกล่าวถึงร่วมด้วยบ่อย : ถ้าไม่นับร่วม Hashtag #jibbnk48 ที่สะกดต่างกับคำที่ผมใช้ค้นหา Hashtag ที่เจอบ่อยรองลงมาก็คือ #musicbnk48 ครับ ซึ่งก็เกิดจากกระแสเหตุการณ์ที่เกิดขึ้นใน Digital Live Studio นั่นเอง
  • คำที่ถูกพบบ่อย : สำหรับคำที่พบบ่อยนั้น คำแรกเลยก็คือคำว่า “เพลง” ส่วนอันดับต่อมาจะเป็นตัวอักษรที่เป็นตัวประกอบของคำว่า “It’s” ซึ่งเป็นคำขึ้นต้นของเพลงเดี่ยวของจิ๊บ (It’s me) และเฌอปราง (It’s life) ครับ ด้วยเพราะมีการพูดถึงทั้ง 2 เพลงใน Hashtag นี้ เลยทำให้พบเจอ 2 คำนี้บ่อยเป็นอันดับสองนั่นเองอันดับถัดมาก็ไม่พ้นคำว่า “me” ซึ่งเป็นหนึ่งในชื่อเพลงของจิ๊บ ส่วนคำที่พบบ่อยรองลงมาก็เช่น จิ๊บ 48 ซึ่งบ่งบอกถึงตัวของจิ๊บเอง แล้วก็ความรู้สึกต่อเพลง เช่นคำว่า ชอบ ครับ
เพลง It’s me ที่ถูกกล่าวถึงบ่อยในข้อมูล ใครสนใจฟัง ลองติดตามได้ที่ youtube เลยครับ

สำหรับรายละเอียดของข้อมูลและขั้นตอนที่จะได้ผลลัพธ์ออกมา ผมจะขอพูดถึงในส่วนข้อมูลเชิงเทคนิคนะครับ

ซึ่งในส่วนข้อมูลเชิงเทคนิคในบทความชุดนี้ก็จะสามารถแบ่งออกได้เป็น 4 ช่วง ตามนี้เลยครับ:

  1. สิ่งที่คุณต้องเตรียมในการดึงข้อมูลจาก Twitter และวิเคราะห์ข้อมูลในบทความนี้
  2. การดึงข้อมูลจาก Twitter ด้วย Tweepy และเก็บข้อมูลลง Excel ด้วย Pandas
  3. การจัดการข้อมูลเพื่อหายอดทวิตในแต่ละวัน และการหาทวิต 10 อันดับแรกที่มีการ Retweet และยอด favourite สูงสุด ด้วย Pandas
  4. การกรองคำในข้อมูลทวิต ตัดคำ และนับคำ เพื่อหา Hashtag ที่เกี่ยวข้องและคำที่พบบ่อย

สำหรับบทความ Part 1 นี้ ผมจะกล่าวถึง 2 หัวข้อแรกก่อนนะครับ แล้วขอยกหัวข้อที่เหลือไว้ในบทความต่อๆ ไป เอาล่ะครับ เพื่อไม่ให้เป็นการเสียเวลา เรามาเข้าเนื้อหาด้านเทคนิคกันเลยดีกว่า

สิ่งที่ต้องเตรียมในการดึงและวิเคราะห์ข้อมูลจาก Twitter

ในหัวข้อนี้ผมขอพูดถึง 3 สิ่งที่คุณต้องเตรียมสำหรับลองดึงข้อมูลและวิเคราะห์ในบทความนี้นะครับ

  1. Python : สิ่งแรกคือภาษาคอมพิวเตอร์ที่ผมจะใช้ในการทำงาน ซึ่งในบทความนี้ผมได้ใช้ Python ในการ Coding เนื่องจากมีเครื่องมือและการใช้ที่ค่อนข้างง่ายสำหรับงานด้านนี้นะครับ
  2. Library : ในส่วนของ Library ที่ผมใช้ในงานนี้มีทั้งสิ้น 6 อย่าง ได้แก่
  • Tweepy ใช้สำหรับในการดึงข้อมูล(Crawler) จาก Twitter
  • Pandas ใช้สำหรับจัดการข้อมูลที่ดึงมาได้ให้อยู่ในรูปตาราง แล้วจัดกลุ่มหรือทำการวิเคราะห์ข้อมูลต่างๆ ที่อยู่ในรูปตาราง
  • sklearn ใช้สำหรับทำสิ่งที่เรียกว่า Bag of Word เพื่อใช้สำหรับแปลงคำที่เป็นภาษามนุษย์ให้คอมพิวเตอร์เข้าใจได้
  • numpy ใช้สำหรับในการช่วยเหลือด้านจัดการและการคำนวณตัวเลขในรูปเมทริกซ์
  • emoji ใช้สำหรับเป็นฐานข้อมูล emoji เพื่อนำมาใช้กรอง emoji ที่พบในทวิตเพื่อให้สามารถวิเคราะห์ข้อมูลได้สะดวกขึ้น
  • re หรือ regularExpression ใช้สำหรับในการจับ pattern ของคำที่เราต้องการเพื่อใช้สำหรับกรองคำที่ไม่ต้องการออกไปเช่น URL ของรูปหรือลิงค์อื่นๆ

สำหรับผู้ที่สนใจด้าน pandas หรือ numpy ซึ่งเป็น Library พื้นฐานของด้าน Data Science สามารถศึกษาได้จากที่ medium นี้ครับ

3. Key และ Token ของ Twitter developer app:

การที่จะสามารถเข้าไปดึงข้อมูลจาก twitter ได้นั้นเราต้องมีคีย์หรือกุญแจสำหรับการระบุตัวตนใช้งาน 4 อย่างได้แก่ consumer key, consumer secret, access token, access token secret ซึ่งสิ่งเหล่านี้ได้จากการสร้าง App ด้วย Twitter developer account หากใครมี account twitter อยู่แล้วสามารถเข้าไปสร้าง Developer account ได้ที่ https://developer.twitter.com/ และเมื่อสร้างเสร็จให้สร้าง App ต่อ ซึ่งภายใน App จะมีคีย์ 4 อย่างที่ผมกล่าวไปข้างต้นให้เอามาสามารถใช้งานได้ สำหรับวิธีสร้างอย่างละเอียดสามารถอ่านได้ที่ medium นี้เลยครับ

มาดึงข้อมูลจาก Twitter ด้วย Tweepy กัน

หลังจากทุกท่านเตรียมอุปกรณ์ที่ต้องใช้ครบเรียบร้อยแล้ว เรามาลุยcodingในการดึงข้อมูลจาก Twitter กันดีกว่า ในการอธิบายส่วนนี้ผมจะขอแยก Code ทั้งหมดเป็น 10 ขั้นตอน และสุดท้ายจะมาสรุปกันอีกทีว่าหน้าตาท้ายสุดของ Code เราจะเป็นอย่างไรนะครับ

Step 1 import library:

ในขั้นแรกเราต้องมีการเรียกใช้ Library ก่อน ซึ่ง Library ที่ใช้ในหัวข้อดึง Twitter มี 2 อย่างครับ

import tweepy
import pandas as pd

Step 2 สร้างตัวแปรสำหรับเก็บ authentication code ของ Twitter api

ในขั้นตอนนี้เราจะสร้างตัวแปร 4 ตัวขึ้นมาเพื่อเก็บ authentication ที่เราได้จากการสร้าง app ด้วย twitter developer accout นะครับ โดยที่ผู้อ่านต้องแทน XXXX ใน Code ด้านล่างนี้ด้วยคีย์ที่ท่านได้สร้างขึ้น

consumer_key = ‘XXXX’
consumer_secret = ‘XXXX’
access_token = ‘XXXX’
access_token_secret = ‘XXXX’

Step 3 ยืนยันตัวตนและใช้งานคำสั่ง API ของ Tweepy

ต่อจาการสร้างตัวแปร เราจะนำตัวแปร authentication code ที่เราสร้างขึ้นมายืนยันตัวตนแล้วใช้งานคำสั่ง API ของ Tweepy กัน

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

Step 3 สร้าง Dataframe สำหรับเก็บข้อมูล

ก่อนที่เราจะทำการดึงข้อมูล สิ่งที่เราต้องมีคือที่ๆ เราจะใช้เก็บข้อมูล ซึ่งเราจะใช้ pandas ในการสร้าง Dataframe เพื่อเก็บข้อมูลที่จะดึงมาจาก API ในรูปแบบตาราง โดยที่ Dataframe ในบทความนี้จะมี column อยู่ 5 อย่างซึ่งเป็นข้อมูลที่จะนำไปใช้ในการวิเคราะห์ต่างๆ ในบทความชุดนี้ ได้แก่ เวลาที่ทวิต, ข้อความทวิต, Hashtag, จำนวน Retweet, และจำนวนการกด Favourite

df = pd.DataFrame(columns= [“create_at”, ”text”, ”hashtag”, ”retweet_count”, ”favourite_count”] )

Step 5 ทำการ Search Twitter ด้วย API

ในขั้นตอนนี้จะทำการค้นหาคำในทวิตด้วยคำสั่ง api.search และ tweepy.cursor ของ tweepy ครับ ซึ่งผลลัพธ์ที่ได้จะคล้ายกับการเราใช้ค้นหาใน twitter นั้นเอง ในบทความนี้ข้อความที่ผมนำมาใช้ค้นหาก็คือ #JibBNK48 ส่วน Code ที่ผมใช้คือตามด้านล่างนี้เลยครับ

query = “#JibBNK48”tweepy.Cursor(api.search,q=query,count=100,result_type=”recent”,tweet_mode=’extended’).items()

ใน Code ส่วนนี้ผมสั่งให้ทำการค้นหาคำว่า #JibBNK48 โดยที่ให้ดึงข้อมูลที่ละ 100 ทวิต และตั้งค่าให้รับข้อมูลในหัวข้อ “recent” หรือล่าสุดของ twitter และสั่งให้รูปแบบข้อมูลที่รับอยู่ในโหมด “extended” เพื่อรับข้อความแบบที่ไม่มีการตัดครับ

สำหรับการปรับค่า parameter อื่นสามารถดูได้จาก document นี้เลยครับ http://docs.tweepy.org/en/latest/api.html

ซึ่งข้อจำกัดในการใช้ API ตัวนี้คือสามารถดึงข้อมูลย้อนหลังได้เพียงแค่ 7 วันเท่านั้นครับ

ส่วนข้อมูลที่ได้รับจากการใช้งาน API นี้ มีให้เลือกใช้งานมากมายเลยครับตั้งแต่ข้อมูลข้อความในทวิต จำนวนการรีทวิต ข้อมูลผู้โพสต์ ภาษา เป็นต้น ในบทความนี้จะสนใจข้อมูลอยู่ 5 อย่าง ได้แก่ เวลาที่ทวิต, ข้อความทวิต, Hashtag, จำนวน Retweet, และจำนวนการกด Favourite นะครับ

Step 6 สกัดข้อมูลเวลาในการสร้างและจำนวนรีทวิต

ต่อไปเราจะทำการสกัดข้อมูลที่เรียกใช้ง่ายสุดจาก Searchresults ที่ได้จาก API กันก่อนนะครับ ซึ่งก็คือเวลากับจำนวนรีทวิต ซึ่งผมได้มีการใช้ตัวแปรชื่อว่า tweet ในการวนค่าจาก Searchresults

for tweet in tweepy.Cursor(api.search,q=query,count=100,
result_type=”recent”,tweet_mode=’extended’).items():
create_at = tweet.created_at
re_count = tweet.retweet_count

Step 7 สกัดข้อมูล Hashtag

ข้อมูลต่อไปที่สนใจคือ Hashtag ซึ่งเราจะทำการดึงข้อมูล Hashtag จาก Searchresults ที่ได้จาก API นะครับ โดยผมจะเก็บไว้ในตัวแปรที่ชื่อว่า “hashtag” โดยทำการขั้น Hashtag แต่ละอันด้วย “/” โดยในที่นี้ผมได้มีการใช้ for loop ในการวนเพื่อสกัด Hashtag ทุกข้อมูลที่ดึงมาได้

entity_hashtag = tweet.entities.get(‘hashtags’)
hashtag = “”
for i in range(0,len(entity_hashtag)):
hashtag = hashtag +”/”+entity_hashtag[i][“text”]

Step 8 สกัดข้อความทวิตและจำนวนผู้กด Favourite

ในขั้นตอนนี้ ก่อนอื่นเราต้องทำการตรวจก่อนว่าข้อมูลทวิตที่ได้รับเป็นทวิตต้นฉบับหรือทวิตที่ถูกรีทวิตมา ซึ่งหากเราไม่ทำการตรวจเงื่อนไขนี้แล้วทำการสกัดข้อความจากทวิตนั้นเลยจะทำให้ได้ข้อความที่ถูกตัดและจำนวนกด Favourite ที่ไม่ใช่ของทวิตอันนั้นจริงๆ ซึ่งในขั้นตอนนี้ผมจึงได้นำ try and except ของ python มาใช้ว่าหากเจอข้อความในหัวข้อ retweet ให้ใช้ข้อความและจำนวนผู้กด Favourite จากทวิตดั่งเดิม แต่หากไม่พบให้ดึงข้อมูลจากทวิตอันนั้นได้เลย

try:
text = tweet.retweeted_status.full_text
fav_count = tweet.retweeted_status.favorite_count
except:
text = tweet.full_text
fav_count = tweet.favorite_count

Step 9 สร้างข้อมูลแถวใหม่แล้วใส่เข้าไปใน Dataframe

หลังจากสกัดข้อมูลที่สนใจเสร็จ เราจะต้องนำข้อมูลเหล่านั้นมาใส่ลงไปใน Dataframe ที่ได้สร้างเตรียมรอไว้ก่อนหน้า

new_column = pd.Series([create_at,text,hashtag,re_count,fav_count], index=df.columns)
df = df.append(new_column,ignore_index=True)

Step 10 Save Dataframe เป็นไฟล์ Excel

หลังจากเราเก็บข้อมูลที่เราต้องการไว้ทั้งหมดใน Dataframe แล้ว สิ่งที่ต้องทำในขั้นตอนสุดท้ายคือการเซฟไฟล์ ซึ่งผมเลือกที่จะเซฟเป็นไฟล์ .xlsx หรือ excel เพราะง่ายในการเปิดใช้งานและผมเชื่อว่าคุณผู้อ่านหลายๆ ท่านอาจจะมีความสามารถด้าน excel อยู่แล้ว ก็จะสามารถที่จะนำไปใช้ได้สะดวก โดยในตัวอย่างผมจำเซฟไฟล์ชื่อว่า “twitterCraler.xlsx” ซึ่ง Code ในขั้นตอนนี้ก็มีเพียงบรรทัดเดียวคือ

df.to_excel(“twitterCrawler.xlsx”)

หลังจากออกแบบขั้นตอนการทำงานทั้ง 10 ขั้นตอนมาเป็นที่เรียบร้อยแล้ว เมื่อเรารวม Code ทั้งหมดเข้าด้วยกันโดยมีการใช้ For loop ในการวนสกัดข้อมูลและ update ข้อมูลใน Dataframe จะได้ Code พร้อมใช้งานที่หน้าตาประมาณนี้ครับ

และเมื่อทำการเซฟไฟล์ลง Excel จะได้ข้อมูลหน้าตาอย่างนี้

การจะนำตัวอย่างการดึงข้อมูล Twitter นี้ไปประยุกต์ใช้ ผู้อ่านสามารถทำได้โดยการเปลี่ยนคำที่ต้องการค้นหาเป็นอย่างอื่น ซึ่งอาจจะเป็น Hashtag หรือไม่ใช่ก็ได้นะครับ เช่น โรคโคโรน่า, PM2.5, blackpink หรือข่าวสาร กระแส Social ต่างๆ และอาจจะสามารถเลือกข้อมูลที่จะสนใจเพิ่มเติมได้เช่น ภาษา ข้อมูลโปรไฟล์ของคนทวิต สถานที่ทวิต เป็นต้น ซึ่งสุดท้ายก็สามารถที่เซฟไฟล์เป็น xlsx หรือ csv เพื่อนำไปใช้ต่อยอดได้ ไม่ว่าจะนำเอาไปเข้าคำนวณในโปรแกรมอื่น การทำ Data visualization, customer segmentation หรือกระบวนการทาง Data Science อื่นๆ เป็นต้น

ในบทความนี้ผมจะขอค้างไว้ที่การดึงข้อมูล Twitter ก่อนนะครับ ซึ่งในบทความหน้าจะกล่าวถึงการนำ pandas กับเทคนิค NLP เล็กๆ น้อยๆ มาช่วยในการจัดเรียงข้อมูลและหา inside แล้วทำ Data Visualization กัน

สามารถอ่านกันต่อ part 2 ได้ที่ลิงค์ด้านล่างเลยครับ

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

สุดท้ายนี้ผมขอฝากบุคคลที่เป็นที่มาของชุดข้อมูลนี้ด้วยครับ สามารถติดตามจิ๊บ BNK48 ได้ที่ https://www.facebook.com/bnk48official.jib/

และสำหรับใครที่สนใจข้อมูลและ Community เกี่ยวกับด้าน Data science สามารถติดตามได้ที่ช่องทาง > Botnoi Classroom

ไว้พบกันใหม่บทความถัดไป ขอบคุณครับ :)

--

--

Wasin Faengrit
botnoi-classroom

Data Scientist & Project Manager @ iBotnoi ,Biomedical Engineering #9 @ Mahidol University