魚の重さは、何で決まる?
はじめに
こんにちは。記事に来ていただきありがとうございます。
今回は、あるデータを使って魚の重さを予測してみました。
「なんだ、魚の重さの予測ってただのデータ分析じゃん!」と思ったそこのあなた!その通りです。ただのデータ分析です。
でも、魚の出荷を管理するスマート養殖では生体情報をいかに取得するかがとても重要になりますし、生体情報と遺伝的な情報が結び付けられれば新しいおいしいお魚に出会える可能性もあります!
ということで、今回はkaggleにある下記のデータを使って魚の重さを予測してみました!
Fish market (kaggle)
なお、kagglerの方々はキンキンに冷えたビールのような冷たい目ではなく、キンキンに冷えたビールを飲む前の心躍らせるような気持ちの温かい目で見て頂けますと幸いです。
なお、kaggleでのコードは、こちらにあげてあります。よろしければご覧ください。
code (kaggle)
今日の学び
データによっては、魚の重さを予測するのに魚の種類よりも魚の幅(厚み)が重要な場合がある。これは、魚の種類を入力変数とするだけでは、魚の大きさや重さを考慮できない可能性があることを示唆している。
データを見てみよう!
データの観察
まずは、データを見てみましょう!
このデータには、魚の種類、重さ、長さ、高さ、幅が入っていますね。
なお、上のデータのSpecies_Idは元々データには入っていないのですが、予測モデルに魚の種類を使うために追加しています。
私の予想だと魚の種類によって重さが決まるはずです。だって、イワシとマグロじゃ明らかにマグロの方が重いから!
なお、kagglerの方のために書いておきますがnullデータはありませんでした。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 159 entries, 0 to 158
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Species 159 non-null object
1 Species_Id 159 non-null int64
2 Weight 159 non-null float64
3 Length1 159 non-null float64
4 Length2 159 non-null float64
5 Length3 159 non-null float64
6 Height 159 non-null float64
7 Width 159 non-null float64
dtypes: float64(6), int64(1), object(1)
memory usage: 10.1+ KB
データにある魚の種類
さて、データにある魚の種類を見て見ましょう。
データには、Perch、Bream、Roach、Pike、Smelt、Parkki、Whitefishが含まれていますね。
魚の種類を見る感じでは、淡水魚のデータのようです。
データ同士の相関関係
では、次にデータ同士の相関関係を見てみましょう。
重さ(Weight)に対する相関係数は、どの変数も高いですね。特に、高さ(Height)以外の変数との相関が高いようです。
これは、直感的にも納得が出来ますね!要は、個体が大きいほど重いということなので。
では、次に魚の種類ごとにどのようにデータが分布しているか見てみましょう。字が見にくくてすみません。
下の図を見る限りでは、魚の種類ごとに分布が変化しているようですね。
重さの予測をしてみた
では、重さの予測をしてみましょう。
今回は、Random Forestを使います。個人的に一番好きなモデルなので頻繁に使っています。特に、変数の重要度の可視化がやり易いところが好きです。生物相手だと高精度に予測することだけが全てではないのでw
なお、Random Forestについては記事がたくさんあるので分からない方はググってもらえると嬉しいです。
また、今回はPermutation Feature Importance(以下、PFI)、Partial Dependence(以下、PD)、Individual Conditional Expectation(以下、ICE)、SHapley Additive exPlanations(以下、SHAP)で変数の重要度を可視化しました。
下が予測結果です。Random Forestのパラメータは、全てデフォルトです。
良い感じに魚の重さが予測出来てますね。これを見る限りでは、テストデータには重い個体は少なかったのかなと思います(詳細は、データで魚の重さの分布をみてみないと分からないですね。。。宿題)。
重要な変数を可視化してみた
重要な変数を可視化してみます。
はじめに、PFIです。
PFIでは、幅が重要な変数として出てますね。あとは、Length3が重要なようです。なお、Length3が魚のどこの部分の長さなのかは分かりません。
次に、PDとICEですがこちらでもwidthとLength3の応答が良いようです。この傾向を見るといずれの変数も大きい値の時に重い傾向にあることが分かります。
最後に、モデルがどのように変数を用いて予測しているかを見てみましょう。SHAPでもWidthとLength3が重要な変数になっていますね。
まとめ
今回は、ばばっと魚の重さ予測をやってみました。恐らく扱ったデータに大きい個体の情報がなかったため、魚の種類が重要な変数ではない結果となったのかなと思います。また、魚の幅が重要というのは、肉厚であるほど重いことを表していると思います。
画像解析で魚の長さや幅などの情報が取れれば、重さ予測は割と高精度に出来そうですね!これは、魚の養殖でも活きてくると思います。
今後も、データ解析をはじめとした面白いコンテンツを発信できるように頑張りますので何卒応援よろしくお願い申し上げます。