動感図を少し作りました


今回のリリースでは、Pythonからplotまでのgifファイルの作成方法について簡単に説明します.
簡単に言えば、ストーリーで感動(͡° ͜ʖ ͡°)/マイクロを作成します.
このリリースを続行します.必要に応じてgifファイルの結果を先に紹介します.

Img 1.) KDE plot animation for Increasing band-widths

Img 2.) Scatter plot animation for Changing 'Crime Rate' thresholds
👉 これにより,特定のplotでは,「ある条件に従って変化する視覚化の変化」を一目で見ることができる.
👉 完全なコード参照は、次のリンク(colab)でも参照できます.
plotAnimation.ipynb (Colab)
👉 次にplotをダイナミックマップに作成し、何が良いのか簡単に見てみましょう.

1.画像1枚 時


データ可視化は、データ分析において非常に強力なツールです.直感的に、迅速に資料を把握することができ、予想外の新しい見解を得るのに役立ちます.
しかし、視覚化の過程でたまに「一枚の写真」が出てくるのは憂鬱だ.分析家は直感的な構造をより効果的に観察するために、いろいろな条件を直接変えて、すべての状況でストーリーを作ると、いつの間にか私が非常に非効率的に(非常にたまに、考えがない)仕事をしている様子を発見します.
この場合、plotは固定されていますが、詳細条件を変更すると、資料の可視化がどのように変化するかは、「ダイナミックマップ」で一度に見ると便利です.
例えば、次の場合.
筆者はBoston House Pricesデータを用いて簡単なタスクを実行し,各属性の分布を簡単な可視化法で決定している.

属性「INDUS」は「当該地域の総面積における産業用地の比率」に相当するデータである.
最初はこのようにすべての属性の分布を簡潔に閲覧し解析したが,その後,散点行列全体を抽出することによって見逃したことが分かった.

「INDUS」の約18%程度の地域が特に大きく(しかも正確には同じ数値)集まっているのが見つかった.これはこれまで単純にヒストグラムとkde(:Kernel density Estimation)plotで個別属性を理解していたときに熟考していなかった部分である.
実際,ヒストグラムとkdeplotは,ユニークに分布する画像を非統計的に「指摘」するものではない.補足すると、「与えられた資料に基づいて分布を推定する方法」は、詳細間隔(程度...と略記可能)のパラメータをどのように決定するかによって、その分布が大きく異なる可能性があります.すなわち,そのときの異なるパラメータ状態はkde密度に依存するため,判断資料の固有分布を十分に歪める判断が可能である.
parameterの変化によって分布がどのように変化するかを見てみましょう.

kde plotは「band-width」(以下bwと略称する)をパラメータ平滑密度とする.簡単に言えば、資料の分布を「どんなに柔らかく表現されているか」の値と考えることができ、逆に考えれば、「表現が柔らかいほど、資料の細部分布情報が隠されやすい」と考えることができます.
上図でもbw値が大きくなる(すなわち、より滑らかになる)につれて分布がかなり変化することがわかる.
  • 以前にbw値が指定されていなかった場合(2行目、左から3番目のplot、default値に相当)bw=0.3で推定される分布は、2つのピークがある「2つの正規分布が重なる」混合分布のように見えます.
  • しかし、bw値を極限まで減らすと、「INDUS」=約18%の記録が非常に密集していることがわかります.
  • がbw=0.5に極端に上昇した場合(2行目、右側の最初の図)、平滑化が強く適用されるにつれて、「INDUS」=18%の部分分布はかえって低くなる.
  • そこで,この(kde)推定分布がbw細部の調整に伴ってどのように表現されるかを観察するために,「ダイナミックマップ」の作成まで考えた.(🙄…! )
    結果として出た「ダイナミックマップ」kde plotは

    Img 1.) KDE plot animation for Increasing band-widths
    上のImg 1.)kde plotが分布をどのように推定するかを示した.オレンジ色の棒グラフは、資料の元の状態を比較的直感的に表示するヒストグラムであり、bin=50で表される図である.
    このように,「ダイナミックマップ」からkdeによる分布推定は,パラメータによってどれだけ異なる分布が得られるかが一目で分かる.
    △最初の「ダイナミックマップ」はkdeの性質についてですが、実は少し技術的な内容です.簡単に言えば、「データを把握するにはなぜkdeの特徴が必要なのか」は「¯\_( ͡° ͜ʖ ͡°)_/¯..?」と考えることができます.
    2つ目の「ダイナミックグラフの可視化」は、データ構造をより効果的に理解するケースと言える.
    ボストンの住宅価格データは、住宅価格に大きな影響を及ぼす変数を検索するために複数の属性で構成されており、この地域の犯罪率にも「CRIM」属性が含まれています.
    複数の変数間の相関を検討すると,「CRIM」属性は住宅価格と高い相関があることが明らかになった.
    上記の「INDUS」属性では、約18%の領域が観察と非常に密接に関連しており、これらの記録は他の属性の散点図においても非常にユニークな影響力を有する.

    High(orange): {CRIM ≥ 1.0}, Low(blue): {CRIM < 1.0},
    上の図のように、「CRIM」の値をランダムに1.0以上と1.0以下の2つに分け、散点行列を選択します.単純に「CRIM」値を特定の閾値(Threshold)以上/以下に分割すると、他の属性との関係においても予想される関係とかなり密接なパターンが現れる.
    このような状況を少し拡張し、「CRIM」の値の大きさに応じて、「犯罪率が高い/低い」と区別できるスタック変数を作成し、データ構造を表示します.結果として出た「ダイナミックマップ」は以下の通りです.

    Img 2.) Scatter plot animation for Changing 'Crime Rate' thresholds
    図を簡単に見ると、「CRIM」に対する閾値の変化により、複数の変数分布において、「犯罪率が高い」に対応する記録形成の分布領域が明らかに区別されていることがわかる.

    02.いいえ、だから『ダイナミックマップ』はどうしますか。 やったんだろ?!


    ダイナミックマップを作成するコードは以下の通りです.
    # Import Libraries 
    import imageio
    import os 
    from glob import glob 
    
    # setting 
    img_dir = './img/'
    file_type = '.png'
    save_name = 'cr_animation.gif'
    speed_sec = {'duration': 0.15}
    
    # Make .gif 
    paths = glob(img_dir+'*'+file_type)
    imgs = [imageio.imread(img_path) for img_path in paths ]
    imageio.mimsave(img_dir+save_name, imgs, **speed_sec)
    
    # References 
    # * 파이썬 GIF 애니메이션 만들기 예제 코드(Python imageio) - [물리학과 직장인] 님의 Tistory  
    (Git gist) ZinoStudio931/plot_animation.py
    「ダイナミックマップコード」は(「Python GIFアニメーション制作サンプルコード」、「物理系サラリーマン」Tistory)を参照している.
    まず必要なパッケージ(すべてPython内蔵ライブラリ)をインポートします.
    値段を少しあげる.必要な値は次のとおりです.
  • ダイナミックマップとして作成する画像を含むフォルダパス(「img path」)
  • 画像拡張子(「file type」)
  • 保存するファイル名(「save name」)
  • kwargで反映される写真間の時間間隔(「speed sec」)-指定すればよい.
  • (以上、これらの値は、筆者の都合で多くの組み合わせが行われています.条件を多様化させるには、積極的にf-string(ex:f「{obj}」)を使うと便利です.
    # glob를 통해서 '이미지 경로/*(:모든 이미지).png'의 이미지 경로를 담고*
    paths = glob(img_dir+'\*'+file_type) 
    
    # list comprehension으로 image read를 담은 후*
    imgs = [imageio.imread(img_path) for img_path in paths ]
    
    # 지정된 값을 바탕으로 '.gif'파일을 생성한다.* 
    imageio.mimsave(img_dir+save_name, imgs, **speed_sec)

    3.終了


    ダイナミックマップで生成されるコードは複雑ではありません.△社説が長すぎて、「x」にはかなわない.
    また、インタラクティブな図面描画をサポートする良いパッケージもたくさんあります.例えば、plotlyもかなり豊富なインタラクティブ可視化apiを提供していますが、残念ながら、メンテナンスのためにhtml形式でエクスポートする必要があります.(良いファイル形式があれば共有してください.)😭)
    plotを「ダイナミックマップ」にするのはかえって大変な感じがしますが、「画像ファイルで変化を表現したいとき」、「画像を出力する必要があるとき」などの制限的な場合は、必要に応じて使用したほうがいいでしょう.
    参照
  • Python GIFアニメーション制作サンプルコード(Python imageio)、「物理系サラリーマン」Tistory