プログラミング

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

 

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学期の成績もよい傾向があるということがわかります。

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

 

jupyter notebookを学べるおすすめの本




  • この記事を書いた人
  • 最新記事
電脳ヨーグルト

電脳ヨーグルト

エンジニア男子大学生。飲むヨーグルトが好きです。人とのコミュニケーションが苦手な僕のアルバイトの体験談などを語っています。おすすめのプログラミングスクールの記事も自信作なので、ぜひ読んでもらいたいです。

-プログラミング

Copyright© コミュ障の働き方&学び方 , 2020 All Rights Reserved Powered by AFFINGER5.