Skip to content

架空の行動履歴データでChordDiagram(弦グラフ)を作成します.ここでは,架空の行動履歴データを作成します.

架空の行動履歴データの作成

下記のコードで架空の行動履歴データを作成します.

python
import random
import datetime
import pandas as pd

# 重複なしランダム発生
def rand_ints_nodup(a, b, k):
    ns = 
    while len(ns) < k:
        n = random.randint(a, b)
        if not n in ns:
            ns.append(n)
    return ns

# 架空の行動履歴作成
def make_probe(_list, s, e):
    for _id in range(s, e):
        # 立ち寄りスポット数
        spot_num = random.randint(1, 5)
        # 立ち寄りスポットリスト
        spot_list = rand_ints_nodup(1, 5, spot_num)

        # 日付
        dt = datetime.datetime(2018, 2, 1, 9, 15, 30)
        # 日にち加算
        dp = random.randint(1, 20)
        dt = dt + datetime.timedelta(days=dp)
        # 時刻加算
        hp = random.randint(1, 10)
        dt = dt + datetime.timedelta(hours=hp)

        for spot in spot_list:
            dt = dt + datetime.timedelta(minutes=1)
            _list.append([_id+1, dt, f'spot_{spot}'])
    return _list

# 行動履歴作成
probe_list = 
probe_list = make_probe(probe_list, 0, 400)
probe_list = make_probe(probe_list, 30, 140)

# データフレーム化
df = pd.DataFrame(probe_list, columns=['id', 'datetime', 'spot'])
df.head()

行動履歴データの加工

ChordDiagram(弦グラフ)の作成には,OD表(クロス集計)をする必要があるため,行動履歴データの加工します.

python
# 日付を抽出
df1 = df.copy()
df1['date'] = df1['datetime'].dt.date

# 出発時間のカラム名に変更
df1 = df1.rename(columns={'datetime':'o_time'})
df1 = df1.rename(columns={'spot':'o_spot'})
df1.head()
ido_timeo_spotdate
012018-02-10 19:16:30spot_5
112018-02-10 19:17:30spot_4
212018-02-10 19:18:30spot_1
312018-02-10 19:19:30spot_2
422018-02-19 16:16:30spot_4
python
import time

# dateリスト作成
dates = list(set(df1['date'].tolist()))
time.sleep(2)
dates.sort()

flag=0
for date in dates:
    # 日付のIDを抽出
    df_date = df1[df1['date']==date]
    ids = list(set(df_date['id'].tolist()))

    # ID毎
    for _id in ids:
        df_date_id = df_date[df_date['id']==_id]
        df_date_id = df_date_id.sort_values('o_time', ascending=False)
        df_date_id = df_date_id.reset_index(drop=True)
        
        # d_**
        df_date_id['d_time'] = df_date_id['o_time'][1:].tolist() + df_date_id['o_time'][-1:].tolist()
        df_date_id['d_spot'] = df_date_id['o_spot'][1:].tolist() + df_date_id['o_spot'][-1:].tolist()
        
        if not flag:
            df_merge = df_date_id
            flag = 1
        else:
            df_merge = pd.concat([df_merge, df_date_id])
            
df_merge.head()
ido_timeo_spotdated_timed_spot
03992018-02-02 18:16:30spot_12018-02-022018-02-02 18:16:30
01472018-02-02 15:19:30spot_42018-02-022018-02-02 15:18:30
11472018-02-02 15:18:30spot_32018-02-022018-02-02 15:17:30
21472018-02-02 15:17:30spot_22018-02-022018-02-02 15:16:30
31472018-02-02 15:16:30spot_12018-02-022018-02-02 15:16:30

OD表の作成

重複削除

今回は架空行動履歴データなので,重複削除で雑にクレンジングします.

python
# 重複削除
df_merge2 = df_merge[['id', 'o_spot', 'd_spot']].drop_duplicates()
df_merge2.head()

クロス集計

下記のコードでクロス集計します.

python
# クロス集計
df_crosstab = pd.crosstab(df_merge2['o_spot'], df_merge2['d_spot'])
df_crosstab
d_spot/
o_spot
spot_1spot_2spot_3spot_4spot_5
spot_18749584453
spot_26996434849
spot_34859945847
spot_45551539751
spot_534545160104

まとめ

架空の行動履歴データでChordDiagram(弦グラフ)を作成するために,架空の行動履歴データを作成しました.

参考サイト

Pythonで重複のない乱数を生成する方法を現役エンジニアが解説【初心者向け】

Pythonのdatetimeで日付や時間と文字列を変換

日付の加算 減算 timedelta

pandasのdatetimeをdateに変換したい