パラメータを変えて正規分布グラフを書きたい(sympyを使う)
確率分布を試しに書く際、データを発生させたりせず試したかったので、数式を扱うsympyで書いてみました。
使うもの
# 描画 from sympy.plotting import plot # 数式 from sympy import symbols # 計算 from sympy import exp,pi,sqrt
▼上を読んで「ん?」となったらsympyの基本をまとめた記事をどうぞ esu-ko.hatenablog.com
今回書くもの
正規分布を書いてみることにします。
この数式をまずはコードに起こします。
,
とxをsymbolsにし、式にします。
mu,sigma,x = symbols('mu,sigma,x') expr = (1/sqrt(2 * pi * sigma**2 )) * exp(-1 * ((x-mu)**2 )/ (2*sigma**2))
プロットしてみる
正規分布は、 ,
に値を渡し形を決定するので
上記に代入をします。.subsで代入です。
plot(
expr.subs([
(mu,0),
(sigma,1)
]),
(x,-2,2) #xの範囲を決定する
)

何パターンか試す場合
#sigmaは固定し、平均を動かしてみる ps = [ expr.subs([(sigma,1),(mu,i)])for i in range(5)] plot(*ps,range=(x,-10,10))
オッケーそうです。
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を立てたもの |
この本では、

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)
- 作者:Alice Zheng,Amanda Casari
- 発売日: 2019/02/23
- メディア: 単行本(ソフトカバー)
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