データ可視化ライブラリ Altairを使ってみる(時系列データ編)

時系列データでのデータ可視化ライブラリ Altair を使ってみる.

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# モジュールのインストール

!pip3 install altair
!pip3 install altair_saver

# 時系列デモデータの作成

可視化するためにでもデータを作成します.

import numpy as np
import pandas as pd
import datetime

np.random.seed(1) # 乱数の固定

goods_list = ['商品A','商品B','商品C'] # 調査対象の商品
sex_list = ['男','女']

t = [] # 時刻リスト
g = [] # 商品リスト
a = [] # 年齢リスト
s = [] # 性別リスト

# 2000 年の元日からの 1 年間でシミュレーションを行う。
time = datetime.datetime(2000, 1, 1, 0)

while time.year == 2000:
    # 顧客の来店をガンマ分布でシミュレーション
    # 冬に来客数が増えるように調整
    gamma = 0.5 * (12-abs(time.month-6)) 
    time += datetime.timedelta(
        hours = np.round(np.random.gamma(gamma)
            )
        )
    ## 営業時間を 9:00 ~ 21:00 とする。
    ## それ以外に来客した場合、来客時間を 12 時間先送りにする。
    if 21 < time.hour or time.hour < 9:
        time += datetime.timedelta(hours = 12)
    t.append(time)

    # 顧客がどの商品を選ぶのかをランダムで決める
    goods = np.random.choice(goods_list, p=[0.6,0.3,0.1])
    g.append(goods)

    # 商品購入者の年齢をシミュレーション
    if goods == '商品A':
        age = np.round(np.random.normal(35,15))
    elif goods == '商品B':
        age = np.round(np.random.normal(50,20))
    else :
        age = np.round(np.random.normal(65,10))
    a.append(age)

    # 商品購入者の性別をシミュレーション
    if goods == '商品A':
        sex = np.random.choice(sex_list, p=[0.75,0.25])
    elif goods == '商品B':
        sex = np.random.choice(sex_list, p=[0.4,0.6])
    else :
        sex = np.random.choice(sex_list, p=[0.2,0.8])
    s.append(sex)

    # 2001 年になったらシミュレーションを終了する。
    if time.year == 2001:
        break

df = pd.DataFrame()
df['来客時間'] = t
df['購入商品'] = g
df['年齢'] = a
df['性別'] = s
df = df[:-1]

display(df)
display(df.head(5))
来客時間 購入商品 年齢 性別
0 2000-01-01 19:00:00 商品A 26.0
1 2000-01-01 21:00:00 商品A 10.0
2 2000-01-02 13:00:00 商品B 45.0
3 2000-01-02 15:00:00 商品B 54.0
4 2000-01-02 21:00:00 商品B 28.0
... ... ... ... ...
999 2000-12-30 20:00:00 商品A 46.0
1000 2000-12-31 10:00:00 商品B 42.0
1001 2000-12-31 14:00:00 商品B 85.0
1002 2000-12-31 17:00:00 商品A 59.0
1003 2000-12-31 21:00:00 商品B 36.0

1004 rows × 4 columns

来客時間 購入商品 年齢 性別
0 2000-01-01 19:00:00 商品A 26.0
1 2000-01-01 21:00:00 商品A 10.0
2 2000-01-02 13:00:00 商品B 45.0
3 2000-01-02 15:00:00 商品B 54.0
4 2000-01-02 21:00:00 商品B 28.0

# 時系列デモデータの可視化

# 折れ線グラフ

import altair as alt
from altair_saver import save

line = alt.Chart(df).mark_line().encode(
    x=alt.X('month:O',
        timeUnit='month',
        title='来客月'
        ),
    y=alt.Y('count(購入商品)',
        title='購入数'
        ),
    color='購入商品'
    ).transform_timeunit(
    month='month(来客時間)'
    )


# 描画
display(line)
# 保存
# save(line, "qiita10.html",embed_options={'actions':True})

# 折れ線グラフ(エラーバンドあり)

今回は 95% 信頼区間でエラーバンドをつけてみます.

import altair as alt
from altair_saver import save

line = alt.Chart().mark_line().encode(
    x=alt.X('month:O',
        timeUnit='month',
        title='来客月'
        ),
    y=alt.Y('mean(年齢)',
        title='年齢'
        ),
    color='購入商品'
).transform_timeunit(
    month='month(来客時間)'
)

band = alt.Chart().mark_errorband(extent='ci').encode(
    x=alt.X('month:O',
        timeUnit='month',
        title='来客月'
        ),
    y=alt.Y('年齢', 
        title='年齢'
        ),
    color='購入商品'
).transform_timeunit(
    month='month(来客時間)'
)

chart = alt.layer(line,band, data=df)

# 描画
display(chart)
# 保存
# save(chart, "qiita11.html",embed_options={'actions':True})

# まとめ

今回は,時系列データでの代表的なもので実装しました.

次は,別のオリジナルデータで可視化してみます.

# 参考サイト

【Python】データ可視化ライブラリ Altair を使いこなす (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

Pythonで英文のPDFをレイアウトを維持したまま翻訳してみる

Pythonで英文のPDFをレイアウトを維持したまま翻訳してみる

Pythonで英文のPDFをレイアウトを維持したままの翻訳を実装します.

「ゼロからのOS自作入門」2章 EDKⅡでHello worldを実行する(前編)

「ゼロからのOS自作入門」2章 EDKⅡでHello worldを実行する(前編)

ゼロからのOS自作入門」2章 EDKⅡでHello worldを実行します.

EDKⅡのダウンロードはDockerでビルドした時に実行済みです.