#!/usr/bin/env python # coding: utf-8 # In[104]: # warningsを無視する import warnings warnings.filterwarnings('ignore') # # 4.1 ライブラリのインポートとデータの読み込み # In[2]: import numpy as np import pandas as pd # In[9]: df_train = pd.read_csv("./titanic_csv/train.csv") df_test = pd.readb_csv("./titanic_csv/test.csv") df_gender_submission = pd.read_csv("./titanic_csv/gender_submission.csv") # In[24]: import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns # In[121]: # 本文にはない、レイアウト設定用 sns.set_palette("Blues_r", 3) # 青3色のスタイル mpl.style.use('seaborn-white') # 背景が白いスタイル # jupyter notebook用 get_ipython().run_line_magic('', 'matplotlib inline') # 日本語表示用 ##カーネルでは日本語表示できない plt.rcParams["font.size"] = 18 plt.rcParams['font.family'] = 'IPAPGothic' # サイズの設定 plt.rcParams['figure.figsize'] = (8.0, 6.0) # # 4.2 データの概要を確認する # ## 4.2.1 データフレームについて # In[10]: df_train.head(5) # ## 4.2.2 データフレームの行数と列数を確認 # In[11]: print(df_train.shape) # 学習用データ print(df_test.shape) # 本番予測用データ print(df_gender_submission.shape) # 提出データのサンプル # ## 4.2.3 列の名前の確認 # In[12]: print(df_train.columns) # トレーニングデータの列名 print('-'*10) # 区切りを挿入 print(df_test.columns) # テストデータの列名 # ## 4.2.4 df.info()で概要の確認 # In[13]: df_train.info() # In[14]: df_test.info() # ## 4.2.5 df.head()で概要の確認 # In[15]: df_train.head() # ## 4.2.6 欠損値がいくつあるか確認 # In[16]: df_train.isnull().sum() # isnull()は、欠損値に対しTrueを返し、欠損値以外にはFalseを返す # sum()は、Trueを1、Falseを0として合計する # よってdf.isnull().sum()で欠損値を算出することができる # In[17]: df_test.isnull().sum() # ## 4.2.7 要約統計量の表示 # In[20]: # df_trainとdf_Testを縦に連結 df_full = pd.concat([df_train, df_test], axis = 0, ignore_index=True) print(df_full.shape) # df_fullの行数と列数を確認 df_full.describe() # df_fullの要約統計量 # ## 4.2.8 死亡者と生存者の可視化 # In[124]: # 男女別の生存者数を可視化 sns.countplot(x='Survived', data=df_train) plt.xlabel("Survived", fontsize = 20) plt.ylabel("count", fontsize = 20) plt.title("死亡者と生存者の数", fontsize = 20) plt.yticks(fontsize = 20) plt.xticks([0.0,1.0], ['死亡','生存']) plt.xticks([0,1],["死亡者", "生存者"], fontsize = 20) plt.show() # 男女別の生存割合を表示する df_train[['Sex','Survived']].groupby(['Sex']).mean() # In[125]: sns.countplot(x='Survived', hue='Sex', data=df_train) plt.xticks([0.0,1.0], ["死亡","生存"]) plt.tick_params(labelsize=20) plt.xlabel('Survived', fontsize = 20) plt.ylabel('count',fontsize=20) plt.title("男女別の死亡者と生存者の数", fontsize = 20) plt.legend(fontsize = 20) plt.tight_layout() # ## 4.2.9 チケットクラス # In[128]: # チケットクラス別の生存者数を可視化 sns.countplot(x='Survived', hue='Pclass', data=df_train) plt.xticks([0.0,1.0], ['死亡','生存']) plt.title("チケットクラス別の死亡者と生存者の数", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Survived', fontsize = 20) plt.ylabel('count',fontsize=20) plt.legend(fontsize = 20) plt.tight_layout() plt.show() # チケットクラス別の生存割合を表示する df_train[['Pclass','Survived']].groupby(['Pclass']).mean() # ## 4.2.10 年齢の分布 # In[129]: # 全体のヒストグラム sns.distplot(df_train['Age'].dropna(), kde=False, bins = 30 ,color = "yellow",label="全体") plt.title("乗船者の年齢の分布", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Age', fontsize = 20) plt.ylabel('count',fontsize=20) # 死亡者のヒストグラム sns.distplot(df_train[df_train["Survived"] == 0].Age.dropna(), kde = False,bins=30,color = "green", label="死亡") # 生存者のヒストグラム sns.distplot(df_train[df_train["Survived"] == 1].Age.dropna(), kde = False,bins=30,color = "red", label="生存") plt.legend(fontsize = 20); # 凡例を表示 # In[44]: # 年齢を8等分し、CategoricalAgeという変数を作成 df_train['CategoricalAge'] = pd.cut(df_train['Age'], 8) # CategoricalAgeでグルーピングして、Survivedを平均 df_train[['CategoricalAge', 'Survived']].groupby(['CategoricalAge'], as_index=False).mean() # ## 4.2.11 タイタニック号に乗っている兄弟・配偶者の数 # In[102]: sns.countplot(x='SibSp', data = df_train, color='cornflowerblue') plt.title("同乗している兄弟・配偶者の数", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('SibSp', fontsize = 20) plt.ylabel('count',fontsize=20) plt.tight_layout() # In[130]: # SibSpが0か1であればそのまま、2以上であれば2である特徴量SibSp_0_1_2overを作成 df_train["SibSp_0_1_2over"] = [i if i <=1 else 2 for i in df_train["SibSp"]] # SibSp_0_1_2overごとに集計し、可視化 sns.countplot(x='Survived', hue='SibSp_0_1_2over', data=df_train) plt.legend(["0人","1人","2人以上"],fontsize =20) plt.xticks([0,1],["死亡","生存"],fontsize = 20) plt.title("同乗している兄弟・配偶者の数別の死亡者と生存者の数", fontsize = 20) plt.xlabel("Survived",fontsize = 20) plt.ylabel("count",fontsize = 20) plt.show() df_train[["SibSp_0_1_2over","Survived"]].groupby(["SibSp_0_1_2over"]).mean() # ## 4.2.12 タイタニック号に乗っている両親・子供の数 # In[85]: sns.countplot(x='Parch', data = df_train ,color='cornflowerblue') plt.title("同乗している両親・子供の数", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Parch', fontsize = 20) plt.ylabel('count',fontsize=20) plt.tight_layout() # In[131]: sns.set_palette("Blues_r", 4) # 2以下であればそのままの数、3以上は3という変換を行う df_train["Parch_0_1_2_3over"] = [i if i <=2 else 3 for i in df_train["Parch"]] # Parch_0_1_2_3overごとに集計し可視化 sns.countplot(x="Survived",hue="Parch_0_1_2_3over", data = df_train) plt.title("同乗している両親・子供の数別の死亡者と生存者の数", fontsize = 20) plt.legend(["0人","1人","2人","3人以上"],fontsize=20) plt.xticks([0,1],["死亡","生存"],fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Parch', fontsize = 20) plt.ylabel('count',fontsize=20) plt.tight_layout() # In[87]: df_train[["Parch_0_1_2_3over","Survived"]].groupby(["Parch_0_1_2_3over"]).mean() # ## 4.2.13 1人で乗船しているか2人以上で乗船しているか # In[90]: #SibSpとParchが同乗している家族の数。1を足すと家族の人数となる df_train['FamilySize']=df_train['SibSp']+ df_train['Parch']+ 1 # IsAloneを0とし、2行目でFamilySizeが1であれば1にしている df_train['IsAlone'] = 0 df_train.loc[df_train['FamilySize'] == 1, 'IsAlone'] = 1 # IsAloneごとに可視化 sns.countplot(x="Survived",hue="IsAlone",data=df_train) plt.legend(["2人以上","1人で乗船"],fontsize = 20) plt.xticks([0,1],["死亡","生存"],fontsize=20) plt.xlabel("Survived",fontsize=20) plt.ylabel("count",fontsize=20) plt.yticks(fontsize=20) plt.title("1人or2人以上で乗船別の死亡者と生存者の数",fontsize=20) # ## 4.2.14 運賃の分布 # In[91]: sns.distplot(df_train['Fare'].dropna(),kde = False,hist=True); plt.title("運賃の分布", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Fare', fontsize = 20) plt.ylabel('count',fontsize=20) plt.tight_layout() # In[92]: sns.distplot(df_train['Fare'].dropna(), rug=False, kde = False,hist=True); plt.title("運賃の分布", fontsize = 20) plt.tick_params(labelsize=20) plt.xlabel('Fare', fontsize = 20) plt.ylabel('count',fontsize=20) plt.tight_layout() # In[93]: df_train['CategoricalFare'] = pd.qcut(df_train['Fare'], 4) df_train[['CategoricalFare', 'Survived']].groupby(['CategoricalFare'], as_index=False).mean() # ## 4.2.13 名前 # In[95]: df_test['Name'][0:5] # In[96]: # 敬称を抽出し、重複を省く set(df_train.Name.str.extract(' ([A-Za-z]+)\.', expand=False)) # In[97]: # collections.Counterを使用して、数え上げる import collections collections.Counter(df_train.Name.str.extract(' ([A-Za-z]+)\.', expand=False)) # In[98]: # df_trainにTitle列を作成、Title列の値は敬称 df_train['Title'] = df_train.Name.str.extract(' ([A-Za-z]+)\.', expand=False) # df_testにTitle列を作成、Title列の値は敬称 df_test['Title'] = df_test.Name.str.extract(' ([A-Za-z]+)\.', expand=False) # df_trainのTitle列の値ごとに平均値を算出 df_train.groupby('Title').mean()['Age'] # In[99]: # 変換するための関数を作成 def title_to_num(title): if title == 'Master': return 1 elif title == 'Miss': return 2 elif title == 'Mr': return 3 elif title == 'Mrs': return 4 else: return 5 # リスト内包表記を用いて変換 df_train['Title_num'] = [title_to_num(i) for i in df_train['Title']] df_test['Title_num'] = [title_to_num(i) for i in df_test['Title']]