LoginSignup
2
2
記事投稿キャンペーン 「AI、機械学習」

残差平方和と水準間平方和の期待値の導出方法(1元配置分散分析)

Last updated at Posted at 2023-11-03

期待値の導出は自分でやってみると面倒

分散分析を行うときに残差平方和(群内平方和)と水準間平方和(群間平方和)というものが出てきます。
これらの期待値は分散分析に直接関わることはないのですが、期待値が分かっていた方が何かと見通しが立ちやすいです。
これまでは、それらの期待値がどのような形で表現されるかは書籍などで知っていて、まあそんなものかと思っていました。
しかしふと気になって自分でその期待値を導出しようとしたら意外に苦戦してしまいました。
ネットで残差平方和と水準間平方和の期待値の導出方法を検索しても、私の探したかぎり見つからなかったので、その備忘録もかねてここにくどいくらいに詳しく記録しておきます。

前提条件

以下のようなデータの1元配置だとする。

水準 各水準でのデータの大きさ 観測値 平均
$A_1$ $n_1$ $y_{11}, y_{12},\cdots, y_{1n_{1}}$ $\bar{ y}_{1\cdot}$
$A_2$ $n_2$ $y_{21}, y_{22},\cdots, y_{2n_{2}}$ $\bar{ y}_{2\cdot}$
$\vdots$ $\vdots$ $\vdots$ $\vdots$
$A_a$ $n_a$ $y_{a1}, y_{a2},\cdots, y_{an_{a}}$ $\bar{ y}_{a\cdot}$

この一元配置のデータを表現するモデルとして

y_{ji}=\mu+\alpha_j+\epsilon_{ji} \label{a}\tag{1}

を想定する。
ただし、

\begin{align}
j&=1,2,\cdots,a  \\
i&=1,2,\cdots,n_j
\end{align}

であり、

\sum_{j=1}^{a}n_j\alpha_j = 0

という制限事項があることに注意する。
また、$\epsilon_{ji}$は誤差項で互いに独立であり、平均を$0$,分散を$\sigma^2$とする正規分布に従っている。($\epsilon_{ji} \sim N(0, \sigma^2)$)
$\mu$は一般平均である。
$\alpha_{j}$は水準$A_j$の効果である。
添え字の$\cdot$は、その添字について平均をとったという意味である。

残差平方和と水準間平方和を導出

ここまでの前提からまずは残差平方和と水準間平方和を導出します。
モデル式$(\ref{a})$から

\begin{align}
y_{ji}&=\bar{y}_{\cdot\cdot} + (\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})+(y_{ji}-\bar{y_{j\cdot}}) \\
\Leftrightarrow y_{ji} - \bar{y}_{\cdot \cdot} &= (\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot}) + (y_{ji}-\bar{y_{j\cdot}}) 
\end{align}

この両辺を二乗すると、

\begin{align}
(y_{ji} - \bar{y}_{\cdot \cdot})^2 &= \{(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot}) + (y_{ji}-\bar{y_{j\cdot}})\}^2 \\
&=(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 + (y_{ji}-\bar{y_{j\cdot}})^2 + 2(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})(y_{ji}-\bar{y_{j\cdot}}) \\
\end{align}

両辺の総和をとると、

\begin{align}
\sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 &=  \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 + \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(y_{ji}-\bar{y_{j\cdot}})^2 + \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}2(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})(y_{ji}-\bar{y_{j\cdot}}) \label{b}\tag{2}
\end{align}

ここで$(\ref{b})$の第3項について詳しくみる。

\begin{align}
\sum_{j=1}^{a}\sum_{i=1}^{n_{j}}2(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})(y_{ji}-\bar{y_{j\cdot}}) &=  \sum_{j=1}^{a}2(\bar{y_{j\cdot}}-\bar{y}_{\cdot \cdot})\sum_{i=1}^{n_j}(y_{ji}-\bar{y}_{j\cdot}) \\
&= 0
\end{align}

である。
なぜなら、

\begin{align}
\sum_{i=1}^{n_j}(y_{ji}-\bar{y}_{j\cdot}) &= (y_{j1}-\frac{1}{n_j}\sum_{i=1}^{n_j}y_{ji}) + (y_{j2}-\frac{1}{n_j}\sum_{i=1}^{n_j}y_{ji}) + \cdots + (y_{jn_j}-\frac{1}{n_j}\sum_{i=1}^{n_j}y_{ji}) \\
&= (y_{j1} + y_{j2} + \cdots + y_{jn_j}) - n_j \times\frac{1}{n_j}\sum_{i=1}^{n_j}y_{ji} \\
&= \sum_{i=1}^{n_j}y_{ji} - \sum_{i=1}^{n_j}y_{ji} \\
&= 0
\end{align}

これらによって$(\ref{b})$は、

\sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 =  \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 + \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(y_{ji}-\bar{y_{j\cdot}})^2 \label{c}\tag{3}

となる。
ここで、
$(\ref{c})$の右辺の第一項を水準間平方和と呼び$S_{A}$と表す。
$(\ref{c})$の右辺の第二項を残差平方和と呼び$S_{e}$と表す。
すなわち、

\begin{align}
S_{A} &= \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(\bar{y_{j\cdot}}-\bar{y}_{\cdot\cdot})^2 \\
S_{e} &= \sum_{j=1}^{a}\sum_{i=1}^{n_{j}}(y_{ji}-\bar{y_{j\cdot}})^2 
\end{align}

である。
なお、$(\ref{c})$の左辺を総平方和と呼び、$S_{T}$で表す。

そもそもなぜ水準間平方和と残差平方和が必要なのか

そもそも分散分析で残差平方和$S_{e}$と水準間平方和$S_{A}$を求める理由は、それらを使ってF分布で検定を行うことができるからである。
何を検定するかというと、各水準ごとに効果の差があるか否かを検定する。

このことをもう少し具体的に述べる。
各水準に効果の差がないとき($\alpha_1=\alpha_2=\cdots=\alpha_a = 0$)には、
残差平方和と水準間平方和の平均平方の期待値が

E(S_{e}/\phi_e)=E(S_A/\phi_A)=\sigma^2 \label{d}\tag{4}

である(後述)。
残差平方和と水準間平方和の自由度をそれぞれ$\phi_{e}$と$\phi_{A}$とおいた。
以下の$F$統計量は自由度$(\phi_A, \phi_e)$のF分布に従う。

F = \frac{(S_A/\sigma^2)/\phi_{A}}{(S_e/\sigma^2)/\phi_e} = \frac{S_A/\phi_A}{S_e/\phi_e}\sim F(\phi_A, \phi_e)

まずはこの、「各水準に差がないときにはF統計量がF分布に従うということ」を念頭におく。
それに対して、「各水準で差がある($\alpha_1, \alpha_2, \cdots, \alpha_a$のいずれかが0ではない)」場合には、$F$統計量はF分布に従う変数よりも大きな実現値を取りやすくなり、F分布には従わなくなる。

従って、この$F$統計量の実現値を見ることで大きい値が出ていたら、「各水準に差がない」ということは考えにくいなということが検定できる。

さて、ここで$S_{A}/\phi_{A}$や$S_{e}/\phi_e$の期待値を計算しておけば、だいたいどれくらいの値が想定されるのかが分かって便利である。
例えば、「各水準に差がある」場合には、$E(S_A/\phi_A)>E(S_e/\phi_e)$となる。
このために水準間平方和$S_A$と残差平方和$S_e$の期待値を求めておきたい。
(厳密には水準間平方和$S_A$ではなく、それをその自由度$\phi_A$で割った$S_A/\phi_A$の期待値であるが、$\phi_A$は定数なので計算にはあまり関係ない。残差平方和も同じ。)
しかしなかなかどこにも導出が載っていないので、自力で頑張って導出した次第である。

残差平方和と水準間平方和の期待値を導出する

残差平方和の期待値の導出

残差平方和$S_e$の期待値$E[S_{e}]$を導出する。

\bar{y}_{j\cdot} = \frac{1}{n_{j}}\sum_{i=1}^{n_j}y_{ji}=\frac{1}{n_j}\sum_{i=1}^{n_j}(\mu+\alpha_{j}+\epsilon_{ji})=\mu+\alpha_{j}+\bar{\epsilon}_{j\cdot}

であるから、

\begin{align}
E[S_e]&=E[\sum_{j=1}^{a}\sum_{i=1}^{n_j}(y_{ji}-\bar{y}_{j\cdot})^2] \\
&= E[\sum_{j=1}^{a}\sum_{i=1}^{n_j}\{(\mu+\alpha_{j}+\epsilon_{ji})-(\mu+\alpha_{j}+\bar{\epsilon}_{j\cdot})\}^2] \\
&=E[\sum_{j=1}^{a}\sum_{i=1}^{n_j}(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2] \\
&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}E[(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2]
\end{align} \label{e}\tag{5}

ここで、

\begin{align}
E[\epsilon_{ji}-\bar{\epsilon}_{j\cdot}] &= E[\epsilon_{ji}] - E[\bar{\epsilon}_{j\cdot}] \\
&=E[\epsilon_{ji}]-E[\frac{1}{n_j}\sum_{i=1}^{n_j}\epsilon_{ji}] \\
&=0
\end{align}

より、

\begin{align}
E[(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2]&=E[(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2-0] \\
&=E[(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2-E[\epsilon_{ji}-\bar{\epsilon_{j\cdot}}]] \\
&=V[\epsilon_{ji}-\bar{\epsilon_{j\cdot}}]
\end{align}

これらのことより、$(\ref{e})$は、

\begin{align}
E[S_e]&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}E[(\epsilon_{ji}-\bar{\epsilon_{j\cdot}})^2] \\
&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}V[\epsilon_{ji}-\bar{\epsilon_{j\cdot}}] \\
&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}(V[\epsilon_{ji}]+V[\bar{\epsilon_{j\cdot}}]-2cov[\epsilon_{ji},\bar{\epsilon}_{j\cdot}]) \label{f}\tag{6}
\end{align}

さらにここで、

V[\epsilon_{ji}]=\sigma^2
V[\bar{\epsilon}_{j\cdot}]=V[\frac{1}{n_j}\sum_{i=1}^{n_j}\epsilon_{ji}]=\frac{1}{n_{j}^2}\sum_{i=1}^{n_j}V[\epsilon_{ji}]=\frac{\sigma^2}{n_j}
\begin{align}
cov[\epsilon_{ji},\bar{\epsilon}_{j\cdot}]&=cov[\epsilon_{ji},\frac{1}{n_j}\sum_{i'=1}^{n_j}V[\epsilon_{ji'}]] \ (i'に注意!)\\
&=\frac{1}{n_j}\sum_{i'=1}^{n_j}cov[\epsilon_{ji}, \epsilon_{ji'}] \\
&= \frac{1}{n_{j}}cov[\epsilon_{ji}, \epsilon_{ji}] \ (\because i=i'以外のときは共分散は0)\\
&= \frac{1}{n_j}V[\epsilon_{ji}] \ (\because 共分散と分散の基本的な変形)\\
&=\frac{\sigma^2}{n_j}
\end{align}

共分散$cov$の計算では$\epsilon$が互いに独立であるという事実を使っている。
以上より$(\ref{f})$は、

\begin{align}
E[S_e]&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}(V[\epsilon_{ji}]+V[\bar{\epsilon_{j\cdot}}]-2cov[\epsilon_{ji},\bar{\epsilon}_{j\cdot}]) \\
&=\sum_{j=1}^{a}\sum_{i=1}^{n_j}(\sigma^2+\frac{\sigma^2}{n_j}-2\frac{\sigma^2}{n_j}) \\
&=\sum_{j=1}^{a}(n_j - 1)\sigma^2 \\
&=(n_1+n_2+\cdots+n_a - a)\sigma^2
\end{align}

これで残差平方和の期待値は計算できた。
$E[S_e]=(n_1+n_2+\cdots+n_a - a)\sigma^2$

水準間平方和の期待値の導出

水準間平方和$S_A$の期待値$E[S_A]$を導出する。

E[S_A]=E[\sum_{j=1}^{a}n_j(\bar{y}_{j\cdot}-\bar{y}_{\cdot\cdot})^2] \label{g}\tag{7}

ここで、$\bar{y}_{j\cdot}$は残差平方和の導出のときに求めていたので既知であり、

\bar{y}_{j\cdot}=\mu + \alpha_{j} + \bar{\epsilon}_{j\cdot}

$\bar{y_{\cdot\cdot}}$については、$\sum_{j=1}^{a}n_j\alpha_j = 0$に注意して、

\begin{align}
\bar{y}_{\cdot\cdot}&=\frac{1}{N}(\mu + \alpha_j + \epsilon_{ji}) \\
&=\mu + \frac{1}{N}(n_1\alpha_1+n_2\alpha_2+\cdots+n_a\alpha_a) + \bar{\epsilon}_{\cdot\cdot} \\
&=\mu + \bar{\epsilon}_{\cdot\cdot}
\end{align}

ただし$N=n_1 + n_2 + \cdots + n_a$と置いた。以下もこの$N$を使う。
これらのことを用いて、$(\ref{g})$は、

\begin{align}
E[S_A] &= E[\sum_{j=1}^{a}n_j(\bar{y}_{j\cdot}-\bar{y}_{\cdot\cdot})^2] \\
&= E[\sum_{j=1}^{a}n_j\{(\mu + \alpha_j + \bar{\epsilon}_{j\cdot})-(\mu + \bar{\epsilon_{\cdot\cdot}})\}^2] \\
&= E[\sum_{j=1}^{a}n_j\{ \alpha_j + (\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot})\}^2] \\
&=\sum_{j=1}^{a}n_jE[\{\alpha_j+(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot})\}^2] \\
&= \sum_{j=1}^{a}n_jE[\alpha_j^2] + \sum_{j=1}^{a}n_jE[(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot})^2] + \sum_{j=1}^{a}n_jE[2\alpha_j\bar{(\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot})] \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}n_jE[(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot})^2] + 2\sum_{j=1}^{a}n_j\alpha_jE[\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot}] \label{h}\tag{8}
\end{align}

このとき、

\begin{align}
E[\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot}] &= E[\bar{\epsilon}_{j\cdot}]-E[\bar{\epsilon}_{\cdot \cdot}] \\
&=E[\frac{1}{n_j}\sum_{i=1}^{n_j}\epsilon_{ji}]-E[\frac{1}{N}\sum_{j=1}^{a}\sum_{i=1}^{n_j}\epsilon_{ji}] \\
&=\frac{1}{n_j}\sum_{i=1}^{n_j}E[\epsilon_{ji}]-\frac{1}{N}\sum_{j=1}^{a}\sum_{i=1}^{n_j}E[\epsilon_{ji}] \\
&=0
\end{align}

だから$(\ref{h})$は、

\begin{align}
E[S_A] &= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}n_jE[(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot})^2] + 2\sum_{j=1}^{a}n_j\alpha_jE[\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot}] \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}n_jE[(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot})^2] \label{i}\tag{9}
\end{align}

さらに今求めた

E[\bar{\epsilon}_{j\cdot} - \bar{\epsilon}_{\cdot \cdot}] = 0

から、

\begin{align}
E[(\bar{\epsilon}_{j\cdot}-\bar{\cdot\cdot})^2] &=
E[\{(\bar{\epsilon}_{j\cdot}- \bar{\epsilon}_{\cdot\cdot})-0\}^2] \\
&=E[\{(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot})-E[\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot}]\}^2] \\
&=V[\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot\cdot}] \\
&=V[\bar{\epsilon}_{j\cdot}]+V[\bar{\epsilon}_{\cdot\cdot}]-2cov[\bar{\epsilon}_{j\cdot}, \bar{\epsilon}_{\cdot\cdot}] \ (\because 分散の基本的な変形)
\end{align}

だから、$(\ref{i})$は、

\begin{align}
E[S_A]&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}n_jE[(\bar{\epsilon}_{j\cdot}-\bar{\epsilon}_{\cdot \cdot})^2] \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}n_j(V[\bar{\epsilon}_{j\cdot}]+V[\bar{\epsilon}_{\cdot\cdot}]-2cov[\bar{\epsilon}_{j\cdot}, \bar{\epsilon}_{\cdot\cdot}]) \label{j}\tag{10}
\end{align}

ここで、

    V[\bar{\epsilon}_{j\cdot}]=V[\frac{1}{n_j}\sum_{i=}^{n_j}\epsilon_{ji}]=\frac{1}{n_{j}^2}\sum_{i=1}^{n_j}V[\epsilon_{ji}]=\frac{1}{n_{j}^2} \times n_j\sigma^2 = \frac{\sigma^2}{n_j}
V[\bar{\epsilon}_{\cdot\cdot}] = V[\frac{1}{N}\sum_{j=1}^{a}\sum_{i=1}^{n_j}\epsilon_{ji}] = \frac{1}{N^2}\sum_{j=1}^{a}\sum_{i=1}^{j=n_j}V[\epsilon_{ji}]=\frac{1}{N^2}\times N\sigma^2=\frac{\sigma^2}{N}
\begin{align}
cov[\bar{\epsilon}_{j\cdot},\bar{\epsilon}_{\cdot\cdot}]&=cov[\bar{\epsilon}_{j\cdot}, \frac{1}{N}\sum_{j=1}^{a}n_j\bar{\epsilon}_{j\cdot}] \\
&=\frac{n_j}{N}\sum_{j=1}^{a}cov[\bar{\epsilon}_{j\cdot},\bar{\epsilon}_{j\cdot}] \\
&=\frac{n_j}{N}V[\bar{\epsilon}_{j\cdot}] \ (\because cov[X, X] = V[X]と同じ水準出ないなら共分散は0) \\
&=\frac{n_j}{N}V[\frac{1}{n_j}\sum_{i=1}^{n_j}\epsilon_{ji}] \\
&=\frac{n_j}{N} \times \frac{1}{n_{j}^2} \times n_j\sigma^2 \\
&=\frac{\sigma^2}{N}
\end{align}

よって$(\ref{j})$より、

\begin{align}
E[S_A] &= \sum_{j=1}^{a}n_j\alpha_{j}^2+\sum_{j=1}^{a}n_j(\frac{\sigma^2}{n_j}+\frac{\sigma^2}{N}-2\frac{\sigma^2}{N}) \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \sum_{j=1}^{a}(\sigma^2 - \frac{n_j}{N}\sigma^2) \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + \{(1-\frac{n_1}{N})+(1-\frac{n_2}{N})+\cdots+(1-\frac{n_a}{N})\}\sigma^2 \\
&= \sum_{j=1}^{a}n_j\alpha_{j}^2 + (a-1)\sigma^2
\end{align}

これで水準間平方和の期待値も計算できた。

E[S_A] = \sum_{j=1}^{a}n_j\alpha_{j}^2 + (a-1)\sigma^2

水準に差がなければ水準間平方和と残差平方和の期待値は等しい理由

$(\ref{d})$で後述すると述べたことをここで説明する。
ここまでで示したように、水準間平方和$S_A$と残差平方和$S_e$の期待値は、それぞれ、

E[S_A] = \sum_{j=1}^{a}n_j\alpha_{j}^2 + (a-1)\sigma^2

E[S_e]=(n_1+n_2+\cdots+n_a - a)\sigma^2

であることはわかった。
水準に差がなければ$\alpha_1=\alpha_2=\cdots=\alpha_a=0$だから$E[S_A]=(a-1)\sigma^2$となる。
さて、ここで$S_A$の自由度$\phi_A$は$a-1$であり、$S_e$の自由度$\phi_e$は$n_1+n_2+\cdots+n_a-1$である。
従って

E[S_A/\phi_A] = \frac{(a-1)\sigma^2}{(a-1)} = \sigma^2
E[S_e/\phi_e] = \frac{(n_1+n_2+\cdots+n_a-1)\sigma^2}{n_1+n_2+\cdots+n_a-1}=\sigma^2

となる。

あとがき

大学以降の内容の教科書・参考書は、大学受験のそれらと比べて雑な記述が目立ちますよね。
練習問題がついていたとしても解答がなかったり、解答があったとしても答えだけであり詳しい導出がないことばかりです。
自分で考えてこそ思考力がつくのだという意見はその通りだと思いますし、あまりに丁寧な説明を求めるのは研究するにあたって主体性のない受験勉強型の人間だとも思っています。
そうではありますけど、もう少し後に続く人たちが理解しやすいように誘導をかけても良いのではないかと思います。
大学数学とはいっても、現代の先端的な数学から見たらごく基本的なものにすぎないのですから、もう少し先端数学の麓までは充実した案内が欲しいところです。
その気になれば丁寧な解説を見ずに自力で勉強研究はできるわけですから。
まあもっとも、丁寧な説明を求めることへの批判として「主体的な研究姿勢の欠如」が挙げられていますが、そもそもそういった姿勢を育むための教育的観点から、あえて導出などを省いた雑な記述をしているというわけではないとも思います。
というのも、やはり丁寧な記述をするにはそれだけエネルギーが必要なので、執筆者が安きに流されて雑な記述をしてしまうのだろうなというのも、このQiita記事を書いていて感じました。
(数式の記述がめちゃくちゃ面倒だった・・・)

2
2
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
2