あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

パラメータを変えて正規分布グラフを書きたい(sympyを使う)

確率分布を試しに書く際、データを発生させたりせず試したかったので、数式を扱うsympyで書いてみました。

使うもの

# 描画
from sympy.plotting import plot
# 数式
from sympy import symbols
# 計算
from sympy import exp,pi,sqrt

▼上を読んで「ん?」となったらsympyの基本をまとめた記事をどうぞ esu-ko.hatenablog.com

esu-ko.hatenablog.com

今回書くもの

正規分布を書いてみることにします。
この数式をまずはコードに起こします。


\frac{1}{\sqrt{2\pi\sigma^2}}exp(-\frac{(x-\mu)^2}{2\sigma^2})


\mu, \sigmaとxをsymbolsにし、式にします。

mu,sigma,x = symbols('mu,sigma,x')

expr = (1/sqrt(2 * pi * sigma**2 )) * exp(-1 * ((x-mu)**2 )/ (2*sigma**2))

プロットしてみる

正規分布は、 \mu,\sigmaに値を渡し形を決定するので
上記に代入をします。.subsで代入です。

plot(
    expr.subs([
        (mu,0),
        (sigma,1)
    ]),
    (x,-2,2) #xの範囲を決定する
)

f:id:esu-ko:20200712223843p:plain

何パターンか試す場合

#sigmaは固定し、平均を動かしてみる
ps = [ expr.subs([(sigma,1),(mu,i)])for i in range(5)]
plot(*ps,range=(x,-10,10))

f:id:esu-ko:20200712224008p:plain オッケーそうです。

Pythonでフォーミュラを用いてGLMしたい(statsmodels.formulaを使う)

Rでモデルを作る時に使うフォーミュラのstatsmodels版です。 しょっちゅう、書き方を忘れるので、、、

基本

importします。
まず何をimportするのかを忘れます、、、

#たいてい.apiをつけ忘れる
import statsmodels.formula.api as smf

#こっちも使うんだけど忘れる
import statsmodels.api as sm

モデルの作成

mdl = smf.glm(
    フォーミュラ式,
    data,
    familiy = sm...#ここでsmが必要になる
).fit()

mdl.summary()
#予測の仕方に時々自信をもてない
mdl.predict(data2)

familyの整理

名称 family
ポアソン sm.families.Poisson()
ロジスティック(二項) sm.families.Binomial()
ガンマ sm.families.Gamma()
ガウス sm.families.Gaussian()

リンク関数の指定

デフォルト以外のものを使いたい時
sm.families.Binomial()などにパラメータとしてわたす。

例えばsm.families.Binomial(link=sm.families.links.logit)sm.families.Gaussian(sm.families.links.log)のように

おまけ

sm.add_constant(data)するのも忘れがち

Pythonの統計処理や機械学習でカテゴリ変数を扱いたい(get_dummiesを使う)

統計処理や機械学習でカテゴリ変数を扱う場合、
そのままでは使えないことが多く、数値変換やフラグ変換が必要です。

pandas.get_dummiesはフラグ変換をかなり簡単にしてくれますが、
引数の渡し方で挙動が変わるので注意が必要です。

カテゴリ変数の扱い方

よく使われるものでは以下の二つが存在します。

種類 内容
One-Hotエンコーディング カテゴリすべてを列にし、該当に1を立てたもの
ダミーエンコーディング カテゴリを一つを除き列にし、該当に1を立てたもの

この本では、

pandas.get_dummiesはダミーエンコーディングをしてくれる
と書かれているのですが、ドキュメントを読むと違っていました。

get_dummiesを使ったエンコーディング

import pandas as pd
a = pd.Series(['a','b','c'])

# そのままだと、one-hotになる
pd.get_dummies(a)

#出力
#  a   b   c
#0 1   0   0
#1 0   1   0
#2 0   0   1

#drop_first = Trueにするとダミーエンコーディングになる
pd.get_dummies(a,drop_first = True)

#出力
#  b   c
#0 0   0
#1 1   0
#2 0   1

その他知っていると便利な引数

  • prefix,prefix_sep : ダミー化したカラム名につけるprefixとそのprefixをつなく文字
  • columns:エンコード対象とするカラム。知らないと、そのカラムだけ分けてjoinして、とかをすることになる(してた)
  • dummy_na:Trueにすると、対象カテゴリがNaだったときにNAというカラムにする。デフォルトはFalse