Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう

힘센캥거루
2023년 11월 21일(수정됨)
12
python

前回の記事では、Matplotlibでsubplotsを使ってグラフを描いてみた。

今回はnumpy の polynomial を利用して線形回帰分析を行ってみようと思う。

1. 線形回帰分析とは?

ウィキペディアを見ると、線形回帰分析を次のように説明している。

統計学において線形回帰は、従属変数 y と1つ以上の独立変数 X との線形な相関関係をモデル化する回帰分析手法である。
-ウィキペディア-

とても簡単に言えば、グラフにプロットされた値が持つ平均的な傾きであるとも言える。

線形回帰をグラフに表示することで、目でなんとなく見えている2つの値の相関関係を、よりはっきりと示すことができる。

Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-1

上のグラフは、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)
Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-2

これを利用して、数学スコアと読解スコアを plt.scatter のパラメータとして渡す。

plt.scatter(score["수학점수"], score["읽기점수"])
Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-3

このままではグラフがあまりきれいではないので、少し飾ってみた。

グラフの色、不透明度、各軸のラベルを追加した。

plt.scatter(score["수학점수"], score["읽기점수"], alpha=0.4, color="green")
plt.xlabel("수학점수")
plt.ylabel("읽기점수")
Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-4

基本的なグラフが完成したので、ここから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)
Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-5

数学スコアが40点の学生の読解スコアの予測値は40になる。

ではグラフを描いてみよう。

4. 線形回帰グラフ

データの中の学生の数学スコアと読解スコアは、0から100まで整列された値ではない。

そのため、f にパラメータとして数学スコアをそのまま入れると、次数が高くなるほどグラフがめちゃくちゃになってしまう。

Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-6Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-7

まず0から100までの数値を生成し、それを線形関数の x の値として渡してグラフを描く必要がある。

numpy の linspace は、開始点、終了点、その間に埋める数値の個数をパラメータとして受け取り、値を生成してくれる。

import numpy as np

x = np.linspace(0,100,200)
plt.plot(x,f(x))

x の値を確認してみると、左のように生成されているのが分かる。

これを使ってグラフを描くと、下のようになる。

Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-8Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-9

5. グラフを完成させる

あとは2つのグラフを重ねるだけで終わりだ。

plt.scatter(score["수학점수"], score["읽기점수"], alpha=0.4, color="green")
plt.xlabel("수학점수")
plt.ylabel("읽기점수")
plt.plot(x, f(x),"r--")
Pythonデータ可視化入門 8 - Numpyで線形回帰分析をしてみよう-10

6. おわりに

今回は線形回帰分析を通して、2つの値がどのような関係を持っているかをグラフで描いてみた。

次回は、データ可視化を利用して高校の調査書(生徒記録)をどのように埋めていくかを考えるつもりだ。

댓글을 불러오는 중...