タイトルって難しい。

学力も体力もない人間の雑記帳。

大学卒業しました

去る3月19日、大学を卒業しました。
とっても充実した4年間でした。

私の所属する大学は、噂では4年ストレート卒業が厳しいとかなんとか言われていたのですが、運が良かったのか、はたまた周りが優秀だったのか、ほぼスムーズにいけました。感謝ですね。

春からは、院生として生活します。頑張りたいですね。

P.S.
Facebookと違って、書いて問題がない内容が少ないので短め…

日経電子版×クックパッド データハッカソン for studentsに参加しました

表題の通り、日経電子版×クックパッド データハッカソン for studentsに参加しました。

一言で言えば、日経電子版さんとクックパッドさんの膨大なデータを用いてなにかを作るというものです。

詳しくは以下のページを参照してください。

参加したきっかけとか動機とか

某社の@tetsuroitoさんの宣伝ツイートよりこのハッカソンを知りました。

機械学習については、まだ駆け出しというかひよこ未満である私なので、抽選とかその手のやつで外れるんじゃないかと思ってましたが、「参加できたら膨大なデータを好きに使えるやん!超!エキサイティン!!」とか思いながら応募しました。

チームについて

元々ホームページとか見ていたら単独参加でもOKっぽそうだったので、一人ぼっちでやる気だったのですが、運良くチームを組むことができました*1
私がいたチームは全チームでも一番メンバーが多く(4人!)、作業場所も何故か奥の方の窓際でしかも、4人中2人が立ちながらコーディングするという不思議なチームでした。
イカれたメンバーを紹介するぜぇ!みたいな感じで軽くチームの構成を。

  • 経済系の分析をなさるM1の方
  • RubyかつVimmerな同じ大学の他キャンパスの同級生の方
  • SwiftとかいじってるB2の方*2
  • RとSASでしか分析したことがない多変量解析マン(私です*3

とまあこんな感じで、本当にバックグラウンドがバラバラでカオスなチームでした。

したこと

大雑把に言いますと、日経電子版の記事データと、クックパッドの検索履歴のデータの相関性や影響について分析しました。
この相関性や影響というテーマを貫きつつ、まずはデータをいじってみたり、分析かけてみたり・・・という感じです。
4人いたので、2組に分かれて片方が日経、もう片方がクックパッドという感じで行いました。ちなみに、私はクックパッド担当でした。
相関性を決定づけるアプローチというかそもそもどのような記事を選出するかについては、色々取り組んだのですが、結果として、これだ!と決定づけられたのが遅くなり、うまく完全には間に合わなかったのが後悔です。

で、お前なにしたの?

主に、クックパッドの検索履歴ログについて分析できるよう前処理しまくって、ちょこっと分析もかんだという感じです。
うちのMacbookのCPUファンがずっとフル回転だったのが、全てを物語っています。
また、データがでかすぎて、チームメイトの1人は使わないソフトをアンインストールしたりしていました*4

感想

まずこのようなイベントが珍しく、非常に面白かったです。
周りの発表をきいていると、自然言語処理を行う方が多く、またRよりもPythonでやってる方が圧倒的に多かったので知識・技術の両面から足りないということを感じました。

あと、結構フロントエンドの開発もしていたそうで、分析とか機械学習させた結果をWebサービスとして提供したチームが多く*5、出来というか完成度の高さに驚かされるばかりでした。

Rでは扱いづらいデータもあり、どのように解決するか試行錯誤したのが大変でしたね。また、以前どなたかが仰っていた、データ分析の9割は前処理であり、一番つらいのもそれだと言うのを痛感しました。

単純に結果を評価するのではなく、アプローチに対して評価していただいたのも良かったです。

最後に

当日サポートしてくださった日経電子版およびクックパッドの方々、参加された皆さん、チームメイト、分析できる気がしなくて前日になって憂鬱になってた私を諭してくださった@tetsuroitoさんと@dichikaさんに感謝です。

*1:というか、みんなチーム作ってたっぽい?

*2:B2とかの参加者が多くて、みんな意識高くてすごいなあと思ってました。私なんてその頃遊んでましたし・・・

*3:Python自体は普段からいじることは多いですが、機械学習とか分析の目的で使ったことは今までで一度もなかったのです

*4:誓約書でデータを削除することとありましたが、削除させてくださいお願いしますと言いたいぐらいSSDの残容量が・・・

*5:というか、私達だけが分析のみやって終わったという感じ?でした

Rのパッケージが消えた

結構前にRを更新したのですが、それっきり1度も起動してなかったので、まさかこんなことになっているとは思ってもいませんでした。
そう、パッケージが消えていたのです。
通常ですと、libraryのフォルダを移行したらいいのですが、何を思ったのか、その時に関連フォルダも一括して消してしまったみたいです(Macには、AppCleanerという素晴らしいアプリがあるもので)。
というわけで地道にインストールを実行しましたよと。
今回は初めて使うのですが、CRAN Task Viewsという有志がまとめてくださった各ジャンルのパッケージ一覧を経由して一括インストールしてみました。

#CRAN
install.packages(c("devtools","dplyr","h2o",
                   "e1071","piper","rvest",
                   "ggplot2", "ctv"))

#GitHub
devtools::install_github(c("dichika/yo",
                           "twitter/AnomalyDetection",
                           "dichika/yeah"))

#CRAN Task Views
ctv::install.views(c("MachineLearning", "SocialSciences",
                "Survival", "TimeSeries", "Multivariate",
                "MetaAnalysis"))

今後自分みたいに、地雷踏んだ人向けに…。Enjoy!

エスケープシーケンスによるちょっとおもしろい出力

コンソールでなにか文字を出力する際に、通常のやり方だとどんどん改行されていきます。
例えば、下記のPythonのコードを実行したとしましょう。

# -*- coding: utf-8 -*-
for i in range(1,101):
    print("{}".format(i))

出力結果はただひたすら、1 2 3 … 100と改行されながら出力されます。

1
2
…
99
100

改行しないという指定とかもありますが、できればストップウォッチみたいな感じでカウントアップしたい…と考えていたところ、意外にも簡単なやり方でできるそうです。
それは、エスケープシーケンスの"\r"を加えること。ね、簡単でしょう?
たとえば、さきほどのコードをこのように改良します。

# -*- coding: utf-8 -*-
import time
for i in range(1,101):
    print("\r{}".format(i),end = "")
    time.sleep(0.5)
print()

1〜100までうまくカウントアップされました。
このエスケープシーケンスですが、「キャリッジリターン」と呼ばれるもので、よくエディタにある"CR"のことだそうです。

このやり方を応用すると、なにかアルゴリズムを出力した際にずらずら〜っとならずに済むかもしれませんね(自己満足ですが)。

イベントの出欠を管理してなおかつ、出席者リストをはいてくれるVBA

みんながあまりにもVBAディスるので、かわいそうになってきました。
VBAは なかまに なりたそうに こちらをみている!」
てことで、ちょっと必要になったので書きました。

なにができるの?

イベントの出欠を入力した結果をまとめてくれるやつです。
Sheet1のA列に名前、B列に○ or ×を記入した状態で、名前を取得してSheet2にまとめてはきだしてくれるだけです。
はっきりいって、他の言語でもできると思います。ただ、VBAでやってみたかっただけ。
今回は例として、とあるサークルのパーティを題材として…。
実在するところかどうかは触れません。

Sub Shukeisan()
' イベント出欠集計VBA
' Author: cancolle(@wonder_zone)

j = 1

'テンプレ
'    i = 1 // 属性を取得
'    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1) // 属性
'    j = j + 1
'    For i = 2 To 10 // 各属性の行番号ごとに設定
'    If Worksheets("Sheet1").Cells(i, 2) = "○" Then // セルに○があったら
'        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1) // 記帳
'        j = j + 1 // 記帳用変数を1コマ進める
'    End If
'    Next

'B4
    i = 1
    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
    j = j + 1
    For i = 2 To 10
    If Worksheets("Sheet1").Cells(i, 2) = "○" Then
        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
        j = j + 1
    End If
    Next

'B3
    i = 11
    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
    j = j + 1
    For i = 12 To 22
    If Worksheets("Sheet1").Cells(i, 2) = "○" Then
        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
        j = j + 1
    End If
    Next

'B2
    i = 23
    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
    j = j + 1
    For i = 24 To 30
    If Worksheets("Sheet1").Cells(i, 2) = "○" Then
        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
        j = j + 1
    End If
    Next

'B1
    i = 31
    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
    j = j + 1
    For i = 32 To 40
    If Worksheets("Sheet1").Cells(i, 2) = "○" Then
        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
        j = j + 1
    End If
    Next
End Sub

本当は、普通にプログラミングするときと同じく、関数とかで定義したり(できるのかな?)した方がいいとは思うのですが、なんかこの程度ならいいやって思ったので、つらつらと書き連ねました。
Enjoy VBA Life!

追記(Mon Jan 26 2015 20:08:32 GMT+0900(JST) )

Sub Shukeisan_Kai()
' イベント出欠集計VBA
' Author: cancolle(@wonder_zone)

Worksheets("Sheet1").Cells(8, 10) = 1

'B4
Call Shukei(2, 10)

'B3
Call Shukei(12, 22)

'B2
Call Shukei(24, 30)

'B1
Call Shukei(32, 40)

Worksheets("Sheet1").Cells(8, 10) = ""

End Sub

Private Sub Shukei(St As Integer, Fin As Integer)
    i = St - 1
    j = Worksheets("Sheet1").Cells(8, 10)
    Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
    j = j + 1
    For i = St To Fin
    If Worksheets("Sheet1").Cells(i, 2) = "○" Then
        Worksheets("Sheet2").Cells(j, 1) = Worksheets("Sheet1").Cells(i, 1)
        j = j + 1
    End If
    Next
    Worksheets("Sheet1").Cells(8, 10) = j
End Sub

これで、もっとすっきりします。

kindle for PCとTシャツと私

以前、こんな記事を書きました。

まさかこの記事から約2週間後に、デスクトップ用のアプリが登場するとは…。
Kindle for PC日本語版が公開 ~Windowsタブレットでも数百万冊の読書が可能に - PC Watch
もうなにがなんだかヨクワカラナイヨ。

いや俺、スタバで動かすマカーですが(ドヤァアアアアアア 向けのお話

Mac向けのやつは、AppStoreにあることはあるのですが、まだ日本語版に対応していないのです。
でも、EasyWineとか各種Wineを使うとできちゃったりします。Windows用のを使うことになりますが…。
フォントが××とかいわない。

前回同様アレを調べる

ま、どこにDLした書籍が保存されてるかくらい気になりますよね。気になるんですよ。
で、あっさり見つかったわけですよ。

C:\Users\(ユーザー名)\Documents\My Kindle Content

この中にいっぱいある拡張子がazwのファイルだそうです。

これであなたも快適なKindleライフを!

追記

マカーも救済されました。
「Kindle for Mac」日本語版がリリース ~320万冊以上のKindleコンテンツをMacで - PC Watch

第45回R勉強会@東京(Tokyo.R)にてLTとしてお話してきました #TokyoR

平成27年(2015年)1月17日に開催された、第45回R勉強会@東京のLT枠でお話してきました。

TokyoRとは

TokyoRとは、@yokkunsさん主催のR言語に関する勉強会です。分析界隈では有名かつご長寿な勉強会であり、今回で45回目を迎えました。(どなたかの発言より拝借)

発表内容

タイトルは「分析で好みの娘をぶっこぬく」というものです。
行ったことは、私の主観でキャラクターの好き嫌いを分けた 教師データを予め作成した上で、SVMで学習させ、詳細をそこまで知らない作品のデータに適用しました。
性能評価は今後にまかせておくとして、SVM自体をまともに使ったのが今回はじめてということも有り、私にとっては新鮮味がありました。
実はこの題材について、当初は判別分析でやろうと考えていたのですが、マサカリが飛んでくることを恐れてSVMに変えたという経緯がありました。

後日談

@teramonagiさんがDeep Learningで実装してくださりました。本当に有難うございます。
私の環境(MacOS X10.10.1 Yosemite)で実行した結果、OKが9人、NGが5人という結果になりました。やはり異なるものなんですね。

他の方の発表

久々に導入セッションからいました。
渋谷駅でそばを食べていたせいで遅刻しかけて、渋谷から神泉までの1駅間で井の頭線を使ったことはここだけの話です。
導入セッション対象者である初心者の方は割と少なかったのかな?という気がしました。atndとかみていますと、初心者のかたも多そうな気がしたのですが…。
Rによる回帰分析とカーネル多変量解析では、線形回帰分析・非線形回帰分析について採り上げていました。カーネル多変量解析自体はあまり知らなかったのでなかなかいい勉強になりました。
また、Rのパッケージ配布形態が移り変わりつつあるという話もなかなか興味深かったです。たしかに、devtools経由で落とすことも最近は多かった気がします。
前処理の話は、なかなか辛さが感じられました。
多くの方がデータ分析における時間のほとんどが前処理と仰っていますが、その辛さは共有できないものであると思います。
そういえば、私自身も研究で分析を行ったのですが、分析そのものより事前準備が辛かったですね…。本シリーズの今後に期待です。
型情報でスピードアップという項目では、いかに高速に処理をさせるかという観点ですごく有意義でした。Rcppを使う場面で一度試してみたいと思います。

LTはなかなかカオスでした。真面目な話と面白い話で混ざり合っていましたね。

懇親会

まさかの同じ大学の方があんなにいるとは思ってもいませんでした…。
@u_riboさんとR以外の言語の話をしていたのですが、9割ぐらい某S批判をしてしまいました。
また、ある業界の今後について話してらっしゃる方々が中々面白かったです。

会場とか

会場を提供してくださったVOYAGEグループ様、本当にありがとうございました。とっても素敵な会場でした!