1. チュートリアル第一部「Data Handling」

第一部の目的

  • IPythonの使い方について学びます
  • 第二部で利用するチュートリアル用のデータについて学びます。
  • Pandasを使ったデータの前処理について学びます。
  • matploblibを利用したデータの可視化について学びます。

使用するパッケージ

  • Python 3.4.2
  • Pandas 0.15.2
  • matplotlib 1.4.3
  • IPython[notebook] 3.0.0

講師紹介

PyData.Tokyoオーガナイザー 池内 孝啓(@iktakahiro)

株式会社ALBERT http://albert2005.co.jp 執行役員 システム開発部 部長

Python, Amazon Web Service, Scrum

Agenda

  1. データの読み込み
  2. 集計・統計解析
  3. データの前処理
  4. データの可視化

1-1. データの読み込み

PandasにはCSVを含め様々なデータを読み込むための関数が既に用意されています。今回利用するデータもCSVですので、下記の一行を実行するとデータフレームに読み込まれます。

データフレームとは

データベースで言うところのテーブルと同義です。Excelのシートと同じようなものです。関連する数値ベクトルや文字ベクトル、などの異なる型のデータを各行にまとめて格納します。各行・列はラベルを持ち、ラベルによる操作が可能です。Rでも使われていることで知られています。

In [696]:
%matplotlib inline

import matplotlib.pyplot as plt
import pandas as pd
In [664]:
df = pd.read_csv("data/train.csv")
In [668]:
df[df.Age == 65][['Name', 'Age']]
Out[668]:
Name Age
54 Ostby, Mr. Engelhart Cornelius 65
280 Duane, Mr. Frank 65
456 Millet, Mr. Francis Davis 65

読み込んだデータを見てみましょう。各カラムにはラベルが付いており、このようなデータが存在します。

  • PassengerId: 乗客ID
  • Survived: 1 = 生き残り 0 = 死亡
  • Pclass: 等級
  • Name: 名前
  • Sex: 性別
  • Age: 年齢
  • Parch: 子供の数
  • Ticket: チケット番号
  • Fare: 運賃
  • Cabin: 部屋番号
  • Embarked: 乗船地

など

In [584]:
df
Out[584]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
6 7 0 1 McCarthy, Mr. Timothy J male 54 0 0 17463 51.8625 E46 S
7 8 0 3 Palsson, Master. Gosta Leonard male 2 3 1 349909 21.0750 NaN S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27 0 2 347742 11.1333 NaN S
9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14 1 0 237736 30.0708 NaN C
10 11 1 3 Sandstrom, Miss. Marguerite Rut female 4 1 1 PP 9549 16.7000 G6 S
11 12 1 1 Bonnell, Miss. Elizabeth female 58 0 0 113783 26.5500 C103 S
12 13 0 3 Saundercock, Mr. William Henry male 20 0 0 A/5. 2151 8.0500 NaN S
13 14 0 3 Andersson, Mr. Anders Johan male 39 1 5 347082 31.2750 NaN S
14 15 0 3 Vestrom, Miss. Hulda Amanda Adolfina female 14 0 0 350406 7.8542 NaN S
15 16 1 2 Hewlett, Mrs. (Mary D Kingcome) female 55 0 0 248706 16.0000 NaN S
16 17 0 3 Rice, Master. Eugene male 2 4 1 382652 29.1250 NaN Q
17 18 1 2 Williams, Mr. Charles Eugene male NaN 0 0 244373 13.0000 NaN S
18 19 0 3 Vander Planke, Mrs. Julius (Emelia Maria Vande... female 31 1 0 345763 18.0000 NaN S
19 20 1 3 Masselmani, Mrs. Fatima female NaN 0 0 2649 7.2250 NaN C
20 21 0 2 Fynney, Mr. Joseph J male 35 0 0 239865 26.0000 NaN S
21 22 1 2 Beesley, Mr. Lawrence male 34 0 0 248698 13.0000 D56 S
22 23 1 3 McGowan, Miss. Anna "Annie" female 15 0 0 330923 8.0292 NaN Q
23 24 1 1 Sloper, Mr. William Thompson male 28 0 0 113788 35.5000 A6 S
24 25 0 3 Palsson, Miss. Torborg Danira female 8 3 1 349909 21.0750 NaN S
25 26 1 3 Asplund, Mrs. Carl Oscar (Selma Augusta Emilia... female 38 1 5 347077 31.3875 NaN S
26 27 0 3 Emir, Mr. Farred Chehab male NaN 0 0 2631 7.2250 NaN C
27 28 0 1 Fortune, Mr. Charles Alexander male 19 3 2 19950 263.0000 C23 C25 C27 S
28 29 1 3 O'Dwyer, Miss. Ellen "Nellie" female NaN 0 0 330959 7.8792 NaN Q
29 30 0 3 Todoroff, Mr. Lalio male NaN 0 0 349216 7.8958 NaN S
... ... ... ... ... ... ... ... ... ... ... ... ...
861 862 0 2 Giles, Mr. Frederick Edward male 21 1 0 28134 11.5000 NaN S
862 863 1 1 Swift, Mrs. Frederick Joel (Margaret Welles Ba... female 48 0 0 17466 25.9292 D17 S
863 864 0 3 Sage, Miss. Dorothy Edith "Dolly" female NaN 8 2 CA. 2343 69.5500 NaN S
864 865 0 2 Gill, Mr. John William male 24 0 0 233866 13.0000 NaN S
865 866 1 2 Bystrom, Mrs. (Karolina) female 42 0 0 236852 13.0000 NaN S
866 867 1 2 Duran y More, Miss. Asuncion female 27 1 0 SC/PARIS 2149 13.8583 NaN C
867 868 0 1 Roebling, Mr. Washington Augustus II male 31 0 0 PC 17590 50.4958 A24 S
868 869 0 3 van Melkebeke, Mr. Philemon male NaN 0 0 345777 9.5000 NaN S
869 870 1 3 Johnson, Master. Harold Theodor male 4 1 1 347742 11.1333 NaN S
870 871 0 3 Balkic, Mr. Cerin male 26 0 0 349248 7.8958 NaN S
871 872 1 1 Beckwith, Mrs. Richard Leonard (Sallie Monypeny) female 47 1 1 11751 52.5542 D35 S
872 873 0 1 Carlsson, Mr. Frans Olof male 33 0 0 695 5.0000 B51 B53 B55 S
873 874 0 3 Vander Cruyssen, Mr. Victor male 47 0 0 345765 9.0000 NaN S
874 875 1 2 Abelson, Mrs. Samuel (Hannah Wizosky) female 28 1 0 P/PP 3381 24.0000 NaN C
875 876 1 3 Najib, Miss. Adele Kiamie "Jane" female 15 0 0 2667 7.2250 NaN C
876 877 0 3 Gustafsson, Mr. Alfred Ossian male 20 0 0 7534 9.8458 NaN S
877 878 0 3 Petroff, Mr. Nedelio male 19 0 0 349212 7.8958 NaN S
878 879 0 3 Laleff, Mr. Kristo male NaN 0 0 349217 7.8958 NaN S
879 880 1 1 Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) female 56 0 1 11767 83.1583 C50 C
880 881 1 2 Shelley, Mrs. William (Imanita Parrish Hall) female 25 0 1 230433 26.0000 NaN S
881 882 0 3 Markun, Mr. Johann male 33 0 0 349257 7.8958 NaN S
882 883 0 3 Dahlberg, Miss. Gerda Ulrika female 22 0 0 7552 10.5167 NaN S
883 884 0 2 Banfield, Mr. Frederick James male 28 0 0 C.A./SOTON 34068 10.5000 NaN S
884 885 0 3 Sutehall, Mr. Henry Jr male 25 0 0 SOTON/OQ 392076 7.0500 NaN S
885 886 0 3 Rice, Mrs. William (Margaret Norton) female 39 0 5 382652 29.1250 NaN Q
886 887 0 2 Montvila, Rev. Juozas male 27 0 0 211536 13.0000 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19 0 0 112053 30.0000 B42 S
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26 0 0 111369 30.0000 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32 0 0 370376 7.7500 NaN Q

891 rows × 12 columns

データを見てみよう

アウトプットの最後に出力されたように、このファイルには891人分(行)の11種類(カラム)のデータが含まれています。

各行に性別、年齢、等級などの値(分析上「素性」と呼ばれる)が入っています。

In [698]:
df.head(2)
Out[698]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C

head()関数は引数に指定した行数分、先頭からデータを選択します。

In [590]:
df.tail()
Out[590]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
886 887 0 2 Montvila, Rev. Juozas male 27 0 0 211536 13.00 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19 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 111369 30.00 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32 0 0 370376 7.75 NaN Q

tail()関数は引数に指定した行数分、末尾からデータを選択します。head()関数もtail関数も、行数の指定を省略した場合、5行分のデータを選択します。

特定のカラムのみを指定してデータを抽出できます。

複数カラムの指定もできます。

In [699]:
df[['Name', 'Age', 'Sex']].head(3)
Out[699]:
Name Age Sex
0 Braund, Mr. Owen Harris 22 male
1 Cumings, Mrs. John Bradley (Florence Briggs Th... 38 female
2 Heikkinen, Miss. Laina 26 female

1-2. 集計

describe()関数を利用すると、データフレームの概要を把握することが出来ます。

  • count: レコード数です。
  • mean: 平均値です。
  • std 標準偏差です。
  • 最小値です。
  • 25%, 50%, 75%: 第1四分位, 中央値、第3四分位です。
  • max: 最大値です。
In [700]:
df.describe()
Out[700]:
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

1つ1つのカラムをもう少し丁寧に見ていきましょう。

In [701]:
print('年齢の最大値: {0}'.format(max_age))

mean_age = df['Age'].mean()
print('年齢の平均値: {0}'.format(mean_age))
年齢の最大値: 0.42
年齢の平均値: 29.69911764705882

データフレームの特定の列に対して、max()やmean()などの集計実行することが出来ます。

年齢の高い上位10名を確認してみましょう。

上位10名は全員男性のようですね。女性に限定してデータを見てみましょう。

In [702]:
df[df.Sex=='female'][['Name', 'Sex', 'Age']].sort('Age', ascending=0).head(10)
Out[702]:
Name Sex Age
483 Turkula, Mrs. (Hedwig) female 63
275 Andrews, Miss. Kornelia Theodosia female 63
829 Stone, Mrs. George Nelson (Martha Evelyn) female 62
366 Warren, Mrs. Frank Manley (Anna Sophia Atkinson) female 60
268 Graham, Mrs. William Thompson (Edith Junkins) female 58
195 Lurette, Miss. Elise female 58
11 Bonnell, Miss. Elizabeth female 58
772 Mack, Mrs. (Mary) female 57
879 Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) female 56
15 Hewlett, Mrs. (Mary D Kingcome) female 55

更に詳しくPandasについて知りたい場合は、Pandasの作者であるWes Mckinney著 Pythonによるデータ分析入門――NumPy、pandasを使ったデータ処がオススメです。また、オンライン上でも、基本的な情報を網羅したチュートリアルがあります。

1-3. データの前処理

不要カラムの削除

Cabin(部屋番号)などの値には多くの欠損データが含まれています。

In [604]:
df['Cabin'].isnull().sum()
Out[604]:
687

Ticket(チケット番号)は、今回の分析では有用とは考えられません。

In [217]:
df[['Name', 'Ticket']].head()
Out[217]:
Name Ticket
1 Cumings, Mrs. John Bradley (Florence Briggs Th... PC 17599
2 Heikkinen, Miss. Laina STON/O2. 3101282
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) 113803
8 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) 347742
9 Nasser, Mrs. Nicholas (Adele Achem) 237736

CabinTicketのカラムは削除してしまいましょう。

In [605]:
df = df.drop(['Ticket', 'Cabin'], axis=1)
In [606]:
df.head()
Out[606]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Fare Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 7.2500 S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 71.2833 C
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 7.9250 S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 53.1000 S
4 5 0 3 Allen, Mr. William Henry male 35 0 0 8.0500 S

欠損値の補間

データフレーム中に、NaN という値があります。これが今回の欠損値です。

In [703]:
df.loc[4:10]
Out[703]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James male NaN 0 0 330877 8.4583 NaN Q
6 7 0 1 McCarthy, Mr. Timothy J male 54 0 0 17463 51.8625 E46 S
7 8 0 3 Palsson, Master. Gosta Leonard male 2 3 1 349909 21.0750 NaN S
8 9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27 0 2 347742 11.1333 NaN S
9 10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14 1 0 237736 30.0708 NaN C
10 11 1 3 Sandstrom, Miss. Marguerite Rut female 4 1 1 PP 9549 16.7000 G6 S

Pandasには データの補間 を行うための interpolate()関数が存在します。

In [704]:
df.loc[4:6][['Name', 'Age']].interpolate()
Out[704]:
Name Age
4 Allen, Mr. William Henry 35.0
5 Moran, Mr. James 44.5
6 McCarthy, Mr. Timothy J 54.0

補間の手法が様々実装されていますが、デフォルトでは線型補間によりデータを補完します。ただし、今回のように並び順に意味のないデータの場合、この方法による補間は有効とは言えません。あくまで関数の紹介目的で解説しました。

次に、年齢の欠損値を、性別毎の年齢の平均値で補間してみます。

In [705]:
female_age_mean = round(df[df.Sex=='female']['Age'].mean())
male_age_mean = round(df[df.Sex=='male']['Age'].mean())

print('女性の平均年齢は{0}歳、男性は{1}歳です。この平均年齢で補間します。'.format(female_age_mean, male_age_mean))

# df = pd.read_csv("data/train.csv")

df[df.PassengerId==20][['PassengerId', 'Name', 'Sex', 'Age']]
女性の平均年齢は28.0歳、男性は31.0歳です。この平均年齢で補間します。
Out[705]:
PassengerId Name Sex Age
19 20 Masselmani, Mrs. Fatima female NaN
In [707]:
round(df[df.Sex=='male']['Age'].mean())
Out[707]:
31.0
In [708]:
df[df.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
Out[708]:
PassengerId Name Sex Age
5 6 Moran, Mr. James male NaN
In [709]:
# df = pd.read_csv("data/train.csv")

dff = df[df.Sex=='female'].fillna({'Age': female_age_mean})
dfm = df[df.Sex=='male'].fillna({'Age': male_age_mean})

df2 = dff.append(dfm)
In [228]:
df[df.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
Out[228]:
PassengerId Name Sex Age
5 6 Moran, Mr. James male 31

カラムの追加

データフレームにカラムを追加します。

年齢で分類し、数値をふってみましょう。

In [711]:
def classification_age(age):
    if age <= 19:
        return '1'
    elif age <= 34:
        return '2'
    elif age <= 49:
        return '3'
    elif age >= 50:
        return '4'    
    else:
        return '0'

# lambdaを利用
# df['AgeClass'] = df.Age.map(lambda x: 0 if x >= 50 else 1)
        
df['AgeClass'] = df.Age.map(classification_age)
df.head()
Out[711]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked AgeClass
0 1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 NaN S 2
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38 1 0 PC 17599 71.2833 C85 C 3
2 3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9250 NaN S 2
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 C123 S 3
4 5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 NaN S 3

1-4. データの可視化

読み込んだデータをビジュアライズしてどのようなロジックで生存者が見分けられるのか、ざっくり調べてみましょう。可視化にはPandasのプロット関数を使います。ここに紹介した以外にも様々な例があります。

まず、年齢や、性別等によって生存確率がどのように異なるのかを調べるためにデータを可視化してみます。

0 = 死亡, 1 = 生存という2つの軸でテータを見てみます。

In [695]:
# df['Survived'].hist(alpha=0.5, bins=2)

df['Survived'].plot(alpha=0.6, kind='hist', bins=2)
plt.xlabel('Survived')
plt.ylabel('N')
Out[695]:
<matplotlib.text.Text at 0x13da575c0>

男性 / 女性の軸を加えてデータを見てみましょう。

In [648]:
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(6, 3))

i = 0
for sex in ['male', 'female']:
    df['Survived'][df.Sex==sex].hist(alpha=0.5, bins=2, ax=axes[i])
    axes[i].set_title(sex)

    i =+ 1
    
#plt.xlabel('Survived')    
#plt.ylabel('N')

# plt.subplots_adjust(wspace=0.5, hspace=0.5)
fig.subplots_adjust(hspace=0.3)
fig.tight_layout()

男性よりも、女性のほうが生存率が高いことが分かります。ここに年齢を軸に加えます。

In [649]:
plt.hist([df[(df.Survived==0) & (df.Sex=='male')]['Age'],
          df[(df.Survived==1) & (df.Sex=='male')]['Age']],
          alpha=0.6, range=(1,80), bins=10, stacked=True,
          label=('Died', 'Survived'))
plt.legend()
plt.xlabel('Age')
plt.ylabel('N')
plt.title('male')
Out[649]:
<matplotlib.text.Text at 0x136e1e710>
In [650]:
plt.hist([df[(df.Survived==0) & (df.Sex=='female')]['Age'],
          df[(df.Survived==1) & (df.Sex=='female')]['Age']],
          alpha=0.6, range=(1,80), bins=10, stacked=True,
          label=('Died', 'Survived'))
plt.legend()
plt.xlabel('Age')
plt.ylabel('N')
plt.title('female')
Out[650]:
<matplotlib.text.Text at 0x11e90d6d8>
In [675]:
fig = plt.figure(figsize=[15, 5])

ax1 = fig.add_subplot(121)

plt.hist([df[(df.Survived==0) & (df.Sex=='female')]['Age'],
          df[(df.Survived==1) & (df.Sex=='female')]['Age']],
          alpha=0.6, range=(1,80), bins=10, stacked=True,
          label=('Died', 'Survived'))

plt.xlabel('Age')
plt.yticks([0, 40, 80, 120])
plt.ylabel('N')
plt.title('female')
plt.legend()

ax2 = fig.add_subplot(122)

plt.hist([df[(df.Survived==0) & (df.Sex=='male')]['Age'],
          df[(df.Survived==1) & (df.Sex=='male')]['Age']],
          alpha=0.6, range=(1,80), bins=10, stacked=True,
          label=('Died', 'Survived'))

plt.xlabel('Age')
plt.yticks([0, 40, 80, 120])
plt.ylabel('N')
plt.title('male')
plt.legend()

plt.show()
plt.savefig('out.png')

!ls -al
total 3888
drwxr-xr-x@ 19 takahiro_ikeuchi  staff     646  3  7 13:58 .
drwxr-xr-x@ 28 takahiro_ikeuchi  staff     952  3  4 14:31 ..
drwxr-xr-x@ 11 takahiro_ikeuchi  staff     374  3  5 18:40 .git
-rw-r--r--@  1 takahiro_ikeuchi  staff      77  3  4 14:31 .gitignore
drwxr-xr-x@  6 takahiro_ikeuchi  staff     204  3  7 12:23 .ipynb_checkpoints
drwxr-xr-x@  5 takahiro_ikeuchi  staff     170  3  5 21:50 KaggleAux
-rw-r--r--@  1 takahiro_ikeuchi  staff   11353  3  4 14:31 LICENSE
-rw-r--r--@  1 takahiro_ikeuchi  staff    2469  3  6 22:23 ML-TEST.ipynb
-rw-r--r--@  1 takahiro_ikeuchi  staff  284764  3  7 13:58 PyDataTokyoTutorial_DataHandling.ipynb
-rw-r--r--@  1 takahiro_ikeuchi  staff  660261  3  5 21:51 PyDataTokyoTutorial_Intro.ipynb
-rw-r--r--@  1 takahiro_ikeuchi  staff  369637  3  4 14:31 PyDataTokyoTutorial_MachineLearning.ipynb
drwxr-xr-x@  6 takahiro_ikeuchi  staff     204  3  4 14:31 Python Examples
-rw-r--r--@  1 takahiro_ikeuchi  staff    4072  3  4 14:31 ReadMe.md
-rw-r--r--@  1 takahiro_ikeuchi  staff  629228  3  4 14:31 Titanic.ipynb
-rw-r--r--@  1 takahiro_ikeuchi  staff    3521  3  7 12:26 aaaa.ipynb
drwxr-xr-x@  5 takahiro_ikeuchi  staff     170  3  4 14:31 data
drwxr-xr-x@  6 takahiro_ikeuchi  staff     204  3  4 14:31 images
-rw-r--r--@  1 takahiro_ikeuchi  staff    1205  3  7 13:59 out.png
-rw-r--r--@  1 takahiro_ikeuchi  staff     350  3  4 14:31 requirements.txt
<matplotlib.figure.Figure at 0x120594780>

最後に、Pclass(等級)の軸も加えて可視化してみましょう。

In [651]:
mean_age = df['Age'].mean()

for pclass in [1, 2, 3]:
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=[10, 10])

    sex_n=0
    for sex in ['male', 'female']:
        for survived in [0, 1]:
                fig = df[((df.Survived==survived) & (df.Sex==sex) & (df.Pclass==pclass) )].Age.hist(alpha=0.6, bins=10, ax=axes[sex_n][survived])
                fig.set_xlabel("Age")    
                fig.set_ylabel('N ('+sex+str(survived)+' )')  
                axes[sex_n][survived].set_ylim(0,70)
                fig.set_title('Pclass = {0} / mean_age = {1}'.format(pclass, round(mean_age)))
                
        sex_n += 1
    plt.subplots_adjust(hspace=0.5)
    plt.show()

まとめ

  • Pandasによるデータの読み込み、前処理、集計の方法を学びました。
  • maptloblibによるデータの可視化について学びました。
  • Pandasとmatplotlibを利用して、今回利用するデータの性質を確認しました。
In [ ]: