ずっと、Twitterのリプライってタイミングの合う、合わないで決まるところがあるよね、って思ってたところがあったので、実際に計ってみました。
自分のタイムライン上に流れるリプライの中で時間が計測できるもの(後述)を取得し、元の発言からどれ位の時間でリプライされているのかのデータを取得してみた結果です。
意外と時間がかかっているように思えますが、夜につぶやいたものが朝返ってくる(挨拶系とか)ものもあるため、平均値だとこれぐらいになってしまうのかもしれませんね。
集計対象のデータ
自分のタイムライン上に流れるリプライの時間データを取り込み集計しました。
なので、集計対象のデータには偏りがあるかもしれません。(エンジニア系の人多し)
その中で正確な時間を求めるために、TwitterのAPIから返されるin_reply_to_status_idがあるものをリプライ平均時間の集計対象としました。
総件数で、12,278件ありましたが、うちin_reply_to_status_idがついているものは2,360件でした。
これは、利用しているクライアントによったり、複数の人に対してリプライを返えしたり、RTをするとin_reply_to_status_idが消されるので、そういったデータを対象に含めたら、この平均時間というものは大きく変わってくるかもしれません。
つまりは、1対1のつぶやきのみが対象となっています。
時間帯別のつぶやき、リプライ/RT率など
平均時間だと大きく乖離した時間にデータに影響を受けやすいので、グラフで並べてみました。
先ほども書いたように、このデータにはRTされたデータは含まれていません。
やはり、5分以内のreplyが相当多いようです。
30分以内で9割がreplyされるので、逆に言えば30分経過したらreplyもらえる率は格段に悪くなるのかなと思います。
まぁ、「おやすみ」から「おやあり」までの間とかはあると思いますけどね。
次に、時間帯別リプライ、RT数。
0時から23時(X軸)までのどの時間帯にリプライ、RTがされているのかをグラフにしたものです。
これは、RTされたデータも含めています。
もう少し、時間帯別に差が出るかなと思いましたが9時から0時までではそれほど突出するような時間帯はないようですね。
21時以降にやり取りが増えるのはTwitter夜の部ってことでしょうか(笑
半分以上がRTを使うという結果に。
タイムライン眺めてても経験値としてそう感じますけど。
取得したPHPスクリプト
元ネタは「Twitterのタイムラインを取得するPHPスクリプト 」でかいたPHPスクリプトです。
実際には、後で集計しやすいように取得したデータをDBに格納しています。
また、3分おきにデータを取得するようにCronに登録して動かしました。
別の角度から集計してデータを眺めてみたら面白い発見があるかもしれません。
<?php require_once "HTTP/Client.php"; $username = "xxxxx"; $password = "xxxxx"; $page = "statuses/friends_timeline.xml" . $status; $basic = array('Authorization'=>'Basic '.base64_encode($username.':'.$password)); $client = new HTTP_Client(null, $basic); $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml1 = new SimpleXMLElement($body); // 取得したデータを解析 // tid : 発言元のステータスID // ttime: 発言元のPOSTした時間 // fid : replyのステータスID // ftime: replyした時間 for ($i = 0; $i < count($xml1->status); $i++) { $matches = array(); // つぶやき内のユーザー名の数を取り出し $match_cnt = preg_match_all("/@[a-zA-Z0-9_:]*/", $xml1->status[$i]->text, $matches); // RTされた場合 if ((preg_match("/RT[:]* /", $xml1->status[$i]->text) && ($match_cnt > 0))) { $fid = $xml1->status[$i]->id; $ftime = "'" . date('Y/m/d H:i:s', strtotime($xml1->status[$i]->created_at)) . "'" ; if ($xml1->status[$i]->in_reply_to_status_id != "") { $page = "statuses/show/" . $xml1->status[$i]->in_reply_to_status_id . ".xml"; $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml2 = new SimpleXMLElement($body); $tid = $xml2->id; $ttime = "'" . date('Y/m/d H:i:s', strtotime($xml2->created_at)) . "'"; } else { $tid = "null"; $ttime = "null"; } } else { // 通常のreply if ($match_cnt === 1) { // あて先がはっきりしているreply if ($xml1->status[$i]->in_reply_to_status_id != "") { $page = "statuses/show/" . $xml1->status[$i]->in_reply_to_status_id . ".xm l"; $client->get("http://twitter.com/".$page ); $response = $client->currentResponse(); $body = mb_convert_encoding($response['body'], "EUC-JP","auto"); $xml2 = new SimpleXMLElement($body); $tid = $xml2->id; $ttime = "'" . date('Y/m/d H:i:s', strtotime($xml2->created_at)) . "'"; $fid = $xml1->status[$i]->id; $ftime = "'" . date('Y/m/d H:i:s', strtotime($xml1->status[$i]->created_at )) . "'"; } else { // 1人宛だがin_reply_toオプションが無いクライアントでreplyを返した場合 $insert_flg = TRUE; $tid = "null"; $ttime = "null"; $fid = $xml1->status[$i]->id; $ftime = "'" . date('Y/m/d H:i:s', strtotime($xml1->status[$i]->created_at )) . "'"; } } elseif ($match_cnt > 1) { // 複数宛のreplyの場合 $tid = "null"; $ttime = "null"; $fid = $xml1->status[$i]->id; $ftime = "'" . date('Y/m/d H:i:s', strtotime($xml1->status[$i]->created_at)) . "'"; } } } ?>