df[df.Embarked=='C'] # Embarked=='C'で絞り込み
df[df.Embarked=='C']['Survived'] # Embarked=='C'で絞り込んだdfのSurvived列を取得
df[(df.Embarked=='C') & (df.Sex=='male')] # 複数の絞り込み条件
df.query("Embarked=='C' & Sex=='male'") # df.queryを使うとすっきり書ける。ただし、変な列名(スペースがあったり/が入ってたりPython予約語と被っている)だと死ぬ
df[['PassengerId', 'Survived', 'Pclass']] # 'PassengerId', 'Survived', 'Pclass'の列からなるdfを作成
In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
df = pd.read_csv("train.csv")
df.head()
Out[2]:
以下のようなデータがある
In [3]:
# 65歳の人のデータを抜き出す
df[df.Age == 65][['Name', 'Age']]
Out[3]:
In [4]:
# データ件数
len(df)
Out[4]:
In [5]:
# 先頭2件を確認
df.head(2)
Out[5]:
In [6]:
# 後ろ5件(デフォルト5件)を確認
df.tail()
Out[6]:
In [7]:
# 先頭3件の名前、年齢、性別のみ出力
df[['Name', 'Age', 'Sex']].head(3)
Out[7]:
In [8]:
# 計算可能なもの(数値)だけが対象
df.describe()
Out[8]:
In [9]:
max_age = df['Age'].max()
print('年齢の最大値: {0}'.format(max_age))
mean_age = df['Age'].mean()
print('年齢の平均値: {0}'.format(mean_age))
In [10]:
# 女性で年齢の高い上位10名を確認する
df[df.Sex=='female'][['Name', 'Sex', 'Age']].sort_values('Age', ascending=0).head(10)
Out[10]:
In [11]:
# Cabin (部屋番号)などの値には多くの欠損データが含まれている
# 687件が欠損している
df['Cabin'].isnull().sum()
Out[11]:
In [12]:
# Ticket(チケット番号)は、今回の分析では有用ではなさそう
df[['Name', 'Ticket']].head()
Out[12]:
In [13]:
# CabinとTicketのカラムを削除する
# 列指定で削除したいので axis=1 を指定する
df = df.drop(['Ticket', 'Cabin'], axis=1)
# df を上書きしているので、2回実行すると「TicketとCabinがないよー」って言われる
In [14]:
df.head()
Out[14]:
In [15]:
# Age, Cabin などに欠損値(NaN)があることを確認
df.loc[4:10]
Out[15]:
In [16]:
# interpolate() 関数で欠損値を補間する
# とはいえ、年齢で前後の間を埋めるのはよくない
df.loc[4:6][['Name', 'Age']].interpolate()
Out[16]:
In [17]:
df.loc[4:6][['Name', 'Age']]
Out[17]:
In [18]:
# 年齢の欠損値を、性別毎の年齢の平均値で補間する
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))
In [19]:
# 女性で年齢が欠損している人の例
df[df.PassengerId==20][['PassengerId', 'Name', 'Sex', 'Age']]
Out[19]:
In [20]:
# 男性で年齢が欠損している人の例
df[df.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
Out[20]:
In [21]:
# 年齢の欠損値を平均で埋める
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 [22]:
# 新しいデータフレームでは年齢の平均値が入っている
df2[df2.PassengerId==20][['PassengerId', 'Name', 'Sex', 'Age']]
Out[22]:
In [23]:
df2[df2.PassengerId==6][['PassengerId', 'Name', 'Sex', 'Age']]
Out[23]:
In [24]:
# 年齢で分類し、数値をふる
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()
Out[24]:
In [25]:
# 0 = 死亡, 1 = 生存という2つの軸でテータを見る
df['Survived'].plot(alpha=0.6, kind='hist', bins=2)
plt.xlabel('Survived')
plt.ylabel('N')
Out[25]:
In [26]:
# 男性女性の死亡/生存をグラフにする
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()
In [27]:
# 男性の年齢ごとの死亡/生存をグラフにする
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[27]:
In [28]:
# 女性の年齢ごとの死亡/生存をグラフにする
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[28]:
In [29]:
# 女性と男性のグラフを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()
In [30]:
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()
In [ ]: