多次元データを読み解く ー養殖管理のヒントは天気予報にあるという話
養殖、奥が深い…
僕は養殖の生産管理サービス(業務システム)を作っています。タイやブリを育てる生産者さんにエサの量や水温を記録してもらい、データ分析を自動化・効率化するような感じです。詳しい紹介は割愛します。
もうかれこれこの業界に飛び込んで2~3年が経ちますが、やればやれほどこの養殖という領域は奥が深いなと感じます。特に感じるのは今回の記事で取り扱おうと思っているデータ構造と分析の奥行きの深さみたいな話です。
計算するだけでいいのか
養殖管理だけに尖ったサービス開発をやってきたこともあり、概ねどんなデータでも欲しいデータが計算できる土台が整ってきました。それもあって分析関連の機能がいろいろリリースできるようになってきました。
それ自体は喜ばしいことなのですが、同時に新しい課題が見えてきました。自分で分析作業をやってみるとよくわかるんですけど、計算結果を眺めただけだとどうにも世界を上手く捉えられていない気がするんですよ。分析は「できる」んですけど、どうにも足りない。「これでいいのかな」となってしまうんです。60点でいいんならいいですけど、どうせなら300点目指したいじゃないですか。
このモヤッとする感じはなぜ生まれるのか、どうすれば解消されるのかを考えてみたというのが今回のテーマです。そしてその答えは天気予報にあったというのがこの記事の趣旨です。
「は?天気予報って何言っちゃってるの?」
そう思ったあなた、続きをどうぞ笑
わからないのは多次元構造だから
現代社会において僕たちは日々膨大な量のデータに囲まれています。それは何も養殖に限った話ではありません。そしてこれらのデータは多くの場合、複数の要素や変数を含む多次元構造を持っています。ただ人間の認知能力に限界があり、この多次元構造をありのまま理解するのはちょっと難しいんですよね。いきなりですが、これこそが僕のモヤモヤの正体でもあります。
たとえば人間の健康診断もそうです。健康診断で出てくる「健康か」の指標はいろいろあり、それぞれが正常値かをチェックしますよね。1人の人間に張り付くデータの変数がたくさんあるということです。BMIしか計算してくれない健康診断とか論外ですし、血糖値の過年度比較グラフだけ出されても健康かは判断できません。
もっと簡単な例はサイコロです。上から見たときの目が3だったとき、「このサイコロの目は全部3なんだぜ!」ってドヤってたらちょっと恥ずかしくないですか?笑
・全部で6面あって、1~6の目があるんだな
・3の裏は見えないけど、4の目があるよね
みたいなことをメタ的に認知できて初めてサイコロのことを「わかった」と言えるんじゃないかと思います。
データが相互に繋がっているから意味がある
たとえば飼育結果が芳しくなさそうな魚がいるときに、その魚の生産効率を表現する指標というのはひとつではありません。増肉係数(FCR)は養殖でよく使われる指標ですが、これだけで成績を判断するというのはちょっと浅すぎると思いませんか?
だって去年と比べたら今年が特別悪いわけではないかもしれませんよ?成長や餌食いには水温も影響しますよね。水温などの環境データは見なくていいんですか?餌のやりすぎ(無駄エサが発生)のせいかもしれないし、餌の品質のせいかもしれません。純粋に成長が悪かったのかもしれません。病気が発生していたせいかもしれないし、その対処に問題があったかもしれません…挙げればキリがありません。
それぞれの問いにはもちろん問いと対になる答え・データがあります。そして相互に繋がっています。データ空間はかなり広範に広がっていて、1つひとつのデータが他のいろいろなデータと相互に関連しあうことで、総体として意味のある形を成しています。
「増肉係数が2.53でした!」というのを計算して満足するということは、この複雑なデータのまとまりをたった一つの視点から見た景色だけで分かった気になっているということに他なりません。サイコロの話と同じです。
どうすれば多次元データは直感的に理解できるようになるのか
とはいえ、冒頭にも書いた通り、人間の認知能力には限界があります。多次元データをありのまま何の加工もなしの状態で直感的に理解することは非常に困難です。
従って多次元データを使って効果的なデータ分析や意思決定を行うためには、複雑な多次元データを適切に処理し、解釈可能な形に変換する必要があるということになります。たとえば、健康診断の結果の一覧表でもA判定・B判定みたいなものが返ってくると思いますが、あれもひとつのデータ変換のやり方ですよね。
そして実はこの構造的な問題を考えるときに僕が参考になるなと思ったのは、他社の類似サービスでもなく、類似業界(畜産・農業など)のサービスでもありませんでした。
そう、それが天気予報アプリでした。
天気予報と養殖はデータ構造がよく似ている
天気予報と養殖の生産性分析は一見すると全く異なる分野のように思えます。しかし、データ分析の観点から見ると、両者は意外と類似した構造を持っていることに気がつきます。
天気予報では、気温、湿度、気圧、風向、風速など、多くの気象要素を考慮する必要があります。これらの要素は、時間や場所によって刻々と変化します。養殖でも先の例の通り、水温、溶存酸素、餌の量、種苗、魚の成長率など、多くの要因を管理し分析する必要があります。これらの要因も、やはり時間の経過や養殖場所によって変動すると考えられます。
お気づきの通り、多次元のデータ構造になっているというのは両者に共通する特徴です。これらのデータは、複数の変数が時間や空間によって変化する、複雑な多次元のデータ配列として表現できます。「複雑な多次元のデータ配列」とはどういうことかというと、こういう感じのデータ構造になっているということです。
※雑にjsonっぽく書いてみただけです。プログラミングに馴染みのない方は黒いコードのエリアは読み飛ばしていただいて構いません。
{
"weather_forecast": [
{
"date": "2024-07-26",
"location": {
"city": "東京",
"latitude": 35.6895,
"longitude": 139.6917
},
"hourly_forecast": [
{
"time": "06:00",
"temperature": 24,
"humidity": 65,
"wind_speed": 3.5,
"wind_direction": "SE",
"precipitation_probability": 20,
"pressure": 1013
},
{
"time": "07:00",
"temperature": 25,
"humidity": 63,
"wind_speed": 3.8,
"wind_direction": "SE",
"precipitation_probability": 15,
"pressure": 1014
}
// ... 他の時間のデータ
]
},
{
"date": "2024-07-27",
// ... 翌日のデータ
}
// ... 他の日付・地域のデータ
]
}
次元を減らす
上記のjsonもどきを見て頂くと分かると思いますが、この形のまま人間が直感的に理解し、効果的に分析するというのは難があります。1次元であれば数直線で表現できますし、2次元であれば表で表現できます。しかし3次元以上のデータ空間となると、とたんに表現方法が難しくなります。もちろん配列で表現すれば、僕たちの脳でも理解できます。ただ、視覚的に認識しやすいかというとそんなことはありません。
だからどうすればいいかというと、次元を減らせばいいのです。データの本質的な特徴は保ちながら、より少ない次元でなんとかしてデータ空間を表現できればいいということです。そうすれば、複雑なデータを人間が理解しやすい形に変換し、重要な情報を抽出することができるようになるはずです。
天気予報は上手に次元を減らしている
天気予報の次元の減らし方はとても参考になるし、一般向けということもあり、かなり考えられています。テレビやウェブサイトで見るわかりやすい天気予報は、実は多次元構造の気象データを簡略化して次元数を減らすことで初めて成り立っています。
ということで、ここからはどうやって天気予報が多次元データをわかりやすく視聴者に伝えているかという視点で、もう少し詳しく考えてみたいと思います。
降水確率という発明
例えば、降水確率というのも次元を減らすために考えられた工夫のひとつです。天気図を自分で書いてみると、降水確率なんてどこにも書かれていないことがわかります。
気圧配置の変化
風向きや風速の変化
湿度の変化
過去の似たような天気図での雨の降り方
地形の影響
季節要因
...などなど、降水確率には様々な要素が絡み合います。降水確率というのは気象予報士の人たちが、様々な情報を全部まとめ上げてくれているからこそ分かる数字なわけです。
なんでこんなことをしているかというと、その方が人間にとって分かりやすいからです。天気予報を見る人にとって知りたいのは「今日雨が降るか」「自分が傘を持っていくべきか否か」です。
「今日の午後3時には、気圧が1013hPaから1010hPaに下がり、南東の風が秒速5mから7mに強まり、湿度が75%から85%に上昇。過去の類似天気図では、この条件下で雨が降ったケースが53日あって...」
とか言われても、頭がクラクラするだけです。何の意味もありませんし、聞きたくありません。「降水確率60%」という一つの数字に変換することで、僕たちは複雑な情報のまとまりを理解することができています。
同じ構造にあるデータは他にもあります。たとえば花粉症の飛散情報、洗濯物の乾燥度などです。以下の熱中症情報の画面も同じです。おそらく天気・湿度・気温・風速などの情報を利用しているのだと思います。
アイコン提供がダイキン工業というのが面白いですね。熱中症リスクが高いみたいな認知を人がするようになればなるほどエアコンが売れるだろうという仮説に基づいてマーケティングしてるんでしょうね。
視点を固定すれば、次元が減らせる
次元を減らす方法は何もデータをまとめて別の指標を定義する方法だけではありません。むしろ一番使われているのは別の考え方です。それは視点を固定するという方法です。
上記のケースでは特定の地域(例:東京)に注目することで、地理的な場所という次元を削減しています。気象データ自体は複雑でも「明日の東京は曇りのち雨、最高気温27度」という人間が理解しやすい形に変換することで、わかりやすく情報を伝えることに成功しています。情報は伝えることではなく、伝わることが大事なんだなと思いますね。
見る指標を絞れば比較できる
指標を引き算をするというのも次元を減らす1つの方法です。
上記はウェザーニュースの週間天気予報の画面ですが、天気、気温、降水確率のみの限られた要素のみに指標を絞ったことで、地域別×週間の日別での表を描画することができています。地域ごとに天気をまとめて表示できるので、マスで情報を発信するメディアではどこもこの形式を採っていると思います。
多次元データを見る時のエッセンスは何か
天気予報がどう次元を減らしているかの工夫のポイントを改めてまとめてみると以下の3つに整理できそうです。
ここで重要なことは2つあります。
まず、目的によって適切な手法が変わるということです。もうひとつは複数の視点からデータを複眼的に見ることで、より包括的な理解が得られるということです。
視点や比較の軸が違えば、多次元データを捉える面も違ってきます。つまり、どの視点からデータを見るかによって、得られる洞察は大きく変わるということです。そしてその視点を複数持つことで、なんとなく多次元構造のデータ空間の全体像を人は認知することができるようになります。
同じ気象データでも、見る人の立場や目的によって、注目する点や解釈が大きく異なります。たとえば、農家は農作物の生育環境を確認するために降水量の予測や日照時間、気温の推移が知りたいし、観光業者は観光客の動員数予測、イベント開催の可否判断のために天気(晴れ・曇り・雨)や気温の情報が必要でしょう。
同じ気象データでも、見る人の立場や目的によって、注目するポイントや解釈が大きく異なります。そのため、データを提供する側は、ユーザーの立場や目的を理解し、それに合わせた形でデータを加工する必要があります。テレビも全国放送のキー局は全国の天気予報を万遍なく伝えているし、地方のローカル局はその地域の天気予報をより詳細に伝えていますね。
天気を見ただけではわからないので、気温や降水確率、雨量などのグラフも出してあの手この手で情報を分かりやすく伝える。それが天気予報です。
養殖のデータに置き換えて考えてみる
あとはこの構造感をそのまま養殖管理の中に輸入すればいいだけです。とはいえ、どういう画面を実装するかはまだ考え中なのと、やや養殖のデータ分析の話になると話がニッチになりすぎる気もするので、今回はこのくらいにして終わろうと思います。具体例がなくてスミマセン。興味がある人はコメントください。機能がリリースされたら、このnoteも更新するかもしれません笑
まとめ
最後にざっくりまとめておきます。
多次元データは人間にとって直感的に理解しにくい
複雑なデータを理解可能にするためには次元を減らすのが有効
代表的な指標を定義する
視点を固定する
見ない指標を決める
次元を減らせるのは、背後にある目的や意図が明確に定義できているから
複数の視点からデータを複眼的に見ることで包括的に多次元データを捉えることができるようになる
というわけで、せっかくプロダクト開発をするなら、浅い分析で「分かった気になる」のではなく、本当に意味のある答えをどうすれば導き出せるかちゃんと思考した上で良いプロダクトを創りたいよねというお話でした。
記事を最後まで読んでいただいてありがとうございます。ぜひ「スキ」をぽちっとしていただけると喜びます!
おしまい。