この記事の内容

この記事では私自身の体験について「データ分析ってなにそれおいしいの」から
「データ分析やったことあります」になるまでの過程を振り返っています。

その過程を著し読んで頂くことによって
データ分析を始めてみたい人へのとっかかりをつくることを目的としています。

そのため技術的な紹介は控えめに、データ分析ってどんな流れでやるのだろうか
ということを想起させることを主眼において書いています。

気軽な読み物として読んでいただいて
データ分析を始めることのサポートになればうれしいです。

   想定対象読者

・データ分析をやったことがない、これから始めようとしている人
・データ分析コンペに参加してみようと思っている人

   想定読了時間

3分(流し見でOK)

準備

   実行環境として必要なもの

データ分析をするのに特別なものは不要です。
今これをみているPCがあれば最低限のデータ分析はできます。
会社のPCで実行するときは各企業のルール申請に則った手続きをしましょう。
(一応)

   やること

必要なことは2つだけ。
①PCにpythonをインストールします。「python インストール」などで
ググるとインストール方法は出てきますが、例として一つご紹介をしておきます。
Pythonのダウンロードとインストール

②pythonをインストールしたら、jupyter notebookも一緒にインストールします。
Jupyter Notebookは、ブラウザ上でpythonを対話型で実行できる環境です。
Jupyter Notebook

無事インストールに成功するとpythonの場合
このようにコマンドを打つとインストールしたpythonのバージョンが表示されます。

  C:\Users\hoge>python --version
  Python 3.10.8 

jupyter notebookの場合、このようにコマンドを打つと
インストールされたライブラリリスト上に表示されます。

  C:\Users\hoge>pip list
    (前略)
    jupyter                   1.0.0
    jupyter_client            8.6.0
    jupyter-console           6.6.3
    jupyter_core              5.5.0
    jupyter-events            0.9.0
    jupyter-lsp               2.2.0
    jupyter_server            2.10.1
    jupyter_server_terminals  0.4.4
    jupyterlab                4.0.8
    jupyterlab-pygments       0.2.2
    jupyterlab_server         2.25.2   
    jupyterlab-widgets        3.0.9
    (後略)

インストールを確認できたら、さらにこのようにコマンドを打つと

    C:\Users\hoge>jupyter notebook
image.png
image.png

コンペの種類

代表的なデータ分析のコンペとしては以下のようなものがあります。

コンペ名説明kaggleKaggleは、世界中のデータサイエンティストや機械学習エンスーシャスト向けの国際的なデータサイエンスコンペティションプラットフォームです。世界中からのデータサイエンティストが参加し、多くのコンペティションやデータセットが提供されています。Kaggleは英語を主要なコミュニケーション言語として使用し、国際的なプレゼンスを持っています。signateSignateは、日本のデータサイエンスコンペティションプラットフォームです。主に日本のデータサイエンスエンスステークホルダーやデータサイエンティスト向けに提供されています。日本語でのコンテンツやコンペティションが豊富であり、日本の企業や研究機関と連携していることが多いです。nishika日本のもう一つのプラットフォームです。KaggleやSIGNATEと同様、Nishikaもデータサイエンスのコンペティションを提供しています。これらも日本中心のものかもしれませんが、異なる場合もあります。主に日本語を話すユーザーベースを持っている可能性があります。競争やデータセットの種類が異なる場合があり、特に日本や日本の特定業界に関連するものがあるかもしれません。

個人的な印象で述べるとkaggleが最もタイトルを取って箔がつき
signateやnishikaは日本語でとっつきやすく、企業との連携が盛んという感じです。
企業タイアップだと賞金がついていることも多いようです (良いですね)

英語が苦でなければkaggleで良いと思いますし、とっつきにくさがある場合はsignateや
nishikaから初めて徐々に慣れてきたらkaggleのコンペに参加するなどで良いと思います。

参加したコンペ

私は社内のテック系活動を通じて、3つのコンペに参加をしました。

1つはいわゆる「タイタニック問題」と言われる初学者向けのコンペです。
はじめに体験してみるのにぴったりのコンペだと思います。

大した結果は得られていませんが、コンペに参加したときのコードをサンプルとして
文末に公開します。
これをjupyter上で実行するだけでも雰囲気をつかむことができると思います。

 

次に参加したのがこちらです
【第36回_Beginner限定コンペ】従業員の離職予測
こちらはsignateのコンペです。
賞金はありませんが一定順位に入るとランクが上がります。
私はここでtier7→tier5まで上げることができました(topはtier1)
Beginner限定コンペなので、割と順位上がりやすくモチベーション高まります。
(途中一瞬1位になったときはおおっと思いました!すぐ抜かれましたが)

最後はこれです
[中古マンション価格予測 2023夏の部]
(残念ながらページリンクが見つかりませんでした)
nishikaが四半期に定期開催しているもので、このコンペのデータは
国土交通省が公開している不動産取引価格情報が使われています。
土地総合情報システム

このサイトを時々見ることがあったため、とっつきやすいと思い選びました。
.creative hackに参加したときはこのコンペでの参加の様子を発表させてもらいました。
このように身近に感じるテーマでコンペを選んでみるのもよいかと思います。

どうやってコンペの問題を解くのか

コンペには
学習用データ(train.tsv)
評価用データ(test.tsv)
応募用サンプルファイル(sample_submit.tsv)
が提供されています。

コンペ参加者は
学習用データ(train.tsv)と評価用データ(test.tsv)を用いて機械学習を行い
得られた結果を応募用サンプルファイル(sample_submit.tsv)のフォーマットに
出力したものを提出します。提出した出力結果の精度により順位を争います。

機械学習は以下のような工程によって実行します。
1)データを確認して、前処理をする。前処理とは以下のようなことを行います
(例)
・欠損値を補う
・カテゴリ値の変換を行う。
(学習は数値で行うため、色など数値ではない情報を変数として扱う必要がある)
・有効となりそうな新しい特徴量を作成する。
2)前処理したデータを使って、機械学習モデルを作成する
3)作成したモデルの精度予測をする
4)作成したモデルによる出力を行う
5)精度予測結果に基づいて、利用するモデルの変更や新しい特徴量の生成などによって
精度向上を目指す
具体的にどうやるのか、という点については今であれば
ChatGPTに聞きながらやるのも一手です。考えるより始めるのが〇と思います。

(おまけ)ChatGPTに解かせるデータコンペ

私がコンペをやっている頃(2023年7月~9月)ChatGPTにはテストデータを入力にする
IFもありませんでしたしpythonを実行することも出来なかったのですが
(noteableなどの拡張プラグインを使えばできた)
これを書いている2023/12現在はテストデータをアップロード可能になっており
pythonを実行することも出来るようになっています。

試しにタイタニック問題を解いてもらったらそれなりの学習結果を得られました。
一方私がコンペに参加したときはnoteableを使って、
学習工程の多くをChatGPTにまかせていたのですが一定のところで
精度向上が難しくなりました。

プロンプトによる再学習の指示が上手くいかず、精度改善していかなかったのです。

参加者が等しく「ChatGPTに学習をまかせることができる」条件が同じであれば
優劣はプロンプトの質に左右されます。
そしてその質を向上させるには学習に対する本質的な理解が必要ではないかと思います。

つまり本質的な理解はChatGPTが存在したとしても必要、だと考えます。
(もちろん、とっかかりのサポートとして活用するのは大いにいいと思います)

振りかえりとまとめ

3か月位の間に3つのコンペをエントリーしてみましたが、まだまだスキル的には
十分といえず賞金もメダルもまだgetできていません。

しばらくは別の事に浮気するつもりなのですがまた気が向いたときに
今度は上位入賞を目指してコンペ参加してみようかと思っています。

これを読んでくれた方がデータコンペを初めてくれて、その振り返りをまた
ここに投稿してくれて、新しい気づきを得る循環ができたらよいなと思います。

おわり

タイタニック問題サンプル

#データを読み込む
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
get_ipython().run_line_magic('matplotlib', 'inline')

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
combine = [train,test]

#基本統計量を確認する
train.describe()

#null値を確認する
train.isnull().sum()

#null値を確認する
test.isnull().sum()

#各項目の生存死亡の関係を確認する チケットクラスとの関係
train[['Pclass','Survived']].groupby('Pclass', as_index = False).mean().sort_values(by = 'Survived' ,ascending = False)

#各項目の生存死亡の関係を確認する 乗船場所との関係
train[['Embarked','Survived']].groupby('Embarked', as_index = False).mean().sort_values(by = 'Survived', ascending = False)

#各項目の生存死亡の関係を確認する 性別との関係
train[['Sex','Survived']].groupby('Sex', as_index = False).mean().sort_values(by = 'Survived', ascending = False)

#各項目の生存死亡の関係を確認する 年齢との関係
g = sns.FacetGrid(train , col = 'Survived')
g.map(plt.hist,"Age",bins = 20)

#関係のない項目を落とす
train = train.drop(['PassengerId','Ticket','Cabin','Name'],axis = 1)
test = test.drop(['PassengerId','Ticket','Cabin','Name'],axis = 1)
combine = [train,test]
train.head()

#null値を補完する
freq_port = train.Embarked.mode()[0]
for dataset in combine:
    dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)
train['Age'] = train['Age'].fillna(train['Age'].mean())
test['Age'] = test['Age'].fillna(test['Age'].mean())
test['Fare'] = test['Fare'].fillna(test['Fare'].mean())

#文字を数字に変換する
#femaleを0に、maleを1に変換
#Sを0に、Cを1に、Qを2に変換
for dataset in combine:
    dataset['Sex'] = dataset['Sex'].replace('female',0).replace('male',1)
    dataset["Embarked"] = dataset["Embarked"].map({'S':0,'C':1,'Q':2}).astype(int)
train.head()

#予測する
#決定木分析とパラメーターのチューニング
y = train.iloc[:,:1]
X = train.iloc[:,1:]

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.model_selection import GridSearchCV

X_train_val,X_test,y_train_val,y_test = train_test_split(X,y,random_state = 1)
estimator = DTC(random_state = 0)

param_grid = [{'max_depth':[3,5,10,20,50],'min_samples_split':[3,5,10,20,50]}]
cv = 5

tuned_model = GridSearchCV(estimator, param_grid, cv=cv)
tuned_model.fit(X_train_val, y_train_val)
pd.DataFrame(tuned_model.cv_results_).T

# submit
tuned_model.best_params_
model = tuned_model.best_estimator_

pred = model.predict(test)
test2 = pd.read_csv('test.csv')
submit = pd.DataFrame({'PassengerId':test2['PassengerId'],'Survived':pred})
submit.to_csv("gender_submission.csv",index=False)