コンテンツへスキップ
Varligガイド
Varligホーム

リストと統計

リストは、1週間分の歩数、試験の点数、1か月分のレシートなど、複数の値を1つの名前でまとめて保持します。値をリストに入れておけば、合計や平均を求めたり、ばらつきを測ったり、必要な値だけを取り出したりできます。

このページでは、リストの書き方とインデックス、要約統計量、並べ替えと切り出し、mapfilter によるリストの変換、リスト全体での演算を説明します。まとめたい数値の列があるときにいつでも役立ちます。行のリストは行列としても扱えます。行列については専用のページがあります。

リストの書き方

値を角かっこで囲み、カンマで区切ります。

calc
点数 = [72, 85, 91, 64, 88] 答え [72, 85, 91, 64, 88]
点数[0] 答え 72
点数[4] 答え 88
length(点数) 答え 5

リストの中での値の位置をインデックスといい、リストの後に角かっこで書きます。インデックスはゼロから始まる ので、点数[0] は1つ目の点数、点数[4] は5つ目の点数です。最後の要素は常に length(点数) - 1 にあります。負の数、小数、大きすぎるインデックスはエラーになります。インデックスが末尾から折り返すことはありません。

要素には、計算式、単位付きの量、ほかのリストを使えます。

calc
[2 * 45, 60 + 15] 答え [90, 75]
[1.5 kg, 750 g] 答え [1.5 kg, 750 g]
[[1, 2], [3, 4]][1][0] 答え 3

入れ子のリストでは、1つ目のインデックスで内側のリストを選び、2つ目のインデックスでその中の値を選びます。[1][3, 4] が選ばれ、次に [0]3 が選ばれます。

リストの中でも桁区切りを使えるので、数値を書かれたとおりに貼り付けられます。値と値の間のカンマの後にはスペースを入れてください。カンマの後に3桁の数字が続く場合は、数値の一部として扱われます。

calc
給与 = [£32,000, £41,500, £38,250] 答え [£32,000.00, £41,500.00, £38,250.00]
average(給与) 答え £37,250.00

いくつか注意点があります。

  • スペースを入れないと、すべてのカンマが区切りになるので、[8200,10400] は2つの値になります。[100,200,300] のようなリストは1つの数値とも3つの数値とも読めるので、Varligは両方の書き方を示すエラーを表示します。
  • 答えには桁区切りと、各カンマの後のスペースが表示されるので、[8,200, 10,400] は2つの値からなるリストです。
  • 1つのリストに入れられる値は最大1,024個です。

要約統計量

calc
点数 = [72, 85, 91, 64, 88]
sum(点数) 答え 400
average(点数) 答え 80
median(点数) 答え 85
min(点数) 答え 64
max(点数) 答え 91
count(点数) 答え 5

meanavgaverage の、totalsum の、stdevstddev の、countlength の別名なので、表計算アプリでの書き方をそのまま使えます。product は値をすべて掛け合わせます。パーセンタイルを求める関数はありません。中央の値は median で求められます。

名前を付けたリストなら、統計量を言葉で書くこともできます。

calc
点数 = [72, 85, 91, 64, 88]
average of 点数 答え 80
total of 点数 答え 400

sum ofmean ofmedian ofmin ofmax ofcount of も同じように使えます。of の後には、名前を書くか、値そのものをカンマで区切って書きます。値は丸かっこで囲んでも囲まなくてもかまいません。角かっこで囲んだ値には、average([72, 85, 91]) のように関数の形を使います。

sumproductaveragemedianminmaxcountstddev など、ほとんどの統計量はリストの代わりに個別の値も受け付けます。

calc
max(72, 85, 91) 答え 91
average of 70, 85, 91 答え 82
mean of (1,2,3) 答え 2
average(1,200, 1,800) 答え 1,500

上の行を合計する

sum または total とだけ書いた行は、その上にある答えを、直前の sumtotal の行、または --- の区切り線まで合計します。行のコンテキストメニューにある Subtotal オプションと同じ働きをするので、入力するそばから、ノートのセクションごとに合計が出ます。

calc
# 食料品
パン = £1.20
牛乳 = £1.45
= £2.30
total 答え £4.95
# 日用品
ゴミ袋 = £3.50
食器用洗剤 = £1.80
total 答え £5.30

sumtotal という名前の値を自分で定義している場合は、その行には自分の値が表示されます。

ばらつき:分散と標準偏差

calc
点数 = [72, 85, 91, 64, 88]
variance(点数) 答え 132.5
stddev(点数) to 1 dp 答え 11.5

どちらも 標本 統計量です。値の個数より1少ない数(n - 1)で割ります。手元の数値がより大きな集団からの標本である場合に一般的に使われる方法です。値が少なくとも2つ必要です。どの統計量でも、後に to 1 dp を付けると丸められます。

リストが母集団全体の場合は、代わりに n で割ります。後述map を使って組み立ててください。

calc
# 電車の遅延(分)
遅延 = [2, 4, 4, 4, 5, 5, 7, 9]
stddev(遅延) 答え 2.1380899353
中心 = average(遅延) 答え 5
sqrt(sum(map((x - 中心)^2, x, 遅延)) / count(遅延)) 答え 2

単位付きのリスト

sumaveragemedianminmaxstddev は単位を保持し、互換性のある単位の間で換算します。

calc
通勤時間 = [24 min, 31 min, 27 min, 22 min]
sum(通勤時間) 答え 104 min
average(通勤時間) 答え 26 min
median(通勤時間) 答え 25.5 min
sum([1 kg, 500 g]) 答え 1.5 kg

variance は答えが単位の2乗になるため、ただの数値しか受け付けません。sort もただの数値でしか使えません。sum([1 kg, 3 m]) のように互換性のない単位を持つ値に統計量を使うと、値を黙って飛ばすのではなくエラーになります。

空のリスト

空のリストに対する呼び出し 結果
sum([]) 0
product([]) 1
count([]), length([]) 0
average([]), median([]), min([]), max([]) エラー
variance([]), stddev([]) エラー

空のリストは、何にも一致しなかった filter の結果として現れることがほとんどです。そのため、元のリストに値があっても、絞り込んだリストの average が失敗することがあります。

リスト関数一覧

呼び出し 機能
range(start,end) start から end までの整数(両端を含む)
range(start,end,step) step ずつ数える(負の数や小数も可、ゼロは不可)
length(list), count(list) 値の個数
sort(list) 小さい順に並べる(ただの数値のみ)
reverse(list) 同じ値を逆順にする(どんな値でも可)
unique(list) 各値の最初の出現だけを残す
slice(list,start,end) インデックス start から end の手前までの値
map(expression,variable,list) 値ごとに式を1回ずつ計算する
filter(condition,variable,list) 条件が true になる値だけを残す
calc
range(1, 5) 答え [1, 2, 3, 4, 5]
range(0, 100, 25) 答え [0, 25, 50, 75, 100]
range(10, 0, -2) 答え [10, 8, 6, 4, 2, 0]
点数 = [72, 85, 91, 64, 88]
sort(点数) 答え [64, 72, 85, 88, 91]
reverse(sort(点数)) 答え [91, 88, 85, 72, 64]
slice(sort(点数), 0, 3) 答え [64, 72, 85]
unique([4, 2, 4, 6, 2]) 答え [4, 2, 6]

reverse(sort(…)) は大きい順に並べ、slice(sort(…), 0, 3) は小さいほうから3つを取り出します。

切り出しの範囲は 0 <= start <= end <= length を満たす必要があります。startend が等しいと空のリストになります。点数[0:2] のような省略形はないので、slice(点数, 0, 2) と書いてください。

unique は保存されているとおりに値を比較するので、1 kg1000 g は別の値として数えられ、小数点以下10桁目が異なる2つの結果もまとめられません。

mapとfilter

map はリストの値ごとに式を計算します。filter は条件を満たす値だけを残します。どちらも、式、各値を表す名前、リストの順に書きます。

calc
点数 = [72, 85, 91, 64, 88]
map(s + 5, s, 点数) 答え [77, 90, 96, 69, 93]
filter(s >= 80, s, 点数) 答え [85, 91, 88]
count(filter(s >= 80, s, 点数)) 答え 3
average(filter(s >= 80, s, 点数)) 答え 88

filter(s >= 80, s, 点数) は、「点数 の値 s のうち s >= 80 であるもの」と読みます。どちらも単位やお金と一緒に使えます。

calc
map(p * 1.2, p, [£10, £25, £40]) 答え [£12.00, £30.00, £48.00]
支出 = [£42.50, £18.20, £65.00, £23.30]
filter(x > £30, x, 支出) 答え [£42.50, £65.00]
sum(filter(x > £30, x, 支出)) 答え £107.50

ここで選んだ名前は、その呼び出しの中にだけ存在します。ノートのほかの場所にある同じ名前の値は変わりません。

calc
x = 10
map(x * 2, x, [1, 2, 3]) 答え [2, 4, 6]
x 答え 10

filter の条件は、比較またはそのほかの真偽値でなければなりません。ただの数値は真として扱われないので、filter(x, x, [0, 1, 2]) はエラーになります。空のリストに mapfilter を使うと、空のリストが返ります。

リストの演算

すべての値に1つの数値を掛けたり、1つの数値で割ったりできます。また、同じ長さの2つのリストを値ごとに足したり引いたりできます。

calc
[30, 36, 22] / 40 * 100 答え [75, 90, 55]
2 * [3, 1, 4] 答え [6, 2, 8]
-[5, -3] 答え [-5, 3]
模試 = [62, 70, 60]
本試験 = [72, 78, 69]
本試験 - 模試 答え [10, 8, 9]
average(本試験 - 模試) 答え 9
[1 kg, 2 kg] + [500 g, 500 g] 答え [1.5 kg, 2.5 kg]
[72, 85] == [72, 85] 答え true

1行目は40点満点の点数をパーセントに変換しています。本試験 - 模試 の行は、生徒ごとに模試の点数と本試験の点数を組み合わせています。

リストでは使えない演算もあります。

  • 点数 + 5 のように、リストに1つの数値を足すこと。代わりに map(s + 5, s, 点数) を使います。
  • 長さの異なるリストを足すこと。長さをそろえるために値が繰り返されることはありません。
  • 2つの平らなリストを * で掛けること。組ごとの積の合計には dot を使います。たとえば、4のコーヒーが2杯、5の紅茶が3杯、10のケーキが1つなら、dot([2, 3, 1], [4, 5, 10])33 です。行のリスト同士では * は行列の積になります。これについてはベクトルと行列で説明しています。

行のリスト

行のリストは小さな表のように使えます。averagesum は列ごとに計算し、map を使えば行ごとに計算できます。

calc
# 各行が生徒1人分:[模試, 本試験]
成績 = [[62, 72], [70, 78], [60, 69]]
average(成績) 答え [64, 73]
sum(成績) 答え [192, 219]
map(average(r), r, 成績) 答え [67, 74, 64.5]

medianminmaxstddev は行のリストを受け付けません。最後の行のように map で行ごとに処理するか、列を取り出して独立したリストにしてください。

これらすべての演算の正確な規則は、高度な数学:機能と制限にあります。

まとめて使う

スマートウォッチで記録した1週間分の歩数と、1日の目標です。

calc
# 歩数(月曜〜日曜)
歩数 = [8200, 10400, 6300, 12000, 9100, 7400, 9600]
目標 = 9000
sum(歩数) 答え 63,000
average(歩数) 答え 9,000
median(歩数) 答え 9,100
目標達成日数: count(filter(s >= 目標, s, 歩数)) 答え 4
ばらつき: max(歩数) - min(歩数) 答え 5,700
# 1歩あたり約0.75 m
歩いた距離 = sum(歩数) * 0.75 m
歩いた距離 in km 答え 47.25 km

平均はちょうど目標どおりですが、目標に達したのは4日だけで、最も多い日と少ない日の差は5,700歩あります。目標 を変えたり、翌週の歩数を貼り付けたりすれば、すべての行が更新されます。