はじめに
バグの理由がさっぱりわからない...
理由を述べても「それ、因果じゃなくて相関あるだけなじゃい?」と言われる...
こんなことありませんか?
そんな駆け出しエンジニアのあなたは因果と相関を勉強すると良いかも?
論理的思考力を高めて、業務を効率よく進めましょう。
対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
- 論理的思考力が弱い、と感じる人
- 理由を考えるのが苦手な人
結論
因果関係=「完全にこいつのせいじゃん、これを改善すれば解決じゃん」
相関関係=「こいつと関係ありそう...これを修正すれば解決...かも...」
因果関係とは
因果関係とは、理由がはっきりしている関係のことです。
下記に例を示します。
- サーバーが落ちたので、ホームページが表示されなくなった。
- CSSの記述を変更したら、文字が赤で表示された。
- 修正をデプロイしたら、エラーが出た。
Aしたら、Bになったという構造です。
下記3点に気をつけましょう。
- Aの後にBが起きていること
- Aをしたら必ずBになること(まぐれではなく、再現性があること)
- Aをしない時はBにならないこと
上記の通り、何度も確認して再現性を取る必要があるため、世の中のほとんどの仮説は因果関係を証明できません。
「タバコを吸う人は早死にする」ことを何度もトライして証明するのは難しいですよね。
しかし、プログラミングの世界では、何度もトライすることが可能なので、再現性を確認して、因果関係を証明しましょう。
相関関係とは
因果関係を見つけられれば、バグ修正は完了ですが、世の中そんなに簡単にはいきません。
そんな時には相関関係を活用しましょう。
名前は難しそうですが、関係ありそう感=相関と覚えておけば良いです。
ちなみに、相関には「正の相関」と「負の相関」があります。
- 正の相関:一方が増えると、もう一方も増える。正比例の関係。
- 負の相関:一方が増えると、もう一方が減る。反比例の関係。
相関関係の例は下記の通り。
正の相関:仕事ができる先輩は高いキーボードを持っている人が多い。
負の相関:作業効率が低い人ほど、残業時間が長い。
Aの場合、Bになるという関係ですね。
因果関係とは異なり、AとBの時系列は気にしなくて良いです。
また、因果関係とは異なり、再現性も弱めなことがわかります。
高いキーボードを買ったからといって、あなたの仕事力がいきなり上がったりはしないですよね?
作業効率を上げたからといって、必ず残業時間が減るとは限りません。
上記のように、因果関係と比べると「関係あるかも?」くらいのノリです。
疑似相関に要注意
相関関係を検証する際、疑似相関という落とし穴に気をつけましょう。
ぱっと見はそう感がありそうですが、他の要因が絡んでいるため、解決にはつながらない、という罠です。
下記の例で理解してみましょう。
仮に、複数店舗で利用するシステムで、「同時利用者数が多い店舗で、サーバーからの応答時間が長くなっている」という報告がきたとします。
一見すると、相関がありそうな気がしますね。
この報告に基づいて、「同時アクセス数に制限をかける」修正をデプロイしましたが、問題は解決せず。
後日、別の目線で解析したところ、「利用開始してから長期間経っている店舗で不具合がある」ということに気づきました。
検証を進めると、「運用期間が長い→DBのデータ量が増える→サーバー応答時間が長くなる」という関係が見えてきました。
結果、「定期的にデータを削除するスクリプトを実装」することで問題を解決できました。
おわりに
因果と相関についてまとめました。