電脳ヨーグルト

プログラミングの備忘録と私生活を

記述統計学の基礎をjupyter notebookで演習してみる

f:id:at25250410:20180803194649p:plain
Jupyter notebookを使って、機械学習に必要なデータハンドリングについて書いていきます。

jupyter notebookでなくても実行可能ですが、こちらの方が、実行が簡単なのでインストールしていない人は、下記の記事を参考にインストールすることをおすすめします。
did2memo.net

Jupyter notebookとは

Jupyter Notebook とは、ノートブックと呼ばれる形式で作成したプログラムを実行し、実行結果を記録しながら、データの分析作業を進めるためのツールです。

プログラムとその実行結果やその際のメモを簡単に作成、確認することができるため、自分自身の過去の作業内容の振り返りや、チームメンバーへ作業結果を共有する際に便利なほか、スクール形式での授業や研修などでの利用にも向いています。Python以外の言語にも対応しているらしいですが、今回はPythonを使用します。


記述統計学

記述統計学とは、デジタル大辞泉によると、

数理統計学の一分野。観察対象となる母集団の大量観察に基づいて、その平均・分散・標準偏差などの値を導き、母集団の性質や傾向を記述する

と書いてあります。
難しい書き方をしていますが、簡単にいうとPythonで与えられたデータをまとめて見やすく整理し、データの持っている概ねの情報を把握するということです。

では実践!

必要なモジュールはあらかじめインポートしておきます。

f:id:at25250410:20180803200745p:plain


まずは使用するデータを準備します。

そのため、データが入ってあるcsvファイルを用意します。

csvファイルは自分で作るか、ダウンロードするかしてください。

こちらにExcelでのcsvファイルの作り方が載っています。

sastd.com



こちらのサイトでは、機械学習用にデータセットが、まとめられています。

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))

f:id:at25250410:20180803194036p:plain

出力を結果を見ると、かなり見づらいです。


なので、オプションで、区切り文字、sep=";"を指定して再度読み込みます。
 ;は区切りなので、 区切りをいれるときれいになります。
student_data_math = pd.read_csv("student-mat.csv", sep=";")

print文で出力

print(student_data_math.head(5))

f:id:at25250410:20180803194112p:plain

キレイになりました。

ちなみに、.head(5)というのは、データが入った表の中から上から5行だけ出力するという意味です。

print(student_data_math)
.head()を付けないでprint文を実行すると

f:id:at25250410:20180803194123p:plain

こんな感じで、すべてのデータが出力されます。見切れていますが、全データである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とカラム名をつけることで表示できます。

f:id:at25250410:20180803194142p:plain

同様に

student_data_math.sex.head(10)

と入力することで欠席数を表示させることができます。

f:id:at25250410:20180803194151p:plain

男子生徒と女子生徒の平均年齢を表示したいときは

student_data_math.groupby(‘sex’)[age].mean()

と、groupby(‘カラム名’)でグループ化します。

平均値は.mean()で出力できます。

f:id:at25250410:20180803194201p:plain

ヒストグラム

次はヒストグラムです。生徒の欠席数をグラフで表してみます。
最初にimportした。Matplotlibを使うと、以下のようにヒストグラムが出力されます。

f:id:at25250410:20180803194209p:plain


次に、平均値、中央値、最頻値、分散、標準偏差をまとめて出力していきます。

平均値は.mean()

中央値は.median()

最頻値は.mode()

分散は.var()

標準偏差は.std()

を変数の後ろにつけることで表示できます。

f:id:at25250410:20180803194219p:plain

ちなみに、

student_data_math.absences.describe()

と記述するとこれらの情報がまとめて表示されるので便利です。

f:id:at25250410:20180803194227p:plain

50%というところは、「50パーセンタイル値」と呼ぶのですが、意味的には中央値と同じです。

箱ひげ図

次に箱ひげ図を書いてみます。

G1は1学期の成績です。


plt.boxplot(student_data_math.G1)
plt.grid(True)

gridをTrueにするとグラフに格子が入ります。

1学期の生徒の数学の点数の得点分布を示しています。

f:id:at25250410:20180803194237p:plain

散布図

最後は、散布図です。

plt.plot(student_data_math.G1,student_data_math.G3,'o')

# ラベル
plt.ylabel("G3 grade")
plt.xlabel("G1 grade")

plt.grid(True)

1学期の生徒の数学の点数の得点分布と3学期の生徒の数学の点数の得点分布の相関関係を示しています。

f:id:at25250410:20180803194250p:plain

強い正の相関がみられます。1学期の成績がいい人は3学期の成績もよい傾向があるということがわかります。


複数の箱ひげ図や散布図を表示させることもできるので、興味がある方はさらに調べて色々試してみてください。