[kaggle翻訳]Titanic Data Science Solutions(Manav Sehgal) (1)

Kaggleのチュートリアルとして公開されているTitanic問題に対する素敵な解答を提出されている方がいたので、（データ分析と英語の）勉強を兼ねて翻訳してみます。

私はデータ分析も英語も特に出来るわけではないので、いろいろ誤りがあるかと思います。
もしお気づきの点があればお知らせくだされば幸いです。

なお、訳出は適宜抜粋しつつ行うものとします。全文訳ではないことをご承知おきください。


# Titanicデータ分析の解法

# 処理の流れ
Data Sciense Solutions の書籍で説明されているところによれば、協議コンペにおける処理の流れは７つのステージを踏む。

1. 問題あるいは課題の定義づけ
2. 訓練用のデータと本番用のデータの獲得
3. データの検討、準備及び整理
4. データの分析、識別及び調査
5. モデルの作成、それによる予測、問題の解決
6. 問題解決の方法及び最終的な解法の可視化、報告、提出
7. 結果の提供、または提出

この処理の流れは、それぞれの段階が他の段階にどのように続くのかを一般的に示したものである。しかしながら、例外に対するユースケースも存在する。

- いくつかの段階を結合することもある。データを可視化することによっての分析も行う。
- 順序よりも早いステージを先行して実施することもある。データを検討する前後で分析を行うこともある。
- 一つの仕事の中で何度も同じステージを実行することもある。可視化されたステージは何度も使われることだろう。
- 一つのステージを完全に用いないこともある。一つのコンペのためであるならば、商品化あるいはデータを利用可能なものにすることを目標とした供給のステージは不要になることだろう。


# 問題と課題の定義付け

Kaggleのようなコンペティションを扱うサイトは、解くための問題あるいは解くための質問を定義し、あなたのデータ分析モデルのための訓練用データとそのモデルが提出する結果を評価するための本番用データを提供する。「タイタニックサバイバル」問題あるいは課題コンペは、Kaggleにおいては下記のように説明される。

- タイタニックの悲劇を生き延びることができた者、あるいはできなかった者についての乗客者リストとして用意された訓練用データから知りえることを用いれば、本番用のテストデータに基づいてモデルを決定することができます。そのテストデータには乗客が生存したか、あるいはしなかったかの情報が含まれていませんが、それでもモデルを作ることができます。


いくらか早く問題領域を理解するために学習を行いたいと思うことだろう。次に示すのはKaggleコンペの説明ページにある紹介文である。ここにハイライトを示す。

- 1912年4月15日、その処女航海においてタイタニック号は氷河への激突により沈没、2224人中1502人の乗客と船員が死亡した。生存率は32%であった。
- その難破によりこれほど多くの命が失われた理由の一つは、そこに乗客と船員が乗り込むのに十分なだけの数の救命ボートがなかったことだ。
- けれどもそこには、その沈没を生き抜くことに関係したいくつかの種類の幸運が存在した。人々におけるいくつかのグループは、他の人々よりも生存する傾向が高かった。例えば女性であるとか、子供であるとか、上級クラスの人である、とか。


# 各処理段階における目標
データ分析のワークフローは７つの大きな目標を解決する。

## Classifying //分類
私たちはサンプルを分類するか、カテゴリに分類することを望むだろう。また、異なるクラスとその解決法における関連性や相関性を理解したいと思うだろう。

## Correlating //相関性
私たちは、訓練用データから取得することのできる特徴に基づいて解決に近づくことができる。では、訓練用データのどの特徴が私たちの求める解決に明確に貢献するのだろうか。統計学的見地から、一つの特徴と問題の解決に相関性を見出すことができるだろうか？特徴の値が変化するにつれて、解決の形も変わるし、その逆もあり得る。これは与えられるデータにおける数値とカテゴリカルな特徴から評価することができる。私たちはまた生存情報以外の特徴の間の相関を決定することもできる。一定の特徴間に関連性を見出すことは、新たな特徴の作成、特徴の補完、そして特徴を修正することに役立つ。

## Converting //変換
モデルを作る段階では、データを用意することが求められる。モデルを作成するためのアルゴリズムを選定するにあたって、全ての特徴を等しい数値形式に変換する必要がある。例えば、テキストデータであるカテゴリ変数を数値に変換することなどだ。

## Completing //補完
データを用意することはまた同時に、欠陥データを適当な見積もり値で補完することをも求める。作成したモデルのアルゴリズムは、データに欠陥が無い場合にもっともすぐれたパフォーマンスを発揮するのだ。

## Correcting //修正
与えられた訓練用データを分析し、特徴の中の誤った値や恐らくは不適切と思われるような値を発見し、それらを修正するかあるいは除外する。これを行うための一つの方法は、サンプルデータそのもの、もしくはその特徴の中から異常値を発見することだ。もし分析に貢献しないような特徴や著しく結果を歪めるような特徴が存在した場合には、それを完全に捨てさる必要もある。

## Creating //創造
私たちは、すでに存在する一つの特徴または一そろいの特徴から新たな特徴を作り出すこともできる。そうして作り出された新たな特徴は新たな相関性、変換性、解法に従うのである。

## Charting //図表化
データの本質及び目指すべき目標に基づいて、資格化するためのプロット及びチャートを適切に選択すること。


```python:１．ライブラリのインポート
# データ分析用のライブラリ
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型に適合させることから始める。また、この２つのデータを一緒にして一定の操作を実行するために、２つのデータを結合することもする。

```python:２．データの取得及び結合
train_df = pd.read_csv('../input/train.csv')
test_df  = pd.read_csv('../input/test.csv')
combine = [train_df, test_df]
```

## データの記述からの分析
プロジェクトの早い段階から、Pandasは疑問への回答となるようにデータセットを説明するのに役立つ。

### データセットの中のどの特徴を利用することができるのか
これらのデータを直接的に操作あるいは分析するためにも、特徴の名前に注目すること。これらの特徴名はKaggleのページにおいて説明されている。

```python:３．データの特徴名の表示
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(親及び子供)

```python:４．データ先頭部の確認
# データのプレビュー
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(名前)はタイトルや丸カッコ、クォート、代替用法や短縮用法などが様々な方法で用いられるため、おそらくエラー及び打ち間違いを含んでいる。

```python:５．データの最後部の確認
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 の特徴は、テストデータの中では全てのデータがそろっていない。


### それぞれの特徴のデータ型は何か
データを変換することでその答えを得ることができる。

- テストデータの中では、７つの特徴が数値もしくは浮動小数を含んだ数値である。
- ５つの特徴は文字列型、もしくはオブジェクト型である。

```python:６．データ型の表示
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歳であった。

```python:７．統計的要素の表示
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%もの高い確率で重複がみられる。

```python:８．カテゴリカル変数の情報
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 //補完
1. 年齢は生存率と決定的に関係しているので、補完するべきだろう。
2. 乗船地はおそらく生存率もしくは他の重要な特徴と関係しているので、補完するべきだろう。

## Correcting //修正
1. チケット項目は高い確率で重複を含んでおり(22%)、またチケットと生存率の間には関連が無いように思われるので、今回の分析からは除外してよいだろう。
2. 客室項目は訓練用データにおいてもテスト用データにおいても高い確率で欠損あるいは多くの空白を含んでいるので、除外してよいだろう。
3. 乗客IDは生存率を判断することに貢献しないので、訓練用データからは除外してよいだろう。
4. 名前項目はどちらかといえば標準化されていないので、直接的に生存率を判断するのに貢献はしないだろう。したがって除外してよい。

## Creating //作成
1. 私たちはタイタニック号に乗っていた家族の総数を得るためにも、Parch(親または子供)とSibSp(兄弟姉妹または配偶者)の値に基づいてFamily(家族)という項目を作るべきだろう。
2. 継承を抜き出すことによって名前項目を設計しなおすことにより、新たな特徴を作ることができる。
3. 新たな特徴としてAge bands(年齢帯)を作り出したい。これは連続的な数字であった年齢特徴を、不連続なカテゴリカル変数へと変化させる。
4. 料金帯が分析に役立つのであれば、それも新たな特徴として作り出したい。


## Classifying //分類
最初に述べた課題の説明文に基づいて、私たちは仮定に以下のことを追加することができる。

1. 女性は生き残った傾向が強い。
2. 子供は生き残った傾向が強い。
3. Pclassが1のような上級クラスの人々は生き残った傾向が強い。


<br><br>

---------- 原文ここまで -----------

# ここまでのまとめ（翻訳者による）


|特徴名|意味|種別|有用性及び考察|判明した事実|
|----|----|----|----|----|
|PassengerID|乗客ID|カテゴリ|生存に貢献しないだろうから削除|-|
|Survived|生存|数値|-|-|
|Pclass|乗船クラス|カテゴリ(順序|生存との関連性あり|クラス1であれば生存率が高い|
|Name|名前|カテゴリ|敬称を抜き出し新特徴に変換|-|
|Sex|性別|カテゴリ|生存との関連性あり|femaleであれば生存率が高い|
|Age|年齢|数値|要補完。生存との関連性あり。またAgeBandsという新特徴にも変換|子供(年齢帯は不明)であれば生存率が高い|
|SibSip|兄弟姉妹、配偶者|数値(不連続 |Familyという新特徴に変換|-|
|Parch|親、子供|数値(不連続|Familyという新特徴に変換|-|
|Ticket|チケット|混合|重複が多すぎるので削除|-|
|Fare|料金|数値(連続|使えそうであればFareRangeという新特徴に変換|-|
|Cabin|客室|混合|欠損率が高すぎるので削除|-|
|Embarked|乗船地|カテゴリ|要補完。生存もしくはその他との関連性あり|-|


第一部以上。 

# 原文
https://www.kaggle.com/startupsci/titanic-data-science-solutions