pythonによるKaggleのTitanicデータ解析例

35974 ワード

一、データ処理方向では、R言語よりもpythonの方がプログラミング言語に近いので、まずpandasパッケージの内容を学び、その後sklearnパッケージの運用を学び、まずそうしましょう.私は意外にも1回の完全な模型の構築さえしたことがなくて、悲しくて、、、
二、kaggleの上の入門例を引用して、Titanicのデータ学習はkaggleのウェブサイトの上で分かち合うコードで、私は基本的にそれを翻訳して、元のウェブサイト:https://www.kaggle.com/omarelgabry/titanic/a-journey-through-titanicpythonバージョン:anacondaをインストールしています.中にはいろいろなパッケージがありますが、seabornパッケージはありません.pip install seabornを使用してインストールしたり、conda install seabornを使用したりします.
1、大まかな考え方は明らかである:1変数ごとにデータ探索を行い、それを図として、それから変数を捨てられ、例えばEmbarked、変数が分割され、例えば性別Femaleとmale、変数が合併されるなどである.②train集合とtest集合は共に変数を取捨選択し,モデリングに便利である.③異なるモデルでtrain集合をフィッティングし、異なるモデルに採点し、最も採点の高いモデルを提出します.これはsklearnパッケージで実現する必要があります.多くのアルゴリズムを持っています.
2、私が一番難しいのは:1統計学の基礎があって、データに対して敏感で、データの分布に対して一定の感知能力があって、これは各種のデータの分布に対して非常に理解する必要があります.②データフィールド操作時にtrainとtestの2つの集合を同時に操作し、モデリング時の変数が正確になるようにする.③sklearnにおける各モデルとモデルの使用について一定の理解がある.
3、私が実习する时、データ処理はRで书いて、各変数の分布を见る前に、データに対してとても粗い処理を行って、例えば:集中度、欠失度、因子レベル、iv値、これらの変数はもし一定の硬い基准に达しないならば、スクリプトは自动的にこれらの変数を削除して、変数の分布を见る必要はありません.このデータ処理の標準化プロセスの一つとして、ぜひ覚えておきたいと思います!!!三、コード:1、データの準備とロード:1まずパッケージを導入する
from pandas import DataFrame
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble importRandomForestClassifier
   pandas  DataFrame  ,numpy ,matplotlib ,seaborn ,  sklearn                ,sklearn             、、

②データをロードして表示する:
titanic_df=pd.read_csv('C:\\Datemining\\tatannic\\train.csv', dtype={"Age": np.float64}, )
test_df=pd.read_csv('C:\\Datemining\\tatannic\\test.csv', dtype={"Age": np.float64}, )
titanic_df.head()
titanic_df.info()
print("----------------------------")
test_df.info()
titanic_df = titanic_df.drop(['PassengerId','Name','Ticket'], axis=1)
test_df    = test_df.drop(['Name','Ticket'], axis=1)
 pandas.read_csv()       csv   train test  (R     read.csv()),           DataFrame, DataFrame.head()         , DataFrame.info()           。
 train 'PassengerId','Name','Ticket'     ,test  'Name','Ticket' 。
train test         :
<class 'pandas.core.frame.DataFrame'>
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: 66.2+ 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: 27.8+ KB

DataFrameでshapeプロパティは、データ・ボックスのサイズを表示し、3つの変数を削除したtrainのサイズは891です.×9のデータ・ボックス.
titanic_df.shape
(891, 9)

2、変数探索:①"Embarked"フィールド、翻訳すると「乗船タイプ」と呼ぶべきデータボックスがある列を引用するには2つの方法があり、1つは使用する.参照、1つは[]参照で、個人は1つ目に傾き、オブジェクト向けの参照方法に似ています.(R言語の場合はdataframe$Embarkedで参照)統計でtrainデータのEmbarked非空の値が得られ、count()関数で、Embarkedには2つの空の値があることがわかります
titanic_df.Embarked.count()
Out[16]: 889
  :
titanic_df['Embarked'].count()
Out[19]: 889

どのレコードが空の値であるかを表示できます.
titanic_df.Embarked[titanic_df.Embarked.isnull()]
Out[8]: 
61     NaN
829    NaN
Name: Embarked, dtype: object
isnull()はbooleanのSeriesシーケンスの値を返し、参照時に返される値はtureの値(R言語ではtitanic_df$Embarked[which(titanic_df$Embarked==NA)]と表記され、61と829のレコードが空で、2つだけが空であることがわかります.groupbyメソッドで大まかに統計すると、Embarkedの値は次のようになります.
titanic_df.groupby('Embarked').Survived.count()
>Out[13]: 
Embarked
C    168
Q     77
S    646
Name: Survived, dtype: int64
    Embarked    3  ,            ,            'S',   。               'S'   
(     int  ,            (<20%)     、      )
titanic_df["Embarked"] = titanic_df["Embarked"].fillna("S")
 Embarked       ,            ,            :
sns.factorplot('Embarked','Survived',data=titanic_df,size=3,aspect=3)
   :
![  kind   ](http://img.blog.csdn.net/20160706083315745)
   seaborn  factorplot  ,        factorplot()      kind      :violin、strip、bar、box。       ,    kind='violin'               ,      !
          fig          axis1,axis2,axis3,
fig, (axis1,axis2,axis3) = plt.subplots(1,3,figsize=(15,5))

4つの文に分割できます.
fig=plt.figure(figsize=(15,5))
axis1=fig.add_subplot(1,3,1)
axis2=fig.add_subplot(1,3,2)
axis2=fig.add_subplot(1,3,3)

1つ目の書き方はもっと洗練されています!拡張すると、matplotlibのpyplotのfigureを使用して画像を定義する場合、座標軸を統一的に定義する名前にpltのプロパティを使用すると、次のようになります.
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(10,5))
fig.title('testdata')
fig.xlabel('age')
fig.ylabel('survived')
plt.show()
               title:
axis1=fig.add_subplot(131)
axis1.set_xlabel('age')
axis1.set_ylabel('survived')
temp1.plot()
temp1   DataFrame,  plot()        axis1

初歩的な統計とfactorplot関数の図面を経て、大体Embarkedという変数の分布状況に対して一定の理解があって、1つのfigの中に3つのサブ図があることを定義したので、次は3つのサブ図に対する充填です:
sns.countplot(x='Embarked', data=titanic_df, ax=axis1)

sns.countplot(x='Survived', hue="Embarked", data=titanic_df, order=[1,0], ax=axis2)

上の2行はそれぞれfigの前の2つの図を埋めて、axis 1はEmbarkedの3つの値を統計して、axis 2はSurvivedの値を統計します;次はembark_を構築しますpercデータボックスは、その3つの値の平均値を計算します.
embark_perc = titanic_df[['Embarked','Survived"]].groupby(['Embarked'],as_index=False).mean()
sns.barplot(x='Embarked', y='Survived', data=embark_perc,order=['S','C','Q'],ax=axis3)
titanic_df[['Embarked','Survived"]].groupby(['Embarked']はsql文のgroupby関数に相当し、mean()関数はそれに対して平均値を計算した後、データボックスDataFrameを生成する.(図はアップロードしません)
pdを使用する.get_dummies()メソッドはEmbarkedという変数の指標を得,trainとtestがこの統計指標テーブルをそれぞれ右に接続すると,3つの新しい変数:’S’,’C’,’Q’が生成される.接続後の「S」変数の寄与度が小さすぎて、「S」という変数を削除し、「C」、「Q」を保持し、この2つの列の値が0または1のラベルであることが明らかになった.
embark_dummies_titanic  = pd.get_dummies(titanic_df['Embarked'])
embark_dummies_titanic.drop(['S'], axis=1, inplace=True) embark_dummies_test = pd.get_dummies(test_df['Embarked']) embark_dummies_test.drop(['S'], axis=1, inplace=True) titanic_df = titanic_df.join(embark_dummies_titanic) test_df = test_df.join(embark_dummies_test) titanic_df.drop(['Embarked'], axis=1,inplace=True) test_df.drop(['Embarked'], axis=1,inplace=True)

元のEmabrekedという変数を削除します.
titanic_df.drop(['Embarked'], axis=1,inplace=True) test_df.drop(['Embarked'], axis=1,inplace=True)

注意:削除するときは、trainとtestデータを同じように処理します.忘れちゃいけない、、、
①「Fare」フィールド:チケット価格変数が数値タイプの場合、describeメソッドで統計特性を表示できます.
test_df.Fare.describe()
>Out[7]: 
count    417.000000
mean      35.627188
std       55.907576
min        0.000000
25%        7.895800
50%       14.454200
75%       31.500000
max      512.329200
Name: Fare, dtype: float64

test_df.shape
>Out[5]: (418, 10)

test_df.Fare.count()
>Out[6]: 417

テストデータにFare変数が空の値であることがわかり、fillna()メソッドで中央値を入力します.
test_df["Fare"].fillna(test_df["Fare"].median(), inplace=True)

データ処理変換、floatをintタイプに変換:
titanic_df['Fare'] = titanic_df['Fare'].astype(int)
test_df['Fare']    = test_df['Fare'].astype(int)

Fare変数に対応する生存と生存していない記録をそれぞれ得た(この参照はR言語のwhich()関数に似ている):
fare_not_survived = titanic_df["Fare"][titanic_df["Survived"] == 0]
fare_survived = titanic_df["Fare"][titanic_df["Survived"] == 1]

データ・ボックスのデータ・フレームに変換して、次のようにします.
avgerage_fare = DataFrame([fare_not_survived.mean(), fare_survived.mean()])
std_fare      = DataFrame([fare_not_survived.std(), fare_survived.std()])
     :
titanic_df['Fare'].plot(kind='hist', figsize=(10,3),bins=100, xlim=(0,50))

注意:plot()を直接呼び出すのも簡単な描画方法で、matplotlibと同じです.pyplotではオブジェクト向けの図面と同様に、研究、、
avgerage_fare.index.names = std_fare.index.names = ["Survived"]
avgerage_fare.plot(yerr=std_fare,kind='bar',legend=False)

③Age変数:年齢は対象に向かって図を描き、2つの図、それぞれtitleを設定する:
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(15,4))
axis1.set_title('Original Age values - Titanic')
axis2.set_title('New Age values - Titanic')

trainとtestの年齢の平均数、分散、空の値の数をそれぞれ得た.
average_age_titanic   = titanic_df["Age"].mean()
std_age_titanic       = titanic_df["Age"].std()
count_nan_age_titanic = titanic_df["Age"].isnull().sum()

average_age_test   = test_df["Age"].mean()
std_age_test       = test_df["Age"].std()
count_nan_age_test = test_df["Age"].isnull().sum()

ランダム製造count_nan_age_testの年齢を空の値に入力します(この方法は、numpyパッケージの反復可能なシーケンスを使用する必要があります):
rand_1 = np.random.randint(average_age_titanic - std_age_titanic, average_age_titanic + std_age_titanic, size = count_nan_age_titanic)
rand_2 = np.random.randint(average_age_test - std_age_test, average_age_test + std_age_test, size = count_nan_age_test)

titanic_df["Age"][np.isnan(titanic_df["Age"])] = rand_1
test_df["Age"][np.isnan(test_df["Age"])] = rand_2

上のコードを次のコードに置き換えてはいけません.ヒントはSeriesがhashできないことです.
rand_1 = Series(np.random.randint(average_age_titanic - std_age_titanic, average_age_titanic + std_age_titanic, size = count_nan_age_titanic))
rand_2 = Series(np.random.randint(average_age_test - std_age_test, average_age_test + std_age_test, size = count_nan_age_test))

titanic_df["Age"][titanic_df["Age"].isnull()]=rand_1
test_df["Age"][test_df["Age"].isnull]=rand_2

年齢をintに変換するには、次の手順に従います.
titanic_df['Age'] = titanic_df['Age'].astype(int)
test_df['Age']    = test_df['Age'].astype(int)

図面:
titanic_df['Age'].hist(bins=70, ax=axis1)
titanic_df['Age'].hist(bins=70, ax=axis2)

引き続き作図して、seabornのFaceGrid()の方法、調べる必要があります、
facet = sns.FacetGrid(titanic_df, hue="Survived",aspect=4)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, titanic_df['Age'].max()))
facet.add_legend()

        :
fig, axis1 = plt.subplots(1,1,figsize=(18,4))
average_age = titanic_df[["Age", "Survived"]].groupby(['Age'],as_index=False).mean()
sns.barplot(x='Age', y='Survived', data=average_age)

④Cabin変数:船室番号
 titanic_df.shape
>Out[4]: (891, 12)

titanic_df.Cabin.count()
>Out[5]: 204

titanic_df.drop("Cabin",axis=1,inplace=True)
test_df.drop("Cabin",axis=1,inplace=True)

合計891個のレコードが、204個のレコードだけが空ではなく、文字型であるため、この変数は削除されたことがわかります.
⑤ParchとSibSp変数を統合する(この2つの変数の中国語の意味がよく分からない…)Parch変数とSibSp変数をFamliy変数に統合し、0と1のラベル変数として使用します.
titanic_df.Parch.describe()
>Out[15]:
count    891.000000
mean       0.381594
std        0.806057
min        0.000000
25%        0.000000
50%        0.000000
75%        0.000000
max        6.000000
Name: Parch, dtype: float64

titanic_df.Parch[titanic_df.Parch!=0].count()
>Out[14]: 213

titanic_df.SibSp[titanic_df.SibSp!=0].count()
>Out[17]: 2830 , :
titanic_df['Family'] =  titanic_df["Parch"] + titanic_df["SibSp"]
titanic_df['Family'].loc[titanic_df['Family'] > 0] = 1
titanic_df['Family'].loc[titanic_df['Family'] == 0] = 0

test_df['Family'] =  test_df["Parch"] + test_df["SibSp"]
test_df['Family'].loc[test_df['Family'] > 0] = 1
test_df['Family'].loc[test_df['Family'] == 0] = 0
     :
titanic_df = titanic_df.drop(['SibSp','Parch'], axis=1)
test_df    = test_df.drop(['SibSp','Parch'], axis=1)
  :
fig, (axis1,axis2) = plt.subplots(1,2,sharex=True,figsize=(10,5))
sns.countplot(x='Family', data=titanic_df, order=[1,0], ax=axis1)

             :
family_perc = titanic_df[["Family", "Survived"]].groupby(['Family'],as_index=False).mean()

sns.barplot(x='Family', y='Survived', data=family_perc, order=[1,0], ax=axis2)
axis1.set_xticklabels(["With Family","Alone"], rotation=0)

seabornのcountplot()メソッドとbarplot()メソッド.
⑥統合変数Sex:ageが16歳を超えているかどうかを判断する関数を定義し、それを分類し、16歳未満は「child」、16歳以上は性別を保留する.
def get_person(passenger):
    age,sex = passenger
    return 'child' if age < 16 else sex
       Person:, apply()   train test    ( R  apply):

titanic_df['Person'] = titanic_df[['Age','Sex']].apply(get_person,axis=1)
test_df['Person']    = test_df[['Age','Sex']].apply(get_person,axis=1)
  Sex  
titanic_df.drop(['Sex'],axis=1,inplace=True)
test_df.drop(['Sex'],axis=1,inplace=True)

       ,     columns  'Child','Female','Male'
person_dummies_titanic  = pd.get_dummies(titanic_df['Person'])
person_dummies_titanic.columns = ['Child','Female','Male']
person_dummies_titanic.drop(['Male'], axis=1, inplace=True)

person_dummies_test  = pd.get_dummies(test_df['Person'])
person_dummies_test.columns = ['Child','Female','Male']
person_dummies_test.drop(['Male'], axis=1, inplace=True)

titanic_df = titanic_df.join(person_dummies_titanic)
test_df    = test_df.join(person_dummies_test)

   ,  :
fig, (axis1,axis2) = plt.subplots(1,2,figsize=(10,5))

sns.countplot(x='Person', data=titanic_df, ax=axis1)

person_perc = titanic_df[["Person", "Survived"]].groupby(['Person'],as_index=False).mean()
sns.barplot(x='Person', y='Survived', data=person_perc, ax=axis2, order=['male','female','child'])
     ,     :
titanic_df.drop(['Person'],axis=1,inplace=True)
test_df.drop(['Person'],axis=1,inplace=True)

⑦Pclass変数:等級
sns.factorplot('Pclass','Survived',order=[1,2,3], data=titanic_df,size=5)

# create dummy variables for Pclass column, & drop 3rd class as it has the lowest average of survived passengers  Pclass         ,   train test  class_3  ,          ! pclass_dummies_titanic = pd.get_dummies(titanic_df['Pclass']) pclass_dummies_titanic.columns = ['Class_1','Class_2','Class_3'] pclass_dummies_titanic.drop(['Class_3'], axis=1, inplace=True) pclass_dummies_test = pd.get_dummies(test_df['Pclass']) pclass_dummies_test.columns = ['Class_1','Class_2','Class_3'] pclass_dummies_test.drop(['Class_3'], axis=1, inplace=True) titanic_df.drop(['Pclass'],axis=1,inplace=True) test_df.drop(['Pclass'],axis=1,inplace=True) titanic_df = titanic_df.join(pclass_dummies_titanic) test_df = test_df.join(pclass_dummies_test)

⑧データ探索終了、trainとtestの変数を統一する:
X_train = titanic_df.drop("Survived",axis=1)
Y_train = titanic_df["Survived"]
X_test  = test_df.drop("PassengerId",axis=1).copy()

三、モデルを構築する時sklearnパッケージを適用した:1論理回帰でX_をフィットするtrainとY_train、logregを使います.predict()関数によるX_予測testのデータは、最後にフィットした結果でモデルに点数をつけます!
logreg = LogisticRegression()

logreg.fit(X_train, Y_train)

Y_pred = logreg.predict(X_test)

logreg.score(X_train, Y_train)

②ランダム森林:
random_forest = RandomForestClassifier(n_estimators=100)

random_forest.fit(X_train, Y_train)

Y_pred = random_forest.predict(X_test)

random_forest.score(X_train, Y_train)

四、関連分析(分からない!!):
coeff_df = DataFrame(titanic_df.columns.delete(0))
coeff_df.columns = ['Features']
coeff_df["Coefficient Estimate"] = pd.Series(logreg.coef_[0])

五、csvを生成し、ファイルを提出する:まず一つのデータ枠DataFrameを構築する
submission = pd.DataFrame({
        "PassengerId": test_df["PassengerId"],
        "Survived": Y_pred
    })

さらにcsvファイルに書きます.
submission.to_csv('titanic.csv', index=False)

ラベルを付けた後の正確率はあなたの順位の高低の根拠で、もし変数の制御がよくて、無効な変数が少ないならば、あなたの得点率はきっと高いに違いありません.もしあなたがモデルを創立する時無効な変数が多いならば、それはフィッティングした結果はきっと理想的ではありません.同時に、あなたもいろいろな異なるモデルを比較する必要があります.モデルを構築したscoreの最も高いモデルコミットを選択します.