めも

これはメモ。

Win/Mac/Linuxでのキーボードショートカットのリンク集

普段、Win/Mac/Linux をバラバラに使用している中で、定期的に忘れるため...。

開発環境

atom

github.com

jupyter notebook

Jupyter Notebook Shortcuts - Towards Data Science

ショートカットの変更方法は以下のドキュメント参照。

jupyter-notebook.readthedocs.io

vim

Vim shortcuts · GitHub

Visual Studio 2019

docs.microsoft.com

VS Code

設定方法が説明されてます、デフォルトの設定はDefault Keyboard Shortcutsの項目参照。

OS全般

Mac

support.apple.com

Ubuntu 18.04

sicklylife.jp

Windows

Windows のキーボード ショートカット

その他

Chrome

Win, Mac 共に以下に記載。

support.google.com

Excel

Google drive

ウェブ上の Google ドライブのキーボード ショートカット - Google ドライブ ヘルプ

Outlook

support.office.com

Power Point

キーボード ショートカットを使用して PowerPoint プレゼンテーションを作成する - PowerPoint

Slack

get.slack.help

遊び

仕事以外。

Clip Studio

ショートカット一覧: http://vd.clipstudio.net/clipcontent/paint/manual/CSP_Shortcut.pdf (pdfです)

Discord

三谷幸喜「short cut」

三谷幸喜「short cut」

pythonで日付(タイムスタンプの文字列)から日付の特徴を作成する

タイムスタンプの文字列から、日付に関する特徴(情報)を計算する。 たまに行うのでめも。

必要ライブラリ

こちらから jpholiday をインストール、祝日の判定に使用する。 ありがたい。

from datetime import datetime, date, timedelta
import calendar
import jpholiday
import numpy as np

文字列からタイムスタンプを取得

文字列を %Y/%m/%d (年/月/日) としてパースする。年月日以外の各種ディレクティブ(記号)の意味はドキュメントを参照。

# 2019/6/30から年月日をパース
timestamp_str = '2019/6/30'
t = datetime.strptime(timestamp_str, '%Y/%m/%d')

曜日

datetime --- 基本的な日付型および時間型 — Python 3.7.4 ドキュメント

# 月:0 ~ 日:6 のint型で取得
weekday = t.weekday()

祝日フラグ

holidayflag = jpholiday.is_holiday(t.date())

次の日が休日

beginofh = jpholiday.is_holiday(t.date()+ timedelta(days=1)) or (t.date() + timedelta(days=1)).weekday()>4

次の日が平日

endofh = not(jpholiday.is_holiday(t.date()+ timedelta(days=1))) and (t.date() + timedelta(days=1)).weekday()==0

元旦から何日目か

tm_ydayに年度始めからの日数が保存されている。tm_zoneなど他のものは上記ドキュメント参照。

dayofyear = t.timetuple().tm_yday

年と週番号(元旦から第何週目か)

date.isocalendar()はISO 年、ISO 週番号、ISO 曜日を返す。

year, weekofyear, _ = t.isocalendar()

月と日

month, day = t.month, t.day

年度始めから何日目か

年度始めからの日数の差分を求める。

# X年4月1日からの経過日数
frombiginofyear = (t.date() - datetime(t.year-(t.month<4)*1, 4, 1).date()).days

その月の平日と休日の一覧

# 特定の年月の平日・休日一覧を取得
def getdaytypelistfromYM(year, month):
    weekdays, holydays = [], []
    for i in range(calendar.monthrange(year, month)[1]):
        if datetime(year, month, i+1).weekday()<5 and not jpholiday.is_holiday(date(year, month, i+1)):
            # 平日の場合
            weekdays += [i+1]
        else:
            # 休日・祝日
            holydays += [i+1]
    return weekdays, holydays

weekdays, holydays = getdaytypelistfromYM(year, month)

その月に平日と休日が何日あるか

上記「その月の平日と休日」のリストの長さ。

weekdays, holydays = getdaytypelistfromYM(year, month)
numofweekdays, numofholydays = len(weekdays), len(holydays)

一年前の今日に一番近い同じ曜日の日付

nearestwd = date(year-1, month, day)
for i in range(4):
    # 一年前 + i日後の曜日と比較
    if weekday == (nearestwd + timedelta(days=i)).weekday():
        nearestwd = date(year-1, month, day) + timedelta(days=i)
        break
    # 一年前 - i日後の曜日と比較
    if weekday == (nearestwd + timedelta(days=-i)).weekday():
        nearestwd = date(year-1, month, day) + timedelta(days=-i)
        break

特定の日付からの経過日数

# 2017/6/30 から何日経過したか
daydiff = (t.date() - datetime(2017, 6, 30).date()).days

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

pandas.DataFrameでデータの列・行をひとつずらす

やりたいこと

時系列データや順序つきのデータで、直前の時間のデータを特徴として追加したいときがある。

方法

pandas.DataFrame.shift を用いて簡単に実現できる。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randint(0, 100, [10, 5]))
df.columns = ["col%s"%c for c in df.columns]

df の中身は以下のようになっている。

col0 col1    col2    col3    col4
0   93  85  7   74  99
1   5   18  24  66  97
2   76  69  60  40  0
3   94  5   0   3   16
4   61  78  84  49  96
5   34  94  63  73  63
6   78  6   86  3   96
7   33  85  74  43  90
8   83  80  34  56  46
9   74  5   40  33  97

shiftを用いてデータを shift(n) の n だけずらす。ずらした分データが存在しない場所には nan が入るが、fill_value=-1 とすることでずらした箇所を -1 で埋めることもできる。

df["col1"] = df["col1"].shift(1)
df["col2"] = df["col2"].shift(2, fill_value=-1)
df["col3"] = df["col3"].shift(3, fill_value=False)

shiftでデータをずらした後の df の中身は以下のようになる。

col0 col1    col2    col3    col4
0   93  NaN -1  False   99
1   5   85.0    -1  False   97
2   76  18.0    7   False   0
3   94  69.0    24  74  16
4   61  5.0 60  66  96
5   34  78.0    0   40  63
6   78  94.0    84  3   96
7   33  6.0 63  49  90
8   83  85.0    86  73  46
9   74  80.0    74  3   97

iPadProとKORG機器をbluetooth経由で接続

状態

KORG microKEY Air をワイヤレスにした状態で bluetoothをオンにしても、iPadPro・macOS Mojaveから接続できない。

解決方法

Bluetooth MIDI ConnectをApp Storeよりインストールし、これ経由で接続する。

Bluetooth MIDI Connect

Bluetooth MIDI Connect

  • KORG INC.
  • ミュージック
  • 無料

説明書: ダウンロード | microKEY Air - Bluetooth MIDI 接続ガイド | KORG (Japan)

時系列分析の基礎を調べる:その1

あとで「このトピックなんだっけ」と見返したりするためにメモ。

途中です。

時系列分析の基礎

標本と母集団

いま、手元にはいくつかの標本があり、この標本から母集団(手元の標本と同じ性質を持つだろうと期待している集まりの全体)の性質を推定したいとします。 時系列データの場合、「X月X日」のデータは一つでも、そのデータの母集団ははっきりと定義できません。 そこで、推測統計学では

  • 標本=確率変数
  • 母集団 = 特定の確率分布

として扱います。つまり、分析対象は確率分布になり、特に標本から平均値など特定の母数(推測したい母集団の確率分布が持つ値)を推定する場合を点推定、母数の存在する区間を推定することを区間推定と呼びます。

参考文献:以下、Asano Masahiko氏の講義補助資料、推測統計学より

そして、時系列ではこの確率分布が時間とともに変化をしていきます。このような時間とともに変化する確率分布を確率過程と呼びます。

時系列データを構成する要素

時系列データをプロットしたとき、波のような周期性があったり、株価みたいなランダムウォークに近い挙動だったりします。このような時系列データを記述するために必要な要素はいくつか存在します。

  • 自己相関: 現在と過去の相関。次の時間のデータは現在に強く関係している、など。
  • 周期成分: 周期的な挙動。現在の気温は一年前の今日と関係がある、など。
  • トレンド: 周期成分とは別に、「増加傾向にある」「減少傾向にある」などの全体の傾向。
  • ノイズ: データとは全く関係のないノイズで、平均0, 分散σ2の正規分布から発生すると仮定。
  • 外因: 自己相関やトレンド以外のフラグ。雨が降ると気温が下がる、など。

参考文献:以下第二章

時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装

時系列分析と状態空間モデルの基礎: RとStanで学ぶ理論と実装

現在観測しているデータはこれらが重なった結果のデータを見ていることになり、ノイズ以外のものは何等かの式で記述したいです。 そして、手元にある時系列データの性質を知るための統計量として

  • データ全体
    • 平均値: 平均値
    • 分散: ばらつき具合
    • 中央値: 中央値
  • 2つの時間の間に関する統計量
    • 自己共分散: k次の事故共分散=kの間隔での共分散、
    • 自己相関(ACF): 事故共分散を正則化して-1~1の範囲に収まるようにしたもの
    • 偏自己相関(PACF): 2時点前との偏自己相関の場合、1時点まえの相関を排除した上で2時点前との相関を見る、つまり直前のデータだけでは表現できなかったデータ同士の相関を取る

平成 28 年度 計量経済理論 講義ノート 6 定常時系列解析 (pdf

ランダムウォーク

iid系列の累積和。つまり y_t = y_{t-1} + ε + 定数, ε~平均0正規分布からiidで発生するノイズ. 定数項はドリフト率と呼ばれます。

ランダムウォーク - Wikipedia

時系列データの種類

時系列データの分析を始めるために、まず手元のデータが「どの様な」時系列かを理解します。

定常な系列

定常 = 時間に関係なく期待値と事故共分散が一定である時系列データ。 定常なデータを対象にしたモデルを適用できるようになり、解析がしやすい。

【時系列分析の基本】定常性とホワイトノイズを分かりすく解説 | 全人類がわかる統計学

定常と非定常 | 統計ラボ

これは弱定常性と呼ばれる定常性であり、より制約が強い定常性を強定常性(strict stationary)と呼ぶ。強定常性のある時系列では、時間に関係なく確率分布が一定となります。以降、弱定常性を持つデータを対象にして、定常=弱定常を指します。

※強定常性があるが弱定常性がない時系列もあるので注意=平均・分散・共分散が存在しないが分布は時間によらず一定の場合. コーシー-ローレンツ分布は平均値が存在しない, など。

ーシー分布に従う母集団から無作為抽出された標本に関する算術平均は、ただ一つの抽出による結果からは一切改善されない。これは、標本に極端に大きな(あるいは小さな)値が含まれる可能性がかなり高いからである。しかし、標本中央値(これは極端な値には影響を受けない)は中心(最頻値)を知るための一つの尺度となります。

コーシー分布 - Wikipedia

時系列データの種類分け

時系列データを分析する上で、どのような可視化を行うか、どのようなモデルを使って分析を行うかを決めていく必要があります。 そこではじめに、今の手元のデータがどのような種類のデータかを把握したいです。

  • 連続か離散か: 時間が連続なのか離散なのか、離散の場合その時間の間隔は等間隔なのか等間隔ではないのか
  • 一変量と多変量: 分析対象となる変数は一つなのか多次元なのか
  • 定常と非定常: 系列が定常なのか定常ではないのか
  • 線形と非線形
  • ガウス型と非ガウス型

前処理

可視化や分析を進める上で、はじめにそれらを行いやすくするためにデータに前処理を行います。 前処理によって処理しやすくなる面がある一方、前処理の手法によってデータから失われる情報もあることに注意する必要があります。

定常な系列への変換方法

一般的に、実データは定常でないことの方が多く、トレンド成分が乗っていることがあります。 定常でないデータから定常なデータに変換する前処理が必要になる場合があり、たとえば各時間の間の差分を取る、対数をかけるなどの処理をして(定常なデータしか扱えないモデルを使用して分析をする場合は)定常な形にしてから分析を始めます。

  • 対数変換: 系列全体を対数で変換
  • k階差分: kの時間間隔での差分を計算して新しい系列にする
  • ロジット変換: 比率データを自然対数を用いて変換
  • Box-Cox変換: 誤差の正規性と等分散性を満たすようにべき乗の変換をする
  • 比率: 周期を既に知っているものとして、前回の周期との比率を計算してそれを系列にする

フィルター

何を分析したいのか(はずれ値を取り除いて全体の傾向を見たいのかはずれ値の出るタイミングを見たいのか、等)を決めたうえで、 分析に必要ない情報を取り除いてデータを扱いやすくします。

  • 移動平均フィルター
  • 重み付け移動平均フィルター
  • 移動中央値フィルター
  • Savitzky-Golayフィルター
  • Hampel フィルター

時系列データの分析

可視化

以下、たまに出てくる plt = import matplotlib.pyplot as pltpltです。

  • 時系列の波形の概要を見たい
    • plt.plot, 横軸を時間で取って波形を見る, 周期性やトレンドなどを見て判断
    • plt.scatter, 横軸をある時刻の値、縦軸をその時刻-k時点での値でプロットしたもの、時間間隔kの間で相関があるかをチェック
    • plt.hist: ヒストグラム、取りうる値の分布、中央値など基準を決めたときに基準からどれくらい離れることがあるかの分布を確認

モデル

  • 定常時系列に対するモデル
  • 状態空間モデル
  • 非線形なモデル

定常時系列に対するモデル

Box-Jenkins法

時系列データのモデル作成・予測を行うための手順を示したものをBox-Jenkins法と呼びます。

  1. データを分析できるように定常課程に変換する
  2. ARIMA, MA, ARMA, ARモデルなどからモデル選択し、同定する
  3. 推定したモデルを評価して、それを用いた予測を行う

ここでの「モデルの選択」=AR、MAなどの中から使用するモデルを選択すること、「モデルの同定」=モデルに付随するパラメータを決定することです。

始めの定常課程に変換する過程で、トレンドや季節成分を除去する必要があるため、これらの要素も対象に分析をしたい場合は注意が必要になります。そして、実データの系列はデータ間の階差を求めても定常にならない場合が多くあります。

ARIMAモデル = 自己回帰モデルAR + d次和分課程 + 移動平均モデルMA

AR

  • 一次元の自己回帰モデルAR=直前の時間のデータを説明変数とする回帰モデル
  • n次元のAR = n時点前までのデータを説明変数とする回帰モデル

今対象としているデータは弱定常として、トレンドはなくノイズも平均は0。一次の自己回帰モデルの場合、直前の時間t-1の値を条件としてtの時点でのデータの分布を条件付き確率分布で記述することができる。このようなデータは AR(1) と書きます。 AR(1)の場合、時刻tでの値は t-1での値を使って(ノイズ以外の部分を)説明できるため、2次以上の偏自己相関は0に近づき、自己相関は0ではない値を取ることが多いです。

AR(1)モデルで、直前の時間 t-1 の係数が1の場合、現在の時刻tのデータ = t-1のデータ + ホワイトノイズになります。 どんなに時間がたっても t-1 のデータの影響は消えない。係数が1(単位根を持つ)の場合はランダムウォークと呼びます。 ランダムウォークに従うデータ同士で回帰分析をすると、「見せかけの回帰」問題が発生することに注意。

見せかけの回帰は時系列変数の回帰において説明変数と被説明変数が双方とも単位根過程である時に発生しうる。説明変数と被説明変数が共に単位根過程ならば、二つの変数は独立、つまり何の因果関係も相関関係もないとしても、その回帰係数は通常の手続きにおいて統計的に有意となる場合が多い。

見せかけの回帰 - Wikipedia

MA

移動平均モデルMAでは 現在tの値は過去の誤差(の重み付け平均)を使って説明できる、とする。 n時点前からの誤差を使って現在の値を説明するとき、MA(n)と書く。

www.orsj.or.jp

反転可能性: MAモデルが∞次元のARモデルで表現できるとき、そのMRモデルは反転可能と呼びます。反転可能性はMAモデルを選択する時の基準の一つとして利用します。(同じ期待値と自己相関の構造をもつMAモデルは複数存在できるため、その中からどのMAモデルを選択するかの基準として利用する)

ARMA

ARMAモデルでは、これらARモデルとMAモデルを組み合わせる。ARとMAそれぞれで何時点前までを考慮するかのパラメータがあるため、ARMA(p,q)モデルと記述される。ARMA(p,q) = AR(p)の項 + MA(q)の項 + ホワイトノイズで表現できる。

ARIMA

ARMAモデルを非定常なデータに適用するために、データの階差をとり定常になった値にARMAモデルを適用する場合、これはARIMAモデルと呼びます。このような階差が定常になるようなデータを一階の和分課程と呼びます。

周期成分と外因

SARIMA:

ARIMAX:

参考文献

  1. 川崎 能典, 統計的時系列モデリング, https://www.ism.ac.jp/shikoin/training/dstn/pdf/C5.pdf