ウェブサイト検索

Pythonによる回帰分析:データの関係性を見つける方法


単にデータを収集するだけでは不十分です。データでスプレッドシートを埋めることはできますが、それを活用できなければ無意味です。回帰分析は、データの関係を見つけるための最も強力な統計ツールの一つです。Pythonはそれを簡単にし、スプレッドシートよりもはるかに柔軟です。その鉛筆と定規を置いて、代わりにPythonを手に取りましょう。始め方を紹介します。

単純線形回帰: トレンドを見つける

Pythonにおける回帰の最も単純な形式は、そう、単純線形回帰です。単純線形回帰では、二つの変数間に関係があるかどうかを確認しようとします。一方の変数は「独立変数」として知られ、もう一方は「従属変数」として知られています。独立変数は通常、x軸にプロットされ、従属変数はy軸にプロットされます。これにより、データポイントの古典的な散布図が作成されます。目的は、この散布図に最もよくフィットする線をプロットすることです。

私たちはニューヨーク市のレストランでのチップの例データを使って始めます。総請求額とチップの間に関係があるかどうかを見たいと思います。このデータセットは、私のお気に入りのデータビジュアライゼーションツールであるSeabornの統計プロットパッケージに含まれています。私は、このツールを簡単にアクセスできるようにMamba環境に設定しました。

まず、統計的プロット用のデータベースであるSeabornをインポートします。

import seaborn as sns
    

それでは、データセットを読み込みます:

tips = sns.load_dataset('tips')
    

Jupyterノートブックを使用している場合、私のGitHubページでリンクしているもののように、画像が外部ウィンドウではなくノートブック内に表示されるようにこの行を含めてください:

%matplotlib inline
    

さて、relplotメソッドを使って散布図を見てみましょう。

sns.relplot(x='total_bill',y='tip',data=tips)
    

散布図はほとんど線形に見えます。これは、請求額とチップの間に正の線形関係が存在する可能性があることを意味します。回帰直線をregplotメソッドでプロットすることができます:

sns.regplot(x='total_bill',y='tip',data=tips)
    

そのラインはかなりうまくフィットしているように見えます。

より正式な分析のために、別のライブラリであるPingouinを使用できます。Pingouinのlinear_regressionメソッドは、データポイントにフィットする回帰方程式の係数を計算し、適合度を決定します。

import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
    

丸めることで結果が読みやすくなります。線形回帰で注目すべき数字は相関係数です。得られた表では、相関係数の二乗として「r2」としてリストされています。その値は0.46で、良いフィットを示しています。平方根を取ると約0.68となり、これは1に非常に近く、以前見たプロットよりも正式に正の線形関係を示しています。

私たちはテーブルの値を使ってモデルを作成することもできます。あなたは直線の方程式を覚えているかもしれません: y=mx + b。yは従属変数で、mはx、つまり合計請求額の係数で、0.11です。これにより直線の傾きが決まります。bはy切片で、0.92です。

このモデルに基づく結果の方程式は

tip = 0.11(total bill) + 0.92
    

回帰の方程式はこれを逆転させるので、次のようになります:

tip = 0.92 + 0.11(total_bill)
    

私たちは、請求書の金額に基づいてチップを予測する短いPython関数を書くことができます。

def tip(total_bill):
return 0.92 + 0.11 * total_bill
    

2行目はインデントされるべきですが、私たちのCMSではこれを表示できないので、あなたのマシンでこの行をインデントするようにしてください。Pythonではインデントは4スペースの長さであることを忘れないでください。

100ドルのレストランの請求書からチップを予測してみましょう:

tip(100)
    

予想されるチップは約12ドルです。

多変量線形回帰:回帰を三次元、さらにその先へ

線形回帰は、単に2つの変数だけでなく、より多くの変数に拡張できます。より多くの独立変数を考慮することができます。データポイントに対して線を当てるのではなく、散布図の上に平面を当てることになります。残念ながら、これは2次元回帰よりも視覚化するのが難しいです。私は、仕様に基づいてノートパソコンの価格モデルを構築するために多重回帰を使用しました。

私たちはヒントのデータセットを使用します。今回は、「サイズ」列でパーティのサイズを見てみましょう。Pingouinでは簡単です。

pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
    

最初の引数で総請求額と宿泊者数を指定する二重かっこに注意してください。r²が同じであることにも注目してください。これは再び、適合が良好であり、総請求額とテーブルサイズがチップの良い予測因子であることを意味します。

テーブルのサイズの係数を使って、以前のモデルをサイズを考慮して書き直すことができます。

def tip(total_bill,size):
return 0.67 + 0.09 * total_bill + 0.19 * size
    

非線形回帰: 曲線のフィッティング

線形回帰を適用できるだけでなく、非線形の曲線も適用できます。これを示すために、NumPyを使用して二次関数を表すデータポイントを生成します。

まず、x軸のためにNumPyで大量のデータポイントを生成します:

x = np.linspace(-100,100,1000)
    

今からy軸のための二次関数のプロットを作成します。

y = 4*x**2 + 2*x + 3
    

回帰を作成するために、x軸とy軸用にリレーショナルデータベースに似たデータ構造であるPandas DataFrameを構築します。これにより、xとyの値の列が「x」と「y」という名前で作成されます。作成したいDataFrameに対して辞書をPandasに渡します。私たちはDataFrameを「df」と呼びます。

import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
    

headメソッドを使ってDataFrameを調べることができます:

df.head()
    

線形データで以前行ったように、Seabornを使って散布図を作成できます:

sns.relplot(x='x',y='y',data=df)
    

数学の授業で覚えているかもしれない古典的な放物線のプロットのように見えます。グラフ計算機でプロットしている(Pythonがそれを置き換えることができます)。これに放物線をフィットさせることができるか見てみましょう。Seabornのregplotメソッドには、フィットさせる多項式線の次数を指定するorderオプションがあります。二次関数の線をプロットしようとしているので、orderを2に設定します。

sns.regplot(x='x',y='y',order=2,data=df)
    

確かにそれは古典的な二次放物線に合っているようです。

フォーマット回帰を得るために、Pingouinを使用して非線形回帰手法を使用できます。xの値を二乗するために、データフレームにもう一つの列を追加するだけです:

df['x2'] = df['x']**2
    

次に、線形回帰を使用して二次曲線にフィットさせることができます。

pg.linear_regression(df[['x','x2']],df['y']).round(2)
    

これは人工的に作られたものであるため、r²は1であり、非常に良い適合を示しています。これはおそらく実際のデータでは見られないでしょう。

私たちは、関数を使用して予測モデルを構築することもできます:

def quad(x):
return 3 + 2*x + 4*x**2
    

この方法を2次より高い次数の多項式にも適用することができます。

ロジスティック回帰: バイナリカテゴリのフィッティング

特定のリスク要因、例えば人が喫煙するかどうかといった2つのカテゴリーの関係を見つけたい場合、ロジスティック回帰を使用することができます。

これを視覚化する最も簡単な方法は、再びSeabornライブラリを使用することです。私たちは、タイタニック号の乗客のデータセットを読み込みます。私たちは、チケットの価格が不運な旅から生き延びるかどうかの予測因子であったかどうかを確認したいと考えています。

titanic = sns.load_dataset('titanic')
    

二次元データフレームと同様に、データを検討できます:

titanic.head()
    

ロジスティック曲線をフィットさせることができるため、lmplotメソッドを使用します。

sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)

私たちは、乗客の数に対するロジスティック曲線を、生存したかどうかで分けて見ることができます。「生存」列はすでに「生存しなかった」に対して0、「生存した」に対して1に分けられています。

私たちはPingouinを使用して、運賃がタイタニックでの生存の予測因子であったかどうかを正式に判断することができます。Pingouinは多くの統計的検定の中でロジスティック回帰を提供しています。

pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
    

統計テストで注目すべき数値はp値で、表では「pval」として示されています。それは0.0であり、チケットの価格がタイタニックの旅を生き延びる強い予測因子であることを示しています。


これらの操作は、なぜPythonがデータ分析の選択肢として選ばれる言語であるかを示しています。手作業で行うと数日かかるか、統計学者がやりたがらない操作も、Pythonではわずか数秒で行えるのです。これらの回帰操作は、データの中から関係性を見つけ、予測を立てるのに役立ちます。