Rの統計関連(dpqr)関数チートシート

:::note info
information
本記事は2025年4月26日（土）開催のTokyoRにて発表予定の初心者セッション資料その2です。
TokyoR発表資料
[その1 「"The R Foundation for Statistical Computing"を実感する」](https://qiita.com/hige_megane/private/e49ef15222bba6be14d7)
[その3 「Rの統計関連(dpqr)関数の書き方」](https://qiita.com/hige_megane/private/416c0d6b5742dfcf4050)
[その4 「誕生日のパラドックスをRの関数で求める方法」](https://qiita.com/hige_megane/private/617064410e1f8008c45d)
:::

Rを利用し始めると、dnorm(), pnorm(), qnorm(), rnorm()は早晩見ることになるかと思います。ただ、rnorm()以外は慣れないと、どのときにどれを使えばよいかわからなくなってしまうことも多いかと思います。そこで、d,p,q,rが何の意でどのように使用するのか、まとめてみます。

## d*,p*,q*,r*の意味を改めて知る
そもそもRには単体の関数として、d(), p(), qn(), r()があります。

https://search.r-project.org/CRAN/refmans/estimators/html/dpqr.html

Four generic functions that take a distribution object (e.g. Bern) and return the density, cumulative probability, quantile, and random generator functions, respectively.
（日本語訳）
分布オブジェクト（ベルヌーイ分布など）を受け取り、それぞれ密度関数、累積確率関数、分位関数、ランダム生成関数を返す4つの汎用関数。

実際に上記リンクのExamplesを実行してみると理解が進むと思います。

### 1. d*: 確率密度関数 (Probability Density Function)
指定した値におけるの確率密度を計算します。グラフで言うと「高さ」を返します。
- 引数:確率密度を計算したい$x$（ベクトルでも可）
- 戻り値:$x$における確率密度（グラフの高さ、$y$の値）

### 2. p*: 累積分布関数 (Cumulative Distribution Function, CDF)
指定した値以下の確率（累積確率）を計算します。グラフで言うと、左側($x$の最小値）から$x(q)$までの面積を返します。
- 引数:累積確率を計算したい$q$（ベクトルでも可）
- 戻り値:$x \leq q$の確率（グラフの面積、累積確率$p \mid 0 \leq p \leq 1$）

### 3. q*: 分位点関数 (Quantile Function)
指定した確率に対応する分位点（値）を計算します。p*()の逆関数で、累積確率から$x$を求めます。グラフで言うと、累積面積からその地点の$x$の値をかえします。
- 引数:求めたい:$x \leq q$の確率（グラフの面積、累積確率$p \mid 0 \leq p \leq 1$）
- 戻り値:指定した確率に対応する $x$ の値

### 4. r*: 乱数生成関数 (Random Number Generation)
正規分布に従う乱数を生成します。シミュレーションやデータ生成に使用されます。
- 引数:生成する乱数の個数$n$
- 戻り値:乱数のベクトル

## 標準正規分布グラフで`dnorm()` `pnorm()` `qnorm()`を理解する

```norm.r
> dnorm(1.96)
[1] 0.05844094
> qnorm(0.975)
[1] 1.959964
> pnorm(1.96)
[1] 0.9750021
```

と記載されてもなかなかイメージができないと思いますので、ggplot()で作成した標準正規分布グラフを貼っておきます。

#### q=1.96の時のグラフとRの関数

![q_196](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015152/201b8283-492c-40a1-ad53-8bdbbda8e7af.png)

### 乱数を生成する`rnorm()` `runif()`
`rnorm()`は正規分布の中からn個のサンプルを抽出してくれます。どの値も均等の確率（一様分布）の中からn個のサンプルを抽出したい場合は`runif()`を使います。私は`runif()`をrun + if かと思っていましたが、r + unifだったんですね笑。
また、`r*`ではありませんが、整数値の乱数生成には`sample()`もよく使われます。

```r_function.r
> rnorm(5)
[1] -1.92688778 -0.47249826  0.04947606  0.38249702 -1.94726251
> # runifのデフォルトはmin = 0, max = 1
+ runif(5)
[1] 0.5810854 0.8058259 0.2944058 0.2467517 0.6735231
> # 整数の乱数生成の場合はsample()が便利。
+ sample(1:100, size = 5, replace = TRUE)
[1] 84 45 20 14 26
```

## base Rで使える統計関連(dpqr)関数チートシート

以下にRの基本パッケージ(stats)で使える関数一覧をまとめました。

<table>
    <tr>
        <th>日本語区分名</th>
        <th>英語名</th>
        <th>d*</th>
        <th>p*</th>
        <th>q*</th>
        <th>r*</th>
    </tr>
    <tr>
        <td>ベータ分布</td>
        <td>beta</td>
        <td><code>dbeta</code></td>
        <td><code>pbeta</code></td>
        <td><code>qbeta</code></td>
        <td><code>rbeta</code></td>
    </tr>
    <tr>
        <td>二項分布</td>
        <td>binom</td>
        <td><code>dbinom</code></td>
        <td><code>pbinom</code></td>
        <td><code>qbinom</code></td>
        <td><code>rbinom</code></td>
    </tr>
    <tr>
        <td>誕生日パラドックス</td>
        <td>birthday</td>
        <td></td>
        <td><code>pbirthday</code></td>
        <td><code>qbirthday</code></td>
        <td></td>
    </tr>
    <tr>
        <td>コーシー分布</td>
        <td>cauchy</td>
        <td><code>dcauchy</code></td>
        <td><code>pcauchy</code></td>
        <td><code>qcauchy</code></td>
        <td><code>rcauchy</code></td>
    </tr>
    <tr>
        <td>カイ二乗分布</td>
        <td>chisq</td>
        <td><code>dchisq</code></td>
        <td><code>pchisq</code></td>
        <td><code>qchisq</code></td>
        <td><code>rchisq</code></td>
    </tr>
    <tr>
        <td>指数分布</td>
        <td>exp</td>
        <td><code>dexp</code></td>
        <td><code>pexp</code></td>
        <td><code>qexp</code></td>
        <td><code>rexp</code></td>
    </tr>
    <tr>
        <td>F分布</td>
        <td>f</td>
        <td><code>df</code></td>
        <td><code>pf</code></td>
        <td><code>qf</code></td>
        <td><code>rf</code></td>
    </tr>
    <tr>
        <td>ガンマ分布</td>
        <td>gamma</td>
        <td><code>dgamma</code></td>
        <td><code>pgamma</code></td>
        <td><code>qgamma</code></td>
        <td><code>rgamma</code></td>
    </tr>
    <tr>
        <td>幾何分布</td>
        <td>geom</td>
        <td><code>dgeom</code></td>
        <td><code>pgeom</code></td>
        <td><code>qgeom</code></td>
        <td><code>rgeom</code></td>
    </tr>
    <tr>
        <td>超幾何分布</td>
        <td>hyper</td>
        <td><code>dhyper</code></td>
        <td><code>phyper</code></td>
        <td><code>qhyper</code></td>
        <td><code>rhyper</code></td>
    </tr>
    <tr>
        <td>対数正規分布</td>
        <td>lnorm</td>
        <td><code>dlnorm</code></td>
        <td><code>plnorm</code></td>
        <td><code>qlnorm</code></td>
        <td><code>rlnorm</code></td>
    </tr>
    <tr>
        <td>ロジスティック分布</td>
        <td>logis</td>
        <td><code>dlogis</code></td>
        <td><code>plogis</code></td>
        <td><code>qlogis</code></td>
        <td><code>rlogis</code></td>
    </tr>
    <tr>
        <td>多項分布</td>
        <td>multinom</td>
        <td><code>dmultinom</code></td>
        <td></td>
        <td></td>
        <td><code>rmultinom</code></td>
    </tr>
    <tr>
        <td>負の二項分布</td>
        <td>nbinom</td>
        <td><code>dnbinom</code></td>
        <td><code>pnbinom</code></td>
        <td><code>qnbinom</code></td>
        <td><code>rnbinom</code></td>
    </tr>
    <tr>
        <td>正規分布</td>
        <td>norm</td>
        <td><code>dnorm</code></td>
        <td><code>pnorm</code></td>
        <td><code>qnorm</code></td>
        <td><code>rnorm</code></td>
    </tr>
    <tr>
        <td>ポアソン分布</td>
        <td>pois</td>
        <td><code>dpois</code></td>
        <td><code>ppois</code></td>
        <td><code>qpois</code></td>
        <td><code>rpois</code></td>
    </tr>
    <tr>
        <td>符号順位分布</td>
        <td>signrank</td>
        <td><code>dsignrank</code></td>
        <td><code>psignrank</code></td>
        <td><code>qsignrank</code></td>
        <td><code>rsignrank</code></td>
    </tr>
    <tr>
        <td>t分布</td>
        <td>t</td>
        <td><code>dt</code></td>
        <td><code>pt</code></td>
        <td><code>qt</code></td>
        <td><code>rt</code></td>
    </tr>
    <tr>
        <td>テューキー分布</td>
        <td>tukey</td>
        <td></td>
        <td><code>ptukey</code></td>
        <td><code>qtukey</code></td>
        <td></td>
    </tr>
    <tr>
        <td>一様分布</td>
        <td>unif</td>
        <td><code>dunif</code></td>
        <td><code>punif</code></td>
        <td><code>qunif</code></td>
        <td><code>runif</code></td>
    </tr>
    <tr>
        <td>離散一様分布</td>
        <td>unifdisc</td>
        <td><code>dunifdisc</code></td>
        <td><code>punifdisc</code></td>
        <td><code>qunifdisc</code></td>
        <td><code>runifdisc</code></td>
    </tr>
    <tr>
        <td>ワイブル分布</td>
        <td>weibull</td>
        <td><code>dweibull</code></td>
        <td><code>pweibull</code></td>
        <td><code>qweibull</code></td>
        <td><code>rweibull</code></td>
    </tr>
    <tr>
        <td>ウィルコクソン分布</td>
        <td>wilcox</td>
        <td><code>dwilcox</code></td>
        <td><code>pwilcox</code></td>
        <td><code>qwilcox</code></td>
        <td><code>rwilcox</code></td>
    </tr>
</table>

## もちろんライブラリインストールで更なる関数も

base Rでこれだけの関数が用意されているのがRの美点ですが、ライブラリをインストールすることで他にもいろいろな関数が使えます。特にlibrary(extraDistr)は様々な関数を用意してくれています。統計に精通している方は[extraDistrマニュアル](https://cran.r-project.org/web/packages/extraDistr/extraDistr.pdf)は一読の価値ありです。

:::note info
information
TokyoRの発表はその3に続きます。
TokyoR発表資料
[その1 「"The R Foundation for Statistical Computing"を実感する」](https://qiita.com/hige_megane/private/e49ef15222bba6be14d7)
[その3 「Rの統計関連(dpqr)関数の書き方」](https://qiita.com/hige_megane/private/416c0d6b5742dfcf4050)
[その4 「誕生日のパラドックスをRの関数で求める方法」](https://qiita.com/hige_megane/private/617064410e1f8008c45d)
:::