2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

安住紳一郎の日曜天国「にち10ミニマムロト3」の不人気数をRで統計学的に検証する

Posted at

不人気の数を探して来年応募するという野望

 TBSラジオ 安住紳一郎の日曜天国にて年に1回ミニロトが行われています。昨年までは0~99の数字の中から選んで応募、当選したらプレゼント、というのが企画概要ですが、今年は0~999の1000個の数字の中から選ぶ形式に変わりました。どの数字を選んでも当選確率は1000分の1ですが、当選者数によってプレゼントのグレードが変わるので、できれば応募者数の少ない数を選びたいものです。今年の企画は終わりましたが、来年に向けて不人気の数字をRを使って統計学的に検証してみようというのが本記事の趣旨です。

まずは記述統計から

 まずは画像から0~999の応募人数を入力しました。エクセルの画像変換機能で表を作ろうとしましたが、解像度が悪く、ほとんど入力確認しながらの作業でした。この作業が一番大変だったかも。上記リンク先githubからcsvファイル並びにRコードをダウンロードできるようにしてあります。

nichiten_map_20250622.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で応募する、というのがおそらくもっとも賢明な判断ですが、それでは面白くないので、統計学的手法を使って検証します。

nichiten_map_20250622.R
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となります。本来であればここを頂点とした左右対称の正規分布になってもおかしくありませんが、やはり人の心理には偏りがあるため右に裾の長い分布となっています(下にヒストグラムを掲載しました)。

不人気な数値の定義

nichiten_map_20250622.R
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の部分に紫の破線を引き、不人気数字の応募者の部分をピンクに塗りつぶしたのが下記のグラフです。

nichiten_map_20250622.R
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)

histgram.png

どのような数字が不人気になりやすいか?

 「どんな数字が不人気?」と生成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値が直接算出されるので、それを利用します。

nichiten_map_20250622.R
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\%$と、見た目から有意そうです。

nichiten_map_20250622.R
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()で繰り返しで実施した結果、有意に不人気だったのは以下の条件でした。

nichiten_map_20250622.R
> 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を超えているので、ロトだけでなく結構汎用的に使えるのではないかと自負しております。ご活用くださいませ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?