質問: dendrogram(result,p=100, truncate_mode='lastp') よろしくお願い致します。
回答: このところ、デンドログラム (樹形図) についての質問をよく見かけましたので、どんなものなのか調べてみました。クラスタ分析の方法のひとつなのですね。 デンドログラムを作るのにはつぎのステップを踏むそうです。 1. 個体データの集合から、距離行列を計算する。 このときに、個体間の距離尺度を決めなければなりません。 2. 距離行列から、コーフェン行列を計算する。 このときに、クラスタ化の方式を決めなければなりません。 3. コーフェン行列をもとに、樹形図を描画する。 これらは決まった手順で実行できますから、個体データをもとに手作業の計算で実現することもできます。しかし、データ量が多くなると手作業は大変です。コンピュータは、決まりきった手順を高速に、大量の計算でも疲れることなく実行してくれます。ですから、コンピュータにこういった作業をやらせるというのはいい考えです。 逆に言うと、**何をするかを人間がきちんと決めて教えてやらないと、コンピュータは意味のある結果を出しません**。コンピュータは、自分が実行して出てくる結果になにか意味があるかどうかなんてわかってはいません。人間が、コンピュータに、意味のある結果を出せるような手順を教える必要があります。 SciPyのマニュアルで、前に述べた手順を実施できる関数は、次のものです。 * Distance computations (scipy.spatial.distance) -- pdist() * Hierarchical clustering (scipy.cluster.hierarchy) -- linkage() -- dendrogram() あとはマニュアルのそれぞれの箇所を読んでいただければわかると思いますが、簡単に説明します。 * pdist()では`metric`引数の初期値は`'euclidean'`です。ご質問のコードでは、距離行列の距離尺度にユークリッド距離を用いていることになります。 * linkage()では、`method`引数の初期値は`'single'`です。マニュアルの説明を見ると、これは最近隣法 (単連結法) であると考えられます。ご質問のコードで、たとえばウォード法を用いたいのであれば、`method='ward'`のように引数で指定する必要があります。 * dendrogram()では、`color_threshold`引数の初期値は`None`で、これは`0.7*max(Z[:,2])`のように計算される値をクラスタ化の閾値とします。「クラスタ化の閾値」という言葉があるのかどうか知りませんが、マニュアルで次のように説明している値です。 > > For brevity, let ***t*** be the `color_threshold`. Colors all the descendent links below a cluster node ***k*** the same color if ***k*** is the first node below the cut threshold ***t***. All links connecting nodes with distances greater than or equal to the threshold are colored blue. > > > dendrogram()での色の指定にはほかに`link_color_func`引数もあります。あと、樹形図のスタイルに関する引数がほかにもあります。 上のそれぞれの関数を実行した結果を見て、コンピュータが何をしたのかよくわからなければ、同じデータから手作業で作った結果と比べてみるとよいでしょう。関数の引数を変えてみて、手作業の結果と一致するかどうか確かめればいいのです。一致したら、以後同じことをコンピュータにやらせたいときはその引数を指定すればよいのです。