jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

Rで作成した度数分布表のラベルと値をすぐに使いたい

今回はRの使い方の話です。最初に考えた方法がうまくいかなかったので、意外に解決策を見つけるのに手間取ったので自分のためのメモ。でも同じ問題で行き詰まる方にも共有します。

Rで表を作るならtable関数

Rのbaseパッケージで度数分布表を作るときはtable関数を利用します。

data <- c("りんご", "りんご", "オレンジ", "オレンジ", "バナナ", "バナナ", "バナナ")

res <- table(data)
オレンジ バナナ りんご
2 3 2

これ自体は特に問題なく利用できます。

度数分布表のラベルはname関数で取得可能

度数分布表のラベルだけ使いたいことがあります。例えば、度数は関係なく、項目のバリエーションの数だけが気になっているような時です。これはname関数を使えば取得可能です。

names(res)

出力は以下のようになります。

[1] "オレンジ" "バナナ" "りんご"

度数分布の値を取得するにはどうすれば良いか?

table関数の出力は、table クラスという特殊な形式をとっています。リストオブジェクトではないのでunlist関数を使っても値とラベルの分離ができません。tableオプジェクトの値だけを取り出す際にはas.numeric関数が良さそうです。

as.numeric(res)

以下のような出力が得られます。

[1] 2 3 2

データフレームオブジェクトの利用

table関数で出力した度数分布表のラベルや値を別の計算で再利用するならdata.frame関数でデータフレームオブジェクトにしてしまうのが一番便利そうです。

new.data <- data.frame(res)

これを実行するとnew.dataの中身は以下のようにdataとFreqという変数を持つデータフレームオブジェクトになります。

data Freq
1 オレンジ 2
2 バナナ 3
3 りんご 2

インプットとアウトプット(1)

久しぶりに書きたいことが出てきたので、インプットとアウトプットについて考えていることを何回か書いてみたいと思います。ここで言っているインプットとアウトプットはプログラミングや統計で利用する関数の入力・出力のことではありません。読書やインターネット検索、勉強会参加など何らかの方法での知識や情報を集めることをインプット、自分で作った成果やまとめた知識を他の人に伝えることをアウトプットと考えています。

インプットがあってこそのアウトプット

何かをアウトプットするには、自分の中にある知識や情報を見直すことが大事です。では、その自分の中にある知識や情報はどこから来たのか。完全に自分の中から出てくる知識というのもあるにはありますが、周りの人、書籍、ブログなど自分の外側にあるものから得られることがほとんどです。そういう意味においては、まずインプットが重要で、どんどん自分の中に知識をため込みたい。インプットがあってこそのアウトプットとはそういう意味です。

アウトプットがあるからこそのインプット

では、何か目的があってアウトプットする際に、自分の中にたまたまあった知識や情報だけを使うのでしょうか。それでことが足りる場合は案外少ないです。では、足りない知識はどうすれば良いか。一生懸命考えるという方法もあります。ですが、周りの人、書籍、ブログなど自分の外側にあるものから得るのが手っ取り早いでしょう。先ほどと同じようなことを書いているように見えますが、実は、インプットとアウトプットの主従関係が逆転しています。今は、アウトプットが主体であり、それに必要な何かを能動的にインプットする必要があるのです。アウトプットがあるからこそのインプットとはそういう意味です。この方法には1つメリットがあります。アウトプットの枠組みの中に必要な知識なので、知識がどのように生かされるのか、どのように体系づけられるべきなのかが知識・情報を集める時点で決まっています。すると、その枠組みが手がかりとなって、次に同じような場面でその知識が必要になるときにもスムーズに思い出しやすくなると思います。

まとめ

今回はインプットとアウトプットの関係について考えて、アウトプットを先に定めてしまうことのメリットを紹介しました。

Rを利用したデータのまとめ方(1)

今回は、久しぶりにRの基本的な使い方について説明します。

データをまとめる方法

アンケート調査や実験などでデータを取得し、スプレッドシートなどになっているデータについて、色々な方法でまとめることができます。

変数の特徴を知る方法:summary関数で五数要約

五数要約とは最小、第一四分位、中央値、第三四分位、最大値のことで、この5つの数字をみることでおおよそのデータの位置と広がりを知ることができます。Rではこれに平均値を加えた6つの指標をsummary関数一つで計算可能です。

例えば以下のようなデータがあるときに

rawdata <-  c(1,2,3,4,5)

summary関数を使うと

summary(rawdata)

Min. 1st Qu. Median Mean 3rd Qu. Max.
1 2 3 3 4 5

という出力が得られます。左から順に最小値、第一四分位、中央値、平均値、第三四分位、最大値です。

ケースごとにまとめたいときにはapply関数

たくさんの人から取得したデータがあって項目ごとの得点があるとします。次のような場合です。


参加者 問題1 問題2 問題3
A 1 2 1
B 2 2 1
C 1 1 2

Rでこのデータを作るなら以下のように書けます。

rawdata2 <- data.frame(参加者= c("A", "B","C"), 問題1 = c(1,2,1), 問題2= c(2,2,1), 問題3= c(1,1,2))

ここで参加者全体の各問題の平均などを計算するのであれば上記で紹介しらsummary関数が役立ちます。では、個人ごとの合計得点を知りたい場合はどうすれば良いでしょうか。この場合はapply関数が役立ちそうです。

apply関数はケースごとに複数の変数のデータをまとめる計算をしてくれます。引数としてまとめたい変数とまとめ方を指定します。まとめ方については2つの要素があって、1つはまとめる方向です。MARGINという引数で1にすると行方向(ケース、参加者ごとでまとめる)、2にすると列方向(変数ごとでまとめる)に計算します。また、FUNという引数で計算方法を指定します。平均ならmean、標準偏差ならsd、合計ならsumです。
例として参加者ごとの合計得点をapply関数で計算してみましょう。

res <- apply(rawdata[,2:4], MARGIN = 1, FUN = sum)

resでは4,5,4
という出力結果が保存されています。これを元のデータフレームオブジェクトに含めることもできます。

rawdata2$total <- apply(rawdata[,2:4], MARGIN = 1, FUN = sum)

こうするとデータフレームにtotalという変数が増えて各参加者の合計得点がデータとして使用可能になります。まとめた後で、次の計算に使う場合には、このようなやり方が便利かもしれません。

尤度を計算してみる(1)

今回は、尤度について考えます。尤度とは「観測されたデータが、こちらで仮定したモデルから生じたものだとするとそれがどの程度尤もらしいか」を測る指標です。「尤もらしさ」が抽象的で分かりにくいのですが、ある種の確率で表されるものと考えれば良いかと思います。

少し高度な回帰分析になると最尤法と呼ばれる推定方法で尤度が計算されます。普段、自分で計算することは全くないのですが、シンプルな例を利用してあえて自力計算することで尤度が表すもっともらしさとは何かを考えてみましょう。

そもそも「尤もらしさ」とは?

一言でいうなら確率です。ただし、数学で導入される確率が「物事が生じる程度」を表すものであるのに対して、「尤度」が指し示す確率はもう少し使い方が決まっています。尤度は、ある事象を説明するモデルにおいて、モデル内のパラメータをある値に決めた場合に、観測されたデータが観測し得る確率です*1

具体例:コイントスで表が上になる尤度

上記の説明は、わかっている人にはわかる説明になっている気がします。「事象」「モデル」「パラメータ」などがわからなければ何を言っているのかわかりません。そこで具体例を考えてみましょう。1枚のコインがあって、それを投げて、表が上になるか、裏が上になるか、いわゆるコイントスを考えてみましょう。ここでは、「事象」は「コインで表が上になる」としてみます。モデルですが、コインは表か裏のどちらかがでる*2ので、このような事象の確率を表すモデルとしてベルヌーイ分布を利用したモデルが考えられます。ベルヌーイ分布はひとまず置いておいて、コインが表か裏が上になるなら、表が上になる確率を0.5としてみましょう。これが「モデル」であり、「パラメータ」は「0.5」です。

コイントスを2回連続で行うときの尤度

話をもう少し進めてみます。コインを1回投げるだけなら、表が上でも裏が上でもどちらも確率は0.5です。では2回連続でコイントスをした場合はどうなるでしょうか。事象として「2回のうち1回で表が上」「2回とも表が上」「2回とも裏が上(つまり表が上は0回)」という3つの事象が考えられます。次にモデルですが、このような場合は二項分布という確率のモデルが利用できます。パラメータは先ほどと同じく、表が上の確率を0.5としてみましょう。すると、先ほどの3つの事象が起きる確率は、「2回のうち1回で表が上」が0.5, 「2回とも表が上」と「2回とも裏が上」はそれぞれ0.25となります。ここで実際に、コインを2回投げてみて、たまたま表と裏が1回ずつ出たならば、そのときの尤度は先ほどのモデルから考えて0.5ということになります。

ここまでのまとめ

今回は尤度について考えてみました。尤度とは尤もらしさ、確率であり、モデルのパラメータをある値にしたときの観察されたデータの観測確率です。次回は、この尤度を利用して、パラメータの値を推定する方法「最尤法」を考えてみます。

*1:他の使用用途もあるかもしれません。

*2:コインが立つという可能性もなくはないのですが、ここでは一旦無視します

2つの相関係数の使い分け

今回は2つの変数の関連性を表す指標である相関係数について、特に2種類の相関係数の使い分けという観点から考えてみます。

相関係数とは

相関係数は、2つの変数の大小関係の結びつき方(関連性)の方向と強さを表す指標です。大小関係の結びつき方という説明がいかにもわかりにくいのですが、一方の変数の値が大きくなればなるほど、他方の変数の値が大きくなるまたは小さくなるような関係のことです。

ピアソンの相関係数

ピアソンの相関係数はもっとも頻繁に使われる相関係数の指標です。以下のような式で求められます。
 r_{xy} =\frac{\sum_i^n{(x_i - \overline{x})(y_i - \overline{y}})}{\sum_i^n{(x_i - \overline{x})^2}*\sum_i^n{(y_i - \overline{y})^2}}

ピアソンの相関係数を使う際に気をつけることは、関連性を調べる2つの指標がどちらも連続量の性質をもち、さらに正規分布することを仮定していることです。

スピアマンの順位相関係数

スピアマンの順位相関係数を計算する際には、まずそれぞれの変数の得点を順位に変換します。その上で次の式を使います。
 \rho = 1 - \frac{6 \sum{D^2}}{N^3 - N}
ここでNは値のペア数、Dはそれぞれのペアの順位の差です。順位の差は二乗されているので、順位のズレ自体が蓄積されると考えれば良いでしょう。

スピアマンの順位相関係数には、分布に関する前提条件がありません。そもそもデータの元の値でなくて順位で計算しています。

2つの相関係数の違い

上記でも紹介しましたが、2つの相関係数では、扱うデータの種類が違います。ピアソンの相関係数では、変数の値そのものを利用します。一方、スピアマンの順位相関係数では、データの順位を利用します。

また、これらの相関係数を計算するための前提の有無に違いがあります。ピアソンの相関係数では、2つの変数はどちらも量的な変数で
正規分布に従うことを前提としています。一方、スピアマンの順位相関係数では、このような前提を作っていません。

どうやって使い分けるか

では、どうやって使い分けるかを考えてみましょう。重要なポイントは、上記のピアソンの相関係数の前提条件が満たされているかどうかですね。2つの変数がどちらも量的な変数で正規分布であれば、ピアソンの相関係数を使うのが良いでしょう。これが満たされないならばピアソンの相関係数自体は計算できても、解釈する意味がないと考えた方が良いと思います。

ところである変数がおおよそ正規分布にしたがっているかどうかを確かめる方法としてQ-Qプロットがあります。
Q-Qプロット*1では、2つの分布の偏りを調べることができます。どのようにするかというと2つの変数をそれぞれ値の大小で並べ替えて、一番小さい値のペア、次に小さい値のペアというように値の数だけペアを作り、そのペアを使って散布図を作成します。散布図がほぼ直線で示される場合には、2つの変数は同じような形状の分布を持っていると考えられます。以下の図に示すように、2つの変数のうちの1つを正規分布としてみましょう。すると、調べたい変数とのQ-Qプロットが直線的になるかどうかを調べれば、正規分布に近い分布形状をとっているのかを確かめられます。

f:id:jnobuyuki:20200626104306p:plain
Q-Qプロットの例 今回はどちらも正規分布からランダムサンプリングしたデータを用いています。図の中の直線でほぼ全てのデータを近似できるということから2つの分布がほぼ同じ形状であることを期待できます

Q-Qプロットで2つの変数が正規分布であると期待できればピアソンの相関係数を使って良いでしょう。

外れ値がある場合も要注意

外れ値のように分布に対して極端に大きいまたは小さい値が含まれている場合も、ピアソンの相関係数は影響を受けます。
例えば次の2つの変数の散布図を見てみましょう。

f:id:jnobuyuki:20200626112747p:plain

この図の例では、全体的に2つの変数に特に関連性が内容に見えます。でも、実際にピアソンの相関係数を計算してみるとr=.14になります。なぜ弱い正の相関があるような結果になるかというと、右上にポツンとある外れ値の影響です。これがあるだけで全体に正の相関があるような錯覚が生まれます。スピアマンの順位相関係数の場合は、外れ値と言っても単純に1番大きい値という風に計算されるだけなので、どれだけ他の値と離れていても計算結果が変わりません。実際スピアマンの相関係数を計算してみると-0.07になりました。こんな風に、ピアソンの相関係数はデータの細かい特徴に影響を受けやすいことを覚えておくと良いでしょう。

*1:Qはquantile「分位数」の意味です

QuickTime Playerで動画の再生スピードを変えたい

本日は、QuickTime PlayerについてのTipsです。最近、大学、高校でオンラインの授業が増えていたり、社会人もオンラインのコースで学ぶ機会が増えてきました。その際、動画を視聴する機会が数多くあると思います。今回はダウンロードした動画でも再生スピードをコントロールする方法を紹介します。

QuickTime Playerには再生スピードを変えるボタンがない?

動画で何か教育的な内容を視聴する際、話し手の話す速さが速すぎたり遅すぎたりすると感じることがあります。話し手からすると、見えない視聴者のための最適な話速をそもそも計算できないので、仕方のないことです。それでも、特に視聴時間を節約したいけど内容を最後までみたいときには少し早めに喋って欲しいと思ったりします。YouTubeなどのウェブ動画視聴では、再生速度をコントロールするボタンがあるので、それを少し上げて(1.25倍とか1.5倍)視聴すると、内容を損なわずに視聴時間を節約可能です。しかし、QuickTime Playerには再生・停止ボタンと巻き戻し、早送りボタンがあるのですが、微妙なコントロールをするボタンがありません。

optionを押しながら早送り・巻き戻しで再生スピードコントロール

調べてみたところ、キーボードのoptionキーを押しながら早送りをクリックすると再生スピードが1.1倍になることがわかりました。同じことを繰り返すごとに再生スピードが0.1倍増えていき最速で2.0倍まで再生スピードをあげることができました。同様にoptionキーを押しながら巻き戻しをクリックすると再生スピードが0.1倍ずつ下がっていきます。

f:id:jnobuyuki:20200615085849p:plain

児童虐待対応の2つの立場の違いを第1種の過誤と第2種の過誤で考える

久しぶりの投稿です。最近のニュース記事などで児童虐待への対応について児童相談所と裁判で異なる行動基準があるという議論を見かけました。
今回は、これを第1種の過誤と第2種の過誤という科学的な検証で想定される2種類の誤りという観点で考えてみます。

第1種の過誤

第1種の過誤は、統計的仮説検定で見られる誤りの1つです。統計的仮説検定では、本来主張したい内容とは逆の仮説(帰無仮説と呼ばれます)を設定し、取得済みのデータが帰無仮説を前提とした場合にどれほどありえないのかを確率で評価します。社会科学領域では、典型的に5%という確率の基準を設定することが多くて、取得データから得られた統計値が得られる確率が5%未満である場合に、帰無仮説に無理があると判断(棄却するという言い方をします)をします。ここで5%という基準が0%でないことが重要です。つまり、実際には帰無仮説を維持するのが適切な場合でも、データの偶然が重なって確率的に5%未満になってしまうことがあります。すると誤って帰無仮説に無理があると判断することになるわけです。この誤りを第1種の過誤と呼びます。

第2種の過誤

上では「誤って帰無仮説を棄却する」と言いましたが、これとは逆の誤り、つまり「誤って帰無仮説を棄却しない」こともあります。もっと簡単に言えば、本来主張したいことが適切であるにも関わらず、データ上それを見落とす場合です。これを第2種の過誤と言います。

2種類の過誤のトレードオフ

第1種の過誤と第2種の過誤。どちらも誤りだからなるべく減らして適切な判断をしたいところです。でも、第1種の過誤と第2種の過誤はいわゆるトレードオフの関係にあり、状況が同じなら、第1種の過誤を小さくしようとすることは、第2種の過誤が大きくなることを受け入れることを意味します。言い換えてみれば、帰無仮説を棄却する誤りを減らしたいので、本来の主張の証拠の見落としを受け入れるという感じです。そして、トレードオフの関係なので、第1種の過誤と第2種の過誤のどちらをより優先させるかの判断が必要になります。この判断が以下の話のポイントになります。

児童虐待の有無に関する仮定

話をわかりやすくするために児童虐待を事例にする場合の第1種の過誤と第2種の過誤を少し具体的にしておきます。児童虐待を見つけるのは、典型的とは思えない児童の様子が重要なヒントになることがあるでしょう。つまり、児童の典型的な様子からの逸脱がないというのが上記で挙げた帰無仮説になります(本当は虐待があるならそれを主張したいわけです)。よって、第1種の過誤は、「実際には虐待にはあたらないのに虐待があると判断すること」になります。また、第2種の過誤は「実際に虐待があるにも関わらず、典型的であるという判断を棄却しないために、それを見落とすこと」になります。

児童相談所の立場

では、児童相談所の所員の立場になって、2種類の過誤のトレードオフについて考えてみます。児童相談所にとってもっとも避けたいのは、虐待の見逃しです。つまり、第2種の過誤をなるべく少なくしたいという判断が働いています。よって、第1種の過誤の上昇については相対的に許容せざるを得ないと想像できます*1。虐待の可能性が疑われる場合には、可能な限り検証を進める過程で、違うことがわかればそれはそれで良いかもしれないです*2

司法の考え方

次に、警察や裁判所などの司法の立場で2種類の過誤のトレードオフを考えてみます。刑事裁判では「疑わしきは罰せず」という原則があるそうです。これは、司法として一番避けたいのは無実の罪、冤罪だと考えられます。これを虐待の例で考えれば、虐待でないものを虐待扱いすることをなるべく避けたいとなります。2種類の過誤で言えば、第1種の過誤をできるだけ抑えたいということです*3

2つの食い違いが作り出すもの

ここまでみてきたように、児童相談所と司法では2種類の過誤のトレードオフについて、異なる優先順位をとる可能性があることを考えてみました。仮にこれが正しいとすると、児童相談所と司法とでは、証拠の採用の仕方が若干異なるということも想像できます。児童相談所として疑わしい事例があり、それを司法と協力しながら解決したいとしても、司法の立場(冤罪を防ぎたいという観点)から確実な証拠による検証なしでは具体的なアクションを起こせないかも知れません。このような2つの組織の立場の違いを考慮すると、虐待という問題を扱う難しさや一見して、解決に必要以上に時間がかかっているように思えることにも一部説明がつくように思います。

*1:もちろんないに越したことはありません

*2:疑われたことによる風評被害のような物があるかも知れませんが、ここでは別の問題として触れません

*3:虐待が疑われる事例の保護についてはこの原則によっていないと予想・期待します。ここでは刑事事件扱いとして考えた場合の原則について考えています