SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「PyData.Tokyo Tutorial & Hackathon」イベントレポート

データサイエンティストを育成する試み
~PyData.Tokyo Tutorial & Hackathon #1 イベントレポート


  • X ポスト
  • このエントリーをはてなブックマークに追加

チュートリアル第1部「データハンドリング with Pandas」

 PyData.Tokyoオーガナイザーの池内です。今回のチュートリアルの第1部「データハンドリング」パートを担当しました。チュートリアルで利用したドキュメントをベースに、チュートリアルの内容を解説します。

チュートリアル第1部のアジェンダと環境

 第1部では、以下の4つをアジェンダに設定しました。

  1. データの読み込み
  2. データの集計
  3. データの前処理
  4. データの可視化

 このアジェンダを、Pythonのデータ系パッケージの一つであるPandasを利用して学んでいきます。

データハンドリングを学ぶ意味

 今回、Kaggleのチュートリアルで取り組む課題は「生存者の推定」です。さらには「生存者推定の精度を高めること」と言えます。本来の目的に取り組むために、これから利用するデータがどのようなものであるかを把握することは、データ分析の大切な行程の一つです。

 第2部で取り扱う機械学習は、ツールやライブラリの発展により誰でも簡単に利用できるようになりました。しかし、闇雲に機械学習ツールにデータを投入しても、見当外れな結論を導き出してしまうことになります。

 データハンドリングの目的の例は、以下のとおりです。

  • サイズが大きい、フォーマットが複雑など、扱いづらいデータを扱いやすくする
  • 意図したデータであるかを確認する
  • データの分布を確認する。外れ値や異常値の有無を確認する

 なお、データハンドリングという表現は、データの収集や蓄積基盤の構築、実装の工程を含む場合がありますが、今回は基本的なデータの確認と前処理とのことを指しています。

データの読み込み

 チュートリアルで用いるデータは、KaggleのCompetitionのページ「Data - Titanic: Machine Learning from Disaster」から取得できます(ダウンロードにはKaggleへのログインが必要です)。

 学習用データ「train.csv」をダウンロードし、Pandasで読み込みます。コードはIPython Notebook上で実行します。

import pandas as pd
df = pd.read_csv("train.csv")
df

 Notebook上に以下のデータが出力されます。

 図に示したのは、Pandasの「データフレーム」というデータ構造です。データフレームは、列名と行名を持つ2次元配列で、データベースのテーブルのようなものです。データフレームに対して、加工や集計、統計処理を行えます。

 以下に、データの読み込み時によく利用するコード例を示します。

# 先頭から2行を選択
df.head(2)

# 末尾から5行を選択
df.tail()

# Name列に絞り込み、先頭から3行を選択
df[Name].head(3)

# Name, Age列に絞り込み
df[['Name', 'Age']]

 Pandasを利用すると、直感的にデータの読み込みと確認が行えます。

データの集計

 データが読み込めたところで、データの集計を行います。

 describe() 関数を利用して、データフレームのデータの概要を把握することができます。

df.describe()

 実行結果から、以下のデータが得られます。

  • count:レコード数です。
  • mean:平均値です。
  • std:標準偏差です。
  • min:最小値です。
  • 25%, 50%, 75%:第1四分位, 中央値、第3四分位です。
  • max:最大値です。

 データの概要をつかむ他、年齢カラムに極端に大きな値が入っていないかなど、異常値を検出する際にも役に立ちます。

 Pandasには他にも、さまざまな集計、統計用関数が用意されています。

# Age列の最大値
df['Age'].max()

# Age列の最小値
df['Age'].min()

# Age列の平均値
df['Age'].mean()

# Age列の分散
df['Age'].var(ddof=False)

データの前処理

 データの傾向が掴めたら、必要に応じて前処理を行います。前処理にはいくつかの観点があります。分析の精度に悪影響を与えるノイズとなるデータを除去する目的の前処理はよく行われます。サイズの大きなデータを扱う場合に、不要なデータを削除することで読み込みや集計速度の向上を目的とする前処理を行うこともあります。分析ツールが数値データしか受け付けない仕様に対応するために、「男/女」の文字列データを「0/1」の数値データに置換する、などの制約に対応する目的でも行います。

不要列の削除

 drop()関数を利用すると、データフレームから指定列の除去が行えます。以下のコード例では、Ticket列を削除します。

df.drop('Ticket', axis=1)

欠損値の補間

 train.csvを読み込んで表示した際、「NaN」と表示された箇所は欠損データです。

 fillna()関数を利用すると、欠損値を埋めることができます。

# 欠損データを 50 で埋める
df.fillna(50)

# 欠損データをデータの平均値で埋める
df.fillna(df.mean())

 データを補間するinterpolate()関数も用意されています。

df[['Name', 'Age']].interpolate()

 interpolate()関数にはいつくかの補間のためのアルゴリズムが用意されています。デフォルトでは線型補間が実行されます。

 fillna()やinterpolate()関数で簡単に欠損値を埋めることができましたが、この工程には注意が必要です。今回のデータで年齢に対して線形補間を行っても正しい(本来の)年齢、またはそれに近い年齢が入力できるとは考えにくいです。さらに、推定したデータを元にして推定をすることになるので、結果に対して与える影響を慎重に検討する必要があります。

データの可視化

 Pythonでデータの可視化を行うには、matplotlibを利用します。

%matplotlib inline

import matplotlib.pyplot as plt

df['Survived'].plot(alpha=0.6, kind='hist', bins=2)
plt.xlabel('Survived')
plt.ylabel('N')

 IPython Notebook上にインラインでグラフを描画するために、%matplotlib inlineを実行しています。

 横軸は、左側の棒が死亡を示す0、右側のグラフが生存を示す1のデータで、縦軸が各々の数です。0.2、0.4などの表示はplot()関数の仕様により出力されているもので、実際に値が存在しているわけではありません。

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(6, 3))

i = 0
for sex in ['male', 'female']:
    df['Survived'][df.Sex==sex].hist(alpha=0.5, bins=2, ax=axes[i])
    axes[i].set_title(sex)

    i =+ 1
    
fig.subplots_adjust(hspace=0.3)
fig.tight_layout()

 男女別に死亡/生存をグラフで可視化しました。男性に比べて、女性のほうが生存率が高いことが分かります。

 train.csvには性別の他に、年齢や等室の情報も含まれます。チュートリアルの時間と難易度の関係で、簡単な例のみを解説しましたが、さまざまな軸でデータを見てみることで、何らかの気づきを得られるかも知れません。

第1部 まとめ

 第1部では、Pandasを使ったデータの読み込みから可視化までを学びました。今回扱ったtrain.csvというデータは、データサイズも小さく、フォーマット異常もない比較的扱いやすいデータでした。しかし、実際のデータ分析ビジネスの現場では、「ユニークなデータのはずだが重複がある」「数値のはずだが文字列が入っている」といったことは(残念ながら)しばしば起こりえます。

 「無効フラグが1かつ伝票番号がDからはじまるレコードは除かなければいけない」というようなデータの仕様によって、少し複雑な前処理を行うケースもあります。そのようなケースでも、Pythonなら簡潔なプログラミングで対応可能です。

 データハンドリングを行う手段はPython以外にもさまざまありますが、第2部で解説する機械学習まで、1つのプログラミング言語で実施できるのがPythonの強みと言えます。

次のページ
チュートリアル第2部「機械学習 with scikit-learn」

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
「PyData.Tokyo Tutorial & Hackathon」イベントレポート 連載記事一覧
この記事の著者

シバタアキラ(シバタ アキラ)

データサイエンティスト@DataRobot, Inc. PyData.Tokyoオーガナイザー 人工知能を使ったデータ分析によるビジネス価値の創出が専門分野。物理学博士。NYU研究員時代にデータサイエンティストとして加速器データの統計モデル構築を行い「神の素粒子」ヒッグスボゾン発見に貢献。その後ボストン・コンサルティング・グループでコンサルタント。白ヤギコーポレーションCEOを経て現職 Twitter: @madyagi Facebook: Akira Shibata DATAブログ: http://ashibata.com DataRobot, Incウェブサイト: http://datarobot.com

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

池内 孝啓(イケウチ タカヒロ)

神奈川県横浜市出身。1984年生まれ。ソフトウェア開発会社、インフラサービス提供会社を経て2011年3月株式会社ALBERT入社。クラウドコンピューティングを活用したマーケティングプラットフォーム事業の立ち上げに携わる。2014年1月に同社執行役員に就任。2015年8月株式会社ユーリエを設立。同社代表取締役社長兼CTO。2014年にコミュニティ PyData.Tokyo を共同で立ち上げるなど、Python と PyData ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

田中 秀樹(タナカ ヒデキ)

PyData TokyoオーガナイザーシリコンバレーでPython×データ解析の魅力に出会う。帰国後、ディープラーニングに興味を持ち、PyCon JP 2014に登壇したことがきっかけとなりPyData Tokyoをスタート。カメラレンズの光学設計エンジニアをする傍ら、画像認識を用いた火星および太陽系惑星表面の構造物探索を行うMarsface Project(@marsfaceproject)に参加。インドやモロッコなど、旅先で...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山本 光穂(ヤマモト ミツオ)

デンソーアイティーラボラトリ シニアエンジニア。2006年デンソーアイティーラボラトリ入社以来、時空間情報閲覧サービス(製品名:今昔散歩)や情報検索等に関する研究に従事。特に最近はドライバーの意図推定技術や同推定結果に基づく最適な情報提示技術に興味を持つ。趣味はマウンテンバイクとイングレス(Resistance)。Facebook: https://www.facebook.com/mitsuo.yamamoto.0112 Twitter: @kaita

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8636 2015/04/21 14:51

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング