【データ可視化】誤解を招かないように配慮された最新のカラーマップ(カラーパレット)について
先日読んでいた本
にとても重要なことが記載されていました。
このレインボーカラーマップには問題があるためmatplotlib 2.0からデフォルトのカラーマップがjetからviridisと呼ばれるものに変わります。
「科学技術計算のためのPython」p285
なんと見慣れたあの虹色のカラーマップは今では非推奨なのです。
何が問題なのか
ぶっちゃけわかりにくい。
詳しいことはこちらの記事に説明動画へのリンクがあります。
虹色のjetは確かにカラフルで見栄えこそいいのですが、どの色がどの色より密度が高いことになっているのかないのかピンと来ない、人によってはそれが”ないデータの特徴が存在しているかのように誤解する”ということがあります。
その他にも新しく採用されたviridisは階調の変化が視覚的に分かり易いようにかなり研究されているようです。
色覚異常にも配慮がない
一方で新しくPythonのMatplotlibで採用されたviridisは地味ですが、ちゃんと色の違いがわかることと、所謂、色弱への配慮があります。
色覚異常者がカラーマップを見たときの見え方はこちら。
AndroidもLolipopから色覚異常対応がデフォルトで実装されるようになりました。
マイノリティへの配慮が出来ないのは、今日日時代に取り残されていると言えるでしょう。
実際にPythonで使ってみる。
色の階調を使って密度を可視化するケースは多々あります。今回は、ヒートマップで使ってみることにしました。
データの取得
総務省の情報通信白書から、時間帯別のメディア行為率を使ってみます。
総務省|平成28年版 情報通信白書|主なメディアの利用時間帯
こちらのcsvファイルを使います。
データの読み込み
Pythonではデータの集計にはpandasが便利です。
引数はこちらのサイトを見て確認しました。
Pandas で CSV ファイルやテキストファイルを読み込む – Python でデータサイエンス
今回のデータは、文字コードがシフトJISになっていたので、列名・行名を指定して読み込みます*1
import pandas as pd heijitsu = pd.read_csv("n5205021_2.csv",encoding="SHIFT-JIS",header=0,index_col=0)
すると、こんな感じのデータフレームです。
テレビ(リアルタイム)視聴 | テレビ(録画)視聴 | ネット利用 | 新聞閲読 | ラジオ聴取 | |
---|---|---|---|---|---|
5時台 | 6.6 | 0.4 | 3.1 | 2.7 | 1.0 |
6時台 | 22.9 | 0.4 | 10.4 | 7.6 | 2.0 |
7時台 | 31.9 | 0.5 | 16.6 | 8.4 | 2.4 |
8時台 | 20.2 | 0.5 | 19.7 | 5.9 | 2.9 |
9時台 | 8.4 | 0.9 | 16.9 | 2.4 | 2.2 |
10時台 | 6.0 | 1.2 | 15.2 | 1.3 | 2.2 |
11時台 | 6.4 | 1.2 | 13.5 | 0.6 | 1.9 |
12時台 | 14.8 | 1.1 | 26.7 | 1.0 | 2.0 |
13時台 | 9.4 | 1.9 | 15.3 | 0.9 | 1.7 |
14時台 | 6.6 | 2.2 | 12.9 | 0.7 | 1.7 |
15時台 | 6.1 | 1.5 | 12.9 | 0.7 | 1.2 |
16時台 | 7.1 | 1.4 | 14.1 | 0.6 | 1.3 |
17時台 | 12.2 | 1.9 | 17.8 | 2.4 | 1.7 |
18時台 | 19.8 | 2.0 | 18.9 | 1.9 | 1.6 |
19時台 | 34.8 | 2.3 | 20.2 | 2.5 | 1.1 |
20時台 | 41.5 | 3.0 | 22.8 | 3.1 | 0.9 |
21時台 | 42.4 | 4.8 | 26.6 | 2.7 | 1.0 |
22時台 | 35.6 | 5.0 | 26.2 | 1.7 | 0.6 |
23時台 | 18.1 | 3.6 | 19.0 | 0.9 | 0.5 |
24時台 | 6.7 | 1.8 | 8.3 | 0.3 | 0.4 |
1時台 | 2.1 | 0.7 | 3.1 | 0.1 | 0.4 |
2時台 | 0.6 | 0.2 | 1.3 | 0.0 | 0.2 |
3時台 | 0.4 | 0.1 | 0.8 | 0.0 | 0.2 |
4時台 | 0.4 | 0.1 | 0.7 | 0.1 | 0.3 |
先ずはデフォルトの色でヒートマップ化
Pythonでグラフを作る時は、seabornを使うと手軽で美しくなります。
今のデータでヒートマップにするには、seabornとmatplotlibからpyplotを呼び出します。また、日本語が豆腐にならないようにフォントを指定します。*2
import seaborn as sns import matplotlib.pyplot as plt sns.set(font=['IPAexGothic']) plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True) plt.show()
正直、デフォルトの色も悪くありません。
jetとviridisを比較してみる
試しにjet(raibow)で描いてみます
plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True,cmap="jet") plt.show()
赤と黄色とどっちがどれくらい違うのか一発で理解できるでしょうか?
噂の最新のカラーマップviridisを使ってみます。
plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True,cmap="viridis") plt.show()
これなら重要なところの方が明るく目立つようになっていると思います。
今回のコード
Anacondaを使っているので「matplotlib inline」を指定しています。
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd %matplotlib inline heijitsu = pd.read_csv("n5205021_2.csv",encoding="SHIFT-JIS",header=0,index_col=0) heijitsu sns.set(font=['IPAexGothic']) plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True) plt.show() plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True,cmap="jet") plt.show() plt.figure(figsize=(10,10)) sns.heatmap(heijitsu,annot=True,cmap="viridis") plt.show()
Rにもあるらしい
ほんとこのサイトは情報が早いですね。