この記事は何?
(主にうどんの茹で汁の) 濁度・水質に関連するシステムを作る人の為に残す備忘録
やりたいこと
ソフト上で水質を簡易的に推定する
事前知識s(最悪読まなくてもおk)
濁度
濁り具合のこと。単位はNTUとかFTUとかいろいろ。
※今回は、濁度センサーが検知した濁度をデジタル信号として受け取っているので、単位については考えなくていい。
BOD(生物化学的酸素要求量)
水質の指標。値が高ければ高いほど水質が悪い事を指す。
(微生物が水中の有機物を分解する際に必要とする酸素量のこと)[1]
※一般的には濁度との相関はない。[2]
COD(化学的酸素要求量)
BOD同様に水質の指標。値が高ければ高いほど水質が悪い事を指す。[3]
(酸化剤が水中の有機物をで分解する際に消費される酸素量のこと)
※濁度との相関はあるみたい。[2]
回帰モデル
複数の変数の関係性を数式に表すことで、ある地点での値を予測する統計方法のこと。
決定係数
$R^2$と表記する。散布図から近似式を導いた時、実際のモデルにどれだけ沿っているかを示す。いわば精度。範囲は0~1。高いほど精度が良い。
ヒルの式(Hillモデル)
アーチボルド・ヒルさんが生化学で用いた式の形。
非線形回帰の時に結構使えるみたい。
Box_Cox変換(Box-Coxモデル)
データの分布を正規分布に近づけるための統計的な変換手法
分散を安定化させる
残差グラフ
予測値と、学習データの誤差を分かりやすくプロットしたグラフ。
なんでこんなモデルを作ったのか
・水質を正確に測定するにはウン十万円もする機械を買わないといけないから
・その機械で測定するのにめちゃくちゃ時間がかかる(CODだと数時間、BODだと5日間)
・濁度を測るのは、センサーを買えば比較的簡単!
・うどんの茹で汁に多く含まれているでんぷんがBOD・濁度の上昇に大きく影響している
→なら相関あるんじゃね?
→じゃあ濁度から水質を推定する回帰モデル作ればええやん!
用意したもの
Grove 濁度センサー(4000円前後)
うどんの茹で汁の濁度を簡易的に測るためのセンサー。
Arudinoを始めとしたマイコンに接続する事で使用可能。
受け取る値が高ければ高いほど濁っていない(=濁度が低い)事を指す。
60℃までしか対応してないので、熱湯などでは使用しない方が良い。
→このセンサーでの実用化は難しいかも。
何故かセンサーが水没しても乾燥させたら使える。(←!!?)
マイコン(Arduino UNO R4 WIFI と doit ESP32 devkit1)(Aruduinoは5000円前後、ESP32は1000円強くらい。)
濁度センサーで読み取った値を電圧からデジタル信号に変換し、ソフトへデータを送信するのに必要。
※今回私が作ったシステムではBluetoothを接続する必要があったが、接続が上手くいかなかったのでESP32というマイコンも使う事にした。
(Arduino UNO R4 WIFIではBluetooth接続が行われないバグ的なものがあるそうな。)
BOD・COD測定パックテスト(1回の測定あたり100円)
溶液の水質(BODやらCODやら)を簡易的に調べられるやつ。
pH試験紙みたいな感じで、測定値によって溶液の色が変わる。
色を目視(もしくは理化学研究所が提供しているアプリ)で確認する。
濁度→水質(BOD・COD)のモデルを実際に作成する為に使用した。
BODパックテスト(50個入り)
CODパックテスト(50個入り)
※理化学研究所が提供しているアプリでは、特にCODが正確に測れないので注意が必要(2025/10/13時点)
3Dプリンター・フィラメント etc...(任意)
うどん店で導入する事も考え、利便性の為に3Dプリンターで推定キットなるものを作成する事にした。
※これがなくても実装は可能であるが、外部の光によって濁度センサーからの値が変動する。
→使うマイコンのサイズを知るためにデジタルノギスを買っておくと良い(1199円)
ワイヤー・小さめの抵抗(任意)(1399円)
いざって時にあると便利。分圧したい時とか。
オスもメスもあってよかった↓
うどんの材料s(6~7000円分くらい)
最重要物品。
1から学習データを作るなら結構な量のうどんの茹で汁が必要になる。
今回は100個ほどのデータを作る為に、以下の量の材料を使用した。
・小麦粉・・・約8.5kg
・打ち粉(片栗粉など)・・・約1.5kig
・塩・・・約300g
・お好みで麺つゆなど・・・約4L
うどんこねこね
実際にうどんをこねて、濁度とBOD・CODの散布図を作った。
濁度とBODの散布図
濁度とCODの散布図
結構よさげなデータが集まった。
(CODはデータ収集の方法を間違えたので、極端にデータが少ない。ごめん。)
学習データこねこね
今のデータセットのままだと、回帰モデルの数式は限られてくると考えた。
(加速的にBODが減少する式しか書けない為、下記のような数式ばっかりになる。)
(式.1) $BOD(T) = -aT^2 + b (a,b > 0)$
T = 濁度センサーから受け取った値
b = 0よりも大きい任意の切片
ここで、新たな変数を宣言した。
(式.2) $Tnew = 730 - T$
これは、水の濁度を測定した際に受け取るデジタル信号が、いつもだいたい730であることを使った符号反転。 要は、前までは「値が高ければ濁度が低い」と意味する数値を「値が高ければ濁度も高い」と意味する数値に変換した。
こうする事によって、モデルの多様性が広がり、式1のようなモデルだけでなく、
$log(T)$だとか$\sqrt{T}$なんかも許容されるようになる。うれしいね。
てなわけで、濁度とBODの散布図が以下のようになった。
左右反転しただけやね。

回帰モデルこねこね
学習データもできたし、そいつらを整形したんで、実際にモデルを作っていく。
今回の記事では濁度とBODについてのみを取り上げる。
※回帰モデル作るのはこれが初めてなんで温かい目で見てくださいまし。
※japanize-matplotlib入れるの忘れてた
ひとまず、試してみた回帰モデルを挙げてみる。ありがとうChatGPT Pro[4]
- 多項式モデル
- 線形モデル
- 対数モデル
- 指数モデル
- べき乗モデル
- 逆数モデル
- 平方根モデル
- 立方根モデル
- Hillモデル
- Box-Coxモデル
一旦、符号反転前のデータから回帰モデルを作り、決定係数が高いもので比較してみた。

$R^2$は一番高いもので0.87と調子が良い...
でも、どう考えても多項式モデルは違うな、こんな波打つわけねーもんな...
というわけで、符号反転後のデータから回帰モデルを作り直してみた。
それがこちら。

対数関数の性質で、対数モデルがとんでもない値をたたき出してるし、決定係数下がったけど、見た目は良い感じ...。
T-newが0の時にBODも0になるのが確定事項だから、Hillモデルかべき乗モデルかBox-Coxモデルを使用しようと思う。この3つのモデルの精度を比較してみよう。
※T-newが~の時にBODは厳密に~になるように(アンカーって言うらしい)してモデルを作ると、精度が下がるようなので、今回はしないことにした。


それっぽいグラフになってきた!
けど、残差グラフをみたら、高濁度上のBODの上振れが確認された。
(学習データ上ではBODが8000[mg/L]を越えることも珍しくなかったが、このモデル上では中々越えられない。)
ので、バレない程度に補正をかけていこうと思う。
改竄こねこね
先ほどの数式sに$y = cx^d(c,dは定数)$ みたいな、加速的に上昇する関数を合成して精度向上を目指す。その結果がこちら。


いいんじゃなかろうか。
これである程度の精度下でうどんの茹で汁の水質の推定ができるだろう...。
実際にやってみた
検証用のデータを渡して、そいつとの誤差を見てみる。

プロットがy=xに沿っていればいるほど精度が高いとされるそうだ。
少しの誤差が生じているものの、上振れを補正する事に成功した。
結果生まれた推定モデルの式がこちら。
すごそう。
この式を使う事によって濁度センサーから水質を推定できるだろう。
まとめ
・濁度と水質(BOD)には相関はない→うどんは例外的に可能。
・濁度センサーから取得した値と実際に測定したBODで推定モデルを作ることは可能。
この記事からうどんの茹で汁の水質に関するシステムが増えてくれると嬉しいですね。
以上。
参考文献s
[1] 淀川華扇事務所「BODとは」https://www.kkr.mlit.go.jp/yodogawa/know/summary/quality/wq_bod.html
[2] Nguyen, L.A.T., Ward, A.J., Lewis, D. Utilisation of turbidity as an indicator for biochemical and chemical oxygen demand. Journal of Water Process Engineering, 4, 137–142 (2014). http://dx.doi.org/10.1016/j.jwpe.2014.09.009
[3] TechEyesOnline「CODとは」https://www.techeyesonline.com/glossary/detail/COD/
[4] ChatGPT chatgpt.com



