TeX Alchemist Online

TeX のこと,フォントのこと,Mac のこと

相関係数格付けチェックを作る ~目指せ相関係数ソムリエ!~

この記事は TeX & LaTeX Advent Calendar 2023 の18日目の記事です。17日目はYarakashi_Kikohshiさんでした。 19日目は7danmoroboshiさんです。


【目次】


大学入学共通テストの新傾向問題と言えば……!?

旧「大学入試センター試験」が「大学入学共通テスト」に変わってしばらく経ちました。当初予定されていた記述試験導入は見送られましたが,大学入学共通テストになって,旧センター試験には見られなかった癖の強い出題がなされるようになりました。その最たるものが,昨年の大学入学共通テストで話題になった 相関係数格付けチェック です。

※ 原題 → 2022年大学入学共通テスト数学I・A

4択問題のうち,2つの選択肢は平均値などから消去法で消せるのですが,この2択まで絞れてからは,もはや「見た目から勘で選ぶ」しかありません。

共通テスト対策をするには,相関係数ソムリエを目指さねばならないということですね……。

なお,この問題については,Python で画像認識をすることで解くというアプローチもなされています。 vigne-cla.com

TeX & LaTeX Advent Calendar 202311日目には,TeX言語でメルセンヌ・ツイスターが実装されたりと,最近TeX界で乱数が熱いですね!というわけで,TeXエンジンによる疑似乱数生成を利用して, 相関係数格付けチェック対策教材全自動生成することを目指すこととしましょう。

検討ポイント

乱数生成アルゴリズムの選択

先日のTeX言語によるメルセンヌ・ツイスターの実装は魅力的です。ただし,今回の目的では,正規分布に従う乱数の方が都合が良い *1 ということもあり,TeXエンジンにビルトインされた正規乱数生成プリミティブである \pdfnormaldeviate(pdfTeX / e-pTeX / e-upTeX の場合)/ \normaldeviate‌(LuaTeX / XeTeX の場合)を使うことにしました。これは,平均値 0,標準偏差 65536 の正規分布に従う整数値乱数を生成する完全展開可能なプリミティブです。

「指定された相関係数を持つ2つの乱数列」をいかにして生成するか?

\pdfnormaldeviate を連発してランダムな点 $(X,Y)$ の座標をプロットしまくれば,とりあえず散布図はランダム生成できますが,それでは相関係数がほぼ0の散布図ばかり生成されてしまいます。そうではなくて,「相関係数が約0.63になる散布図を作る」のように,目標となる相関係数を指定して,それに従った散布図を生成したい,という状況です。

このような場合には,次の定理が有効です。

定理

確率変数 $X$ と $Y$が

  • 独立
  • 平均が0
  • 同じ標準偏差 $\sigma$ を持つ

であるとする。このとき,$\rho\in[-1,1]$ に対し, $$ Z= \rho X+ \sqrt{1 - {\rho}^2 } Y$$ として確率変数 $Z$ を定義すると,$Z$ は $X$,$Y$ と同じ平均・標準偏差を持ち,また $X$ と $Z$ は相関係数 $\rho$ で相関する。

証明

$E(X)=E(Y)=0$ のとき $E(Z)=0$ となるのは明らか。

$$V(Z) =V (\rho X+ \sqrt{1 - {\rho}^2 } Y) = {\rho}^2V(X) + (1 - {\rho}^2) V(Y) = {\rho}^2{\sigma}^2 + (1 - {\rho}^2) {\sigma}^2={\sigma}^2$$

より,$Z$ の標準偏差が $\sigma$ になることも分かる。

共分散 $\text{Cov}(X,Z)$ については,一般に $\text{Cov}$ について成り立つ性質 $$\text{Cov}(X,aY+bZ) = a\text{Cov}(X,Y) + b\text{Cov}(X,Z) $$ を用いて, $$ \text{Cov}(X,Z) = \text{Cov}(X, \rho X+ \sqrt{1 - {\rho}^2 } Y) = \rho \text{Cov}(X, X) + \sqrt{1 - {\rho}^2 } \text{Cov}(X, Y) = \rho {\sigma}^2 $$ となる。($X$ と $Y$ は独立なので $\text{Cov}(X, Y)=0$ となる。)

よって $X$ と $Z$ の相関係数は $$ \frac{\text{Cov}(X,Z)}{\sqrt{V(X)}\sqrt{V(Z)}}=\frac{\rho {\sigma}^2 }{\sigma\cdot\sigma} = \rho $$ となる。■

(一般には,平均0で標準偏差が等しい独立な $n$ 個の確率変数列 $(X_1,\ldots,X_n)$ があるとき,これに対して与えられた相関行列 $R$ で相関する $n$ 個の確率変数列 $(Z_1,\ldots,Z_n)$ は,正定値実対称行列 $R$ をコレスキー分解することで構成できることが知られています。今回の $Z$ の構成法はその $n=2$ の特別な場合にあたります。次の記事が参考になります。)

qiita.com

qiita.com

なお,元となる $X$ と $Y$ が独立に標準正規分布 $N(0,1)$ に従う場合,$ Z= \rho X+ \sqrt{1 - {\rho}^2 } Y$ で定義される確率変数 $Z$ も,標準正規分布 $N(0,1)$ に従います。これは正規分布の再生性と呼ばれる性質から従います。正規分布の再生性は,独立な確率変数の和の確率密度関数がそれぞれの確率密度関数のたたみ込み(convolution)で書けることから導けます。

注意:生成した乱数列の相関係数は再測定が必要

\pdfnormaldeviate によって $(X,Y)$ を生成し,ここから $Z=\rho X+ \sqrt{1 - {\rho}^2 } Y$ を作って,$(X,Z)$ の散布図を描けば,理論上は相関係数が $\rho$ の散布図が得られるはずです。ただし,実際には数十個の点を生成するだけですので,生成したその数十個の点が,ちょうど相関係数 $\rho$ になっているわけではありません。あくまで「相関係数がおよそ $\rho$」に過ぎません。ですので,格付けチェック問題として出題するからには,散布図を1つ生成するごとに,「その散布図の実際の相関係数」を再測定する必要があります

相関係数格付けチェック問題ランダム生成のアルゴリズム

以上を考慮して,次の方針で問題ランダム生成を実装することとしましょう。

  1. まず,0以上1以下の実数値の一様乱数 $\rho$ を1つとる。
  2. 相関係数が $\rho$ となることを目指して,上記のアルゴリズムによって $n$ 個の点 $(X_1,Z_1),\ldots,(X_n,Z_n)$ を生成する。$X_i$ と $Z_i$ はそれぞれ標準正規分布 $N(0,1)$ に従う。
  3. TikZ を用いて,$n$ 個の点 $(X_1,Z_1),\ldots,(X_n,Z_n)$ の散布図を生成する。
  4. 生成した $(X_1,Z_1),\ldots,(X_n,Z_n)$ の実際の相関係数 $r$ を測定する。
  5. 生成したTikZ散布図 $T$,相関係数(実測値)$r$ の組 $(T, r)$ を「1つの散布図ストック」とする。
  6. 1.~5. を十分な回数 $N$ 回繰り返して,散布図ストック $S = \{(T_1, r_1),\ldots,(T_N, r_N) \} $ を十分な個数だけ蓄える。
  7. 次に,格付けチェック問題の難易度を調整するため,「相関係数の差が $m$ 以上 $M$ 以下の2つの散布図」の組をたくさん選び出したい。
  8. そこで,散布図ストック $S$ の中から,ランダムに2つの散布図 $(T_i, r_i), (T_j, r_j)$ を選ぶ。
  9. $m \leqq |r_i - r_j| \leqq M$ が満たされるならば,添字の組 $(i,j)$ を問題として採用し,問題群 $U$ に収録する。満たさない場合は「難易度が不適切」ということで不採用問題として破棄する。
  10. 問題群 $U$ に十分な個数の問題が蓄えられるまで,8.と 9. のステップを繰り返す。
  11. 問題群 $U$ の各問題について,0 or 1のいずれかをとる乱数を生成し,「左右どちらが正解か」を選ばせる問題として出題する。

このように,この問題生成アルゴリズムでは,途中に乱数生成が何重にも絡みます。

  • 生成する散布図において目標となる相関係数を決めるための乱数生成
  • 散布図の中の1点の座標 $(X,Z)$ を決めるための乱数生成
  • 散布図ストックの中から,2つの散布図をランダムに選び出して比較問題を作るための乱数生成
  • 選び出された2つの散布図の,左右どちらを正解とするかを決めるための乱数生成

このように,TeXによる乱数生成の恩恵を大いに受けることで,大学入学共通テスト対策教材が作成できる,というわけです。これもまた学習塾でのLaTeX活用の一例と言えるでしょう。

doratex.hatenablog.jp

実装言語

このように込み入ったアルゴリズムを生のTeX言語で実装するのはあまりにも苦行と思われるので,今回は慣れない expl3 を使って実装しました。expl3 は,見た目はとっつきにくいですが,(生のTeX言語と比較すれば相対的に)普通のプログラミング言語に近くて直観的に扱いやすいので,こういう凝ったことを実現するときには重宝しますね。

完成品

ユーザが指定できるパラメータ

\int_const:Nn \l_kakuduke_num_of_problems_int{100} % 最終的に生成する問題数
\int_const:Nn \l_kakuduke_num_of_stocks_int{300} % 生成する散布図のストック数
\int_const:Nn \l_kakuduke_num_of_points_int{29} % 1つの散布図の中のサンプル数

\fp_const:Nn \l_kakuduke_min_diff_fp{0.2} % 問題として出題される2つの散布図の相関係数の差の最小値
\fp_const:Nn \l_kakuduke_max_diff_fp{0.4} % 問題として出題すると2つの散布図の相関係数の差の最大値

例えばこのパラメータですと,

  • 最終的に100問の問題を生成します。(問題・解答1ページずつなので200ページのPDFとなります。)
  • 散布図ストックを300個生成して,その中から2つの散布図を選んで比較させる問題を出題します。
  • 1つの散布図の中のサンプル数は29です。
  • 「相関係数の差が0.2以上0.4以下の2つの散布図を比較させる問題」のみを出題対象とします。ここの数値を調整することで,教材の難易度調整ができます。

なお,サンプル数を29に指定したのは,Pythonによる画像認識の解析結果によると,大学入学共通テストの原題の散布図のサンプル数は29のようでしたので,それに合わせたものです。(この画像認識によると,原題の散布図の相関係数は,左が0.435,右が0.631と,その差は0.2を切っています。相関係数ソムリエへのハードルは高いですね……!)

完成PDF・TeXソース

完成PDFおよびTeXソースを,Gistにアップロードしておきました。パラメータを調整するなどして,各自でオリジナルの相関係数格付けチェック教材を生成し,相関係数ソムリエを目指しましょう!

*1:一様乱数から正規乱数はボックス=ミュラー変換で変換できますが,今回のメルセンヌ・ツイスターのために実装された符号無し32ビット整数には,除算などの凝った演算は定義されていないようでしたので,ボックス=ミュラー変換の実装をするのはちょっと大変そうです。