みなさん初めまして。マメアカ(マーケティングメトリックスアカデミー)生の内藤勇之助と申します。
今回は、Twitterのデータを用いてネガポジ判定(テキストマイニングの1つ)に挑戦してみたいと思います。
所長から「せっかくなので大阪にまつわるもの」ということであったので、パインアメでおなじみ、公式アカウントの中でも「攻めすぎている」と話題のパイン株式会社さん公式アカウントとしました!
ゆるふわ~な感じがとっても好きなんで( ´◎`)スー。
ネガポジ判定とは?
ネガポジ判定とは、簡単に言うと人の発言などが前向き(ポジティブ)か後向き(ネガティブ)なのかを判定することです。
「今日は楽しむぞ!」という前向きな発言であればポジティブ、「今日はダメだ」という後ろ向きな発言であればネガティブという判定がされます。
Twitterでは、ユーザが自分の思いや発言を自由に投稿することができます。
つまり、ある程度、つぶやいた人の「素」のネガポジ判定をすることができると思います。
公式アカウントでゆる~くつぶやいているとされるマッキーさん、どんな人かは解らないのですが、ポジティブ発言が多そうです。
データはRの「twitteR」というパッケージを用いて取得しました。3月15日〜4月5日までの850程度のツイートデータです。
ツイート内に含まれる画像のリンクやハッシュタグ、アカウント名などは除外して分析することにしました。
基本的な集計
まずは基本的な集計をして、パインアメのアカウントを分析してみましょう。
# インストール install.packages(c("twitteR", "ROAuth")) library(twitteR) library(ROAuth) (セットアップ関連は除く) # ユーザのタイムライン取得 tweets<-twListToDF(userTimeline(user="pain_ame",n=3200))tweets<-within(tweets,{ # JSTに変換 attr(created,"tzone")<-"Asia/Tokyo" # HTMLタグ削除 statusSource<-factor(gsub("(.*?)","\\1",statusSource)) date<-factor(format(created,"%Y-%m-%d"))#日にち hour<-NULL; month<-NULL; year<-NULL; wday<-NULL with(as.POSIXlt(created),{ hour<<-factor(hour) month<<-factor(mon + 1) year<<-factor(year + 1900) wday<<-factor((wday + 6) %% 5,labels = wday.abb) }) # ツイートの文字数 textLength<-nchar(text) # ユーザ名,URL,ハッシュタグを削除 cleanText<-removeSpecialStr(text) cleanTextLength<-nchar(cleanText) })
ツイート数の推移を見てみます。
データを取得した時期から徐々にツイート数が増えてきていました。
なぜ増えているのか?目視で確認してみたところ、フォロワーとのやりとりが増えているためだと考えられました。
ファンと緊密にやり取りされているんだなぁーと思いました。
そして4月1日にツイートの件数が増えています。そう、この日はエイプリルフールです。きっと盛り上がっていたんでしょうね。
次は時間別でのツイート数を見てみましょう。
このグラフから、マッキーさんの活発な時間は9~11時と言えます。ほとんどのツイートは午前中ということですね。
そして曜日によって活発な時間帯が異なるということも見受けられます。
19時以降のツイートは金曜日のみなど何かしらの理由があるのかもしれません。(せっかくの華金なのに…)
ネガポジ判定
簡単な集計はこの辺にして、ネガポジ判定を行ってみましょう!
ネガポジ判定はRにて形態素解析を行ってから、「単語感情極性対応表」にある単語のみ抽出し単語感情極性対応表をもとにスコアを算出します。その結果「正の値であればポジティブツイート」「負の値であればネガティブツイート」とします。
単語感情極性対応表とは「単語」「品詞」の組に対して感情極性を1~-1の値で表現されているものです。前向きな単語ほど1に近づき、後ろ向きな単語ほど-1に近づきます。
この表をもとにスコアを算出することでネガポジ判定ができるのですが、少し落とし穴があります。それは、この単語感情極性対応表にはネガティブワードが多いということです。
どのくらいなのかというと、55,125語のうち49,983語がネガティブワードなのです。このままだとほとんどのツイートがネガティブ判定されてしまうので、相対的に見る必要があります。
まず発言全体を確認します。
#ネガポジ #単語感情極性対応表の取得 pndic <- read.table("http://www.lr.pi.titech.ac.jp/~takamura/pubs/pn_ja.dic", sep=":", col.names = c("term","kana","pos","value"), colClasses=c("character","character","factor","numeric"), fileEncoding = "SJIS") #名詞+品詞で複数の候補がある場合は平均値を採用 pndic2 <- aggregate(value ~ term + pos,pndic,mean) #pndicに登録されている単語のみ抽出 tweetDF<-subset(tweetDF,TERM %in% pndic2$term) #単語感情極性スコア付与 tweetDF<-merge(tweetDF, pndic2,by.x = c("TERM","POS1"),by.y=c("term","pos")) #単語の出現回数にスコアをかけて総和をとる score<-colSums(tweetDF[4:(ncol(tweetDF) - 1)]*tweetDF$value) #相対的にネガポジ判定 m<-mean(score) tweetType <- factor(ifelse(score > m,"positive", ifelse(score == m,"neutral","negative")), levels = c("positive","neutral","negative"))
結果は以下の通りです。
どうやらパイン株式会社さん公式アカウントのツイートの7割がポジティブであることがわかりました。分母比で考えると、かなりポジティブ性が高いと思います。
そもそも公式アカウントであるのにネガティブなツイートばかりしていたらなんか嫌ですよね…。
ここでポジティブツイートと判定されたツイートを見てみると「ありがパイン( ´▽`)」や「おパよーございまーっす( ´▽`)ノシ」という他のユーザに対してのツイートを頻繁にしていることがわかりました。
その他にも「いつもおやつ買ってきてくれる優しい社長」というツイートもありました。
多くのファンや優しい社長がいるから、きっと前向きなツイートが多いんだろうな、と思いました。
次に、日にち毎にネガポジツイートの割合を見てみます。
3月22日だけネガティブツイートの割合が半分を超えています。
この日にマッキーさんに何があったのでしょうか?実際のツイートを探ってみました。
どうやらこの時期はアメが販売している地域や、コラボ商品を関東でも買いたい!などユーザーのリクエストに「すいません」とツイートしていたようです。
ネガティブ発言も全てが全ていけないというわけではなく、あくまでの感情表現の1つなので、少し悲しんだりする表情が現れることで、より共感度合いが増すのではないでしょうか。
まとめ
今回はマッキーさんのネガポジ判定を試みた結果、結構面白い結果が出ました。
ポジティブツイートやネガティブツイートを追うことで、どんなツイートが人を惹きつけるのか、お気に入りやリツイートをしてくれるのかということを分析することもできそうです。
反省点としては、単語感情極性対応表に含まれるネガティブ・ポジティブの単語の数に差がありすぎること、また一部「これはポジティブでしょ!」と思うツイートがネガティブ判定されてしまうなど工夫が必要な点です。
どうやらこの単語感情極性対応表も完全なものではないようなのです。今後もっと単語が追加され、正しい得点がつけられたら良いですね。
今回の分析を通して、パインアメに改めて愛着がわきました。
マッキーさん、応援してま( ´◎`)スー!
以上です。