データ構造別の可視化手法まとめ

# はじめに
* 可視化方法の確立していないデータでは、適切な可視化手法を選択するのは一仕事です。
* データの可視化方法は伝えたいメッセージやデータの密度等を踏まえて見やすいものを適切に選択する必要がありますが、本稿ではデータの独立変数・目的変数の構造だけから、取りうる可視化手法を列挙してみます。
* 本稿は自分のメモを兼ねているので適宜加筆予定です。コメントによる補足は大歓迎です。

## 準備
* 本稿では何が独立変数で何が目的変数かはっきりしていることとします。
* 便宜的に各変数を分類的（定性的、カテゴリカル、ラベル）なものと数的（定量的、順序的）なものに分けます。
    * 分類的変数の例:
        * 国名
        * 血液型
        * 論理値（True/False）
    * 数的変数の例:
        * 年齢
        * 時刻
        * 座標

# 独立変数が1つの場合
## (数)→(数)
* データ例: 気温の時系列
* 取りうる手法
    * 折れ線グラフ
    * 分布図
    * ヒストグラム（目的変数が頻度の場合）<br>
      <img src=https://qiita-image-store.s3.amazonaws.com/0/146259/8182408d-6371-556e-df16-411486228f22.png width=400px><br>
      [画像出典](https://www.smartsheet.com/line-graphs-line-charts-excel)

## (数)→(数, 数, ...)
* 後述の(分類, 数)→(数)と同等に扱える。

## (数)→(分類)
* データ例: 温度による水の相変化
* 手法
    * 塗り分け図
    * 一次元散布図（確率的関係の場合）<br>
      <img src=https://qiita-image-store.s3.amazonaws.com/0/146259/30bc7453-b51d-55de-655d-d7caf4a58db1.png width=400px><br>
      [画像出典](https://www.datamentor.io/r-programming/strip-chart/)

## (分類)→(数)
* データ例: 国別GDP
* 取りうる手法
    * 棒グラフ
        * 要素を降順に並べ替えることを検討する。
    * 円グラフ、累積棒グラフ（足して1になる場合）
    * レーダーチャート<br>
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/146259/d630cdf2-9a0b-c595-811e-26074dfae9a0.png)<br>
      [画像出典](https://en.wikipedia.org/wiki/Radar_chart)

## (分類)→(数, 数, ...) 
* データ例: 各生徒各科目の成績
    * 複数のものを複数の評価基準で比較するときなど頻出のパターンですが、グラフが煩雑になりやすく要注意です。
* 手法
    * レーダーチャート（一枚の図に複数の線）
    * 累積棒グラフ
    * 散布図（目的変数が2次元の場合）
    * ヒートマップ（色または大きさでマトリックス表示）
    * (分類)→(数)の手法（例えば棒グラフ）を複数パネル並べて表示する<br>
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/146259/92076fe2-225c-326f-9cdc-b4c4e531d06b.png)<br>
      [画像出典](https://www.myonlinetraininghub.com/excel-alternatives-to-radar-charts)

## (分類)→(分類)
* データ例: 名前と役職のリスト
* 取りうる手法
    * 表または箇条書き

# 独立変数が2つの場合
## (数, 数)→(数)
* データ例: 気温のマップ（独立変数は経度、緯度）
* 手法
    * 疑似カラープロット、ヒートマップ
    * 等値線図
    * [3次元中のメッシュプロット](https://jp.mathworks.com/help/matlab/examples/creating-3-d-plots.html)<br>
      <img src=https://qiita-image-store.s3.amazonaws.com/0/146259/589d161e-9876-6b7b-92e7-49022a6dab46.png width=400px><br>
      [画像出典](https://www.curveexpert.net/contour-plotting/)

## (数, 数)→(数, 数)
* データ例: 風ベクトルのマップ、または、実部と虚部のマップ
* 手法
    * 矢印 (quiver)
    * 流線
    * 疑似カラーに等値線図を重ねる[^3]
    * アニメーション https://qiita.com/1007/items/35b41febb5db756c8234<br>
      <img src=https://qiita-image-store.s3.amazonaws.com/0/146259/1beb1208-f571-3f56-7af9-15facf7f895e.png width=350px><br>
[画像出典](https://www.semanticscholar.org/paper/Gas-Infall-towards-Sgr-A*-from-the-Clumpy-Disk-Montero-Casta%C3%B1o-Herrnstein/4984b12cc4e6d073da883c1194069b237cc76863/figure/25)

[^3]: 疑似カラープロットでもRGB, 色相-彩度-明度などを使うと複数の目的変数がプロット出来そうですが、実際やってみると大変見づらいです。

## (数, 数)→(分類)
* データ例: 温度と圧力による水の相変化
* 手法
    * 塗分け図
    * 散布図（確率的関係の場合）<br>
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/146259/2352330f-77dc-2c5a-d318-73f3ca70e919.png)<br>
      画像出典: Pattern Recognition and Machine Learning (C. Bishop)

## (分類, 数)→(数)
* データ例: 男女の年齢別平均年収
* 手法
    * 折れ線グラフ（複数の折れ線）
    * 散布図（確率的関係の場合）
    * 積み上げ面グラフ<br>
      <img src=https://qiita-image-store.s3.amazonaws.com/0/146259/aa8bb5c4-16e3-6a1e-22a3-60fdd36fdd78.png width=300px><br>
      [画像出典](https://python-graph-gallery.com/250-basic-stacked-area-chart/)

## (分類, 数)→(分類)
* いい例が思いつかないので割愛
* 手法
    * 散布図
    * (数)→(分類)の手法をタイル化して表示<br>
      ![image.png](https://qiita-image-store.s3.amazonaws.com/0/146259/6a71bd2c-b875-5ceb-98f8-a3e54fd75575.png)<br>
      [画像出典](https://seaborn.pydata.org/examples/scatterplot_categorical.html)

## (分類, 分類)→(数)
* これは(分類)→(数, 数, ...)のパターンを使いまわせます。
    * 例えば (人名, 科目)→(点数) という関係は (人名)→(国語の点数, 数学の点数, ...) という関係と同じ。

<img src=https://qiita-image-store.s3.amazonaws.com/0/146259/d9a1e6a7-8015-45ba-e2e5-107298741a2a.png width=400px><br>
[画像出典](https://www.cbinsights.com/research/on-demand-funding-deals-map/)

## (分類, 分類)→(分類)
* データ例: 真理値表
* 手法
    * 表（マトリックス）

# 独立変数が3つ以上の場合
* 基本的に単一の静止画で表現するのは難しくなります。
* 手法
    * バブルチャート
        * (分類, 数, 数)→(数)の時、独立変数の分類を色で、目的変数を大きさで表現した散布図が使えます。
    * アニメーション（連続量の一つを時刻に変換して、独立変数が2つの時の手法を使う）
    * タイル化（分類別にパネルを分けて、独立変数が2つの時の手法を使う）
    * インタラクティブプロット
        * 例えば、Jupyter notebookではipywidgetsモジュールからスライダやラジオボタンが使えます。
    * 立体視, VRなど

<img src=https://qiita-image-store.s3.amazonaws.com/0/146259/ea486e5c-f9e4-4da2-36bc-ba9ff501d326.png width=400px><br>
[画像出典](https://dojo.domo.com/t5/Card-Building/Displaying-what-controls-bubble-size-on-a-bubble-chart/td-p/28958)

# その他: 非構造化データの可視化など
* [二次元分布とその周辺分布を（軸を共有した）散布図とヒストグラムを併用して描く手法](https://seaborn.pydata.org/tutorial/distributions.html#visualizing-pairwise-relationships-in-a-dataset)
* [カテゴリカルデータの2項関係をグラフ（グラフ理論の方）表示する](https://medium.com/neo4j/hands-on-graph-data-visualization-bd1f055a492d)
* [ツリーマップ](http://domex.cocolog-nifty.com/blog/2017/07/excel-4b55.html)
* 箱ひげ図: (分類)→(数, 数, 数, 数) または (数)→(数, 数, 数, 数) 大小関係が制限された目的変数に（パーセンタイルと極値など）。

# 参考資料
* [データ可視化チートシート](https://qiita.com/m_mizutani/items/26971c29fa990617a935)