データ可視化ライブラリ 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})
# まとめ
今回は,時系列データでの代表的なもので実装しました.
次は,別のオリジナルデータで可視化してみます.