プログラミング

【Pythonでデータ分析】タイタニックデータの前処理と可視化してみた!(Kaggle:カグル)

Pythonでタイタニックのデータ分析してみた!(Kaggle)

Pyrhon(パイソン)のデータ分析で前処理と可視化ってどうするの?

データ分析初心者の登竜門、「タイタニックの生存者予測」

Kaggle(カグル)という世界中の機械学習・データサイエンスに携わっている約40万人の方が集まるコミニティーで初心者向けにチュートリアルとして公開されている有名なデータセットです。

これらのデータセットを使って「分類器」を作成し、タイタニックの乗客の生存の是非を予測します。

このTitanicデータセットはPythonは何となく使えるようになったけど、とりあえず機械学習をやってみたい!という方にオススメです。

データ分析をする上で、下記流れで行います。

  1. データを取り込む
  2. データを整理する
  3. データを分類する
  4. 結果を検証する

今回はタイタニックのデータを使ってデータの前処理として、データの取り込みとデータ整理してみました!

以下、Jupyter notebookを使って実際にPythonのコードを書いていきます。

まだPythonの環境を構築していない方はこちらの記事をお読みください。

関連記事Python(パイソン)環境をAnaconda(アナコンダ)で構築!Jupyter notebookの使い方は?

Pythonでタイタニックのデータ分析する事前準備

kaggle-titanic
Titanic: Machine Learning from Disaster

Pythonでタイタニックのデータ分析する前に準備が必要です。

データをダウンロードして読み込んでみよう!

まずは、kaggleのサイトにアクセスします。

関連サイトタイタニックデータセット

kaggleを利用するには会員登録する必要があるので、サイト右上の「Register」ボタンをクリックします。

無料で登録出来ます♪

kaggle登録

Googleのアカウントで簡単に登録できます。

登録してサインインしたら、タイタニックデータセットをこちらからダウンロードします。

タイタニックデータダウンロード

Dataの【Downoad all】からデータをダウンロードすることが出来ます。

titanic.zipというファイルがダウンロードされたら、Jupyter notebookで作業するフォルダで解凍します。

Windows端末だと、デフォルトでは、【Windows(c)>ユーザー>ユーザー名】の直下がJupyter notebookの作業場になっているかと思います。

  • test.csv(27.96 KB)
  • train.csv (59.76 KB)

NumpyとPandasを使ってダウロードした上記のデータセット、「test.csv」と「train.csv」を読み込みます。

#ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#データセットの読み込み
train = pd.read_csv("./titanic/train.csv",index_col=0)
test = pd.read_csv("./titanic/test.csv",index_col=0)

Pandasライブラリで、index_col=0のように使いたい列の列番号を0始まりで指定します。

データの中身を確認してみよう!

さっそく、データの中身を確認してみましょう!

各列の要素(カラム)を確認します。

カラム確認には、.columns関数を使います。

#各列の要素を確認
train.columns

トレーニングデータの要素は下記の11。

Index([‘Survived’, ‘Pclass’, ‘Name’, ‘Sex’, ‘Age’, ‘SibSp’, ‘Parch’, ‘Ticket’, ‘Fare’, ‘Cabin’, ‘Embarked’], dtype=’object’)

#各列の要素を確認
test.columns

トレーニングデータの要素は下記の10。

Index([‘Pclass’, ‘Name’, ‘Sex’, ‘Age’, ‘SibSp’, ‘Parch’, ‘Ticket’, ‘Fare’,
‘Cabin’, ‘Embarked’],
dtype=’object’)

カラムを確認

テストデータには、’Survived’という要素がないことが分かります。

配列を確認するには、.shape関数を使います。

#データの配列の大きさを確認
train.shape
#データの配列の大きさを確認
test.shape
タイタニック配列確認
タイタニックデータ項目
  1. ‘Survived’:生存の是非。1は生存、0は死亡
  2. ‘Pclass’:客室の等級。1が最高級
  3. ‘Name’:氏名(敬称付き)
  4. ‘Sex’:性別
  5. ‘Age’:年齢
  6. ‘SibSp’:乗船した兄弟の数
  7. ‘Parch’:乗船した親・子の数
  8. ‘Ticket’:チケット番号
  9. ‘Fare’:乗船代金
  10. ‘Cabin’:部屋番号
  11. ‘Embarked’:乗船した港。S,C,Qの3種類

データの欠損値を確認してみよう!

データセットは必ずしも「完全なもの」であるとは限りません。

つまり、そのままではデータ分析出来ない(場合もある)んです。

取得データのうち、ある項目の値が欠けているものを欠損値と言います。

欠損値の有無は必ず確認するのが大事。

欠損値(missing value)とは:アンケート調査データの場合の無回答項目やカルテデータの場合の未検査項目のように,あるケースのある項目の値が欠落している場合がある。ほとんどの統計プログラムパッケージでは,1ケースあたりの変数の個数は等しくなければならないので,データファイルを準備する場合には,データが欠落している場合でもなんらかの数値を入力しておかなければならない。ただし,入力される数値は実際にはデータがなかったことを表しているので,分析対象からはずす必要がある。そのため,他の有効なデータと明らかに区別できる値(欠損値)を入力する。例えば,正の値しか取らない変数には欠損値として負の値を与える。あるいは,通常では出現しないような大きな値を与えるなどが適当であろう。

欠損要素をTrue、それ以外をFalseに変換するには、.isnull()関数を使います。

train.isnull()
トレーニング欠損確認

各列の欠損値の数をカウントするにはisnull().sum()関数。

train.isnull().sum()
トレーニング欠損数確認

各列の欠損値ではない要素数をカウントするにはnotnull().sum()関数。

train.notnull().sum()
トレーニング欠損ではない数確認

これにより、トレーニングデータには「Age」、「Cabin」、「Embarked」に欠損値があることが分かりましたね。

ここで、データ分析する場合の疑問です。

ヨシタカ
ヨシタカ
欠損しているデータは補完した方がいいの?それとも削除した方がいいの?

欠損値の補完(何かしらのデータで埋めてしまう)はデータ数を減らさずに済みますが、「真のデータ分布」から外れるリスクがあります。

補完するよりも削除してしまった方が良い場合もあるんだとか。

今回は削除してみましょうか!

データの欠損値を削除してみよう!

ここでは、データの欠損値を削除します。

テストデータの欠損値も確認します。

test.isnull().sum()
テスト欠損数確認

テストデータには「Age」、「Fare」、「Cabin」に欠損値があることが分かりましたね。

train.csv、test.csvの「Age」、「Fare」、「Cabin」、「Embarked」のデータを削除してみます。

削除は.drop()関数を使います。

.drop()関数では、引数labelsとaxisで指定します。行の場合はaxis=0列の場合はaxis=1となります。

今回は列を削除したいのでaxis=1です。

drop_columns = ["Age","Cabin","Fare","Embarked"]
train_modify = train.drop(drop_columns,axis=1)
test_modify = test.drop(drop_columns,axis=1)

train_modify.isnull().sum()test_modify.isnull().sum()で確認します。

欠損値削除状態

ちゃんと削除されてますね。


データを可視化してみよう!

今回のお題は、「タイタニックの生存者予測」

【Survived】が重要になります。

ってことで。

このデータセットでは、生存が「1」、死亡が「0」なので平均を求めれば、生存率が算出出来ます。

ここで、.mean()関数を使います。

train.Survived.mean()

上記で生存率を求めてみると、38.4%と求まりました。

ざっくりですが、トレーニングデータから1/3の方が生存したことが分かります。

生き残った人・亡くなった人の割合は?

生き残った人・亡くなった人の割合は下記で調べることが出来ます。

円グラフで表示してみませう。

円グラフはplt.pie関数を使います。

plt.pie(train["Survived"].value_counts(),labels=["Deceased","Survived"],autopct="%.1f%%")
plt.title("Ratio of the Survived/Deceased")
plt.show()
タイタニック生存率円グラフ

男女別の生存数は?

次は、男女それぞれの生存者数を見てみます。

.groupby()関数でグループ分けをして、.sum()関数を使うことで、生存者数を求めることが出来ます。

ここでは、性別”Sex”の項目でグループ分けして、生存者数の合計を求めてみます。

train.groupby(["Sex"]).sum()["Survived"]
タイタニック性別生存率

棒グラフにしてみると・・・

train.groupby(["Sex"]).sum()["Survived"].plot.bar(color=['mistyrose', 'lightblue'])
タイタニック性別生存数棒グラフ

男女別の生存者数・死者数は?

次は男女それぞれの生存者数・死者数を見てみます。

train.groupby(["Sex","Survived"])["Survived"].count()
タイタニック性別ごとの生存率

これをグラフにしてみると下記のようになります。

train.groupby(["Sex","Survived"])["Survived"].count().plot.bar(color=["mistyrose","lightcoral","lightblue","deepskyblue"])
タイタニック性別ごとの生存率棒グラフ

男女別の生存率は?

男女別の生存率を調べてみます。

.mean()関数で生存率が分かります。

train.groupby(["Sex"]).mean()["Survived"]
性別ごとの生存率
train.groupby(["Sex"]).mean()["Survived"].plot.bar(color=["lightcoral","deepskyblue"])
性別ごとの生存率棒グラフ

トレーニングデータの「性別」に着目すると、女性の方が明らかに生存率が高いことが分かりますね。

どうやら性別は生存率に寄与しそうだぞ!?と機械学習しなくてもなーんとなく分かります。

データを可視化してみるとイメージが湧きますよね。

さあPythonでタイタニックデータ分析してみよう!

PythonでKaggleのタイタニックデータセットでデータの前処理をしてみました。

データ分析には前準備が非常に重要になります。

どのデータをどう扱うのか。

今回は欠損値を探して、削除してみました。

削除した方がいい場合もありますし、データを補完した方が良い場合もあります。

色々と試してみてくださいね。

次回はデータの加工(特徴構築)をしてみたいと思います。

関連記事【NumPy】Python(パイソン)で行列計算!配列関数の使い方を紹介

関連記事【Matplotlib】Python(パイソン)でグラフ描画!範囲指定や線や点の種類変更は?

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です