2011年6月11日土曜日

震災時のTweetデータの分析

先日共同研究者を募集したTweetデータについて,簡単な分析を行ってみました.

まず,総Tweet数ですが,3月5日から3月24日までで3億3235万8199Tweetでした.
日ごとのTweet数の内訳は,図1の通りです.
図1 Tweet数の変位
ただし,震災直後(3月12~15日)あたりは計画停電などの影響で十分にデータが取れていない可能性もあります.後々再収集を試みましたが,すべて収集出来ているとは限りません.

まあ,とはいえ3月11日にTweet数が一気に増加したのは間違いなさそうです.

次に,震災時にどの県が注目されていたかを分析しました.
各県名がTweetされた回数について,日常の1時間あたりの平均を県名Tweet数を1としたときに,震災時に何倍Tweetされたかを日本地図上に色分けして乗せました.
色が濃いほど日常よりも多くつぶやかれていることを示します.
autoボタンを押せば,時系列で見ることが出来ます.
画面がチラ付くのはご愛敬.

やはり,地震直後は「宮城」「福島」などがTweetされていますが,
時間とともに「宮城」などは減少し,「福島」が目立つことが分かります.
二日目付近からは,原発に注目が行っていたのでしょう.
また,長野や静岡でも地震が発生すると,大きく注目されていることが分かります.

ここから分かることはまだまだ少ないですが,今後さらに多くの情報をデータから抽出して,
震災時に何が起きたのかを明らかにしていきたいと思います.

2011年6月8日水曜日

ポモドーロテクニック

研究生活を続けていると,集中して論文を書いたりする作業が必要になったりします.
でも,つい他のことが気になって論文書きながら別の事をやってしまったりとかありますよね.
そんなときに集中力を維持するのに有効なテクニックとして,ポモドーロテクニックがあります.

これは,25分間は集中して一つの作業をして,その後5分間休憩し,
また25分作業する,というのを続けるテクニックです.
作業中の25間はメールが来てもFacebookに書き込みがあっても,全部無視して作業に集中します.
Twitterへの書き込みだって控えます.
電話は出ないとダメかもしれないけど.
雑用は5分ですませて,ついでに少し休みます.
それを4~5回繰り返すと作業効率がぐっとアップするというわけです.

本当かよ~とか思いつつタイマーを用意してやってみたのですが,
これが意外といい.
確かに,集中出来るので思ったより作業が進む.
特に,レポートの採点とか論文の査読とかあんまり楽しくない作業にはぴったり.

というわけで,単にタイマーを使うのではなく,
ちゃんと25分を計ってくれるアプリがいいなあと思って作成しました.
ポモドーロタイマー.
作業回数と内容を入力してスタートするだけで25分間+5分の休憩を淡々と記録していってくれます.

しかも,Twitterと連携して作業開始時にTwitter上に宣言をしてくれます.
今作業中だよ,と.
つまり,作業をサボってTwitterで遊んでいると他の人にばれてしまうわけですね.

というわけで,集中力のないそこのあなた.
是非使ってみてください.

外部関連記事:
ポモドーロテクニックについて

2011年4月7日木曜日

東日本大震災時のTwitterデータを用いた共同研究者募集

東日本大震災が発生してから一ヶ月が経過しようとしています.

そんななか,
Twitter検索の@PENGUINANA_さんのご協力の下,
2011年3月5日から24日までのTwitterでつぶやかれた日本語のTweetのうち2億6688万9069Tweetを入手しました.

含まれているデータには,
・TweetID(1ツイート毎に割り当てられる唯一のID)
・ScreenName(ツイート当時の物)
・Contents(本文)
・Source(ツイート元)
・Time(ツイート時間)
・reply_to(Reply機能を使ったときのリプライ先TweetID)
・reply_to_sc(Replyを受けた人のScreenName)
があります.

2011/4/8追記
各Tweetに含まれるハッシュタグと,はてなキーワードを抽出したメタデータもあります.
また,@User関連のデータも作成予定です.
追記ここまで.

近いうちに公開したいと思いますが,
その前に共同で研究してくださる方を募集します.

ネタとしては,
・情報の信頼性分析
・情報伝播の分析
を考えていますが,これにこだわりません.

一緒に研究しようぜ!という方はメール(ご存じの方)か,Twitter(@toritorix)につぶやくか,このエントリーのコメントでご連絡ください.

あ,ちなみに本件に関して(今のところ)予算はありませんw

2011年3月7日月曜日

数の暴力

Googleがインフルエンザの流行を予測する
http://www.google.org/flutrends/intl/ja/about/how.html
大量のデータがあるというのはそれだけですごいことができるということ.
なんというか,Googleの中の人がうらやましい.
そして,なんとかこういうデータを手に入れることが出来ないものかと悶々としてしまいます.

そのほかの記事.
http://www.kk.org/thetechnium/archives/2008/06/the_google_way.php
http://www.wired.com/science/discoveries/magazine/16-07/pb_theory/

2011年3月5日土曜日

Yahoo!知恵袋カンニング事件で仙台の浪人生が逮捕された2つの理由

今回のYahoo!知恵袋を利用したカンニング事件については,いろんな人が色々な意見を述べている.
しかしながら,意外なほど
「逮捕はやりすぎだ」
という意見が意外と多いことに違和感を感じる.
個人的には今回の大学側の対応はこれ以外には無いものだったと思う.
なお,法律などについては詳しくないため,そういった観点からの意見はhttp://togetter.com/li/107865を参照していただきたい.
また,現在の入試の構造自体に問題があるかどうかや,,
カンニングを発見できなかったことが問題なのかどうかについては論じない.

カンニングが発覚した場合,大学がとる行動としては,
1,警察に逮捕を依頼
2,不合格にするなど内部的な処分
3,罰しない
の3種類が考えられる.
今回は1の行動を取って批判されているのであるから,2,3を取るべきだと思った方が多いのだろう.
しかしながら,今回は1以外の行動を取ることは考えられなかった.

まず,2についてであるが,
従来のカンニングであればこのように処理していたはずである.
そのため,
「今までカンニングした人は逮捕されていないのに,今回だけ逮捕するのはおかしい」
と批判されることになる.
しかしながら,今回の場合「2,不合格など内部的処分」を取ることはできない.
なぜならば,「誰がやったのか」を大学側が知る方法が無いからである.
カンニングは現行犯でのみ処分が可能となる.
そのため,すでに試験が終わってしまった段階ではYahoo!知恵袋に投稿した人が誰なのかは分からない.
それを知るためには,Yahoo!や携帯電話会社の協力を仰ぐしかないが,
一法人でしかない大学に情報提供をしてもらう権限は無い.
したがって,警察の力を借りなければ誰がカンニングしたのかが分からないのである.
以上のような理由で,カンニングした受験生に罰を与えるには「1,警察に逮捕を依頼」しかありえないのである.

次に,「3,罰しない」について考えてみる.
実際,大学試験の現場でどの程度のカンニングがされているのか分からないが,
カンニングをして見逃されている人は0ではない可能性はある.
しかしながら,大学側としては
「カンニングによって入学する不正な受験生」
がいるせいで,
「本来入学すべきだった正しき受験生」
が入学できなくなるのは,不公平である.
そのため,カンニングした受験生は不合格とするべきである.
したがって,カンニングした受験生が明らかに存在するのに,それを無視することはできない.

ポイントは「明らかに存在」し,かつ「特定も可能」であるという状況である.
通常のカンニングであれば,「俺がやった」と大声で言うことも無く,またその言葉が真実かどうか確かめるすべは無い.
一方,今回の場合は証拠があり,かつカンニングした人を見つけることが容易にできる状況であった.
このような状況にもかかわらず「不正に入学する受験生」を見逃して「本来入学すべきだった受験生」を
落とさなければならない理由があるだろうか?
今回の逮捕によって仙台の浪人生の人生が狂うのであれば,
不正を見逃すことで,本来入学すべきだった受験生の人生は大きく狂ってしまうだろう.
さらに,今回の事態を放置してしまえば
「カンニングはやったほうが得」
ということになってしまい,不正行為を助長する可能性すらある.
不正行為が増加すれば,その分まじめに受験している受験生の人生が狂う可能性が高くなる,
そのため,放置という方法は取ることはできない.

まとめると,ポイントは2つ.
・カンニングした受験生を罰するには逮捕以外の方法が(現状では)ない.
・放置することによって,人生を狂わせるほど損をする「不正をしていない受験生」が存在する.
このような理由により,大学側は今回の事件で仙台の浪人生を逮捕せざるを得なかったのではないだろうか.
逮捕がやりすぎなのか,罪状が正しいのかどうかは分からないが,
大学側がとるべき行動としては,他には無かったような気がする.

と,たまには真面目な長文を書いてみたりして.
まあ,一大学教員の戯言です.
来年から受験監督時にカンニング対策を強めなければいけないと思うと気が重い.
たった一人の不心得モノのために,多くの人が迷惑をこうむるなあ.

2011年3月4日金曜日

SQL4G

AppEngineにSQL3gを入れて,SQL文を使えるようにしてみる.
詳しいインストール方法はhttp://www.littlesoft.jp/sql4g/#installここをチェック.

そのまま使うとweb.xmlでWarningが出たりするけど無視して進める.
と,http://localhost:8888/sql4gadminにつなげば,SQL4GAdminが立ち上がって,色々操作ができるようになります.
とりあえず,TESTというデータベースを作成して,
create table test_tbl (id int auto_increment, text text);
を実行すると,テーブルができあがった.
insert into test_tbl (text) values ('hoge');
で,データを入れておく.

その後,適当なActionを作って,
package com.appspot.tori.sql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class SqlTestAction extends Action {

 /* (非 Javadoc)
  * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  */
 @Override
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  // JDBCドライバーをロード
  Class.forName("jp.littlesoft.sql4g.Driver");
  // コネクションオブジェクトを取得
  Connection con = DriverManager.getConnection("TEST", "user", "password");

  try{
   Statement st = con.createStatement();
   ResultSet rs = st.executeQuery("select * from test_tbl");
   while(rs.next()){
    System.out.println(rs.getInt("id"));
    System.out.println(rs.getString("text"));
   }
  }finally{
   con.close();
  }
  return super.execute(mapping, form, request, response);
 }

}
ってな感じで実行してみたら,
1
hoge
って出力された.
おお,すごいぞ.

2011年2月27日日曜日

AppEngineとBloggerをくっつける・その2

Blogに投稿したりデータを取得するためにはBlogIDが必要。

とりあえず、まずはBlogの一覧を表すEntryをあらわすメソッドを作成。
 /**
  * Blog一覧を取得
  * @return
  * @throws IOException
  * @throws ServiceException
  */
 public Map getBlogMap() throws IOException, ServiceException{
  final URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
  Feed resultFeed = service.getFeed(feedUrl, Feed.class);

  Map blogMap = new HashMap();
  // Print the results
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
   Entry entry = resultFeed.getEntries().get(i);
   blogMap.put(entry.getTitle().getPlainText(), entry);
  }
  return blogMap;
 }
これで、Blog名をキーとしてBlogのEntryを取得できる。
ここからBlogIDを取得するメソッドは以下のとおり。
protected String toBlogId(Entry entry){
 Matcher m = Pattern.compile("blog-(.\\d+)$").matcher(entry.getId());
 if(m.find()){
  return m.group(1);
 }
 return "";
}
で、このBlogIDを使うとBlogに記事を書いたり、記事を取得したりできる。
 /**
  * 記事の一覧を取得する
  * @param blog
  * @throws ServiceException
  * @throws IOException
  */
 public List getEntryList(Entry blog) throws ServiceException, IOException {
  List entryList = new ArrayList();
  URL feedUrl = new URL("http://www.blogger.com/feeds/"+toBlogId(blog)+"/posts/default");
  Feed resultFeed = service.getFeed(feedUrl, Feed.class);

  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
   Entry entry = resultFeed.getEntries().get(i);
   entryList.add(entry);
  }
  return entryList;
 }

 /**
  * 記事を投稿する
  * 
  * @param blog
  * @param title
  * @param content
  * @throws IOException
  * @throws ServiceException
  */
 public void createPost(Entry blog, String title, String content)
   throws IOException, ServiceException {
  Entry myEntry = new Entry();
  myEntry.setTitle(new PlainTextConstruct(title));
  myEntry.setContent(new PlainTextConstruct(content));

  URL postUrl = new URL("http://www.blogger.com/feeds/"+toBlogId(blog)+"/posts/default");
  service.insert(postUrl, myEntry);
 }