不人気の数を探して来年応募するという野望
TBSラジオ 安住紳一郎の日曜天国にて年に1回ミニロトが行われています。昨年までは0~99の数字の中から選んで応募、当選したらプレゼント、というのが企画概要ですが、今年は0~999の1000個の数字の中から選ぶ形式に変わりました。どの数字を選んでも当選確率は1000分の1ですが、当選者数によってプレゼントのグレードが変わるので、できれば応募者数の少ない数を選びたいものです。今年の企画は終わりましたが、来年に向けて不人気の数字をRを使って統計学的に検証してみようというのが本記事の趣旨です。
まずは記述統計から
まずは画像から0~999の応募人数を入力しました。エクセルの画像変換機能で表を作ろうとしましたが、解像度が悪く、ほとんど入力確認しながらの作業でした。この作業が一番大変だったかも。上記リンク先githubからcsvファイル並びにRコードをダウンロードできるようにしてあります。
rm(list = ls())
library(conflicted)
library(tidyverse)
library(psych)
conflicts_prefer(dplyr::filter)
df <- read_csv("nichiten_loto_2025.csv")
head(arrange(.data = df, desc(value)), n = 10)
# A tibble: 10 × 2
num value
<dbl> <dbl>
1 615 161
2 358 154
3 315 133
4 326 133
5 954 130
6 125 113
7 612 109
8 310 108
9 623 108
10 327 107
head(arrange(.data = df, desc(value)))
# A tibble: 6 × 2
num value
<dbl> <dbl>
1 944 0
2 677 1
3 880 1
4 442 2
5 447 2
6 977 2
最も応募者数の多かった数値は615で161通の応募がありました。これはこの企画を行った日が6月15日だったからでしょう。そのほかの数値も月日(がっぴ)になりそうな値が多いことにも気づきます。358は風水的には最高の数字、954はTBSラジオのAM周波数ということで、安住アナも述べていたように説明のつく数値が多いです。
逆に不人気の数値は不規則なようですが、「同じ数字が2つ以上使われている場合が多い」ことを私は見逃しませんでした。これについては後述します。
というわけで来年は940で応募する、というのがおそらくもっとも賢明な判断ですが、それでは面白くないので、統計学的手法を使って検証します。
df_describe <- describe(df$value)
n <- df_describe$n
n_expected <- df_describe$mean
df_describe
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 1000 28.79 24.37 21 24.77 16.31 0 161 161 1.61 2.83 0.77
応募総数は28,792、選択肢は1,000個なので、ある数値を選ぶ人の数の期待値は28.792となります。本来であればここを頂点とした左右対称の正規分布になってもおかしくありませんが、やはり人の心理には偏りがあるため右に裾の長い分布となっています(下にヒストグラムを掲載しました)。
不人気な数値の定義
piv_value <- df |>
summarise(n_degree = n(), .by = "value") |>
arrange(value) |>
mutate(n_cumsum = cumsum(n_degree)) |>
mutate(n_cum_pct = n_cumsum / n) |>
mutate(n_people = value * n_degree) |>
mutate(people_cumsum = cumsum(n_people)) |>
mutate(people_cum_pct = people_cumsum / n_applicants)
> print(piv_value, n = 13)
# A tibble: 109 × 7
value n_degree n_cumsum n_cum_pct n_people people_cumsum people_cum_pct
<dbl> <int> <int> <dbl> <dbl> <dbl> <dbl>
1 0 1 1 0.001 0 0 0
2 1 2 3 0.003 2 2 0.0000695
3 2 3 6 0.006 6 8 0.000278
4 3 17 23 0.023 51 59 0.00205
5 4 16 39 0.039 64 123 0.00427
6 5 23 62 0.062 115 238 0.00827
7 6 27 89 0.089 162 400 0.0139
8 7 33 122 0.122 231 631 0.0219
9 8 27 149 0.149 216 847 0.0294
10 9 26 175 0.175 234 1081 0.0375
11 10 33 208 0.208 330 1411 0.0490
12 11 29 237 0.237 319 1730 0.0601
13 12 27 264 0.264 324 2054 0.0713
# ℹ 96 more rows
# ℹ Use `print(n = ...)` to see more rows
応募者数のヒストグラムがきれいな正規分布ではないので、不人気の定義はかなり悩ましかったですが、不人気な数字の下位25パーセンタイルで線を引くことにしました。離散分布なので、実質的には下位23.8パーセンタイル、投票数が11以下の数字を不人気とします。不人気数に投票した人の割合は全体の約6%となり、これも妥当と考えて話を進めます。 期待値となる応募者28の部分に紫の破線を引き、不人気数字の応募者の部分をピンクに塗りつぶしたのが下記のグラフです。
threshold <- piv_value |>
filter(n_cum_pct < threshold_rate) |>
arrange(desc(n_cum_pct)) |>
slice(1) |>
pull(value)
> threshold
[1] 11
g <- ggplot(df, aes(x = value))
g <- g + geom_rect(xmin = 0, xmax = threshold, ymin = 0, ymax = Inf, fill = "pink", alpha = 0.5)
g <- g + geom_histogram(binwidth = 1, fill = "blue", color = "black")
g <- g + geom_vline(xintercept = n_expected, color = "purple", linetype = "dashed")
g <- g + labs(title = "Histogram of Values with Mean", x = "Value", y = "Frequency")
plot(g)
どのような数字が不人気になりやすいか?
「どんな数字が不人気?」と生成AIに投げてみたいところをぐっと我慢して、私の独断と偏見で次の分析をしてみました。
- 100の位、10の位、1の位、それぞれの不人気数
- 「同じ数字が2回以上使われているとき(例:110、311、525)は不人気ではないか」を検証
例:100の位が0の場合
| unpopular | not_unpopular | total | |
|---|---|---|---|
| 000-099 | 39 | 61 | 100 |
| 100-999 | 198 | 702 | 900 |
| total | 237 | 763 | 1,000 |
全体の中で不人気と定義したのは前述のとおり全体の23.7%ですが、100の位が0の数字の不人気率は39%とだいぶ高くなっています。これが有意に高率なのかを、フィッシャーの正確確率検定の片側検定、有意水準$\alpha = 0.05$で検定します。フィッシャーの正確確率検定はp値が直接算出されるので、それを利用します。
fisher_alt <- "greater"
fisher.test(df_work, alternative = fisher_alt, conf.level = 0.95)
Fisher's Exact Test for Count Data
data: df_work
p-value = 0.0002262
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
1.534901 Inf
sample estimates:
odds ratio
2.264612
オッズ比が1を超え、p値は0.0002262なので、100の位が0の数字は有意に不人気率が高いということになります。
例:3桁の数字の中に同じ数が2回以上含まれる場合
| unpopular | not_unpopular | total | |
|---|---|---|---|
| 同じ数が2回以上 | 136 | 144 | 280 |
| それ以外 | 101 | 619 | 720 |
| total | 237 | 763 | 1,000 |
こちらの不人気率は$\dfrac{136}{280} = 48.6\%$と、見た目から有意そうです。
fisher.test(df_work2, alternative = fisher_alt, conf.level = 0.95)
Fisher's Exact Test for Count Data
data: df_work2
p-value < 2.2e-16
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
4.384653 Inf
sample estimates:
odds ratio
5.775502
オッズ比が5.78でp値は極めて低く、不人気ぶりが明らかです。人間はランダムの数を選ぶとき、同じ数が重複するのを避ける傾向にあるようです。
このような処理をmap()で繰り返しで実施した結果、有意に不人気だったのは以下の条件でした。
> df_unpopular
# A tibble: 13 × 4
range item p_value unpopular_rate
<chr> <dbl> <dbl> <dbl>
1 range1 0 2.26e- 4 0.39
2 range1 9 5.74e- 8 0.47
3 range2 4 2.39e- 3 0.36
4 range2 5 4.86e- 2 0.31
5 range2 6 1.14e- 3 0.37
6 range2 7 1.67e- 2 0.33
7 range2 8 2.39e- 3 0.36
8 range2 9 5.18e- 6 0.43
9 range3 0 1.22e- 9 0.5
10 same_2 1 1.33e-28 0.486
11 same_100_10 1 1.22e- 9 0.5
12 same_10_1 1 5.97e- 7 0.45
13 same_100_1 1 3.75e- 5 0.41
rangexはx桁目の数字、same_2は同じ数字が2回以上使われた場合、same_100_10は100の位と10の位が同じ数の場合、same_10_1は10の位と1の位が同じ数の場合、same_100_1は100の位と1の位が同じ数の場合を指しています。item列が該当する数値で、same_2以降の列は該当の場合は1、非該当は0のダミー変数です。
分かりづらいので不人気な数をまとめると
- 100の位が0か9
- 10の位が4~9
- 1の位が0
- 同じ数字が2回以上使われるともれなく不人気
ということになります。1の位が0というのは、安住アナの「切り番は不人気」との指摘と整合しています。また、月は31日まであるので、10の位が0~3は人気になりやすく、相対的に4~9が不人気になるということでしょう。
来年応募する数字は?
この記事をどのくらいの人が見るかによって不人気ぶりは変化すると思いますが、すべての条件に合致する990、090を本命としたいと思います。なお、今年の結果では990は5名、090は8名でした。
nが28000を超えているので、ロトだけでなく結構汎用的に使えるのではないかと自負しております。ご活用くださいませ。
