はじめに
機械学習の勉強を始めたVBAユーザです。
備忘録としてPython・Rの文法をVBAと比較しながらまとめています。
いくつか記事を書きましたが、各言語で使用する関数等を比較した一覧表の部分をまとめました。
比較のために、EXCELでの計算も一部示しています。
目次
文法
基本的な文法
記事:https://qiita.com/swathci/items/97de2111e70c10205521
基本的な書き方
Python | R | VBA | |
---|---|---|---|
変数の宣言 | 宣言しない | 宣言しない | Dim 変数名 As 変数型 |
大文字と小文字の区別 | 区別あり | 区別あり | 区別なし |
複数行を1行にまとめて書く |
; 区切り |
; 区切り |
: 区切り |
1行を複数行に分けて書く |
/ で改行 |
_ で改行 |
|
スペース | 自由 | 自由 | 自動的に調整 |
インデント | 制御文でブロックを表す | 自由 | 自由 |
コメントアウト |
# の後 |
# の後 |
' の後 |
文字列 |
' ' 囲み " " 囲み |
' ' 囲み " " 囲み |
" " 囲み |
代入
Python | R | VBA | |
---|---|---|---|
代入 | = |
<- = ->
|
= |
複数同時代入 | 可能 | ||
複合代入演算子 | あり | ||
代入後出力 | 代入文を( ) 囲み |
入出力
Python | R | VBA | |
---|---|---|---|
出力 | print() |
print() cat()
|
Debug.Print MsgBox
|
入力 | input() |
InputBox() Application.InputBox()
|
ディレクトリ
Python | R | VBA | |
---|---|---|---|
カレントディレクトリの取得 |
import os os.getcwd()
|
getwd() |
Debug.Print ThisWorkbook.Path |
カレントディレクトリの変更 |
import os os.chdir('C://.../...')
|
setwd("C:/.../...") |
ChDir "C:\...\..." |
ファイル一覧の表示 |
import os os.listdir('.')
|
dir() |
繰り返し
記事:https://qiita.com/swathci/items/0a5a523480be5737cc2f
Python | R | VBA | |
---|---|---|---|
for文 |
for i in ...: ... |
for (i in ...) { ... }
|
For i = ... To ... ... Next i
|
while文 |
while ...: ...
|
while (...) { ... }
|
Do While ... ... Loop
|
until文 |
while not ...: ...
|
while (!(...)) { ... }
|
Do Until ... ... Loop
|
repeat文 |
while True: ...
|
repeat { ... }
|
Do While True ... Loop
|
break文 | break | break |
Exit For Exit Do
|
continue文 | continue | next |
条件分岐
記事:https://qiita.com/swathci/items/2dba6ebf683a11403f12
Python | R | VBA | EXCEL | |
---|---|---|---|---|
if文 |
if P: ... elif Q: ... elif R: ... else: ...
|
if (P) { ... } else if (Q) { ... } else if (R) { ... } else { ... }
|
If P Then ... ElseIf Q Then ... ElseIf R Then ... Else ... End If
|
=IF(P,..., IF(Q,..., IF(R,..., ...)))
|
switch文 |
Select Case X Case p ... Case q ... Case r ... Case Else ... End Select
|
=SWITCH(X, p,..., q,..., r,... ,...)
|
演算
基本的な算術演算
記事:https://qiita.com/swathci/items/853b48ca75a0935378bb
演算 | 例 | Python | R | VBA | EXCEL | 結果 |
---|---|---|---|---|---|---|
加算 | $1+2$ | 1 + 2 | 1 + 2 | 1 + 2 | =1+2 | 3 |
減算 | $3-4$ | 3 - 4 | 3 - 4 | 3 - 4 | =3-4 | -1 |
乗算 | $5*6$ | 5 * 6 | 5 * 6 | 5 * 6 | =5*6 | 30 |
除算 | $7/8$ | 7 / 8 | 7 / 8 | 7 / 8 | =7/8 | 0.875 |
べき乗 | $2^3$ | 2 ** 3 | 2 ^ 3 | 2 ^ 3 | =2^3 | 8 |
整数商 | $5/3$ | 5 // 3 | 5 %/% 3 | 5 ¥ 3 | =QUOTIENT(5,3) | 1 |
剰余 | $5/3$ | 5 % 3 | 5 %% 3 | 5 Mod 3 | =MOD(5,3) | 2 |
divmod(5, 3) | (1, 2) | |||||
符号反転 | $-2$ | -2 | -2 | -2 | =-2 | -2 |
絶対値 | $|-2|$ | abs(-2) | abs(-2) | Abs(-2) | =ABS(-2) | 2 |
VBAの「¥」は円マーク(全角の円マークを入れていますが、実際には半角の円マークです。)。
論理演算・比較演算
記事:https://qiita.com/swathci/items/dfd5e80060ff23416ce5
論理値
論理値 | Python | R | VBA | EXCEL |
---|---|---|---|---|
真 | True | TRUE T |
True | TRUE |
偽 | False | False F |
False | FALSE |
データ型 | bool | logical | Boolean |
比較演算子
演算子 | Python | R | VBA | EXCEL |
---|---|---|---|---|
= | == | == | = | = |
< | < | < | < | < |
> | > | > | > | > |
≦ | >= | >= | >= | >= |
≧ | <= | <= | <= | >= |
≠ | != | != | <> | <> |
論理演算子
演算子 | Python | R | VBA | EXCEL |
---|---|---|---|---|
否定 NOT |
not P | !P | NOT P | =NOT(P) |
論理積 AND |
P and Q | P && Q P & Q |
P And Q | =AND(P,Q) |
論理和 OR |
P or Q | P || Q P | Q |
P Or Q | =OR(P,Q) |
排他的論理和 XOR |
xor(P, Q) | P Xor Q | =XOR(P,Q) |
論理演算の確認
演算 | 演算子 | 式 | 結果 |
---|---|---|---|
否定 | NOT | NOT T NOT F |
F T |
論理積 | AND | T AND T T AND F F AND T F AND T |
T F F F |
論理和 | OR | T OR T T OR F F OR T F OR T |
T T T F |
排他的論理和 | XOR | T NOR T T XOR F F XOR T F XOR T |
F T T F |
注意)T:真(true)、 F:偽(false) と表記。
数学関数
記事:https://qiita.com/swathci/items/2d8e00d0e45874fc4686
丸め・整数化
Python | R | VBA | EXCEL | |
---|---|---|---|---|
丸め | round(x,n) |
round(x,n) |
Round(x, n) |
=ROUND(X,n) |
四捨五入 |
WorksheetFunction .Round(x, n)
|
=ROUND(X,N) |
||
天井 | math.ceil(x) |
ceiling(x) |
-Int(-(x)) |
=-INT(-X) |
床 | math.floor(x) |
floor(x) |
Int(x) |
=INT(X) |
整数部分 | math.trunc(x) |
trunc(x) |
Fix(x) WorksheetFunction .RoundDown(x, 0)
|
=ROUNDDOWN(X,0) |
整数部分切り上げ |
WorksheetFunction .RoundUp(X, 0)
|
=ROUNDDOWN(X,0) |
注意)丸めと四捨五入の違いについては、こちらを参照。
・天井 :切り上げ整数化
・床 :切り捨て整数化
・整数部分 :0に向かって整数化
・整数部分切り上げ:0から離れて整数化
符号と絶対値
Python | R | VBA | EXCEL | |
---|---|---|---|---|
符号反転 | -x |
-x |
-x |
=-X |
符号 | sign(x) |
Sgn(x) |
=SIGN(X) |
|
絶対値 |
abs(x) math.fabs(x)
|
abs(x) |
Abs(x) |
=ABS(X) |
べき乗と平方根
Python | R | VBA | EXCEL | |
---|---|---|---|---|
べき乗 |
x ** n math.pow(x, n)
|
x ^ n |
x ^ n |
=X^N |
平方根 |
math.sqrt(x) x ** (1/2) math.pow(x, 1/2)
|
sqrt(x) x ^ (1/2)
|
x ^ (1/2) WorksheetFunction .Power(2, 10)
|
=SQRT(X) =X^(1/2) =POWER(X,1/2)
|
指数関数と対数関数
Python | R | VBA | EXCEL | |
---|---|---|---|---|
指数関数 $e^x$ | math.exp(x) |
exp(x) |
Exp(x) |
=EXP(X) |
$e^x-1$ |
math.exp(x)-1 math.expm1(x)
|
exp(x)-1 expm1(x)
|
Exp(x) - 1 |
=EXP(X) -1 |
$x^n$ |
math.pow(x,n) x ** n
|
x ^ n |
x ^ n |
=X^N |
自然対数 $\log x$ | math.log(x) |
log(x) |
Log(x) WorksheetFunction .Ln(x)
|
=LN(X) |
$\log (1+x)$ |
math.log(1+x) math.log1p(x)
|
log(1+x) log1p(x)
|
Log(1 + x) |
=LN(1+X) |
常用対数 $\log_{10} x$ |
math.log10(x) math.log(x,10)
|
log10(x) log(x,10)
|
Log(x) / Log(10) |
=LOG(X) =LOG(X,10)
|
$\log_{2} x$ |
math.log2(x) math.log(x,2)
|
log2(x) log(x, 2)
|
log10(x) log(x, 2)
|
=LOG(X,2) |
$\log_{a} x$ | math.log(x,a) |
log(x,a) |
log10(x) log(a, 10)
|
=LOG(X,A) |
注意)対数関数のLog
とLn
について、Excelワークシート関数のみ自然対数にLn
、常用対数にLog
を用いることに注意。
三角関数と逆三角関数
Python | R | VBA | EXCEL | |
---|---|---|---|---|
$\sin t$ | math.sin(t) |
sin(t) |
Sin(t) |
=SIN(T) |
$\cos t$ | math.cos(t) |
cos(t) |
Cos(t) |
=COS(T) |
$\tan t$ | math.tan(t) |
tan(t) |
Tan(t) |
=TAN(T) |
$\arcsin (y/z)$ | math.asin(y/z) |
asin(y/z) |
WorksheetFunction .Asin(y / z)
|
=ASIN(Y/Z) |
$\arccos (x/z)$ | math.acos(x/z) |
acos(x/z) |
WorksheetFunction .Acos(x / z)
|
=ACOS(X/Z) |
$\arctan (y/x)$ |
math.acos(x/z) math.atan2(y,x)
|
atan(y/x) atan2(y,x)
|
Atn(y / x) WorksheetFunction .Atan2(x, y)
|
=ATAN(Y/X) =ATAN2(X,Y)
|
注意)最後の atan2
は、Python・RとExcelワークシート関数で引数の順序が異なることに注意。
双曲線関数と逆双曲線関数
Python | R | VBA | EXCEL | |
---|---|---|---|---|
$\sinh x$ | math.sinh(x) |
sinh(x) |
WorksheetFunction .Sinh(x)
|
=SINH(X) |
$\cosh x$ | math.cosh(x) |
cosh(x) |
WorksheetFunction .Cosh(x)
|
=COSH(X) |
$\tanh x$ | math.tanh(0) |
tanh(x) |
WorksheetFunction .Tanh(x)
|
=TANH(X) |
$\sinh^{-1}x$ | math.asinh(x) |
asinh(x) |
WorksheetFunction .Asinh(x)
|
=ASINH(X) |
$\cosh^{-1}x$ | math.acosh(x) |
acosh(x) |
WorksheetFunction .Acosh(x)
|
=ACOSH(X) |
$\tanh^{-1}x$ | math.atanh(x) |
atanh(x) |
WorksheetFunction .Atanh(x)
|
=ATANH(X) |
ガンマ関数等
Python | R | VBA | EXCEL | |
---|---|---|---|---|
$\Gamma(x)$ | math.gamma(x) |
gamma(x) |
WorksheetFunction .Gamma(x)
|
=GAMMA(X) |
$\log(\Gamma( x))$ | math.lgamma(x) |
lgamma(x) |
WorksheetFunction .GammaLn(x) WorksheetFunction .GammaLn_Precise(x)
|
=GAMMALN(X) =GAMMALN.PRECISE(X)
|
数学定数
Python | R | VBA | EXCEL | |
---|---|---|---|---|
円周率 $\pi$ | math.pi |
pi |
WorksheetFunction .Pi()
|
=PI() |
自然対数の底 $e$ | math.e |
exp(1) |
Exp(1) |
=EXP(1) |
タウ $\tau$ | math.tau |
`` | `` | = |
無限大 $\infty$ | math.inf |
`` | `` | = |
非数(not a number) | math.nan |
`` | `` | = |
文字列操作
記事:
・https://qiita.com/swathci/items/910d976dfe63a10c2f96
・https://qiita.com/swathci/items/e26bd7fa7eadf0842caa
s1 = "abc"
s2 = "def"
s3 = "ghij"
s = "abcdefghij"
t = "abcdefghijabcdefghij"
u = "abcDEFghij"
v = "abcDEFghij"
w = " d e f "
とします。また、EXCELのセルにそれぞれ
A1セル:="abc"
A2セル:="def"
A3セル:="ghij"
A4セル:="abcdefghij"
A5セル:="abcdefghijabcdefghij"
A6セル:="abcDEFghij"
A7セル:="abcDEFghij"
A8セル:=" d e f "
が入力されているものとします。
文字列の基本的操作
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
結合 | s1 + s2 + s3 | paste0(s1, s2, s3) paste(s1, s2, s3, sep="") |
str_c(s1, s2, s3) | s1 & s2 & s3 | =A1&A2&A3 =CONCATENATE( A1,A2,A3) |
abcdefghij |
長さ | len(s) | nchar(s) | str_length(s) | Len(s) | =LEN(A4) | 10 |
反転 | s[::-1] | StrReverse(s) | jihgfedcba | |||
繰り返し | 'A' * 3 | str_dup("A", 3) | String(3, "A") | =REPT("A",3) | AAA | |
繰り返し | 'def' * 3 | str_dup("def", 3) | =REPT("def",3) | defdefdef |
文字列の取り出し
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
左から | s[8:10] s[0:2] s[:2] |
substr(s, 1, 2) substring(s, 1, 2) |
str_sub(s, 1, 2) | Left(s, 2) | =LEFT(A4,2) | ab |
右から | s[len(s)-2:len(s)] s[-2:] |
substr(s, nchar(s)-2+1, nchar(s)) |
str_sub(s, -2, -1) | Right(s, 2) | =RIGHT(A4,2) | ij |
途中 | s[3:6] | substr(s, 4, 6) | str_sub(s, 4, 6) | Mid(s, 4, 3) | =MID(A4,4,3) | def |
注意)「途中」の文字列の取り出しについて、Python, Rの関数では取り出す文字列を「どこからどこまで」と指定しますが、VBA, EXCELの関数では「どこから何文字分」と指定します。
文字列の検索
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
検索 | s.find('def') | str_locate(s, "def") | InStr(1, s, "def") | =FIND("def",A4,1) =SEARCH("def",A4,1) |
3,4 | |
後ろからの検索 | t.rfind('def') | InStrRev(t, "def") | 13,14 | |||
カウント | t.count('def') | str_count(t, "def") | 2 |
注意)str_detect
, str_locate
関数については、上記参照。
文字列の置換
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
置換 | s.replace('def', 'DEF') | sub("def", "DEF", s) | str_replace(s, "def", "DEF") | Replace(s, "def", "DEF") | =SUBSTITUTE( A4,"def","DEF") =REPLACE(A4, FIND("def",A4), LEN("def"),"DEF") |
abcDEFghij |
最初の1つだけ置換 | sub("def", "DEF", t) | str_replace(t, "def", "DEF") | abcDEFghij abcdefghij |
|||
すべて置換 | t.replace('def', 'DEF') | gsub("def", "DEF", t) | str_replace_all(t, "def", "DEF") | Replace(t, "def", "DEF") | =SUBSTITUTE( A5,"def","DEF") |
abcDEFghij abcDEFghij |
文字列の変換
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
大文字に | u.upper() | toupper(u) | str_to_upper(u) | UCase(u) | =UPPER(A6) | ABCDEFGHIJ |
小文字に | u.lower() | tolower(u) | str_to_lower(u) | LCase(u) | =LOWER(A6) | abcdefghij |
先頭のみ大文字・それ以外は小文字に | u.capitalize() | str_to_title(u) str_to_sentence(u) |
StrConv(u, vbProperCase) | =PROPER(A6) | Abcdefghij | |
大文字と小文字を入れ替え | u.swapcase() | chartr("A-Za-z", "a-zA-z", u) | ABCdefGHIJ | |||
大文字かどうかの判定 | u.isupper() | u == toupper(u) | u == str_to_upper(u) | False | ||
小文字かどうかの判定 | u.islower() | u == tolower(u) | u == str_to_lower(u) | False | ||
全角に | chartr("A-Za-z", "A-Za-z", u) | StrConv(u, vbWide) | =JIS(A6) | abcDEFghij | ||
半角に | chartr("A-Za-z", "A-Za-z", v) | StrConv(v, vbNarrow) | =ASC(A7) | abcDEFghij |
文字列のスペース
Python | R | R(stringr) | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
スペース | ' ' * 3 | str_dup(" ", 3) | Space(3) | =REPT(" ",3) | " " | |
両側スペース削除 | w.strip(' ') | str_trim(s, side="both") | Trim(w) | =TRIM(A8) | "d e f" | |
左スペース削除 | w.lstrip(' ') | str_trim(s, side="left") | LTrim(w) | "d e f " | ||
右スペース削除 | w.rstrip(' ') | str_trim(s, side="right") | RTrim(w) | " d e f" |
注意)EXCELのTRIM関数は文字列の中のスペースも1つを除いて削除されてd e f
となります。
アスキーコード
Python | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|
AのASCIIコード | ord('A') | strtoi(charToRaw("A"), 16L) | Asc("A") | =CODE("A") | 65 |
ZのASCIIコード | ord('Z') | strtoi(charToRaw("Z"), 16L) | Asc("Z") | =CODE("Z") | 90 |
aのASCIIコード | ord('a') | strtoi(charToRaw("a"), 16L) | Asc("a") | =CODE("a") | 97 |
zのASCIIコード | ord('z') | strtoi(charToRaw("z"), 16L) | Asc("z") | =CODE("a") | 122 |
ASCIIコード65の文字 | chr(65) | rawToChar(as.raw(65)) | Chr(65) | =CHAR(65) | A |
ASCIIコード90の文字 | chr(90) | rawToChar(as.raw(90)) | Chr(90) | =CHAR(90) | Z |
ASCIIコード97の文字 | chr(97) | rawToChar(as.raw(97)) | Chr(97) | =CHAR(97) | a |
ASCIIコード122の文字 | chr(122) | rawToChar(as.raw(122)) | Chr(122) | =CHAR(122) | z |
ベクトル
記事:https://qiita.com/swathci/items/24091938c172e1d6f8df
ベクトルの作成
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
ベクトル の作成 |
[1,2,3,4,5] |
np.array([1,2,3,4,5]) |
c(1,2,3,4,5) |
Array( 1, 2, 3, 4, 5)
|
セル入力 | 1,2,3,4,5 |
1,...,n |
list( range(1,10+1))
|
np.arange(1,10+1) |
seq(10) |
=1つ前+1 |
1,2,...,10 | |
連続する 整数列 |
list( range(1,10+1,1))
|
np.arange(1,10+1,1) |
1:10 seq(1,10)
|
=1つ前+1 |
1,2,...,10 | |
連続する 整数列 |
list( range(10,1-1,-1))
|
np.arange(10,1-1,-1) |
10:1 seq(1,10,-1)
|
=1つ前-1 |
10,9,...,1 | |
等差数列 |
list( range(0,10+1,2))
|
np.arange(0,10+1,2) |
seq(0,10,by=2) |
=1つ前+2 |
0,2,4,6,8,10 | |
等差数列 |
np.linspace(0,10, num=5+1)
|
seq(0,10, length=5+1)
|
0,2,4,6,8,10 | |||
繰り返し | [1] * 10 |
np.full(10,1) |
rep(1,10) |
=1つ前 |
1,1,...,1 | |
繰り返し | [1,2,3] * 5 |
rep(1:3,times=5) |
=3つ前 |
1,2,3,...,1,2,3 | ||
繰り返し | rep(1:3,length=5) |
1,2,3,...,2,3,1 | ||||
繰り返し | rep(1:3,each=5) |
1,...,1,2,...,3,... | ||||
0を 繰り返し |
[0]*10 |
np.zeros(10) |
numeric(10) rep(0,10)
|
=0 |
0,0,...,0 | |
1,1,2, 1,2,3,... |
sequence(1:3) c(seq(1),seq(2), seq(3)) c(1:1,1:2,1:3)
|
1,1,2,1,2,3 | ||||
重複削除 |
list(set( [1,2,2,3,3,3]))
|
unique( c(1,2,2,3,3,3))
|
1,2,3 |
ベクトルの属性
Python | Python(Numpy) | R | VBA | EXCEL | |
---|---|---|---|---|---|
長さ | len(v) |
len(v) |
length(v) |
UBound(v, 1) - LBound(v, 1) + 1
|
|
要素の型 |
typeof(v) mode(v)
|
要素へのアクセス
$v=(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)$
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
v[3-1] |
v[3] |
=INDEX( ,3) |
3 | |||
v[2-1:5] |
v[2:5] |
2,3,4,5 | ||||
v[[1-1,3-1,5-1]] |
v[c(1,3,5)] |
1,3,5 | ||||
v[-1] |
2,3,...,10 | |||||
v[c(-1,-3,-5)] v[-c(1,3,5)]
|
2,4,6,7 ,8,9,10 |
|||||
v[v < 5] |
v[v < 5] |
1,2,3,4 | ||||
v[v % 2 == 0] |
v[v %% 2 == 0] |
2,4,6,8,10 | ||||
v[(v > 3) & (v < 7)] |
v[v > 3 & v < 7] |
4,5,6 | ||||
v[(v < 3)|(v > 7)] |
v[v < 3|v > 7] |
1,2,8,9,10 | ||||
v[is.na(v)] |
||||||
v[:n] |
head(v,n) |
1,2,... | ||||
v[-n:] |
tail(v,n) |
...,9,10 |
要素の検索
Python | Python(Numpy) | R | VBA | EXCEL | |
---|---|---|---|---|---|
条件に合う要素番号 | np.argwhere(v==1) |
which(v==1) which(v<50)
|
=MATCH(1, ,0) |
||
条件に合う要素 | v[v<5] |
v[which(v<5)] v[v < 5]
|
|||
要素にあるか | 1 in v |
1 %in% v |
=MATCH(1, ,0)>0 |
||
条件に合う要素のカウント | v.count(0) |
len(v[v==0]) |
|||
NAか | is.na(v) |
ベクトルの操作
$v = (2,4,1,3,5)$
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
逆順 |
v[::-1] v.reverse()
|
v[::-1] |
rev(v) |
5,3,1,4,2 | ||
昇順順位 | np.argsort(v) |
order(v) |
3,1,4,2,5 | |||
降順順位 | np.argsort(v)[::-1] |
order(v) |
||||
昇順ソート |
sorted(v) v.sort()
|
np.sort(v) |
sort(v) v[order(v)]
|
1,2,3,4,5 | ||
降順ソート |
sorted(v, reverse=True) v.sort( reverse=True)
|
np.sort(v)[::-1] |
rev(sort(v)) sort(v, decreasing=T) v[rev(order(v))]
|
5,4,3,2,1 | ||
最大要素番号 | np.argmax(v) |
4 | ||||
最小要素番号 | np.argmin(v) |
2 | ||||
最大要素 | max(v) |
np.max(v) |
max(v) |
=MAX(V) |
5 | |
最小要素 | min(v) |
np.min(v) |
min(v) |
=MIN(V) |
1 | |
中央値 | np.median(v) |
median(v) |
=MEDIAN(V) |
3 | ||
範囲 | range(v) |
1,5 | ||||
範囲 | np.ptp(v) |
4 | ||||
四分位 |
np.percentile(v, [0,25,50,75,100]) np.quantile(v, [0,0.25,0.5,0.75,1])
|
quantile(v) |
=QUARTILE( ,n) n: 0,1,2,3,4 |
第1四分位:2, 第3四分位:4 |
||
summary | summary(v) |
集合演算
\begin{eqnarray*}
v &=& (2,2,4,4,4,4,1,3,3,3,5,5,5,5,5) \\
A &=& \{2,4,1,3,5\} \\
B &=& \{1,3,5,7,9\} \\
a &=& 1
\end{eqnarray*}
\begin{eqnarray*}
A \cup B &=& \{2,4,1,3,5,7,9\} \quad &和集合 \\
A \cap B &=& \{1,3,5\} &積集合 \\
A \cap B^{c} = A \setminus B &=& \{2,4\} &差集合 \\
(A \setminus B) \cup (B \setminus A) = A \triangle B &=& \{2,4,7,9\} &対称差集合 \\
A = B && &集合として等しい \\
a \in A && &要素
\end{eqnarray*}
Python | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|
重複削除 | set(v) |
unique(v) |
2,4,1,3,5 | ||
和集合 | A | B |
union(A,B) |
2,4,1,3,5,7,9 | ||
積集合 | A & B |
intersect(A,B) |
1,3,5 | ||
差集合 | A - B |
setdiff(A,B) |
2,4 | ||
対称差集合 | A ^ B |
2,4,7,9 | |||
集合として等しい | A == B |
setequal(A,B) |
False | ||
要素 | a in A |
is.element(a,A) a %in% A
|
True |
注意)Pythonではset型を使う。Rではベクトルを集合とみなして集合演算ができる。
ベクトルの要素の置換・結合・挿入
Python | R | VBA | EXCEL | |
---|---|---|---|---|
置換 | replace(v,要素,w) |
|||
結合 | u + v + w |
c(u,v,w) append(u,v)
|
||
挿入 | append(u,v,after=n) |
|||
挿入 | v.append(3) |
append(v,3) |
||
削除 | v.remove(3) |
要素ごとの計算
Python | Python(Numpy) | R | VBA | EXCEL | |
---|---|---|---|---|---|
v+w | v + w |
v + w |
=V+W |
||
v-w | v - w |
v - w |
=V-W |
||
v*w | v * w |
v * w |
=V*W |
||
v/w | v / w |
v / w |
=V/W |
||
v+1 | v + 1 |
v + 1 |
=V+1 |
||
v*2 | v * 2 |
v * 2 |
=V*2 |
||
1/v | 1 / v |
1 / v |
=1/V |
||
v < 3 | v < 3 |
v < 3 |
=V<3 |
||
v = 3 | v == 3 |
v == 3 |
=V=W |
||
v/2の余り=0 | v % 2 == 0 |
v %% 2 == 0 |
=MOD(V,2)=0 |
||
$\sqrt{v}$ | np.sqrt(v) |
sqrt(v) |
=SQRT(V) |
||
$\exp{v}$ | np.exp(v) |
exp(v) |
=EXP(V) |
統計量の計算
\begin{eqnarray*}
&x &=& (x_i)^{n}_i &= (2,4,1,3,5) \\
&y &=& (y_i)^{n}_i &= (1,3,5,7,9)
\end{eqnarray*}
\begin{eqnarray*}
\mathrm{max}(x) &=& \max_{i=1}^n x_i &最大値\\
\mathrm{min}(x) &=& \min_{i=1}^n x_i &最小値\\
\mathrm{sum}(x) &=& \sum_{i=1}^n x_i &総和\\
\mathrm{prod}(x) &=& \prod_{i=1}^n x_i &総積\\
\overline{x} &=& \frac{1}{n} \sum_{i=1}^n x_i &平均\\
s_x^2 &=& \frac{1}{n} \sum_{i=1}^n \left( x_i - \overline{x} \right)^2 &分散\\
var(x) = u_x^2 &=& \frac{1}{n-1} \sum_{i=1}^n \left( x_i - \overline{x} \right)^2 &不偏分散\\
s_x = \sqrt{s_x^2} &=& \sqrt{ \frac{1}{n} \sum_{i=1}^n \left( x_i - \overline{x} \right)^2 } &標準偏差\\
\sqrt{var(x)} = u_x = \sqrt{u^2} &=& \sqrt{ \frac{1}{n-1} \sum_{i=1}^n \left( x_i - \overline{x} \right)^2 } &不偏標準偏差\\
s_{xy} &=& \frac{1}{n} \sum_{i=1}^n \left( x_i - \overline{x} \right) \left( y_i - \overline{y} \right) \quad &共分散 \\
cov(x,y) &=& \frac{1}{n-1} \sum_{i=1}^n \left( x_i - \overline{x} \right) \left( y_i - \overline{y} \right) &不偏共分散 \\
r_{xy} = \frac{s_{xy}}{s_x s_y} = \frac{cov(x,y)}{\sqrt{var(x)var(y)}} &=& \frac{\sum_{i=1}^n \left( x_i - \overline{x} \right) \left( y_i - \overline{y} \right)}{\sqrt{\sum_{i=1}^n \left( x_i - \overline{x} \right)^2}\sqrt{\sum_{i=1}^n \left( y_i - \overline{y} \right)^2}} \quad &相関係数 \\
Cov(x,y) &=& \begin{pmatrix}
var(x) & cov(x,y) \\
cov(x,y) & var(y)
\end{pmatrix} &分散共分散行列 \\
C_{xy} &=& \begin{pmatrix}
1 & r_{xy} \\
r_{xy} & 1
\end{pmatrix} &相関係数行列 \\
\end{eqnarray*}
Excelシートにはセル範囲 B2:B6
, C2:C6
にベクトル $x,y$ の値が入力されているとする。
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
最大値 | max(x) |
np.max(x) |
max(x) |
=MAX(B2:B6) |
5 | |
最小値 | min(x) |
np.min(x) |
min(x) |
=MIN(B2:B6) |
1 | |
中央値 | np.median(x) |
median(x) |
=MEDIAN(B2:B6) |
3 | ||
範囲 | np.ptp(x) |
4 | ||||
四分位 |
np.percentile(x,25) np.quantile(x,0.25)
|
2 | ||||
総和 | sum(x) |
np.sum(x) |
sum(x) |
=SUM(B2:B6) |
15 | |
総積 | np.prod(x) |
prod(x) |
=PRODUCT(B2:B6) |
120 | ||
平均 | np.mean(x) |
mean(x) |
=AVERAGE(B2:B6) |
3 | ||
分散 | np.var(x) |
var(x)*(n-1)/n |
=VAR.P(B2:B6) =VARP(B2:B6)
|
2 | ||
不偏分散 | np.var(x,ddof=1) |
var(x) |
=VAR.S(B2:B6) =VAR(B2:B6)
|
2.5 | ||
標準偏差 | np.std(x) |
sd(x)*sqrt( var(x)*(n-1)/n)
|
=STDEV.P(B2:B6) =STDEVP(B2:B6)
|
1.414 | ||
不偏標準偏差 | np.std(x,ddof=1) |
sd(x) |
=STDEV.S(B2:B6) =STDEV(B2:B6)
|
1.581 | ||
共分散 | cov(x,y)*(n-1)/n |
=COVARIANCE.P( B2:B6,C2:C6) =COVAR( B2:B6,C2:C6)
|
2 | |||
不偏共分散 | cov(x,y) |
=COVARIANCE.S( B2:B6,C2:C6)
|
2.5 | |||
相関係数 | cor(x,y) |
=CORREL( B2:B6,C2:C6)
|
0.5 | |||
分散共分散行列 | np.cov(x,y) |
|||||
相関係数行列 | np.corrcoef(x,y) |
|||||
summary | summary(v) |
累積計算
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
cumsum 累積和 | 注意) | np.cumsum(x) |
cumsum(x) |
=SUM($B$2:$B2) |
2,6,7,10,15 | |
cumprod | 注意) | np.cumprod(x) |
cumprod(x) |
=PRODUCT($B$2:$B2) |
2,8,8,24,120 | |
cummax | 注意) | cummax(x) |
=MAX($B$2:$B2) |
2,4,4,4,5 | ||
cummin | 注意) | cummin(x) |
=MIN($B$2:$B2) |
2,2,1,1,1 | ||
階差数列 前進差分 |
注意) | np.diff(x) |
diff(x) |
=B3-B2 |
2,-3,2,2 | |
第n階差 | np.diff(x,n=n) |
=B3-B2 |
2,-3,2,2 |
注意)リスト内包表記で可能。
線形代数の計算
\begin{eqnarray*}
&x &=& (x_i)^{n}_i &= (2,4,1,3,5) \\
&y &=& (y_i)^{n}_i &= (1,3,5,7,9)
\end{eqnarray*}
\begin{eqnarray*}
(x,y) &=& \sum_{i=1}^n x_iy_i &内積 \\
\|x\| = \sqrt{(x,x)} &=& \sqrt{\sum_{i=1}^n {x_i}^2} \quad &ノルム \\
\end{eqnarray*}
Python | Python(Numpy) | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|---|
内積 |
np.dot(v,w) np.sum(v*w)
|
sum(x*y) |
=SUMPRODUCT( B2:B6,C2:C6)
|
85 | ||
ノルム |
np.linalg.norm(v) np.sqrt(np.sum(v*v))
|
sqrt(sum(x*x)) |
=SQRT( SUMPRODUCT( B2:B6,B2:B6))
|
7.416 |
行列
記事:https://qiita.com/swathci/items/715aba6db368f53b3a2e
Pythonでは、Numpyを使います(import numpy as np
)。
行列の作成
A = \begin{pmatrix}
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\
9 & 10 & 11 & 12
\end{pmatrix}
,
I_3 = \begin{pmatrix}
1 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1
\end{pmatrix}
O = \begin{pmatrix}
0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0 \\
0 & 0 & 0 & 0
\end{pmatrix}
,
D = \begin{pmatrix}
1 & 0 & 0 \\
0 & 2 & 0 \\
0 & 0 & 3
\end{pmatrix}
行列 | Python | R | VBA | EXCEL |
---|---|---|---|---|
mxn行列 $A$ |
np.array(range(1,12+1)). reshape(3,4) np.array([ [1,2,3,4], [5,6,7,8], [9,10,11,12]])
|
matrix(1:12,3,4,TRUE) rbind(c(1,2,3,4), c(5,6,7,8), c(9,10,11,12)) cbind(c(1,5,9), c(2,6,10), c(3,7,11), c(4,8,12))
|
||
単位行列 $I_3$ |
np.eye(3) |
diag(3) diag(1, 3) diag(1, 3, 3)
|
WorksheetFunction. Munit(3)
|
MUNIT(3) |
ゼロ行列 $O$ |
np.zeros((3,4)) |
matrix(0, 3, 4) diag(0, 3, 4) diag(0, 3)
|
||
対角行列 $D$ |
np.diag([1,2,3] |
diag(c(1,2,3)) |
||
1埋め行列 | np.ones((3,4)) |
|||
数値埋め行列 | np.full((3,4), 5) |
行列の属性
A = \begin{pmatrix}
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\
9 & 10 & 11 & 12
\end{pmatrix}
Python | R | VBA | EXCEL | 結果 | |
---|---|---|---|---|---|
形 | A.shape |
dim(A) |
3, 4 | ||
行数 |
len(A) A.shape[0]
|
nrow(A) |
UBound(A, 1) |
3 | |
列数 | A.shape[1] |
ncol(A) |
UBound(A, 2) |
4 | |
次元(=2) | A.ndim |
2 | |||
タイプ | type(A) |
class(A) |
|||
データ型 | A.dtype |
typeof(A) |
行列の要素
A = \begin{pmatrix}
1 & 2 & 3 & 4 \\
5 & 6 & 7 & 8 \\
9 & 10 & 11 & 12
\end{pmatrix}
Python | R | VBA | EXCEL | |
---|---|---|---|---|
(1,2)成分 |
A[0,1] A[0][1]
|
A[1,2] |
A(1,2) |
=INDEX(A,1,2) |
1行目の行ベクトル |
A[0,:] A[[0],:]
|
A[1,] |
||
2列目の列ベクトル |
A[:,1] A[:,[1]]
|
A[,2] |
||
1~2行 | A[0:2,] |
A[1:2,] |
||
3~4列 |
A[:,2:4] A[:,-2:]
|
A[,3:4] |
||
1~2行,3~4列 |
A[0:2,2:4] A[:2,-2:]
|
A[1:2,3:4] |
||
1・3行 | A[[0,2],:] |
A[c(1,3),] |
||
2・4列 | A[:,[1,3]] |
A[,c(2,4)] |
||
1・3行,2・4列 | A[np.ix_([0,2],[1,3])] |
A[c(1,3),c(2,4)] |
||
全行,全列 | A[:,:] |
A[,] |
||
head |
head(A) head(A, 2)
|
|||
tail |
tail(A) tail(A, 2)
|
線形代数の計算
A = \begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
,
B = \begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix}
k = 2,
kA = \begin{pmatrix}
2 & 4 \\
6 & 8
\end{pmatrix}
A + B = \begin{pmatrix}
6 & 8 \\
10 & 12
\end{pmatrix}
,
AB = \begin{pmatrix}
19 & 22 \\
43 & 50
\end{pmatrix}
A^T = \begin{pmatrix}
1 & 3 \\
2 & 4
\end{pmatrix}
,
A^{-1} = \begin{pmatrix}
-2 & 1 \\
1.5 & -0.5
\end{pmatrix}
detA = -2
,
trA = 5
Python | R | VBA | EXCEL | |
---|---|---|---|---|
スカラー倍 $kA$ |
A * k |
A * k |
=セル*k |
|
行列の和 $A+B$ |
A + B |
A + B |
=セル+セル |
|
行列の積 $AB$ |
A @ B np.dot(A, B)
|
A %*% B |
WorksheetFunction. MMult(A, B)
|
=MMULT(A,B) |
転置行列 $A^T$ |
A.transpose() A.T
|
t(A) |
WorksheetFunction. Transpose(A)
|
=Transpose(A) |
逆行列 $A^{-1}$ |
np.linalg.inv(A) |
solve(A) |
WorksheetFunction. MInverse(A)
|
=MINVERSE(A) |
単位行列 $I_2$ |
np.eye(2) |
diag(2) |
WorksheetFunction. Munit(2)
|
=MUNIT(2) |
行列式 $detA$ |
np.linalg.det(A) |
det(A) |
WorksheetFunction. MDeterm(A)
|
=MDETERM(A) |
トレース $trA$ |
sum(np.diag(A)) |
sum(diag(A)) |
WorksheetFunction. SumProduct(A,Eye2)
|
|
対角成分 | np.diag(A) |
diag(A) |
||
行列のフラット化 | A.flatten() |
|||
行列の変形 | A.reshape(1,4) |
行列の要素ごとの演算
Python | R | VBA | EXCEL | |
---|---|---|---|---|
和 | A + B |
A + B |
=セル+セル |
|
差 | A - B |
A - B |
=セル-セル |
|
積 | A * B |
A * B |
=セル*セル |
|
商 | A / B |
A / B |
=セル/セル |
|
スカラー倍 | A * 2 |
A * 2 |
=セル*2 |
|
べき乗 | A ** 2 |
A ^ 2 |
=セル^2 |
|
符号反転 | -A |
-A |
=-セル |
|
等号 | A == B |
A == B |
=セル=セル |
|
不等号 | A < B |
A < B |
=セル<セル |
|
不等号 | A > 2 |
A > 2 |
=セル>2 |
|
余り0 | A % 2 == 0 |
A %% 2 == 0 |
=MOD(セル,2)=0 |
|
平方根 | np.sqrt(A) |
sqrt(A) |
=SQRT(セル) |
|
exp | np.exp(A) |
exp(A) |
=EXP(セル) |
|
log | np.log(A) |
log(A) |
=LN(セル) |
データフレーム
記事:
・PythonのpandasとRとSQLの比較: https://qiita.com/swathci/items/3489b9886799e2f61c4f
・PythonのpandasとRのdplyrの比較: https://qiita.com/swathci/items/4d3469a413fb5a9f2212
Rのデータフレーム操作について
・行の操作: https://qiita.com/swathci/items/04f4c1bb2c3c380cae94
・列の操作: https://qiita.com/swathci/items/9bf403dca7c428fc3e7d
・集計操作: https://qiita.com/swathci/items/d13be09a7ed73c1a8d94
・pivot操作: https://qiita.com/swathci/items/4ce25faddfeff3a29a5f
・データフレームの関数: https://qiita.com/swathci/items/8d626865638079d13665
・R標準で集計操作: https://qiita.com/swathci/items/f6e2f737d9388603bcd7
Python(pandas) | R | RDB(Access) | Excel | 行列 | |
---|---|---|---|---|---|
オブジェクト | DataFrame | data.frame | テーブル | テーブル | 行列(matrix) |
行 | index(axis=0) | 行(row) | レコード | 行(ROW) | 行(row) |
列 | columns(axis=1) | 列(col) | フィールド | 列(COLUMN) | 列(column) |
要素 | values | 値 | CELL | 要素 | |
列の正体 | pandasのSeries | ベクトル | 同じデータ型の値 |
データフレームdf
X | Y | Z | |
---|---|---|---|
1 | 20 | 100.1 | AAA |
2 | 40 | 200.2 | BBB |
3 | 10 | 300.3 | CCC |
4 | 30 | 400.4 | DDD |
5 | 50 | 500.5 | EEE |
データフレームの作成
Python(pandas) | R | SQL | |
---|---|---|---|
データフレームの作成 |
pd.DataFrame({ 'X': x, 'Y': y, 'Z': z})
|
data.frame( X = x, Y = y, Z = z)
|
CREATE TABLE |
データフレームの属性
Python(pandas) | R | SQL | 結果 | |
---|---|---|---|---|
クラス | type(df) |
class(df) |
||
構造 | df.info() |
str(df) |
||
列 |
df.columns df.columns.values
|
names(df) colnames(df)
|
'X', 'Y', 'Z' | |
行 |
df.index df.index.values
|
rownames(df) row.names(df)
|
||
値 | df.values |
|||
列数 | len(df.columns) |
length(df) ncol(df)
|
3 | |
行数 |
len(df.index) len(df)
|
nrow(df) |
5 | |
形(行数, 列数) | df.shape |
dim(df) |
(5, 3) | |
全要素数 | df.size |
15=5*3 |
注意)pandasのlen()
は行数に、Rのdata.frameのlength()
は列数。
データフレームへのアクセス
Python(pandas) | R | SQL | 結果 | |
---|---|---|---|---|
列ベクトル |
df.X df['X']
|
df$X df[["X"]] df[[1]]
|
ベクトル (20,40, 10,30,50) |
|
列指定 |
df[['X']] df.loc[:,['X']]
|
df[1] df["X"]
|
SELECT X FROM df;
|
データフレーム |
複数列指定 |
df[['X','Z']] df.loc[:,['X','Z']] df.iloc[:, [1-1,3-1]]
|
df[c(1,3)] df[c("X","Z")]
|
SELECT Z, X FROM df; |
データフレーム |
df[['Z','Y','X']] df.loc[:, ['Z','Y','X']] df.iloc[:, [3-1,2-1,1-1]]
|
df[c(3,1,2)] df[c("Z","X","Y")]
|
SELECT Z, X, Y FROM df; |
データフレーム | |
先頭n行 | df.head(n) |
head(df, n) |
データフレーム | |
末尾n行 | df.tail(n) |
tail(df, n) |
データフレーム | |
要素 |
df.iat[1-1,1-1] df.at[1-1,'X'] df.iloc[1-1,1-1] df.loc[1-1,'X'] df['X'][1-1] df.X[1-1]
|
df[1,1] df[1,"X"] df[[1,1]] df[[1,"X"]] df$X[1] df[["X"]][1]
|
値 20 |
|
複数行・複数列指定 |
df.iloc[ [1-1,3-1],[1-1,3-1]] df.loc[ [1-1,3-1],['X','Z']]
|
df[c(1,3),c(1,3)] df[c(1,3),c("X","Z")] df[c(T,F,T,F,F), c(T,F,T)]
|
データフレーム | |
複数列指定 |
df.iloc[:,[1-1,3-1]] df.loc[:,['X','Z']] df[['X','Z']]
|
df[,c(1,3)] df[,c("X","Z")] df[,c(T,F,T)]
|
データフレーム | |
複数行指定 |
df.iloc[[1-1,3-1],:] df.loc[[1-1,3-1],:] df.iloc[[1-1,3-1]] df.loc[[1-1,3-1]]
|
df[c(1,3),] df[c(T,F,T,F,F),]
|
データフレーム |
注意)
データフレームの操作
Python(pandas) | R | SQL | |
---|---|---|---|
列の選択 | df[['Z','Y','X']] |
df[c("Z","X","Y")] |
SELECT Z, X, Y FROM df;
|
列の追加 | df['X3'] = df['X'] * 3 |
df$X3 <- df$X * 3 |
SELECT X, Y, Z, X * 3 AS X3 FROM df;
|
列名変更 |
df.rename( columns={'X':'xx', 'Y':'yy', 'Z':'zz'})
|
names(df) <- c("xx", "yy", "zz")
|
SELECT X AS xx, Y AS yy, Z AS zzz FROM df;
|
行の条件抽出フィルタ |
df['X'] < 30 df.query('X < 30')
|
df[df$X < 30,] |
SELECT * FROM df WHERE X < 30;
|
df[(df['X'] > 10) & (df['X'] < 50)] df.query('10 < X < 50')
|
df[df$X > 10 & df$X < 50,]
|
SELECT * FROM df WHERE X > 10 AND X < 50;
|
|
行のソート | df.sort_values(by='X') |
df[order(df$X), ] |
SELECT * FROM df ORDER BY X ASC;
|
行のソート | df.sort_values(by='X', ascending=False) |
df[order(df$X, decreasing = TRUE),] |
SELECT * FROM df ORDER BY X DESC;
|
行のソート | df.sort_values(by=['S','X']) |
df[order(df$S, df$X), ] |
SELECT * FROM df ORDER BY S ASC, X ASC;
|
データフレームの集計
Python(pandas) | R | SQL | |
---|---|---|---|
基本統計量 |
df.describe() df.describe().T
|
summary(df) |
|
グループ化 | df.groupby('S') |
GROUP BY S; |
|
グループ化 | df.groupby(['S','Z']) |
GROUP BY S, Z; |
データフレームの結合
Python(pandas) | R | SQL | |
---|---|---|---|
横に並べる |
pd.concat([df1, df2], axis=1)
|
cbind(df1, df2) |
|
縦に並べる |
pd.concat([df1, df2], axis=0) pd.concat([df1, df2], ignore_index=True) df1.append(df2, ignore_index=True)
|
rbind(df1, df2) |
UNION ALL |
内部結合 (INNER JOIN) |
pd.merge(df1, df2, on='k') pd.merge(df1, df2, on='k', how='inner')
|
merge(df1, df2) merge(df1, df2, by="k")
|
FROM df1 INNER JOIN df2 ON df1.k = df2.k
|
左外部結合 (LEFT OUTER JOIN) |
pd.merge(df1, df2, on='k', how='left')
|
merge(df1, df2, by="k", all.x=T)
|
FROM df1 LEFT JOIN df2 ON df1.k = df2.k
|
右外部結合 (RIGHT OUTER JOIN) |
pd.merge(df1, df2, on='k', how='right')
|
merge(df1, df2, by="k", all.y=T)
|
FROM df1 RIGHT JOIN df2 ON df1.k = df2.k
|
完全外部結合 (FULL OUTER JOIN) |
pd.merge(df1, df2, on='k', how='outer')
|
merge(df1, df2, by="k", all=T)
|
FROM df1 FULL JOIN df2 ON df1.k = df2.k
|
名前の異なるキーで結合 |
pd.merge(df1, df2, left_on='k1', right_on='k2', how='left')
|
merge(df1, df2, by.x="k1", by.y="k2", all.x=T)
|
FROM df1 LEFT JOIN df2 ON df1.k1 = df2.k2
|
複数のキーで結合 |
pd.merge(df1, df2, on=['k1','k2'], how='left')
|
merge(df1, df2, by=c("k1","k2"), all.x=T)
|
FROM df2 LEFT JOIN df2 ON df1.k1 = df2.k1 AND df1.k2 = df2.k2
|
確率分布
記事:
・確率分布:https://qiita.com/swathci/items/7d528fcb34a2e31a8127
・乱数:https://qiita.com/swathci/items/c2f0bf1d684099963c61
確率分布
記事:https://qiita.com/swathci/items/7d528fcb34a2e31a8127
- $X$ :確率変数
- $f_{X}(x)$ :確率密度関数(probability density function; PDF)
- $F_{X}(x)$ :累積分布関数(cumulative distribution function; CDF)
- $\bar{F_X}(x)$ :相補累積分布関数(complementary cumulative distribution function; CCDF)(上側確率(upper-tail probability), 生存関数(survival function))
- $G_{X}(p)$ :分位関数(quantile function)(分位点関数)
\begin{eqnarray*}
F_{X}(x) &=& \mathrm{P}(X \le x) = \int_{-\infty}^{x} f_{X}(t)\,dt \quad (x \in \mathbb{R}) \\
\bar{F_X}(x) &=& \mathrm{P}(X > x) = 1-F_{X}(x) = \int_{x}^{\infty} f_{X}(t)\\
G_{X}(p) &=& {F_{X}}^{-1}(p) \quad (p \in [0,1])
\end{eqnarray*}
Python | R | VBA | EXCEL | |
---|---|---|---|---|
確率密度関数 (pdf)$f(x)$ |
xxx.pdf(x, ...) |
dxxx(x, ...) |
||
確率分布関数 (cdf)$F(x)$ |
xxx.cdf(x, ...) |
pxxx(x, ...) |
||
分位関数 (ppf)$G(p)$ |
xxx.ppf(p, ...) |
qxxx(p, ...) |
||
乱数 (random numbers) |
xxx.rvs(..., size=N) |
rxxx(n=N, ...) |
注意)xxx
部分は各分布の名称、...
は各分布のパラメータ。例えば、正規分布$N(m,s^2)$なら、Pythonではnorm.pdf(x, m, s)
, norm.cdf(x, m, s)
, norm.ppf(p, m, s)
, norm.rvs(m, s, size=N)
、Rではdnorm(x, m, s)
, pnorm(x, m, s)
, qnorm(p, m, s)
, rnorm(n=N, mean=m, sd=s)
など。
注意)乱数については、こちら参照。
注意)Pythonでは、scipy.stats
から、必要な関数をインポートしたうえで使用。
from scipy.stats import uniform, norm, chi2, t, f, beta, gamma, lognorm, expon
、from scipy.stats import bernoulli, binom, poisson, nbinom, geom, hypergeom, randint
乱数
記事:https://qiita.com/swathci/items/c2f0bf1d684099963c61
Python | R | VBA | EXCEL | |
---|---|---|---|---|
一様分布 $U(a,b)$ |
uniform.rvs(loc=a, scale=b-a, size=N) |
runif(n=N, min=a, max=b) |
(b - a) * Rnd + a |
=(b-a)*RAND()+b |
正規分布 $N(m,s^2)$ |
norm.rvs(loc=m, scale=s, size=N) |
rnorm(n=N, mean=m, sd=s) |
WorksheetFunction. Norm_Inv(Rnd, m, s)
|
=NORM.INV( RAND(),m,s)
|
t分布 $t(n)$ |
t.rvs(df=n, size=N) |
rt(n=N, df=n) |
WorksheetFunction. T_Inv(Rnd, n)
|
=T.INV( RAND(),n)
|
カイ二乗分布 $\chi^2(n)$ |
chi2.rvs(df=n, size=N) |
rchisq(n=N, df=n) |
WorksheetFunction. ChiSq_Inv(Rnd, n)
|
=CHISQ.INV( RAND(),n)
|
F分布 $F(n,m)$ |
f.rvs(dfn=n, dfd=m, size=N) |
rf(n=N, df1=n, df2=m) |
WorksheetFunction. F_Inv(Rnd, n, m)
|
=F.INV( RAND(),n,m)
|
ベータ分布 $Be(a,b)$ |
beta.rvs(a=a, b=b, size=N) |
rbeta(n=N, shape1=a, shape2=b) |
WorksheetFunction. Beta_Inv(Rnd, a, b)
|
=BETA.INV( RAND(),a,b)
|
ガンマ分布 $Ga(k,theta)$ |
gamma.rvs(a=k, scale=theta, size=N) |
rgamma(n=N, shape=k, scale=theta) |
WorksheetFunction. Gamma_Inv(Rnd, a, b)
|
=GAMMA.INV( RAND(),a,b)
|
指数分布 $Exp(L)$ |
expon.rvs(loc=0, scale=1/L, size=N) |
rexp(n=N, rate=L) |
WorksheetFunction. Gamma_Inv(Rnd, 1, L)
|
=GAMMA.INV( RAND(),1,L)
|
対数正規分布 $LN(mu,s)$ |
lognorm.rvs(s=s, scale=np.exp(m), size=N) |
rlnorm(n=N, meanlog=m, sdlog=s) |
WorksheetFunction. LogNorm_Inv(Rnd, m, s)
|
=LOGNORM.INV( RAND(),m,s)
|
ベルヌーイ試行 $Bernoulli(p)$ |
bernoulli.rvs(p=p, size=N) |
rbinom(n=N, size=1, prob=p) |
||
二項分布 $B(n,p)$ |
binom.rvs(n=n, p=p, size=N) |
rbinom(n=N, size=n, prob=p) |
||
ポアソン分布 $Po(L)$ |
poisson.rvs(mu=L, size=N) |
rpois(n=N, lambda=L) |
||
負の二項分布 $NB(n,p)$ |
nbinom.rvs(n=n, p=p, size=N) |
rnbinom(n=N, size=n, prob=p) |
||
幾何分布 $G(p)$ |
geom.rvs(p=p, size=N) |
rgeom(n=N, prob=p) |
||
超幾何分布 $HG(M,n,N)$ | hypergeom.rvs(M=M, n=n, N=N, size=N) |
rhyper(nn=N, n=M, m=n, k=N) |
||
一様分布(整数) | randint.rvs(low=a, high=b+1, size=N) |
sample(1:6, size=N, replace=T) sample.int(n=6, size=N, replace=T)
|
Int((b - a + 1) * Rnd + a) |
=INT((b-a+1)*RAND()+a) |
注意)
Pythonでは、scipy.stats
から、必要な関数をインポートしたうえで使用。
from scipy.stats import uniform, norm, chi2, t, f, beta, gamma, lognorm, expon
、from scipy.stats import bernoulli, binom, poisson, nbinom, geom, hypergeom, randint
Pythonのライブラリの比較
Python(random) | Python(numpy.random) | Python(scipy.stats) | |
---|---|---|---|
import | import random |
import numpy as np |
from scipy.stats import norm 等 |
seedの固定 | random.seed(0) |
np.random.seed(0) |
関数の引数でrandom_state=0
|
一様分布 $U(0,1)$ |
random.random() |
np.random. rand(N) np.random. random_sample(size=N) np.random. random(size=N) np.random. ranf(size=N) np.random. sample(size=N)
|
uniform.rvs(loc=a, scale=b-a, size=N) |
一様分布 $U(a,b)$ |
random. uniform(a, b)
|
np.random. uniform(low=a, high=b, size=N)
|
uniform.rvs(loc=a, scale=b-a, size=N) |
標準正規分布 $N(0,1)$ |
random. gauss(0, 1) random. normalvariate(0, 1)
|
np.random. randn(N) np.random. standard_normal(size=N)
|
norm.rvs(loc=m, scale=s, size=N) |
正規分布 $N(m,s^2)$ |
random. gauss(mu=m, sigma=s) random. normalvariate(mu=m, sigma=s)
|
np.random. normal(loc=m, scale=s, size=N)
|
norm.rvs(loc=m, scale=s, size=N) |
t分布 $t(n)$ |
np.random. standard_t(df=n, size=N)
|
t.rvs(df=n, size=N) |
|
カイ二乗分布 $\chi^2(n)$ |
np.random. chisquare(df=n, size=N)
|
chi2.rvs(df=n, size=N) |
|
F分布 $F(n,m)$ |
np.random. f(dfnum=n, dfden=m, size=N)
|
f.rvs(dfn=n, dfd=m, size=N) |
|
ベータ分布 $Be(a,b)$ |
random. betavariate(alpha, beta)
|
np.random. beta(a, b, size=N)
|
beta.rvs(a=a, b=b, size=N) |
ガンマ分布 $Ga(k,theta)$ |
random. gammavariate(alpha, beta)
|
np.random. gamma(shape, scale, size=N)
|
gamma.rvs(a=k, scale=theta, size=N) |
指数分布 $Exp(L)$ |
random. expovariate(lambd)
|
np.random. exponential(scale=1/L, size=N)
|
expon.rvs(loc=0, scale=1/L, size=N) |
対数正規分布 $LN(mu,s)$ |
random. lognormvariate(mu=m, sigma=s)
|
np.random. lognormal(mean=m, sigma=s, size=N)
|
lognorm.rvs(s=s, scale=np.exp(m), size=N) |
ベルヌーイ試行 $Bernoulli(p)$ |
bernoulli.rvs(p=p, size=N) |
||
二項分布 $B(n,p)$ |
np.random. binomial(n=n, p=p, size=N)
|
binom.rvs(n=n, p=p, size=N) |
|
ポアソン分布 $Po(L)$ |
np.random. poisson(lam=L, size=N)
|
poisson.rvs(mu=L, size=N) |
|
負の二項分布 $NB(n,p)$ |
np.random. negative_binomial(n=n, p=p, size=N)
|
nbinom.rvs(n=n, p=p, size=N) |
|
幾何分布 $G(p)$ |
np.random. geometric(p=p, size=N)
|
geom.rvs(p=p, size=N) |
|
超幾何分布 $HG(M,n,N)$ |
np.random. hypergeometric(ngood, nbad, nsample, size=N)
|
hypergeom.rvs(M=M, n=n, N=N, size=N) |
|
一様分布(整数) |
random. randint(a,b) random. randrange(start=a, stop=b, step=1)
|
np.random. randint(low=a, high=b+1, size=N) np.random. random_integers(low=a, high=b, size=N)
|
randint.rvs(low=a, high=b+1, size=N) |
サンプリング(1個) |
random. choice(seq=x)
|
||
サンプリング(重複あり)復元抽出 |
random. choices(population=x, k=N)
|
np.random. choice(a=x, size=N, replace=True, p)
|
|
サンプリング(重複なし)非復元抽出 |
random. sample(population=x, k=N)
|
np.random. choice(a=x, size=N, replace=False, p)
|
|
シャッフル |
random. shuffle(x)
|
np.random. shuffle(x) np.random. permutation(x)
|
注意)指数分布のrandom.expovariate(lambd)
の引数lambd
は $Exp(\lambda)$ の $\lambda$ (平均の値の逆数)で、本来は "lambda" だが、Pythonの予約語で使えないためこのような表記になっている。
- Python標準ライブラリのrandomモジュール
- Numpyのnumpy.randomモジュール
- SciPyのscipy.statsモジュール
日時操作
記事:https://qiita.com/swathci/private/4dabbfa206ee09766293
日時のデータ型
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | date オブジェクト | "Date" クラス | Date型(整数部分) | Date型(整数部分) |
時刻 | time オブジェクト | "hms" "difftime" クラス | Date型(小数部分) | Date型(小数部分) |
日時 | datetime オブジェクト | "POSIXct" "POSIXt" クラス | Date型 | Date型 |
現在の日時
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
現在の日付 | datetime.date.today() | today() | Date | =TODAY() |
現在の時刻 | datetime.datetime.now(). time() |
Time | ||
現在の日時 | datetime.datetime.now() | now() | Now | =NOW() |
日時型の変換
日付型⇒シリアル値
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | as.numeric(d) unclass(d) |
CLng(d) | ||
時刻 | as.numeric(t) unclass(t) |
CDbl(t) | ||
日時 | dt.timestamp() | as.numeric(dt) unclass(dt) |
CDbl(dt) |
シリアル値⇒日時型
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | as_date(d) | CDate(d) | =A1 | |
時刻 | hms::as_hms(t) | CDate(t) | =A1 | |
日時 | datetime.datetime. fromtimestamp(d) |
as_datetime(dt) | CDate(dt) | =A1 |
文字列型⇒日時型
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | datetime.datetime. strptime('s', '%Y/%m/%d').date() |
as_date(s) as.Date(s, "%Y/%m/%d") ymd(s) 等 |
CDate(s) DateValue(s) |
=DATEVALUE(A1) |
時刻 | datetime.datetime. strptime(s, '%H:%M:%S').time() |
hms::as_hms(s) | CDate(s) TimeValue(s) |
=TIMEVALUE(A1) |
日時 | datetime.datetime. strptime(s, '%Y/%m/%d %H:%M:%S') |
as_datetime(s) ymd_hms(s) 等 |
CDate(s) |
日時型⇒文字列型
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | d.strftime('%Y/%m/%d') '{0:%Y/%m/%d}'.format(d) |
strftime(d, format="%Y/%m/%d") | Format(d, "yyyy/mm/dd") | =TEXT(A1,"yyyy/mm/dd") |
時刻 | t.strftime('%H:%M:%S') '{0:%H:%M:%S}'.format(t) |
strftime(t, format="%H:%M:%S") | Format(t, "hh:nn:ss") | =TEXT(A1,"hh:nn:ss") |
日時 | dt.strftime('%Y/%m/%d %H:%M:%S') '{0:%Y/%m/%d %H:%M:%S}'.format(dt) |
strftime(dt, format="%Y/%m/%d %H:%M:%S") | Format(dt, "yyyy/mm/dd hh:nn:ss") | =TEXT(A1,"yyyy/mm/dd hh:nn:ss") |
日時の要素⇒日時型
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | datetime.date(2004, 3, 21) | make_date(2004, 3, 21) | DateSerial(2004, 3, 21) | =DATE(2004,3,21) |
時刻 | datetime.time(12, 34, 56) | TimeSerial(12, 34, 56) | =TIME(12,34,56) | |
日時 | datetime.datetime(2004, 3, 21, 12, 34, 56) | make_datetime(2004, 3, 21, 12, 34, 56) | DateSerial(2004, 3, 21) + TimeSerial(12, 34, 56) |
=DATE(2004,3,21) +TIME(12,34,56) |
日時型⇒日時の要素
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
年 | dt.year | year(dt) | Year(dt) | =YEAR(A1) |
月 | dt.month | month(dt) | Month(dt) | =MONTH(A1) |
日 | dt.day | day(dt) | Day(dt) | =DAY(A1) |
時 | dt.hour | hour(dt) | Hour(dt) | =HOUR(A1) |
分 | dt.minute | minute(dt) | Minute(dt) | =MINUTE(A1) |
秒 | dt.second | second(dt) | Second(dt) | =SECOND(A1) |
マイクロ秒 | dt.microsecond | |||
日付 | dt.date() | date(dt) as_date(dt) |
||
時刻 | dt.time() | |||
曜日 | dt.weekday() | wday(dt) wday(d, label = T) |
Weekday(dt) WeekdayName( Weekday(dt)) |
=WEEKDAY(A1) |
年の通算日 | yday(dt) | DatePart("y", dt) | ||
四半期の通算日 | qday(dt) | |||
月の通算日 =日 |
mday(dt) | DatePart("d", dt) | ||
週の通算日 =曜日 |
wday(dt) wday(d, label = T) |
DatePart("w", dt) | ||
年の通算週 =週 |
DatePart("ww", dt) | =WEEKNUM(A1) | ||
四半期 | quarter(dt) quarter(dt, with_year = T) |
|||
半期 | semester(dt) semester(dt, with_year = T) |
|||
閏年 | leap_year(dt) | |||
午前 | am(dt) | |||
午後 | pm(dt) | |||
タイムゾーン | tz(dt) | |||
タイムゾーン変更 | with_tz(dt, "America/Chicago") |
日時の計算
日時の加算
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
年 | dt + years(1) | DateAdd("yyyy", 1, dt) | ||
半期 | ||||
四半期 | DateAdd("q", 1, dt) | |||
月 | dt + months(1) | DateAdd("m", 1, dt) | =EDATE(A1,1) | |
週 | dt + datetime.timedelta(weeks=1) |
dt + weeks(1) | DateAdd("ww", 1, dt) | =A1+7 |
日 | dt + datetime.timedelta(days=1) |
dt + days(1) d + 1 |
DateAdd("d", 1, dt) dt + 1 |
=A1+1 |
時間 | dt + datetime.timedelta(hours=1) |
dt + hours(1) | DateAdd("h", 1, dt) dt + 1/24 |
=A1+1/24 |
分 | dt + datetime.timedelta(minutes=1) |
dt + minutes(1) | DateAdd("n", 1, dt) dt + 1/24/60 |
=A1+1/24/60 |
秒 | dt + datetime.timedelta(seconds=1) |
dt + seconds(1) dt + 1 |
DateAdd("s", 1, dt) dt + 1/24/60/60 |
=A1+1/24/60/60 |
日時の差
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
日付 | (d1 - d2).days | d1 - d2 interval(dt1, dt2) dt1 %--% dt2 |
d1 - d2 | =A1-A2 =DAYS(A2,A1) |
時刻 | (d1 - d2).seconds | d1 - d2 | =A1-A2 | |
日時 | (d1 - d2).total_seconds() | d1 - d2 | =A1-A2 |
日時の大小関係
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
> | d1 > d2 | dt1 > dt2 | dt1 > dt2 | =A1>A2 |
≧ | d1 >= d2 | dt1 >= dt2 | dt1 >= dt2 | =A1>=A2 |
= | dt1 == dt2 | dt1 == dt2 | dt1 = dt2 | =A1>A2 |
≦ | dt1 < dt2 | dt1 < dt2 | dt1 < dt2 | =A1<A2 |
< | dt1 <= dt2 | dt1 <= dt2 | dt1 <= dt2 | =A1<=A2 |
日時の丸め処理
Python (datetime) | R (lubridate) | VBA | EXCEL | |
---|---|---|---|---|
ラウンド | round_date(dt, unit = "day") | |||
天井 | ceiling_date(dt, unit = "month") | |||
床 | floor_date(dt, unit = "minute") |
References
Python
- Python ドキュメント
- Python ドキュメント
- NumPy Documentation
- Numpy and Scipy Documentation
- pandas
R
-
The R Project for Statistical Computing
- The Comprehensive R Archive Network
- Getting Help with R
-
The R Manuals
- An Introduction to R
- R Data Import/Export
- [The R language definition](R Language Definition)
- The R Reference Index: contains all help files of the R standard and recommended packages in printable form.
-
RjpWiki
-
RjpWiki カテゴリー別見取り図
-
Tips
- 一般
- R プログラミング Tips
- 文字列処理
- Rコードの最適化
- 他言語利用
-
Rの基本パッケージ中の関数一覧
- Rの基本パッケージ中の回帰、分散分析関数一覧
- Rの基本パッケージ中の確率分布、乱数関数一覧
- Rの基本パッケージ中の古典的検定関数一覧
- Rの基本パッケージ中の行列分解関数一覧
- Rの基本パッケージ中の最適化関数一覧
- Rの基本パッケージ中の時系列オブジェクト一覧
- Rの基本パッケージ中の多変量解析関数一覧
- Rの基本パッケージ中の平滑化関数一覧
- R の標準パッケージ中の統計関連オブジェクトのカテゴリ化された簡易説明
- Rの古典的検定関数一覧
- 時系列パッケージtsの内容一覧
-
Tips
- Rの組み込み定数文字ベクトル、定数値
-
ページの一覧
-
base(基本)一覧
- データセット(52種類)
- 確率分布・乱数
- モデル・回帰分析・分散分析・実験計画法
- 算術・基本演算
- 数学関数
- 論理演算
- プログラミング
- グラフィックスデバイス
- プロット
- ユーティリティー
- 諸関数
- カテゴリカルデータ
- 環境
- ファイル操作・入出力
- ベクトル・行列・配列・データフレーム
- 行列分解・最適化
- 文字列操作
- オブジェクト・クラス・メソッド
- 時系列 (より本格的な時系列解析用の関数はパッケージ ts に入っています)
- プリント
- インタフェイス・ドキュメント・その他
- 日付・時刻
- base(基本)一覧(ABC順)
-
base(基本)一覧
-
RjpWiki カテゴリー別見取り図
-
R-Tips
- 入 門 篇
- ベクトル篇
- 行列・配列・リスト篇
- 関数とプログラミング篇
- 数値計算篇
- データフレーム篇
- グラフィックス篇
- 統計解析篇
- PDF版 R-Tips
- R for Data Science (r4ds)
- パッケージ
- biostatistics