自己紹介と近況報告

久しぶりの投稿です。最近新しい知り合いも増えてきたので、自己紹介がてら簡単な来歴と近況を報告します。

まず来歴ですが、1984年に大阪で生まれて、大阪大学人間科学部に入り、社会学を専攻し、そのまま博士課程まで進んだものの、研究者になる気がなくなり、就活する気も起きなかったので起業しました

あとは、研究上で知ったR言語という統計解析用プログラミング言語にはまり、執筆・講師やコミュニティ活動等熱心にやっていましたが、起業してから使わなくなってしまっているので遠ざかり気味です。とはいえ統計解析や機械学習はいずれ仕事にも取り入れていくつもりです。

会社について

2013年8月に起業しました。ただ2013年度はまだ大学院に所属していたので、本格始動は今年4月からです。
社員がやりたいことだけをやるための会社です。社員はまだ私含め2人ですが。こんな会社にもかかわらず、いろいろ幸運が重なって、いまのところ意外にもそこそこうまく回っています。
どんな仕事をしてるのかと聞かれたときには、面倒なのでIT系って答えることが多いですが、半分本当で半分嘘です。私はソフトウェア・エンジニアとして仕事をしているんですが、もう一人の社員はメカトロニクス・エンジニアです。つまり、ハードウェアベンチャーでもあるんですが、私単独でスマホウェブサービスの案件を受けることもあるので、一概にハードウェアベンチャーともいいきれず。まあ、方向性としては、ソフト屋とハード屋のタッグで面白いものを作っていきたいと思っています。
ちなみに受託開発か自社開発か、ということですが、あまりこだわりはないです。自社開発をメインに据えようとは思っていますが、受託で面白い案件が来ればホイホイついていってしまう感じです。ただ、受託開発の営業なんてまったくやってませんが。あ、よく考えたら自社製品の営業もやってなかったです…。

たまには宣伝しておきましょう。「起業しました」記事に書いたCAPIシステムはほぼ完成し、すでに実戦投入を開始しています。現在、ある調査でパイロット・テスト的に使用されており、結果は良好です。しかし本番はSSPです。

SSPプロジェクト|総格差社会日本を読み解く調査科学

予算約1.3億円の巨大プロジェクトなんですが、知名度も実績もない弊社がなぜか中核となっています。恐ろしい賭けに出たものです。ともあれ、日本におけるCAPIは諸外国に比べ10年は遅れてるんじゃないかと思いますが、この調査が成功すれば、一気に5〜10年は先を行くことになると思います。

ちなみに初期段階では1つのAndroidアプリでしたが、いまでは3つのAndroidアプリと1つのウェブサービスへと規模を拡大しています。調査の回答フェーズだけでなく、訪問フェーズのオペレーションもアプリに落とし込んだことにより、調査員はタブレットだけを持って調査に出向けるようになっています。詳しくは、SSPが終わったころに(たぶん)出るプレスリリースで。

もうひとつ、ハードウェアのほうも宣伝しておきましょう。こちらは自社製品ではなく、受託で開発したものです。音がうるさいので注意してください。


壁面検査ロボット デモ動画 - YouTube

名前のとおり、壁に吸い付いて壁面を検査するロボットです。天井も歩けます。一応、弊社は対外的には(説明が面倒なので)ロボットベンチャーと名乗ろう、ということになっています。なのでもっとロボットを作っていきたいところですが、お金がないのでとりあえず細々したものから作っていこうか、という状況です。なので、ロボット開発の依頼とかあればうれしいですね。まあ、受けるかどうかはものによりますが。

そんなことをやっているので、今私のデスクの上はこんなことになっています。

f:id:phosphor_m:20141208144721j:plain

だから、何をやってる会社なのか聞かれると非常に困ります。確実なのは、やりたいことしかやらない会社であり、たいてい何でも作れる会社だということです。事業計画も何もありません。会社の規模拡大も金儲けも目的ではなく、社員がいかにしてやりたいことだけをやり、かつ生活を成り立たせることができるか、というのが会社の最大のテーマです。

プライベートについて

今年6月に豊中市から大阪市阿倍野区に引っ越しました。2011年に結婚して先月娘が産まれました。妻も働いているので(今は育休中ですが)、社長、主夫、父親の三役兼務になりました。
産まれてしばらくは地獄だといろんな人におどされましたが、いまのところ、睡眠が細切れになる以外は特に苦労はないですね。確かに日々アクシデントがあって、母1人でやってるとノイローゼになると思いますが、2人でやってると笑い話にしかならないです。幸い私は自宅勤務なので、仕事・家事・育児全てバランスよくこなせています。まあそれも見越しての起業なので、実際は幸いでもなんでもなく想定内のことですが。
想定外のことといえば、引っ越しに合わせて家電がバージョンアップしたので、妻の家事分担がほぼ消滅したことぐらいです。妻の分担は、掃除→ルンバ、食器洗い→食洗機、洗濯→洗濯乾燥機。私の分担は、料理、買い出し、風呂・トイレ掃除。自動化できない…。というわけで出産直後にもかかわらず、妻は授乳以外暇そうでうらやましいです。育児に関しては、オムツ替えは8割方私で沐浴は日替わり。最初から完全母乳でOKだったのでその点は助かりました。

著書

社会学が専門だったはずですが、Rと統計ばっかりですね…。二冊目のは社会学ですが、書いたのはかなり方法論よりの章なので、院時代の社会学者としての成果はほぼ皆無です…。現在、会社経営と家事育児に資源を集中するため、執筆はお断りしています。

あと、著書ではないですが、代表作は何かと言われれば、このスライドかもしれません。

第三回Japan.Rの入門講習会講師をしたときの資料です。私のアウトプットの中で最もひと目に触れたものだと思います。公開当初は10000views超えぐらいで舞い上がってたんですが、いつのまにか6万超えてますね。ありがたいことです。スライドは他にも上げてますが、入門資料を除けば、マニアックなのとネタばっかり…。

まとめ

以上、最近はこんな感じです。しかし高校・大学・大学院と一貫して文系だったはずなのに、まったく文系臭がしない…。いまでも文系能力のほうが高いと思いますが、それとやりたいことは別ですし、やろうと思えばなんでもできるということですね。
この一年弱、妊娠・出産とCAPIの開発にリソースを取られてあまり対外的な活動をしてきませんでしたが、どちらも落ち着いてきたので、来年は徐々に投稿とか増やしていこうと思います。よろしくお願いします。

#freee を使うべきでないたった1つの理由

2014/12/09 追記:結局ずっとfreeeを使い続けていますが、サポートに関しては改善されていると思います。記事は残しておきますが、このようなことはもう起こらないだろう、という信頼感を感じています。対してマネーフォワードですが、「対応の見込みが分かり次第連絡する」との返信があってから、結局なんの連絡もなく、無料試用期間を過ぎたので退会しました。MFも今はどうなのか分かりませんが、私の中での評価は逆転しています。

1.サポートが最低

これに尽きます。

freeeがどういうサービスなのかは検索すればいくらでも記事が出てきます。1つだけリンクをはっておきます。

簿記を知らなくても使える会計ソフト「freee」、グーグル卒業生が開発 -INTERNET Watch


前提条件として、私はfreeeの法人プランを10月から利用していて、すでに1年分の料金を一括で支払い済みです。ごねても返金はしてもらえないでしょうから、ここで憂さ晴らしをしよう、という動機の記事です。

続きを読む

質問紙調査(アンケート)の難しさ(スケールアウト編)

これまでアンケートに答えたことのない方は皆無と言い切ってもいいと思います。そこまで広く世に浸透しているアンケートですが、一方で「ちゃんとした」アンケートのやり方を知っている人はごくまれなのではないでしょうか。学術的にもアンケートが用いられることは多いのですが、研究者でさえ、アンケートを採るのに専門的な知識はいらないと思っている人がかなりいるように感じます。

しかし、実際に有用な結果を出せるアンケートを採ろうと思うと、高度な知識と熟練の技能が必要です。世の中の大多数のアンケートは、一度集計結果をみて「ふーん」と思ったあと、まったく活用されず放置されているんじゃないでしょうか。そういう経験を積むと「アンケートなんてやっても大して意味ないよね」という誤った結論に陥りがちなのですが、実際にはアンケートという専門的で高度なツールを使いこなせていないだけなのです。

アンケートは、専門的には質問紙調査と呼びます。今回は、質問紙調査を行ううえで陥りやすい問題の一つであるスケールアウト*1について書きます。ちなみに続編があるのかどうかは気分次第です。

*1:サーバーの負荷分散とは全く無関係です

続きを読む

ggplot2でなんでもプロット(table編) #RAdventJP

R Advent Calendar 2013の2日目です。

今回のネタは、本当は去年どっかでやろうと思ってたものだったんですが、機を逃して温めすぎて発酵しかけてたものです(このネタの存在自体忘れてた)。とりあえず、日本語での情報は少なくともまだウェブには無いようなので安心。ちなみにtable編と書いていますが、続編の予定はありません。もちろん、興味を持っていただいた方は好きに引き継いでもらってかまいません。

fortifyとは?

さて、ggplot2を利用されている方は多いと思いますが、高機能な分みなさん使いこなすのに苦労されているようです。実際一朝一夕で使えるようにはならないものではあるんですが、実際には便利な機能があるのにそれを知らないために苦労してただけ、ということもあったりします。今回紹介するのは、そんな便利機能の中でも特に知名度が低いと思われるfortify()という機能(関数)です。

続きを読む

CodeIQで「『データサイエンティスト養成読本』著者陣さんの問題」やってみたけど…

【追記あり】

養成読本くれるというので乞食根性丸出しでやってみたんですけど、全問正解ならず…。というか、いまいち納得がいかないのでちょっとレビューします。

問1. Rに標準装備されているあやめ(Iris)のデータを用いて、
あやめのがく片の長さ(Sepal.Length)とがく片の幅(Sepal.Width)の相関分析を行いました。

【Rの実行結果】

上記の【Rの実行結果】を参考にし、次の中から正しいものを一つ選んでください。

a) LengthとWidthの間の相関係数r=-0.11757となっているため、Lengthが大きいほど、Widthが小さくなるといえる
b) 相関係数rの検定結果でp値が0.1519と有意水準0.05(5%)より大きくなっているため、2変数間に有意な相関があるとはいえない
c) aとbで統計量を精査しているため、データをプロットして散布図を作成することに意味はない

正解はbらしいのですが、私はaと答えました。なんでaじゃないのかちょっとよくわかりません。なんか根本的に勘違いしているんでしょうか…。レビューは以下でした。

aは、相関係数の理解が誤っています。
相関係数は-1から1の値をとり、その符号で相関関係の方向性を表し、絶対値の大きさで相関関係の強さを示します。
一般的には次のように言われることが多いです。
|r|=0.7~1:強い相関あり
|r|=0.4~0.7:やや相関あり
|r|=0~0.2:ほとんど相関なし

どう理解が誤っているのかはまったく書かれていないのでよくわかりません…。ひょっとして、因果と相関を混同するなということが言いたいのでしょうか。あるいは「有意かどうか検定していないから」と言いたいのでしょうか。前者については、因果関係を明示した表現ではないと思いますし、相関関係の一般的な表現なのではと思います。後者については、相関係数は別に推測統計学の専売特許ではありません。記述統計としてそのように表現することが間違いだとは思いません。ここまで書いて、根本的な勘違いだったら恥ずかしいのですが…。

bが正解となっていますが、微妙なラインですが私は誤りだと思います。「有意水準0.05(5%)より大きくなっているため」というのは有意水準を所与のものとしている書き方だと思います。「有意水準を5%に定めた場合は」とすべきでしょう。

問2. 次の中から正しいものを選んでください。

a) 重回帰分析を用いる際、どの説明変数がどのくらいの効果量であったかを直接比較するためにはあらかじめ説明変数を正規化してから分析する
b) 重回帰分析とは異なり、ランダムフォレストでは説明変数の重要度はわからない
c) 決定木やランダムフォレストなどのTreeモデルは母集団に分布形状を仮定しないノンパラメトリックな手法である

正解はaとcだそうです。どっちでもいい(あるは両方答えないとだめ?)みたいですが択一だと思って悩んでしまいました。ただ、aについては、「あらかじめ説明変数を正規化してから」というところに引っかかりを覚えたのでcにしました。標準化偏回帰係数はあらかじめ正規化しなくとも事後的に計算できます。「しなければならない」とは書いていないので間違いではないのですが。

問3. 売上へのGRPの影響を分析するため、回帰分析を実行しました。

【実行結果】
f:id:phosphor_m:20130919164935p:plain

上記の【実行結果】から分かることについて正しいものを選んでください。

a) このモデルは、p-valueが非常に小さいため実用的には使えないモデルである
b) Coefficientsから、grpが1%増えると売上はおおよそ0.21%増加する事が分かる
c) Coefficientsから、このモデル式は、売上 = 0.21393 × GRP + 11.54696 と分かる

bが正解とのことですが…。切片の存在を忘れていませんか?切片を計算に入れると、grpが1%増えたときの売り上げの伸び率は元のgrpに依存するので答えは出ません。この問は解なしだと思います。私は、きっとlogを書き忘れたんだろうと思って、cを選びました…。

【追記】問3については普通に私が間違えていました。


出題者のyokkunsさんに解説していただきました。対数線形モデルになっていたんですね。従属変数のlogを見落としていました。恥ずかしい…。

以上、全問正解はならずでしたが、別ルートからの献本は大歓迎でお待ちしております!

R5クラスの継承の罠

あ...ありのまま 今 起こった事を(ry

R5クラスでサブクラスを定義すると、スーパークラスインスタンスされます。

な… 何を言っているのか(ry

本当に意味が分からないです。

setRefClass("Parent",
            methods=list(
              initialize = function()print("run")))
setRefClass("Child", contains = "Parent")

Parentクラスはインスタンス化されるさいに"run"と表示するだけのクラスです。ChildクラスはParentクラスを継承しているだけのクラスです。

> setRefClass("Parent",
+             methods=list(
+               initialize = function()print("run"))
+ )
> setRefClass("Child", contains = "Parent")
[1] "run"
[1] "run"

実行するとこうなります。Childクラスのクラス定義を行っただけで、なぜかParentクラスが二回インスタンス化されました。

この挙動は、以下のようなクラス定義の場合に問題を引き起こします。

setRefClass("Parent",
            fields = c("x", "y"),
            methods = list(
              initialize = function(...) {
                initFields(...)
                y <<- x * 2
              })
)
setRefClass("Child", contains = "Parent")

Parentクラスはインスタンス化されるさいにy <<- x * 2を実行します。なので、new("Parent", x=1)のように、インスタンス化のさいに引数でxの値を与えておかなければ、エラーになります。ChildクラスはあいかわらずParentクラスを継承しているだけのクラスです。

> setRefClass("Parent",
+             fields = c("x", "y"),
+             methods = list(
+               initialize = function(...) {
+                 initFields(...)
+                 y <<- x * 2
+               })
+ )
> setRefClass("Child", contains = "Parent")
 以下にエラー x * 2 :  二項演算子の引数が数値ではありません 

Childクラスはクラス定義すら行えません。

対応策としては、引数に初期値を与えておく、引数が与えられていない場合は即return()するかなんらかの例外処理を行う、などがあると思います。つまり、引数が与えられていなくても問題が起きないようにする、ということです。

個人的に一番問題だと思うのは、パッケージでR5クラスを使う場合です。パッケージをバイナリにビルドするときやlibrary()で読み込むときには、パッケージ内のスクリプトがいちど全部実行されるのですが、このときスクリプトのファイルが読み込まれる順番は辞書順です*1。サブクラスの前にスーパークラスが定義されていなければならないというのは、まあスクリプト言語では普通だと思います。しかし、R5クラスの場合、スーパークラスのinitializeメソッド内で使われている関数やクラスが、サブクラスの定義よりも前に定義されている必要がある、という複雑な問題が起きてしまいます。上記の対応策を取っておけば回避はできますが、知らなければ謎のバグに苦しむことになります(なりました)。

この副作用、どこかの文書に載ってるんでしょうか…?

> sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932   
[3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C                  
[5] LC_TIME=Japanese_Japan.932    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

loaded via a namespace (and not attached):
[1] codetools_0.2-8 tools_3.0.0

*1:いろんなパッケージのソースを見てみると、a.Rとかzzz.Rという謎の名前のファイルがありますが、これはつまり最初に読み込んでほしいファイルと最後に読み込んでほしいファイルです。