データ分析コンペに参加してみよう

#　1.はじめに
　データ分析コンペティションに参加しよう！と意気込んでkaggleを見てもなんのこっちゃ。
 　ハードルを下げてSIGNATEに参加しようと思ってもなんのこっちゃ。一応コードを丸パクリして提出までは行けても何がどうなっているのかがよくわからない。結局、SIGNATEから離れてしまった。そんな方達にもわかりやすいように**一連の流れを図を用いて表現しています**。一部、厳密にいえば正しくない点もありますが今回はわかりやすさを優先します。
 　図で説明した部分について以下のようにPythonコードを付属させている場合があります。図で行っている作業をPython上で実装したい場合はコードを参照してください。(**初学者はPythonコードは参照しないことをお勧めします**)
　今回扱うのは**テーブルデータ**に関してです。

```python:sample.py
この部分に対応するpythonコードを記述します
```

#　2.簡単な全体の流れ
![スクリーンショット 2021-10-14 16.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/89d0e292-9097-b369-a519-6ce5a976680c.png)

 　SIGNATEからダウンロードできるのは上記3つであることがほとんどです。(拡張子がtsvの場合もあります)
　ここでごちゃごちゃ説明されてもわからないと思うので、少し例を見てみましょう。

　今みなさんは高校3年生です。
　1月にはセンター試験がありますね。そこに向けて問題集やら参考集やらで勉強します。問題を問いて答え合わせをして間違い直しをします。
　時は早いものでもうセンター試験当日です。
　さて、みなさんの手元には数学の問題用紙と回答用紙が存在します。今までの知識を総動員して問題を解きました。回収されるのは回答用紙だけです。途中がどうであれ、僕たちの点数はこの紙一枚に集約されました。
　2ヶ月後くらいには点数がなんだか細長い紙にプリントされて返ってきました。

　何を言ってるんだ、となっている方もいると思いますが大丈夫です。では見ていきましょう。
　上の例で「問題集やら参考集やら」としたのが**訓練データ**です。
　次に「数学の問題用紙」としたのが**評価用データ**です。
　最後に「数学の回答用紙」としたのが**応募用サンプルファイル**です。

　つまり、評価用データで学習をしてその解法を評価用データに適応しそこから得た自分なりの答えを応募用サンプルファイルに入れてSIGNATEに提出をします。そうすると、結果が返ってきます。これが簡単な流れになります。

　ここまで理解できた方はわかるかと思いますが、僕たちがパソコンをカタカタして色々するのはほとんどが「訓練データ」に関してです。つまり、これからはずっと訓練データに関して触れていきます。
　が、最初にこれらのファイルをPythonで動かせるようにしなきゃいけないのでそこからいきましょう！！

#　3.データをPython上で動かせるようにしよう

　さて、図示をする前にpythonでデータを読み込めなくてwebで調べると「パスがどうこう」「階層がどうこう」って言われます。
　でもパスとは何かを知らん！わからないものをわからない言葉で説明されてわかるわけがない。はい、無理ってなりません？僕はなりました(笑)
　ってことでできるだけ難しい言葉は使わずに説明していきます。
![スクリーンショット 2021-10-14 18.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/131249ba-4a91-28f9-ce4a-7ddeba96787a.png)


　上みたいな状況を考えます。これもグダグダ書いてもわかるものじゃないので例を見ていきましょう。

　3階建てのアウトレットに来てます。アウトレットは「A」「B」「C」の3つのゾーンに分かれています。
　あなたは「A」ゾーンの1階にいます。
　さて、「A」ゾーンでの買い物は終わり「B」ゾーンの1階にあるお店を目指しましょう。しかし1階では「A」ゾーンと「B」ゾーンは繋がっていません。一度2階に上がって「A」ゾーンから「B」ゾーンに移動をしてから1階に降りてお店を目指します。

　上の例で示した、「あなた」としたのが**実行したいPythonファイル**です。
　次に「ゾーン」としたのは**各フォルダ**です。
　最後に「お店」としてのは**データのファイル**です。

　ここで注意が必要です。パソコン上では必ず**自分がいるところが一階に指定されます**。今後、ディレクトリを学んでいく上で重要な部分になると思われますので、今は理解ができなくてもとりあえず自分がいる部分は必ず**1階**になるということを覚えておきましょう。

  　さて、上記の図を例を用いて理解をしてもらえればと思いますが、三階には一つのゾーン(フォルダ)しかありません。二階には2つのゾーン(「データ分析」・「アルゴリズム」)と一つの店舗(データ3)が存在します。そして、「データ分析」というゾーンの1階にはあなた(pythonファイル)と一つの店舗(データ1)があります。「アルゴリズム」というゾーンの1階には一つの店舗(データ2)が存在します。

　あなたが、「データ1」の店舗に入るには歩けば良いだけです。しかし「データ3」を得るためには2階に上がる必要が、「データ2」を得るには2階に上がってゾーンを移動して1階に降りる必要があります。Python君は勝手に歩いてはくれますが、勝手に階段を降りたり登ったり、別のゾーンに移動してはくれません。(そんなことしたら大変ですよね笑)
　なので、**別の階・ゾーンにあるデータをもらうときはPython君に「階段を降りて、登って」・「ゾーンを移動して」という命令を出してあげなければなりません**。

以下でここまでの作業をPythonコードで書いていきます。(今回データを入れているファイル名は上にある図示と一致させます(例:データ1→data1.csv))

```python:sample.py
import pandas as pd #ライブラリのインポート
df = pd.read_csv('data1.csv') #同じ階・ゾーンにデータが存在する場合(データ1)
df = pd.read_csv('../data3.csv')#一つ上の階にデータが存在する場合(データ3)
df = pd.read_csv('../アルゴリズム/data2.csv')#別のゾーンにデータが存在する場合(データ2)

#階段を一個上がる命令
'../'
#階段を上がって「アルゴリズム」というゾーンへ移動する命令
'../アルゴリズム'
#2階に上がって「アルゴリズム」というゾーンへ移動し1階へ降りてdata2.csvというお店に入る
'../アルゴリズム/data2.csv'
```

#　4.訓練データを利用しよう

　話が若干前後しますが、訓練データは「問題集やら参考集やら」だったことは覚えていますかね。
　それを覚えていてくれればこの章の話は全く難しくありません
　では見てきましょう！
![スクリーンショット 2021-10-14 22.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/ba227558-da95-c5db-e368-079b4a990b4f.png)

　いきなり、図が出てきて知らない言葉の羅列に驚いたかもしれませんが難しいことはありません。
　何度も繰り返しますが、訓練データは「問題集やら参考集やら」のことです。これらは「問題」と「解答」が分かれていますよね。解答が後ろの方にまとめて記述されていたり、別冊になっていたり。。
　SIGNATEの訓練データも似たような作りになっています。単に「問題」部分を「説明変数」、「解答」部分を「目的変数」と名前をつけているだけです。こういうなんだか難しそうな言葉を使うと初学者は離れていくと思うのですけど、、まあそんな話は置いといて訓練データのどこが説明変数になってどこが目的変数になるのでしょうか。![スクリーンショット 2021-10-14 22.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/86a28887-489d-cdef-a591-748f1aa6f4df.png)

　ここで、SIGNATEの画面を見ていきます。一応何かあったら怖いので必要ない部分は全て隠しています。この画面は自分が参加したいコンペをクリックしてもらって「データ」タブをクリックして下にスクロールすると同じような画面が出てきます。まあ、参考までに。
　てことで重要なのは黄色く塗られた部分です。ここが「解答」部分(目的変数)で、他のは全て「問題」部分(説明変数)になります。
　お気づきの方もいると思いますが、**与えられたままの状況では問題文と一緒に答えが乗っちゃってます**。イメージで言えば問題文があって下にある解答欄に全部答えが記入されてるイメージです。それだと答えがわかっちゃってるので解く意味がなくなりますよね。というより答えを見ながら解いても意味ないですよね。ってことで面倒ではあるんですけど、図の形で訓練データの中にある説明変数(「問題」部分)と目的変数(「解答」部分)を別個に分けます。分けた時に、説明変数部分から目的変数を消すのを忘れないでくださいね。分けたら上の図みたいになるわけです。

ここまでをPythonコード使ってみていきましょう。

```python:sample.py
import pandas as pd #ライブラリのインポート
#訓練データをPython上に入れる
df = pd.read_csv('train.csv') 
#問題文とは別個に解答がまとまった冊子を作ります(ヘッダ名称とは上記写真内にある「ヘッダ名称」と同じです)
target = df['(解答部分にあたるヘッダ名称)'] 
#問題文内から回答を消します(axis=1は列を消すよってことを言ってます)
df = df.drop(['(解答部分にあたるヘッダ名称)'],axis=1)
```

# 5.分類器を作成しよう
　またなんのこっちゃわからん言葉が出てきたと思われると思いますが、心配いりません。また難しくないことを難しそーうに書いているだけです。![スクリーンショット 2021-10-14 22.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/9e7163da-4d57-4fb4-66cf-647c03ba27a8.png)

　さっきまでで、訓練データを説明変数(「問題」部分)と目的変数(「解答」部分)に分離しましたよね。次は問題と解答を交互に見ながら解法を作っていこうというお話です。で、この解法部分が「分類器」と呼ばれ、**解法を作成することを「分類器の作成」**と言います。
　数学の問題と一緒で解法は幾つでもあります。ですが、数学の解法と同じで正解率が高くなる解法は存在します。つまり、**正解の解法は存在しないけれども限りなく正しいと呼べる解法は確かに存在します**。
　データコンペティションはこの限りなく正しい解法を生み出す作業なのです。
　しかし、一から解法を作り出すのは難しいためすでに用意されているものがいくつも存在します。が、今回ここはスルーします。
　また具体的な分類器の使用もしないことからPythonコードもありません。
　ここは今はイメージの中で大丈夫です。実際にデータ分析をする際に「Python 分類器」で調べると優秀な方々が記事をたくさん書いてくださっています。また、最初から問題を解けないのと一緒で最初から分類器の作成なんてできません。最初はコピペをしながらどんな風に問題を解いているのか、どのような問題に威力を発揮するのかを体験するところから始めてみましょう。

#　 6.分類器を評価データに当てはめよう
　ここまでくればもう難しいことはありません。最初の方に説明しましたが、評価データは「センター試験」のようなものです。さらに5章で解法についても学びました。
![スクリーンショット 2021-10-14 23.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/d0201e67-feb2-7144-cf3b-d342854c8ae7.png)

　評価用データは「センター試験」です。当たり前ですが、答えが最初から書いてあるわけじゃないですし、自分で解答を別冊にうつすなんで操作も必要になりません。(もし必要なら大問題ですよね笑)
　ここで僕たちがやらなきゃいけないのは今まで学んできた解法を全く同じように生かすことだけです。センター試験とは違い、人間ではなく機械(Python)が回答を記入していくので緊張で解けなかった、、なんてこともありません。
　ここではなんの祈りも通用しません。もっと問題を解いておけばよかった、なんて考えてももう遅いです。自分がやってきたものそのものをテストにぶつけることしかできません。
　何を言いたいのかというと、ここで**何か特別な作業は必要になりません**。今まで訓練データを使って作ってきた分類器(解法)をあくまで全く同じように評価データに使います。
　そうすると、Pythonが答えを返してくれます。ここまでで答えを出すことに成功しました。最後にその答えを回答用紙に記述する過程が残っています。では、最後にそこをみて終わりましょう。
　今回も具体的な操作がないため、Pythonコードは省略します。

#　7.答えを応募用サンプルファイルに入れよう
　さて、長かったこの記事も終わりが見えてきましたね。あとひと踏ん張りです！
![スクリーンショット 2021-10-14 23.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2135815/2d0eab9e-45ab-0ee7-d884-288170315c24.png)
　
　では、つい先ほど得た答えを回答用紙に記入していきましょう。SIGNATEの中では応募用サンプルファイルが解答用紙に当たるんでしたよね。応募用サンプルファイルはセンター試験の解答用紙とほぼ同じです。問題番号が振られており、それに対応する答えを記入していきます。
　つまり、応募用サンプルファイルの一行目はいわば「問題番号」が振られています。なので二行目に解答を記入していきます。
　二行目にこれまでで得た解答を記入すればもう終わりです。と言いたいところですがそうは問屋がおろしません。笑
　何が問題なのかというと、手元に答えが入った解答用紙があるのは良いのですが黙っていたままでは試験官が解答用紙を取りに来てはくれません。というより、**解答用紙は自分から試験官に出しに行かなきゃ行けません**。なので解答用紙を自分のパソコン上に落として、そのファイルをSIGNATEという試験官に提出します。そこまですれば本当に終わりです。
　最後に7章で触れた操作についてPythonコードでみていきましょう。(結構難しいので一旦スルーでも大丈夫です)

```python:sample.py
import numpy as np
#6章で得た解答をy_predに入れる(行列にする必要がある)
y_pred = np.array(['予測された値'])
#応募用サンプルファイルのインポート(ヘッダーがふられているのでheader = Noneで削除)
df_sample = pd.read_csv('sample_submit.csv',header = None)
#応募用サンプルファイルの2列目を選択してそこにy_predを入れる
df_sample.iloc[:,1] = y_pred
#df_sampleを自分のパソコン上に落とす(ここでもヘッダー・フッダーを落とす必要あり)
df_sample.to_csv('(自分の好きな名前).csv',header=None,index=None)
```

#　8.さいごに
　最後まで読んでくださりありがとうございました。また、お疲れ様でした。
　
　最初にも述べましたが厳密に言えば間違っている部分も存在しますが重要な部分はできるだけ簡単に、できるだけ厳密性を欠かないように配慮しています。また、初学者の方は流れを掴んでいただくだけで良いと思います。最初からPythonコードに手を出してもわからないものにわからないものが積み重なって嫌になってしまうものです。できないことは決して恥ずべきことではなく、できないことに挑戦しようとしている今の姿勢ほどかっこいい姿勢はないと思います！

　今回の記事がほんの少しでもためになっていれば幸いです。