見出し画像

魚の重さは、何で決まる?

はじめに

こんにちは。記事に来ていただきありがとうございます。

今回は、あるデータを使って魚の重さを予測してみました。
「なんだ、魚の重さの予測ってただのデータ分析じゃん!」と思ったそこのあなた!その通りです。ただのデータ分析です。

でも、魚の出荷を管理するスマート養殖では生体情報をいかに取得するかがとても重要になりますし、生体情報と遺伝的な情報が結び付けられれば新しいおいしいお魚に出会える可能性もあります!

ということで、今回はkaggleにある下記のデータを使って魚の重さを予測してみました!
Fish market (kaggle)
なお、kagglerの方々はキンキンに冷えたビールのような冷たい目ではなく、キンキンに冷えたビールを飲む前の心躍らせるような気持ちの温かい目で見て頂けますと幸いです。

なお、kaggleでのコードは、こちらにあげてあります。よろしければご覧ください。
code (kaggle)

今日の学び

データによっては、魚の重さを予測するのに魚の種類よりも魚の幅(厚み)が重要な場合がある。これは、魚の種類を入力変数とするだけでは、魚の大きさや重さを考慮できない可能性があることを示唆している。

データを見てみよう!

データの観察

まずは、データを見てみましょう!

データの中身(Species_IDは、自身で追加)

このデータには、魚の種類、重さ、長さ、高さ、幅が入っていますね。
なお、上のデータの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が魚のどこの部分の長さなのかは分かりません。

Permutation Feature Importance

次に、PDとICEですがこちらでもwidthとLength3の応答が良いようです。この傾向を見るといずれの変数も大きい値の時に重い傾向にあることが分かります。

Partial Dependence and Individual Conditional Expectation

最後に、モデルがどのように変数を用いて予測しているかを見てみましょう。SHAPでもWidthとLength3が重要な変数になっていますね。

SHapley Additive exPlanations

まとめ

今回は、ばばっと魚の重さ予測をやってみました。恐らく扱ったデータに大きい個体の情報がなかったため、魚の種類が重要な変数ではない結果となったのかなと思います。また、魚の幅が重要というのは、肉厚であるほど重いことを表していると思います。
画像解析で魚の長さや幅などの情報が取れれば、重さ予測は割と高精度に出来そうですね!これは、魚の養殖でも活きてくると思います。

今後も、データ解析をはじめとした面白いコンテンツを発信できるように頑張りますので何卒応援よろしくお願い申し上げます。

サポートエリアの文章まで読んで頂き本当にありがとうございます。よろしければサポートお願い申し上げます。頂いたサポートは、図書や実験機材の購入に充てさせていただきます。これからも面白いコンテンツ製作を目指すので応援よろしくお願いします。