前回、R言語所蔵のTitanicデータセットを処理。事故のデータなのであまり気色の良いものではないな、などと思っていたら、痛ましい海難事故発生。人間はそういうことに「因果関係」を感じてしまうものであり、私も例外ではないです。が、因果は無いのであります。そうしたら別口でTitanicデータをまた発見。何かあるのか?
※「データのお砂場」投稿順Indexはこちら
またしても不穏なTitanicデータに遭遇したのは、別シリーズのMLにて。こちらとは被ってくるところもあり。Pythonネタなので、こちらでは当分やるまいと思っていたのですが、データセット丸被りなので続けてやってしまうことにいたしました。よって今回は1度R言語から離れまする。
参考にさせていただいたWeb記事
参考にさせたいただいたのは、VSCodeの以下のチュートリアルです。VScodeの上でJupyter-notebookを走らせてData Scienceしてみるというもの。これに使われていた例題が Titanic なのであります。
Data Science in VS Code tutorial
上記ページでは、Miniconda使って環境セットせよ、とあります。が、当方MinicondaもAnacondaも使ってないです。個別に venv 環境内にセットアップ。いい加減だけれど、記事と同様な処理は出来る筈。
さて、肝心の Titanic サンプルデータは、以下からダウンロードいたしました。上記記事から辿っていった先ではあるのですが、リンク切れていたり、なにかありそうな気配もあり、ちょっと迷った末。
前回使用したR言語のサンプルデータセットとは明らかに違います。前回のものは、生データを処理して4次元のテーブルにしたもので統計資料としての体裁が整ったものでした(個人をヒモづけるような切り口はナシ。)しかし今回の物は「生々しい」デス。
まずは生データ
上記からダウンロードしたデータは.txt 拡張子でしたが .csv 形式でもありました。リネームし以下のようにロードしました。この生データのロードは、pandasの機能です。
VScodeの場合、Jupyter-notebook形式の変数に対して変数ブラウザの機能が使えるので分かり易いです。生データを眺めてみたものが以下に。
住所とお名前、年齢、性別、載っていた船室の番号やらチケット情報まで備わった乗船名簿そのもののようです(詳細読めないように一部フィールドは先頭のみ表示。)現在では公開不可な個人情報かと。遥か昔に公開されてしまったのでそのまま使われているようですが、あまり良い気はしませぬ。なお、R版のデータセットでは乗組員もデータ化されていましたが、こちらの方は旅客のみのようです。
なお、例題では欠損値の処理のようなステップが必要そうでしたが、上記データの場合はそのような場所は全てNaNで埋まっており、不要と思われました。
seaborn + matplotlib でグラフ化
前回はRの機能を使ってモザイクプロットして全貌を把握しようとしたのですが、今回は異なります。Python上の statistical data visualizationパッケージ
を利用です。例題通りに描画を試みたところエラー出まくり。私がダウンロードできたTXTデータと、例題で用いていたデータは似ていますが、フィールドが異なるようです。不在のフィールドを除く形で描けるグラフのみ描いてみた操作が以下に。
上記の操作にて、左のバイオリンプロットと、右のポイントプロットの2件が描けました。
どちらも縁起でもないグラフです。左は生存者とおなくなりに分けて年齢別にその人数をプロットしたもの。男女別です。右は1等から3等に分けた生存率のプロット、やはり男女別です。前回R言語の例題で処理したときより、アカラサマでキツイ感じがするのは、私が怯えているせい?
相関をとる
前回のRでの処理とちょっと異なるのは、生存とある列との相関を取っていることです。ただし相関をとるためには数値でないとならないようです。文字列を数値に変換しました。性別については上記の処理例で行っていたのですが、下の客室のクラス分けについては処理が入ってなかったので、勝手に付け加えてみました(忖度しない。)
上記の処理後、変数ウインドウを見るとちゃんと変換されております。なお、変数ウインドウを開いてから処理してもその結果は反映されとりません。処理後の値を見たければ開きなおす必要があり、と。
相関とった結果が以下に。
数字が1に近い方が生存率の高さと相関がある、と理解して良いのではないかと思います。これ見ると年齢が高い方が生存率が高いということは無さそうに見えます。また、男女の性別は女0,男1として処理しているので、男性と生存率の相関関係は低そうです。pclassは三等船室が3、一等船室が1としたので、3等船室の旅客と生存率の相関はもっと低い感じです。
row.namesという単なるインデックス番号と客室クラスのpclassが似た数字になっていますが、これにはカラクリあり。row.namesは、客室クラスでソートされた順に番号が振られていたのです。つまり数字が小さい人は一等船室。。。
なんだかな~