Shingoの数学ノート

プログラミングと機械学習のメモ

SASの主成分分析でポケモンの特徴を可視化してみる

日付:    カテゴリ: SAS


みなさん、ポケモンバトル、してますか?当然してますよね?

ポケモンやっていると、このポケモンは攻撃型、このポケモンは防御型など、振り分けたくなりますよね(?)

今回は、主成分分析を使って、ポケモンの特徴を可視化していきたいと思います。

主成分分析とは

主成分分析とは、特徴量の軸を変換し、最も効いている順(=主成分)に次元を取り直す手法です。 主成分を切り出して、次元削減などに使われます。

今回は、ポケモンから主成分を取り出し、どんな特徴があるかを探っていきます。

種族値を読み込んで主成分分析

ポケモンの種族値をコピペして作ったBasestats.csvを使っていきます。

まずは、SASで読み込んで主成分分析を実施します。

/* データの読み込み */
FILENAME REFFILE '<ダウンロードしたパス>/blog44_Basestats.csv';

PROC IMPORT DATAFILE=REFFILE
  DBMS=CSV
  OUT=WORK.IMPORT
  REPLACE;
  guessingrows=MAX;
  GETNAMES=YES;
RUN;
/* ラベルを付与 */
data IMPORT;
  set IMPORT;
  label H="1.HP" A="2.こうげき" B="3.ぼうぎょ" C="4.とくこう" D="5.とくぼう" S="6.すばやさ";
run;
/* 主成分分析を実施 */
proc princomp cov data=IMPORT out=pred;
  var H A B C D S;
  id name;
run;
結果

①:累積寄与率は、第n主成分までで何%表現できているかを表します。ここでは、第二主成分までで約62%解釈できていると解釈します。

②:固有ベクトルは、それぞれの主成分の解釈を表します。第一主成分は全てプラス、第二主成分はとくこう、とくぼう、すばやさがプラスとなっています。

ここから、第一主成分が大きいポケモンは種族値が高め、第二主成分が大きいポケモンは特殊方面が高めであることが予想できます。

主成分の中身を見る

主成分ごとにTop10とTail10を見てみます。

%macro print_prin();
  %do i = 1 %to 6;
    proc sort data=pred out=pred_prin&i.;
      by descending prin&i.;
    run;
    title "prin&i. Top10";
    proc print data=pred_prin&i.(obs=10) label;
    run;
  %end;
  %mend;
  %print_prin();

全部貼ると大変なので、第一主成分と第二主成分のTop10を見てみます。

第一主成分上位のポケモンたち

第二主成分上位のポケモンたち

第一主成分Top10は全体の種族値が高く、第二主成分Top10はとくしゅアタッカーが多いですね。

主成分の中身をレーダーチャートで見る

せっかくなので、主成分ごとにTop10とTail10の種族値平均をレーダーチャートで書いてみます。

%macro make_gradar;
  data pred_gradar;
    length _NAME_$ 20
    COL1 8
    tt$ 30
    prin$ 1;
    stop;  
  run;
  %do i = 1 %to 6;
  
    proc sort data=pred out=pred_prin&i.;
      by descending prin&i.;
    run;
    data pred_prin&i._mean;
      set pred_prin&i.;
      keep H A B C D S;
      if _n_ >10 then stop;
    run;
    proc means data=pred_prin&i._mean noprint;
    output out=pred_prin&i._mean mean=;
    run;
    proc transpose data=pred_prin&i._mean out = pred_prin&i._mean;
      var H A B C D S;
    run;
    data pred_prin&i._mean;
      set pred_prin&i._mean;
      tt = "1.top";
      prin = "&i.";
    run;
    
    data pred_gradar;
      set pred_gradar pred_prin&i._mean;
    run;
    proc sort data=pred out=pred_prin&i.;
      by prin&i.;
    run;
    data pred_prin&i._mean;
      set pred_prin&i.;
      keep H A B C D S;
      if _n_ >10 then stop;
    run;
    proc means data=pred_prin&i._mean noprint;
    output out=pred_prin&i._mean mean=;
    run;
  
    proc transpose data=pred_prin&i._mean out = pred_prin&i._mean;
      var H A B C D S;
    run;
    data pred_prin&i._mean;
      set pred_prin&i._mean;
      tt = "2.tail";
      prin = "&i.";
    run;
    
    data pred_gradar;
      set pred_gradar pred_prin&i._mean;
    run;
  %end;
%mend;
%make_gradar;

PROC GRADAR DATA=pred_gradar;
  CHART _label_/ acrossvar=tt
  downvar=prin
  freq=COL1
  ;
run;
QUIT;
結果(第一主成分と第二主成分のみ)

見比べると以下のことが分かりますね。

  • 第一主成分が大きいと全体の種族値が大きく、小さいと全体の種族値が小さい。
  • 第二主成分が大きいととくこう、とくぼう、すばやさが大きく、小さいとHP、こうげき、ぼうぎょが大きい。

まとめ

ポケモンを主成分分析で特徴を可視化してみました。それぞれの主成分を見ることで、ポケモンの傾向から何となく分類できそうです。

何の役に立つかはわからないけど、楽しかったのでヨシ。


Comment Box is loading comments...