<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 PyData.Tokyo Tutorial
https
Step1:  以下のようなデータがある
PassengerId
Step2:  データを見てみよう
Step3:  1-2. 集計
describe()関数を利用すると、データフレームの概要を把握することが出来ます。
count
Step4:  1-3. データの前処理
不要カラムの削除
Step5:  欠損値の補間
Step6:  カラムの追加
Step7:  1-4. データの可視化
<ASSISTANT_TASK:>
Python Code:
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("train.csv")
df.head()
Explanation: PyData.Tokyo Tutorial
https://pydata.tokyo/ipynb/tutorial-1/dh.html
df[df.Embarked=='C']  # Embarked=='C'で絞り込み
df[df.Embarked=='C']['Survived']  # Embarked=='C'で絞り込んだdfのSurvived列を取得
df[(df.Embarked=='C') &amp; (df.Sex=='male')]  # 複数の絞り込み条件
df.query("Embarked=='C' &amp; Sex=='male'")  # df.queryを使うとすっきり書ける。ただし、変な列名(スペースがあったり/が入ってたりPython予約語と被っている）だと死ぬ
df[['PassengerId', 'Survived', 'Pclass']]  # 'PassengerId', 'Survived', 'Pclass'の列からなるdfを作成
1-1 データの読み込み
https://www.kaggle.com/c/titanic から data.csv を落とす
End of explanation
# 65歳の人のデータを抜き出す
df[df.Age == 65][['Name', 'Age']]
Explanation: 以下のようなデータがある
PassengerId: 乗客ID
Survived: 1 = 生き残り 0 = 死亡
Pclass: 等級
Name: 名前
Sex: 性別
Age: 年齢
Parch: 子供の数
Ticket: チケット番号
Fare: 運賃
Cabin: 部屋番号
Embarked: 乗船地
End of explanation
# データ件数
len(df)
# 先頭2件を確認
df.head(2)
# 後ろ5件(デフォルト5件)を確認
df.tail()
# 先頭3件の名前、年齢、性別のみ出力
df[['Name', 'Age', 'Sex']].head(3)
Explanation: データを見てみよう
End of explanation
# 計算可能なもの(数値)だけが対象
df.describe()
max_age = df['Age'].max()
print('年齢の最大値: {0}'.format(max_age))
mean_age = df['Age'].mean()
print('年齢の平均値: {0}'.format(mean_age))
# 女性で年齢の高い上位10名を確認する
df[df.Sex=='female'][['Name', 'Sex', 'Age']].sort_values('Age', ascending=0).head(10)
Explanation: 1-2. 集計
describe()関数を利用すると、データフレームの概要を把握することが出来ます。
count: レコード数です。
mean: 平均値です。
std: 標準偏差です。
min: 最小値です。
25%, 50%, 75%: 第1四分位, 中央値、第3四分位です。
max: 最大値です。
End of explanation
# Cabin (部屋番号)などの値には多くの欠損データが含まれている
# 687件が欠損している
df['Cabin'].isnull().sum()
# Ticket（チケット番号）は、今回の分析では有用ではなさそう
df[['Name', 'Ticket']].head()
# CabinとTicketのカラムを削除する
# 列指定で削除したいので axis=1 を指定する
df = df.drop(['Ticket', 'Cabin'], axis=1)
# df を上書きしているので、2回実行すると「TicketとCabinがないよー」って言われる
df.head()
Explanation: 1-3. データの前処理
不要カラムの削除
End of explanation
# Age, Cabin などに欠損値(NaN)があることを確認
df.loc[4:10]
# interpolate() 関数で欠損値を補間する
# とはいえ、年齢で前後の間を埋めるのはよくない
df.loc[4:6][['Name', 'Age']].interpolate()
df.loc[4:6][['Name', 'Age']]
# 年齢の欠損値を、性別毎の年齢の平均値で補間する
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[df.PassengerId==20][['PassengerId', 'Name', 'Sex', 'Age']]
# 男性で年齢が欠損している人の例
df[df.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
# 年齢の欠損値を平均で埋める
dff = df[df.Sex=='female'].fillna({'Age': female_age_mean})
dfm = df[df.Sex=='male'].fillna({'Age': male_age_mean})
df2 = dff.append(dfm)
# 新しいデータフレームでは年齢の平均値が入っている
df2[df2.PassengerId==20][['PassengerId', 'Name', 'Sex', 'Age']]
df2[df2.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
Explanation: 欠損値の補間
End of explanation
# 年齢で分類し、数値をふる
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'
# df.Age は df['Age] と同じ
df = df2
df['AgeClass'] = df.Age.map(classification_age)
df.head()
Explanation: カラムの追加
End of explanation
# 0 = 死亡, 1 = 生存という２つの軸でテータを見る
df['Survived'].plot(alpha=0.6, kind='hist', bins=2)
plt.xlabel('Survived')
plt.ylabel('N')
# 男性女性の死亡/生存をグラフにする
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(6, 3))
for i, sex in enumerate(['male', 'female']):
    df['Survived'][df.Sex==sex].hist(alpha=0.5, bins=2, ax=axes[i])
    axes[i].set_title(sex)
fig.subplots_adjust(hspace=0.3)
fig.tight_layout()
# 男性の年齢ごとの死亡/生存をグラフにする
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')
# 女性の年齢ごとの死亡/生存をグラフにする
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')
# 女性と男性のグラフをY軸を合わせて並べて描画
fig = plt.figure(figsize=[15, 5])
# http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot
# 121 は nrows, ncols, plot_number
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, 50, 100, 150, 200, 250])
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, 50, 100, 150, 200, 250])
plt.ylabel('N')
plt.title('male')
plt.legend()
plt.show()
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()
Explanation: 1-4. データの可視化
End of explanation
<END_TASK>