seabornライブラリの regplot関数を使って、散布図と線形回帰を描画するサンプルコードを紹介します。
seabornは、統計データ視覚化ライブラリで Python in Excel のコアライブラリの1つです。regplot関数を使うと散布図とトレンドラインの線形回帰を一括描画できます。
出力結果例
regplot 関数の構文
sns.regplot(data=None, x=None, y=None [, 任意引数])
戻り値 | matplotlib Axes |
引数 | 型 | 説明 |
---|---|---|
data | DataFrame | 処理対象のデータ |
x, y | string or Series or 配列 | x軸とy軸に表示するdataの列名 または、Seriesオブジェクト |
x_estimator | 関数 | ベクトル -> スカラーをマップする関数 x の値に対する関数の戻り値がプロットされる。 x が離散値である場合に役立つ。 |
x_bins | int or vector | x の値をビン分割し中心傾向と信頼区間を推定する。 ビン分割は散布図の描画にのみ使用される。 |
x_ci | string | x の離散値の中心傾向をプロットするときに使用される 信頼区間のタイプ 選択肢:”ci”(引数 ci の値に従う) ”sd”(各ビンの観測値の標準偏差を表示) デフォルト:”ci” |
scatter | bool | 散布図を描画するか否か デフォルト:True |
fit_reg | bool | 線形回帰モデルを描画するか否か デフォルト:True |
ci | int | 回帰推定の信頼区間(%) 回帰直線の周囲の半透明のバンドが描画される デフォルト:95 |
n_boot | int | ci を推定するためのブートストラップサンプリングの回数 デフォルト:1000 |
units | string | x や y の観測値がサンプリング単位でネストされている場合、 その変数名を指定する。マルチレベルのブートストラップによって 信頼区間を計算し、回帰推定や描画には影響を与えない。 |
seed | int、他 | int、numpy.random.Generator、 numpy.random.RandomStateを指定 再現可能なブートストラップのためのシードまたは乱数ジェネレータ |
order | int | 1より大きい値を指定すると、numpy.polyfit を使用して 多項式回帰を推定する デフォルト:1 |
logistic | bool | True の場合、y がバイナリ値であると仮定し、 statsmodels のロジスティック回帰モデルを使用する。 ※線形回帰よりも計算量が多いため、引数 n_boot の数を減らすか、 引数 ci を None にすることを推奨 デフォルト:False |
lowess | bool | True の場合、statsmodels のノンパラメトリック lowess モデル (局所加重線形回帰)を使用する。信頼区間は描画されない。 デフォルト:False |
robust | bool | True の場合、statsmodels のロバスト回帰モデルを使用する。 これにより外れ値の重みが軽減される。 ※線形回帰よりも計算量が多いため、引数 n_boot の数を減らすか、 引数 ci を None にすることを推奨 デフォルト:False |
logx | bool | True の場合、y ~ log(x) の形式の線形回帰を使用する ※ x が正の値である必要があることに注意 デフォルト:False |
x_partial, y_partial | string | プロットする前に、x または y 変数から回帰する交絡変数 |
truncate | bool | 回帰直線をデータの範囲内に描画するか False の場合、x 軸の範囲まで拡張される デフォルト:True |
x_jitter, y_jitter | float | 一様なランダムノイズを x または y 変数に追加する場合の ノイズのサイズ。ノイズは散布図の外観にのみ影響し、 離散値を取る変数をプロットするときに役立つ。 |
label | string | 凡例のラベル |
color | string | プロットの色 Specifying colors |
marker | string | マーカー(プロットの形) matplotlib marker code で指定する デフォルト:”o” |
scatter_kws, line_kws | dict | matplotlib.pyplot の scatter関数, plot関数に渡す追加の設定 |
ax | matplotlib Axes | プロットを描画するための Axes オブジェクト |
サンプルコード
サンプルデータ
データが150件、名称が「IrisDataSet2」のテーブルを使用して説明します。
サンプルデータを取得する方法は、ここを展開してください。
サンプルデータを取得する手順
- 1「数式」タブ→「Pythonの挿入」ボタン→「Pythonサンプルを試す」をクリック
- 2Excelウィンドウ右側に表示されたペーンの「サンプルの挿入」をクリック
- 3サンプルデータのシートが追加されます
Pythonの入力方法や出力種類、DataFrameの定義方法については、以下の記事で詳しく紹介しています。
【超基本】Python in Excel の使い方とルール
Python in Excel の入力方法は難しくはありませんが、Excelのワークシート関数の入力の仕方とは少し勝手が違います。この記事では、Python in Excel の入力の仕方と出力の種類、計算順序やパフォーマンスを向上させるた...
[DataFrame] xl関数の指定方法いろいろ
この記事では、DataFrameの定義、xl関数の使い方や注意点について説明します。DataFrameを使うと、Excelのセル範囲や名前、テーブル、Power Queryのデータを Python in Excel で扱えるようになります。...
前提
以降のサンプルコードは、DataFrame型の df, x, y変数が定義済みであることを前提としています。
# 別のセルに定義しておく
df = xl("IrisDataSet2[#すべて]", headers=True)
# 特定の列のDataFrameの場合
x = xl("IrisDataSet2[[#すべて],[sepal_length]]", headers=True)
y = xl("IrisDataSet2[[#すべて],[petal_length]]", headers=True)
# 同じセルに記述してもよい
df = xl("IrisDataSet2[#すべて]", headers=True)
sns.regplot(data=df, x="sepal_length", y="petal_length")
また、複数のregplot関数の例を列挙して記述していますが、実際に試してみる場合はそれぞれ別のセルに記述してください。(列挙して記述するとプロットが重なって表示されます。)
# こんな風に複数記述されている場合は、1つずつ試すか別のセルに記述してください
sns.regplot(x=x, y=y, x_bins=25, x_ci="sd") # 標準偏差
sns.regplot(x=x, y=y, ci=100) # 信頼区間100%
sns.regplot(x=x, y=y, ci=80) # 信頼区間80%
データの指定1(x, y に列名)
# seabornは「sns」のエイリアス名でimport文なしで使える
# import seaborn as sns
sns.regplot(data=df, x="sepal_length", y="petal_length")
結果
セルに「Image」と表示された場合は、Python出力の種類を「Excelの値」に変更してください。
画像付き説明は、ここを展開してください。
セル内のイメージを拡大する場合は、セルをクリックし、右上に表示される「参照の作成」アイコンをクリックしてください。
データの指定2(x, y にオブジェクト)
# x, y は別セルで定義済み(「前提」セクションを参照)
sns.regplot(x=x, y=y, color="m")
結果 わかりずらいので色(マゼンタ)も変えてみた(プロットはdata指定の例と全く同じ)
ビン分割(x_bins)
sns.regplot(x=x, y=y, x_bins=50)
結果 大まかに分割。散布図だけ変わる。
信頼区間(x_ci, ci)
sns.regplot(x=x, y=y, x_bins=25, x_ci="sd") # 標準偏差
sns.regplot(x=x, y=y, ci=100) # 信頼区間100%
sns.regplot(x=x, y=y, ci=80) # 信頼区間80%
結果 回帰直線の周囲の半透明のバンドの幅が変わる
散布図、回帰モデルを非表示(scatter, fit_reg)
sns.regplot(x=x, y=y, scatter=False) # 散布図を非表示
sns.regplot(x=x, y=y, fit_reg=False) # 回帰直線を非表示
結果
色々な回帰モデル(order, lowess, logx)
# 多項式回帰
sns.regplot(x=x, y=y, order=3)
結果
# ノンパラメトリック lowess モデル(局所加重線形回帰)
sns.regplot(x=x, y=y, lowess=True)
結果
# y ~ log(x) の形式の線形回帰
sns.regplot(x=x, y=y, logx=True)
結果
回帰ラインの描画範囲(truncate)
sns.regplot(x=x, y=y, truncate=True) # デフォルト
sns.regplot(x=x, y=y, truncate=False)
結果 False にすると、回帰ラインが枠内いっぱいに描画される
ランダムノイズを追加(x_jitter, y_jitter)
sns.regplot(x=x, y=y, x_jitter=0.2)
結果
色、プロットの形状(color, marker)
# 色を「cyan」、プロットの形状を「♦(thin_diamond)」
sns.regplot(x=x, y=y, color="c", marker="d")
結果
凡例を表示(label)
# species別にDataFrameを取得する
df = xl("IrisDataSet2[#すべて]", headers=True)
setosa = df.query('species == "setosa"')
x1 = setosa["sepal_length"]
y1 = setosa["petal_length"]
versicolor = df.query('species == "versicolor"')
x2 = versicolor["sepal_length"]
y2 = versicolor["petal_length"]
virginica = df.query('species == "virginica"')
x3 = virginica["sepal_length"]
y3 = virginica["petal_length"]
# グラフと凡例を表示
ax = sns.regplot(x=x1, y=y1, label="setosa")
ax = sns.regplot(x=x2, y=y2, label="versicolor")
ax = sns.regplot(x=x3, y=y3, label="virginica")
ax.legend()
結果
各グラフをさらに設定(scatter_kws, line_kws)
sns.regplot(
x=x, y=y,
scatter_kws={"edgecolors":"m", "linewidths":2.0}, # 散布図の設定
line_kws={"linestyle": "--"}, # 回帰ラインの設定
)
結果
注意点
軸のタイトルや凡例に、日本語は表示されないようです。
コメント