Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Python 機械学習プログラミング データ分析演習編

17,939 views

Published on

この資料では、Pythonのデータ分析ライブラリーである「pandas」を使う練習を目的として、データ分析の初歩的な内容を解説しています。

2015/11/25 ver1.0 公開
2015/12/11 ver1.1 仮説検定の説明を分かりやすく修正
2016/11/15 ver2.0 改訂版公開、scikit-learnの利用例を追加
2017/06/11 ver2.1 仮説検定パートを削除、sklearnの利用例をアップデート

Published in: Science
  • Be the first to comment

Python 機械学習プログラミング データ分析演習編

  1. 1. Machine Learning for Everyone Else Python 機械学習プログラミング データ分析演習編 Ver2.1 2017/06/11 中井悦司 (Twitter @enakai00)
  2. 2. 2 Python 機械学習プログラミング 目次 ■ ハンズオン環境の利用方法 ■ 分析データの取り込みと確認 ■ 分析データの可視化 ■ scikit-learnによる機械学習処理
  3. 3. 3 Python 機械学習プログラミング ハンズオン環境の利用方法
  4. 4. 4 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ 本講義のハンズオン環境は、クラウド上の仮想マシンで用意してあります。下 記のBlog記事の手順にしたがって、同じ環境を自分で用意することもできま す。 - Jupyter演習環境の準備手順 - http://enakai00.hatenablog.com/entry/2016/11/18/134724
  5. 5. 5 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ 指定のURLにアクセスするとパスワード入力画面が表示されるので、指定のロ グインパスワードを入力します。 ■ ログインすると「ノートブックファイル」の一覧画面が表示されますが、今は まだノートブックファイルはありません。
  6. 6. 6 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ 右上のプルダウンメニューから「New」→「Python 2」を選択すると新しい ノートブックが開きます。 ■ タイトル部分をクリックすると、新しいタイトルが設定できます。「<タイト ル>.ipynb」が対応するファイル名になります。(タイトルには日本語は使え ません。)
  7. 7. 7 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ ノートブック上では、セルにプログラムコードを入力して、「▶」ボタン、も しくは [Ctrl] + [Enter] で実行すると結果が表示されます。 ■ マークダウン形式のセルには説明文を記載することができます。 セルの形式を選択 マークダウン形式のセル コード形式のセル 変数に値を設定 変数の値を表示
  8. 8. 8 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ ノートブック全体を最初から実行し直す場合は、メニューから「Kernel」→ 「Restart & Clear Output」を選択して、これまでの実行内容をクリアしま す。
  9. 9. 9 Python 機械学習プログラミング ハンズオン環境の利用方法 ■ 空のセルで次のコマンドを実行すると、演習用のノートブックがダウンロード できます。 - ノートブックファイル一覧画面で下記のノートブックを開きます。 「jupyter_ml4se_commentary」⇒「Solutions」⇒「Titanic Example.ipynb」 !git clone https://github.com/enakai00/jupyter_ml4se_commentary
  10. 10. 10 Python 機械学習プログラミング 分析データの取り込みと確認
  11. 11. 11 Python 機械学習プログラミング データの取り込み ■ Webで公開されているcsvデータをpandasのデータフレームに取り込みます。 - 取り込んだデータの説明は下記に記載されています。 ● http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3info.txt - 数値自体に意味のないデータが数値で表現されている場合、誤った(意味のない)統計量を計算 しないように、データ型を文字列型に変換しておきます。いまの場合、「pclass(社会的地 位)」は数値で表現されていますが、この値の「平均値」を取っても特に意味はありません。 In [1]: import numpy as np import matplotlib.pyplot as plt import pandas as pd from pandas import Series, DataFrame In [2]: data = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.csv') data['pclass'] = data['pclass'].map(str) # pclassの型を文字列型に変換 VARIABLE DESCRIPTIONS: pclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd) survived Survival (0 = No; 1 = Yes) name Name sex Sex age Age sibsp Number of Siblings/Spouses Aboard parch Number of Parents/Children Aboard ticket Ticket Number fare Passenger Fare cabin Cabin embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton) boat Lifeboat body Body Identification Number home.dest Home/Destination タイタニック号の乗船名簿の情報に、 沈没による死亡情報を加えたものです。
  12. 12. 12 Python 機械学習プログラミング データの全体感の把握 ■ 取り込んだデータの全体像を眺めて特徴を把握します。 - 今回使用するデータはそれほど大きくない(全部で1309件)ので、まずはスプレッドシートで 開いて、どのようなデータか眺めておきます。 - 項目によっては欠損値(データが埋まっていないセル)が多いなどのデータセットとしての特 徴、あるいは、「1歳未満の乳児が乗船している」などの社会的観点での特徴が見えてきます。
  13. 13. 13 Python 機械学習プログラミング データのサマリー情報の確認 ■ 項目ごとのデータ数や平均値など、標準的な統計量を確認しておきます。 - 項目によってデータ数(count)が異なるのは、欠損値が存在するためです。 - 欠損値の影響で、パーセンタイルがうまく計算できていない部分があります。これらの項目は、 次ページのように、欠損値を削除して計算します。 In [3]: data.columns Out[3]: Index([u'pclass', u'survived', u'name', u'sex', u'age', u'sibsp', u'parch', u'ticket', u'fare', u'cabin', u'embarked', u'boat', u'body', u'home.dest'], dtype='object') In [4]: data.describe() Out[4]:
  14. 14. 14 Python 機械学習プログラミング データのサマリー情報の確認 ■ dropna()メソッドで欠損値を含む行を削除した上で、統計情報を確認します。 - 平均値(mean)と中央値(50%)が乖離している場合、値の分布に歪み(skew)があると考え られます。 In [5]: data[['age']].dropna().describe() In [6]: data[['fare']].dropna().describe() In [7]: data[['body']].dropna().describe() 平均値と中央値が 乖離した例
  15. 15. 15 Python 機械学習プログラミング 分析データの可視化
  16. 16. 16 Python 機械学習プログラミング ■ 数値データはヒストグラムによって可視化します。 - 例として、年齢(age)と料金(fare)の分布をヒストグラムで確認します。 ● binsオプションには、区間の個数、もしくは、区間の区切りを並べたリストを与えます。 - 5歳未満の子供の分布、もしくは、200ポンド以上の高額料金の乗客などに分布の特徴が見られ ます。 数値データの可視化 In [8]: data[['age']].dropna().plot(kind='hist', bins=np.linspace(0,100,20+1)) In [9]: data[['fare']].dropna().plot(kind='hist', bins=20) グラフ化する際は、dropna()で 欠損値を削除しておきます。
  17. 17. 17 Python 機械学習プログラミング 数値データの相関の可視化 ■ 2つの数値データの関係性を見るときは、散布図で可視化します。 - 例として、年齢(age)と料金(fare)の関係を散布図で表示します。 In [10]: df = data[['age','fare']].dropna() df.plot(kind='scatter', x='age', y='fare') - 特に目立った関係はありませんが、200 ポンド以上の料金で乗船しているのは15 歳以上に限られるなどが確認できます。
  18. 18. 18 Python 機械学習プログラミング カテゴリーデータと数値データの相関の可視化 ■ カテゴリーデータと数値データの関係性を見るときは、箱ひげ図で可視化します。 - 例として、社会的地位(pclass)と料金(fare)の関係を箱ひげ図で表示します。 In [11]: df = data[['fare','pclass']].dropna() df.boxplot(column='fare', by='pclass') - 社会的地位が高い人(pclass:1)は 高額料金で乗船していることがわか ります。 外れ値 75パーセンタイル 50パーセンタイル (中央値) 25パーセンタイル
  19. 19. 19 Python 機械学習プログラミング 3つ以上のデータの相関の可視化 ■ 3つ以上のデータの関係を表示する場合は、データの種類に応じて適切な可視化方法を 選択する必要があります。 - たとえば、年齢(age)と料金(fare)の散布図を社会的地位(pclass)で色分けしてみます。 In [12]: df1 = data[data.pclass=='1'][['age','fare']].dropna() df2 = data[data.pclass=='2'][['age','fare']].dropna() df3 = data[data.pclass=='3'][['age','fare']].dropna() plt.scatter(df1.age, df1.fare, facecolor='blue') plt.scatter(df2.age, df2.fare, facecolor='green') plt.scatter(df3.age, df3.fare, facecolor='red')
  20. 20. 20 Python 機械学習プログラミング カテゴリーデータの相関 ■ カテゴリーデータの例として、性別(sex)と生存(survival)の相関を確認します。 - 2種類のカテゴリーデータの相関は、クロス集計表で確認します。 - この結果を見ると、性別によって生存率が大きく変わることが分かります。 - 同様の分析を社会的地位(pclass)と生存(survival)について行ってみてください。 - また、その他のデータについても自分なりの可視化を行って、特徴を発見してみてください。 In [13]: df = data[['sex','survived']].dropna() pd.crosstab(df.sex, df.survived) Out[13]: In [14]: pd.crosstab(data.sex ,data.survived).plot(kind='bar') In [15]: df.mean() Out[15]: Survived 0.381971 # 平均生存率 dtype: float64 In [16]: 339.0/(127+339) Out[16]: 0.7274678111587983 # 女性の生存率
  21. 21. 21 Python 機械学習プログラミング scikit-learnによる機械学習処理
  22. 22. 22 Python 機械学習プログラミング ロジスティック回帰 ■ 「性別」「年齢」の2つの特徴を用いたロジスティック回帰で、生存確率を予測するモ デルを構築します。 - この後の分析で使用するモジュールをインポートします。 - 欠損値を含む行を削除して、分析に使用する列のみを含むDataFrameを用意します。ここでは、 特徴変数 X_ とラベル y を個別にDataFrameとして作成しています。 - 性別はカテゴリーデータなので、One Hot Encodingに変換します。 In [20]: from PIL import Image from sklearn.model_selection import train_test_split, cross_val_score from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier, export_graphviz In [22]: X = pd.get_dummies(X_) X.head() In [21]: tmp = data[['age', 'sex', 'survived']].dropna() X_ = tmp[['age', 'sex']] y = tmp['survived'] X_.head()
  23. 23. 23 Python 機械学習プログラミング ロジスティック回帰 - データセットをトレーニングセットとテストセットに分割した後、トレーニングセットを用いて 学習処理を実行します。さらに、トレーニングセットとテストセットに対する正解率を計算しま す。 - クロスバリデーションを実施して、結果を表示します。 In [23]: X_train, X_val, y_train, y_val = train_test_split(X, y, train_size=0.8, random_state=1) clf = LogisticRegression() clf.fit(X_train, y_train) y_train_pred = clf.predict(X_train) y_val_pred = clf.predict(X_val) print 'Accuracy on Training Set: {:.3f}'.format(accuracy_score(y_train, y_train_pred)) print 'Accuracy on Validation Set: {:.3f}'.format(accuracy_score(y_val, y_val_pred)) Out[23]: Accuracy on Training Set: 0.775 Accuracy on Validation Set: 0.795 In [24]: clf = LogisticRegression() scores = cross_val_score(clf, X, y, cv=5) print 'Scores:', scores print 'Mean Score: {:f} ± {:.3}'.format(scores.mean(), scores.std()) Out[24]: Scores: [ 0.84761905 0.83333333 0.78947368 0.74641148 0.67788462] Mean Score: 0.778944 ± 0.0617
  24. 24. 24 Python 機械学習プログラミング 決定木(Decision Tree) ■ 決定木を用いて、先ほどと同じ分析を実施します。 - クロスバリデーションを実施して、結果を表示します。 - 決定木を画像化して表示します。 In [26]: clf = DecisionTreeClassifier(criterion='entropy', max_depth=2, min_samples_leaf=2) scores = cross_val_score(clf, X, y, cv=5) print 'Scores:', scores print 'Mean Score: {:f} ± {:.3}'.format(scores.mean(), scores.std()) Out [26]: Scores: [ 0.85714286 0.83809524 0.79425837 0.74641148 0.64423077] Mean Score: 0.776028 ± 0.0762 In [27]: clf.fit(X, y) export_graphviz(clf, out_file='tree.dot', feature_names=X.columns, class_names=['not survived', 'survived'], impurity=False, filled=True) !dot -Tpng tree.dot -o tree.png Image.open("tree.png") - 性別・年齢・社会的地位(pclass)を特徴量 として、同様の分析を行ってみてください ※ 特徴量を増やした場合は、決定木の階層をより深  くするとよい場合があります。
  25. 25. 25 Python 機械学習プログラミング メモとしてお使いください
  26. 26. Machine Learning for Everyone Else Thank You!

×