LoginSignup
20
22

More than 3 years have passed since last update.

Altairのすすめ!Pythonによるデータの可視化

Last updated at Posted at 2020-04-14

この記事について

Pythonのデータ可視化ライブラリー、Altairの紹介です。日本語の情報が少ないので布教用に記事にします。英語に抵抗がない方は公式ページを見るのが一番わかりやすいと思います。

インストール

pipコマンドで簡単にインストールできます。vega_datasetsはこの後使うので一緒にインストールしましょう。

pip install altair vega_datasets

私はGoogle Colaboratoryを使いましたが、インストールなしで最初から使えました。

事前準備

以下でライブラリとデータセットを読み込んでください。

import altair as alt
from vega_datasets import data
iris = data.iris()

AltairはPandasとの連携が得意で、irisはPandasのDataFrameです。

基本的な可視化

以下はJupyterなどで直接可視化する想定のコードです。htmlで出力したい場合は末尾に.save("filename.html")を足してください。.interactive()はなくても大丈夫ですが、書くとグラフを動かせるようになります。この記事に貼るのは普通の画像なので、ぐりぐり動かしたい方はこちらでどうぞ

例①散布図

image.png

x軸とy軸の値を以下のように指定します。コメントのようなalt.X()という書き方もできて、複雑な可視化の際はこちらを使います。

alt.Chart(iris).mark_point().encode(
    x="sepalLength", # alt.X("sepalLength"),
    y="sepalWidth", # alt.Y("sepalWidth"),
    color="species"
).interactive()

例②棒グラフ

image.png

average()speciesごとに平均をとっているのがポイントです。平均以外にも様々な操作ができて、一覧はここで確認できます。

alt.Chart(iris).mark_bar().encode(
    x="average(sepalLength)", # alt.X("sepalLength", aggregate="average"),
    y="species", # alt.Y("species"),
).interactive()

要領はこんな感じです。make_xxxxxの部分をmake_lineとすれば折れ線グラフなんかも簡単に書けます。困ったときは公式ページのギャラリーから類似したグラフを探せば大体解決します。

TIPS(加筆するかも)

マウスオーバーで情報表示

image.png

tooltip引数で指定した情報がマウスオーバーで表示されます。

alt.Chart(iris).mark_point().encode(
    x="sepalLength",
    y="sepalWidth",
    color="species",
    tooltip=["sepalLength", "sepalWidth", "petalLength", "petalWidth", "species"]
).interactive()

軸を0から書きたくない

image.png

量的なデータは基本的に0を含んで可視化されます。上のグラフは0を含まないようzero=Falseで明示しています。

alt.Chart(iris).mark_point().encode(
    alt.X("sepalLength", scale=alt.Scale(zero=False)),
    alt.Y("sepalWidth", scale=alt.Scale(zero=False)),
    color="species"
).interactive()

データ型の指定

image.png

名義尺度が整数になっていることはよくありますよね。そのときはspecies_int:Nのように名義尺度であることを明示します。ちなみに順序尺度は:O、量的データなら:Qです。詳細は公式ドキュメントのここに記載があります。

# 整数値に変換 (setosa: 0, versicolor: 1, virginica: 2)
iris["species_int"] = [["setosa", "versicolor", "virginica"].index(x) for x in iris["species"]]

# 正しい例
alt.Chart(iris).mark_point().encode(
    x="sepalLength",
    y="sepalWidth",
    color="species_int:N"
).interactive()

ちなみに:Nを付けないと以下のようになります。
image.png

MaxRowError対応

5000行超えると怒られます。ここの情報を参考に以下を実行。

alt.data_transformers.disable_max_rows()

最後に

シンプルに記述できて探索的な分析には便利です。欠点があるとすると、htmlの出力は簡単ですがpngの出力がやや大変そうでした。参考になれば!

20
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
22