Kaggle 銅メダルへの道(8日目)

こんにちは、筋肉めがねです。

 

Google AIが以下の記事をtweetしておりました。

blog.google

 

世界中のあらゆる事象を記録した様々なデータセットを、全ての方がアクセスできるようオープンにする、という記事です。過去に起きた事象を基に、起こるであろう未来を予測する、というモデルを作るには必須なものですね。

以下のページで、データセットを検索可能のようです。

toolbox.google.com

 

それでは、ドイツの物件情報分析は一旦置いておいて、Kaggleを進めていきましょう。

ここ数日、Kaggleのopen compeitionを一つ一つ読んでおりました。中でも、NCAAという全米大学バスケットボールのトーナメントについて、今年の3月から4月にかけて行われる全ての試合の結果を予想する、というConpetitionに興味を惹かれたので、それを進めていきます。このトーナメントは別名March madnessと呼ばれているようです。

そう言えば、スラムダンクが世間を賑わせていた90年代後半、僕は万年バスケ部のベンチウォーマーであったなー。ベンチを温める事が誰よりも得意だった事を思い出しますね。冬は、座る所が暖かい方が良いですよね。

 

ざっくりとCompetitionの概要を読みましたが、NCAAバスケにおいて、出場チームが選出される過程、と勝ち上がりの方式を理解する事が大事なようです。以下、書いておきます。

1. 先ず、トーナメントに先駆けて、全米で32の小さい大会が開催されます。それら各々の大会での優勝チーム32校が選ばれます。その際、ある基準を用いて、1から32までの順位が付けられます。

2. 続いて、全米の全ての大学から、36校が委員会により推薦されます。この時も、ある基準を用いて、1から36までの順位が付けられます。

3. ステップ1における32校のうち、下位の4校と、ステップ2における36校のうち下位の4校の合計8が、先ずトーナメントを行います。そして、そこで選ばれた上位の4チームと、残りの60チーム、計64チームがトーナメントを行い、優勝者を決める、というものです。

 

そのため、1回のトーナメントにおける試合数は67回なんですけれども、今回のKaggleのCompetitionでは、全ての考えうる試合の結果を予想する、というもの、つまり試合数は総当たり方式と同じとなります。68 x 67 = 2,278ですね。

 

次回の記事でCompetitionを進めていきます。

それでは、本日は以上でございます。

 

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

ドイツの物件情報分析(2日目)

こんにちは、筋肉めがねです。

 

前回の記事では、Immobilienscoutから取得した物件情報を9,097件まで絞り込みました。ですが、一旦、取得した全件10,587件の情報を使って分析してきましょう。

 

これらのデータを使って、先ずは、ドイツの州毎にどのような違いがあるのか見ていきましょう。例えば、州と価格の相関を取りたい時は、以下の記事で実践した事を思い出しながら進めていけばよいですね。

kinnikumegane.hatenablog.com

 

州毎に、どのような価格帯の物件が売りに出されているのか、こちらが一覧でございます。

f:id:KinnikuMegane:20190303034616p:plain

Boxplotで描画してみたところ、BerinそしてBayernには外れ値と判断された物件が沢山ある事がわかりますね。例えばBayernには、9Mil EUR近い物件がある事が分かります。Boxplotにおける外れ値の判断基準は以下で説明されています。

mizti.hatenablog.com

外れ値があるので少し見づらいですね。では、外れ値を取って描画してみましょう。

f:id:KinnikuMegane:20190303042741p:plain

だいぶ見やすくなりました。上の図のBoxplotでは、5つの指標が表されています。Boxからそれぞれ上の方、下の方に伸びている線の先端にあるバーは、上のバーが母集団における最大値、そして下のバーが最小値を表しています。そしてBox部分は、下辺が母集団における25%目の位置にある数値、そして中央付近にあるバーが中央値、そして上辺が母集団における75%目の位置にある数値です。

中央値とは、普段の生活では馴染みのない指標ですが、例えば人が99人いた時に、年齢順に並んてもらったとします。その時に、50人目(母集団の真ん中にいる人)の年齢を中央値と呼びます。

 

Berlin, Hamburg, Bayernの中央値は400kEUR程度という事が分かりますね。続いてHessen, Baden Württenbergにおいて、価格の高い物件が売りに出されている事が分かります。

 

では、州毎にどれだけの物件数があるのか描画してみましょう。

f:id:KinnikuMegane:20190303035819p:plain

 

Nordrhein Westfalenが1,900件程度、とダントツでトップですね。日本の方には馴染みのあるDüsseldorfのある州ですね。続いて、Baden Würdenberg, Bayern, Berlinと続いています。

 

続いて、州毎の物件の床面積の情報をプロットしてみましょう。

f:id:KinnikuMegane:20190303075211p:plain

縦軸は平米です。Bayern, Sachsen, Brandenburgに800平米を超える物件がありますね。9Mil EURを超える物件のあるBayernでは理解できますが、物件価格の上限が2Mil EURであるSachsen, Brandenburgのマーケットに、800平米を超える物件があるのは興味深いところですね。お買い得なのでしょうか。

 

外れ値が沢山あるので、価格と同様に、外れ値は削除してしましょう。

f:id:KinnikuMegane:20190303080219p:plain

価格で見た州毎のばらつきと比較すると、床面積は州毎にそこまで大きなばらつきはないようです。Berlin, Hamburg, Bayern, Hesse, Baden Württenbergは、それ以外の州と比較をすると、1平米あたりの値段がダイブ高い、という事ですね。

 

最後に、州毎の物件の築年数を見てみましょう。

データの型変換、そして欠損値の補完をした上で、プロットします。

f:id:KinnikuMegane:20190303082218p:plain

鎌倉幕府時代に作られた物件が1つありますね。本当か、と。

 

これまでの分析同様に外れ値が沢山ありますね。削除しましょう。

f:id:KinnikuMegane:20190303082407p:plain

Sachen, Thüringen, Sachsen Anhalt Bremenは、2000年以降に作られた物件がほとんどない事が分かりますね。でも一方で、Berlinは、古い物件から新しい物件までバリエーションが豊富な事が分かりますね。

 

それでは、本日は以上でございます。

 

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

ドイツの物件情報分析(初日)

こんにちは、筋肉めがねです。

 

さて、2月1日に日欧EPAが施行されました。EUから日本へ輸出した商品に対しては、日本側でこれまでかかっていた関税を約94%撤廃する、との事、そして日本の商品をEUへ輸入した際に、これまでかかっていた関税については、約99%撤廃する、との事です。例えば、醤油については、現行7.7%の関税がかかっているところ、即時撤廃となる、と。そして、お酒類についても即時撤廃となる、という事です。すでに、税関を通過してドイツに入ってきているモノについては、対象外ではあるでしょうが、これからドイツに輸入されるそれらの商品については、関税がかからない、という事ですね。そして、関税がかからない、という事はこれまで税関にかかっていた時間までも短縮される、という事でしょうか。近いうちに、日本食ラーメン店へ行ってみようかと思います。少し安くて、それでいて新鮮な具材の入ったラーメンが食べれる事を期待して。

 

f:id:KinnikuMegane:20190202033652j:plain

 

さて、3月末までにKaggleでメダルを取る、という目標に向けて粛々と進めていくべきなんですけれども、少しだけ寄り道してみましょう。

 

Kaggleではじめて参加したCompetitionがHouse Pricesに関わるものだったんですけれども、では僕が住んでいるドイツの住宅事情はどうなのよ、というところが気になるところであります。ということで、ドイツの物件情報を集め、整理して、どんな事が分かるのか分析してみましょう。

 

ドイツの物件情報を集めるために使用するサイトは、ドイツでは最も有名なサイトの一つであるImmobilienscout24です。Immobilienscout24を使用してデータを集めるわけですが、マニュアルで1つ1つの物件の情報をエクセルに転記していく、という作業をしていくと日が暮れます。そこで、スクレイピング、という技術を使います。コードを使って、自動でサイトの情報を取得する手法ですね。

 

スクレイピングとは、あるサイトに一定の回数、一定の間隔を空けてアクセスし、必要な情報を取得する、という技術です。企業が収集した情報を参考にする、という事ですから、気をつけなければいけない事もあります。それは、断じて商業用途に使ってはいけない、という事、あくまで私的な利用に限定する、と同時に、企業側のサーバーに負担にならない程度の低負荷でサイトにアクセスする必要がある、という事です。

www.theregister.co.uk

www.wbs-law.de

www.rechtzweinull.de

 

では、スクレイピングを実装していきましょう。

コードは、以下の記事を参考にして書きました。

statisquo.de

 

スクレイピングのMax時間を6時間とし、30秒の時間を置いて次の物件の情報を取得するよう設定しました。

 

結果、10,587件の物件情報を取得する事ができました。 分析をするには十分な量のデータですね。

先ずは、KaggleのHousing priceでも実施した通り、purchase priceとliving spaceの相関を取ってみましょう。

f:id:KinnikuMegane:20190228062601p:plain

縦軸は、k EURで、横軸は平米です。パッと見、単位がおかしいように見えますが、実はこれが正しいんですね。1Mil EUR以上の物件が山ほどありますね。それらの物件はセレブに任せるとして、それ以下の物件のみフィルターをかけましょう。そして、living spaceが400平米以下の物件に的を絞りましょう。

f:id:KinnikuMegane:20190228063842p:plain

もう少し絞りましょうか。Purchase Priceを600k EUR以下に、living spaceを250平米以下に絞りましょう。

f:id:KinnikuMegane:20190228064415p:plain

この段階で、どれだけの物件数があるのか調べてみましょう。

f:id:KinnikuMegane:20190228064440p:plain

9,097件、オリジナルのデータと比較すると1,490件減りました。

 

これらのデータを使って、色々と分析してみましょう。

Kaggleも進めないといけませんね。

 

それでは、本日は以上でございます。

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

Kaggle 銅メダルへの道(7日目)

こんにちは、筋肉めがねです。

 

1月最終日ですね。明日、日欧EPA (Economical Partnership Agreement)が施行されます。ドイツで購入できる日本食品が安くなるのでしょうか。楽しみですね。

www.mofa.go.jp

 

それでは、本日は、昨日Kaggleへ提出したモデルのざっくりとした解説、そして理解に努めましょう。

 

昨日提出したモデルは、以下の記事を参考に準備しました。

www.kaggle.com

 

Box-Cox transformationやら、初めて聞く名前の手法が多々ありますが、中でも今日はstackingについて理解していきましょう。

stackingとはアンサンブル学習の一つ、という事です。

では、アンサンブル学習とは何か。それは、一つの学習器ではなく、複数の学習器を組み合わせる事によって、精度の高いモデルを構築する手法ですね。

それでは、stackingとは何か。

訳すると重ね合わせる、という事です。

 

f:id:KinnikuMegane:20190201060541p:plain

stackingとは、最初のステージで複数の学習器を用いて、学習をさせます。そして、ここから得られた予測値を特徴量として、第二ステージで使用し、そのまま第二ステージで別の学習器群に学習させる、という一連の流れです。

とても分かりやすい記事があったので共有しておきます。

www.algo-fx-blog.com

 

それでは、2月以降は、3月末までに期限のあるKaggleのCompetitionに参加し、メダルを取りにいきましょう。

 

それでは、本日は以上でございます。

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

Kaggle 銅メダルへの道(6日目)

こんにちは、筋肉めがねです。

 

久しぶりのブログでございます。2019年1月も残り1日となりました。とても早いものですね。皆さんは、年初に立てた目標をコツコツと進めておりますでしょうか。僕はと言うと、夏休みが残り1週間で終わる、という時の小学生の気持ちでございます。「あー、読書感想文もやってないし、自由研究もやってなーい。どうしよー。」さて、どうしましょうか。

よし、大学時代に通っていた空手道場の師範の言葉を思い出しましょう。

「ごちゃごちゃ言わずにやれ。」

そうやって、しばしば叱咤激励されたものでございます。

という事で、just do it.

f:id:KinnikuMegane:20190131090650p:plain

前回までの記事では、KaggleのHouse PricesのCompetitionについて、欠損値の確認をしてみたり、heatmapを用いて相関図を描画してみたりと、いろいろと試してみましたが、予測結果をKaggleへ提出する、というゴールまで中々たどり着きませんでした。

ですので、本日は、Kaggleへ結果を提出する、という目標へ向け、以下の手順を一気に進めていきました。

 

  1. 動作環境の構築
  2. KaggleからCompetitionデータを取得
  3. データ概要の把握
  4. 外れ値の削除
  5. 目的変数の分布の確認、処理
  6. 前処理:欠損値処理
  7. 前処理:変数変換
  8. 機械学習
  9. 予測結果をKaggleへ提出

動作環境の構築については、以下の記事を参考にし、Google Colaboratory上で、Kaggleとのデータの連携ができるように、Kaggle APIの設定を行いました。

qiita.com

そして、以下の記事を参考にし、データ概要の把握から予測結果をKaggleへ提出しました。

 

www.kaggle.com

 

提出した結果はこちらでございます。

f:id:KinnikuMegane:20190131091916p:plain

Scoreは0.11557となっていますね。これは、House CompeitionのEvaluationを見てみると、"Root-Mean-Squared-Error (RMSE) between the logarithm of the predicted value and the logarithm of the observed sales price."とあります。

要は、僕が提出した予測結果(各物件に紐付いているIDと予測した値段、というシンプルな結果)と、各物件の実際の値段の「合ってなさ加減」と理解しましょう。つまり数値が小さければ小さいほど良いんですね。

そして、そのScoreが全体の中でどれぐらいの順位なのか、と言うと、それが以下に示されている順位ですね。

 

f:id:KinnikuMegane:20190131092130p:plain

 

おー!!

上位11%に入っているではありませんか。これは、銅メダル圏内ですよね!

。。

でも、銅メダルの数が0ですね。。ふむ。。

 

。。どうやら凡ミスのようです。

House Price competitionのように、締め切りのないopen endなCompetitionは順位をつける事はあっても、メダルを参加者に与える事はしないようです。

 

1月中に銅メダルを取る、という目標ではありましたが、結果的には銅メダル圏内の順位を取る事が出来ました。まあ最初はこんなもんですな。

明日は、提出したモデルの概要を説明します。

 

2月以降は、締め切りのあるCompetitionに参加し、3月までに銀メダル以上を獲得する、という目標に向け進めていきましょう。

 

 

それでは、本日は以上でございます。

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

Kaggle 銅メダルへの道(5日目)

こんにちは、筋肉めがねです。

 

いきなりですが、本日は3行日記を書いてみます。3行日記とは、以下の3点を毎日書く、という事だそうです。

 

本日、一番感動した事

本日、一番失敗した事

明日の目標

 

という事で書いてみましょう。

本日、一番感動した事は久しぶりの胸トレで100kg x 7repsを挙げれた事

本日、一番失敗した事はジムで3種類の胸トレしかできなかった事

明日の目標は、Kaggleをする事

 

それでは、本日も以下の記事を参考に進めていきましょう。

www.kaggle.com

 

本日は、objective analysisという事で主観を除いて定量的にデータを分析してみました。

 

f:id:KinnikuMegane:20190115072325p:plain

一つ目の図はheatmapです。相関の高い箇所は色が濃くなっています。ざっくり見て分かる事は、TotalBsmtSFと1stFlrSFは相関がとても高いという事、つまり例えばTotalBsmtSFがSalePriceに与える影響が、1stFlrSFがSalePriceに与える影響とほぼ等しい、という事ですね。GarageCarsとGarageAreaも同様にとても相関が高い、という事が分かります。

f:id:KinnikuMegane:20190115072402p:plain

続いて、Seabornというライブラリが、SalePriceと相関が高いと判断した9つの条件、およびSalePriceとの相関を相対比較させた図です。先ほどと同じように、TotalBsmtSFと1stFlrSF、およびGarageCarsとGarageAreaはほぼ同じ情報を与える、という事が分かります。

それらの条件から幾つかに絞り込み、各々の相関をxy座標にプロットした図が以下でございます。見ていて面白いですね。


それでは、本日は以上でございます。

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング

Kaggle 銅メダルへの道(4日目)

こんにちは、筋肉めがねです。

 

SchwarzwaldのFeldbergにハイキングに行ってまいりました。寒い中、体が強張りながらも、まつぼっくりちゃんと一歩一歩踏みしめて参りました。山を歩く、登るというのは、その後の達成感も含めて、いつになっても良いものですね。歴史的な登山家と呼ばれたジョージマロリーは「なぜエベレストに登りたいのか。」と記者に質問され、「そこに山があるからだ。」と答えた事はとても有名ですが、それほどまでに登山する事にまっすぐになれる気持ちはとても清々しいですね。

f:id:KinnikuMegane:20190114060415j:plain


それでは、本日もKaggleで銅メダルを取るために一つ一つ進めていきましょう。

 

前回の記事では、KaggleのHouse Prices competitionについて、データ概要の把握、重複の確認、および外れ値の削除を行いました。このまま、前処理の一つである欠損値の処理に進んでも良いのですが、いかんせん僕がこのHouse pricesのcompetitionで与えられているデータについて、十分な理解ができておりません。

そこで、以下のKernelを参考にしながら、同competitionで与えられている80個の条件を一つ一つ理解し、各々の条件とHouse priceに相関がありそうかどうか、主観で目星をつけてみました。

ニューラルネットワークを訓練していく上で、どのデータを利用して訓練していくかがとても重要になります。例えば、物件の売価と全く関係のありそうのないデータ(e.g. 家具の色)を利用して、ニューラルネットワークを訓練しても精度の高いモデルはできそうにないですよね。

www.kaggle.com

 

具体的にどういう作業をしたか、というと、エクセルに一つ一つ条件を書き込み、それぞれに対して売価と相関が高いかどうか、High, Medium, Lowとカテゴライズしていきました。

f:id:KinnikuMegane:20190114055916p:plain

 

主観ではございますが、結果、以下の20個の条件については、売価と相関がありそうである、と判断しました。

LotArea: 敷地面積

LandContour: 物件の床がどれぐらい平坦がどうか。

Utilities: 水道、ガス、電気などの設備状況

HouseStyle: 1階建て、2階建て、など物件の形

OverallQual: 物件に使われている部材、および物件それ自体の質

OverallCond:  物件全体のコンディション

Foundation: 物件の土台(例:コンクリート)

TotalBsmtSF: 地下階の床面積

1stFlrSF: 1階の床面積

2ndFlrSF: 2階の床面積

GrLivArea: 居住スペースの床面積

FullBath: 浴室の数

BedroomAbvGr: 寝室の数

KitchenAbvGr: キッチンの数

TotRmsAbvGrd: 部屋の数

GarageType: ガレージのタイプ(例:物件に併設しているか)

GarageArea: ガレージの床面積

MoSold: 物件が売りに出された月

YrSold: 物件が売りに出された年

Sale Type: 販売のタイプ(例:保証がついているか)

 

そして、ここからが楽しいお絵かきの時間でございます。

先のexcersizeで、売価と相関がありそうである、と判断した各々の条件について、実際に売価との相関をグラフにプロットして見ていきましょう。

以下、20個の条件と売価の相関です。

全て縦軸が売価でございます。

 

LotArea: 敷地面積

f:id:KinnikuMegane:20190114074639p:plain 

LandContour: 物件の床がどれぐらい平坦がどうか。

f:id:KinnikuMegane:20190114074725p:plain

Utilities: 水道、ガス、電気などの設備状況 

f:id:KinnikuMegane:20190114075011p:plain

HouseStyle: 1階建て、2階建て、など物件の形

f:id:KinnikuMegane:20190114075048p:plain

OverallQual: 物件に使われている部材、および物件それ自体の質

f:id:KinnikuMegane:20190114075127p:plain

OverallCond:  物件全体のコンディション

f:id:KinnikuMegane:20190114075153p:plain

Foundation: 物件の土台(例:コンクリート)

f:id:KinnikuMegane:20190114075258p:plain

TotalBsmtSF: 地下階の床面積

f:id:KinnikuMegane:20190114075409p:plain

1stFlrSF: 1階の床面積

f:id:KinnikuMegane:20190114081734p:plain

2ndFlrSF: 2階の床面積

f:id:KinnikuMegane:20190114081803p:plain

GrLivArea: 居住スペースの床面積f:id:KinnikuMegane:20190106211105p:plain

FullBath: 浴室の数

f:id:KinnikuMegane:20190114081922p:plain

BedroomAbvGr: 寝室の数

f:id:KinnikuMegane:20190114081958p:plain

KitchenAbvGr: キッチンの数

f:id:KinnikuMegane:20190114082032p:plain

TotRmsAbvGrd: 部屋の数

f:id:KinnikuMegane:20190114082107p:plain

GarageType: ガレージのタイプ(例:物件に併設しているか)

f:id:KinnikuMegane:20190114082249p:plain

GarageArea: ガレージの床面積

f:id:KinnikuMegane:20190114082223p:plain

MoSold: 物件が売りに出された月

f:id:KinnikuMegane:20190114082402p:plain

YrSold: 物件が売りに出された年

f:id:KinnikuMegane:20190114082443p:plain

SaleType: 販売のタイプ(例:保証がついているか)

f:id:KinnikuMegane:20190114082644p:plain

 

データをプロットしてみると色々と分かる事がありますね。例えば、Utilitiesについては、ほぼ全ての物件で電気、ガス、水道の設備が整っている、という事が分かり、一方で、この情報と売価に相関関係はない、という事が分かります。

 

これら20個の条件のうち、以下の条件については売価との相関関係がありそうなので、それらについて、次の記事で前処理を進めていきましょう。

OverallQual

1stFlrSF

GrLivArea

FullBath

 

それでは、本日は以上でございます。

にほんブログ村 IT技術ブログへ
にほんブログ村



Pythonランキング