前回の記事では、Matplotlibでsubplotsを使ってグラフを描いてみた。
今回はnumpy の polynomial を利用して線形回帰分析を行ってみようと思う。
1. 線形回帰分析とは?
ウィキペディアを見ると、線形回帰分析を次のように説明している。
統計学において線形回帰は、従属変数 y と1つ以上の独立変数 X との線形な相関関係をモデル化する回帰分析手法である。
-ウィキペディア-
とても簡単に言えば、グラフにプロットされた値が持つ平均的な傾きであるとも言える。
線形回帰をグラフに表示することで、目でなんとなく見えている2つの値の相関関係を、よりはっきりと示すことができる。

上のグラフは、kaggle からダウンロードしたデータを可視化したものである。
保護者の学歴、人種、学生の成績が含まれているが、その中から数学スコアと読解スコアの関係を図示してみた。
ファイルは下に添付したものをダウンロードしてもいいし、リンクから入って入手しても構わない。下のファイルは日本語化しておいたので、使いやすいほうを選んでほしい。
2. グラフを描く
まずは上のグラフのように、学生の数学スコアと読解スコアをscatterで描いてみよう。
前回の講座で見たコードと同じように始めて、読み込むファイルのパスだけ変更すればよい。
import pandas as pd
# モジュール呼び出しおよび日本語フォント設定
import matplotlib.pyplot as plt
import matplotlib
# MacOSでのフォント設定
# matplotlib.rcParams["font.family"] = "AppleGothic"
# Windowsでのフォント設定
matplotlib.rcParams["font.family"] = "Malgun Gothic"
# フォントサイズ設定
matplotlib.rcParams["font.size"] = 13
# マイナス記号表示の問題を解決
plt.rcParams['axes.unicode_minus'] = False
score = pd.read_excel("./StudentsPerformance.xlsx")
score.head(3)
これを利用して、数学スコアと読解スコアを plt.scatter のパラメータとして渡す。
plt.scatter(score["수학점수"], score["읽기점수"])
このままではグラフがあまりきれいではないので、少し飾ってみた。
グラフの色、不透明度、各軸のラベルを追加した。
plt.scatter(score["수학점수"], score["읽기점수"], alpha=0.4, color="green")
plt.xlabel("수학점수")
plt.ylabel("읽기점수")
基本的なグラフが完成したので、ここからnumpy を活用して線形回帰分析をしてみよう。
3. Polynomial
numpy の polymomial を呼び出し、分析したいx の値、y の値、何次関数かをパラメータとして入力すればよい。
ここでは数学スコアと読解スコアを、1次関数で線形回帰分析してみよう。
from numpy.polynomial import Polynomial
f = Polynomial.fit(score["수학점수"], score["읽기점수"], 1)このように入力すると、polynomial は予測した線形関数を返してくれる。
したがって、f は x の値をパラメータとして受け取る関数になる。
次のように入力して、予測値を一度見てみよう。
from numpy.polynomial import Polynomial
f = Polynomial.fit(score["수학점수"], score["읽기점수"], 1)
f(40)
数学スコアが40点の学生の読解スコアの予測値は40になる。
ではグラフを描いてみよう。
4. 線形回帰グラフ
データの中の学生の数学スコアと読解スコアは、0から100まで整列された値ではない。
そのため、f にパラメータとして数学スコアをそのまま入れると、次数が高くなるほどグラフがめちゃくちゃになってしまう。


まず0から100までの数値を生成し、それを線形関数の x の値として渡してグラフを描く必要がある。
numpy の linspace は、開始点、終了点、その間に埋める数値の個数をパラメータとして受け取り、値を生成してくれる。
import numpy as np
x = np.linspace(0,100,200)
plt.plot(x,f(x))x の値を確認してみると、左のように生成されているのが分かる。
これを使ってグラフを描くと、下のようになる。


5. グラフを完成させる
あとは2つのグラフを重ねるだけで終わりだ。
plt.scatter(score["수학점수"], score["읽기점수"], alpha=0.4, color="green")
plt.xlabel("수학점수")
plt.ylabel("읽기점수")
plt.plot(x, f(x),"r--")
6. おわりに
今回は線形回帰分析を通して、2つの値がどのような関係を持っているかをグラフで描いてみた。
次回は、データ可視化を利用して高校の調査書(生徒記録)をどのように埋めていくかを考えるつもりだ。
댓글을 불러오는 중...