TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

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

f:id:tbtech:20190605165936p:plain
今回はKaggleのつづき!
データの可視化を重点的にやっていきます。

前回特徴選択して選ばれたのは、
main_categoryの[ Art, Comics, Film & Video, Games, Music, Theater] でした。
どうしてこの変数が選ばれたのか??
データを隅々まで見ていこうと思います。

これって一番最初にやることじゃ...?

'main_category'の可視化

まずはmain_categoryのユニークな要素を表示します。

df['main_category'].unique()

結果は
['Publishing' 'Film & Video' 'Music' 'Food' 'Design' 'Crafts' 'Games'
'Comics' 'Fashion' 'Theater' 'Art' 'Photography' 'Technology' 'Dance'
'Journalism']
これらの数が知りたい場合は、uniqueの前にnを追記するだけ。

df['main_category'].nunique()

そうすると、[15]と表示されました。

数の多さランキング

次にこれを多い順でグラフに表示させてみます。
グラフの種類は'barh' : 横向き棒グラフ、図の大きさfigsizeは自由に決めます。

df['main_category'].value_counts().plot(kind='barh', 
                                        figsize=(10,6), 
                                        title='Main Categories')

f:id:tbtech:20190605104308p:plain
上位から[ Film & Video, Music, Publishing, Games, Technology, Art ]でした。
選ばれた6つのうち4つが上位に入っていますが、Comicsなどは多くありません。

成功の多さランキング

数の多さはわかってもそのうちどれだけ成功しているかが大切!
ということで、main_category毎の成功数を多い順に表示します。

まずはsuccessfulという変数に、全体のうち成功しているプロジェクトを入れます。

successful = df.loc[df.state=='successful']

続いてグラフ化します。
グラフの種類は棒グラフで、
x(軸)は、先程作ったsuccessful(つまり成功したプロジェクト)の中の
main_categoryのindex(項目)を設定します。
height(縦軸)は、successfulのmain_categoryのvalues(数)を設定します。
plt.setpの中ではx軸の名前部分が重ならないように、字の角度を60に設定しました。
plt.tight_layout()も同様に名前部分の配列をきれいにしてくれます。

ax = plt.subplot()
plt.bar(x=successful.main_category.value_counts().index,
        height=successful.main_category.value_counts().values,
       )
plt.setp(ax.get_xticklabels(), rotation=60)
plt.tight_layout()
plt.show()

f:id:tbtech:20190605115233p:plain
結果を見ると[Music]が一番多いのか!!

だまされてはいけません^^
元々のプロジェクト数に違いがあるので成功数ではなく、成功率を見ないといけませんねー

そこで各main_categoryの数で成功数を割ります。
heightの値の/ から後ろを追加しました。
DataFrameの中のmain_categoryの数で割るという意味です。

ax = plt.subplot()
plt.bar(x=successful.main_category.value_counts().index,
        height=successful.main_category.value_counts().values / df.main_category.value_counts().values
       )
plt.setp(ax.get_xticklabels(), rotation=60)
plt.tight_layout()
plt.show()

f:id:tbtech:20190605131342p:plain
結果はこのようになりました!
並べ替えの方法がわからず、少し見辛いですが...
[Film & Video, Technology, Fashion, Crafts, Music, Games] の順番で成功率が高いです。
特徴選択された6つのうち3つが上位に入りました。

因みに失敗率の多さランキングは下図のようになりました。
f:id:tbtech:20190605133120p:plain

成功率に比べ、失敗率はあまりバラつきがありません。
そこで成功率と失敗率の平均と標準偏差と変動係数を求め、バラつきを比較してみます。

必要なライブラリをインポートします。

from statistics import mean, stdev

sucという変数にグラフ化の時と同様に、成功したプロジェクトの中にあるmain_categoryの要素を入れます。
それをmeanとstdevに渡すと、平均と標準偏差の値を返してくれます。
変動係数は標準偏差を平均で割って求める数値で、バラつき度合いを比較できる数値です。

suc = successful.main_category.value_counts().values
mean_suc = mean(suc)
stdev_suc = stdev(suc)
cv_suc = stdev_suc / mean_suc

print(cv_suc)

同様に失敗率の変動係数も求めます。

成功率の変動係数は、[0.8481]
失敗率の変動係数は、[0.7103]

数値からも見てわかるように、成功率にはバラつきが大きくありました。
成功するかを予測するためには、
main_categoryの違いが影響する可能性が高そうです。

まとめ

以上の結果から特徴選択に
main_categoryの[ Art, Comics, Film & Video, Games, Music, Theater] が
なぜ選ばれたのか??を完全に解明することはできませんでしたが、
そもそも前回の学習結果の精度は正答率が61.9%程度なので、上記の特徴選択も正しいとは言えません。
今回のデータの可視化で全貌の一欠片くらいは見えたのではないでしょうか?
見えたよね?

次回もデータの可視化を続けてやってみたいと思います!
隠されしデータの全貌を求めて!!