決定係数(R2値)について

普通の解析でもよく使うので情報のまとめ。

ソースはwikipedia

決定係数 - Wikipedia

決定係数の定義は複数あるが、一般的なものは、以下らしい。


R^{2} = 1-\dfrac{\sum ^{N}_{i=1}\left( y_{i}-f_{i}\right) ^{2}}{\sum ^{n}_{j=1}\left( y_{j}-\overline{y}\right) ^{2}}

式変形して、標本値の標準偏差で表現すると、


R^{2} = 1-\dfrac{(1/n)\sum ^{N}_{i=1}\left( y_{i}-f_{i}\right) ^{2}}{\sigma^{2}}

ここで、非常にざっくりと実測値と回帰式の予測値との差yi-fiを平均的にΔとして、Δについての式を解くと


\Delta =\sigma \sqrt{1-R^{2}}

すなわち概念としては、予測精度が全くない状態(R2=0)は実測値と予測値との差異は標準偏差程度であるのに対して(何もしない、平均値をとるだけの予測)、そこからの差分をどれだけ回帰式で埋めれるのかの割合(と理解しました)。

そこで、およそ標準偏差の値から予測値の差を見積もろうと、上式をもとにしたR2値に応じた計算値は表の通り。

 R^{2} 1-R^{2} \sqrt{1-R^{2}}
0.1 0.9 0.949
0.5 0.5 0.707
0.9 0.1 0.316
0.95 0.05 0.224
0.99 0.01 0.100
0.995 0.005 0.0707
0.999 0.001 0.0316

pythonでエクセルシートのデータ(CSVデータ)を画像化

pythonでエクセルシートのデータ(CSVデータ)を画像化します。

インプットのデータでは各セルに数値(実数値)が入っており、各セルを一つのピクセルとして数値は輝度値に変換します。

import numpy as np
import csv

# 画像の読み込み
with open('xxx.csv') as f:
    reader = csv.reader(f)
    l = [row for row in reader]

# ヘッダ部分を削除
l_img = []
for l in l[22:]:
    # 欠損値はnanで処理
    l_img.append( np.array( [ np.nan if x == '' else float(x) for x in l ] ) )

読み込んだ各行の列数が一致していることを一応確認します。

img_len = np.array( [ len(x) for x in l_img ] )
print( np.max( img_len ) )
print( np.min( img_len ) )

画像のため、配列を二次元に変換しています。行列のサイズも確認しておきます。

im = np.array( l_img ).flatten().reshape( len(l_img),-1 )
print( np.shape( im ) )

imの配列中の値の分布などを確認します。

import seaborn as sns
import matplotlib.pyplot as plt

mask = ~np.isnan(im)

sns.distplot(im[mask])
print( np.max( im[mask] ) )
print( np.min( im[mask] ) )

uint16の整数に変換します。今回は、元のデータが-6-+6だったので、その値が0-65,535になるよう調整します。

# uint16, 0-65,535
im_conv = np.uint16( 255*255*(im/12.+0.5) )
sns.distplot( im_conv[mask] )
print( np.max( im_conv[mask] ) )
print( np.min( im_conv[mask] ) )

バイナリとして保存します。リトルエンディアン(<)でunsigned shortです(H)。保存したrawファイルは別のプログラムとかで使用するつもり(Image-Jとか)。

im_conv.astype('<H').tofile('output.raw')

numpy配列をPillowを使って処理します。可視化まで実施です。

from PIL import Image

pilOUT = Image.fromarray(im_conv) 
pilOUT.show()

参考にしました

PythonでCSVファイルを読み込み・書き込み(入力・出力) | note.nkmk.me

Pythonの画像処理ライブラリPillow(PIL)の使い方 | note.nkmk.me

NumPyのarrayとPILの変換 - white wheelsのメモ

numpy.ndarrayのファイル保存(読み込み/書き込み対応表付き) | Python-izm

エンディアンについて - Qiita

mdwiki【インストール】

mdwikiの初期環境設定に取り組みます。

MDwiki

GitHub - Dynalon/mdwiki: CMS/Wiki system using Javascript for 100% client side single page application using Markdown.

インストール

最新版のフォルダは下記から参照可能。現時点では0.6.2が最新のようです。

MDwiki

zipファイルをダウンロード、解凍します。フォルダ中にはmdwiki.htmlが格納されています。

初期設定・チュートリアル

インストールフォルダ、mdwiki.htmlが存在する階層に、index.mdを配置します。配置したindex.mdは一旦適当なものでok。

# test
## foo

mdwiki.htmlを適当なブラウザで開きます。

chromeで開くときの注意点

ローカルファイルにアクセスする際には、オプションの設定が必要です。chromeのショートカットのプロパティから、リンク先を以下の通り修正します。

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files

--をコピペするときに、勝手に連結される場合があるので注意。chromeのショートカットを管理者権限で開きます。通常通りブラウザが開かれますが、次回以降もオプション付きで開かれるようになります。先のmdwiki.htmlをchromeから開きます。

上記のテストページはこんな感じ。

f:id:matsuo_san:20200812182422p:plain

参考にしました。

Markdown を HTML ファイル一つで Wiki っぽく見せる MDWiki が便利な件 - Qiita

MDWikiの気に入った点と課題に感じた点について - Qiita

MDWiki をローカルや共有フォルダ上で運用する際に気を付けること - stamemo

MarkDownで書いたファイルを置くだけでWiki化できるMDWikiを導入してみた。 - Qiita

【MDWiki】2つのファイルの置くだけ!Markdown記法で書けるMDwikiの導入方法について | CGメソッド

Windows版chromeでローカルファイルに直接アクセスする方法[オレ得JavaScriptメモ] | 56DOC BLOG

pythonで外部ファイルのクラス読み込み

実行位置から相対パスで外部ファイルを指定します。

import sys

sys.path.append(r'..\dir')
from aaa import bbb

windows環境なので、ファイル名の指定法に注意。

参考にしました。

Python 3でのファイルのimportのしかたまとめ - Qiita

【python】外部ファイルのクラスを読み込みたい | ハックノート

Python別ファイルを読み込む方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン

windows環境(python)からwsl上のプログラムを実行

やりたかったこと

flaskでwebアプリ開発中、wsl環境で構築したプログラムを実行したかった。

import subprocess

cmd = "wsl /home/matsuo/... .../a.out"
subprocess.call(cmd.split(),shell=True)

subprocess を使ってコマンドを実行します。ポイントは、

  • wslコマンド
  • subprocessでのshell=True

コメント

実行はwindows上のカレントディレクトリ(pythonスクリプト実行ディレクトリ)となるため、インプットデータなどは移動させる必要あり。

参考にしました

[Python2.7] subprocess の使い方まとめ - Qiita

matplotlibでよく検索する内容

matplotlibでよく検索する情報のまとめ。逐次更新。

フォント

https://hogeocraft.blogspot.com/2017/09/matplotlibpyplot.html

軸の文字

上付き・下付きにはmathdefaultを使うとよい(数式フォントを使う)。

[$\mathdefault{cm^3}$/g]

グラフ

Matplotlib アスペクト比の調整 - 俺のOneNote

凡例の位置

matplotlib の legend(凡例) の 位置を調整する - Qiita

[Python3] matplotlibで折れ線グラフで縦軸(y軸)を3つ以上書く方法 - Qiita

matplotlibで、2軸、3軸でグラフを描画する - Qiita

https://www.it-swarm-ja.tech/ja/python/matplotlib%e3%81%aex%e8%bb%b8%e3%81%be%e3%81%9f%e3%81%afy%e8%bb%b8%e3%81%ae%e3%80%8c%e7%9b%ae%e7%9b%9b%e3%82%8a%e3%81%ae%e9%a0%bb%e5%ba%a6%e3%80%8d%e3%82%92%e5%a4%89%e6%9b%b4%e3%81%99%e3%82%8b/1069360408/

線形回帰

scikit-learn で線形回帰 (単回帰分析・重回帰分析) – Python でデータサイエンス

Python(StatsModels) で重回帰分析を理解し、分析の精度を上げる方法 | たぬハック

LASSO 回帰 / Python | scikit-learn の linear_model クラスを使った LASSO 回帰

カラーユニバーサルデザイン

jfly.uni-koeln.de

https://www.fukushihoken.metro.tokyo.lg.jp/kiban/machizukuri/kanren/color.files/colorudguideline.pdf

資料を作成時に色使い困ったときによく参照にしています。詳細はHPを参照してください。色コードは下にべた書き。

#ff2800, #faf500, #35a16b, #0041ff, #66ccff, #ff99a0, #ff9900, #9a0079, #663300
#ffd1d1, #ffff99, #cbf266, #b4ebfa, #edc58f, #87e7b0, #c7b2de

pythonでリストコピペする用

'#ff2800', '#faf500', '#35a16b', '#0041ff', '#66ccff', '#ff99a0', '#ff9900', '#9a0079', '#663300'
'#ffd1d1', '#ffff99', '#cbf266', '#b4ebfa', '#edc58f', '#87e7b0', '#c7b2de'