【松尾研データサイエンティスト育成講座】第3章・練習問題を解いてみた:単回帰分析編

松尾研「データサイエンティスト育成講座」も第3章に入りました。この章ではデータを落とし、手を動かしながら記述統計学と単回帰分析を学んでいきます。分析に使うのは主にPandas。めちゃめちゃ便利で大好きなライブラリです。さっそく練習問題を解いてみました。

3.1.1 記述統計学

<練習問題 1>
<練習問題 1>
studet-por.csvを読み込んで、要約統計量を表示してください。

<練習問題 1の答え>

import numpy as np
import numpy.random as random
import scipy as sp
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
%matplotlib inline  #JupyterNotebook用のマジックコマンド

%precision 3

student_data_por = pd.read_csv('student-por.csv',sep=';')
student_data_por.describe()

指定のCSVを読み込み、要約統計量を出すだけ。それほど難しい問題ではありません。

<練習問題 2>
以下の変数をキーとして、先ほどの数学のデータとポルトガル語のデータをマージしてください。マージするときは、両方ともに含まれているデータを対象としてください(内部結合と言います)。そして、要約統計量など計算してください。なお、以下以外の変数名は、重複がありますので、suffixes=('math', 'por')のパラメータを追加して、どちらからのデータかわかるようにしてください。

["school","sex","age","address","famsize","Pstatus","Medu","Fedu","Mjob","Fjob","reason","nursery","internet"]

<練習問題 2の答え>

key = ['school','sex','age','address','famsize','Pstatus','Medu','Fedu','Mjob','Fjob','reason','nursery','internet']
mtable = pd.merge(student_data_math, student_data_por,on=key, how='inner', suffixes=('_math', '_por'))
mtable

2つのDataFrameをマージする問題です。「内部結合ってどうやるんだ?」とググって解きました。結果を表示すればわかるとおり、マージ後の表はかなり巨大になり、JupyterNotebookなどでは中央部分が省略されてしまいます。私は表全体を見渡すため、HTMLに出力しました。Pandasのto_html()関数を使うと、簡単にHTML化できます。コードはこんな感じです。

mtable.to_html('sample.html')

<練習問題 3>
上記のマージしたデータについて、変数を幾つかピックアップして、散布図とヒストグラムを作成してみましょう。どういった傾向がありますか。また、数学データのみの結果と違いはありますか。考察してみましょう。

<練習問題 3の答え>
数学の点数とポルトガル語の点数がG1時点でどうだったかを見てみることにしました。まず、散布図を描いてみます。

plt.plot(mtable.G1_math,mtable.G1_por, 'o')

plt.title('G1:数学の点数とポルトガル語の点数の散布図')
plt.xlabel('数学')
plt.ylabel('ポルトガル語')
plt.grid(True)

結果はこんな感じ。
f:id:tekitoeditor:20190720143229p:plain
そこそこの相関はありそうですね。気になる相関係数を出してみます。

sp.stats.pearsonr(mtable.G1_math,mtable.G1_por)

計算結果は次のとおり。
f:id:tekitoeditor:20190720143455p:plain
p値は十分、相関係数は0.57程度とわかりました。今度は数学の点数とポルトガル語の点数のヒストグラムをそれぞれ描いてみます。まず、数学の点数です。

plt.hist(mtable.G1_math)

plt.title('G1:数学の点数')
plt.xlabel('点数')
plt.ylabel('人数')

plt.grid(True)

表示されるヒストグラムは次のとおり。
f:id:tekitoeditor:20190720143804p:plain
ちょっと左に歪んでいる? 平均点はどれくらいでしょうか? 数字で実態を見てみることに。

print('平均値:', mtable.G1_math.mean())
print('中央値:', mtable.G1_math.median())
print('最頻値:', mtable.G1_math.mode())
print('分散:',mtable.G1_math.var())
print('標準偏差:', np.sqrt(mtable.G1_math.var()))

結果はこのとおりです。
f:id:tekitoeditor:20190720144124p:plain
なるほどね~。平均値と標準偏差はやっぱりわかりやすい指標です。一方のポルトガル語はどうでしょうか? 今度はヒストグラムと数字の実態を一気に出力してみます。

plt.hist(mtable.G1_por)

plt.title('G1:ポルトガル語の点数')
plt.xlabel('点数')
plt.ylabel('人数')

plt.grid(True)

print('平均値:', mtable.G1_por.mean())
print('中央値:', mtable.G1_por.median())
print('最頻値:', mtable.G1_por.mode())
print('分散:',mtable.G1_por.var())
print('標準偏差:', np.sqrt(mtable.G1_por.var()))

結果は次のとおりです。
f:id:tekitoeditor:20190720144616p:plain
数学よりも右に寄ったヒストグラムですね。よく見ると、0.0~2.5点付近に取り残された人がいて、とても気の毒です。「次回のテストでは頑張って!」と応援せずにはいられません。数字の指標を見ると、平均点はやはり数学より高め、標準偏差は小さくなっています。数学よりもポルトガル語が得意な人が多そうですね。

以上、第3章の単回帰分析編でした。引き続きやっていきます!