ハイパー久々の更新。
仕事では(というかプライベートでも)一切プログラミングをしないんですが、なんかやるぞ!と急にテンションが上がって、
ずっと興味があったデータ分析コンペのサイト?Kaggleをやろうとなりました。
とりあえず、問題形式の確認から、回答の提出まで。
Atcoderみたいなプログラミングコンテストのサイトとかでも、一番時間がかかるのは「回答するまでの流れをきちんと理解する」ことだったので、まずはそこから確認しました。
案の定、一発では上手くいかず・・・
学生時代に少しだけ使っていたR言語の使い方も思い出しながら、ゆっくりやっていきました。
ちなみにR言語の参考に使ったサイトはコチラの"R-Source"というサイト。学生時代にも見た記憶があります。
基礎的なことがメインで載っているサイトです。
今回提出までやったのはこの問題。
Titanic号の客の生死を推測する問題(例題?)です。
Kaggleは英語で書いてあります。英語で書かないでよ・・・
DashboardのDataのところから、"train.csv"と"test.csv"をダウンロード。
中身を見てみて、どんなデータかを確認。
"test.csv"の形式は、"train.csv"の形式から『Survived』の列を除いたもののようです。
また、提出の形式はここに書いてあるように、
とりあえず"gendermodel.csv"をダウンロードして、まねるようにします。
提出までやるぞ!ってことなので、一番シンプルな回答を出すことに。
生死は1と0で表されるのですが、『すべて0』という回答を提出してみます。
他の言語で書いてもいいんですが、慣れるためにもRで書いてみました。
Make a submissionのページに「CSVファイルで出してね」と書いてあるので、もちろんそれに従います。
out <- file("./allzero.csv", "w") # 書き込みモードで開く writeLines("PassengerId,Survived", out) # この行が必要っぽい for (i in 892:1309) { writeLines(paste(i), out, sep = ",") writeLines(paste(0), out, sep = "\n") } close(out) # ファイルを閉じる
このプログラムを、Rで起動させます。
$ R
R version 2.15.3 (2013-03-01) -- "Security Blanket"
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
Rは、自由なソフトウェアであり、「完全に無保証」です。
・・・(などと色々書いてある)・・・
'q()'と入力すればRを終了します。
> source("ans.r")
>そして、これで出来た『allzero.csv』はこんな感じです。
PassengerId,Survived 892,0 893,0 894,0 ・・・(省略)・・・ 1308,0 1309,0
これを提出すると・・・
無事受理されました!(ここまでで何回かつまずいています)
しかしAtcoderとかと異なり、受理されるのは当たり前、その後出る順位が大切・・・。
これの結果は
スコア:0.62679
順位 : 3704位/3754(全体)
でした。
そりゃあそうですよね。こんな雑な推定ないよ。
Rに慣れる意味も込めて色々触り、少しだけ改良して出すことにしました。
いきなりRに入っている色々な統計関数を使っても、あんまり勉強にならない気がしたので。
まず、Rの対話モードで、『train.csv』を色々いじってみます。
*まず、train.csvをyという変数に入れる。そのあと色々する。
> y <- read.table("train.csv", header=T, sep=",")
*mode() は、型を調べる関数です。きっと。
> print(mode(y))
[1] "list"
> print(mode(y[1]))
[1] "list"
> print(y[4])
Name
1 Braund, Mr. Owen Harris
2 Cumings, Mrs. John Bradley (Florence Briggs Thayer)
3 Heikkinen, Miss. Laina
・・・(以下省略)
*Rでリストの要素にアクセスするときは1から始まるんですね。
> print(y[5])
Sex
1 male
2 female
3 female
・・・(以下省略)
*列の名前を使ってアクセス
> print(y["Sex"])
Sex
1 male
2 female
3 female
・・・(以下省略)
*列で条件をつけて、満たすもののみ表示
> y[y$Sex=="female", ]
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
2,1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
3,1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
4,1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
・・・(以下省略)
*列で条件をつけて、満たすものの、欲しい列だけ表示。リストで返ってくる。
> y[y$Sex=="female", "Survived"]
[1] 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1
[38] 1 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1
・・・(省略)・・・
[260] 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 1 0
[297] 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0
*男女で、生死の割合がどんな感じか調べる。リストに使える関数、lengthとsumを使う。
> fsurvived <- y[y$Sex=="female", "Survived"]
> length(fsurvived)
[1] 314
> sum(fsurvived)
[1] 233
> msurvived <- y[y$Sex=="male", "Survived"]
> length(msurvived)
[1] 577
> sum(msurvived)
[1] 109
*これを見るに、女性は半分以上が1、男性は半分以上が0であるっぽい。
*あとは、要素へのアクセスの仕方を色々触ってみる
> y[1]
PassengerId
1 1
2 2
3 3
4 4
・・・(以下省略)
> y[1,]
PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked
1,0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
> y[1,"Survived"]
[1] 0
> length(y[1])
[1] 1
*データの列数
> ncol(y)
[1] 12
*データの行数
> nrow(y)
[1] 891これらから、『男性は0、女性は1』という回答を作成してみる。
あと、1つ目のプログラムでは、
for (i in 892:1309)
など、ダサい点が残っていたので、その辺も少し直す。
そして書いたのが以下。
traindata <- read.table("train.csv", header=T, sep=",") testdata <- read.table("test.csv", header=T, sep=",") out <- file("./sexans.csv", "w") # 書き込みモードで開く writeLines("PassengerId,Survived", out) # ヘッダーを記入 for (i in 1:nrow(testdata)) { writeLines(paste(testdata[i, "PassengerId"]), out, sep = ",") if(testdata[i, "Sex"] == "male"){ writeLines(paste(0), out, sep = "\n") }else{ writeLines(paste(1), out, sep = "\n") } } close(out) # ファイルを閉じる
これを提出。無事に受理された。
気になる順位は・・・
スコア:0.76555 (0.13876アップ!)
3109位/3754(全体) ( 約600位アップ!)
おお、少し上がっている・・・
ちなみに、

こんな感じで、『こういう手法ならこのスコアだよ』みたいなのが、順位のところの合間にあります。
実際、僕のスコアは、『Gender Based Model』(男=0、女=1の回答)のスコアと完全に一致しています。
これらのスコアは、勉強する上でのモチベーションになりそうですね。
というわけで、本当に触りの部分、『サイトへのアクセスから提出まで』をやってみました。
先は遠いですが、一個の問題にじっくり取り組んでいくのもまた面白そうですね。続けるかどうかは別ですが・・・
仕事後の体力(というよるやる気)次第ですね。
また、これからやる上で、R言語でやっていくのかどうかも迷うところです。
Amazonで本を見てみると、だいたい3つの流儀がありそうです。
今回の問題のホームにも『Predict survival on the Titanic using Excel, Python, R & Random Forests』と書いてあったので、
やっぱこの3つが主流と見てよさそうですね。
*今回の『R言語』(Rの使い方以外に、Rを使いながら統計を理解するが趣旨の本も多い)
*Python(計算ライブラリが豊富で、統計にも強いらしい。
よって、ライブラリも上手く使いこなすぜ的な本が多いっぽい)
*Excel(表紙がキャッチーなのが多い。緑色が多い)
この3つのどれかでやっていくとして、どれにするか・・・
せっかく多少なりともプログラミングに馴染みがあるので、RかPythonかな・・・?
でも、個人的にMicroSoftがなんとなく好きなんですよね。
Xboxを出しているという点で。Xbox持ってないけど。
あと、会社(非IT)ではExcelをよく使うので、単純にExcelに慣れるという意味では、これもExcelでやるのがいいのか・・・?
でも、Excelのデータ分析でハイレベルな本は少なそう・・・?
まぁどれでやっても、『データ分析の勉強』にはなると思うので、あれこれ手を出しながらやるかもしれません。
ひとまず、RかPythonでしょうか。
とにかく、これからも、やる気が続きますように・・・