初めてデータコンペに参加してできるようになったこと・できなかったこと
初めてデータコンペに参加してきたので、そのことをまとめていきたいと思います。
コンペには以前から興味はあったのですが、Kaggleに登録して一からモデルを作るのは自分としては敷居が高くなかなか1サブができていない状況でした。ですが今回はsignateで学生限定のコンペが始まったこと、また、インドにいるため比較的自由な時間が多いことがきっかけとなりついにコンペへ参加し最後まで取り組むことができました。
コンペの概要
参加したコンペは「マイナビ × SIGNATE Student Cup 2019: 賃貸物件の家賃予測」で所在地や間取り、築年数などをヒントに、東京23区における賃貸物件の家賃予測を行うというものでした。
できるようになったこと・やったこと
初めてデータサイエンスコンペに参加してできるようになったこと・実際にやったことを以下にまとめていきます。ところどころ覚書としてコードや補足も書いていきます。
EDA
賃料との相関や外れ値の確認をした。欠損値の割合の算出、賃料の対数変換など。
特徴量作成
具体的には以下のことをした。
・2乗系
・平均値で引き算・割り算
・他の変数との掛け算(◯◯×△△)
・count系
・切り捨て・切り上げ
・数値データのカテゴリカル化
・バス、車、徒歩の時間の統一
・PCA
・欠損値かどうかのダミー変数
・南向きかどうか、高層階かどうかのフラグ
このブログが神だった。
この特徴量も結構効いた。
正規表現
与えらるデータが汚すぎて前処理が辛かった。
>['8分', '17分'] >['山陽本線', '\t山手線']
こんな感じで切り取った。\tはreplace使って置換した、、。正規表現はまだまだ勉強が必要だと感じた。
グループごとに平均を取ってfillna
結局LightGBMしか使わなかったから欠損処理はしなかったけど、地価データの欠損値を区でgroupbyして平均で埋めるのができるようになった。
LightGBMのパラメータをoptunaで最適化
以下のサイトを参考にした。どのパラメータがどういう役割かは結構勉強になった。
クロスバリデーション
以下のサイトを参考。
Adversarial Validation
CV平均スコアは1.4万出るのにLBで3万とか出たから、trainデータとtestデータで違いがあるんじゃないかと疑いAdversarial Validationやろうとした。精度50%で全く分類できなかったから分布に違いはないと結論づけた。
アンサンブル
特徴量が違うモデル・パラメータが違うモデル・CVで分割したモデルなど色々混ぜた。
できなかったこと
精度向上
5分割のクロスバリデーションして平均スコアが1.4万出たのに、LBでは3万とか出たからずっと???っていう状況だった。目的変数(賃料)を特徴量に入れてないのにこんなにLBが低かったのが未だにわからない。どなたか教えてください。
同一物件の穴埋め
住所・間取り・面積・居住階・最高階・家賃が一致するデータが計2000件弱存在してたらしい。データを良く見れてなかったから気づけなかった。
group kfold
上記に気付ければ重複したレコードがleakしないように同じfoldに入れるgroup kfoldができたらしい。group kfold はまだ理解してないから勉強したい。
ユニークな特徴量の追加
緯度経度のスクレイピングが時間もお金もかかるということでやらなかったが
住所→緯度経度→〇〇からの距離を算出
住所→緯度経度→航空写真から画像を抽出
などは思いつかなかった。
これは本質情報なんですが、面積、築年数の次に港区ポテンシャルがfeature importance上位に来ました。港区からの距離の逆数です
— charm (@charmq00) November 7, 2019
座標から衛星写真取得してhogeみたいなことやった人いるのかな
— テツ (@tetsu316naga) November 7, 2019
空間的な可視化
与えられた住所を緯度経度に変換して、地図上に賃料をplotすると空間的に賃料の高低を把握できたのではないかと今考えた。
その他モデルを試す
LightGBM以外をやる必要があるかは知らないが試そうとする試みはあっても良かったかも。一位のチームはCatBoostを使ってたとか。
弊チームのマイナビコンペのソリューションのポンチ絵です!
— Kevin (@Kevinrobot34) November 7, 2019
オリジナルな名前も多いですけど、いろいろ頑張りました!! pic.twitter.com/DmBsidy2RN
※その他できなかったことは上位解法が公開され次第随時追記していきます。
振り返り
結果としては最終スコア17292で366チーム中88位でした。学生限定コンペなのでもう少し上に行きたかったなぁ・・・というのが正直なところです。CVスコアとLBスコアの差が解決せずLightGBMのお気持ちは最後まで理解できませんでした。結局一番精度が良かったのはコンペ始まって4回目に提出したモデルでした。残念。
しかし、このコンペに参加することで多くの収穫がありました。簡単に精度が上がらなかったからこそ多くのブログを読み、Kaggleで使える知見はかなり溜まったのではないかと思います。今まで入るだけ入って一切開いていなかったKaggler Slackのbeginners-helpチャンネルも大変役に立ちました。このチャンネルからはインターンで使えるLSTMのtipsも手に入れれたので今後は毎日チェックしていきたいところです。
yutori-datascience.hatenablog.com
初めてのコンペ参加になりましたがかなりの収穫があり参加して良かったです。マイナビコンペで思う結果が出せず結構悔しいので次はKaggleで頑張ります。
楽しいコンペでした!お疲れ様でした!
その他参考サイト
今年の冬もフリースが流行るのか?元アパレルバイトがZOZOTOWNのメンズランキングを分析した話
念願のファッションネタの記事です。最近スクレイピングを勉強したのでそのアウトプットとしてZOZOTOWNのメンズランキングトップ200からデータを取ってきて分析してみました。スクレイピングにあたりPythonのSeleniumというライブラリーを用いました。
また、タイトルにも書いた通り、僕は1年間ほど某セレクトショップでアパレル販売員としてアルバイトをした経験があります。その経験を生かし、実際の現場で感じた去年のトレンドと比較しながら書いてみました。
分析の目的
今回はZOZOTOWNのメンズランキングトップ200から「ジャケット/アウター」のカテゴリーに絞って分析をしてみました。
僕はインドにいるので正確にはわかりませんが、日本では少しずつ寒くなりお店にも冬物が並び出はじめ、冬物を目にする機会が増えてきたのではないかと思います。実際にあの有名なカナダグースはもう店頭で売られています。というかダウンが欲しくなる12月・1月にはもう完売しているため欲しい方は今買わなければなりません。
(このお店では7月からダウンが入荷しているみたいです🤔)
と言われても、夏のTシャツなどとは違いアウターは値段が高いので購入にあたり慎重な吟味が必要だと思います。また、誰しも今年の流行りは気になりますよね。流行りのものを着ているとオシャレに見られやすいのではないかと思います。
そんな方々のために今年のトレンドを理解して後悔のないアウター探しのお手伝いができるようになればと思いこのブログを書いてみました。もちろん「流行っているものを着ると人と被るから嫌だ」なんて方にもこの記事が参考になれば嬉しいです。
分析
使用するデータは以下のようなものです。カラムとしてはブランド名(brand)・アイテム名(item)・現在の価格(price)・値引率(discount)・定価(originalprice)・順位(rank)があります。
分析は以下の観点から行いました。
・価格
・ブランド
・形・素材
・流行りのコートの形は?
それでは順にみていきましょう。
価格
まずは価格について分析しました。要約統計量を確認します。
定価で見ると平均値は25790円、中央値は17600円となっています。アウターを買うにあたり予算が気になると思うのですが2万前後が目安となりそうです。ちなみに2万円以下で買えるものは122点ランクインしていました。
ブランド
次は流行りのブランドについて見ていきます。
メンズランキングトップ200のうち1位はフリークスストアでした。21点がランクインしているためランキングの10%を占めていることになりました。個人的にこの結果は結構意外でした。
しかしよくよくデータを見てみるとフリークス限定のノースフェイスの商品がランクインしてました。その数合計7点。
以上を踏まえると、結果的にはノースフェイスの商品が24点ランクインしていることとなりました。ノースフェイス圧倒的人気ですね!
形・素材
次は服の形や素材についてみていきます。去年のトレンドでいうと素材はフリースが流行ってました。ナイロンのブルゾンなども若い世代やレディースの方に人気だったように思います。またアウターの種類でいうとコートよりはダウンの方が売れていたようにも思います。それでは実際にランキングをみてみましょう。
ここは自分の感覚でコート(Coat)・フリース(Fleece)・ダウン(Downjacket)・マウンテンパーカー(Mountain)・レザー・ライダースジャケット(LetherRiders)・コーチジャケット(Coach)・ナイロン•トラックジャケット(SportsMix)・その他にカテゴライズしました。ジャケットやブルゾンといったものは定義が曖昧なのでここではその他として集計しました。
結果からまず注目すべきはフリースではないでしょうか。フリースが16点もランクインしているため今年もフリースは結構売れていると言えそうです。
コートは薄手のものから厚手のものまであるためランクインの数は必然って気に多くなるとは思いますが、ダウンがすでに売れだしているのも見てとれます。おそらく最近発売が始まりファッションの感度の高い人たちが購入しているのだと思いますが、今年も流行るのではないかと予想します。
そしてナイロンジャケットは9点のみのランクインとなりました。コーチジャケットやレザージャケットと個数がほぼ同じで、それらが流行っているようには思えないので今年はナイロン系はイマイチということかもしれません。
流行りのコートの形
最後は流行っているコートの形について分析してみました。チェスター・ステンカラー・トレンチ・モッズ...どれが流行りなのか、個人的に分析前から一番気になった項目でした。結果は以下のようになりました。
ほぼ同率ですがステンカラーコートが1位というのは意外でした。冬といえばキャメルのチェスターコートに白のタートルネックを合わせて黒スキニーという鉄板コーディネートがありましたが今はステンカラーもイケてるみたいですね。
また4年前ですかね、カーキのモッズコートがめちゃくちゃ流行ってた時期があったと思います。しかしそのブームは過去のものとなり今モッズコートを着ている人はかなり少数になっているのではないかと思います。実際ランクインしたモッズコートは1点のみでした。SEKAI NO OWARIのせいでモッズコートが着づらくなったなんて記事もありました。
このように流行りを過ぎてしまうと、当時はオシャレに見えて着やすかった物が着にくくなるなんてことも起こります。
まとめ
以上ザックリまとめると、
・ランクインしているアウターの平均は2万5000円くらい
・2万円前後のものを買っておけば、世間一般的な感覚と合いそう(チープだと思われないかも)
・人気ブランドはフリークスストア
・ノースフェイスが最強!一着買ってみよう
・フリースの流行りは今年も続く
・10月でもダウンも売れ始めている
・今年はステンカラーコートが流行りかも
こんな感じのことがいえそうです。今年のアウターを買う際の参考になれば嬉しいです。
以上が念願のファッションネタの記事でした。
次はコーディネートのレコメンドや画像の分類などもう少しデータサイエンスなことをしてみたいと思います。
時系列データに使える可視化のテクニック(Python)
こんにちは。大学院を少しお休みしてインドのITスタートアップでデータサイエンスのインターンをしているMasanori(Masanori_724)です。
インターンをしている企業はインド系の企業で日本人はおらず、また、インドに来て1週間経ちましたが未だに僕の住む街では日本人に出会ったことはありません。そんな環境でデータサイエンティストを目指して奮闘中です。
インターンではPM2.5の値の時系列解析に取り組んでいます。そのため、時系列解析についてよく調べているのですが、モデルの理論やコーディングの話は多いですがデータの可視化についてはあまり触れられていない印象でした。
時系列解析について色々調べてるけどモデルの理論+実装の記事は多いけど可視化について書いてる記事は少なそう
— Masanori🇮🇳 (@Masanori_724) September 24, 2019
しかし、僕は統計が専門ということもあって、ただデータを解析するだけでなくデータの分布をしっかり眺め理解することはデータ解析では重要なことだと感じています。
そこで今回はPythonでの時系列解析におけるデータの可視化方法をまとめてみました。
利用するデータ
今回扱うデータはRの組み込みデータとして有名なAirPassengers(飛行機乗客数)を利用します。こちらからダウンロードをしてください。
データは月ごとの飛行機の乗客数データで、期間は1949年1月から1960年12月までです。データの詳細は以下のリンクから確認できます。
まずはじめに、必要なモジュールをまとめてインポートしておきます。
import pandas as pd import matplotlib.pyplot as plt import datetime import statsmodels.api as sm from pandas.plotting import autocorrelation_plot from pandas.plotting import lag_plot from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 16,9
データの最初の5行のみ記載しておきます。
df = pd.read_csv("AirPassengers.csv")
df.head()
#pandas.Seriesに変換 series = pd.Series(df['#Passengers'], dtype='float') series.index = pd.to_datetime(df['Month'])
以上で準備ができたので、可視化に入ります。
時系列折れ線グラフ
まずは時系列折れ線グラフです。x軸は時間(月)、y軸は乗客数です。時系列折れ線グラフではデータを直接可視化できます。
plt.ylabel("Passengers")
series.plot()
plt.show()
以下のように書くことによって点で表現することもできます。
plt.ylabel('Passengers')
series.plot(style='k.') plt.show()
今回扱っているデータセットは12年間のデータがあります。そこで、年ごとにデータをグループ化し、年ごとに折れ線グラフを作成することもできます。
groups = series.groupby(pd.Grouper(freq='A')) years = pd.DataFrame() for name, group in groups: years[name.year] = group.values years.plot(subplots=True , legend=True) plt.xlabel("Month") plt.show()
上記のグラフの場合、年ごとに乗客数の大小を比較するのではなく、年ごとの折れ線グラフの概形を知ることが目的と言えそうです。また同年での月ごとの乗客数の大小の比較はできそうです。どの年を見ても夏場に乗客数が増え冬場に乗客数が減るという傾向がありそうです。(y軸の範囲は年ごとに異なっているので注意が必要です。)
以下のように一つのプロットエリアで年ごとの折れ線グラフを書くことも可能です。
groups = series.groupby(pd.Grouper(freq='A')) years = pd.DataFrame() for name, group in groups: years[name.year] = group.values years.plot(legend=True) plt.xlabel("Month") plt.ylabel("Passengers") plt.show()
このグラフだと同月の乗客数の年ごとの大小比較ができそうです。
ヒストグラム
次はヒストグラムです。日付の順序に関係なくデータの分布を見ることができます。右に裾が長い分布となっています。(binsの調整が難しい...)
plt.xlabel("passengers") plt.ylabel("frequency") series.hist(bins=15) plt.show()
密度plot
密度plotにすると観測値の分布の形状をよりよく把握できますが、この辺はまだまだ勉強が必要です。。。
series.plot(kind='kde')
plt.show()
箱ひげ図
次は箱ひげ図です。年ごとの最大値・最小値・中央値・四分位数を読み取ることができます。
groups = series.groupby(pd.Grouper(freq='A')) years = pd.DataFrame() for name, group in groups: years[name.year] = group.values years.boxplot() plt.xlabel("Month") plt.ylabel("Passengers") plt.show()
ヒートマップ
続いてヒートマップです。x軸は月、y軸は年を表しています。また、カラーバーが示すように明るい色ほど乗客数が高く、暗い色ほど乗客数が少ないことを示しています。このことからも夏に乗客数が多いこと、年々乗客数が増えていることがわかります。トレンドや季節性がもっと複雑なものだと読み取りが面白くなりそうです。
groups = series.groupby(pd.Grouper(freq='A')) years = pd.DataFrame() for name, group in groups: years[name.year] = group.values years = years.T plt.matshow(years, interpolation=None, aspect='auto') plt.xlabel("Month") plt.ylabel("Year") plt.colorbar() plt.show()
散布図
最後はラグplotです。t時点の乗客数とt+1時点の乗客数との相関関係を読み取ることができます。グラフからわかるように強い正の相関があることが見てわかります。
from pandas.plotting import lag_plot lag_plot(series) plt.show()
また1時点先だけでなく、自分が指定した時点(例えばt+1時点 vs t-6時点)の散布図をplotすることもできます。時点が離れるほど広がりが大きくなり相関が弱くなっていることがわかります。
values = pd.DataFrame(series.values) lags = 6 columns = [values] for i in range(1,(lags + 1)): columns.append(values.shift(i)) dataframe = pd.concat(columns, axis=1) columns = ['t+1'] for i in range(1,(lags + 1)): columns.append('t-' + str(i)) dataframe.columns = columns plt.figure(1) for i in range(1,(lags + 1)): ax = plt.subplot(240 + i) ax.set_title('t+1 vs t-' + str(i)) plt.scatter(x=dataframe['t+1'].values, y=dataframe['t-'+str(i)].values) plt.show()
以上が時系列データで使える可視化のテクニックでした。他にも使えそうなplotが見つかった場合には随時追加していきます。グラフからの考察にはそこまで時間をかけていないので、間違い等あればコメントください。
参考資料
あ、ちょっとインドに行ってきます🇮🇳
こんにちは。Masanoriです。タイトルにも書いたようにちょっとインド🇮🇳に行ってきます。
いつまで?なんでインド?何するの?ってところをまとめて行きたいと思います。
いつまで?
まずインドへの滞在期間ですが、今日(9/15)から3月末までの6ヶ月間を予定しています。そのため現在は大学院1年ですが半年間は大学院にはいきません。休学する(=学費を収めない)と大学院を2年で卒業できないと言われたため休学はしないことにしました。帰国次第、大学院2年としてとして復帰する予定です。
就活に関してもそのまま21卒でやろうと思っています。エンジニアは12月〜1月くらいが採用のピークだと予想してるでの、この期間に日本いないことは結構焦っています。
(人事の方々、直接お話することが難しいのですがSkypeにてカジュアル面談や採用選考を受けさせて頂けるとありがたいです。よろしくお願いします🙇♂️)
なんでインド?
なんでインド??って思われている方は多いと思います。簡単にいうとインドのITに興味があるからです。去年だとメルカリにインド人エンジニアが数十人入社したことがニュースで話題になりましたね。
インドのITの話は以下のブログや本などを読んで頂けるとわかりやすいかと思います。
インド・シフト 世界のトップ企業はなぜ、「バンガロール」に拠点を置くのか?
- 作者: 武鑓行雄
- 出版社/メーカー: PHP研究所
- 発売日: 2018/02/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
記事や本を見る限りインドのITはかなり熱いと思っています!
しかしまだその実情を体感したことはないので、インドで肌で感じ、そのことをテック情報をこのブログにてアウトプットしていきたいと思っています。
何するの?
このブログのメインですが、僕はインドに語学留学をするためでも、プログラミング留学をするために行くのでもありません。
僕はインドのITスタートアップにインターンをしに行きます。
もちろん、インドでエンジニアとして成長したい気持ちはあります。しかしそれだけでなく、スタートアップ大国のインドでどのようにサービスが生まれ、どのくらいのスピード感でサービスが立ち上がっているのかを肌で感じたいと思ってます。
僕がインターンをする企業は創業2年目のスタートアップです。具体的にいうと、インド中の気象に関するデータ(大気汚染指数など)を集めるために、創業2年でありながらデータを収集できるIoTデバイスをインド中に無料でばら撒いている日本では珍しい企業だと思います。
ポジションに関してはMLエンジニアで、大気汚染の予測ををすることがメインタスクだと思います。天気予報の大気汚染バージョンだと思います。しかし、スタートアップなのでMLエンジニアだけでなくデータの収集からなどデータエンジニアとしてのタスクも頼まれています。15人しかいないのでエンジニアのタスクで興味のあること全てに挑戦してやっていきたいと思います。また、この企業には日本人がいないので、積極的にコミュニケーションを取り英語力も向上させたいと思っています。
また、僕はこのインドインターンをトビタテ10期生として参加することになります。自分がエンジニアを頑張るだけでなく、留学や海外インターンの魅力も発信をする任務もあります。計画書や自由記述などなんでも相談に乗るので、トビタテに応募を考えている人はいつでもDM飛ばしてください。
まとめ
僕がインドでインターンをすると決めてからもう1年がたちました。インドのインターン先を探すためインド系の企業約100社にメールやDMを送ってきたので、それがようやく実現しそうとなりとてもとても感慨深いです。
フライトの時間まで残り7時間となりました。ワクワクはありますが、初インドなので不安もかなり大きいです。それでも来年の3月に、今この決断をしたことに自信を持てるよう6ヶ月間精一杯頑張りたいと思います。
強くなって帰ってきます💪
おわり
BEENOSのデータサイエンスインターンに参加してきました!
こんにちは、Masanoriです。
7/1~13までの2週間、BEENOSでデータサイエンスインターンに参加してきたのでそのまとめを書きます。(アウトプットが遅くなったのは下書きに1ヶ月以上眠っていたためです、、笑)
BEENOSとは
メインの事業領域は越境ECで、以下のようなミッションを掲げている企業です。
BEENOSのBEEは「ミツバチ」NOSは「巣」。持続的な共存共栄の象徴であるミツバチのように、世界中の起業家や 企業、そしてモノや情報をつなぎ、インターネットの力でボーダレスに日本と世界を繋ぐ「プラットフォーム」を創造し、世界の可能性を拡げていく事をミッションにしています。
詳しくは以下のサイトをご覧ください。
参加したきっかけ
BEENOSを初めて知ったのは4月に京都で行われたエンジニアキャリアセミナーでした。そのイベントで、「BEENOSには『バットを振る!』という基本精神があり、リスクをとったチャレンジ自体を賞賛する文化がある」と聞き、自分も自らチャンスを掴みに行こうと考えました。
また、BEENOSにはデータサイエンティストが1人(新卒1年目)しかいないため、インターン生も一社員として裁量権を持って業務ができることもきっかけでした。
やったこと
インターンの課題は「過去の購買履歴から自社ECにおける定着ユーザー(半年で2回以上利用)の特徴の可視化と予測」でした。2週間なので上記の課題しかできませんでしたが、理想は以下のような流れでした。
①定着ユーザーの予測(定着確率の算出)
②定着ユーザーの特徴の可視化
③定着ユーザーの利用金額の予測(回帰)
④利用金額の期待値算出(①確率×③金額)
⑤マーケティング予算の推定
またチャンスがあれば、予算分配の最適化までこなしたいです。
用いた手法と結果
予測に用いた手法は統計モデルと機械学習モデルの2つを試しました。
統計モデルは僕の研究のベースになっているGB/NBDモデルです。これはRFM分析をベースにしたもので、購買間隔と離脱に確率分布を当てはめて顧客の購買行動をモデリングするものです。数学的な話はFader(2005)をご覧ください。機械学習モデルはXGBoostを用いました。
結果の詳細はここでは述べませんが、XBoostはまずまずの予測精度でした。統計モデルの方はあまり精度が出ずまだまだ改良が必要だと感じました。現在は阿部(2011)を読みながら階層ベイズを用いたモデリングに取り組んでいます。
最終日には最終プレゼンを行いました。CEO、COO、人事の方や新卒の方など多くの方の前で発表しました。モデルの仮定やXGBoostの変数重要度、可視化の結果に対しては議論が白熱し、発表と質疑応答を含めると1時間ほどかかりました。僕の分析結果からすぐマーケの施策が打たれたようで、スピード感には驚きでした。
感想
使いたいデータの全てが使えた
これってデータサイエンス系のインターンでとても大切ですよね。顧客の購買データや属性データ(ID等はハッシュ化したもの)、どのデバイスから利用したかなど過去数年分を使いたいだけ使ってモデルを構築することができました。2週間で全てのデータを完全に可視化することは不可能でしたが、豊富なデータ量は最高な環境だったと思います。
BEENOSの人がいい
これは1on1イベントの時から感じていましたが、親身になってくれる人、情熱的な多かったように思います。また、新卒が10人なので、毎日お昼にはラウンジに集まりみんなでご飯を食べたり、終業後にはもくもく会をするなど規模感や居心地が丁度いい感じでした。それだけでなく、ポーカーをしたり、インターン最終日には新卒の方の家で朝まで飲みつつゲームしながらインターンの振り返りをするなど本当に最高なインターンとなりました。
インターン最終日からの月例会の懇親会からの新卒の人の家でオールして、酔った勢いで本音で語って、ほんまにエモい2週間のインターンだった。
— Masanori🇮🇳 (@Masanori_724) July 12, 2019
以上がBEENOSでのインターンのまとめでした。
企業の意思決定に関われるデータサイエンティストって最高ですね!
最後まで読んで頂きありがとうございました。