読者です 読者をやめる 読者になる 読者になる

広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

【データ可視化】誤解を招かないように配慮された最新のカラーマップ(カラーパレット)について

先日読んでいた本

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化

にとても重要なことが記載されていました。

このレインボーカラーマップには問題があるためmatplotlib 2.0からデフォルトのカラーマップがjetからviridisと呼ばれるものに変わります。

「科学技術計算のためのPython」p285

なんと見慣れたあの虹色のカラーマップは今では非推奨なのです。

何が問題なのか

ぶっちゃけわかりにくい。

詳しいことはこちらの記事に説明動画へのリンクがあります。

medvis.org

虹色のjetは確かにカラフルで見栄えこそいいのですが、どの色がどの色より密度が高いことになっているのかないのかピンと来ない、人によってはそれが”ないデータの特徴が存在しているかのように誤解する”ということがあります。

その他にも新しく採用されたviridisは階調の変化が視覚的に分かり易いようにかなり研究されているようです。

色覚異常にも配慮がない

一方で新しくPythonのMatplotlibで採用されたviridisは地味ですが、ちゃんと色の違いがわかることと、所謂、色弱への配慮があります。

色覚異常者がカラーマップを見たときの見え方はこちら。

The viridis color palettes

AndroidもLolipopから色覚異常対応がデフォルトで実装されるようになりました。

androidlover.net

マイノリティへの配慮が出来ないのは、今日日時代に取り残されていると言えるでしょう。

実際に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を使うと手軽で美しくなります。

qiita.com

今のデータでヒートマップにするには、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()

正直、デフォルトの色も悪くありません。

f:id:yyhhyy:20170504173941p:plain

jetとviridisを比較してみる

試しにjet(raibow)で描いてみます

plt.figure(figsize=(10,10))
sns.heatmap(heijitsu,annot=True,cmap="jet")
plt.show()

赤と黄色とどっちがどれくらい違うのか一発で理解できるでしょうか?

f:id:yyhhyy:20170504174124p:plain

噂の最新のカラーマップviridisを使ってみます。

plt.figure(figsize=(10,10))
sns.heatmap(heijitsu,annot=True,cmap="viridis")
plt.show()

これなら重要なところの方が明るく目立つようになっていると思います。

f:id:yyhhyy:20170504174237p:plain

今回のコード

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()

yyhhyy.hatenablog.com

yyhhyy.hatenablog.com

Rにもあるらしい

ほんとこのサイトは情報が早いですね。

www.karada-good.net

*1:元のCSVから事前に何行か削除しています。

*2:Macの場合はOsakaなどが無難でしょう