Kaggleのチュートリアルとして公開されているTitanic問題に対する素敵な解答を提出されている方がいたので、(データ分析と英語の)勉強を兼ねて翻訳してみます。
私はデータ分析も英語も特に出来るわけではないので、いろいろ誤りがあるかと思います。
もしお気づきの点があればお知らせくだされば幸いです。
なお、訳出は適宜抜粋しつつ行うものとします。全文訳ではないことをご承知おきください。
Titanicデータ分析の解法
処理の流れ
Data Sciense Solutions の書籍で説明されているところによれば、協議コンペにおける処理の流れは7つのステージを踏む。
- 問題あるいは課題の定義づけ
- 訓練用のデータと本番用のデータの獲得
- データの検討、準備及び整理
- データの分析、識別及び調査
- モデルの作成、それによる予測、問題の解決
- 問題解決の方法及び最終的な解法の可視化、報告、提出
- 結果の提供、または提出
この処理の流れは、それぞれの段階が他の段階にどのように続くのかを一般的に示したものである。しかしながら、例外に対するユースケースも存在する。
- いくつかの段階を結合することもある。データを可視化することによっての分析も行う。
- 順序よりも早いステージを先行して実施することもある。データを検討する前後で分析を行うこともある。
- 一つの仕事の中で何度も同じステージを実行することもある。可視化されたステージは何度も使われることだろう。
- 一つのステージを完全に用いないこともある。一つのコンペのためであるならば、商品化あるいはデータを利用可能なものにすることを目標とした供給のステージは不要になることだろう。
問題と課題の定義付け
Kaggleのようなコンペティションを扱うサイトは、解くための問題あるいは解くための質問を定義し、あなたのデータ分析モデルのための訓練用データとそのモデルが提出する結果を評価するための本番用データを提供する。「タイタニックサバイバル」問題あるいは課題コンペは、Kaggleにおいては下記のように説明される。
- タイタニックの悲劇を生き延びることができた者、あるいはできなかった者についての乗客者リストとして用意された訓練用データから知りえることを用いれば、本番用のテストデータに基づいてモデルを決定することができます。そのテストデータには乗客が生存したか、あるいはしなかったかの情報が含まれていませんが、それでもモデルを作ることができます。
いくらか早く問題領域を理解するために学習を行いたいと思うことだろう。次に示すのはKaggleコンペの説明ページにある紹介文である。ここにハイライトを示す。
- 1912年4月15日、その処女航海においてタイタニック号は氷河への激突により沈没、2224人中1502人の乗客と船員が死亡した。生存率は32%であった。
- その難破によりこれほど多くの命が失われた理由の一つは、そこに乗客と船員が乗り込むのに十分なだけの数の救命ボートがなかったことだ。
- けれどもそこには、その沈没を生き抜くことに関係したいくつかの種類の幸運が存在した。人々におけるいくつかのグループは、他の人々よりも生存する傾向が高かった。例えば女性であるとか、子供であるとか、上級クラスの人である、とか。
各処理段階における目標
データ分析のワークフローは7つの大きな目標を解決する。
Classifying //分類
私たちはサンプルを分類するか、カテゴリに分類することを望むだろう。また、異なるクラスとその解決法における関連性や相関性を理解したいと思うだろう。
Correlating //相関性
私たちは、訓練用データから取得することのできる特徴に基づいて解決に近づくことができる。では、訓練用データのどの特徴が私たちの求める解決に明確に貢献するのだろうか。統計学的見地から、一つの特徴と問題の解決に相関性を見出すことができるだろうか?特徴の値が変化するにつれて、解決の形も変わるし、その逆もあり得る。これは与えられるデータにおける数値とカテゴリカルな特徴から評価することができる。私たちはまた生存情報以外の特徴の間の相関を決定することもできる。一定の特徴間に関連性を見出すことは、新たな特徴の作成、特徴の補完、そして特徴を修正することに役立つ。
Converting //変換
モデルを作る段階では、データを用意することが求められる。モデルを作成するためのアルゴリズムを選定するにあたって、全ての特徴を等しい数値形式に変換する必要がある。例えば、テキストデータであるカテゴリ変数を数値に変換することなどだ。
Completing //補完
データを用意することはまた同時に、欠陥データを適当な見積もり値で補完することをも求める。作成したモデルのアルゴリズムは、データに欠陥が無い場合にもっともすぐれたパフォーマンスを発揮するのだ。
Correcting //修正
与えられた訓練用データを分析し、特徴の中の誤った値や恐らくは不適切と思われるような値を発見し、それらを修正するかあるいは除外する。これを行うための一つの方法は、サンプルデータそのもの、もしくはその特徴の中から異常値を発見することだ。もし分析に貢献しないような特徴や著しく結果を歪めるような特徴が存在した場合には、それを完全に捨てさる必要もある。
Creating //創造
私たちは、すでに存在する一つの特徴または一そろいの特徴から新たな特徴を作り出すこともできる。そうして作り出された新たな特徴は新たな相関性、変換性、解法に従うのである。
Charting //図表化
データの本質及び目指すべき目標に基づいて、資格化するためのプロット及びチャートを適切に選択すること。
# データ分析用のライブラリ
import pandas as pd
import numpy as np
import random as rnd
# 視覚化用のライブラリ
import seaborn as sns
import matplotlib as plt
%matplotlib inline
# 機械学習用のライブラリ
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naice_bayes import GasussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
データの収集
PythonのPandasパッケージは、私たちがデータセットを用いて仕事をすることを助けてくれる。私たちはまず訓練用のデータとテスト用のデータを取得し、PandasのDataFrame型に適合させることから始める。また、この2つのデータを一緒にして一定の操作を実行するために、2つのデータを結合することもする。
train_df = pd.read_csv('../input/train.csv')
test_df = pd.read_csv('../input/test.csv')
combine = [train_df, test_df]
データの記述からの分析
プロジェクトの早い段階から、Pandasは疑問への回答となるようにデータセットを説明するのに役立つ。
データセットの中のどの特徴を利用することができるのか
これらのデータを直接的に操作あるいは分析するためにも、特徴の名前に注目すること。これらの特徴名はKaggleのページにおいて説明されている。
print(train_df.columns.values)
>>>
['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch'
'Ticket' 'Fare' 'Cabin' 'Embarked']
どの特徴がカテゴリになっているのか
これらの値はサンプルデータを似通ったデータ群に分類することができる。カテゴリの中には、名詞、順序、比率、距離に基づく値などがある。これは他の特徴よりもとりわけ、私たちが視覚化に適したプロットを選択するのに役立つ。
- カテゴリ:Survived(生存)、Sex(性別)、Embarked(乗船地)。
- 順序:Pclass(乗船クラス)
どの特徴が数的なのか
どの特徴が数的な変数なのだろうか。これらの値はサンプルごとに変化する。数的特徴の中では、不連続な数値、連続的な数値、時系列に基づく値などがある。これらの数的な変数はとりわけ、視覚化に適したプロットを選択するのに役立つ。
- 連続的な数値:Age(年齢)、Fare(料金)。
- 不連続な数値:SibSp(兄弟姉妹及び配偶者)、Parch(親及び子供)
# データのプレビュー
train_df.head()
>>>
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
どの特徴が混合型なのか
英語と数字のデータが同じ特徴の中に存在することもある。これらは、目標を修正するための候補となる。
- Ticket(チケット)は数字と英語の混合である。Cabin(客室)は英数字である。
どの特徴がエラーや打ち間違いを含んでいるのか
大きなデータセットの中からエラーや打ち間違いを見つけるのは難しい。しかしながら、小さなデータのサンプルをレビューすることは、どの特徴が修正を必要とするかを発見するのに役立つ。
- name(名前)はタイトルや丸カッコ、クォート、代替用法や短縮用法などが様々な方法で用いられるため、おそらくエラー及び打ち間違いを含んでいる。
train_df.tail()
>>>
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
886 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.00 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.00 B42 S
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.45 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q
どの特徴が空白、ヌル値、欠損を含んでいるのか
これらの空白や欠損は修正されなければいけない。
- Cabin(客室) > Age(年齢) > Embarked(乗船地) の特徴は、訓練用データの中では数値項目としてヌル値を含んでいる。
- Cabin > Age の特徴は、テストデータの中では全てのデータがそろっていない。
それぞれの特徴のデータ型は何か
データを変換することでその答えを得ることができる。
- テストデータの中では、7つの特徴が数値もしくは浮動小数を含んだ数値である。
- 5つの特徴は文字列型、もしくはオブジェクト型である。
train_df.info()
print('_'*40)
test_df.info()
>>>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
________________________________________
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId 418 non-null int64
Pclass 418 non-null int64
Name 418 non-null object
Sex 418 non-null object
Age 332 non-null float64
SibSp 418 non-null int64
Parch 418 non-null int64
Ticket 418 non-null object
Fare 417 non-null float64
Cabin 91 non-null object
Embarked 418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
サンプルにおける数的データの分布状況はどのようなものか
早い段階で行える他の考察よりも、現実的な問題領域における訓練用データがどのような代表的特徴をもっているのかを決定するのにこの問いは役立つ。
- 全てのサンプル数は891である。または、タイタニック号に乗船していた2224のうちの40%がサンプル数である。
- Survived(生死)のカテゴリカル変数は、0か1の値をとる。
- およそ38%のサンプルが、実際の生存率32%を代表して生存した。
- 多くの乗船者(75%以上)は親または子供を連れて旅行に来ているわけではなかった。
- 30%近くの乗船者は兄弟姉妹、または配偶者と一緒に乗船していた。
- Fares(料金)は、512ドルもの高額を払ったような少数の乗船者(1%未満)がいたなど、様々なはっきりとした違いがあった。
- 少数の年長者(1%)は65歳から80歳であった。
train_df.describe()
>>>
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
カテゴリの分布状況はどのようなものか
- 名称はデータ中において一意である。
- 性別変数は2つの変数に分けることができ、65%が男性である。
- 客室の値はサンプル中でいくつか重複している。あるいはこれは、いくらかの乗客が客室を共有して可能性を示す。
- 乗船地は3つの変数に分けることができる。S乗船地が最も多くの乗客に使われている。
- チケットの特徴は22%もの高い確率で重複がみられる。
train_df.describe(include=['0'])
>>>
Name Sex Ticket Cabin Embarked
count 891 891 891 204 889
unique 891 2 681 147 3
top Lester, Mr. James male 347082 G6 S
freq 1 577 7 4 644
データ分析に基づく仮定
ここまでに行われたデータ分析医基づき、私たちは過程を導くことができる。行動を実行する前に、私たちはこれらの仮定についてもう少し検討する必要がある。
Correlating //相関性
私たちはそれぞれの特徴がSurvivalという変数とどれだけ有効な相関性を持っているかを知りたい。これの分析はプロジェクトの早期に行い、そしてプロジェクトの後半において、モデル化された相関性と一致させたい。
Completing //補完
- 年齢は生存率と決定的に関係しているので、補完するべきだろう。
- 乗船地はおそらく生存率もしくは他の重要な特徴と関係しているので、補完するべきだろう。
Correcting //修正
- チケット項目は高い確率で重複を含んでおり(22%)、またチケットと生存率の間には関連が無いように思われるので、今回の分析からは除外してよいだろう。
- 客室項目は訓練用データにおいてもテスト用データにおいても高い確率で欠損あるいは多くの空白を含んでいるので、除外してよいだろう。
- 乗客IDは生存率を判断することに貢献しないので、訓練用データからは除外してよいだろう。
- 名前項目はどちらかといえば標準化されていないので、直接的に生存率を判断するのに貢献はしないだろう。したがって除外してよい。
Creating //作成
- 私たちはタイタニック号に乗っていた家族の総数を得るためにも、Parch(親または子供)とSibSp(兄弟姉妹または配偶者)の値に基づいてFamily(家族)という項目を作るべきだろう。
- 継承を抜き出すことによって名前項目を設計しなおすことにより、新たな特徴を作ることができる。
- 新たな特徴としてAge bands(年齢帯)を作り出したい。これは連続的な数字であった年齢特徴を、不連続なカテゴリカル変数へと変化させる。
- 料金帯が分析に役立つのであれば、それも新たな特徴として作り出したい。
Classifying //分類
最初に述べた課題の説明文に基づいて、私たちは仮定に以下のことを追加することができる。
- 女性は生き残った傾向が強い。
- 子供は生き残った傾向が強い。
- Pclassが1のような上級クラスの人々は生き残った傾向が強い。
---------- 原文ここまで -----------
ここまでのまとめ(翻訳者による)
特徴名 | 意味 | 種別 | 有用性及び考察 | 判明した事実 |
---|---|---|---|---|
PassengerID | 乗客ID | カテゴリ | 生存に貢献しないだろうから削除 | - |
Survived | 生存 | 数値 | - | - |
Pclass | 乗船クラス | カテゴリ(順序 | 生存との関連性あり | クラス1であれば生存率が高い |
Name | 名前 | カテゴリ | 敬称を抜き出し新特徴に変換 | - |
Sex | 性別 | カテゴリ | 生存との関連性あり | femaleであれば生存率が高い |
Age | 年齢 | 数値 | 要補完。生存との関連性あり。またAgeBandsという新特徴にも変換 | 子供(年齢帯は不明)であれば生存率が高い |
SibSip | 兄弟姉妹、配偶者 | 数値(不連続 | Familyという新特徴に変換 | - |
Parch | 親、子供 | 数値(不連続 | Familyという新特徴に変換 | - |
Ticket | チケット | 混合 | 重複が多すぎるので削除 | - |
Fare | 料金 | 数値(連続 | 使えそうであればFareRangeという新特徴に変換 | - |
Cabin | 客室 | 混合 | 欠損率が高すぎるので削除 | - |
Embarked | 乗船地 | カテゴリ | 要補完。生存もしくはその他との関連性あり | - |
第一部以上。
原文