駆け出し文系エンジニアのデータサイエンス初歩

初めまして@tomusong7です。
DeNA22卒内定者で、大学では経済学部経営学科を専攻しています。
去年たまたまプログラミングに触れる機会があり、そこからのめり込みました。
今回はデータサイエンスそしてKaggleについて初歩の流れをまとめたいと思います。

##データサイエンスを知るまで
去年から作り始めたアプリを作り終えて、内定が決まり、次にやることを考えていたときに
Kaggleの存在を知りました。DeNAの[HPにも書いてある](https://dena.ai/kaggle/)のですがKaggleというのはデータ分析のコンペで企業からデータを提供されて、商品の購買の有無や客数など様々なものを予想する大会です。
優秀な成績を残すと賞金も出ており、[こちら](https://www.kaggle.com/c/passenger-screening-algorithm-challenge)のアメリカの国土保安省の開催したセキュリティ脅威に関する大会はなんと150万ドル日本円にして約1億5千万ほどの賞金が出ました.
日本でもユニクロやメルカリなど様々な企業が参加しており国内外での人気も高まっています。
自分のプロダクトにデータ分析の指標を入れたいという思いからデータサイエンスを始めようと思いました。

##データサイエンスKaggleの概要
基本的に[Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437)という本を参考にして書いております。
良ければ読んでみてください。
細かい提出方法などよりは全体的なデータ分析の流れを書きます。

１:データの分析の目的や背景、データセットを読み込む
↓
２:データの処理を行う
↓
３:モデルを作る
↓
４:モデルの評価をする
↓
５:新たな特徴量を入れる。

主にこのような流れです。まだ私も駆け出しなので間違っているところもあると思いますが
私はこのような流れで進めております。

##１ データ理解(EDA)
データ理解はこれからする全ての工程で関わってくる非常に重要なものになってきます。
まずはそのデータを与えている企業や団体の説明を読みます。
それでこのコンペの意図やデータセットがどのような意味を持つか理解します。
この[タイタニックコンペの場合](https://www.kaggle.com/c/titanic)Overviwを確認します。ここでこのコンペの目的や背景、概要が書かれています。特にDescriptionとEvaluationを見てみましょう。
ここに評価指標も書かれているのでチェックしてみてください。
次にDETAという場所を確認します。
ここで与えられている各データに関する説明とデータがダウンロードできるようになっています。
ここでダウンロードしましょう。
またKaggleではなく自分のプロダクトでデータを取る場合ここのデータの取り方なども難しい、、
![スクリーンショット 2021-12-19 17.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686344/f0c77890-aa33-61a4-615b-066cc58668a0.png)
![スクリーンショット 2021-12-19 17.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686344/008229eb-a120-1259-7060-b8ff7237600d.png)



##２ データの処理を行う
これは主に欠損値やはずれ値を処理する工程です。
欠損値とはそのデータセットにデータが入っていない値で、外れ値とは明らかにおかしい値が入っている値のことを言います。
このようなデータに対しては適切な処理を行わないとデータが正しく反映できないので処理をしていきます。
実際には`train.isnull().sum()`みたいなコードで全体の欠損値を把握して一つ一つに-9999みたいな絶対にありえないような数値を入れたり、他の数値の平均値をとり、それを代入したりします。
他にも下のような形でcolsの中にコラムを入れて文字になっているものを数字に直すこともできます(label encoding)

`from sklearn.preprocessing import LabelEncoder
     cols = ["NAME","WORK","LIKE"]
for c in cols:
  le = LabelEncoder()
  le.fit(train[c])
  train[c] = le.transform(train[c])
  test[c] = le.transform(test[c])`

##３ モデルを作る
これは前工程で処理を行ったデータを反映させれるモデルを作ります。
このモデルにこれから特徴量(与えられているデータやこれから作るデータ)を反映して数値を予測していきます。
モデルもいろいろな種類があり、最後にアンサンブルと言われる、モデルを組み合わせて予想するという方法もありますが、始めたての頃は決定木モデルと言われるGBDTモデルでいいと思います。
その中でも汎用性が高い[ligthGBM](https://lightgbm.readthedocs.io/en/latest/)を使ってモデルを作ります。
`from lightgbm import LGBMClassifier
lgb = LGBMClassifier(random_state=0)
lgb.fit(X_train, y_train)
lgb_train_pred = lgb.predict_proba(X_train)[:, 1]
lgb_valid_pred = lgb.predict_proba(X_valid)[:, 1]`


##４ モデルの評価
これは与えられるデータ(trainデータ)を分割してこのモデルが正しく反映されているか、特徴量の重要性などを判断します。バリデーションの方法ですが、私が使いやすく、一番testデータと乖離がないと感じるのはクロスバリデーションと言われる方法です。
ここの[kfold](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html)を用いて書いていきます。

`from sklearn.model_selection import KFold
kf = KFold(n_splits=4, shuffle=True, random_state=71)
tr_sep, va_sep = list(kf.split(train_x))[0]
tr_x, va_x = train_x.iloc[tr_sep], train_x.iloc[va_sep]
tr_y, va_y = train_y.iloc[tr_sep], train_y.iloc[va_sep]`

##5 特徴量作成
これはデータを読み込んだ上で新たな特徴量を作成する項目です。データセットの中で新たに作れそうなデータを探します。
]まずはデータを読み込みデータを組み合わせて新たな特徴量を作ります。
この部分が一番コンペの肝になることが多いと思います。
ここは非常に難しい分野です。
ただ、モデルを作るの工程で作ったlightGBMのモデルは掛け算を反映しづらいという特徴があるので掛け算、割り算で作ってみるといいかもしれません。
データの理解が進んでいればデータ通しの関係性から新たなデータを生み出すようなことも可能です。
曜日や家族の関係性、普段そのような業務をしている人がどのように指定決めているかなどの考えがあれば新たな特徴量も思いつきやすいかもしれません。

##最後に
特徴量を作っていて思うのが自分の他の経験が生かされるケースが多い。
本で読んでいて知っていることが生かされるケースも多く、データサイエンス以外の幅広い教養や思考がデータサイエンスには重要なように感じています。
ここまでで興味を持てた方は是非タイタニックにチャレンジしてみてください。
また自分の作ったサービスがある方はそのデータを元にデータ分析しても楽しいかも！