DRYな備忘録

Don't Repeat Yourself.

R(とPython)で平均値、中央値、分散、標準偏差を求める

Rやりはじめた。

otiai10.hatenablog.com

勉強

  • 平均値: 全要素の合計を要素数で割ったもの。重心。集合の代表値のひとつ。
    • (1/n) * Σx(k)
  • 中央値: 全要素を小さい順にならべて真ん中の値そのもの。集合の代表値のひとつ。
    • x([n/2])
  • 分散: 各要素の平均値との差分を自乗したものの和を要素数で割ったもの。集合全体のばらつき度合いを表す。
    • (1/n) * Σ((x(k) - av(k))^2)
  • 標準偏差: 分散の正の平方根。便宜的に、分散の値を、各要素の次元に合わせたもの。
    • √ ((1/n) * Σ((x(k) - av(k))^2))

なるほど。

サンプルデータ

サンプルデータを以下のように定義する。

0 1 2 3 4 5 6 7
167.857 172.364 173.964 125.874 124.698 170.048 134.241 126.285
> n <- c(167.857,172.364,173.964,125.874,124.698,170.048,134.241,126.285)

平均値

> mean(n)
[1] 149.4164

中央値

> median(n)
[1] 151.049
> # 151.049 なんて要素無いが?
> s <- sort(n)
> mean(c(s[4], s[5]))
[1] 151.049
> # 要素数が偶数なので、中央の2値の算術平均ということでした

※ Rは1-origin(インデックスが1から始まる)を知らず体感10分ぐらいハマった

分散

> var(n)
[1] 546.4991

ほんまかいな。ってことで、Pythonで確認。

>>> n = [167.857,172.364,173.964,125.874,124.698,170.048,134.241,126.285]
>>> ave = 149.4164
>>> reduce(lambda x, y: x + (ave - y)**2, [0] + n) / len(n)
478.18674823500004

んんー違うぞ。

なるほど。標本分散を求める式をRでつくってみる。

> # 平均値を各要素に持つ要素数を一致させたベクトルをつくる
> rep(mean(n), length(n))
[1] 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164 149.4164
> # これと標本集団との差分を取る
> n - rep(mean(n), length(n))
[1]  18.44063  22.94763  24.54763 -23.54237 -24.71837  20.63163 -15.17537
[8] -23.13137
> # この各要素を自乗する
> (n - rep(mean(n), length(n))) ** 2
[1] 340.0567 526.5935 602.5859 554.2434 610.9981 425.6640 230.2920 535.0605
> # この自乗した各要素を合計する
> sum((n - rep(mean(n), length(n))) ** 2)
[1] 3825.494
> # 要素数で割る
> sum((n - rep(mean(n), length(n))) ** 2) / length(n)
[1] 478.1867

Pythonでシコった値と一致した。

標準偏差

> sd(n)
[1] 23.37732

Pythonで確認

>>> import math
>>> math.sqrt(478.18674823500004)
21.86748152474354
# Rのsdの値と一致しないのは、
# Rのsdは不偏分散varの√を取ったものであろう
# と予想。
>>> reduce(lambda x, y: x + (ave - y)**2, [0] + n) / (len(n) - 1)
546.49914084
# これが不偏分散。
# この√を取ると、
>>> math.sqrt(reduce(lambda x, y: x + (ave - y)**2, [0] + n) / (len(n) - 1))
23.377321079199813
# Rのsdの値と一致した。

雑感

  • 用語の定義を理解していないので、いちいちPythonで確認しており、非効率を感じる
  • けど、たのしい
  • 標準で用意されている関数が多くて、最初はわりと覚えの問題な気がした

DRYな備忘録として

Rによるやさしい統計学

Rによるやさしい統計学

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

Rによる実証分析 ―回帰分析から因果分析へ―

Rによる実証分析 ―回帰分析から因果分析へ―

はじめてのR

インストール

% brew install r
% R

R version 3.5.0 (2018-04-23) -- "Joy in Playing"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin16.7.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

R は多くの貢献者による共同プロジェクトです。
詳しくは 'contributors()' と入力してください。
また、R や R のパッケージを出版物で引用する際の形式については
'citation()' と入力してください。

'demo()' と入力すればデモをみることができます。
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。

> q()
Save workspace image? [y/n/c]: n
%

イントロ

> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
> x
[1] 10.4  5.6  3.1  6.4 21.7
> y <- 1/x
> y
[1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295
> x + y
[1] 10.496154  5.778571  3.422581  6.556250 21.746083
> x * y
[1] 1 1 1 1 1
  • 1行5列のベクトルxをつくる
  • xの各要素の逆数を要素とする1行5列のベクトルyをつくる
  • ベクトルの和
  • ベクトルの内積

わかる。

ひきつづき。

Rによるやさしい統計学

Rによるやさしい統計学

はじめてのR: ごく初歩の操作から統計解析の導入まで

はじめてのR: ごく初歩の操作から統計解析の導入まで

Go言語のgoroutine、channel、sync、contextなどについて学習

なんだかんだでvirtualenvが使いやすかったのでメモ

% pip install virtualenv
% mkdir -p ${HOME}/.venv/default
% virtualenv -p python3 ${HOME}/.venv/default
% echo 'source ${HOME}/.venv/default/bin/activate' >> ${HOME}/.zshrc
% mkdir -p ${HOME}/.venv/myproject
% virtualenv -p python2.7 ${HOME}/.venv/myproject
% source ${HOME}/.venv/myproject/bin/activate
(myproject) % python --version
Python 2.7.10

【Webpack】TypeError: Cannot read property 'watchRun' of undefined

問題

% ./node_modules/.bin/webpack
# 中略
TypeError: Cannot read property 'watchRun' of undefined

調査

解決

% ./node_modules/.bin/webpack --version
3.11.0
% npm install --save-dev -D webpack@4.0
% ./node_modules/.bin/webpack --version
4.0.1
% ./node_modules/.bin/webpack
# うごいた

Pythonの開発環境立ち上げメモ(virtualenvを使った最小構成)

現状確認

% which python
/usr/bin/python
% python --version
Python 2.7.10
% which easy_install
/usr/bin/easy_install
% which pip
pip not found
%
% sudo easy_install virtualenv
% virtualenv -p /usr/bin/python ~/.venv/default
% source ~/.venv/default/activate
(default) % pip install awscli

PROMPTが変わるのうざいな

% export VIRTUAL_ENV_DISABLE_PROMPT=1

デフォルトでdefaultを使うようにしたい

% echo 'source ${HOME}/.venv/default/activate' >> ~/.zshrc

また、何かのプロジェクトで切り分けたい環境があれば

% virtualenv -p /usr/local/bin/python3 ~/.venv/another-project
% source ~/.venv/another-project/bin/activate

とかする。

Chrome拡張の開発でwebpackを使わずにES6のimportを有効にしたい

追記 2018/10/29

chromeモジュールが使えなくなる、という指摘は半分正しくて半分間違ってる(いくらでもやりようがある)のでもうちょっとちゃんとした記事を書きました。

medium.com

以下原文ママ


背景

  • JSのプロジェクトで、特に僕はChrome拡張を作ることが多いんですが、ES6 syntaxを使いたい
  • だいたいのES6 syntaxは、Chrome(現在 65.0.x)で使える
  • ただし、問題は import です

Background Script でimportを使う

medium.com

つまりHTML5準拠のブラウザでは<script type="module" src="..."></script>とすれば、これをエントリポイントとして以下importは解決されるんだけど、ということは逆にmanifest.jsonbackground.scriptsでBackgroundスクリプトを指定するとtype="module"属性を与えられないので、わざわざbackground.pageを使ってそこから<script>しましょうね、という話。

manifest.json

{
    "background": {
        "page": "src/html/background.html"
    }
}

src/html/background.html

<script type="module" src="src/js/background.js"></script>

Use ES6 import in Background Script · otiai10/chrome-extension-es6-import@ecf1267 · GitHub

Content Script でも、importを使いたい、のだが

同様の理由で、manifest.jsoncontent_scripts[i].jsでいきなりimportを使っても

Uncaught SyntaxError: Unexpected identifier

となる。 Uncaught SyntaxError: Unexpected identifier · otiai10/chrome-extension-es6-import@154b321 · GitHub

どうにかして、HTMLを起因としたjsのロードをしたい。

scriptタグのインジェクション

manifest.jsonの表現力では、どうにもcontent_scriptのjsをtype="module"でロードさせることができないので、<script>タグそのものをページのHTMLに挿入すればよかろう、という発想。

まず、manifest.jsonではinject.jsを読ませる

manifest.json

     "content_scripts": [
       {
         "matches": ["<all_urls>"],
-        "js": ["src/js/content.js"]
+        "js": ["src/js/inject.js"]
       }
     ],
     "permissions": [

inject.jsでは、<script>タグの動的挿入を行う。

src/js/inject.js

(() => {
  const src = chrome.extension.getURL('src/js/content.js');
  console.log(src);
  const script = document.createElement('script');
  script.setAttribute('src', src);
  script.setAttribute('type', 'module');
  document.body.appendChild(script);
})();

いい感じに動きそうだが、これでも以下のエラーが出る。

GET chrome-extension://invalid/ net::ERR_FAILED

どうやらネットワークっぽいエラーで、jsのpathが正しく指定されていないか、あるいはもっと別の原因が考えられる。なお、inject.jsconsole.logさせたsrcのURLをクリックすれば正しくcontent.jsの内容が見えるので、pathが正しく指定されていない、ということはなさそう。

web_accessible_resources を指定すればよい

manifest.jsonweb_accessible_resourcesというフィールドでは、ウェブからのリダイレクトなどの参照を許すChrome拡張内のリソースのパスを指定することができる。まさに今回、Chrome拡張側から見れば第三者の立場であるHTMLから、Chrome拡張内のリソースを<script src="...">でロードさせようとしているので、これに該当する。

このとき、content.jsだけではなく、content.jsを起因とするすべてのimportで参照されるリソースをweb_accessible_resourcesに指定する必要があるので、ワイルドカードを使った。

     ],
     "permissions": [
       "<all_urls>"
+    ],
+    "web_accessible_resources": [
+      "src/js/*"
     ]
 }

f:id:otiai10:20180327212500p:plain

いい感じに動いた。

ソースコードまとめ

github.com

懸念

  • node_modules以下にあるパッケージをどうやってimpotするか
    • full pathを書けばimportできるだろうけれど、Chrome拡張としてリリースビルドにどう含めるか
  • そもそもリリースビルドにnode_modules以下のすべてを含めるわけにはいかない

結論

webpack使お...

DRY

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター! 速習シリーズ

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター! 速習シリーズ