ランダムの森

20代エンジニアです。プログラミングについて主に書いてます。

ジーズシアトルのプログラミングキャンプ全編

とても久々の投稿です、実に半年以上ぶり。
2020年1月に1ヶ月間シアトルで開催されたプログラミングキャンプに参加してiOS(swift)の勉強をしてきました!
f:id:doreikaiho:20200226232139j:plain
(コンピュータミュージアム@シアトル)

キャンプを開校したのは東京をベースにしたジーズアカデミー(以下ジーズ)と呼ばれる起業家エンジニア養成スクールです。私が参加した1月コースがシアトルキャンプの第1期生ということで、今回キャンプに行くことになった経緯やシアトルでの経験をブログにして、2期生以降の参考になればいいなと思って書きました。

シアトルコース行きたいけど迷ってる、シアトル行きが決定したけど不安だ、という方に読んで頂けると嬉しいです。

ジーズアカデミーの存在を知ってることを前提に書いているので知らない方は以下アドレスご参照下さい。
ジーズアカデミー|東京・福岡|起業家・エンジニア養成学校(プログラミング)

今回は以下順番で書いていきます。
  

  1. どんなキャンプなの?
  2. コースに参加した経緯
  3. 1ヶ月で何が変わった?
  4. 参加予定者へ情報提供
  5. まとめ

どんなキャンプなの?

簡単に言ってしまうと、「プログラミングによるプロダクト制作」と「英語によるプロダクトピッチ」を海外で学べるコースです。

起業化エンジニアを支援するジーズアカデミーですが、やはりスタートアップの勢いは国内より海外の方があるのが現状です。
数々の起業家エンジニアを育ててきたジーズアカデミーは国内では沢山のスタートアップを生み出しており、私の知る限りそのようなコミュニティは他になかなかないんじゃないかなと思うくらい国内では最強集団となっていると思います。

ただ一方で、世界を変えるギークを育てたいジーズアカデミーにとって、ジーズコミュニティ内のスタートアップはまだまだ国内中心の印象があります。

そこで今回、シアトルで生活しながらプログラミングを学びプロダクト制作をすることで、海外起業のきっかけになったり、ジーズコミュニティの刺激になったりと、視点をグローバルに置いたコースが生み出されたというコンセプトです。(というように伺ってます。)

f:id:doreikaiho:20200226232207j:plain
(晴天のシアトル@シアトル)

コースに参加した経緯

私がコースに参加した理由は主に2つで、Amazon本社とAmazonGoを見てみたかった、スタートアップピッチをみてみたかったことです。(スタートアップピッチは私が早めに帰国したため見れず。。)

他にも、swiftの授業を受けたり、集まるメンバーとの繋がりや、海外で軽く生活してみることなどプラスになりそうな要素がいくつか考えられたので、行こうと決めました。

社会人がなぜ1ヶ月も行けたのかと言うと、転職を機に有給休暇を大量に消化できたからです。もっと言うと、転職しようとしていたタイミングでシアトルの話を聞いたのでここに有給休暇が取れるように入社日等を調整してもらいました。一緒に来てるメンバーでは同じように有給取ったり、個人事業主で休み調整してきたり、学校休んでくる学生さんという感じでした。
f:id:doreikaiho:20200226232114j:plain
(アマゾン本社@シアトル)

1ヶ月で何が変わった?

1番大きく変わったと思うのはモチベーションの向上です。(本来のコースの趣旨とはことなるかも?)

個人的にはAmazonを訪れたいと思ってシアトル来ていたので、実際にAWS本社の中を案内して頂いた時はおーーーという感じでした。窓にアルゴリズム書いてたり、Amazon社員の働き方を色々聞いて、"環境は最大限用意するから結果出してね"というバトルフィールドで戦ってる人達なんだなと思うと、自分もバトルフィールドに乗らないとなという気持ちしか湧いてきませんでした。

もともとモチベーションは高かったのですが、これを機に徹底的に自分の専門性を極めようという決心が生まれました。私自身データ分析業務1.5年程、2020年2月からエンジニアとして働き始めた新米で専攻も物理だったので、まずはCSの知識を極めようと決心しました。(OOP、アルゴリズム、OS、データベース辺りを直近で徹底的に勉強する予定です。)

この気持ちはシアトル滞在中に生まれてきたもので、世界のバトルフィールドを覗けたという意味だけでも十分価値があったと思います。
f:id:doreikaiho:20200226232106j:plainf:id:doreikaiho:20200226232147j:plain
(プログラミングの勉強は英語でやる宣言@シアトル)

もちろん、1ヶ月という期間はアメリカでの生活、swiftの知識、英語の練習など自分にとってプラスになるためには十分な期間だったと思います。

まず、アメリカの生活ですが、海外経験が豊富でない人であれば刺激的なことが結構起こると思います。ここでは細かくは書きませんが、チップ、店でのオーダーの仕方、挨拶、ウーバーの使い方、シアトルの天候などなど日本にいたら経験できない刺激的な習慣などを体験できます。
私自身アメリカには旅行で行ったことはあったのですが、1ヶ月も同じ場所に滞在してると細かいところも見えてくると思います。是非参加を迷ってる方には現地で体験して欲しいです。


swiftの知識に関しては、アプリがリリースまで制作できるようになります。1月コースはプログラミング未経験者と経験者でレベル差が激しい感じでしたが、未経験でもしっかりサポートして貰えるし、実際一緒に参加してた未経験の人もものすごい成長を遂げていました。
ジーズ卒業生であれば、自分の作ったwebアプリをネイティブアプリにしてみたり、はたまた新しいアプリをiOSで作る良い機会になると思います。私はARを使った野球フォーム解析アプリを途中まで作成していましたが、最後の最後にやっぱり将棋アプリ作りたいとなり、一旦保留中。(笑)


アプリとは別に英語のピッチの練習をする授業があります。結局作ったプロダクトを人に紹介できないと意味ないですからね。海外の人に対して自分のプロダクトをアピールする練習として、ピッチの構成や伝えるべきことなどなどをインプットしてもらいます。
そして、みんなの前で話す練習。人との会話とピッチでは話す構成とかトーンとかも違うので、ピッチとしてのベストプラクティスを短期間で習得することができます。ネイティブの先生に見て貰えるので個人のレベルに合わせて適切なアドバイスをしてもらえます。
あくまで英語力向上ではなく、今ある英語力でどのようにピッチに対応するかということを学べる場だと思って下さい。それ以外にもアメリカにいる間にできる英語の練習などを先生に相談したりスピーキング練習をする1on1セッションもありました。

参加予定者へ情報提供

最後に、参加すると決心した方に簡単な情報提供をしたいと思います。海外に慣れてる人なら問題ないかも知れませんが、そんなに海外経験のない人が不安に思うであろうことを羅列していきます。

・航空券
私が買ったのはマイクロソフト社員御用達のデルタ航空成田ーシアトル便です。正月ということもあり往復で17万円でした。
first nameとfamily nameを逆に登録してしまい、日本ではすんなりチケット発行してくれたのですが、帰りは空港にいた黒人のおばさんにThis is a big problem!!!と怒られて帰れないかと冷や冷やしました。

・宿泊
宿泊先手配の状況は今回と変わると思うのでインストラクションに従って貰えば良いと思います。

・入国審査
これが1番の難関だろうと勝手に思ってました。なぜなら、「1ヶ月という微妙に長期」、「アメリカでは有名ではないプログラミングスクールのプログラム」という滞在に対して、深く突っ込まれるのが容易に想像できたからです。

大事なのは、仕事を探しに来たわけではない、結婚相手を探しに来たわけではないということをはっきり主張することです。アメリカでは移民対策が厳しくなっており、上記の行為を目的として滞在されるのはビザを取りに来たと思われて追い返されます。最悪の場合強制送還です。

私が聞かれた内容は、
何しに来た?
プログラミングキャンプに参加。
どこが運営してる?
ジーズアカデミーという東京ベースにしたプログラミングスクール。
ジーズアカデミーとはどういうスクールなの?
起業家エンジニアを支援してるスクール。
何勉強するの?
iOSのプログラミング。
それ勉強してどうするの?
趣味でプロダクト作ろうと思ってる。
どんなプロダクト作るの?
ARアプリとか野球アプリとか。
その知識を仕事に生かそうと思ってるの?
趣味としてしか考えてない。
仕事は何してるの?
日本でデータサイエンスやってる。

他にも想定質問として、どこに滞在予定?所持金はいくら?アメリカでは誰と会う予定?などがあります。とにかく、仕事を探しにきたわけじゃない、結婚相手を探しに来たわけじゃないということをはっきりさせた方が良いです。質問の内容とかは審査官次第です。

・空港から市内までの交通手段
link light railという鉄道があるのでそれに乗れば一本で市内に行けます。1月コースはpioneer squareという駅が最寄りのコワーキングスペースで授業を行なっていました。
f:id:doreikaiho:20200226232107j:plain
(電車とてもイージーです@シアトル)


・滞在中の移動手段
宿泊先と授業の場所が離れてる場合バスかウーバーになると思います。ここら辺は乗り物の乗り方などサポートしてもらえると思うので心配なく。ウーバーの運転手は陽気な人もいれば機嫌悪い人もいますが、現地の人との交流チャンスだと思います。

・食糧調達
pioneer squareの近くだと日本食売ってるUwajimayaという大きいスーパーがあったり、宿泊先の近くにあったtrader joesというスーパーを使ってました。そこら辺の情報はサポートしてもらえると思います。
f:id:doreikaiho:20200226232110j:plain
(シェアルームで日本食@シアトル)

・挨拶
お店の人でもウーバーの運転手でもレストランの店員でも必ずHow are youって聞いてくるのがすごいなと思いました。マナーだと思って無視しないように返した方が良いです。

・治安
シアトルは比較的治安がいいそうですがやはり日本に比べると不安な部分があるので、危ないと言われているところには近づかない方が良いです。別に大丈夫でしょうと強がっても得られるものはありません。自分の身は自分で守るを徹底しましょう。

・体調
私は滞在中に39度の熱が出てとても辛かったです。時差がきつかったり環境の変化に体がついていけないことは十分考えられるので、規則正しい生活を心掛けた方が良いと思います。いざ熱やらなんやら体調を崩してしまった時は、アメリカの市販薬が最強なのでそれに頼るのもありだと思います。(私はNyquilという最強の薬に助けられました。)

まとめ

安くない費用と短くない期間を費やすので少しハードルはあるかもしれませんが、将来海外を視野に入れている人やテック最前線に興味ある人は参加して得るものは多いと思います。

個人的にはシアトルでプログラミングを教えていただいたiOSの先生がグローバルでかっこいい生き方をしてるなと感銘を受けたり、東京帰っても一緒に参加していたメンバーとアルゴリズム鬼勉強会を一緒にやる予定だったり(3月から定期的にcracking the coding interviewという本を使って勉強会するので興味ある人はご連絡ください!)、他のメンバーの意識の高い生き方にも大いに影響され、とてもいい刺激を受けました。

参加しようか迷ってたり、参加予定だけど不安点あるという方は気軽にご相談ください!(twitter @randomlyforest)
ジーズシアトルコミュニティを活性化したいなと思ってます!

以上

Rで機械学習モデルを構築する方法

個人的にはpythonが得意なのですが、Rの復習も兼ねて簡単にデータから機械学習を構築するまでの流れを追ってみました。
機械学習初学者やpython使いだけどRを勉強したいという方の参考になれば幸いです。
(Kaggleのカーネルを参考にしています。)

データ確認

今回は不動産価格の予測を行います。
データは以下のgithubからcsvファイルをダウンロードしてください。
handson-ml/datasets/housing at master · ageron/handson-ml · GitHub
ちなみにこのデータ、私の大好きなオライリーの本で使用しているデータです。

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

  • 作者:Aurélien Géron
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2018/04/26
  • メディア: 単行本(ソフトカバー)

それではデータを触っていきます。
まずはライブラリーの読み込みと、csvファイルからデータの読み込み。
データは地域ごとに存在する住宅の情報です。ここから、新しい地域の住宅情報を与えられた時に、住宅価格(median_house_value)を予測するモデルを構築します。住宅価格を目的変数と呼び、目的変数予測のために使う他の変数を説明変数と呼びます。

library(tidyverse)
library(reshape2)

housing <- read.csv('housing.csv')
head(housing)

f:id:doreikaiho:20190531155423p:plain

次にデータの概要を確認します。

summary(housing)

f:id:doreikaiho:20190531155605p:plain
ここからtotal_bedroomsにはNAが入っているということと、ocean_proximityがカテゴリーデータになっていることが分かります。

次にデータを可視化します。ちょっと軸の数字が重なっていますが気にしないでください。。

par(mfrow=c(2,5))
ggplot(data = melt(housing), mapping = aes(x = value)) + 
  geom_histogram(bins = 30) + facet_wrap(~variable, scales = 'free_x')

f:id:doreikaiho:20190531155908p:plain

データクレンジング

次にデータクレンジングをします。
total_bedroomsにデータの欠損値が入っていることが確認できたのでここは同じカラムの値の中央値で埋めることにします。(王道のやり方なのであまり深く考えずに処理します。本当は、中央値で埋めていいかどうかは検討が必要。)

housing$total_bedrooms[is.na(housing$total_bedrooms)]<- median(housing$total_bedrooms , na.rm = TRUE)

次に世帯当たりのベッドルームの数と部屋の数を新しくデータとして作成します。
これは地域に存在する世帯数によって部屋の数が異なるのは当たり前のことで、世帯ごとの部屋の数のデータにしか価値がないからです。

housing$mean_bedrooms<- housing$total_bedrooms/housing$households
housing$mean_rooms<- housing$total_rooms/housing$households
drops<-c('total_bedrooms', 'total_rooms')
housing<-housing[ , !(names(housing) %in% drops)]
head(housing)

f:id:doreikaiho:20190531162408p:plain

次にカテゴリのデータをone hot encodingします。
なんだそれという方、ググっていてください。すぐに分かります。

簡単に説明すると、文字列などでカテゴリに別れているデータはそのまま機械学習モデルに突っ込むことができないので、数値化してあげる必要があります。その時に、Aグループは1に変換、Bグループは2に変換、Cグループは3に変換、、、という具合に数値変換するとグループ間に重みの偏りが出てしまうので、Aグループかどうか(0 or 1)、Bグループかどうか(0 or 1)、という具合に各グループごとにデジタル値として変換してあげます。

pythonだとpandasにget_dummiesというメソッドがあるのでそのまま使えますが、Rはどうすればいいのか分からなかったのでチュートリアル通りに写経します。(あとで調査します。)
やっていることは簡単なのでコードを追ってみてください。
カテゴリーごとにカラムを生成してそこに0か1が入ったデータフレームが作成されます。

categories<-unique(housing$ocean_proximity)
cat_housing<-data.frame(housing$ocean_proximity)
colnames(cat_housing) <- 'ocean_proximity'

for(cat in categories){
  cat_housing[,cat]<-rep(0, times<-nrow(cat_housing))
}

for(i in 1:length(cat_housing$ocean_proximity)){
  cat<-as.character(cat_housing$ocean_proximity[i])
  cat_housing[,cat][i]<-1
}

head(cat_housing)

f:id:doreikaiho:20190601095057p:plain:w500

もともとのカテゴリ情報が入っていたocean_proximityは不必要になるので削除します。

cat_columns<-names(cat_housing)
keep_columns<-cat_columns[cat_columns != 'ocean_proximity']
cat_housing<-select(cat_housing,one_of(keep_columns))
head(cat_housing)

f:id:doreikaiho:20190601101554p:plain:w450

次に説明変数のスケーリング(標準化)を行います。スケーリングは外れ値や変動の大きい変数に予測結果が引っ張られないように、値を標準化します。

その前に説明変数として使用しないカラム(median_house_value目的変数,ocean_proximity使わない)をマスターデータフレームから削除します。その後にスケーリング。

drops<-c('ocean_proximity','median_house_value')
housing_num <-housing[ , !(names(housing) %in% drops)]

scaled_housing_num <- scale(housing_num)
head(scaled_housing_num)

f:id:doreikaiho:20190601105318p:plain

スケーリングが完了したので、目的変数(median_house_value)とカテゴリーのone hotデータフレームを合体させます。

cleaned_housing <- cbind(cat_housing, scaled_housing_num, median_house_value=housing$median_house_value)
head(cleaned_housing)

f:id:doreikaiho:20190601105854p:plain

モデリング

さてデータが整ったのでモデリング開始します。
機械学習モデルは通常学習データとテストデータに分けて、学習データを用いてモデルを作り、テストデータを使ってその精度を検証するというやり方をします。なので、ここでもまずデータを学習データとテストデータに分割します。

set.seed(1738)
sample<-sample.int(n = nrow(cleaned_housing), size<-floor(.8*nrow(cleaned_housing)), replace = F)
train<-cleaned_housing[sample, ] 
test<-cleaned_housing[-sample, ] 

それではモデリング+検証を行います。
まずはGLMからです。コードではクロスバリデーションを使っています。詳しい説明はこちらを参考にしてください。

library('boot')
glm_house <- glm(median_house_value~median_income+mean_rooms+population, data=cleaned_housing)
k_fold_cv_error<-cv.glm(cleaned_housing , glm_house, K=5)
names(k_fold_cv_error)

>"call" "K" "delta" "seed"

クロスバリデーションの結果(RMSE)は以下のようになります。

glm_cv_rmse<-sqrt(k_fold_cv_error$delta)[1]
glm_cv_rmse

>83396.67

次にランダムフォレスト。先ほど分割した学習データとテストデータを使用します。
学習データを目的変数と説明変数に分けます。

library('randomForest')
names(train)
set.seed(1738)

train_y<-train[,'median_house_value']
train_x<-train[, names(train) !='median_house_value']

ランダムフォレストの場合クロスバリデーションをしなくても、ランダムに学習に使っていないデータ(out-of-bag (oob) )が残っているのでそのデータを用いいて精度検証できます。

rf_model<-randomForest(train_x, y = train_y , ntree = 500, importance = TRUE)
oob_prediction <- predict(rf_model)
train_mse <- mean(as.numeric((oob_prediction - train_y)^2))
oob_rmse <- sqrt(train_mse)
oob_rmse

>49148.28

最後にテストデータを使ってスコアリングをします。

test_y = test[,'median_house_value']
test_x = test[, names(test) !='median_house_value']
y_pred = predict(rf_model , test_x)
test_mse = mean(((y_pred - test_y)^2))
test_rmse = sqrt(test_mse)
test_rmse

>48273.99

この結果が良いか悪いかは求める精度次第ですので、ビジネスを始める時に目標精度定めておく必要があります。

簡単にモデリングまでの流れを追ってみました。
以上です。

herokuのPostgresSQLをNode.jsで触る方法

herokuのPostgreSQLを使ってデータの保存読み込みを行ったのでメモ。
最後はNode.jsで書いてますが、途中までは他の言語でも参考になるはずです。

一連の流れの説明がなかったので残しておきます。

やりたいことは、
heroku のアプリにデータベース(PostgreSQL)を追加
⬇︎
コマンドからPostgreSQLにテーブルを追加して適当な値を格納する。
⬇︎
Node.jsからデータベースにアクセスして、PostgreSQL内のデータを触って見る。

という流れです。herokuにはアプリ登録していてPostgreSQLは追加していないところからスタートします。

- heroku アプリにデータベースを追加

herokuのアプリ画面でResources>Add-onsの入力欄に、
heroku Postgresと入力して検索。そのまま、フリープランでAdd-onします。
以下の画面。
f:id:doreikaiho:20190529193014p:plain

すると、Settings > Config Variables のところにデータベースのURLが表示されます。
これでデータベースを追加は完了。楽チン!

- PostgreSQLにテーブルを追加

次にデータベースにテーブルを作成します。
おそらくGUIはないと思うのでコマンドからテーブル作成を行います。
まずはPostgresのコマンドが動くようにローカルにPostgresをインストールしておく必要があります。

次にherokuのPostgresにアクセスできるようにします。

$ heroku pg:psql

これでデータベースを編集できるモードになりました。
次にテーブルを作成していきます。

::DATABASE=> CREATE TABLE users
::DATABASE-> (
::DATABASE(>  user_id SERIAL,
::DATABASE(>  name character varying(100) NOT NULL,
::DATABASE(>  date timestamp NOT NULL
::DATABASE(> );

これでusersテーブルができました。以下コマンドでテーブルの構造が確認できます。

::DATABASE-> \d users
- Node.jsからデータベースにアクセス

では、Node.jsのスクリプトでデータベースをいじくります。
と言っても対してことはなくて、データベースのURLだけを指定してあげればよいので、
簡単です。

データベースのURLは以下のコマンドで取得できます。

heroku pg:credentials:url --app アプリ名

取得したらherokuの環境変数として入れてあげます。

$heroku config:set DATABASE_URL=データベースのURL

あとはNode.jsでこの環境変数を使ってデータベースに接続するだけ。
事前にpgをインストールしておきます。

npm install pg

以下のコードが基本形です。ssl通信が必要となるみたいなのでssl: trueを忘れないように。

const { Client } = require('pg');

const client = new Client({
  connectionString: process.env.DATABASE_URL,
  ssl: true,
});

client.connect();

client.query('SELECT * FROM users;', (err, res) => {
  if (err) throw err;
  for (let row of res.rows) {
    console.log(JSON.stringify(row));
  }
  client.end();
});

以上です。

アンサンブル学習、AdaBoost(アダブースト)の数式を分解してみた

機械学習統計学は切っても切り離せない関係です。が、統計学って数学の一種なので簡単な事象に対しても小難しい式を使いがちですよね。。

私自身物理学科出身なので学生の時にシュレディンガー方程式やらマックスウェル方程式やらを扱っていましたが、数学を仕事も含めてずっと扱ってきた人に比べると理解力は圧倒的に低いと思います。(そもそも数式は得意な方ではないです。)

上記を感じたのは最近アンサンブル学習の中身をそろそろ知らんとあかんなと思い、AdaBoostについて勉強していたことがきっかけです。

愛読書の機械学習参考書で該当説明を見ていましたが、一読で飲み込めなかったので何度か読み込みネットでも調べてやっと理解できたかな、という感じでした。得意な人から「は、そんなん簡単やろ」って感じなんでしょうが、そんな人ごく一部で私みたいな一般人はなかなか理解にたどり着くのに時間がかかると思います。

この世の中に蔓延る「統計学ブラックボックス現象」をなんとかわかりやすい解説により解消したいなとつくづく思います。

続きを読む

Rのshinyライブラリを使って株価をグラフで見える化する方法

Rのライブラリーの一つ、練習がてらshinyを使って株価即見画面を作って見たのでコードを残しておきます。

機能は「見たい株価の銘柄を選択できる」、「見たい株価の期間を選択できる」です。また、グラフ上にカーソルを乗せるとカーソルがさしている時期の株価が右上に表示されます。グラフの下のバーを引っ張ると、表示期間を調整できたりします。
f:id:doreikaiho:20190201212210p:plain


機能としてはかなり単純ですが、意外と手が込んでるように見えますね。しかし、ここまで作るのに30分もかかりません。これがshinyというライブラリーのすごいところ。

続きを読む

scikit-learnのcross_val_scoreを使って交差検証(Cross Validation)をする方法

機械学習モデルを作る時、与えられたデータを全て用いてモデルの学習・精度向上を行うと、そのデータに対してのみ精度の良いモデル(理想のモデルに近づけていない。)が出来上がってしまい、未知のデータに対して適用できなくなってしまいます。

そのため通常、データをあらかじめ学習用と検証用に分けておき、学習用データでモデル作成→検証用データでモデルの精度を確かめるという手順でモデリングを進めていきます。
f:id:doreikaiho:20190201173653p:plain:w400

さて、上記のように学習データ内で精度の良いモデルを作るのですが、こちらも学習データに特化したモデルを作ってしまうと、いつまでたっても精度の良いモデルができません。(特に学習データが少ない場合。)

この問題を解決する手法が交差検証(Cross Validation)です。今回は交差検証の中でも、K-分割交差検証(k-Fold cross validation)について説明します。

続きを読む

pythonのitertoolsを使ってベクトル各要素の総当たりを行う方法

pythonでAというベクトルとBというベクトルがあった時に、その要素をA vs Bで総当たり的に計算させて最適解を求めたいという時に使えるツールを備忘です。

itertoolsというライブラリーを使います。

import itertools

以下のようにベクトルAとベクトルBの各要素で総当たりprintを行います。
結果は全組み合わせが表示されます。

A = ['1', '2', '3','4']
B = ['a', 'b', 'c','d']

for i, j in itertools.product(x, y):
    print(i, j)

output>

続きを読む

Rのdygraphsを使っていけてるグラフを出力する

dygraphsとはJavaScriptで書かれてかっこいいグラフを描けるライブラリーです。
本当にかっこいいしすぐ作れます。

今回はアマゾン株を取ってきます。まずは以下のサイトから、アマゾン株をCSVで落とします。
CSV Historical Prices | Carriage Services, Inc. Stock - Yahoo Finance

作業ディレクトリーにCSVファイルを保存。以下でデータフレームを作成。

mydata <- read.csv('AMZN.csv')


データフレームを時系列処理ができるxtsオブジェクトに変換。一旦zooオブジェクトを挟んで変換するのでzooもインポートします。

library(xts)
library(zoo)
t <- as.xts(read.zoo(mydata))


あとはdygraph関数にデータをぶち込むだけです。なんと簡単なんだ。。

library(dygraphs)
amzn <- cbind(t$High, t$Low)
dygraph(amzn)

output>
f:id:doreikaiho:20190120212144p:plain

画像からだとわかりにくいですが、マウスの置く位置に沿ってポインタが移動し、その時の株価を右上に表示してくれます。ダイナミックだ。。

scikit-learnのStratifiedShuffleSplitを使ってテストデータを作る方法

マスターデータからトレインデータとテストデータに分ける時、テストデータの目的変数分布がマスターデータの目的変数分布と同じになるように作成する方法の備忘録。

kaggleのタイタニックデータを使用。
csvファイルにはtrainと書いているがこのデータが全データと過程。

import pandas as pd
import numpy as np
titanic_df = pd.read_csv("train.csv", error_bad_lines=False)
titanic_df.head()

output>
f:id:doreikaiho:20190114212141p:plain

今回は簡単のため、数値データのみのデータとするよう処理。

sample_df = titanic_df.drop(columns = ['Name','Sex','Ticket','Cabin','Embarked'])
sample_df = sample_df.dropna()
sample_df.head()

output>
f:id:doreikaiho:20190114212626p:plain:w400

仮にAgeカラムを目的変数としてその他のカラムを説明変数とする。
ここでやりたいのは、テストデータをここから作る際(split)にAgeカラムの年齢分布がマスターデータと同じようになるデータをランダムに抜き出す事

そのために以下のように年齢を10年刻みに書き換える。ここでは四捨五入を使った。
グラフにすると以下のようになる。

sample_df['Age_rechunk'] = np.round(sample_df['Age'],decimals = -1)
sample_df['Age_rechunk'].where(sample_df['Age_rechunk'] < 71 , 70,inplace=True )
sample_df['Age_rechunk'].hist(bins = 14)

output>
f:id:doreikaiho:20190114213744p:plain:w300

このデータを元にしてscikit-learnのStratifiedShuffleSplitを使う。
データは元データの30%として、先ほど作ったAge_rechunkカラムのデータ分布とテストデータのAge_rechunkカラムのデータ分布が揃うようにテストデータを作成する。

from sklearn.model_selection import StratifiedShuffleSplit
sample = StratifiedShuffleSplit(n_splits = 1,test_size = 0.3, random_state = 20)
for train_,test_ in sample.split(sample_df, sample_df['Age_rechunk']):
    chunk_train = sample_df.loc[train_]
    chunk_test = sample_df.loc[test_]

作成したテストデータをグラフにすると以下のような感じ。
上で作ったマスターデータの分布と同じような感じになってる。

chunk_test['Age_rechunk'].hist(bins = 14)

output>
f:id:doreikaiho:20190114214314p:plain:w300

pandasでサイズの大きいファイルの読み込み方

kaggleのファイルが大きすぎてpandasでまとめて読み込めなかったのでその時の対処法をメモ。
今回はCSVファイルを使っています。もうこの時点でナンセンスなのかもしれない。笑

普通にCSVファイル読み込むときはこんな感じ。

df = pd.read_csv('train.csv')

しかし、ファイルがでかすぎてメモリ不足のエラーが出る。

そこで、ファイルを分割して読み込んでからデータフレームをがっちゃんこさせる作戦。
以下のようにファイルを読み込ませます。chunksizeと指定することにより指定サイズ分の列ごとに取り出すTextFileReaderのインスタンスを作る。

df1_instance = pd.read_csv('train.csv',chunksize = 10)
df1_instance

output>
pandas.io.parsers.TextFileReader at 0x10470ca58

このインスタンスからデータフレームを取り出すために.get_chunk()メソッドを使う。

df1_instance.get_chunk()

output>
f:id:doreikaiho:20190112223347p:plain:w50

TextFileReaderは読み込んだ位置を覚えているので、もう一回同じことをすると次の塊をデータフレームとして読み込む。

df1_instance.get_chunk()

output>
f:id:doreikaiho:20190112223358p:plain:w70

最後に分割したデータフレームをがっちゃんこさせる。
for文でループさせるとでーたフレームの一番終わりのところまで読んでくれる。
indexが重複しないようにignore_index=Trueも忘れずに。

df = pd.concat((r for r in df_instance), ignore_index=True)