Python3エンジニア認定データ分析試験 第2章 数学の基礎 予想問題と解説
Python3エンジニア認定データ分析試験「第2章 数学の基礎」の予想問題を12問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
確率と統計(代表値・ばらつき)、線形代数(行列積・逆行列・行列式・連立方程式・固有値)などを扱う分野です。全12問(基礎7問・標準3問・応用2問)を収録しています。
- 確率と統計(代表値・ばらつき)
- 線形代数(行列積・逆行列・行列式・連立方程式・固有値)
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- statistics.median の偶数個データでの結果。[1, 3, 5, 7] では中央の2値の算術平均で 4.0 になる。小さい方を返す median_low は 3、大きい方を返す median_high は 5 で、この2つは平均を取らないため結果は必ずデータに含まれる値になる。
- mode で最頻値が複数あるときの挙動。Python 3.8 以降は最初に現れた最頻値を返し、以前の StatisticsError にはならない。すべての最頻値をリストで得たいときは multimode を使う。
- 母分散と標本分散の関数の取り違え。statistics では pvariance が母分散、variance が標本分散(Bessel 補正済みで N-1 で割る)を返す。pstdev と stdev は分散ではなく標準偏差である。
- np.var の除数。np.var は N - ddof を除数にし、ddof の既定値は 0 なので既定では N で割る。N-1 で割る標本(不偏)分散にしたいときは ddof=1 を指定する。statistics.variance とは既定の割り方が違う。
- 行列積と要素ごとの積の取り違え。NumPy の * は要素ごとの積で、行列積は @ 演算子か dot で行う。同じ A と B でも A * B は [[2, 0], [0, 4]]、A @ B は [[5, 4], [3, 4]] と結果が異なる。
- 線形代数関数の返り値と例外。np.linalg.det([[1, 2], [3, 4]]) は ad - bc で -2.0 となり、LU 分解で計算されるため整数ではなく浮動小数点数で返る。逆行列を持たない行列に np.linalg.inv を使うと LinAlgError になり、零配列や nan 配列は返らない。
- np.dot の次元による結果の違い。ともに1次元配列なら内積でスカラーを返し、[1, 2, 3] と [4, 5, 6] では 32 になる。[4, 10, 18] は x * y の結果である。np.linalg.eig の固有ベクトルは長さ1に正規化されて列に格納され、eigenvectors[:, i] が eigenvalues[i] に対応する。
この章に関連する比較記事
混同しやすい2つの概念を並べて整理した記事です。
よくある質問
Q第2章 数学の基礎は何問収録されていますか?
現在12問を収録しています。内訳は基礎7問・標準3問・応用2問です。
Q第2章 数学の基礎の頻出論点は何ですか?
確率と統計(代表値・ばらつき)、線形代数(行列積・逆行列・行列式・連立方程式・固有値)などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
statistics.median([1, 3, 5, 7]) の結果はどれか。
答えと解説を見る
正解は 4.0 である。公式ドキュメントは、データ数が偶数のときの median は中央の2値の算術平均を返すと説明しており、[1, 3, 5, 7] では (3 + 5) / 2 で 4.0 になる。データ数が奇数なら中央の値がそのまま返る。3 は偶数個のとき小さい方の中央値を返す median_low の結果で、5 は大きい方を返す median_high の結果である。2 は中央の値ではなく、平均を取る対象にも含まれない。median は平均を取るので結果が小数になる点が、この2関数との違いである。
Python公式ドキュメント日本語版 statistics(https://docs.python.org/ja/3/library/statistics.html) の median の項
データ [1, 3, 5, 7] に対する statistics.median_low と statistics.median_high の結果の組み合わせとして正しいものはどれか(順に median_low, median_high)。
答えと解説を見る
正解は 3, 5 である。公式ドキュメントでは、データ数が偶数のとき median_low は中央の2値の小さい方、median_high は大きい方を返す。[1, 3, 5, 7] の中央の2値は 3 と 5 なので、median_low は 3、median_high は 5 になる。この2つの関数は平均を取らないため、返す値は必ずデータに含まれる値である。4.0 は median が返す平均値であり、組み合わせが逆の 5, 3 は low と high を取り違えたものである。
Python公式ドキュメント日本語版 statistics(https://docs.python.org/ja/3/library/statistics.html) の median_low・median_high の項
statistics.mode([1, 1, 2, 3, 3, 3, 3, 4]) の結果はどれか。
答えと解説を見る
正解は 3 である。公式ドキュメントは、mode は離散データや名義尺度データの最頻値を1つ返すと述べ、この例で結果が 3 になることを示している。3 は4回現れ、1 の2回より多い。最頻値が同数で複数ある場合、Python 3.8 以降は最初に現れたものを返す。以前のバージョンでは StatisticsError になっていたが、現在はそうならない。すべての最頻値を得たいときは multimode を使う。まず出現回数を数えることが判定の出発点になる。
Python公式ドキュメント日本語版 statistics(https://docs.python.org/ja/3/library/statistics.html) の mode の項
statistics.mode で最頻値が複数あるデータ(同じ回数で現れる値が複数ある)を扱ったとき、Python 3.8 以降の挙動と、すべての最頻値を得る方法の記述として正しいものはどれか。
答えと解説を見る
正解は、最初に現れた最頻値が返り、multimode ならすべてがリストで得られるという記述である。公式ドキュメントは、同数の最頻値が複数あるとき mode は最初に現れたものを返し、この挙動は Python 3.8 で変わったと述べる。以前は StatisticsError だった。multimode は最頻値のリストを返す。値の大小や平均値との近さで選ぶ仕様ではないので、大きい方や小さい方、平均値に近い方を選ぶという記述は誤りである。
Python公式ドキュメント日本語版 statistics(https://docs.python.org/ja/3/library/statistics.html) の mode・multimode の項
データ全体が母集団であるとき母分散を求める関数と、標本から不偏推定量としての分散を求める関数の組み合わせとして正しいものはどれか(順に母分散, 標本分散)。
答えと解説を見る
正解は statistics.pvariance と statistics.variance である。公式ドキュメントは、pvariance が母分散、variance が標本分散を返すと説明している。variance は Bessel 補正済み(自由度 N-1)の分散で、データ点が代表的であれば母分散の不偏推定量になる。pstdev と stdev は分散ではなく標準偏差(分散の平方根)を返す関数なので、分散を求める組み合わせではない。
Python公式ドキュメント日本語版 statistics(https://docs.python.org/ja/3/library/statistics.html) の pvariance・variance の項
NumPy の np.var について、分散の計算に使う除数と ddof の説明として正しいものはどれか。
答えと解説を見る
正解は、除数が N - ddof で、ddof の既定値が 0 のため既定では N で割るという説明である。公式リファレンスは、np.var が N - ddof を除数として分散を計算し、ddof の既定値は 0 だと述べる。標本分散(不偏分散)として N-1 で割りたいときは ddof=1 を指定する。N-1 は Bessel の補正と呼ばれる。statistics.variance が N-1 で割るのとは既定が異なるため、混同しないことが大切である。
NumPy公式リファレンス numpy.var(https://numpy.org/doc/stable/reference/generated/numpy.var.html)
NumPy で A = np.array([[1, 2], [3, 4]]) のとき、np.linalg.det(A) の結果はどれか。
答えと解説を見る
正解は -2.0 である。公式ドキュメントでは、2次元配列 [[a, b], [c, d]] の行列式は ad - bc とされ、この配列の例では -2.0 になる。1×4 - 2×3 = -2 と計算できる。2.0 は符号を逆にした値、10.0 は成分の和、-5.0 は成分の差の取り違えである。なお行列式は LU 分解で計算されるため、結果は整数ではなく浮動小数点数で返る。式の順序(対角の積から反対角の積を引く)を押さえておけば暗算で判定できる。
NumPy公式リファレンス numpy.linalg.det(https://numpy.org/doc/stable/reference/generated/numpy.linalg.det.html) の記述
NumPy で、逆行列を持たない(特異な)正方行列 a に対して np.linalg.inv(a) を実行したときの動作として正しいものはどれか。
答えと解説を見る
正解は LinAlgError が発生する、である。公式ドキュメントによれば、np.linalg.inv は a が正方でない場合、または逆行列の計算に失敗した場合に LinAlgError を出す。特異と検出された場合も同様である。零配列や nan 配列を返す仕様はない。なお条件数が悪い(ill-conditioned)行列では LinAlgError が出るとは限らず、浮動小数点の誤差で不正確な結果になることがある点は別に押さえておく。
NumPy公式リファレンス numpy.linalg.inv(https://numpy.org/doc/stable/reference/generated/numpy.linalg.inv.html) の記述
NumPy で a が正方行列で逆行列を持つとき、ainv = np.linalg.inv(a) について公式ドキュメントが示す関係として正しいものはどれか。
答えと解説を見る
正解は、a @ ainv と ainv @ a がどちらも np.eye(a.shape[0]) になる、である。公式ドキュメントは a @ ainv = ainv @ a = eye(a.shape[0]) と記している。* は要素ごとの積であり、行列積ではないため、単位行列にはならない。逆行列は左から掛けても右から掛けても単位行列になる点が定義の要である。和では単位行列にならず、片側だけで成り立つという記述も公式の内容と合わない。判定では、演算が行列積の @ であることと、左右両方で成り立つことの2点を確認する。
NumPy公式リファレンス numpy.linalg.inv(https://numpy.org/doc/stable/reference/generated/numpy.linalg.inv.html) の記述
NumPy で x = np.array([1, 2, 3]) と y = np.array([4, 5, 6]) がともに1次元配列のとき、np.dot(x, y) の結果はどれか。
答えと解説を見る
正解は 32 である。公式ドキュメントでは、np.dot はともに1次元配列ならベクトルの内積になり、戻り値はスカラーとされている。1×4 + 2×5 + 3×6 = 32 と計算できる。[4, 10, 18] は x * y の要素ごとの積であり、np.dot の結果ではない。ValueError は a の最後の次元と b の最後から2番目の次元の大きさが合わない場合に出るもので、この例は該当しない。まず次元数を確認し、次に積を足し合わせる手順で判定する。
NumPy公式リファレンス numpy.dot(https://numpy.org/doc/stable/reference/generated/numpy.dot.html) の記述
A = np.array([[1, 1], [0, 1]])、B = np.array([[2, 0], [3, 4]]) のとき、A @ B の結果はどれか。
答えと解説を見る
正解は [[5, 4], [3, 4]] である。NumPy 公式チュートリアルでは、この A と B について、A * B は要素ごとの積で [[2, 0], [0, 4]]、行列積は @ 演算子(Python 3.5 以上)か dot で行い [[5, 4], [3, 4]] になると示されている。行列積の第1行は 1×2+1×3=5 と 1×0+1×4=4 である。[[2, 0], [0, 4]] は * の結果で、行列積ではない。
NumPy公式チュートリアル Quickstart(https://numpy.org/doc/stable/user/quickstart.html) の基本操作の項
np.linalg.eig(a) の戻り値の説明として公式ドキュメントの記述に合うものはどれか。
答えと解説を見る
正解は、固有ベクトルは正規化されており列 eigenvectors[:, i] が固有値 eigenvalues[i] に対応する、である。公式ドキュメントは、固有値は必ずしも順序づけられていないこと、固有ベクトルは長さ1に正規化され列で格納されることを記している。また実行列の固有値は実数か共役複素数のペアで現れ、np.array([[1, -1], [1, 1]]) の固有値は 1+1j と 1-1j である。したがって昇順、行格納、常に実数という記述はいずれも誤りになる。
NumPy公式リファレンス numpy.linalg.eig(https://numpy.org/doc/stable/reference/generated/numpy.linalg.eig.html) の記述