テービーテックのデータサイエンス

未経験リケジョがゼロからデータサイエンティストを目指す姿を記す奮闘記です。2019/12/05文系出身者が共同で更新を開始

TAG index

Kaggleに挑戦しよう! ~隠されしデータの全貌②~

f:id:tbtech:20190612173329p:plain
前回に引き続き、Kaggleのデータセットを使ってデータの可視化をしていきたいと思います。

Kaggleシリーズ第一回はこちら👇👇
ds-blog.tbtech.co.jp

前回は特徴選択で選ばれた[main_category]という変数に着目して可視化しました。
今回は[country]つまり国名に着目してみます!
前回の記事と一緒にご覧いただくとわかり易いです👇👇
ds-blog.tbtech.co.jp

countryの可視化

countryランキング
前回同様にcountryのユニークな要素を表示します。

df['country'].unique()

結果は
['GB' 'US' 'CA' 'NO' 'AU' 'IT' 'DE' 'IE' 'ES' 'MX' 'SE' 'FR' 'NL' 'NZ' 'CH' 'AT' 'BE' 'DK' 'HK' 'LU' 'SG']の21個です。

では多い順に15個並べたグラフを表示させます。

df['country'].value_counts()[:15].plot(kind='barh', 
                                       figsize=(8,5), 
                                       title='Top 15 countries')

f:id:tbtech:20190611103524p:plain
結果はなんと!ぶっちぎりでUS(アメリカ)が1位でした!
どれくらいぶっちぎってるのか気になるので、数値で見てみましょう。

df['country'].value_counts()

f:id:tbtech:20190611103955p:plain
1位のUSは2位のGB(イギリス)の約10倍もあることがわかります!

全体のうちUSの占める割合
次にプロジェクト全体におけるUSの割合を見てみます。
[1]len(df)でdfの行数、つまり全プロジェクトの数を取得します。
[2]vcという変数に今表示したランキングを入れます。
[3]そのvcの0番目は1位のUSの数なので、それをlenで割り100をかけて%表記にします。
[4]以上の計算結果をprintで表示します。roundは小数点以下を(今回は2)でまるめる機能です。

len_df = len(df)
vc = df['country'].value_counts()
usa_per = vc[0]/len_df*100
print(round(usa_per,2),'%')

結果は[80.66%]でした。8割ものプロジェクトがUSで立ち上げられたんですね!

countryとmain_categoryの可視化

次はcountryとmain_categoryの関係を見てみます。
前回記事でmain_categoryの多い順ランキングはこのようになりました。
f:id:tbtech:20190605104308p:plain

US以外の国のmain_categoryランキング
ではUS以外の国でのmain_categoryランキングを見てみましょう。
[1]まずはUSを抜いた国々で新たにDataFrameを作ります。
[2~]前回と同様にmain_categoryのランキングを表示します。

not_us_country = pd.DataFrame(df[df['country']!='US'])
not_us_country['main_category'].value_counts()[:15].plot(kind='barh', 
                                        figsize=(14,6), 
                                        title='Main_category')

f:id:tbtech:20190611114815p:plain
それぞれの上位5個を比較します。


f:id:tbtech:20190611115107p:plain
USを含む上位5個
f:id:tbtech:20190611115132p:plain
US以外の国の上位5個
大きく変わるものはありませんが、[Music]は2→6位に、[Design]は7→4位に変わりました。
[Film & Video]は変わらず1位であることもわかりました。

US以外の国のmain_category毎の成功率
main_category毎の成功率も比較してみましょう。
コードは前回の記事と同じです。

f:id:tbtech:20190605131342p:plain
USを含むmain_category毎の成功率
f:id:tbtech:20190611160155p:plain
US以外の国のmain_category毎の成功率
US以外の国は全体的に成功率が低くなりました。
しかし、[food] と [Journalism] だけはUS以外の国の方が高くなりました。

国別の成功率
続いて、国別の成功率を見てみます。
コードはカテゴリ毎の成功率のコードの'main_category'の部分を'country'に変えるだけです。
f:id:tbtech:20190611161805p:plain
この結果から、[US, GB, DK,]は30%前後の成功率で、その他は20%前後、
[MX]はかなり低めで5%程度であることがわかりました。

goalの可視化

次は[goal](目標調達金額)を可視化していきます。

最近ヒストグラムの表示を学んだのでやってみます!
.hist()とするだけ!とっても簡単^^

df['goal'].hist()

f:id:tbtech:20190612152401p:plain
結果を見てみると..なんだこれは?
0の辺りがドーンと高く、他はあるのか無いのか?
[goal]を詳しく見てみるために、.describe()を使います。
これで[goal]の分布の具合がわかります。

df['goal'].describe()

f:id:tbtech:20190612152703p:plain
結果によると、75%の値まではそれ程開きはないですが
最大値が飛び抜けて大きな値であることがわかりました。

この結果から外れ値除去をしようと思います!

外れ値除去

外れ値とは:他の値から大きく離れた値で、記録ミスなどによるものは異常値とも言います

今回は「ハンペル判別法」で外れ値除去をします。
この方法は平均ではなく中央値で計算をするので平均が大きくずれているデータに有効です。

[1].medianで[goal]の中央値を求めます。
[2]中央絶対偏差の1.4826倍した値を、標準偏差の変わりに使います。
[3][2]で求めた値の3倍の値より外の範囲を外れ値として、全データから外れ値範囲にある値を引きます。

med = df['goal'].median()
MAD = 1.4826 * np.median(abs(df['goal']-med))
df = df[(med - 3 * MAD < df['goal']) & (df['goal'] < med + 3 * MAD)]

外れ値除去した後のヒストグラムを表示します。
f:id:tbtech:20190612160343p:plain
とても見やすいグラフになりましたー^^!

ついでに[period]も見てみると外れ値があったので;;
外れ値除去をした結果がこちらです!
f:id:tbtech:20190612161105p:plain
[period]は期間なので30日辺りが一番多いのも納得ですね!

学習やり直し

2つの説明変数の外れ値を除去したので、精度良くなっているかも?
と期待を込めて再び学習をやってみました!
f:id:tbtech:20190612172434p:plain
結果は!
正答率と適合率が良くなりましたー^^*
再現率は下がりましたが、F1値はそんなに変わらないから良いかな^^;;?

まとめ

[country]を可視化すると、USが圧倒的に多く、USとその他の国とでは
人気のカテゴリーや成功率に少なからず違いがあることがわかりました。
この結果から、国や地域別にモデルを作るなどの方法もいいかもしれません。

また、[goal]を可視化してみると外れ値を含んでいることがわかりました。
[period]の外れ値も除去できたので、モデルの精度の向上に繋がりました!