Jupyter notebookを使って、機械学習に必要なデータハンドリングについて書いていきます。
jupyter notebookでなくても実行可能ですが、こちらの方が、実行が簡単なのでインストールしていない人は、下記の記事を参考にインストールすることをおすすめします。
-
sklearnを用いて単回帰分析をしてみた
前の記事の延長で、jupyter notebookでsklearnを用いた単回帰分析を行っていきます。 目標 前回、matplotlibを用いて20点満点の数 ...
続きを見る
Jupyter notebookとは
Jupyter Notebook とは、ノートブックと呼ばれる形式で作成したプログラムを実行し、実行結果を記録しながら、データの分析作業を進めるためのツールです。
プログラムとその実行結果やその際のメモを簡単に作成、確認することができるため、自分自身の過去の作業内容の振り返りや、チームメンバーへ作業結果を共有する際に便利なほか、スクール形式での授業や研修などでの利用にも向いています。
Python以外の言語にも対応しているらしいですが、今回はPythonを使用します。
記述統計学
記述統計学とは、デジタル大辞泉によると、
数理統計学の一分野。観察対象となる母集団の大量観察に基づいて、その平均・分散・標準偏差などの値を導き、母集団の性質や傾向を記述する
と書いてあります。
難しい書き方をしていますが、簡単にいうとPythonで与えられたデータをまとめて見やすく整理し、データの持っている概ねの情報を把握するということです。
では実践!
必要なモジュールはあらかじめインポートしておきます。
まずは使用するデータを準備します。
そのため、データが入ってあるcsvファイルを用意します。
csvファイルは自分で作るか、ダウンロードするかしてください。
こちらにExcelでのcsvファイルの作り方が載っています。
こちらのサイトでは、機械学習用にデータセットが、まとめられています。
arXivTimes/datasets at master · arXivTimes/arXivTimes · GitHub
今回使ったデータセット
http://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip
zipファイルを展開して、csvファイルを使用します。
student.txt
student-mat.csv
student-merge.R
student-por.csv
という四つのファイルが出てくるので、生徒の数学の点数に関する情報が書かれたstudent-mat.csvファイルを使用して、記述統計の基礎を試してみます。
はじめに、pandsでcsvファイルを読み込みます。
student_data_math = pd.read_csv("student-mat.csv")
print文で出力
#ちなみにprint文なしでも実行できます。
print(student_data_math.head(5))
出力を結果を見ると、かなり見づらいです。
なので、オプションで、区切り文字、sep=";"を指定して再度読み込みます。
;は区切りなので、 区切りをいれるときれいになります。
student_data_math = pd.read_csv("student-mat.csv", sep=";")
print文で出力
print(student_data_math.head(5))
キレイになりました。
ちなみに、.head(5)というのは、データが入った表の中から上から5行だけ出力するという意味です。
print(student_data_math)
.head()を付けないでprint文を実行すると
こんな感じで、すべてのデータが出力されます。見切れていますが、全データである395行目まで出力されています。
データの属性説明
また、student_data_math.info()ですべての項目の情報をチェックできます。
1 school - 学校(binary: "GP" - Gabriel Pereira or "MS" - Mousinho da Silveira)
2 sex - 性 (binary: "F" - female or "M" - male)
3 age - 年齢 (numeric: from 15 to 22)
4 address - 住所のタイプ (binary: "U" - urban or "R" - rural)
5 famsize - 家族の人数 (binary: "LE3" - less or equal to 3 or "GT3" - greater than 3)
6 Pstatus - 両親と同居しているかどうか (binary: "T" - living together or "A" - apart)
7 Medu - 母親の学歴 (numeric: 0 - none, 1 - primary education (4th grade), 2 – 5th to 9th grade, 3 – secondary education or 4 – higher education)
8 Fedu - 父親の学歴 (numeric: 0 - none, 1 - primary education (4th grade), 2 – 5th to 9th grade, 3 – secondary education or 4 – higher education)
9 Mjob - 母親の仕事 (nominal: "teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
10 Fjob - 父親の仕事 (nominal: "teacher", "health" care related, civil "services" (e.g. administrative or police), "at_home" or "other")
11 reason - 学校を選んだ理由 (nominal: close to "home", school "reputation", "course" preference or "other")
12 guardian - 生徒の保護者 (nominal: "mother", "father" or "other")
13 traveltime - 通学時間 (numeric: 1 - 1 hour)
14 studytime - 週の勉強時間(numeric: 1 - 10 hours)
15 failures - 過去のnumber of past class failures (numeric: n if 1<=n<3, else 4)
16 schoolsup - 追加の教育サポート (binary: yes or no)
17 famsup - 家族の教育サポート (binary: yes or no)
18 paid - 追加の有料クラス(Math or Portuguese) (binary: yes or no)
19 activities - 学校外の活動 (binary: yes or no)
20 nursery - 保育園に通ったことがあるかどうか (binary: yes or no)
21 higher - 高い教育を受けたいかどうか(binary: yes or no)
22 internet - 家でインターネットのアクセスができるかどうか(binary: yes or no)
23 romantic - 恋愛関係 (binary: yes or no)
24 famrel - 家族との関係性 (numeric: from 1 - very bad to 5 - excellent)
25 freetime - 学校後の自由時間 (numeric: from 1 - very low to 5 - very high)
26 goout - 友人と遊ぶかどうか (numeric: from 1 - very low to 5 - very high)
27 Dalc - 平日のアルコール摂取量 (numeric: from 1 - very low to 5 - very high)
28 Walc - 週末のアルコール摂取量 (numeric: from 1 - very low to 5 - very high)
29 health - 現在の健康状態 (numeric: from 1 - very bad to 5 - very good)
30 absences - 学校の欠席数 (numeric: from 0 to 93)
31 G1 - 一期の成績 (numeric: from 0 to 20)
31 G2 - 二期の成績 (numeric: from 0 to 20)
32 G3 - 最終の成績 (numeric: from 0 to 20, output target)
今回扱うデータには、395人分それぞれ、33項目のデータが入っています。
33列×395行のデータとなっています。
生徒が男か女か、上から10人表示したい場合は
student_data_math.sex.head(10)
とデータを格納した変数に、.sexとカラム名をつけることで表示できます。
同様に
student_data_math.sex.head(10)
と入力することで欠席数を表示させることができます。
男子生徒と女子生徒の平均年齢を表示したいときは
student_data_math.groupby(‘sex’)[age].mean()
と、groupby(‘カラム名’)でグループ化します。
平均値は.mean()で出力できます。
ヒストグラム
次はヒストグラムです。生徒の欠席数をグラフで表してみます。
最初にimportした。Matplotlibを使うと、以下のようにヒストグラムが出力されます。
次に、平均値、中央値、最頻値、分散、標準偏差をまとめて出力していきます。
平均値は.mean()
中央値は.median()
最頻値は.mode()
分散は.var()
標準偏差は.std()
を変数の後ろにつけることで表示できます。
ちなみに、
student_data_math.absences.describe()
と記述するとこれらの情報がまとめて表示されるので便利です。
50%というところは、「50パーセンタイル値」と呼ぶのですが、意味的には中央値と同じです。
箱ひげ図
次に箱ひげ図を書いてみます。
G1は1学期の成績です。
plt.boxplot(student_data_math.G1)
plt.grid(True)
gridをTrueにするとグラフに格子が入ります。
1学期の生徒の数学の点数の得点分布を示しています。
散布図
最後は、散布図です。
plt.plot(student_data_math.G1,student_data_math.G3,'o')
# ラベル
plt.ylabel("G3 grade")
plt.xlabel("G1 grade")
plt.grid(True)
1学期の生徒の数学の点数の得点分布と3学期の生徒の数学の点数の得点分布の相関関係を示しています。
強い正の相関がみられます。1学期の成績がいい人は3学期の成績もよい傾向があるということがわかります。
複数の箱ひげ図や散布図を表示させることもできるので、興味がある方はさらに調べて色々試してみてください。
jupyter notebookを学べるおすすめの本