ブログ

seabornを利用したデータ可視化(data visualization)の基礎

データの可視化(data visualization)は、データを様々な角度から確認し、データ自体を理解する目的で行われることが多い印象です。探索的データ分析(EDA)と呼ばれることもあります。Pythonを使ってデータを可視化する際に、matplotlibがよく使われていると思います。ですが、matplotlibだけで綺麗で複雑な図を作成するのは難しいことが多いです。 ここでは、matplotlibベースのデータ可視化ライブラリであるseabornの基礎をまとめます。

seabornを利用することで、簡単に綺麗な図を作ることができます。

seaborn

seabornは、Pythonのデータ可視化(data visualization)ライブラリです。matplotlibをベースにしており、レイアウトの指定をしておくと、matplotlibで描くグラフがそれだけで綺麗になります。また、複数のプロットを組み合わせたグラフなどを描画する高度なAPIも提供されています。

詳細は以下の公式ドキュメントを参照してください。公式ドキュメントにあるGallaryを眺めるだけでも楽しいですし、どんなことができるのかわかると思います。

https://seaborn.pydata.org/

seabornの導入

インストール

インストールはpip を利用できます。詳細は下記の公式インストールドキュメントを参照してください。

https://seaborn.pydata.org/installing.html

pipでインストールをするには下記のコマンドを実行します。

pip install seaborn

seabornはじめの一歩

seabornの基本的な利用方法として下記の例を紹介します。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme()

xs = np.random.normal(size=500)
plt.hist(xs);

matplotlibでヒストグラムを描画しています(matplotlibでのヒストグラムの描画についてはこちらを参照ください)。こちらのコードを実行すると以下のような図が描画されます。

こちらにあるようなmatplotlibを使った通常のグラフと配色などが異なりますね。こちらについて解説します。

import seaborn as sns

この行でseabornをimportしています。

sns.set_theme()

このコマンドによって、本プロセスにおけるmatplotlibseabornで描画する全てのグラフのテーマを設定します。そのため、matplotlibで描画したヒストグラムの配色等が変わってきています。なお、ここでは引数に何も入れていないので、デフォルトテーマが使われます。

詳しくは、以下の公式ドキュメントを参照してください。

https://seaborn.pydata.org/generated/seaborn.set_theme.html

テーマについては、本稿の「レイアウトの指定」にも簡単な解説を記載しています。

基本的なグラフ描画

上記の通り、seabornをインポートしてテーマを設定するだけで、matplotlibで描画するグラフの見た目が改善されます。これだけでもseabornを利用する効果はあるのですが、ここでは、seabornで描画できるグラフの例をいくつか紹介します。

散布図

散布図(lmplot)

ヒストグラム(KDE)

棒グラフ

seabornで特徴的なグラフ描画

散布図行列: pairplot

多変量データのうち二変数同士の組み合わせで散布図を描画することで、どの変数間に相関があるのかを確認する目的で「散布図行列」というものを描くことが多いです。散布図行列をmatplotlibで愚直に描画するには、sub_plotを駆使する必要があり、複雑になります。seabornには、seaborn.pairplotが提供されており、散布図行列を容易に描画することができます。

詳細は以下のドキュメントを確認してください。

データとしてpandas.DataFrame形式のデータが用意できれば、そのデータを入力するだけです。例として、irisデータセットの散布図行列を描画します。

import seaborn as sns

df_iris = sns.load_dataset("iris")
sns.pairplot(df_iris);

上記のコードを実行すると下記のようなグラフが描画されます。

irisデータセットは、4つの数値データとあやめ(iris)の種類を表す列(species)で構成されます。なお、データセットの取得(seaborn.load_dataset)については、後述の「豊富なデータセット」を確認してください。

species列はobject型(カテゴリデータ)なので、その他の4つの変量の2つの組み合わせの散布図が描画されています。対角成分には、各変量のヒストグラムが描かれています。

seaborn.pairplotのオプションパラメータとして、hueでカテゴリ変数を指定すると、指定したカテゴリで色分けがされます。

df_iris = sns.load_dataset("iris")
sns.pairplot(df_iris, hue="species");

上記のコードを実行すると以下のような図が描画されます。

アヤメの種類の分類に寄与する変量としてどのようなものが適切か容易に確認できます。

[参考]

jointplot

heatmap

覚えておくと良いポイント

レイアウトの指定

seabornでは、グラフの配色やフォントサイズなどを一括で変更できる seaborn.set_theme が提供されています。詳細は公式ドキュメントを参照ください。ここでは、よく使うcontextstylepalette について解説します。

context

contextは、描画要素のスケールを指定します。

設定はプリセットを呼び出す形式で、「paper, notebook, talk, poster」のいずれかを入力します。デフォルトはnotebookが選択されます。

paper, notebook, talk, posterの順にスケールが拡大されていきます。

sns.set_theme()
xs = np.random.normal(size=500)
plt.hist(xs);

このコードを実行すると下記のグラフが描画されます。

次に、talkを指定してみます。

sns.set_theme(context="talk")
plt.hist(xs);

下記のようなグラフが描画されます。

フォントサイズが変わっているのがわかります。

style

styleは描画の背景の色やグリッド線の有無などを指定するプリセットが用意されています。

指定できるパラメータは、darkgrid, whitegrid, dark, white, ticks で、デフォルトでは、darkgridが指定されます。

例として、whitegridを指定する場合は下記のようになります。

sns.set_theme(style="whitegrid")
plt.hist(xs);

上記コードを実行すると下記のようなグラフが描画されます。

背景色が白になります。

palette

paletteでは、カラーパレットを指定できます。

指定できる値は、seabornのパレット名(deep, muted, bright, pastel, dark, colorblind)、matplotlibのカラーマップ名(こちらを参照)などが指定できます。詳しくは公式ドキュメントを参照してください。

例として、以下のコードを紹介します。

sns.set_theme(palette="pastel")
plt.hist(xs);

上記コードを実行すると以下のような図が描画されます。

[参考]

カラーパレットの指定

カラーパレットは上記のように、全体のテーマを一括で設定できます。カラーパレットで指定される色はseaborn.color_paletteで取得できます。

複数のグラフをプロットする場合など、描画要素を追加する毎に自動で色が遷移します。しかし、色の指定を明示的にしたい場合には、以下のようにカラーコードを格納しておくと便利です。

c_list = sns.color_palette("deep").as_hex()
print(c_list)

上記のコードを実行すると、下記のような出力が得られます。

この例では、c_list変数にdeepで指定される10種類の色が16進数で格納されます。グラフを描画する際にこの値を指定できます(下記)。

x = [0, 1, 2, 3, 4, 5]
y1 = [0, 2, 1, 3, 2, 4]
y2 = [4, 2, 3, 1, 3, 2]
plt.plot(x, y1, color=c_list[2])
plt.plot(x, y2, color=c_list[1])

上記のコードを実行すると以下のような図が描画されます。

下記のようにリストのindexが色の種類の範囲を超えないように指定できます。(seabornに限った話ではありませんが)

n_color = len(c_list)
ys = np.random.normal(size=15)
for i, y in enumerate(ys):
    plt.bar(i, y, color=c_list[i%n_color])

上記のコードを実行すると下記のような図が描画されます。

色のローテーションができていることがわかります。

カラーパレットについてさらに詳しくは、以下のチュートリアルなどを参照してください。

[参考]

豊富なデータセット

seabornでは色々なデータセットが用意されており、それらのデータセットを取得できるAPIが提供されています。

例えば、有名なトイデータであるアヤメの種類に関するデータセット(iris)を取得するには下記のようにします。

iris = sns.load_dataset("iris")

これで、pandas.DataFrame形式でデータセットを取得することができます(下記)。

取得できるデータセットは、以下のリポジトリのCSVファイル名を指定できます。

https://github.com/mwaskom/seaborn-data

また、データセット名を取得するためのseaborn.get_dataset_namesも用意されています。

[参考]

まとめ

参考

MCMC法〜メトロポリス法・HMC・NUTS etc〜|問題演習で理解する統計学【19】

下記などで取り扱った、MCMCについて問題演習を通した理解ができるように問題・解答・解説をそれぞれ作成しました。

・標準演習$100$選
https://www.hello-statisticians.com/practice_100

基本問題

メトロポリス・ヘイスティングス法

ギブス・サンプリング

発展問題

最尤法・ベイズ推定・MCMCの活用

・問題
入門書などでのMCMC法の解説は通常の最尤法やベイズ推定と同時に取り扱われることが少ないので、この問題では以下、最尤法やベイズ推定と並行でMCMC法の基本的な流れを演習形式で具体的に確認を行う。下記の問いにそれぞれ答えよ。
i) ポアソン分布$\mathrm{Po}(\lambda)$に基づいて観測値$x_1,\cdots,x_n$が得られたと考えられる際に、パラメータ$\lambda$の推定を試みる。$x_1,\cdots,x_n$を元に尤度$L(\lambda)$を表せ。ポアソン分布の確率関数$p(x)$は下記のように表されることを用いて良い。
$$
\begin{align}
p(x) &= \frac{\lambda^{x} e^{-\lambda}}{x!} \\
&= \exp{(x \log{\lambda} – \lambda – \log{x!})}
\end{align}
$$

ⅱ) i)で確認を行なった尤度$L(\lambda)$を元に対数尤度$\log{L(\lambda)}$を計算し、$\lambda$で微分を行うことで$L(\lambda)$を最大にする$\lambda$を求めよ。
ⅲ) ⅱ)では最尤法に基づいて$\lambda$の点推定を行なったが、サンプルが少ない場合は$\lambda$の事前分布を元に事後分布を得るベイズ法を用いる場合が多い。ベイズ法を行う際にポアソン分布に基づく推定のようにシンプルな場合は共役事前分布を用いることで式変形に基づいて結果を得ることができる。
得られる観測値がポアソン分布に従う場合、パラメータ$\lambda$の共役事前分布はガンマ分布に従う。ガンマ分布$\mathrm{Ga}(\alpha,\beta)$の確率密度関数を変数$\lambda$に関して$f(\lambda)$とおくとき、$f(\lambda)$を表せ。
iv) パラメータ$\lambda$の事後分布を$P(\lambda|x_1,\cdots,x_n)$とおくとベイズの定理に基づいて$P(\lambda|x_1,\cdots,x_n) \propto L(\lambda)f(\lambda)$が成立する。i)とⅲ)の結果を用いて$P(\lambda|x_1,\cdots,x_n)$を計算し、$\lambda$の事後分布を答えよ。
v) ⅲ)、iv)ではパラメータ$\lambda$の共役事前分布$\mathrm{Ga}(\alpha,\beta)$を元に事後分布の導出を行なったが、実際は複雑な式を仮定することが多く共役事前分布が得られることが少ない。このような場合にMCMC法を用いる。
観測値$x_1=2, x_2=3, x_3=1$が得られた時、i)の式を目標分布、$\lambda$の初期値を$\lambda_0=2$、提案分布を$\lambda_{n+1} \sim \mathcal{N}(\lambda_{n},0.2^2)$とおく。このときMCMC法を用いて実際にサンプルを生成せよ。

・解答
i)
尤度$L(\lambda)$は下記のように表せる。
$$
\large
\begin{align}
L(\lambda) &= \prod_{i=1}^{n} p(x_i) \\
&= \prod_{i=1}^{n} \exp{(x_i \log{\lambda} – \lambda – \log{x_i!})} \\
&= \exp{\left( \sum_{i=1}^{n} (x_i \log{\lambda} – \lambda – \log{x_i!}) \right)}
\end{align}
$$

別解
下記のように表しても良い。
$$
\large
\begin{align}
L(\lambda) &= \prod_{i=1}^{n} p(x_i) \\
&= \prod_{i=1}^{n} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!} \\
&= \lambda^{\sum_{i=1}^{n} x_i} e^{-n \lambda} \left( \prod_{i=1}^{n} x_i! \right)^{-1}
\end{align}
$$

ⅱ)
対数尤度$\log{L(\lambda)}$は下記のように表せる。
$$
\large
\begin{align}
\log{L(\lambda)} &= \log{\left[ \exp{\left( \sum_{i=1}^{n} (x_i \log{\lambda} – \lambda – \log{x_i!}) \right)} \right]} \\
&= \sum_{i=1}^{n} (x_i \log{\lambda} – \lambda – \log{x_i!})
\end{align}
$$

上記を$\lambda$で偏微分を行うと下記が得られる。
$$
\large
\begin{align}
\frac{\partial \log{L(\lambda)}}{\partial \lambda} &= \frac{\partial}{\partial \lambda} \sum_{i=1}^{n} (x_i \log{\lambda} – \lambda – \log{x_i!}) \\
&= \sum_{i=1}^{n} \left( \frac{x_i}{\lambda} – 1 \right) \\
&= \frac{n(\bar{x}-\lambda)}{\lambda}
\end{align}
$$

上記の式変形にあたっては$\displaystyle \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i$を用いた。上記が$\lambda$に関して単調減少であることから、$\lambda=\bar{x}$で$\log{L(\lambda)}$は最大値を取る。よって$L(\lambda)$を最大にする$\lambda$は$\lambda=\bar{x}$である。

ⅲ)
変数$\lambda$に関する確率密度関数$f(\lambda)$は下記のように表せる。
$$
\large
\begin{align}
f(\lambda) = \frac{1}{\beta^{\alpha} \Gamma(\alpha)} \lambda^{\alpha-1} \exp{\left( -\frac{\lambda}{\beta} \right)}
\end{align}
$$

iv)
パラメータ$\lambda$の事後分布$P(\lambda|x_1,\cdots,x_n) \propto L(\lambda)f(\lambda)$は下記のように計算できる。
$$
\large
\begin{align}
P(\lambda|x_1,\cdots,x_n) & \propto L(\lambda)f(\lambda) \\
&= \lambda^{\sum_{i=1}^{n} x_i} e^{-n \lambda} \left( \prod_{i=1}^{n} x_i! \right)^{-1} \times \frac{1}{\beta^{\alpha} \Gamma(\alpha)} \lambda^{\alpha-1} \exp{\left( -\frac{\lambda}{\beta} \right)} \\
& \propto \lambda^{\alpha + \sum_{i=1}^{n} x_i – 1} \exp{\left[ -\left( n+\frac{1}{\beta} \right) \lambda \right]} \\
&= \lambda^{\alpha + \sum_{i=1}^{n} x_i – 1} \exp{\left[ -\left( \frac{n \beta + 1}{\beta} \right) \lambda \right]} \\
&= \lambda^{\alpha + \sum_{i=1}^{n} x_i – 1} \exp{\left[ – \frac{\lambda}{\beta/(n \beta + 1)} \right]}
\end{align}
$$

よってパラメータ$\lambda$の事後分布はガンマ分布$\displaystyle \mathrm{Ga} \left( \alpha + \sum_{i=1}^{n} x_i , \frac{\beta}{n \beta + 1} \right)$である。

v)
下記より、MCMC法に基づいてパラメータの分布を得ることができる。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

lamb = 2.
x = np.array([2., 3., 1.])

def calc_target_dist(lamb):
    return lamb**(np.sum(x)) * np.e**(-x.shape[0]*lamb)

lambs = np.zeros(10000)

for i in range(11000):
    y = stats.norm.rvs(0,0.2)
    alpha = np.min([1.,calc_target_dist(lamb+y)/calc_target_dist(lamb)])
    u = np.random.rand()
    if alpha > u:
        lamb = lamb+y
    if (i+1)>1000:
        lambs[i-1000] = lamb

plt.hist(lambs,bins=25)
plt.show()

実行結果

・解説
下記などを参考に作成を行いました。

ハミルトニアンモンテカルロ(HMC)

NUTS(No U-Turn Sampler)

数学検定2級 解説 〜公式問題集 解説&解答 Ch.3「直線・円の方程式」〜

数学検定$2$級は数ⅡBまで相当の数学の基本トピックに関して取り扱った検定であり、統計学に必要な数学を身につける際の指標に役に立ちます。当記事では「日本数学検定協会 監修」の「数学検定問題集 $2$級」より、第$3$章の「直線・円の方程式」の解説と演習問題の解答例などを取り扱いました。

・数学検定$2$級まとめ
https://www.hello-statisticians.com/math_certificate_2

本章のまとめ

演習

計算技能問題

問題.$1$

$[1]$
傾きが$2$の直線は$y=2x+b$のように表せる。この直線が$(1,-2)$を通ることより下記が成立する。
$$
\large
\begin{align}
-2 &= 2 \cdot 1 + b \\
b &= -4
\end{align}
$$

よって$y=2x-4$が得られる。

$[2]$
直線の傾きは下記のように得られる。
$$
\large
\begin{align}
\frac{5-(-1)}{4-2} &= \frac{6}{2} \\
&= 3
\end{align}
$$

ここで直線$y=3x+b$が$(2,-1)$を通ることで下記が成立する。
$$
\large
\begin{align}
-1 &= 3 \cdot 2 + b \\
b &= -7
\end{align}
$$

よって$y=3x-7$が得られる。

問題.$2$

下記のように$a$の値が得られる。
$$
\large
\begin{align}
\frac{-2-6}{3-(-1)} &= \frac{2-6}{a-(-1)} \\
\frac{-8}{4} &= \frac{-4}{a+1} \\
-2 &= \frac{-4}{a+1} \\
a+1 &= 2 \\
a &= 1
\end{align}
$$

問題.$3$

問題.$4$

問題.$5$

$x^2+y^2-4x+2y+1=0$は下記のように変形できる。
$$
\large
\begin{align}
x^2 + y^2 – 4x + 2y + 1 &= 0 \\
(x-2)^2 + (y-1)^{2} – 2^2 – 1^2 + 1 &= 0 \\
(x-2)^2 + (y-1)^{2} &= 2^2
\end{align}
$$

上記より円の中心は$(2,1)$、半径は$2$である。

問題.$6$

$x-y+1=0$より$y=x+1$を$x^2+y^2=5$に代入すると下記が得られる。
$$
\large
\begin{align}
x^2 + y^2 &= 5 \\
x^2 + (x+1)^2 &= 5 \\
x^2 + x^2 + 2x + 1 &= 5 \\
2(x^2+x-2) &= 0 \\
(x+2)(x-1) &= 0
\end{align}
$$

上記より$x=-2,1$が得られる。よって直線と円の交点は$(-2,-1), (1,2)$である。

問題.$7$

$\sqrt{3^2+4^{2}}=5$より、中心が$(3,4)$で半径が$5-3=2$の円が該当する。よって円の方程式は下記のように表せる。
$$
\large
\begin{align}
(x-3)^2 + (y-4)^2 = 2^2
\end{align}
$$

数理技能問題

問題.$1$

問題.$2$

問題.$3$

問題.$4$

問題.$5$

問題.$6$

問題.$7$

問題.$8$

統計検定準1級 問題解説 ~2016年6月実施 選択問題及び部分記述問題 問1

過去問題

過去問題は統計検定公式が問題と解答例を公開しています。こちらを参照してください。

解答

[1] 解答

$\boxed{ \ \mathsf{記述1}\ }$ : $0.2$

変動係数 $={標準偏差 }/{ 平均}$ であるから
$$\dfrac{11}{55} = 0.2$$
である.

[2]解答

$\boxed{ \ \mathsf{記述2}\ }$ : $12.0$
餌を変えた後の変動係数を $x$ とおく.変動係数は餌を変える前と後で変化しないので

$$
\dfrac{x}{60} = 0.2
$$

が成り立つ.よって$x=12.0$である.

BFGS法などの準ニュートン法の概要・数式理解とPythonプログラムの確認

BFGS法は非線形の最適化の際によく用いられるアルゴリズムですが、準ニュートン法の$1$つと見なすことができます。当記事ではBFGS法・準ニュートン法の概要や数式理解、具体的な例に対して計算を行うPythonプログラムなどの確認を行いました。
「新版 数理計画入門(朝倉書店)」の$4.6$節の「準ニュートン法」などの内容を参考に作成を行いました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

BFGS法の仕組み

ニュートン法と準ニュートン法

多次元ニュートン法は最適化の各反復計算の際にヘッセ行列を活用することで収束を速めることができる手法である。

ニュートン法は収束が速いなど有用である一方で、変数が多い時などはヘッセ行列の計算が容易でないなど、必ずしも良い手法であるとは言えない。

上記を受けて準ニュートン法ではヘッセ行列の計算を定義通りに行わずに漸化式的にヘッセ行列の推定を行う。たとえば$1$次元の変数$x \in \mathbb{R}$と目的関数$f(x)$に対し、下記のように$1 \times 1$のヘッセ行列の推定を行うことができる。
$$
\large
\begin{align}
\nabla^2 f(x^{(k+1)}) \simeq \frac{\nabla f(x^{(k+1)}) – \nabla f(x^{(k)})}{x^{(k+1)}-x^{(k)}} \quad (1)
\end{align}
$$

上記のようにヘッセ行列の近似を行うことで、ニュートン法と同様の計算を行うのが準ニュートン法である。以下、当記事では準ニュートン法の$1$つの手法であるBFGS法について詳しく取り扱った。

ヘッセ行列の近似とBFGS法

$n$次元の変数ベクトル$\mathbf{x} \in \mathbb{R}$に対して目的関数$f(\mathbf{x})$を定義する。このとき$k+1$ステップ目のヘッセ行列$\nabla^2 f(\mathbf{x}^{(k+1)})$の近似行列を$B^{(k+1)}$とおくと、下記が成立する。
$$
\large
\begin{align}
B^{(k+1)} \mathbf{s}^{(k)} &= \mathbf{y}^{(k)} \quad (2) \\
\mathbf{s}^{(k)} &= \mathbf{x}^{(k+1)} – \mathbf{x}^{(k)} \\
\mathbf{y}^{(k)} &= \nabla f(\mathbf{x}^{(k+1)}) – \nabla f(\mathbf{x}^{(k)})
\end{align}
$$

$(2)$式は$(1)$式と対応させて理解すると良い。$(2)$式が成立する近似行列の定め方はいくつか提案されてきたが、よく用いられるBFGS法では下記のような式を元に近似行列$B^{(k+1)}$を定義する。
$$
\large
\begin{align}
B^{(k+1)} &= B^{(k)} + \frac{1}{\beta^{(k)}} \mathbf{y}^{(k)} (\mathbf{y}^{(k)})^{\mathrm{T}} – \frac{1}{\gamma^{(k)}} B^{(k)} \mathbf{s}^{(k)} (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \\
\beta^{(k)} &= (\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)} \\
\gamma^{(k)} &= (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)}
\end{align}
$$

BFGS法におけるヘッセ行列の近似式

$$
\large
\begin{align}
B^{(k+1)} &= B^{(k)} + \frac{1}{\beta^{(k)}} \mathbf{y}^{(k)} (\mathbf{y}^{(k)})^{\mathrm{T}} – \frac{1}{\gamma^{(k)}} B^{(k)} \mathbf{s}^{(k)} (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \\
\beta^{(k)} &= (\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)} \\
\gamma^{(k)} &= (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)}
\end{align}
$$

上記のように定めた近似行列$B^{(k+1)}$を用いるとき、下記の下記の$(a)$〜$(c)$が成立する。

$(a) \,$ $B^{(k+1)}$に関して$(2)$式が成立する
$(b) \,$ $B^{(k)}$が対称ならば$B^{(k+1)}$も対称である
$(c) \,$ $B^{(k)}$が正定値かつ$\beta^{(k)}>0$ならば$B^{(k+1)}$も正定値である

以下、$(a)$が成立することを確認する。
$$
\large
\begin{align}
& B^{(k+1)} \mathbf{s}^{(k)} = B^{(k)} \mathbf{s}^{(k)} + \frac{1}{\beta^{(k)}} \mathbf{y}^{(k)} (\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)} – \frac{1}{\gamma^{(k)}} B^{(k)} \mathbf{s}^{(k)} (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)} \\
&= B^{(k)} \mathbf{s}^{(k)} + \frac{1}{\cancel{(\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)}}} \mathbf{y}^{(k)} \cancel{(\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)}} – \frac{1}{\cancel{(\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)}}} B^{(k)} \mathbf{s}^{(k)} \cancel{(\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)}} \\
&= \mathbf{y}^{(k)}
\end{align}
$$

上記より$(a)$が成立する。また、途中計算では$(\mathbf{y}^{(k)})^{\mathrm{T}} \mathbf{s}^{(k)}$と$(\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)} \mathbf{s}^{(k)}$がスカラーであることに着目して約分を行なった。

ここで計算した近似行列の$B^{(k+1)}$をニュートン法におけるヘッセ行列に置き換えて下記のような計算を行うことで、準ニュートン法を用いた近似解を計算することができる。
$$
\large
\begin{align}
\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} – (B^{(k)})^{-1} \nabla f(\mathbf{x}^{(k)})
\end{align}
$$

Pythonを用いたBFGS法の実行

問題設定

「数理計画入門(朝倉書店)」の$4.4$節の「最急降下法」と同様に下記の関数の最適化にあたって、最急降下法のプログラムの作成を行う。
$$
\large
\begin{align}
f(\mathbf{x}) = f(x_1,x_2) = (x_1-1)^2 + 10(x_1^2-x_2)^2
\end{align}
$$

勾配ベクトルの計算・ヘッセ行列の推定

勾配ベクトル$\nabla f(\mathbf{x})$は下記のように計算できる。
$$
\large
\begin{align}
\nabla f(\mathbf{x}) &= \left(\begin{array}{c} \displaystyle \frac{\partial f}{\partial x_1} \\ \displaystyle \frac{\partial f}{\partial x_2} \end{array} \right) \\
&= \left(\begin{array}{c} 2(x_1-1) + 20(x_1^2-x_2) \cdot 2x_1 \\ 20(x_1^2-x_2) \cdot (-1) \end{array} \right) \\
&= \left(\begin{array}{c} 40x_1^3-40x_1x_2+2x_1-2 \\ -20(x_1^2-x_2) \end{array} \right)
\end{align}
$$

ヘッセ行列は下記の数式を元に近似行列を推定する。
$$
\large
\begin{align}
B^{(k+1)} = B^{(k)} + \frac{1}{\beta^{(k)}} \mathbf{y}^{(k)} (\mathbf{y}^{(k)})^{\mathrm{T}} – \frac{1}{\gamma^{(k)}} B^{(k)} \mathbf{s}^{(k)} (\mathbf{s}^{(k)})^{\mathrm{T}} B^{(k)}
\end{align}
$$

BFGS法の実行

下記を実行することでBFGS法による最適化を行うことができる。

import numpy as np

def calc_func_value(x1,x2):
    return (x1-1)**2 + 10*(x1**2-x2)**2

def calc_gradient(x1,x2):
    return np.array([40*x1**3 - 40*x1*x2 + 2*x1 - 2, -20*(x1**2-x2)])

x = np.array([0., 1.])
B = np.eye(2)

alpha = np.arange(-5., 5., 0.0000002)

for k in range(10):
    grad = np.dot(np.linalg.inv(B),calc_gradient(x[0],x[1]))
    x1, x2 = x[0]+alpha*grad[0], x[1]+alpha*grad[1]
    f = calc_func_value(x1,x2)
    s = (x - np.array([x1[np.argmin(f)], x2[np.argmin(f)]])).reshape([2,1])
    y = (calc_gradient(x[0],x[1]) - calc_gradient(x1[np.argmin(f)],x2[np.argmin(f)])).reshape([2,1])
    x[0], x[1] = x1[np.argmin(f)], x2[np.argmin(f)]
    beta, gamma = np.dot(y.T,s), np.dot(s.T,np.dot(B,s))
    B = B + np.dot(y,y.T)/beta - np.dot(np.dot(B,s),np.dot(s.T,B))/gamma
    print("Iter: {:.0f}, x: {}".format(k+1,x))

・実行結果

Iter: 1, x: [ 0.09988482  0.00115184]
Iter: 2, x: [ 0.32845959  0.00381447]
Iter: 3, x: [ 0.63413382  0.29092239]
Iter: 4, x: [ 0.64276477  0.41585505]
Iter: 5, x: [ 0.83666141  0.66037833]
Iter: 6, x: [ 0.9954299   0.99483118]
Iter: 7, x: [ 1.00116088  1.0024978 ]
Iter: 8, x: [ 0.99998693  0.99998305]
Iter: 9, x: [ 0.99999995  0.99999989]
Iter: 10, x: [ 1.  1.]

上記の結果は「数理計画入門(朝倉書店)」の表$4.3$の結果に基本的には一致する。「数理計画入門(朝倉書店)」に直線探索の設定がないので、厳密な再現ではないことに注意が必要である。

参考

数学検定2級 解説 〜公式問題集 解説&解答 Ch.2「三角関数」〜

数学検定$2$級は数ⅡBまで相当の数学の基本トピックに関して取り扱った検定であり、統計学に必要な数学を身につける際の指標に役に立ちます。当記事では「日本数学検定協会 監修」の「数学検定問題集 $2$級」より、第$2$章の「三角関数」の解説と演習問題の解答例などを取り扱いました。

・数学検定$2$級まとめ
https://www.hello-statisticians.com/math_certificate_2

本章のまとめ

加法定理

演習

計算技能問題

問題.$1$

下記のように値が得られる。
$$
\large
\begin{align}
\tan{\left[ 180^{\circ} \left( 2n – \frac{1}{4} \right) \right]} &= \tan{(360^{\circ} \times n – 45 ^{\circ})} \\
&= \tan{(-45^{\circ})} \\
&= -1
\end{align}
$$

問題.$2$

$[1]$
$\displaystyle \sin{\theta}-\cos{\theta}=\frac{1}{3}$の両辺を$2$乗すると下記が得られる。
$$
\large
\begin{align}
(\sin{\theta}-\cos{\theta})^{2} &= \left( \frac{1}{3} \right)^{2} \\
\sin^{2}{\theta} + \cos^{2}{\theta} – 2 \sin{\theta} \cos{\theta} &= \frac{1}{9} \\
1 – 2 \sin{\theta} \cos{\theta} &= \frac{1}{9} \\
2 \sin{\theta} \cos{\theta} &= 1-\frac{1}{9} \\
\sin{\theta} \cos{\theta} &= \frac{4}{9}
\end{align}
$$

このとき$(\sin{\theta}+\cos{\theta})^2$は下記のように計算できる。
$$
\large
\begin{align}
(\sin{\theta}+\cos{\theta})^2 &= \sin^{2}{\theta} + \cos^{2}{\theta} + 2 \sin{\theta} \cos{\theta} \\
&= 1 + 2 \cdot \frac{4}{9} \\
&= \frac{17}{9}
\end{align}
$$

ここで$180^{\theta} < \theta < 270^{\circ}$より、$\sin{\theta}<0, \cos{\theta}<0$であり、$\sin{\theta}+\cos{\theta}<0$も同時に成立する。よって$\displaystyle \sin{\theta}+\cos{\theta}=-\frac{\sqrt{17}}{3}$である。

$[2]$
$\displaystyle \sin{\theta}+\cos{\theta}=-\frac{\sqrt{17}}{3}$、$\displaystyle \sin{\theta} \cos{\theta}=\frac{4}{9}$より、$\sin^{3}{\theta}+\cos^{3}{\theta}$の値は下記のように得られる。
$$
\large
\begin{align}
\sin^{3}{\theta}+\cos^{3}{\theta} &= (\sin{\theta}+\cos{\theta})^{3} – 3 \sin{\theta}\cos{\theta}(\sin{\theta}+\cos{\theta}) \\
&= \left( -\frac{\sqrt{17}}{3} \right)^{3} – 3 \cdot \frac{4}{9} \cdot -\frac{\sqrt{17}}{3} \\
&= -\frac{17\sqrt{17}}{27} + \frac{12\sqrt{17}}{27} \\
&= -\frac{(17-12)\sqrt{17}}{3} \\
&= -\frac{5\sqrt{17}}{3}
\end{align}
$$

問題.$3$

$[1]$
$$
\large
\begin{align}
\sin{490^{\circ}} &= \sin{(360^{\circ}+130^{\circ})} \\
&= \sin{130^{\circ}} \\
&= \sin{(180^{\circ}-130^{\circ})} \\
&= \sin{50^{\circ}} \\
&= \cos{(90^{\circ}-50^{\circ})} \\
&= \cos{40^{\circ}}
\end{align}
$$

$[2]$
$$
\large
\begin{align}
\sin{(-560^{\circ})} &= \sin{(360^{\circ} \times 2 – 560^{\circ})} \\
&= \sin{(720^{\circ}-560^{\circ})} \\
&= \sin{160^{\circ}} \\
&= \sin{(180^{\circ}-160^{\circ})} \\
&= \sin{20^{\circ}}
\end{align}
$$

問題.$4$

$[1]$
加法定理を用いて下記のように計算できる。
$$
\large
\begin{align}
\cos{105^{\circ}} &= \cos{(60^{\circ}+45^{\circ})} \\
&= \cos{60^{\circ}}\cos{45^{\circ}} – \sin{60^{\circ}}\sin{45^{\circ}} \\
&= \frac{1}{2} \cdot \frac{\sqrt{2}}{2} – \frac{\sqrt{3}}{2} \cdot \frac{\sqrt{2}}{2} \\
&= \frac{\sqrt{2}}{4} – \frac{\sqrt{6}}{4} \\
&= \frac{\sqrt{2}-\sqrt{6}}{4}
\end{align}
$$

$[2]$
加法定理を用いて下記のように計算できる。
$$
\large
\begin{align}
\tan{15^{\circ}} &= \tan{(60^{\circ}+45^{\circ})} \\
&= \frac{\tan{60^{\circ}}-\tan{45^{\circ}}}{1+\tan{60^{\circ}}\tan{45^{\circ}}} \\
&= \frac{\sqrt{3}-1}{1+\sqrt{3}} \\
&= \frac{(\sqrt{3}-1)(\sqrt{3}-1)}{(\sqrt{3}+1)(\sqrt{3}-1)} \\
&= \frac{3+1-2\sqrt{3}}{3-1} \\
&= 2 – \sqrt{3}
\end{align}
$$

問題.$5$

$[1]$
$\sin^{2}{\alpha}+\cos^{2}{\alpha}=1$より下記が成立する。
$$
\large
\begin{align}
\sin^{2}{\alpha} + \cos^{2}{\alpha} &= 1 \\
\cos^{2}{\alpha} &= 1 – \left( \frac{3}{5} \right)^2 \\
&= \frac{16}{25}
\end{align}
$$

ここで$90^{\circ} < \alpha < 180^{\circ}$であることから$\cos{\alpha}<0$であるので$\displaystyle \cos{\alpha}=-\frac{4}{5}$である。よって$2$倍角の公式に基づいて$\sin{2 \alpha}$は下記のように計算できる。
$$
\large
\begin{align}
\sin{2 \alpha} &= 2 \sin{\alpha} \cos{\alpha} \\
&= 2 \cdot \frac{3}{5} \cdot -\frac{4}{5} \\
&= -\frac{24}{25}
\end{align}
$$

$[2]$
$2$倍角の公式に基づいて$\cos{2 \alpha}$は下記のように計算できる。
$$
\large
\begin{align}
\cos{2 \alpha} &= \cos^{2}{\alpha} – \sin^{2}{\alpha} \\
&= \left( -\frac{4}{5} \right)^{2} – \left( \frac{3}{5} \right)^{2} \\
&= \frac{7}{25}
\end{align}
$$

$[3]$
$[1]$、$[2]$の結果に基づいて下記のように計算できる。
$$
\large
\begin{align}
\tan{2 \alpha} &= \frac{\sin{2 \alpha}}{\cos{2 \alpha}} \\
&= -\frac{24}{25} \times \frac{25}{7} \\
&= -\frac{24}{7}
\end{align}
$$

問題.$6$

$y=\sin^{2}{\theta}-\cos^{2}{\theta}$は下記のように変形できる。
$$
\large
\begin{align}
y &= \sin^{2}{\theta}-\cos^{2}{\theta} \\
&= -(\cos^{2}{\theta}-\sin^{2}{\theta}) \\
&= -\cos{2 \theta}
\end{align}
$$

上記より、関数の周期は$180^{\circ}$である。

問題.$7$

$[1]$
加法定理を元に下記のように計算できる。
$$
\large
\begin{align}
\cos{15^{\circ}} + \cos{75^{\circ}} &= \cos{(45^{\circ}-30^{\circ})} + \cos{(45^{\circ}+30^{\circ})} \\
&= (\cos{45^{\circ}}\cos{30^{\circ}} + \cancel{\sin{45^{\circ}}\sin{30^{\circ}}}) + (\cos{45^{\circ}}\cos{30^{\circ}} – \cancel{\sin{45^{\circ}}\sin{30^{\circ}}}) \\
&= 2 \cos{45^{\circ}}\cos{30^{\circ}} \\
&= 2 \cdot \frac{\sqrt{2}}{2} \cdot \frac{\sqrt{3}}{2} \\
&= \frac{\sqrt{6}}{2}
\end{align}
$$

$[2]$
加法定理を元に下記のように計算できる。
$$
\large
\begin{align}
\cos{15^{\circ}} \cos{75^{\circ}} &= \cos{(45^{\circ}-30^{\circ})} \cos{(45^{\circ}+30^{\circ})} \\
&= (\cos{45^{\circ}}\cos{30^{\circ}} + \sin{45^{\circ}}\sin{30^{\circ}})(\cos{45^{\circ}}\cos{30^{\circ}} – \sin{45^{\circ}}\sin{30^{\circ}}) \\
&= (\cos{45^{\circ}}\cos{30^{\circ}})^{2} – (\sin{45^{\circ}}\sin{30^{\circ}})^{2} \\
&= \frac{2}{4} \cdot \frac{3}{4} – \frac{2}{4} \cdot \frac{1}{4} \\
&= \frac{4}{16} \\
&= \frac{1}{4}
\end{align}
$$

問題.$8$

$[1]$
$$
\large
\begin{align}
\sin{(\theta-30^{\circ})} = \frac{1}{2}
\end{align}
$$

$0^{\circ} \leq \theta < 360^{\circ}$より$-30^{\circ} \leq \theta – 30^{\circ} < 330^{\circ}$であるので、$\theta-30^{\circ}=30^{\circ}, 150^{\circ}$が成立する。よって$\theta=60^{\circ}, 180^{\circ}$である。

$[2]$
$$
\large
\begin{align}
2\sin^{2}{\theta} &= 3\cos{\theta} \\
2(1-\cos^{2}{\theta}) &= 3\cos{\theta} \\
2\cos^{2}{\theta} + 3\cos{\theta} – 2 &= 0 \\
(2\cos{\theta}-1)(\cos{\theta}+2) &= 0 \\
\cos{\theta} &= \frac{1}{2}
\end{align}
$$

ここで$0^{\circ} \leq \theta < 360^{\circ}$より、$\theta=60^{\circ},300^{\circ}$である。

$[3]$
$$
\large
\begin{align}
\sin{\theta} + \cos{\theta} &= 1 \\
\sqrt{2} \left( \sin{\theta} \cdot \frac{\sqrt{2}}{2} + \cos{\theta} \cdot \frac{\sqrt{2}}{2} \right) &= 1 \\
\sin{\theta} \cos{45^{\circ}} + \cos{\theta} \cos{45^{\circ}} &= \frac{1}{\sqrt{2}} \\
\sin{(\theta+45^{\circ})} &= \frac{1}{\sqrt{2}}
\end{align}
$$

$0^{\circ} \leq \theta < 360^{\circ}$より$45^{\circ} \leq \theta + 45^{\circ} < 405^{\circ}$であるので、$\theta+45^{\circ}=45^{\circ}, 135^{\circ}$が成立する。よって$\theta=0^{\circ}, 90^{\circ}$である。

数理技能問題

問題.$1$

下記のように示すことができる。
$$
\large
\begin{align}
\cos{(x+y)} \cos{(x-y)} &= (\cos{x}\cos{y}-\sin{x}\sin{y})(\cos{x}\cos{y}+\sin{x}\sin{y}) \\
&= \cos^{2}{x}\cos^{2}{y} – \sin^{2}{x}\sin^{2}{y} \\
&= \cos^{2}{x}\cos^{2}{y} – (1-\cos^{2}{x})\sin^{2}{y} \\
&= \cos^{2}{x}(\cos^{2}{y}+\sin^{2}{y}) – \sin^{2}{y} \\
&= \cos^{2}{x} – \sin^{2}{y}
\end{align}
$$

問題.$2$

$2$倍角の公式より$\sin{2 \alpha}, \cos{2 \alpha}$は下記のように表せる。
$$
\large
\begin{align}
\sin{2 \alpha} &= 2 \sin{\alpha}{\cos{\alpha}} \\
\cos{2 \alpha} &= 2 \cos^{2}{\alpha} – 1
\end{align}
$$

よって$\cos{3 \alpha}$は下記のように表せる。
$$
\large
\begin{align}
\cos{3 \alpha} &= \cos{(2\alpha + \alpha)} \\
&= \cos{2\alpha}\cos{\alpha} – \sin{2\alpha}\sin{\alpha} \\
&= (2\cos^{2}{\alpha}-1)\cos{\alpha} – 2\sin{\alpha}{\cos{\alpha}}\sin{\alpha} \\
&= 2\cos^{3}{\alpha} – \cos{\alpha} – 2\sin^{2}{\alpha}{\cos{\alpha}} \\
&= 2\cos^{3}{\alpha} – \cos{\alpha} – 2(1-\cos^{2}{\alpha}){\cos{\alpha}} \\
&= 2\cos^{3}{\alpha} – \cos{\alpha} + 2\cos^{2}{\alpha} – 2\cos{\alpha} \\
&= 4\cos^{3}{\alpha} – 3\cos{\alpha}
\end{align}
$$

問題.$3$

直線$y=-2x$が直線$y=0$となす角を$\alpha$、直線$y=3x$が直線$y=0$となす角を$\beta$とおく。このとき直線の傾きに基づいて、$\tan{\alpha}, \tan{\beta}$はそれぞれ下記のように表せる。
$$
\large
\begin{align}
\tan{\alpha} &= -2 \\
\tan{\beta} &= 3
\end{align}
$$

ここで加法定理に基づいて$\tan{(\alpha-\beta)}$は下記のように計算できる。
$$
\large
\begin{align}
\tan{(\alpha-\beta)} &= \frac{\sin{(\alpha-\beta)}}{\cos{(\alpha-\beta)}} \\
&= \frac{\sin{\alpha}\cos{\beta}+\sin{\alpha}\cos{\beta}}{\cos{\alpha}\cos{\beta}+\sin{\alpha}\sin{\beta}} \\
&= \frac{\tan{\alpha}-\tan{\beta}}{1+\tan{\alpha}\tan{\beta}} \\
&= \frac{-2 – 3}{1 + (-2) \cdot 3} \\
&= \frac{-5}{-5} \\
&= 1
\end{align}
$$

$\tan{(\alpha-\beta)}=1$より$\theta=\alpha-\beta=45^{\circ}$である。

問題.$4$

$\displaystyle \sin^{2}{\frac{\alpha}{2}} + \cos^{2}{\frac{\alpha}{2}} = 1$は下記のように変形することができる。
$$
\large
\begin{align}
\sin^{2}{\frac{\alpha}{2}} + \cos^{2}{\frac{\alpha}{2}} &= 1 \\
\frac{\displaystyle \sin^{2}{\frac{\alpha}{2}}}{\displaystyle \cos^{2}{\frac{\alpha}{2}}} + 1 &= \frac{1}{\displaystyle \cos^{2}{\frac{\alpha}{2}}} \\
\tan^{2}{\frac{\alpha}{2}} + 1 &= \frac{1}{\displaystyle \cos^{2}{\frac{\alpha}{2}}}
\end{align}
$$

ここで$\displaystyle \tan{\frac{\alpha}{2}}=t$とおくとき、上記より$\displaystyle \cos^{2}{\frac{\alpha}{2}} = \frac{1}{1+t^2}$が成立する。

$[1]$
$$
\large
\begin{align}
\sin{\alpha} &= \sin{\left( 2 \cdot \frac{\alpha}{2} \right)} \\
&= 2 \sin{\frac{\alpha}{2}} \cos{\frac{\alpha}{2}} \\
&= 2 \tan{\frac{\alpha}{2}} \cos^{2}{\frac{\alpha}{2}} \\
&= 2t \cdot \frac{1}{1+t^2} \\
&= \frac{2t}{1+t^2}
\end{align}
$$

$[2]$
$$
\large
\begin{align}
\cos{\alpha} &= \cos{\left( 2 \cdot \frac{\alpha}{2} \right)} \\
&= 2 \cos^{2}{\frac{\alpha}{2}} – 1 \\
&= 2 \cdot \frac{1}{1+t^2} – 1 \\
&= \frac{2-(1+t^2)}{1+t^2} \\
&= \frac{1-t^2}{1+t^2}
\end{align}
$$

$[3]$
$$
\large
\begin{align}
\tan{\alpha} &= \frac{\sin{\alpha}}{\cos{\alpha}} \\
&= \frac{2t}{\cancel{1+t^2}} \cdot \frac{\cancel{1+t^2}}{1-t^2} \\
&= \frac{2t}{1-t^2}
\end{align}
$$

問題.$5$

$[1]$
下記のように示すことができる。
$$
\large
\begin{align}
\sin{(90^{\circ}+\theta)} &= \sin{90^{\circ}}\cos{\theta} + \cos{90^{\circ}}\sin{\theta} \\
&= 1 \cdot \cos{\theta} + 0 \cdot \sin{\theta} \\
&= \cos{\theta}
\end{align}
$$

$[2]$
下記のように示すことができる。
$$
\large
\begin{align}
\sin{(180^{\circ}+\theta)} &= \sin{180^{\circ}}\cos{\theta} + \cos{180^{\circ}}\sin{\theta} \\
&= 0 \cdot \cos{\theta} + (-1) \cdot \sin{\theta} \\
&= -\sin{\theta}
\end{align}
$$

問題.$6$

加法定理を用いることで与式は下記のように変形できる。
$$
\large
\begin{align}
\sin{x} + \sin{(60^{\circ}-x)} &= \sin{x} + \sin{60^{\circ}} \cos{x} – \cos{60^{\circ}} \sin{x} \\
&= \sin{x} + \frac{\sqrt{3}}{2} \cos{x} – \frac{1}{2} \sin{x} \\
&= \frac{1}{2} \sin{x} + \frac{\sqrt{3}}{2} \cos{x} \\
&= \sin{x} \cos{60^{\circ}} + \cos{x} \sin{60^{\circ}} \\
&= \sin{(x+60^{\circ})}
\end{align}
$$

上記より与式の最大値は$1$、最小値は$-1$である。

問題.$7$

グラフより関数の周期が$120^{\circ}$であるので$a=3$である。また、$x=0^{\circ}$のとき下記が成立する。
$$
\large
\begin{align}
2 \sin{b} &= -2 \\
\sin{b} &= -1
\end{align}
$$

$-180^{\circ} \leq b \leq 180^{\circ}$より$b=90^{\circ}$である。

Streamlitの基本操作: 色々なテキスト(文字列)を表示させる

StreamlitPythonベースのWebアプリ開発フレームワークです。その特徴は、Webアプリに関する開発経験や知識が不要で、numpypandasmatplotlibといったPythonの基本的なライブラリが利用できれば、ブラウザベースの簡易的なダッシュボードを作ることができます。

Streamlit ではPythonコードに直接表示するコンポーネントを書いていきます。ここでは、よく使う基本的なコンポーネントのうち、文字列を表示させるためのコンポーネントの紹介と使用例を紹介します。

テキスト表示

テキストを表示するための方法はいくつかあります。以下の表に代表的なものを挙げます。詳細は公式ドキュメントを参照してください。

関数名概要
st.write文字列以外にも多くのオブジェクトを表示する便利な関数。
st.titleタイトルスタイルで文字列を表示する
st.markdownMarkdown形式でドキュメントを記述する。個人的には、見出しなどもMarkdownで書いてしまう。
st.codeソースコードをシンタックスハイライト表示できる。language引数で言語を指定可能(詳細は公式ドキュメント参照)

上記の中でst.writeは実は特殊な関数で、後述するデータフレームやグラフなどもwriteを利用することで表示できるようになります。

他にも、ヘッダースタイルの文字列の表示をするst.headerなどがありますが、st.markdownなどで賄うことができます。気になる方は、API referenceを参照してください(英語ですが、簡潔ですし、利用例と合わせて書かれているのでわかりやすいです)。

利用例

上記の関数を使った例は以下のようになります。

import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

st.title("Streamlit Text Example")

st.markdown("""
## 概要
このページは、テキスト表示機能の具体例を記述するものです。

### 構成
- [st.write](https://docs.streamlit.io/library/api-reference/write-magic/st.write): 色々表示できる
- [st.code](https://docs.streamlit.io/library/api-reference/text/st.code): シンタックスハイライトしたコードを表示できる
""")

st.write("数値: ", 2)
st.write("配列も表示可能: ", np.random.normal(size=5))

body = """
import numpy as np
a = np.random.normal(0, 1, size=500)
"""
st.code(body, language="python")

上記のコードを実行すると以下のようなWebアプリが作成できます。

streamlit run src/streamlit/app_text.py

解説

主なポイントを解説します。

import streamlit as st

streamlitをインポートします。これで、Streamlitの機能が使えるようになります。

st.title("Streamlit Text Example")

タイトルスタイルでテキストを表示します。引数に文字列を指定すれば、そのまま文字列が表示されます。anchorオプションを指定することで、アンカーを指定できます(デフォルトでは入力テキストがアンカーになる)。

st.markdown("""
## 概要
このページは、テキスト表示機能の具体例を記述するものです。

### 構成
- [st.write](https://docs.streamlit.io/library/api-reference/write-magic/st.write): 色々表示できる
- [st.code](https://docs.streamlit.io/library/api-reference/text/st.code): シンタックスハイライトしたコードを表示できる
""")

Markdown形式(GitHub Flavored Markdown)でドキュメントを記載します。見出しレベルの指定や箇条書きなども対応しています。基本的には、Markdown形式でドキュメントを書いていくと楽なのではないかと思います。

st.write("数値: ", 2)
st.write("配列も表示可能: ", np.random.normal(size=5))

st.writeで文字列を表示しています。カンマ区切りで文字列を繋げていくこともできます。テキストだけでなく、数値も入力できます。また、辞書(dict)、配列やリストなどもst.writeで表示することができます。

body = """
import numpy as np
a = np.random.normal(0, 1, size=500)
"""
st.code(body, language="python")

st.codeでシンタックスハイライトされたソースコードを表示することができます。languageオプションで言語を指定できます(デフォルトでPython)。指定できる言語はドキュメントを参照してください。

まとめ

ここでは、Streamlitに文字列などを表示する例を解説しました。

関数を呼び出して、テキストを直接記入するだけで、Webアプリに表示されることが確認できました。Streamlitは、関数を呼び出した箇所にそのままテキストが表示されるので、とてもわかりやすいですね。その分、レイアウトをカスタマイズすることは難しいですが、簡易的なダッシュボードを作成するという点では、

参考

データ可視化のためのプラットフォームの基礎: Streamlit

データの可視化は、データを様々な角度から確認し、データ自体を理解する目的で行われることが多い印象です。探索的データ分析(EDA)と呼ばれることもあります。データ分析の結果は、自分自身で確認するだけでなく、上司や顧客など他者へ説明することが求められることが多いと思います。

このような背景から、データの可視化にあたっては、直感的な操作でインタラクティブにデータを確認できるインターフェースが備わっているととても便利です。このようなインタラクティブなデータ可視化ツールが容易に作成できるプラットフォームとして、streamlitというツールが知られています。

ここでは、Streamlitの環境構築と基礎的な使い方をまとめます。

Streamlit

Streamlitは、Python でWebアプリを開発するためのフレームワークです。主に、データ確認のためのWebアプリが非常に容易に開発できます。Webアプリの開発経験や知識はほぼ不要で、Pythonでpandasやmatplotlib等を利用した経験さえあれば、Webアプリを開発できます。

ただし、容易に開発ができるのには理由があり、他のWebアプリフレームワークと比較してデメリットもあります(大きくは二つ)。

  • Streamlitの優れている点
    • Webアプリの知識や開発経験が不要で、容易にWebアプリを作ることができる
    • インタラクティブにデータを確認できるダッシュボードが作成可能
    • データ入力などにも対応
  • Streamlitの欠点
    • 厳格にレイアウトが定まっているため、誰が作っても同じような見た目になる
    • パフォーマンス(速度)に課題

欠点の一つ目については、自由な表現をするにはCSSなどに直接手を加える必要があり、Webアプリの知識が必要になってきます。二つ目の欠点については、グラフの拡大などWebアプリ内のいずれかに変更を加えると、その都度アプリ全体のPythonコードを再実行します。そのため、一つ操作を加えると結果が反映されるまでに時間がかかってしまうということがあります。

以上の特徴から、簡易的なダッシュボード作成の際に向いているツールだと考えています。特に、jupyterlabと違ってソースコードが表示されないので、顧客への説明などに適しているのではないかと思います。

Streamlit についての詳細は下記の公式ドキュメントを参照ください。

https://streamlit.io/

Streamlitの導入

インストール

インストールはpip を利用できます。詳細は下記の公式インストールドキュメントを参照してください。

https://docs.streamlit.io/library/get-started/installation

pipenvやpoetryなどの仮想環境管理ツールを利用する場合には、それぞれの利用方法を確認ください。

pipでインストールをするには下記のコマンドを実行します。

pip install streamlit

下記コマンドでWebアプリにアクセスできればインストールは完了です。

streamlit hello

デフォルトの設定では、localhostの8501ポートでStreamlitアプリに繋がります。Streamlitコマンドを実行すると、ターミナルに接続URLが表示されるので確認してください。

ポート番号を指定するには、コンフィグファイルを編集するか、Streamlitコマンド実行時に下記のようにポートを指定してください。

streamlit hello --server.port 58090

server.port オプションでポートを設定できます。

StreamlitでWebアプリ作成の概要

StreamlitでWebアプリを開発するには、StreamlitをimportしたpythonファイルさえあればWebアプリができます。

例えば、標準正規分布に従う乱数のヒストグラムを表示するだけのアプリは以下のコードをpythonファイルとして用意しておきます(以下の例では app_main.py)。

import streamlit as st
import numpy as np
import matplotlib.pyplot as plt

st.title("Streamlit App Sample")

st.markdown("""
これはStreamlitのアプリのサンプルです。
""")

arr = np.random.normal(0, 1, size=500)
fig, ax = plt.subplots()
ax.hist(arr, bins=20)
st.pyplot(fig)

上記のように、タイトルやグラフのコンポーネントを直接記述します。

そして、下記コマンドを実行することでStreamlitのWebアプリを構築することができます。

streamlit run app_main.py

ブラウザから以下のようなWebアプリが確認できます。

Streamlit基本操作

ここまで見てきたように、Streamlit ではPythonコードに直接表示するコンポーネントを書いていきます。以下では、よく使う基本的なコンポーネントを紹介します。

テキスト

テキストを表示するにはいくつか方法があります。以下のページでテキストの表示について具体例をまとめています。

データフレーム(表)

グラフ

散布図

折れ線グラフ

棒グラフ

ヒストグラム

ウィジット

レイアウト(サイドバー)

その他覚えておくと良い機能

キャッシュ

複数ページアプリ

まとめ

Streamlitは、関数を呼び出した箇所にそのままコンポーネントが表示されるので、直感的に記述できることが見えたかなと思います。しかしその分、欠点として挙げている通り、レイアウトをカスタマイズすることは難しいです。

簡易的なダッシュボードを作成するという視点に絞ると、色々使えるのではないかと思います。

参考

数学検定2級 解説 〜公式問題集 解説&解答 Ch.7「確率分布」〜

数学検定$2$級は数ⅡBまで相当の数学の基本トピックに関して取り扱った検定であり、統計学に必要な数学を身につける際の指標に役に立ちます。当記事では「日本数学検定協会 監修」の「数学検定問題集 $2$級」より、第$7$章の「確率分布」の解説と演習問題の解答例などを取り扱いました。

・数学検定$2$級まとめ
https://www.hello-statisticians.com/math_certificate_2

本章のまとめ

演習

計算技能問題

問題.$1$

$[1]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{3}{7} \times \frac{2}{6} = \frac{1}{7}
\end{align}
$$

$[2]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{3}{7} \times \frac{4}{6} = \frac{2}{7}
\end{align}
$$

$[3]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{4}{6} = \frac{2}{3}
\end{align}
$$

問題.$2$

確率は$\displaystyle \frac{1}{2}$である。

問題.$3$

$[1]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{2}{5} \times \frac{1}{4} = \frac{1}{10}
\end{align}
$$

$[2]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{2}{5} \times \frac{3}{4} + \frac{3}{5} \times \frac{2}{4} &= \frac{3}{10} + \frac{3}{10} \\
&= \frac{3}{5}
\end{align}
$$

問題.$4$

$[1]$
$$
\large
\begin{align}
\frac{3}{4} \times \frac{2}{3} \times \frac{3}{5} = \frac{3}{10}
\end{align}
$$

$[2]$
$$
\large
\begin{align}
\frac{3}{4} \times \frac{2}{3} \times \frac{2}{5} + \frac{3}{4} \times \frac{1}{3} \times \frac{3}{5} + \frac{1}{4} \times \frac{2}{3} \times \frac{3}{5} &= \frac{1}{5} + \frac{3}{20} + \frac{1}{10} \\
&= \frac{9}{20}
\end{align}
$$

$[3]$
$$
\large
\begin{align}
1 – \frac{1}{4} \times \frac{1}{3} \times \frac{2}{5} &= 1 – \frac{1}{30} \\
&= \frac{29}{30}
\end{align}
$$

問題.$5$

$[1]$
確率分布は下記のように表される。

$X$ $6$$7$$8$$9$$10$$11$$12$
$P(X=k)$ $\displaystyle \frac{1}{10}$$\displaystyle \frac{1}{10}$$\displaystyle \frac{2}{10}$$\displaystyle \frac{2}{10}$$\displaystyle \frac{2}{10}$$\displaystyle \frac{1}{10}$$\displaystyle \frac{1}{10}$

$[2]$
平均$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= \frac{1}{10}(6+7+11+12) + \frac{2}{10}(8+9+10) \\
&= \frac{90}{10} \\
&= 9
\end{align}
$$

$[3]$
$E[X^2]$は下記のように計算できる。
$$
\large
\begin{align}
E[X^2] &= \frac{1}{10}(6^2+7^2+11^2+12^2) + \frac{2}{10}(8^2+9^2+10^2) \\
&= \frac{840}{10} \\
&= 84
\end{align}
$$

ここで$V[X]=E[X^2]-E[X]^2$より、分散$V[X]$は下記のように計算できる。
$$
\large
\begin{align}
V[X] &= E[X^2] – E[X]^2 \\
&= 84 – 9^2 \\
&= 3
\end{align}
$$

問題.$6$

$[1]$
確率分布は下記のように表せる。

$X$ $0$$1$$2$$3$$4$
$P(X=k)$ $\displaystyle \frac{1}{16}$$\displaystyle \frac{4}{16}$$\displaystyle \frac{6}{16}$$\displaystyle \frac{4}{16}$$\displaystyle \frac{1}{16}$

$[2]$
平均$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= \frac{1}{16}(0+4) + \frac{4}{16}(1+3) + \frac{6}{16} \cdot 2 \\
&= \frac{4 + 16 + 12}{16} \\
&= 2
\end{align}
$$

$[3]$
$E[X^2]$は下記のように計算できる。
$$
\large
\begin{align}
E[X^2] &= \frac{1}{16}(0^2+4^2) + \frac{4}{16}(1^2+3^2) + \frac{6}{16} \cdot 2^2 \\
&= \frac{80}{16} \\
&= 5
\end{align}
$$

ここで$V[X]=E[X^2]-E[X]^2$より、分散$V[X]$は下記のように計算できる。
$$
\large
\begin{align}
V[X] &= E[X^2] – E[X]^2 \\
&= 5 – 2^2 \\
&= 1
\end{align}
$$

数理技能問題

問題.$1$

下記のように計算できる。
$$
\large
\begin{align}
\frac{2}{3} \times \frac{2}{4} + \frac{1}{3} \times \frac{1}{4} = \frac{5}{12}
\end{align}
$$

問題.$2$

$$
\large
\begin{align}
\frac{0.8 \cdot 0.2}{0.2 + 0.8 \cdot 0.2 + 0.8 \cdot 0.8 \cdot 0.2} &= \frac{160}{200 + 160 + 128} \\
&= \frac{160}{488} \\
&= \frac{20}{61}
\end{align}
$$

問題.$3$

下記のように計算を行うことができる。
$$
\large
\begin{align}
\frac{300(1-0.05)}{300(1-0.05)+200(1-0.06)} = \frac{285}{473}
\end{align}
$$

問題.$4$

下記のように計算を行える。
$$
\large
\begin{align}
\left( \frac{1}{3} \right)^{3} + {}_3 C_1 \left( \frac{2}{3} \right) \left( \frac{1}{3} \right)^{3} + {}_4 C_2 \left( \frac{2}{3} \right)^{2} \left( \frac{1}{3} \right)^{3} &= \left( \frac{1}{3} \right)^{3} \left[ 1 + \frac{3 \cdot 2}{3} + \frac{6 \cdot 4}{3^2} \right] \\
&= \left( \frac{1}{3} \right)^{3} \cdot \frac{3 + 6 + 8}{3} \\
&= \frac{17}{81}
\end{align}
$$

問題.$5$

$[1]$
確率分布は下記のように表せる。

$X$ $4$$5$$6$$7$
計算式 $\displaystyle \left( \frac{1}{2} \right)^{4} \times 2$$\displaystyle {}_{4} C_{1} \left( \frac{1}{2} \right)^{5} \times 2$$\displaystyle {}_{5} C_{2} \left( \frac{1}{2} \right)^{6} \times 2$$\displaystyle {}_{6} C_{3} \left( \frac{1}{2} \right)^{7} \times 2$
$P(X=k)$ $\displaystyle \frac{1}{8}$$\displaystyle \frac{1}{4}$$\displaystyle \frac{5}{16}$$\displaystyle \frac{5}{16}$

$[2]$
平均$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= 4 \cdot \frac{1}{8} + 5 \cdot \frac{1}{4} (6+7) \cdot \cdot \frac{5}{16} \\
&= \frac{4 \cdot 2 + 5 \cdot 4 + 6 \cdot 5 + 7 \cdot 5}{16} \\
&= \frac{93}{16} = 5.8125
\end{align}
$$

$[3]$
$E[X^2]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= 4^2 \cdot \frac{1}{8} + 5^2 \cdot \frac{1}{4} (6^2+7^2) \cdot \cdot \frac{5}{16} \\
&= \frac{4^2 \cdot 2 + 5^2 \cdot 4 + 6^2 \cdot 5 + 7^2 \cdot 5}{16} \\
&= \frac{557}{16}
\end{align}
$$

ここで$V[X]=E[X^2]-E[X]^2$より、分散$V[X]$は下記のように計算できる。
$$
\large
\begin{align}
V[X] &= E[X^2] – E[X]^2 \\
&= \frac{557}{16} – \left( \frac{93}{16} \right)^2 \\
&= \frac{263}{256}
\end{align}
$$

数学検定2級 解説 〜過去問題③ 解答例・解説 1次:計算技能検定・2次:数理技能検定〜

数学検定$2$級は数ⅡBまで相当の数学の基本トピックに関して取り扱った検定であり、統計学に必要な数学を身につける際の目安になります。当記事では「日本数学検定協会 監修」の「数学検定問題集 $2$級」の数学検定$2$級の内容に基づき、過去問題③の解答例と解説の作成を行いました。

・数学検定$2$級まとめ
https://www.hello-statisticians.com/math_certificate_2

$1$次:計算技能検定

問題$1 \,$ 式の展開

下記のように式の展開を行うことができる。
$$
\large
\begin{align}
(x + 3y)(x^2 – 3xy + 9y^2) &= (x^3 – 3x^2y + 9xy^2) + (3xy^2 – 9xy^2 + 27y^3) \\
&= x^3 + 27y^3
\end{align}
$$

・別解
下記のように展開・因数分解の式を応用することもできる。
$$
\large
\begin{align}
(x + 3y)(x^2 – 3xy + 9y^2) &= (x + 3y)(x^2 – x(3y) + (3y)^2) \\
&= x^3 + (3y)^3 \\
&= x^3 + 27y^3
\end{align}
$$

問題$2 \,$ 因数分解の公式

因数分解の公式に基づいて下記のように因数分解を行える。
$$
\large
\begin{align}
x^3 – 3x^2y + 3xy^2 – y^3 = (x-y)^3
\end{align}
$$

問題$3 \,$ 二重根号

$$
\large
\begin{align}
(x-y)^2 &= x^2 – 2xy + y^2 \\
&= (x^2+y^2) – 2xy
\end{align}
$$

上記より、$5-2\sqrt{6}$は二乗の和が$5$で積が$\sqrt{6}$の数によって$x,y$が構成されることから$x=\sqrt{2}, y=\sqrt{3}$があてはまる。よって、下記のように二重根号を外せる。
$$
\large
\begin{align}
\sqrt{5-2\sqrt{6}} &= \sqrt{(\sqrt{3}-\sqrt{2})^2} \\
&= \sqrt{3}-\sqrt{2}
\end{align}
$$

問題$4 \,$ 三角比・三角関数

$\tan{\theta} = -3, \, 90^{\circ}<\theta<180^{\circ}$であるので、$\cos{\theta}$は下記のように得られる。
$$
\large
\begin{align}
\cos{\theta} &= -\frac{1}{\sqrt{3^2+1^2}} \\
&= -\frac{1}{\sqrt{10}}
\end{align}
$$

問題$5 \,$ 順列・組み合わせ

${}_{6} C_{3}$通りであるので下記のように計算できる。
$$
\large
\begin{align}
{}_{6} C_{3} &= \frac{6 \cdot 5 \cdot 4}{3 \cdot 2 \cdot 1} \\
&= 20
\end{align}
$$

問題$6 \,$ 集合と要素

積集合$A \cap B$は下記のように表せる。
$$
\large
\begin{align}
A \cap B = \{ 1,7 \}
\end{align}
$$

問題$7 \,$ 二次方程式の判別式

二次方程式$2x^2+4kx+5k+3=0$の判別式$D$が$D>0$となるような$k$の範囲を求めれば良い。よって下記のように計算を行えば良い。
$$
\large
\begin{align}
\frac{D}{4} = (2k)^2 – 2(5k+3) & > 0 \\
2k^2 – 5k – 3 & > 0 \\
(2k+1)(k-3) & > 0
\end{align}
$$

上記より$\displaystyle k < -\frac{1}{2}, 3 < k$が得られる。

問題$8 \,$ 因数定理

$f(x)=x^3+3x^2+ax+4$が$x-2$で割り切れるとき、因数定理より$f(2)=0$が成立する。よってこのときの$a$は下記のように得られる。
$$
\large
\begin{align}
f(2) = 2^3 + 3 \cdot 2^2 + 2a + 4 &= 0 \\
a &= -12
\end{align}
$$

問題$9 \,$ 二次方程式の解と係数

解と係数の関係より$\alpha+\beta, \alpha \beta$は下記のように表される。
$$
\large
\begin{align}
\alpha + \beta &= -\frac{2}{3} \\
\alpha \beta &= \frac{1}{3}
\end{align}
$$

よって$\alpha^2+\beta^2$の値は下記のように得られる。
$$
\large
\begin{align}
\alpha^2+\beta^2 &= (\alpha+\beta)^2 – 2 \alpha \beta \\
&= \left( -\frac{2}{3} \right)^2 – 2 \cdot \frac{1}{3} \\
&= \frac{4}{9} – \frac{2}{3} \\
&= \frac{4}{9} – \frac{6}{9} \\
&= -\frac{2}{9}
\end{align}
$$

問題$10 \,$ 分母の複素数の実数化

等式は下記のように変形できる。
$$
\large
\begin{align}
a + bi &= \frac{3+i}{2-i} \\
&= \frac{(3+i)(2+i)}{(2-i)(2+i)} \\
&= \frac{6+5i+i^2}{2^2-i^2} \\
&= \frac{6+5i-1}{2^2+1} \\
&= \frac{5(1+i)}{5} \\
&= 1 + i
\end{align}
$$

上記より$a=1, b=1$が得られる。

問題$11 \,$ 対数の計算

下記のように式変形を行える。
$$
\large
\begin{align}
(\log_{3}{2} + \log_{3}{8}) \cdot \log_{4}{3} &= \log_{3}{2^4} \cdot \frac{\log_{3}{3}}{\log_{3}{4}} \\
&= \frac{4 \log_{3}{2}}{2 \log_{3}{2}} \\
&= 2
\end{align}
$$

問題$12 \,$ 点と直線の距離

点と直線の距離の公式に基づいて下記のように計算できる。
$$
\large
\begin{align}
d &= \frac{|0-3-7|}{\sqrt{1^2+3^2}} \\
&= \sqrt{10}
\end{align}
$$

問題$13 \,$ 多項式関数の定積分

下記のように計算できる。
$$
\large
\begin{align}
\int_{0}^{2} (x^2-1) dx &= \left[ \frac{1}{3}x^3 – x \right]_{0}^{2} \\
&= \frac{2^3}{3} – 2 \\
&= \frac{2}{3}
\end{align}
$$

問題$14 \,$ 等比数列の一般項

$[1]$
数列の一般項を$a_n$、公比を$r$とおくと、$a_n = a_0 r^n$である。よって$r$に関して下記が成立する。
$$
\large
\begin{align}
\frac{a_4}{a_1} = \frac{a_0 r^4}{a_0 r} &= \frac{48}{6} \\
r^{3} &= 8 \\
r &= 2
\end{align}
$$

$[2]$
$[1]$の結果より、$a_1=2a_0$であるので$a_0=3$である。よって$a_6$は下記のように得られる。
$$
\large
\begin{align}
a_6 &= a_0 r^6 \\
&= 3 \times 2^6 \\
&= 192
\end{align}
$$

・注意事項
高校数学の範囲では$a_n=a_1r^{n-1}$の場合が多いが、一般的には$a_n=a_0r^n$で用いられることが多いので、ここでは$a_0$を用いました。

問題$15 \,$ ベクトルの内積

$[1]$
内積の定義式に基づいて下記のように計算できる。
$$
\large
\begin{align}
\vec{a} \cdot \vec{b} &= |\vec{a}||\vec{b}| \cos{120^{\circ}} \\
&= 2 \times 3 \times -\frac{1}{2} \\
&= -3
\end{align}
$$

$[2]$
下記のように計算できる。
$$
\large
\begin{align}
|\vec{a}+2\vec{b}| &= \sqrt{(\vec{a}+2\vec{b}) \cdot (\vec{a}+2\vec{b})} \\
&= \sqrt{|\vec{a}|^2 + |\vec{b}|^2 + 2\vec{a} \cdot \vec{b}} \\
&= \sqrt{2^4 + 3^4 + 2 \cdot (-3)} \\
&= \sqrt{28} \\
&= 2 \sqrt{7}
\end{align}
$$

$2$次:数理技能検定

問題$1 \,$

問題$2 \,$ 確率と期待値

$[1]$
下記のように計算できる。
$$
\large
\begin{align}
\frac{1}{6} \times \frac{5}{6} + \frac{5}{6} \times \frac{1}{6} = \frac{5}{18}
\end{align}
$$

$[2]$
期待値を$E[X]$とおくと$E[X]$は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= 3 \cdot \frac{1}{6^2} + 2 \cdot \frac{5}{18} + 1 \cdot \left( 1 – \frac{1}{6^2} – \frac{10}{6^2} \right) \\
&= \frac{1}{6^2} (3 + 20 + 25) \\
&= \frac{4}{3}
\end{align}
$$

問題$3 \,$ 直線と円の交点と円の接線

$$
\large
\begin{align}
x^2+y^2 &= 5 \\
x+y &= 1
\end{align}
$$

$[1]$
$y=-x+1$を$x^2+y^2=5$に代入すると下記が得られる。
$$
\large
\begin{align}
x^2 + (-x+1)^2 &= 5 \\
x^2 + x^2 – 2x + 1 – 5 &= 0 \\
2(x-2)(x+1) &= 0
\end{align}
$$

上記より、$\overrightarrow{OP}$と$\overrightarrow{OQ}$は下記のように表せる。
$$
\large
\begin{align}
\overrightarrow{OP} &= \left(\begin{array}{c} -1 \\ 2 \end{array} \right) \\
\overrightarrow{OQ} &= \left(\begin{array}{c} 2 \\ -1 \end{array} \right)
\end{align}
$$

$[2]$
$\overrightarrow{OR}$は下記の$2$通りで表せる。
$$
\large
\begin{align}
\overrightarrow{OR} &= \overrightarrow{OP} + k \left(\begin{array}{c} 2 \\ 1 \end{array} \right) = \left(\begin{array}{c} -1+2k \\ 2+k \end{array} \right) \quad (1) \\
\overrightarrow{OR} &= \overrightarrow{OQ} + l \left(\begin{array}{c} 1 \\ 2 \end{array} \right) = \left(\begin{array}{c} 2+l \\ -1+2l \end{array} \right) \quad (2)
\end{align}
$$

$(1)$と$(2)$が一致することに基づく連立方程式を解くと$k=3, l=3$が得られる。よって$\overrightarrow{OR}$は下記のように表せる。
$$
\large
\begin{align}
\overrightarrow{OR} &= \left(\begin{array}{c} -1+2k \\ 2+k \end{array} \right) \quad (1) \\
&= \left(\begin{array}{c} -1+6 \\ 2+3 \end{array} \right) \\
&= \left(\begin{array}{c} 5 \\ 5 \end{array} \right)
\end{align}
$$

問題$4 \,$ 数列の和と一般項

$$
\large
\begin{align}
S_{n} = n(n+1)(n+2)
\end{align}
$$

$[1]$
$n \geq 2$のとき一般項$a_n$は下記のように得られる。
$$
\large
\begin{align}
a_{n} &= S_{n} – S_{n-1} \\
&= n(n+1)(n+2) – (n-1)n(n+1) \\
&= n(n+1)[(n+2)-(n-1)] = 3n(n+1) \quad (1)
\end{align}
$$

また$a_1=S_1$より、$a_1 = S_1 = 1 \cdot 2 \cdot 3 = 6$であるが、$(1)$式に$n=1$を代入すると同様に$a_1=3 \cdot 1 \cdot 2=6$である。よって$n \geq 1$で$a_{n}=3n(n+1)$が成立する。

$[2]$
$\displaystyle \frac{1}{a_n} = \frac{1}{3n(n+1)}$について下記の式変形が成立する。
$$
\large
\begin{align}
\frac{1}{a_n} &= \frac{1}{3n(n+1)} \\
&= \frac{1}{3} \left[ \frac{1}{n} – \frac{1}{n+1} \right]
\end{align}
$$

よって$\displaystyle \sum_{i=1}^{99} \frac{1}{a_n}$は下記のように計算できる。
$$
\large
\begin{align}
& \sum_{i=1}^{99} \frac{1}{a_n} = \sum_{i=1}^{99} \frac{1}{3} \left[ \frac{1}{n} – \frac{1}{n+1} \right] \\
&= \frac{1}{3} \left( \frac{1}{1}-\cancel{\frac{1}{2}} \right) + \frac{1}{3} \left( \cancel{\frac{1}{2}}-\cancel{\frac{1}{3}} \right) + \cdots \frac{1}{3} \left( \cancel{\frac{1}{99}}-\frac{1}{100} \right) \\
&= \frac{1}{3} \left( 1 – \frac{1}{100} \right) \\
&= \frac{1}{3} \cdot \frac{99}{100} \\
&= \frac{33}{100}
\end{align}
$$

問題$5 \,$

問題$6 \,$ 対偶を用いた命題の証明

$[1]$
『$n^2+2n$が奇数 $\implies$ $n$は奇数』の対偶は『$n$が偶数 $\implies$ $n^2+2n$が偶数』である。

$[2]$
$n=2k, \, k \in \mathbb{N}$とおくと、$n^2+2n$は下記のように表せる。
$$
\large
\begin{align}
n^2 + 2n &= (2k)^2 + 2 \cdot 2k \\
&= 4k^2 + 4k \\
&= 2(2k^2+2k)
\end{align}
$$

よって『$n$が偶数 $\implies$ $n^2+2n$が偶数』が成立する。対偶が真であるので『$n^2+2n$が奇数 $\implies$ $n$は奇数』が成立する。

問題$7 \,$ 多項式関数の積分と面積

$$
\large
\begin{align}
p &: \, y = -x^2 + 3x \\
l &: \, y = 2x
\end{align}
$$

$[1]$
$-x^2 + 3x = 2x$は下記のように変形できる。
$$
\large
\begin{align}
-x^2 + 3x &= 2x \\
x^2 – x &= 0 \\
x(x-1) &= 0
\end{align}
$$

$x=0, 1$より、交点は$(0,0), \, (1,2)$である。

$[2]$
面積を$S$とおくと$S$は下記のように計算できる。
$$
\large
\begin{align}
S &= \frac{1}{2} \cdot 1 \cdot 2 + \int_{1}^{3} (-x^2+3x) dx \\
&= 1 + \left[ -\frac{1}{3}x^3 + \frac{3}{2}x^2 \right]_{1}^{3} \\
&= 1 + \frac{10}{3} = \frac{13}{3}
\end{align}
$$