これにそれぞれの因子負荷量をかけ合わせて足すととなり、これがこの食品の主成分得点となります。先ほどの主成分を縦軸、横軸にしたグラフでも確認できます。完全食を探してさて、主成分分析の心を理解したところで、実際に完全食を探してみましょう。今回扱うデータは、全8618種類の食品栄養素がまとめられたデータです。データはこちらから入手できます。data.world中身を確認してみましょう。22種類の情報が含まれています。brieその食品の種類や、簡単な説明などの情報を見ることもできます。全ての栄養素を網羅的に含んでいる食品、"完全食"、をこの中から探していきます。第一主成分との関連が一番大きい食品ですね。ここからはRとPythonで記述が異なるので分けて書いていきます。R使いの方は以下から、Python使いの方はこちらです!R使いの方はこちらまずはデータの読み込みです。USRDAと名のつく変数はアメリカの推奨摂取量であり、本解析の趣旨とは関係ないので除きます。select(-matches("_USRDA"))次に栄養素の分布を確認してみます。カロリーは栄養素ではなく、ある意味で変数の集約情報であるため分析からは外しました。画像の関係で異なっています。#栄養素の情報のみ抜き出す。element_text(size=10))かなり右裾の長い分布になっていますね。分布を調整するため対数変換を行います。本来であればBox-Cox変換のような高度な変換を行う方が良いのですが、今回は主成分分析がメインということで簡単な対数変換にしました。(0の値には微小な値を足して対数変換しています。map_df(~log(.+0.0000001))0が多かったためか左端が気になりますが、先ほどよりは分布が整いました。このデータに対して主成分分析を行います。Rで主成分分析を行うにはprcomp{stats}を使います。prcompの引数であるcenterとscaleは標準化するかどうかの指定です。0.053453524結果をみやすくするため始めの方だけ出力しましたが、22この栄養素全てで結果が出力されており、22この主成分が抽出されています(PC22まである)。主成分はデータのバラツキを100%説明できるまで抽出されるため、変数の数だけ存在することを覚えておきましょう。deviationsは、その主成分がどれぐらいデータの標準偏差を説明しているかを表しています。今回は22この変数を全て標準化し分散を1にしたので、これを二乗して全て足すと22になります。22つまり、第1主成分は22のうち9(3の二乗)の分散を説明できることになるので、9/22=0.41で、41%の情報を持っていることになります。それぞれの成分がどれぐらいの情報を持っているか、縦軸を成分が持っている分散、横軸を成分としてグラフに表してみます。大体第4主成分ぐらいまでで、全データの7割ぐらいを説明することができるようです。このデータで他の解析をする場合は、最小で4つの変数まで次元を圧縮できそうです。次に結果のRotationとあるのは、それぞれの栄養素が、主成分からどれほどの影響を受けているのか、つまり因子負荷量です。先ほど同様にデータを横軸を第一主成分で、縦軸を第二主成分として、グラフにしてみます。可視化にはautplot{ggfortify}を使います。TRUE)赤の矢印はそれぞれの栄養素の因子負荷量を表し、多くの栄養素は第一主成分で説明できそうですが、炭水化物系は方向が違いますね(ちなみに食物繊維と砂糖を合わせたものが炭水化物です)。代わりに第二主成分では炭水化物系と強く関連していそうなので、完全食を探すには第二主成分も考慮した方が良いかもしれません。完全食王者を決めるPython使いの方はこちらまずはデータの読み込みです。USRDAと名のつく変数はアメリカの推奨摂取量であり、本解析の趣旨とは関係ないので除きます。pd.read_csv("../nndb_flat.csv")nut.drop(nut.columns[nut.columns.str.contains("_USRDA")],axis=1,inplace=True)次には栄養素の分布を確認してみます。カロリーは栄養素ではなく、ある意味で変数の集約情報であるため分析からは外しました。#栄養素の情報のみ抜き出す。figsize=(11,11))plt.show()かなり右裾の長い分布になっていますね。分布を調整するため対数変換を行います。本来であればBox-Cox変換のような高度な変換を行う方が良いのですが、今回は主成分分析がメインということで簡単な対数変換にしました。(0の値には微小な値を足して対数変換しています。figsize=(11,11))plt.show()0が多かったためか左端が気になりますが、先ほどよりは分布が整いました。このデータに対して主成分分析を行います。Pythonでは最初にデータを標準化した後に、主成分分析を行います。sklearnを使えばどちらも簡単に実行可能です。0.102886結果をみやすくするため始めの方だけ出力しましたが、22この栄養素全てで結果が出力されており、22この主成分が抽出されています(PC22まである)。主成分はデータのバラツキを100%説明できるまで抽出されるため、変数の数だけ存在することを覚えておきましょう。結果の見方ですが、まずVarianceとVariance_ratioは、その主成分がどれぐらいデータの分散を説明しているかを表しています。今回は22この変数を全て標準化し分散を1にしたので、これを全て足すと22になります。>fit_pca.explained_variance_.sum()22.00255309272368つまり、第1主成分は22のうち9の分散を説明できることになるので、9/22=0.41で、41%の情報を持っていることになります。それぞれの成分がどれぐらいの情報を持っているか、縦軸を成分が持っている分散、横軸を成分としてグラフに表してみます。plt.text(x,y,prop,fontsize=13)少しみにくいですが、大体第4主成分ぐらいまでで、全データの7割ぐらいを説明することができるようです。このデータで他の解析をする場合は、最小で4つの変数まで次元を圧縮できそうです。その次の結果は、それぞれの栄養素が主成分からどれほどの影響を受けているのか、つまり因子負荷量です。この因子負荷量と第一、第二主成分との関連をグラフにしてみます。alpha=0.8)plt.grid()plt.xlabel("PC1",fontsize=19)plt.ylabel("PC2",fontsize=19)plt.tick_params(labelsize=15)plt.show()多くの栄養素が第一主成分のマイナス方向に偏っています。このように直感的な理解と因子負荷量の方向が異なることがありますが、データのバラツキを説明するという観点から言えば方向の解釈はプラスマイナスを逆転させても問題ありません。三大栄養素の一つである炭水化物や砂糖、食物繊維は少し方向性が違うみたいです(ちなみに食物繊維と砂糖を合わせたものが炭水化物です)。代わりに第二主成分では炭水化物系は強く関連していそうなので、完全食を探すには第二主成分も考慮した方が良いかもしれません。完全食の王者を決めるさて、これで準備が整いました。完全食の王者を決めましょう。ここからはコードが少ないのでRとPythonを同時に書いていきます。第一主成分でデータをソートし、上位top10の食品を抜き出してみます。(Pythonの方は主成分得点の符号が逆転しています。Cereals)、スナックグループ(Snacks)がランクインしました。ShortDescriptionをみてみると、飲み物グループは野菜ジュース系、朝食シリアルグループはブランシリアル、スナックグループはエナジーバーなどみたいです。これは確かに完全食に近いですね!続いて、同じように第二主成分でソートしてみます。2.8なんだかスパイス系の食品が多く入ってきています。これは趣旨と離れている気がします...ということで、第一主成分トップ10の中から第二主成分も考慮して完全食を決めたいと思います!もう一度第一主成分の結果に戻ってみると、第一主成分ランキング2位、3位が、第二主成分も考慮すると僅差です。この二つの最も大きな違いはズバリ液体か固体かです!笑甲乙付け難いので、朝とっても忙しい人は2位の食品を、液体じゃ物足りんという人は3位の食品を食べると良いでしょう!ということで、この二つを"完全食"と任命します。(ちなみに会社名もデータに含まれているので実際に購入できるかもしれません。因子分析はよく混同されて説明されている記事をたまに見かけますが、全く違います。主成分分析とは、今回みてきたように、データを主成分に圧縮する手法であるのに対して、因子分析は、現在得られているデータが何らかの因子から発生していると仮定して、そのデータの因子を分析する手法です。食品の栄養素というのは何かの因子から発生しているわけではありません。ここに因子分析を用いるということは、食品に含まれる栄養素に何かの力が働いて、その含有量が決めらることを仮定することになります。式で見てみると主成分分析がとすることで、二つの変数を一つに圧縮するのに対して、因子解析はとなる因子を求めます。言うもののこの二つの違いは実際に分かりにくく、同時にやると混乱するので、まずは理解しやすい主成分分析からマスターすることをオススメします。まとめ今回は多変量解析をする上でも重宝する主成分分析を紹介しました。今回のように主成分分析の結果自体からデータをみることもできますし、圧縮した後の主成分を使って、新たに他の解析をすることもできます。応用範囲が広いので、ざっくりとした概要と、具体的な解析手法は知っておいても損はありませんね。※本記事は筆者が個人的に学んだことをまとめた記事なります。所属する組織の意見・見解とは無関係です。わかりやすく解説したサイト等はりますが、因子分析の解説はなかなか見当たりません。”が”、こちらの書籍は、回帰分析から因子分析などの高度な解析手法まで、とてもわかりやすくまとまっています。多変量解析を最初に学ぶにはとっておきの一冊だと思います。技術評論社Amazon英語のサイトですが、主成分分析と因子分析の違いについはおそらく一番わかりやすいです。SPSSPythonはこちらを参考にさせて頂きました。Qiita数学的な導出に関しては、以下二つがわかりやすいです。近年では、ブラッ...2020-08-01Pythonで割合棒グラフ、積み上げ棒グラフを一瞬で作成する。学んだこと、日々の所感をまとめていきます。※本ブログは筆者が個人的に学んだこと感じたことをまとめたブログになります。所属する組織の意見・見解とは無関係です。medi_data0826引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。