2026年9月15日火曜日

Google Cloud

Google Cloud(GCP)は、個人でも完全無料~実質無料で試すことができる。

  1. 無料試用枠(初回アカウント登録特典)

    • 特典内容: 90日間有効な$300分の無料クレジットがもらえる。
    • 条件: 初めてGoogle Cloudのアカウントを開設する場合。
    • ポイント: 登録時にクレジットカードの入力が必要だけど、勝手に有料プランへ自動移行されて課金されることはない。有料アカウントへ手動でアップグレードしない限り、無料枠を使い切ったら停止する仕組み。
  2. 常時無料枠(Always Free) 無料試用期間が終わった後も、規定の範囲内ならずーっと無料で使い続けられるリソースがたくさんある。

サービス名 常時無料の範囲(毎月) 主な使い道
Compute Engine (VM) e2-micro インスタンス 1台 (米国リージョン) 小さなWebサーバーやBotの稼働
Cloud Run 200万リクエスト/月 Dockerコンテナを使ったAPIやWebアプリ
Cloud Functions 200万回の呼び出し/月 イベント駆動型の軽いプログラム実行
Cloud Storage (GCS) 5GBの標準ストレージ 画像やデータの保存
BigQuery 1TB分のクエリ処理、10GBのストレージ SQLを使ったデータ分析の練習

Cloud Storage(データレイク役割)

  • CSV、JSON、画像、ログファイルなど、あらゆる生のデータを「とりあえずそのまま貯めておく」場所。
  • 料金がすごく安くて容量を気にせず置けるのが強み。

BigQuery(データウェアハウス役割)

  • Cloud Storage にあるCSVやParquetファイルを読み込んでテーブル化したり、直接取り込んで(ロードして)標準的なSQLで爆速分析・抽出する場所。
  • テラバイト級の巨大データでも数秒で抽出できるのが強み。


(GCSへの)データの読み込み方法

CSVからの読み込み

特に自社の業務システムから出力した顧客データや、外部のサービスからダウンロードした売上データなどはCSV形式が多いから、GCSにCSVをアップロードして分析するケースは一般的。

ただ、実務で膨大なデータ(何千万行・何億行)を扱う場合は、CSVよりも圧縮率が高くて高速に読み込めるParquet(パルケ)やJSONという形式に変換してGCSに置くことも多い。

Google Analytics(GA4)や AdSense との連携

GA4やAdSenseのデータをBigQueryに送ってSQLで分析するのは、マーケティング分析やWebメディア運営の現場で超定番の使われ方。

  1. Google Analytics (GA4) の場合
    • GCSを挟まずに「GA4 ➔ BigQuery」へ直接連携(エクスポート)する標準機能が用意されている。
    • ボタンひとつで設定できて、毎日自動でWebサイトの閲覧ログ(生のイベントデータ)がBigQueryに転送される。しかも標準の枠内なら転送自体は無料。
  2. AdSense や Google 広告 の場合
    • 「BigQuery Data Transfer Service」というGoogle Cloud内の定期転送機能を使ったり、APIを経由してBigQueryやGCSにデータを送る。
    • 広告のインプレッション数や収益データを自動で取得して、BigQuery上でGA4のアクセスデータと「JOIN(結合)」させることで、「どのページ・どの検索ワードから来たユーザーが一番収益を生んでいるか」をSQLで一発分析できるようになる。
データ元 連携ルート よく使われる形式
業務データ / CSV等 CSVデータ ➔ GCS ➔ BigQuery CSV / Parquet
Google Analytics (GA4) GA4 ➔ 直接 BigQuery 自動テーブル化
AdSense / Google Ads API / 転送機能 ➔ BigQuery (またはGCS) JSON / 自動テーブル化


お試しでやってみた内容

  1. まずは無料登録: $300分のクレジットをもらってアカウントを作る。
  2. 予算アラートを設定する: 万が一の請求を防ぐために、「10,000円を超えたら通知する」みたいな予算アラート(Budget Alert)を最初に設定しておく。
  3. AdSenseのレポートをcsv形式でダウンロードしてくる。
  4. Cloud Storage (GCS) にアップロードする。
  5. BigQueryからGCS上の外部テーブルを参照して、BigQuery Console上でSQLを叩いて集計
  6. Google Colabからの認証、BigQuery接続、Pythonでの集計とグラフ可視化

GCSの準備

  1. Cloud Storage(GCS)にバケットを作ってCSVをアップロード
    1. Google Cloud コンソールの左上メニュー(☰)から 「Cloud Storage」➔「バケット」 を選択。
    2. 上部にある 「+作成」 をクリック。
    3. バケット名 を入力(世界で一意の任意名、例: my-first-bucket-hoge-1234)。
    4. ロケーションタイプは 「Region」、ロケーションは 「asia-northeast1 (東京)」 を選択して、下部にある 「作成」 を押す。
    5. 作成されたバケット画面が開くので、「ファイルをアップロード」 を押して用意したCSVファイルをアップロード。
    6. アップロード完了後、CSVのファイル名をクリックして 「GCS URI」(gs://バケット名/ファイル名.csv のような文字列)をコピーしておく。
  2. BigQueryにデータセットを作成
    1. 左上メニューから 「BigQuery」 を選択。
    2. エクスプローラ欄にある自分のプロジェクト名(project-id)の右横にある 「︙(3つの点)」 をクリック ➔ 「データセットを作成」 を選択。
    3. データセット ID を入力(例: sample_dataset)。
    4. ロケーションタイプを 「asia-northeast1 (東京)」 に合わせたら、一番下の 「データセットを作成」 を押す。
  3. GCSのCSVからBigQueryテーブルを作成
    1. 今作成したデータセット名(sample_dataset)の右横にある 「︙」 をクリック ➔ 「テーブルを作成」 を選択。
    2. 以下の通りに設定入力:
      • ソース: 「ソース」で Google Cloud Storage を選択。
      • GCS バケットからファイルを選択: 先ほどコピーした GCS URI(gs://...)を貼り付け。
      • ファイル形式: CSV を選択。
      • テーブル: 作成するテーブル名を入力(例: test_table)。
      • スキーマ: 「自動検出(Auto detect)」 にチェックを入れる(列名やデータ型を自動で判断してくれる)。
      • だがAdSenseレポートの場合は、半角スペースやカッコがあってデフォルトの自動検出のままだとうまくいかないので、
        1. 下の方にある 「詳細オプション(Advanced options)」 をクリックして展開する。
        2. 「文字マップ(Character map)」 という項目を探して、初期値から 「V2」 に変更する。
        3. V2にすると、BigQueryが自動的に使える記号に置換してくれる。
        4. csvの側で列名を変更するならv2にせずともよい。
    3. 画面下部の 「テーブルを作成」 をクリックすれば完了!

バケット(Bucket)とは?

データをしまっておくための、最上位のフォルダのようなもの。Cloud Storage(GCS)では、ファイル(CSVや画像など)を直接クラウド上にぽんと置くことはできなくて、「必ずバケットという箱の中に保存する」というルールがある。

バケット名の特徴と決め方

  • 世界中でたったひとつ(ユニーク)の名前にする必要がある
    • Google Cloudを使っている世界中の誰とも被らない名前にする必要がある。
    • 例えば my-bucket や test みたいな名前はすでに誰かが使っているからエラーになっちゃう。
  • おすすめの命名パターン
    • 自分の名前や日付、ランダムな数字を組み合わせると被りにくくて作りやすい。
    • 例:hoge-data-202609 や my-sample-bucket-hoge-99

パソコンで例えると、

  • GCS全体 ➔ パソコンのハードディスク
  • バケット ➔ Cドライブ直下のメインフォルダ
  • ファイル ➔ その中に入れるCSVデータや画像

バケット名さえ決まれば、その中にCSVファイルをどんどん放り込めるようになる。


データセットIDとは?

BigQueryのなかで「複数のテーブルをまとめておくためのグループ名(フォルダ名)」のこと。「バケット」がCloud Storage側の道具箱だとしたら、「データセット」はBigQuery側の道具箱(データベース)みたいなイメージ。

  • プロジェクト ID: クラウド全体の契約単位
  • データセット ID: 関連するテーブルを束ねるフォルダ(スキーマ)
  • テーブル名: 実際のCSVデータが入った表

データセットIDの決め方ルール

  • バケット名とは違って世界中で被らないようにする必要はなくて、自分のプロジェクトの中で被らなければよい。
  • 使える文字: 半角の英数字とアンダースコア(_)
  • おすすめの名前: sample_dataset や test_db など、分かりやすい小文字の英数字で作れば大丈夫。
  • SQLを書くときも、プロジェクトID.データセットID.テーブル名 という形で指定してデータを呼び出すことになる。

BigQueryでSQLを使ってデータ抽出・集計

  1. SQLの実行手順
    • 作成したテーブル名(test_table)をクリック。
    • 画面上部にある 「クエリ」➔「新しいタブ」 をクリック。
    • エディタ領域(黒い画面)にSQLが入力できるようになる。
  2. まずは試してほしい基本のSQL
    • まずは全件取得して中身を確認するSQL(プロジェクトID.データセットID.テーブル名の部分は適宜書き換える)
SELECT * 
FROM `プロジェクトID.sample_dataset.test_table` 
LIMIT 10;

-- DATE型(日付型)のdate(yyyymmdd)カラムをyyyymmにする 
FORMAT_DATE('%Y%m', date) AS yyyymm,  -- 例: 202609
-- もしハイフンを入れたいなら FORMAT_DATE('%Y-%m', date)

縦持ちを横持ちにするならPIVOT

-- Max(CASE WHEN..としなくてもいい)
SELECT *
FROM (
  -- ① 元となる集計データを用意(前処理)
  SELECT 
    site,
    FORMAT_DATE('%Y%m', date) AS yyyymm,
    `Estimated earnings _JPY_` AS revenue
  FROM `プロジェクトID.sample_dataset.test_table`
)
-- ② PIVOTで yyyymm の値を横軸の列に展開する
PIVOT(
  SUM(revenue) FOR yyyymm IN ('202607', '202608', '202609')
)
ORDER BY site;

「毎月新しい年月が増えるたびに IN ('202601', '202602'...) のコードすら書き換えたくない」っていう場合は、BigQueryの動的SQL(Dynamic SQL)を使う

ただし、BigQueryでDECLAREやSETを使った手続き型スクリプト(複数行の処理)を実行すると、ステップごとの処理結果が別々のタブ(ステートメント)として出力される仕様になっている。なのでこれの実行結果を見るときは、一番最後のステートメントを選択する必要がある。

-- 存在する yyyymm をカンマ区切りの文字列として動的に生成して変数に入れる
DECLARE dynamic_months STRING;

SET dynamic_months = (
  SELECT STRING_AGG(DISTINCT CONCAT("'", FORMAT_DATE('%Y%m', date), "'"), ',' ORDER BY CONCAT("'", FORMAT_DATE('%Y%m', date), "'"))
  FROM `プロジェクトID.sample_dataset.test_table`
);

-- 動的にPIVOTクエリを作成して実行
EXECUTE IMMEDIATE FORMAT("""
  SELECT *
  FROM (
    SELECT site, FORMAT_DATE('%%Y%%m', date) AS yyyymm, `Estimated earnings _JPY_` AS revenue
    FROM `プロジェクトID.sample_dataset.test_table`
  )
  PIVOT(
    SUM(revenue) FOR yyyymm IN (%s)
  )
  ORDER BY site;
""", dynamic_months);


Google Colabからの認証、BigQuery接続

from google.colab import auth
from google.cloud import bigquery
import pandas as pd

# 1. Googleアカウントの認証(ポップアップが出るので許可するだけ)
auth.authenticate_user()

# 2. BigQueryクライアントの作成
project_id = '適宜指定'
client = bigquery.Client(project=project_id)

# 3. SQLの実行とPandas DataFrameへの格納
sql = """
SELECT site, SUM(`Estimated earnings _JPY_`) AS total_revenue
FROM `プロジェクトID.sample_dataset.test_table`
GROUP BY site
"""

# 結果を直接PandasのDataFrameとして取得
df = client.query(sql).to_dataframe()

# データ表示
print(df.head())


実務の運用で難しくなる3つのポイント

  1. データパイプラインの自動化(ETL / ELT)
    • 個人でお試し: 手動でCSVをGCSにアップロードしてBigQuery画面から取り込み。
    • 実務での運用: 毎日・毎時間にバッチ処理やストリーミングで自動転送させる(Cloud Composer/AirflowやCloud Pub/Subなどのツールを活用)。
  2. データクレンジングと例外処理
    • 個人でお試し: キレイなCSVを1回読み込ませる。
    • 実務での運用: 「途中でデータ型が変わった」「日付形式が崩れている」「欠損値がある」「二重送信された」といったエラーへの自動検知とリカバリ設計が必要。
  3. 大規模データでのコスト・パフォーマンス管理
    • 個人でお試し: 数千〜数万行のデータ(クエリ実行も数MB〜数GBでほぼ無料)。
    • 実務での運用: 数十億行(数TB〜数PB)のデータ。適当に SELECT * を叩くと1回のクエリで数千円〜数万円吹っ飛ぶリスクがあるため、パーティショニングやクラスタリングの設計が必須になる。

BigQueryとBigtable

  • BigQuery(データウェアハウス): 大量の過去データをまとめて集計・分析する(SQLでOLAP処理)。
  • Bigtable(NoSQLデータベース): ミリ秒単位の超高速な読み書きが必要なリアルタイム処理(IoTのセンサーデータ受信やソーシャルメディアのログなど)。

2026年5月13日水曜日

Python環境構築

よく忘れる

# どんな仮想環境あったっけ
conda env list
conda info -e  # どっちでもいい

# 仮想環境を有効化
conda activate pm5

conda deactivate

# 何を入れてたっけ
conda list

# 不要になった古い環境を削除
conda remove --name base_backup  --all
# condaのキャッシュ削除
conda clean --all

# 今ある環境をのうち1つをcopyしてbackupとしたい
conda create --name base_yyyymmdd --clone base


# 設定ファイル(YAML)を書き出しておくと、
conda env export > environment_20250505.yml

# もしもグダグダな環境になってしまったなどの場合は以下で全く同じ環境を再構築できる
conda env create -f environment_20250505.yml 
# 別の名前で新しい仮想環境を作りたい場合は
conda env create -f environment_20250505.yml  -n new_project_name


# condaの復元機能: インストールするたびに、変更前の状態を記録してくれるrevisionという機能がある
conda list --revisions
# これを見ると、何時何分に何を入れたかが履歴として出てくる。
# もし新しいライブラリを入れて壊れたら、番号を指定してサクッと戻せる。
conda install --revision 5  # 5番の状態に戻す



homebrewを削除して一度きれいにするまでのなんやかんや(クリックで展開)

まっさらにしていく

# brewで入ってるもの確認
brew list --formula
brew list --cask

# homebrew含め全部削除する
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
Homebrew uninstalled!
The following possible Homebrew files were not deleted:
/opt/homebrew/bin/
/opt/homebrew/etc/
/opt/homebrew/lib/
/opt/homebrew/share/
/opt/homebrew/var/
You may wish to remove them yourself.

と言われるので、

sudo rm -rf /opt/homebrew/bin
sudo rm -rf /opt/homebrew/etc
sudo rm -rf /opt/homebrew/lib
sudo rm -rf /opt/homebrew/share
sudo rm -rf /opt/homebrew/var

ディレクトリが消えているか確認する

# ターミナルで:
ls /opt/homebrew
# 何も表示されなければ削除成功
#まだ残っていたら、ディレクトリ名が表示される

# brew コマンドが使えないか確認
brew --version
# command not found と出れば Homebrew はもう存在しない
# もしバージョンが出たら、どこかに残ってる

# PATH に残っていないか確認
echo $PATH
# /opt/homebrew/bin が PATH に残っていなければ OK
# .zshrc や .bash_profile に残っている場合は、手動で削除

vim ~/.zshrc
# 編集したら保存して

# シェルを再読み込み
source ~/.zshrc

# シェルを完全に再起動
# すでに開いているターミナルは古い環境を保持している場合がある
# 新しいターミナルを開いて確認

改めてHomebrewを新規インストール

# https://brew.sh/ja/
# macOSをお使いの場合は新しい.pkgインストーラーをお試し下さい とのことなので.pkgを落としてきて実行
# https://github.com/Homebrew/brew/releases/tag/4.6.6

vim ~/.zshrc
# export PATH='hoge'の下に eval "$(/opt/homebrew/bin/brew shellenv)" を追記

# ちゃんとbrewがインストールできたかの確認
brew help
# 大丈夫っぽい

# 現在の PATH を確認
echo $PATH
# PATH のどこかに /opt/homebrew/bin が含まれていればOK

which brew 
# 出力が /opt/homebrew/bin/brew になっていれば、正しく PATH が設定されている

miniforgeインストール

brew install miniforge

# condaのバージョン確認
conda --version
# conda 25.3.1 versionを返してくれればcondaの準備はOKです

pymc5用

一応動作はしてるが、condaとpipを混ぜてるのであまりいい状態ではないかも
conda create --name pm5 python=3.11

conda init zsh
# として、ターミナル再度立ち上げ直す

conda activate pm5

# pymc5をインストール https://www.pymc.io/projects/docs/en/latest/installation.html
conda install -c conda-forge "pymc>=5"
# arviz, graphviz, numpy, pandas, scipyなども一緒に入る

conda install -c conda-forge seaborn matplotlib ipykernel ipywidgets
# statsmodelsも入る

# conda install -c conda-forge prophet  # ないって言われる
python -m pip install prophet
# https://facebook.github.io/prophet/docs/installation.html#python

python -m pip install tfcausalimpact
# https://github.com/WillianFuks/tfcausalimpact

# 以下がないとprophetというかパラメーターの最適化だっけ、後半のところができないみたい
conda install -c conda-forge dask
conda install -c conda-forge plotly

imagemagickインストール

brew install imagemagick
# python 3.13がインストールされちゃったのを削除する
brew uninstall --ignore-dependencies python

brewの要らなくなったのを削除

brew cleanup  # 古いキャッシュや不要ファイルを削除(推奨)
brew cleanup --prune=0  # すべて のキャッシュと不要ファイルを削除
brew autoremove  # 依存関係がなくなったパッケージを削除
rm -rf $(brew --cache)  # キャッシュ全削除
conda clean --all  # すべてのキャッシュ・不要ファイルを削除(推奨)



pycaret用

  • condaでやるとpycaret動作させるまでに手こずる
  • colabだとpythonバージョンが新しすぎてpycaret動作しない
  • よって、pythonとpycaretのバージョンはほどほどにしつつ、pycaretを確実に動作させるために、基本pipで入れていく
conda create -name pyc3 python=3.10
conda activate pyc3
pip install pycaret==3.0.4
# このときmatplotlib numba numpy pandas plotly scikit-learn scipyもpip(pypi)で入ってる

pip install "pycaret[analysis]==3.0.4"

pip install jpholiday
python -m pip install jpholiday

で、VS codeで、

from pycaret.classification import * しようとすると、

ImportError: cannot import name 'interp' from 'scipy' (/opt/homebrew/Caskroom/miniforge/base/envs/pyc3/lib/python3.10/site-packages/scipy/init.py) と言われた

pip install "scipy<1.13.0" 状況変わらず

pip install scipy==1.11.4

ImportError: cannot import name '_format_load_msg' from 'joblib.memory' (/opt/homebrew/Caskroom/miniforge/base/envs/pyc3/lib/python3.10/site-packages/joblib/memory.py)

conda list joblib のバージョンは、1.5.3だったので

pip install joblib==1.3.2

import pycaretしないままだったので、ひょっとしたら

pip install scipy==1.11.4 pip install joblib==1.3.2 はやらなくてもよかったのかもしれないが、

from pycaret.classification import *は通った。

でも、reg1 = setup(df1, target="is_purchased", session_id=1)でNameError: name 'pkg_resources' is not defined と言われる。

pip install "setuptools<70.0.0"

Successfully installed setuptools-69.5.1

無事にpycaretは実行できるようになった。

pip freeze > before_seaborn.txt
# conda list --export > conda_env_before_seaborn.txt # 上と同じなのでやらなくていい

conda list > conda_list_before_seaborn.txt

とか思ってたが見落としてただけでseaborn入ってたー

なのでこれでひとまずOKとして終了




streamlit

import streamlit as st
# に続けてだいたいいつもの感じでpythonコード書いておいて

hoge.pyで保存しておいて、ターミナルで

streamlit run hoge.py

とすることで、ブラウザ起動して実行できる


2025年2月24日月曜日

シグナル&ノイズ

グーテンベルクの発明

  • 大衆が情報を利用できるようになった、様々なアイディアが一気に広まった

予想しなかったことが起きるようになった

  • 産業革命、急激な成長と変化の時代へ突入
  • ヨーロッパでは啓蒙思想の広まり、アメリカには合衆国が建国
  • 聖戦も生み出した、行く末を予言し、運命を選ぶことができると人間が信じるようになった
  • 人類史上の血まみれの時代

グーテンベルク以前、

  • 書物はあった
  • が、数は少なく、広く読まれるものではなかった、貴族階級の贅沢品
  • 手作業での複製、間違いの発生、知識の蓄積は難しい
  • 記録を残す<記録が消える

印刷機以降、人類の知識は急速に蓄積

  • 間違いの質が変わった、写し間違いは減った
  • が、間違いの(も)大量生産
  • ネットも同様、失敗するときは大きく失敗する

ネットの登場、情報の質にさらにばらつきが出てきた

  • 多くのアイディアが人の目にさらされる、混乱が生じる
  • 情報をどう扱うべきか、有用な情報とそうでない情報をどう区別するか
  • これらへの理解が情報の増加に追いつかなかった

よい情報だけではなく、悪い情報も広める可能性を生み出した

  • 悪い情報は予想以上の影響を及ぼす可能性(グローバル金融危機)
  • 規制は問題解決の一つの手段、だが自分たちの中に答えを見つけるのを避けるための言い訳では?
  • 認めよう、私たちの予測には問題がある、
  • 人間はものごとを予測するのが大好きだが、決して上手ではない

知識の共有が進んだ結果、国や宗教が孤立するようになった

  • あまりにも多くの情報を手にすると、本能的に気に入ったものを選ぶようになる、それ以外は無視
  • 自主的なフィルターバブルの発生
  • 同じ選択をした人は味方、それ以外は敵とみなしやすくなったのかもね
  • シェイクスピア「ジュリアス・シーザー」シセロのセリフ (しかし)人間というものは、ものごとを自分の好きなように解釈して、本来の意味を見失うことがある

シグナル(信号)とノイズ(雑音)を区別するのは難しい

  • シグナル(真実)
  • ノイズ(真実から目をそらさせるもの)

データが語るストーリーは、自分が聞きたいと思っているものになりがち、しかもたいていの場合はハッピーエンド。
「人はときに己の運命を支配する」カッシウス

  • prediction 予測
    • 預言者の言葉 (宿命、占い、迷信などとも近い)
  • forecast ゲルマン語起源 プロテスタントの俗性
    • 不確実な状況で計画を立てること 慎重さ、洞察力、勤勉さ
    • foresight(将来の展望、将来への配慮)に近い

人間の生物学的本能(ないパターンを見出してしまう)が情報豊富な現代社会でうまく機能するとも限らない

  • バイアスを意識しないと、得られる情報は増えないで減るだろう
  • よりよい予測には、客観的な真実を信じて追求する姿勢が不可欠
  • 客観的な真実の理解が不十分であることを認識すべき

予測と仮説

  • 予測とは、主観的事実と客観的事実をつなぐもの
  • 仮説とは、現実の世界で、予測という手段を利用して検証されるもの

「ハリネズミと狐」

  • アイザイア・バーリンがトルストイについて書いたエッセイ
  • 古代ギリシャの詩人アルキロコスの一節
  • 「キツネはたくさんの小さなことを知っているが、ハリネズミは大きなことを1つ知っている」
ハリネズミの考え方 キツネの考え方
専門的 1つか2つの大きな問題を専門とすることが多い。分野外からの意見は疑う。 総合的 もともとの政治的立場にとらわれることなく、さまざまな分野に取り組む。
硬直的 全部をひっくるめたアプローチにこだわる。新しいデータは元のモデルを補強するために使う。 柔軟 最初のアプローチが機能するかどうかわからなければ、新しい方法を見つけたり、同時に複数の方法を試したりする。
頑固 間違いは運が悪かったと考えるか、特別な環境のせいにする。優れたモデルにも、ついていない日はある。 自己批判的 (うれしくはないが)すすんで自分の予測の間違いを認め、非難を受け入れる。
秩序を求める ノイズのなかからシグナルを発見できれば、世界を支配するきわめて単純な原則を見つけることができると思っている。 複雑さを受け入れる 世界を複雑なものとして見ており、多くの基本的な問題は解決不能、あるいは本質的に予測不能だと思っている。
自信がある あいまいな予測をすることはなく、意見を変えることをよしとしない。 用心深い 確率的な言葉で予測を表現し、断定を避ける。
イデオロギー的 より壮大な理論や闘争により、日々の多くの問題が解決されると思っている。 経験的 理論より経験を重視する。
ハリネズミは予測が下手 キツネは予測が上手

ハリネズミ

  • 大きな考えを信じている人たち
  • 自然界の法則であるかのように機能する
  • 社会の全ての相互交流を実質的に支える基本原則があると信じている
  • カール・マルクスと階級闘争、フロイトと無意識、
  • マルコム・グラッドウェルと「ティッピング・ポイント」
  • 大物を狙う狩猟者
  • 自分の関心と分析を区別することが苦手
  • 事実と価値観が一緒になった曖昧模糊な融合物を作り上げる
  • 証拠には偏見を持って臨む
  • そこにあるものではなく、見たいと思うものを見る
  • たくさんの情報から物語を作る(現実よりわかりやすい、主役と悪役、勝者と敗者、クライマックスと結末)
  • 証拠を批判的に検討することができなくなる

キツネ

  • 原則をもたない生き物
  • たくさんの小さな考えを信じており、問題に向けて様々なアプローチを試みる
  • 微妙な差異や不確実性、複雑性、異なる意見に寛容
  • 採集者
  • 理想と現実を分けて考えることができる

ハリネズミかキツネかは、接する情報が増えたときに、予測の正答率が上がるか下がるかで判断できる。役に立たない情報は無視すればいい、ハリネズミはそれができない、自ら茨の道に迷い込む。

確率論的に考える。結果を幅をもって示す、現実世界における不確実性を正直に表現する。

  • 今日の予測は残りの人生で最初の予測である
  • その時点その時点でベストの予測をする
  • 昨日の予測が間違っていたと考える理由があるならば、それにしがみつく理由はない
  • 制限のある情報を最大限に利用するためには、新しく有用な情報が利用可能になった時点で予測を更新する必要がある
  • 恥を掻くのを恐れて予測を変更しない=勇気のなさを示す

コンセンサスを探す

  • 自分の予測がほかと大きく違っていないか注意を払う(周りを気にして順応するのとは違う)
  • いつでも集合知が素晴らしいわけではないが(集合愚もある)1つの問題を複数の視点から見ることが有利に働く

キツネは

ハリネズミが集まって行うようなことを、自らの頭の中でやってしまう

  • コンセンサスに至るプロセスを自ら実行する能力を持っている
  • 専門家に訊かずに自分自身に問いかける
  • 1つの情報に捉われすぎることなく、いくつもの情報に目配りする(いろいろな考えを持つ人々の集団なら自然におこなうことだ)。さもなければ高い代償を払うことになる
  • 人間の判断に限界があることを理解している
  • 限界を知ることは、よりよい予測につながる

予測を導き出すのは人間の判断、人間の判断があるところにバイアスあり

  • 自分の仮定が予測にどのような影響を与えるかを常に自問しないと
  • ノイズの多いデータから整然とした物語を編みだそうとするので客観的であろうとするのは大変だ

トーマス・ベイズ

  • 偶然論における問題解決のための小論 1763 by リチャード・プライス
  • 未知のデータを前にした時、私たちは世界に対する確率的な信念をどのように形成するか
  • 証拠を集めれば集めるほど真実に近づいていく、数学的哲学的に表現された、世界を学ぶ方法

ピエール・シモン・ラプラス

  • 自然の完璧さと、人間の理解の不完全性を区別
  • 知識と、無知との中間に位置するのが確率

フィッシャーたち

  • ベイズの定理の公式そのものは問題にしていない
  • 実験する前にどうなるか見積もるなんてあまりにも主観的、科学の客観性という考えに反するのでは?
  • バイアスの入る余地のない統計的モデルの構築を目指す

頻度主義

  • 不確実性という統計の問題は、母集団全体を扱わずに標本データだけを頼りにすることから生じる
  • 頻度主義で説明できる唯一のエラーである標本誤差は、誤差全体の一部でしかない
  • バイアスのかかった調査をやるのであればどれだけやっても意味がない、そもそも的外れなのだから
  • 予測がうまくいかない理由であるヒューマンエラーに背を向けている
  • 不確実性は、世界を理解する人間の能力に付随するものではなく、実験に付随するものと捉えている
  • データを集めれば集めるほど間違いは減り、ゼロに近づくはずだ
  • フィッシャー晩年にはベイズを称賛するようなことも言っている
    • ベイズ理論と頻度主義アプローチの折衷方法論も考えてたらしい
    • 十分なデータを集めれば全ての仮説を検証することができ、完璧な結論に達することができるという考え

信念に完璧な客観性、合理性、正確性を持たせることは不可能

  • けれども、主観性、非合理性、そして間違いを少しでも減らす努力はできる
  • 自分の信念に基づいて予測をすることをは、自分自身を試す一番の、そして恐らくは唯一の方法である

情報は少ないより多い方がいい、ただし品質が管理されているものでなければならない

  • 道具はきちんと扱えるようにしておく、
  • 一流の技術を持っているに越したことはないが、持っている技術を使いこなすことの方が大切だ
  • 正確性には注意しなければならない
  • 客観的な事実を重視すべきだ
  • 誰かを喜ばせる予測や都合のいい予測ばかりをしようとしてはならない

人間は、不確実な世界に住む、不完全な生き物だ

  • 予測が大きく外れたとしても、それが自分の責任なのか、
  • つまりモデルに欠陥があったのか、それともただ不運だったのかは完全にはわからない
  • 解決先は、ノイズとシグナルがこの世界から亡くならないことを認識し、あるがままに評価するように努めることだ
  • (私たちの判断は誤るものだ、誤りは避けられない、完璧な予測とはありえない、0%と100%を取ることはない、限りなく0%に近い、100%に近いというだけ)

健全な懐疑心

3種類の懐疑論

  1. 経済的なインセンティブを持っていやしないか
  2. 自立心が称賛されるアメリカでは顕著=反対主義、どのような議論においても、大勢の側につくことに利益を見出す人がいる一方で、迫害されるアウトサイダーとしての立場に身を置こうとする人
  3. 科学的な懐疑心

予測の不確実性は、行動を起こさない理由にはならない

  • 不確実性があるからこそ行動しなくてはならない
  • 多くの人がデータに基づいた話をしているかのようなふりをするけれど、データを確認している人なんていない。断言できるよ
  • ドラマチックに語れば語るほど、新聞に引用される確率は高まる
  • 確率論的に表現しているものを探す
  • 複雑な現象について自信たっぷりに予測を発表している人
    • 問題を慎重に検討していない
    • 過剰適合している統計モデルを使用している
    • 真実を追求するより名前をなすことに関心がある

シグナルとノイズ

  • シグナル:統計や予測の問題の裏にある真実を示唆する
  • ノイズ:ランダムなパターンを持ち、シグナルと間違ってしまうもの

ロベルタ・ウォールステッター

  • 馴染みのないことと、起こりそうもないことを取り違える
  • 真剣に考えたことのない偶発的な事例は奇妙に見える
  • 奇妙に見えることは起こりそうもないと思う
  • 起こりそうもないことは真剣に考える必要はない

アメリカはほとんど攻撃されたことがない

  • ハワイはアメリカの一部だ
  • ハワイが攻撃されることはないだろう

ラムズフェルド2002記者会見。イラクの大量破壊兵器の存在についての質問への回答の一部

  • 未知の未知
  • 既知の未知
  • 既知の既知

未知の未知=考えたこともない偶発的な出来事

  • ある種の心の壁を作ってしまう
  • 想像できるほどの経験もない
  • そもそも存在しないかのように感じてしまう

911委員会報告

  • シグナルの重要性を見抜けなかった原因
  • 政策の失敗、能力の欠如、管理の失敗、(最も重要なもの)想像力の欠如

ベイズの定理を使って確率を考える方法

  • 不確実な要素が多い中で意思決定をする時に役立つ
  • 一度にたくさんの仮説を持ち、確率論的に考え、新しい情報に接するたびに更新する

情報アナリストは間違った時には責められる

  • うまくやった時にはほとんど気づいてもらえない

予測には、好奇心と懐疑心のバランスが大切、両者は共存できる

  • 自分の理論を詳細に調べれば調べるほど、世界が不確実であることを受け入れられるようになる
  • 完璧な予測など不可能だということがわかる
  • 予測が外れることに対する心配が減る
  • もっと自由に考えることができるようになる
  • 知らないことを知ることで(未知の未知を既知の未知に変えることで)、予測の精度を上げることができる

知っていることと、知っていると思っていることの溝

  • (予測のばらつきが小さいことを、的中率が高いと見誤るなど)を埋めるための戦略
  • 大きくジャンプし、その後小さなステップを重ねる
  • 最初のジャンプ=ベイズ的に予測と確率を考えること

予測は目的であると同時に手段である

  • 予測は仮説の検証において、つまり全ての科学において中心的な役割を担う

よいモデルは、たとえ予測が当たらなくても役に立つ

  • どんな予測もたいてい間違うことがわかる
  • なぜ間違うのか理解しようとする
  • そして間違った時にどうするのか、間違った時のコストを最小にするにはどうすればいいかを考える

ドレイクの方程式だって、不確実性が大きすぎて、一種の思考実験のようなものだし、生産的な結果を出せるようになるのはずっと先なんだろうけども、問題の範囲を理解するのに役立つことは間違いない。

世の中を推定するためのツールは統計モデルだけではない

  • 言語もモデルの一形態
  • 互いに伝え合うために使うある種の推定
  • 全ての言語はそれぞれ異なる言葉から成り立っている
  • 同じ世界を表現しようとしても使われる言葉は違う
  • コンピュータ言語もそうだよね

モデルは世界の複雑さを理解するためのツール

  • 世界そのものの代用品にはならない

MIT神経科学者トマソ・ポッジオ

  • 人間はほかの動物よりも、パターンを見つけ出す必要に迫られている
  • パターン認識は進化で習得、個人の力によるものではない
  • ただし、ランダムなノイズの中にパターンを見出してしまう
  • 脳での情報処理は推定作業の連続のようなもの

世界に対する主観的な認識=真実を「推定」したもの

  • 推定の程度は問題ではない
  • 問題なのは、推定を現実だと思い込むこと

シグナルとノイズを区別するためには?

自己認識が必要

  • 予測できないものを受け入れる冷静さ
  • 予測できるものを予測する勇気
  • その違いを見分ける知恵



解説:西内啓

情報の出所だけでなく、予測をおこなう(あるいはデータを眺める)者自身がどのようなバイアスを持っているのか意識する(常にその人の主観が反映される、とも表現できる)

ニュートン

「物体は力が働かない限り同じ向き、速度で運動し続けるものとする」という前提から、世界の全ての物の動きを説明、予測できるようになった

経済学も同様。人間一人ひとりの選択や満足度に関する前提から、世界の中でお金や物がどう動くのかを理解する学問

19世紀に発達した多くの学問

こうした演繹的な考え方と、シンプルな前提、法則性から世界の全てを解き明かしたいという野心に支えられていたのでは?

物理学、経済学は数学的にその法則性を記述していた

  • カール・マルクスの唯物史観
    • 人類の歴史とはすなわち生産手段の発展によって説明される、というシンプルな法則から人類の行く末を予測しようとしていた
  • りんごの落下速度から星の軌跡に至るまで、シンプルな法則ですべてを予測可能にしたという、あまりにまばゆい古典物理学という成功事例があったから

フィッシャー:制御しやすい

  • どのように肥料をやれば農作物の収穫量が増えるか
  • 人間の手でコントロールしやすい領域から生まれた
  • 将来の予測よりも、予測を覆す、今を変えるアクションに強い関心を持つ
  • 「洞察」のためのモデル

計量経済学(経済学における統計解析手法の応用)

  • ジェヴォンズ以降も、景気循環や株価のようにマクロで人間の制御が難しいものの予測に利用されることが多かった
  • 当時はデータの収集コストおよび集計コストがいまよりはるかに莫大
  • 分析して意味のありそうなまとまりのあるデータはマクロデータが主とならざるをえなかった?
  • 「予測」のためのモデル

「洞察」か「予測」か

  • 医学で性別や年代、喫煙や運動などの生活習慣といった項目と死亡の関係性を統計モデルで明らかにしたとする
  • ある人の属性や生活習慣といった情報を用いて「何歳で死亡するか」予測をおこなうことはできる
  • が仮にその予測が何歳かズレていたとしても大きな問題とは考えない
  • それよりも、寿命を縮めるような生活習慣を適切に発見しその改善を通して健康増進のチャンスが見つかったことの方が重要視される

フィッシャー農場のように人間の手でコントロールしやすい要素がモデルに多く含まれている

  • だから、(再掲)将来の予測よりも、予測を覆す、今を変えるアクションに強い関心を持つ

こんな場合は「洞察」のためのモデルが重要

  • どの顧客に重点を置いて広告を出稿すればいいか
  • 従業員の生産性を上げるための方法を知りたい
  • 広告や従業員をコントロールするやり方の発見に重きが置かれる

こんな場合は「予測」のためのモデルが重要

  • 出荷タイミング予測して在庫コストを最適化したい
  • 調達する材料価格の変動を予測してリスクヘッジしたい

本書で紹介される多くのノイズの話は、

  • 「洞察」のためのモデルにも関係してくる
  • 「予測」のためのモデルにおいては多くの場合観察データのみによる予測しかおこなえない、がためにノイズが問題になる
  • だから確率的思考が有効になる

ロジャー・ベーコン 科学の方法を実験と観察に大別

  • 経済マクロ指標、天候、災害、テロリズムの多くは観察によるデータ収集しか許されない
  • 人間の手によってなんらかの条件を変えた場合、どのような変化が起こるか検証が許されない
  • 予測のためのモデルを作るために、実験環境を作るのが無理、人為的介入がそもそもできない、倫理的に許されない

医学、農学、工学など、実験、なかでもRCTができるというのはとても有利

  • ノイズの多くは回避できる
  • がために予測のためのモデルに関心が向きにくい
  • 洞察のためのモデル、現世利益な思考になりがち、広告運用もそうだな

近年の経済学 個人レベルの行動や選択についてはRCTによる実証研究がさかん

  • マクロな政策効果の実証などにおいても、たまたま先行してある政策を実施していた州、
  • そうでない隣の州の間にどんな変化が見られたのか、
  • 自然実験という名でおこなわれている
  • 偶然できあがった観察調査みたいなものである

出社が楽しい経済学

出社が楽しい経済学

吉本 佳生

サンクコスト

sunk cost 埋没費用

  • すでに投資してしまい回収できない費用
  • サンクコストに縛られて合理的な判断がしにくくなる
  • さらなる損失を招くこともある

回収できないコストは忘れる。食べ放題のお店に入ったら、支払った額はもうサンクコスト、元を取ろうと食べすぎない

機会費用

1時間の仕事価値が高い人は、安いが時間かかる電車よりも、高いが速く着くタクシー移動で時間節約した方が合理的

お金以外のコストも考える。年収1,000万円から800万円に転職しても、満足度が200万円以上あるなら機会費用的には転職は成功(問題はお金以外のコストの金額換算は難しい=機会費用を正確に算出するのは難しい)

経済効果の試算はプラス面の単純集計であることが多い。機会費用の考えは入ってないので、マイナス面の想像もしてみる

他人の機会費用も考える。非同期で繋がることのよさは、他人の機会費用への配慮でもある

比較優位

  • 誰でも必ずなんらかの比較優位を持つ
  • 同じ場所にずっといると自分では気づきにくそう
    • ジョーダンの比較優位がバスケットにあったことは、野球の世界に行ってみないと見えなかったのかも
  • 比較優位は場所(周りとの関係性、周りの変化)や時間で変化する

インセンティブ

  • デポジット制度 広報や監視に莫大なコストをかけるよりも、低コストで強い効果を生む
  • 知的財産権 将来の利益を保護することを約束することで強いインセンティブを与えて努力してもらうためのインセンティブ
  • インセンティブの歪み 低所得者でもアパート借りれるようにと政府が家賃値上げを規制したところ、大家さんには建物の価値を高めて住みやすいアパートにしようというインセンティブが働かなくなり、低所得者層が住むアパートの環境は悪化、住環境は以前よりも悪化

モラルハザード

倫理観の欠如というよりは、何らかの契約をした後で、依頼人が観察できないところで、依頼された側(代理人)がとる行動が依頼人に不利益をもたらす構造上の問題

  • 自動車保険とドライバーの運転態度
    • ドライバー側が、事故を起こしても保険でなんとかなるからと安全運転を心がけなくなる恐れ。
    • 保険会社側が、お客にわからないところで過小査定する恐れ
  • 偽装問題
    • ブランドをありがたすぎて、品質を見抜く仕組みを持たない、見抜く研鑽を積んでこなかった結果である。
    • 偽装した側だけに原因があるわけでもない

逆選択

高品質と低品質が混在した市場が放置されてると、高品質は市場から消え、低品質ばかりになる。

品質が隠れた情報になってしまっているため、購入予定者は安きに流れる、高品質(≒高価格)は売れなくなる。投資詐欺、出会い系サイトなど。

逆選択を防ぐにはシグナリング。重要な情報を握っている、情報面で優位な側の方が、(品質についての)隠れた情報を発信する。学歴シグナル、人気店の行列、建物の立派さ、購入後保証など。

スクリーニング(←→シグナリング)。情報を握っていない側が、なんらかの努力をして相手から情報を引き出そうとすること。

価格差別

高くても買いそうな人には高く売り、安くないと買わない相手には安く売る。どの群に属するかを見分ける必要がある(スクリーニング)。

  • 価格弾力性が小さい群
    • 所得水準が高めで時間に余裕がないから、少々価格が高くても買ってくれる。
    • 値上げしても需要量はさほど減らなさそう
  • 価格弾力性が大きい群
    • 所得水準が低めで時間に余裕がある、節約志向が強い、ちょっとの値上げにも反応しやすい。
    • 少し値下げすると大幅に需要量を増やしてくれそう
  • 自己選択型の価格差別
    • ちっぽけで保管が面倒なクーポン券。
    • 複雑な料金プラン、発売からの経過年月で価格が変動する。
    • 期間限定のバーゲンセール。
    • 重要なことは小さめに、わかりやすいことは大きく書いた広告。

裁定

  • 同じ時点に異なる市場で価格差があるときに安く買って高く売る取引
    • 投機異なる時点の価格差を利用する取引
  • 裁定が働くと一物一価に
    • 市場を統合する
    • 似たような機能・性質をもち、代替性が高い商品やサービスの間でも働く
      • 石油価格とトウモロコシ(バイオエタノール)価格の連動性
      • 新幹線と飛行機
  • 取引コストが裁定を阻む
    • 取引コストがあるから電気街ができる
    • ITの進化は取引コストを下げた→裁定が働きやすくなった
  1. 幕末日本では金と銀の交換比率が1:5 海外は1:15
  2. 鎖国解禁により外国商人が日本に銀を持ち込んで金に交換、国内の金が大量に海外流出(裁定が起きた)
  3. 国内は銀余り。通貨としての銀の価値が暴落。インフレ発生

囚人のジレンマ

正直者はバカを見る。繰り返しの囚人のジレンマ

  1. 他店よりも安くします宣言=しっぺ返しの宣言
  2. 値下げには値下げで対抗するけど自分からは値下げしない
  3. 相手の値下げ牽制、協調を引き出す(暗黙の共謀)
  • しっぺ返し戦略で最初は協調を選ぶ
  • 2回目以降は前回相手が選択したのと同じ選択をする
  • 拘束力、協定がないと、約束しても結局裏切り合う
  • 当事者が多いと協定が結びにくく、囚人のジレンマから抜け出しにくい
  • 適度な緊張感を持った長期の付き合いが問題を解決する

共有地の悲劇

フリーライダーが発生する。全体の調整役がいない場合どうするか

割引全体価値

  • 金利が年10%の場合、現時点では909万円預ければ1年で91万円金利がつくので、1年後に1,000万円になる
  • 1年後の1,000万円の割引現在価値は909万円である

将来の金額と現在の金額を比較する場合、将来の金額から金利分を割り引いて、現時点での評価に揃える必要がある

ネットワーク外部性

利用者が増えるとネットワークの利便性が高まる

ネットワーク外部性が強いネットワークは、

  • 急激に拡大するか(人気者はますます人気者に)、
  • 拡大できずに衰退する(カラーファックスの低迷)かの両極端な結果になりやすい

グラハム・ベル

  • 音声学を研究、モールス信号に音をのせる電話機の開発
  • 当初はおもちゃだと思われて広がらなかった、電話機をリースで貸すことで加入者を増やす、通信網が広がる、便利さが増す、加入者がさらに増加する、全米を覆う通信網のできあがり

----

出社が楽しい経済学2

吉本 佳生

ロックイン

  • いろいろな選択ができるはずなのに、入る店などが固定してしまうこと
  • いつも同じブランドの商品ばかり買う
  • いつも同じ相手を指名してサービスを受ける

偶然選んだお店にロックインしてしまう=他の選択に変更しようとすると、スイッチングコスト(乗り換え費用)が余計にかかる

経済現象を考えるときには、お金の支出の形でのコストだけでなく、努力や時間といったコストも重要

ロックイン戦略=顧客の囲い込み作戦

  • クーポン券、試食品、試供品、新装開店記念の半額券、ポイントカード
  • 貯めたポイントが無駄になる=スイッチングコストを高める、ロックインを生じやすくする
  • これをサンクコスト的に捉えられるかどうか

コンセントの規格のように、社会的な制度や国民全体のライフスタイルなどで一度ロックインが起きると、それを変革するのは極めて困難

  • ミクロ経済学 個々の企業や消費者に注目して分析する
  • ゲーム理論 企業や個人、国家などが繰り広げる様々な駆け引きを分析する
⚠️ warn
  • ふだんおこなってる買い物は、売り手(企業)と買い手(お客)の間の駆け引きの場。
  • 知らないうちに企業との頭脳ゲームに参加させられている。
  • 企業はライバル企業よりは与しやすい消費者との間で駆け引きをしがち。
  • 賢い生活者(消費者)になるには、買い物の背後に様々な駆け引きが潜んでいると認識すること

コミットメント

  • 意図的に選択肢を限定する
  • 約束を信じてもらえないと意味がない
  • 日頃のおこないで一定の規律を守っている(ように見える)ことが駆け引きの有利さにつながる
  • 有利さを手に入れる手段の一つがコミットメント

ホールドアップ問題

  • 自らにとって不利な選択を余儀なくされたりする問題
  • コミットメントで自分を縛ったために陥る
  • ロックインしすぎても生じる
  • 最初の時点で長期の契約を結ぶなどして回避可能
  • 特殊すぎるやり方、社内限定スキルなどもホールドアップにつながりやすい

ヴェブレン効果

  • ヴェブレン効果
    • 見せびらかすための消費(見栄のための消費)、顕示的消費の場合、価格が高いほど満足度も高くなる現象。
    • ワインなど。高級感があった方がいい
  • スノッブ効果
    • 他人があまり持ってないものを持つことが満足感を高める。同じものに対する他人の消費量が少ないほど、自分の満足度が上がる
    • アンティークなど。希少感があった方がいい
  • バンドワゴン効果
    • 同じものに対する他人の消費量が多いほど、自分の満足度が上がる
    • 平成のルーズソックスなど。流行・ブームには乗っかりたくなる

プレミアム商品

  1. 発売当初は物珍しくてスノッブ効果が生まれる
  2. 価格が高いことからヴェブレン効果も生まれる
  3. 購入者が増えるとスノッブ効果は薄まる
  4. 今度は人気だから欲しくなるバンドワゴン効果が生まれる
✅ info

現代は、他の消費者との間で、高級感を競い、希少性を競い、流行への敏感さを競いながら様々な消費活動をおこなっている(消費の外部性: モノやサービスに対する他人の消費量が、自分の満足感に影響する)

  • 議題設定効果 人々の注目を一つの話題に集めてしまう効果。他の話題が良くも悪くも目立たなくなる。
  • アナウンスメント効果 選挙期間中の優劣報道など。言われた方と逆に行動する、すると予測が外れる。

基本的な経済学

  • 個人も企業も極めて合理的に行動するはず
  • 個人は最大限の満足を追求し、企業は最大限の利益を追求する、その行動にムダがないはず
  • 価格は消費者の満足に直接影響を与えたりしない、と想定している。

需要曲線では価格が上がれば消費量は減る(はず)。ところがヴェブレン効果が生じるとそうならない

心の会計

同じお金でも、人は心の中で色をつけてしまいがち

ハウスマネー効果

  • ギャンブルで得たお金は、汗水垂らして稼いだ給料とは違って浪費しがち
  • 同じお金であることに違いはないし、色をつけるのは非合理なのに

単なる2,000円引きよりも、一旦支払った後に2,000円キャッシュバックされると得をしたように感じる。ハウスマネー効果につながりがち

行動経済学

ときにムダなことをして満足や利益を減らしてしまう、この非合理性に心理学などの視点から光を当て、非合理的な行動に規則性を見つけ、非合理の根拠を論理的に説明する

  • プロスペクト理論
    • 損することを恐れがち。損失回避性
    • 現状維持バイアス
    • 保有効果 いったん保有したものには、その価値を高めに評価してしまい、手放して損することを嫌がる
  • アンカリング効果 無関係な数字でも、最初に印象に残った数字が後の判断に影響を及ぼす(割引セールの割引額に心動かされる)
    • 他人の判断に、自分の判断が影響される。
    • 自分の中だけでもある(無関係な数字が影響したりとか)
  • 確実性効果 ゼロや100%といった極端な数値に、過大な評価を寄せる心理。元本保証を極端にありがたがる
  • ピーク・エンドの法則 一連の体験から得られる満足感は、ピーク時と終了時の満足感だけでほぼ決まる(ピーク時や終わりの印象で、全体の印象を決めてしまう)
  • 決定麻痺 選択肢が多すぎると決めかねてしまう(シーナ・アイエンガー)

スクリーニング

相手の情報が十分にない(情報の非対称性が生じている)とき、こちらから何らかの仕掛けを用意し、それに対する相手の反応を利用して、相手から情報を引き出す。ふるいにかける、一見さんお断り。

  • 好きな相手に少し無理なお願いをして気持ちを確かめる
  • 従業員割引、エントリーシート
  • 年功序列型の賃金体系:離職しにくい人を集めやすい
  • 業績給・成果主義型の賃金体系:能力に自信がある人を集めやすい
  • ちっぽけなクーポン券(自己選択型の価格差別)

勝者の呪い

オークションの勝者になったが故に味わう後悔。勝って手に入れたモノの価値が、自分が支払った金額(落札価格)よりも低いと気がついて後悔する現象

ウィリアム・ヴィックリー

  • セカンドプライスオークションを考案
  • 勝者になった買い手が後悔しなくて済むようにすることで、買い手が正直に行動するように仕向ける、という情報を引き出す工夫
  • 自動入札機能も同様
  1. 公開オークション イングリッシュオークション。安い価格から始めて、どんどん価格を上げていく
  2. ダッチオークション 高い価格から始めて、どんどん価格を下げていく。入札=落札なのでイングリッシュオークションよりもサクサク終わる
  3. 封印オークション 公共工事の入札など。参加者が他の入札者の価格を知らない状態で一度だけ希望価格を入札。

レントシーキング

  • レント みんなが求めても供給量が増えない何かが生み出す報酬や、供給量が一定の、何かにつけられた価格
  • レントシーキング なのにレントを求める奪い合いや、既得権益なレントを維持しようとする活動
  1. 禁酒法がレントを生み、ギャング発生・抗争になり、独占を生む
  2. 禁酒法を廃止したらレントが消えた

レントシーキングを防ぐには

  • 規制をやめてレントをなくす
  • 権限放棄する(レントシーキングがムダだと知らしめる、給与決定権が直属上司にない、ルールですのでの一点張りなど)
  • レントを意識させない(社員の給与を明らかにしない、全員一律にする)
    • 昇進を一律年齢で決める、レントシーキング防げる、有能でなくとも昇進する
    • 上司が無能と嘆く羽目になるのは、レントシーキング防止制度の副作用かも?

規模の経済性

生産規模が大きくなるほど、製品1個あたりの生産費用(平均費用)が安くなる

範囲の経済性 異なる複数のビジネスを組み合わせることでコスト(平均費用)が安くなる


ギリシャ文字一覧と日本語のローマ字表記の推奨形式

大文字 小文字 読み 大文字 小文字 読み 大文字 小文字 読み
A α alpha I ι iota P ρ rho
B β beta K κ kappa Σ σ sigma
Γ γ gamma Λ λ lambda T τ tau
Δ δ delta M μ mu Y υ upsilon
E ε epsilon N ν nu Φ φ phi
Z ζ zeta Ξ ξ xi X χ chi
H η eta O o omicron Ψ ψ psi
Θ θ theta Π π pi Ω ω omega



日本語のローマ字表記の推奨形式

日本語のローマ字表記の推奨形式 http://park.itc.u-tokyo.ac.jp/eigo/UT-Komaba-Nihongo-no-romaji-hyoki-v1.pdf

ā ī ū ē ō


6つの帽子思考法

⬜️白い帽子を被る。白い帽子を被ったら、状況を分析的に見るように心がける。感情ではなく、純粋な事実に基づいて、論理的に観察する。科学者や医者が着る白衣をイメージするといいね。白い帽子はとても論理的


🟥赤い帽子を被る。すると、あなたはこの状況を感情的に見るようになる。赤い帽子を被ると、あなたは感情的になる。この状況をあなたはどう感じているか? さまざまな選択肢に関して、あなたはどう感じるか? 赤は感情の帽子だ。ハートの赤をイメージ


🟨黄色い帽子を被って、状況を観察する。黄色は楽観主義者の帽子だ。目の前の問題や選択肢をながめて、最善のシナリオは何と想像する。この状況から生まれるすべてのメリットを考えてみる。黄色い帽子が楽観主義者の帽子であることを思い出すために、黄色い太陽や太陽が与える温かさ、ポジティブさをイメージ


⬛️黒い帽子を被って欲しい。黒い帽子は裁判官であり批評家だ。状況を批判的に見る。慎重になるべき理由や、うまくいかない可能性を批判的に考える。裁判官の黒いローブをイメージ


🟩緑の帽子をかぶる。緑は成長の帽子だ。問題を見つめるとき、新しい機会について考えてほしい。型にはまらず、想像力を働かせて、あらゆる可能性を考える。緑の植物が成長し花を咲かせるように、緑の帽子を被ったときは、新しい可能性について考える


🟦青の帽子だ。これはマネージャーの帽子だ。他の帽子からの視点をすべてまとめたうえで、最終決断を下す。青空をイメージするといいかもしれない。青空が私たちを見下ろして、すべてを聞いているように、青い帽子をかぶったときはすべての視点をまとめたうえで、決断を下す



「6つの帽子思考法」のメリットは、自分の考えから抜け出せることにある。


というのも、たいていの人にとって、特定の思考が他より優勢だからだ。あなたは白い帽子のように、常に科学的な情報に基づいて物事を論理的に見るタイプの人間かもしれないし、赤い帽子のように感情を通して物事を見る傾向が強いかもしれない。黒い帽子のようになんでも批判的に見て、欠点を見つけるタイプかもしれないし、緑の帽子のように型にはまらない考え方ばかりする人かもしれない。


「6つの帽子思考法」は、他の視点から物事をみつめるきっかけを与えてくれる。その結果、より良い決断を下すことができる。


Speech by Jim Kwik


https://courrier.jp/columns/293661/


2022年10月10日月曜日

ベイズ推定



ベイズ推定をweb上で簡単に実行できるサービス

以下はいずれもJavaScriptのみで動作する、webブラウザ上のみで実行できる、どこかにデータを送信したりはしていない

2群の平均の差



2群の比率の差

Bayesian Estimation for the Difference of Proportions

  • 無情報事前分布を使っていて、事後分布が単峰なので、ベイズ推定の結果は、検定とほぼ同じになる
  • 帰無仮説のような考え方に立っていないので偽陽性の心配はしなくていい
    • なので多重比較における補正は必要ない
  • ただしあくまで自身が仮定したモデルの中での推定値である、現実世界とモデルが一致しているわけではない、よってベイズ推定だからスゴい!ベイズ推定はエライ!というわけではない
  • ベイズ推定でも、検定でも、好きな方法でやってよい、そしてどちらの方法も真の値(現実世界)がズバリわかるわけではない、どちらの方法も間違っているという意識を忘れない


結果がほぼ同じと確認するための検定サイト



2020年12月5日土曜日

Apple Silicon MacBook Air

MacBook Air2013からApple Silicon MacBook Airのときにやったこと

移行アシスタントでやるとすぐに同じ状態で使えるのはいいんだが、要らなそうなファイルも持ってきてしまう。きれいさっぱりな状態にしたかったのでひとまず
  1. まっさらな状態で環境設定
  2. ファイル共有で必要なファイルだけコピペ
  3. 隠しファイルの表示はcommand+shift+.(dot)

ミュージック

  1. ミュージック(iTunes)は、iTunesのメニューで「ファイル」->「ライブラリ」->「ライブラリを整理」を選択して、「ファイルを統合」を実施
  2. 「ミュージック」内「iTunes」ディレクトリ配下に必要なファイルが作成される
  3. この「iTunes」ディレクトリを丸ごと、新Macの「ミュージック」へコピー
  4. 新MacでiTunesを「option」を押しながら起動すると、ライブラリを選択できるようになる
  5. 「ライブラリを選択」から「iTunes」内の「iTunes Library.itl」を選択すれば、移行完了

    写真

      1. 写真は、「ピクチャ」内に「写真 Library」があり、これを旧Macから新Macの同じ場所にコピぺ
      2. 新Macで「option」を押しながら「写真」を起動して、今コピーしてきたライブラリを選択して読み込む


      Podcast

        1. podcastで、かつでCDから取り込んだものがあって、これがpodcastでは見た目では存在するがファイルが見つからないと言われる
        2. podcastのファイルは、ユーザ/名前/ ライブラリ / Group Containers / 243LU875E5.groups.com.apple.podcastsのキャッシュフォルダーに保存されている
        3. これを同じ箇所にコピペすればいいかと思ったが状況変わらず
        4. そこで「ブック」の「ライブラリに追加」でオーディオブックとして使っていくことにする

        読めばわかるMACでのPATH設定を完全理解
        https://reffect.co.jp/windows/full_understanding_mac

        M1 Mac
        https://oku.edu.mie-u.ac.jp/~okumura/macosx/m1.html

        M1 Macの開発環境
        https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7


         


        あと、まっさらなosのまっさらなmacを手に入れたら、まずはosアップデートしておくことが大事だと学ぶ。



        参考文献


        旧Macから新Macへ「移行アシスタント」なしで移行
        https://rikei-fufu.com/2019/10/27/post-2187-mac-migration/


        macOS Catalinaでは、iTunesの分割によりメディアファイルの扱いに変更が
        https://minatokobe.com/wp/os-x/macos-catalina/post-57359.html


        Apple SiliconにおけるHomebrewのベストプラクティス
        https://qiita.com/yujiod/items/56002a7cef5b5a3be3fb


        macOS 11 Big Sur compatibility on Apple Silicon #7857
        https://github.com/Homebrew/brew/issues/7857


        Homebrew
        https://brew.sh/index_ja

        HomebrewでいれたPythonの削除
        https://qiita.com/baozam/items/268906b5984a37239b7d



        Apple M1 チップ搭載の Mac で macOS を再インストール中にパーソナライズエラーが表示される場合
        https://support.apple.com/ja-jp/HT211983

        Appleシリコンを搭載したMacでmacOS復旧を使用する
        https://support.apple.com/ja-jp/guide/mac-help/mchl82829c17/mac




        Homebrew&Python 立て直し

        現状課題

        • macにもともと入ってるpythonにpipでやってた、これを仮想環境でやりたい
        • x86_64(rosetta)の方でやってた、これをarm64でやりたい


        python環境を作り直す

        1. 今のスで入れてるライブラリをとりあえず削除
        2. pip freeze | grep -v '@' | awk -F'==' '{print $1}' | sudo xargs pip uninstall -y
        3. brewのインストール https://brew.sh/ja/ に行って、コマンドをコピーして、と思ったが
        4. macOSをお使いの場合は新しい.pkgインストーラーをお試し下さい
        5. とのことなので https://github.com/Homebrew/brew/releases/tag/4.4.20 で.pkgを落としてきて実行
        6. ちゃんとbrewがインストールできたかの確認 brew help
        7. unknown or unsupported macOS version: :dunno (MacOSVersionError) と言われる
        8. brew update-reset とするといいらしい、やってみた
        9. brew help やったらいい感じになったらしい
        10. 現在の PATH を確認 $ echo $PATH
        11. PATH のどこかに /opt/homebrew/bin が含まれていればOK
        12. $ which brew 出力が /opt/homebrew/bin/brew になっていれば、正しく PATH が設定されている
        13. xzのインストール $ brew install xz
        14. pyenvとは?Pythonのバージョンを管理してくれるツール
        15. Homebrewコマンドでpyenvをインストールする $ brew install pyenv
        16. pyenvからPythonをインストールする。ここからはpyenvコマンドを使います。まずは、以下のコマンドを入力します。$ pyenv install --list pyenvでインストールできるバージョンが出力されます
        17. $ pyenv install 3.11.0
        18. pyenvのpathを通す(以下を追記した)
        export PYENV_ROOT="$HOME/.pyenv"
          export PATH="$PYENV_ROOT/bin:$PATH"
            eval "$(pyenv init -)"

            などとやってたんだが、pymc5を使いたくて、そしてpymc5はminiforgeがいいよというので、pyenv環境は全部削除して、brewでminiforgeを入れ直すことにした




            1. miniforgeインストール  $ brew install miniforge
            2. condaのバージョン確認 $ conda --version
            3. conda 24.11.3 versionを返してくれればcondaの準備はOKです
            4. $ which conda
            5. /opt/homebrew/bin/conda path追加した方がいいのかな?でも以下は実行できてるしな conda env list
            6. 仮想環境作成しつつ、python本体をインストール(causal impactが3.11じゃないと動かないかもなので)
            7. $ conda create --name pm5_env python=3.11

            /opt/homebrew/Caskroom/miniforge/base
            /opt/homebrew/Caskroom/miniforge/base/envs/pm5_env


            1. $ conda activate pm5_env  としても
            2. CondaError: Run ‘conda init’ before ‘conda activate’ と言われる
            3. https://manabi-corpeng.com/conda-activate-init-error/ をみて、
            4. 元はここ https://manabi-corpeng.com/miniconda-install/#index_id5
            5. $ conda init zsh
            6. として、ターミナル再度立ち上げ直すと
            7. $ conda activate pm5_env できて、
            8. $ python --version
            9. でpython 3.11.11と返ってきた。無事に仮想環境にpython本体のインストール完了

            1. pymc5をインストール https://www.pymc.io/projects/docs/en/latest/installation.html
            2. $ conda install -c conda-forge "pymc>=5"
            3. (arviz, graphviz, lumpy, pandas, scipyなども)
            4. $ conda install -c conda-forge seaborn prophet matplotlib ipykernel ipywidgets
            5. $ conda install -c conda-forge seaborn matplotlib ipykernel ipywidgets
            6. (prophetがないと言われた、statsmodelsも)
            7. できんな $ conda install -c conda-forge prophet
            8. prophet causal impactも入れてな https://facebook.github.io/prophet/docs/installation.html#python

            uname -m
            arm64


            imagemagickインストール

            1. $ brew install imagemagick
            2. python 3.13がインストールされちゃったのを削除する
            3. $ brew uninstall --ignore-dependencies python

            brewの要らなくなったのを削除

            brew cleanup → 古いキャッシュや不要ファイルを削除(推奨)
            brew cleanup --prune=0 → すべて のキャッシュと不要ファイルを削除
            brew autoremove → 依存関係がなくなったパッケージを削除
            rm -rf $(brew --cache) → キャッシュ全削除


            conda clean --all すべてのキャッシュ・不要ファイルを削除(推奨)



            仮想環境のをbaseに適用したい

            仮想環境をアクティベート
            $ conda activate myenv

            インストール済みパッケージをエクスポート
            $ conda list --export > myenv_packages.txt

            base 環境に適用
            $ conda activate base
            $ conda install --file myenv_packages.txt




            不要になった古い環境を削除
            conda remove --name pm5_env --all


            condaで今どんな仮想環境作ってたっけ?
            $ conda info --envs

            $ conda activate pm5
            $ conda deactivate
            $ conda activate base

            base環境をcopyしてそっちにいろいろインストールしたい
            $ conda create --name base_yyyymmdd --clone base

            $ conda install beautifulsoup4 lxml

            見つからない時はconda-forge指定で
            $ conda install -c conda-forge beautifulsoup4



            2020年9月30日水曜日

            Prophet by Python on Mac

            
            # pip3 install pystan
            # pip3 install fbprophet
            
            python3 -m pip install prophet
            python3 -m pip install --upgrade plotly
            


            2020年9月26日土曜日

            マイケル・サンデルの白熱教室2018

            哲学は机上の学問ではない、空想世界のものではない
            市民が暮らす現実社会にこそ必要
            差別はどんなときも正義に反することなのか
            収入や富の格差とどのように向き合えばよいのか
            国境をめぐる問題をどう考えるべきか
            民主主義の力が試されている

            1.移民

            難民の受け入れ、断る権利はあるのか?
            では移民の受け入れ、断る権利はあるのか?
            文化面での影響、経済面
            親の遺産を受け取る権利はあるのか?
            国境の概念は?
            出国を制限する権利はあるのか?
            帰属意識は?以前の国か?今の国か?
            愛国心


            2.AIは最適な恋人を探せるか

            AIは完璧なマッチングができるのかもしれないが我々人間はそれを望んでいるのか
            人間の医師とAI医師のどちらに手術してほしいか
            感情で動くからこそ人間に手術、延命措置してほしいのでは
            自動運転にどうプログラミングするか
            AIはコメディアンになれるか
            死んだ人のデジタルアバターを作ることは?
            冷や汗、心地悪さ、不完全さが人間には必要なのでは?


            3.人を見た目で選んでもいいのか

            どんな場合でも差別は正義に反するのか
            人種差別と見た目による差別は同じか違うか
            特定の人種を優遇的に採用することは許されるか
             あとに続く人への道を開くことにもなるのではないか
            特定の人種にだけ職務質問するのは許されるか
            空港のセキュリティーチェックでの差別は許されるか

            差別を受けると社会に対する信頼が薄れる
            より多くの機会を与え、より多様な社会を作り出す優遇的差別なら許されるのではないか
            アリストテレスのいう正義の定義「人間を平等に同じように扱うこと」
             真の議論は、平等とは何か、同じようなとはどのような点においてなのか、それを決めようとするときに生じる
             その答えは経済的原理によって決められるべきか

            差別に関する議論は簡単だと言われることがある
            なぜならほとんどの人は差別には反対だし、人間は平等に扱われるべきだと考えているからだ
            ところが実際に難しい選択、困難な決断に直面したとき、私たちはそれぞれに問い直すことを迫られる
            そもそも目的とは何か、その目的を達成するために私たちのどんな人間性が問われているのか
            どんなチャンスが広がり、なにが障害や犠牲になるのか
            どんな差別が不当でなにが妥当な差別なのか


            4.ロナウドの年収は高すぎる?

            ロナウドが教師の2000倍稼ぐのは公正なのか
             才能への評価なのか努力への評価なのか
             希望が、問題は社会の不平等にあることを見えなくしている
             社会が評価するのは努力だけではない、才能や素質もではないか
            生まれつきの才能、つまり運がその人の収入を左右するのは正義や公正に反することなのか

            レースの勝者は道徳的にも勝利に値するのか
            実力主義社会は貴族社会よりも公正といえるのか
             偶然、才能を持っていること、偶然、その才能が称賛される社会であること、両方揃ってたからロナウドがいられる


            もしあなたが金持ちだったら実力社会と偶然社会どちらを選ぶか
            金持ちのときは実力社会がいいという、達成感や満足感、誇りを自分に感じたいから
            一方、収入の低い恵まれない立場だったら、実力社会には住みにくさを感じるだろう
            今、社会から取り残されると感じる人々は、社会の不公平さだけに不満があるわけではない
            自分が尊重されていないと感じる
            収入が低く質素な生活を送っているのは努力が足りないからだ、他の人ほど価値がないからだと言われてるように感じる
            社会が実際に不平等であるという状況に加えて、それぞれの人に与えられた地位は本人の努力で決まるという考え方は地位が高くない人々にとってはとても腹ただしく感じる、屈辱的でさえある
            このように実力社会は所得や富の分配からだけでなく、人間の尊厳からも問題となる
            社会はすべての人にそのはたらきに見合った敬意を払えているのか

            古代ギリシャの政治哲学者は、分配的公正(配分の正義)について話し合った
            議論の中心は所得や富についてではなかった、社会的な役割や義務、名誉などについてであった
            その議論は今も続いている
            配分の正義は単に市場が求める価値や公平さだけの問題ではない
            人の名誉や尊厳に関わることでもある
            公正な分配をどうおこなうべきか、現在の民主主義社会の根底にある課題の一つである


            5.プライバシー

            警察は病院のDNAデータベースを利用していいか
            全国民のDNA情報の登録を義務づける制度に賛成するか
            保険会社に自分の情報を提供して値引きを受けるか
            Uberが乗客の情報を公開するのはプライバシーの侵害か
            プライバシーには固有の価値はあるのか、同意があればいいのか
            正しい同意さえあればプライバシーの侵害とは存在しなくなるのか

            エリック・シュミットがプライバシーの問題について質問されたときの答え
            あなたが誰にも知られたくないと思っていることは、そもそもそれをやること自体が間違いだったのではないですか?

            ネットの個人向け広告はプライバシーの侵害か
            自分のプライバシーで最も重要な問題は、見た動画?読んだ本?行った場所?

            古代ギリシャ、ソクラテスの時代、プライバシーが問題になることはなかった
            公の領域と個人の領域が区別されていたから
            公の領域、すなわち民主主義により価値を置き、実践を進めた
            個人の領域だけで生きる人々をイディオティスと呼んだ、これが愚か者イディオットの語源となった
            イディオティスは市民社会への参加を果たしていないと考えられていた
            だから古代の人々にとってプライバシーとは軽蔑の対象だった
            ところが現代では重要な価値を持つ難しい課題となっている

            プライバシーとは何か、なぜ重要なのかを説明するのが難しいのは、それが二次的な役割を担っているから
            公平な社会、自由な社会、民主主義的な社会を求めている、でも誰もプライベートな社会を求めてるとはいわない
            プライバシーはなにかしらの脅威に対抗するための価値をもつものだから
            高圧的で独裁的な国家からの脅威、市民を監視し反乱の芽を摘み取ろうとする国家からの脅威、
            なにかを売りつけようと私たちの動向を常に見続ける企業や調査会社、ソーシャルメディアからの脅威かもしれない
            現代はDNAとビッグデータの時代でもある
            民主的な社会に生きる市民にとって、プライバシーの意味を広く議論し、
            私たちをなにから守るものなのかを考え続けるのが重要

            公正な社会とは何か、平等とは、市民の義務や人間性の価値とは何か
            たとえ全員が同意する結論にたどり着かなくても大切なことを教えてくれる
            それこそ公共性の精神、お互いへの敬意の重要さである

            ときに激しい意見の対立が起きたとしても、公の場で議論を交わすことで民主的な社会に生きる市民としての資質が養われていく



            SARIMA

            東アジア積米国揚コンテナ荷動き予測におけるSARIMAモデルの適用性

            http://www.ide.titech.ac.jp/~hanaoka/finalversion-of-conference.pdf

            3.データの定常性
            ADF検定
            原系列に加えて差分系列を用いた理由は、原系列が非定常である場合、差分系列をとることによりデータが定常になることが多い(9)ため

            原系列 単位根は存在しなかった。差分系列の場合は、t値が-9.368と99%有意水準でも帰無仮説が棄却されない。これにより、差分系列の定常性が確認された。以上の結果を踏まえ、差分系列を用いてSARIMAモデルを開発し、その適用性を検証する

            4.モデル
            4-1モデル概要

            自己回帰項の次数(p)は、自身(荷動き量)の過去の値について、どこまで遡って説明変数として用いるかを示している。例えば、pが2であれば1期及び2期前の荷動き量をモデルの説明変数として考慮することになる

            階差の次数(d)については、分析に利用する時系列データが定常性を有するまでに必要となった階差数を示す。本研究では、3.で述べたように、一階の差分系列が定常性を有しているため、dは1となる。

            なお、原系列が定常性を有している場合は、dは0となる。

            移動平均項の次数(q)については、自身の過去の値の誤差について、どこまで遡って説明変数として用いるかを示している

            なお、本研究では月次データを用いているため、季節変動の期間(s)は12である可能性が高い(10)。このとき、季節自己回帰項の次数、季節階差の次数、季節移動平均項の次数はそれぞれP、D、Q、に入る数値の12倍前の値が説明変数として用いられる。例えばPが2であれば、12期及び24期前の荷動き量を説明変数として考慮する。

            4-2モデルのパラメータ特定
            コレログラム

            図3に差分系列の自己相関係数、図4に同偏自己相関係数

            破線内の領域は、標本の自己相関がゼロであるという検定の95%棄却域である。領域の外側に(偏)自己相関係数がある場合は、(偏)自己相関が少なくとも有意水準95%で存在する。図3を参照すると、12次、24次、36次において特に強い自己相関を有していることが分かる。これは1年周期の季節性が存在していることを示唆しているため、季節階差sは12とするのが適切と考えられる。そこで、本研究では、季節階差sは12とする。また、前節の単位根検定によって、1階の差分系列が定常性を有していることが分かった。そのため、d及びDは1とする。

            次に、p、q、P、Qの特定について検討する。図3及び図4を参照すると、自己相関と偏自己相関ともに3期ラグの相関が比較的高く、4期ラグで初めて自己相関係数、偏自己相関係数ともに95%水準で棄却される。

            SARIMAモデルでは、「おそらく原系列の」
            (偏)自己相関係数のコレログラムを参照するだけではラグ数を決定できない

            しかし、図3、4の「階差系列の」コレログラムを参照することにより、0≦p, q, P, Q≦3としてパラメータの目安を立てることができる(9)。p, q, P, Qについて、0~3を各変数に当てはめ

            最尤法で推定し、AICが最小となるモデルを同定

            5.モデルの診断
            5-1残差の定常性

            同定された「SARIMA」モデルが適切であれば、残差は定常性を持ち、(偏)自己相関を持たないことが分かっている

            同定されたモデルの残差の自己相関係数及び偏自己相関係数のコレログラムを示す。破線の内側の領域は自己相関の値がゼロであるという検定の95%棄却域を示している。つまり、(偏)自己相関係数が破線の内側に留まっていれば、モデルは適切であると判断される。両図より、(偏)自己相関係数は破線の内側にあり、同定されたモデルによる残差が(偏)自己相関を有さないことが確認できる 以上より、残差の定常性という点からモデルの妥当性を確認できた

            5-2実績値と再現値の比較

            (9)沖本竜義:経済・ファイナンスデータの計量時系列分析、朝倉書店、2010
            (10)山澤成康:実践計量経済学入門、日本評論社、2004






            時系列解析入門
            https://www.ai.u-hyogo.ac.jp/~arima/arima.pdf

            定常時系列の解析に使われるARMAモデル・SARIMAモデルとは?
            https://ai-trend.jp/basic-study/time-series-analysis/sarima_model/

            SARIMAモデルでは合計7個の次数があります。 時系列方向のARIMA( p,d,q )に加え季節差分方向のARIMA( P,D,Q )、さらには周期 s があるためです。 これをSARIMA( p,d,q )( P,D,Q )[ s ]と表記することがあります。 それぞれの次数に対し0か1を考えるとしても、 27=128 通りのモデルを考えなければなりません。 このような組み合わせ爆発の問題を回避するため、周期 s は作図や自己相関関数をもとに決め打ちし、季節差分の P,D,Qは低く抑えることがよく行われます。

            残差に関する4つのプロットを見ることができます。 左上から順に、標準化した残差の時系列プロット、残差のヒストグラムと正規分布(とKDE分布)の密度関数、残差の正規QQプロット、残差の自己相関関数です。 残差の自己相関は低くまとまっており、ほぼ問題ないと言えるでしょう。



            心理統計法at放送大学

            豊田秀樹 2017

            第3回

            MCMC法
            事後分布に従うパラメータを乱数として発生させ、パラメータを確率分布として表す

            HMC法 ハミルトニアンモンテカルロ法
            物理学分野の力学的エネルギーの原理を応用したMCMC法の一つの方法

            生成
            HMC法は、同時事後分布に従う乱数を、蛇口から水が流れるように継続的に生成する

            捨てる区間 burn in
            乱数の数 chain

            点推定量
             事後期待値 EAP
             事後中央値 MED
             事後確率最大値 MAP
              事後分布が正規分布だったら平均値と同じだし、EAP=MED=MAP
              一様分布だったら最尤値と同じ=標本平均と同じ

             点推定値の精度
              事後分布の散布度(分散や標準偏差)の小ささ=点推定値の精度


            第?回

            検定力分析
             適切な検定ができるようにサンプルサイズを決める
              大きすぎず小さすぎずに
              でもそれって順番逆じゃね?
              サンプルサイズは実験者が主体的に決めることだべ


            第10回

            有意性検定は結果がシンプルでいい
            ブラックボックスでもいい
            統計熟知してない人には特にそう思われやすい
            有意水準を絶対的なものとして捉えちゃうので

            でも本当は同じ5%でも、
            サンプル数が多くてp<0.05になった場合(第一種の過誤が起きてる)もあれば、
            サンプル数が小さくてp>0.05になった場合(第二種の過誤が起きてる)場合もあるのに、絶対唯一視されてしまうという危険性がある

            サンプル数が多くて無意味な場合
            サンプル数が少なくて意味のある差を検出できない場合


            差がある確率は80%といわれると解釈は人によって分かれる
             書いた人が差があると思っても査読者はそう思わないかもしれない

             だが判断を各自が自在にできるのがベイズ推定のよきところともいえる
             サンプルサイズで結果の意味が変わることはない


            ABテストの結果、AがBを上回る確率は60%でした、と報告する
            BをAに切り替えるのにほぼコストがかからないのであれば、Aに切り替えようという判断がしやすい

            一方、AB間に差があるとはいえない、と報告する
            BをAに切り替えるのにほぼコストがかからないとはいえ、どっちつかずの報告ではAに切り替える判断はしにくい
            その結果、Aに切り替えていれば60%の確率で売上が増えたかもしれない未来を捨てている、機会損失が起きている
            でもそのこと自体に気づかないままに時は過ぎていく、これが怖い


            第11回

            オッズ比 odds = p / (1-p)

            チームAがBに勝つ確率が0.2と予想されている場合は
            0.2 / (1-0.2) = 1/4となる
            Aが勝つと予想している人が、Bが勝つと予想している人の1/4である

            オッズ比=賭けに勝った人の払い戻し倍率の逆数ともいえる
            Aに1,000円賭けてAが勝った時は、外れた人の掛け金をみんなもらい
            元金+4000円をもらえる


            2項分布の掛け合わせ(2x2のクロス数表、男女別のブランド認知率)
             男女間にブランド認知に差はあるか?などを調べる場合は
             リスク差、リスク比、オッズ比をみる
              有意性検定のカイ二乗検定と同じ


            第13回

            単回帰分析における回帰直線は、目的変数と説明変数のおおまかな関係を示してくれて便利
            だが説明変数では説明しきれない目的変数の特徴を考察することも大事、そのためには残差プロット

            ある2つの観測データにおいて、説明変数の値は同程度なのに、残差に大きな違いがあったりする、その違いが何かはわからない
            でもその違いはなぜかを考えることにより新たな別の説明変数を着想するきっかけになる

            残差プロットは新しい研究視点を与えてくれることもあり、観測対象に対する有用な知見を示してくれる

            2020年6月14日日曜日

            渡辺澄夫

            渡辺澄夫
            http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/index-j.html

            データ解析
            http://watanabe-www.math.dis.titech.ac.jp/users/swatanab/da2019.html

            特異モデルにおけるベイズ検定と変化点発見への応用
            http://watanabe-www.math.dis.titech.ac.jp/users/fujiwara/doc/fujiwara_ibis2006.ppt.pdf

            Pythonや機械学習を学ぶ

            機械学習の前に重要なデータ抽出・加工に便利なPythonライブラリ「pandas」の基本的な使い方のチュートリアル
            https://www.atmarkit.co.jp/ait/articles/1802/13/news012.html


            [Python入門]リストの操作 (1/4)
            https://www.atmarkit.co.jp/ait/articles/1906/04/news009.html

            時系列データへの回帰分析
            https://logics-of-blue.com/time-series-regression/


            【Python】pandasのDataframe操作
            http://canisterism.hatenablog.com/entry/2018/01/07/150105


            #特定のセルの値を取り出してseriesに
            pythonでexcelファイル処理まとめ
            https://qiita.com/hasepy/items/06d5d2e2b6495752442c


            [Python] Excelで文字化けしないCSVファイルを書き出す
            https://qiita.com/y4m3/items/674423b596284bbc7cf7

            Pythonの日本語処理
            http://www.wakayama-u.ac.jp/~kazama/lab/python/i18n.html
            標準出力の文字コードと自動変換
            https://www.javadrive.jp/python/japan/index2.html
            文字コードの指定
            https://www.javadrive.jp/python/japan/index1.html
            Unicode文字列(ユニコード文字列)
            https://www.javadrive.jp/python/string/index5.html

            日本語文字列コード問題まとめ
            http://python.matrix.jp/pages/tips/string/encoding.html

            python3で日本語を含むURL(日本語URL)にurllibでアクセスする際、htmlで勝手にencodeされてエラーするので回避策をメモ
            https://qiita.com/mix/items/87d094414e46f857de45

            日本語を含むURLでつまづく
            http://mankuro.xyz/blog/2017/04/25/japanese-url/
            単一ドメインを走査する(URLに日本語を含む場合)
            http://nnpo.hatenablog.com/entry/2016/12/13/002540
            PythonでURLエンコード/デコード
            http://shuzo-kino.hateblo.jp/entry/2016/10/22/224034

            pythonでutf-8日本語文字列を、URIエンコード・URLデコードする
            http://linux.oboe-gaki.com/archives/000333.html
            Pythonでマルチバイト文字を扱う際に気をつける点。
            https://gist.github.com/devlights/4561968
            Python と文字コード
            http://www.kabipan.com/computer/python/unicode.html


            [Python] urllib.parseによるURLエンコード/デコードの方法
            https://hibiki-press.tech/learn_prog/python/url-encoding/2804



            機械学習

            第1回 難しくない! PyTorchでニューラルネットワークの基本
            https://www.atmarkit.co.jp/ait/articles/2002/06/news025.html

            AI・機械学習のための数学超入門 ― 前提知識は四則演算だけ! (1/4)
            https://www.atmarkit.co.jp/ait/articles/2003/02/news023.html

            機械学習やディープラーニングってどんなもの? (1/2)
            https://www.atmarkit.co.jp/ait/articles/2003/24/news016.html

            「機械学習の最先端」を効率的に情報収集! おすすめのメルマガ3選
            https://www.atmarkit.co.jp/ait/articles/2006/11/news016.html

            機械学習の手法13選 ー 初級者、中級者別に解説!
            https://ainow.ai/2020/06/04/222969/

            スターバックスはコーヒー事業者ではない ― データテック企業なのだ
            https://ainow.ai/2020/05/28/222388/


            平均二乗誤差

            pytorchにはMSELossがある

            criterion = torch.nn.MSELoss()

            y = f(x)
            loss = criterion(y, t)
            print(loss.data)

            自作するとこう
            def mycriterion(x, y):
                result = (x - y) ** 2
                return result.sum() / len(result)


            myloss = mycriterion(y, t)
            print(myloss)





            2020年5月30日土曜日

            SSブログとGoogleフォトのアルバム

            So-netブログ改めSSブログは、Googleフォトの画像を埋め込むことができる。
            ブログ側にてアップした画像は、以前は同じアルバムに入ってた。
            2019年3月ごろからはアップしたタイミングごとに別のアルバムになった。

            2020年3月ごろから、ブログ閲覧者はGoogleアカウントにサインインしないと画像が見れなくなっていた、ことに3ヶ月くらいしてから気づいた。

            見れるようにするには、Googleフォトにて、アルバムを共有設定にする必要がどうやらあるらしい。。。



            SSブログやBloggerからアップした画像を削除したい場合


            Googleアルバムアーカイブというところにアクセスする必要があるらしい



            2020年5月24日日曜日

            Pythonで体験するベイズ推論

            Pythonで体験するベイズ推論 PyMCによるMCMC入門
            キャメロン デビッドソン=ピロン(著) 玉木徹(翻訳)

            PyMC3のインストール方法

            岩波データサイエンス Vol.1
            [特集] ベイズ推論とMCMCのフリーソフト のサポートページ
            https://sites.google.com/site/iwanamidatascience/vol1/support_tokushu#TOC-PyMC3-

            Python ヒッチハイク・ガイド

            https://python-guideja.readthedocs.io/ja/latest/

            PcMC3のコード

            https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers

            Chapter1の一部をやってみた

            https://github.com/sasasakaz/bayesian/blob/main/bayesian_estimation_for_change_point_detection.ipynb

            2020年4月12日日曜日

            2群の平均値の差の検定そしてベイズ推定

            背景
            • 2群の平均値に差はあるか?を簡便におこなうならt検定
            • 中心極限定理とt分布の頑健性のおかげで、たいていの場面において有用
            • 計算簡単でコスパに優れた方法だが、有意差がある/ない以上の情報はもたらしてくれない
            そこでベイズ推定
            • ここでは2群の観測データそれぞれがt分布から生成されると仮定したモデルを作成する
            • そしてこのモデルにより、2群の平均値の差の事後分布を得る
            • これにより2群の平均の差が一定値以上である確率など、豊かな情報を得ることができる
            結論
            • ベイズ推定においても、2群の平均の差の平均値や区間推定は、Welchのt検定とほぼ同じ結果が得られた
            • 弱情報事前分布の使用により事後分布はほぼ尤度だけで形作られ、しかも単峰だったため
            • 不確かさを扱いながらの推定は手間を要するが、手間をかけたぶん実務面での問いに答えやすい情報を得られた



            シナリオ

            • 背景: カフェチェーンの店頭ディスプレイ改善施策
              • あるカフェチェーンで、店内POP(販促物)を刷新することで「ラテ」の売上拡大を企図している
              • 立地や客層、売上規模、ラテの販売動向が似通っている2店舗を対象に、ABテストを模した実験をおこなった
            • データ構造と検証項目
              • 2店それぞれの14日間のラテ注文単価データ(日次ラテ売上金額 / 日次ラテ注文数)
              • ラテのサイズやトッピングの有無などにより変動しやすい売上金額ではなく注文単価で比較
              • 処置(テスト店舗での新POP)は結果変数(ラテの日次注文単価)に影響してそうかを検証したい

            観測データ

            A群(Control)[465.0, 458.6, 466.5, 475.2, 457.7, 457.7, 475.8, 467.7, 455.3, 465.4, 455.4, 455.3, 462.4, 440.9]

            B群(Test)[454.1, 471.6, 464.8, 484.7, 466.4, 458.8, 502.0, 476.6, 481.0, 458.6, 471.8, 481.7, 462.7, 485.6]

            Welch t-test

            Group A: mean=461.34, unbiased sample variance=81.62, n=14
            Group B: mean=472.89, unbiased sample variance=174.83, n=14
            calculated degree of freedom: 23.0
            
            

            Welch's t_test Results t-value: 2.70 p-value: 0.0128 average diff: 11.55 95%CI: (2.70, 20.41)




            統計モデリングのスタンス

            • 統計や機械学習においては、今手元にある観測データは、なんらかの確率分布から生成されたという考え方をする。

            • 例えばこのカフェの場合、ラテ注文者の金額は確率的に決まる(例えば10人中5人くらいは400円の注文をする)という考え方。

            • 例えば実際の注文額(観測データ)は、平均400円、ばらつき50円くらいの正規分布から発生したのだろうといった捉え方ができる。

            • 確率分布とパラメータ

              • ただし真の確率分布は誰にもわからない(本当は平均380円だったのかも?本当はもっと複雑な形状の分布だったのかも?)。
              • 分析者はなるべく真の確率分布に近しそうな確率モデルを構築する。この確率モデルの形状を決めるのがパラメータ。
              • 真の確率分布がわからない以上、適切な確率モデルもパラメータも分析者にはわからない。
              • 一方、手元には観測データがある。事実としてここにあるからには確からしいであろうと思える。
              • そこで、観測データは確からしいであろうを出発点として、このデータを生み出したパラメータを(観測データの生成メカニズムとは)逆向きに探るアプローチをとる。
            • パラメータの選定

              • 手元の観測データを得るのにちょうどいいパラメータもあれば、そうでないものもある。
              • 良し悪しの判断に用いるのは、データとパラメータの適合度合いを表す指標(likelihood 尤度)。
              • データを固定して、パラメータをいろいろと変化させたときに、尤度がどう変わるかをグラフや数式で表現したのが尤度関数(Likelihood Function)。
            • 古典的統計学の場合

              • 尤度が一番しっくりくる箇所を特定してパラメータを推定する(例えば二次関数を微分して極値を求める最尤法など)。t検定の考え方もこれに準ずる。
              • 計算が速く推定結果がわかりやすい。しかしそのピンポイントのわかりやすさが仇になる場合もある。
            • 不確実性

              • Welchのt検定の結果、新POP導入でTest店のラテ注文単価はControl店を平均的に上回っていたことがわかった。
              • だが、14日間のテスト期間中には注文単価が同程度だった日や下回っている日もあった。
              • t検定が教えてくれるのは「平均して効果があったかどうか」という1点。
              • 14日間という限られた観測データから得られた推定値が、不確実性をどの程度含んでいるかは見えない。
              • テスト期間の傾向が今後も続くのか、他店導入時に裏目に出るリスク(単価が下がる確率)はどのくらいかなど実務面での問いには答えにくい。
            • パラメータの不確かさを含んだ推定

              • であれば、今手元にある限られた観測データから生じる「パラメータの不確かさ」を含んだままに推定してみる。
              • これにより、まだ見ぬ場面における不確かさを確率的に表現しやすい、使い勝手のいい推定結果を得ることができるのではないか。
              • そこで、尤度以外の情報(すでにわかっている知識、過去経験など)も駆使しながら不確かさをうまく扱えるベイズ推定をおこなう。
            • ベイズ推定の場合

              • ベイズ推定では探索によって得られるパラメータを確率分布(事後分布)で表す。
              • メリットとして、推定値の不確かさを自然に表現しやすく、実務面での問いにも答えやすい情報を得られる。
              1. まずパラメータの探索範囲を確率分布(事前分布)で仮定する。
              2. 次に手元の観測データと事前分布を足がかりにして探索する。
              3. こうしてパラメータの不確かさを考慮した推定値(事後分布)を得る。
                 ※事前分布に、データから得られた尤度(情報)を掛け合わせる(更新する)ことで、事後分布を得る

            なお尤度はあくまで分析者が仮定した確率モデルのパラメータとの適合度合いを表すだけ。観測データとパラメータとの辻褄がもっとも合う尤度だったからといって、最適解のパラメータであることを常時保証してくれるわけではない。




            Bayesian Model Definition

            • ベイズ推定のモデリングで分析者が設定すること

              • 観測データの生成プロセス(尤度関数となる確率分布の選定): 観測データがどんなルール(確率モデル)から生まれたか
              • 選んだ確率モデルの形状を決めるパラメータの事前分布: 確率モデルの平均やバラツキをコントロールするパラメータの探索範囲
            • 観測データの生成プロセス

              • 2群の観測データそれぞれが「t分布」から生成されると想定
                • t分布は、平均mu 標準偏差std 自由度ν(ニュー)の3つのパラメータで形状が決まる
                • t分布は、正規分布よりも両端が厚いぶん、観測データに極端な値があった場合に、たまたま起きたノイズ(標本誤差)として処理しやすい
                • t分布は、νが大きくなるにつれて正規分布に近似していく(t分布を想定することで正規分布をも包含できる)
                • t分布にすることで、小サンプルでも標本誤差を軽減しやすく、不確かさを考慮した「頑健な」推定がしやすい
            • 各パラメータの事前分布

              • muとstd共通
                • muとstdの事前分布はかなり広めに設定している(弱情報事前分布 Weakly Informative Prior)
                • 真の値がどのあたりに位置するか確からしい情報がない(観測データを最優先したい、あまり影響与えたくない)との考えを反映
                • この場合、事後分布はほぼ観測データの情報(尤度)だけで形作られる(ので推定結果は検定の結果と近しくなりやすい)
              • mu
                • 観測データ全体での平均と、観測データ全体の標準偏差を2倍した標準偏差からなる、裾が長い正規分布としている
              • std
                • 観測データ全体のスケールから機械的に算出した、範囲広めの一様分布としている
                • 下限は0付近ギリギリまで探索できるように設定(標準偏差は0以下にはならない、0近辺に張り付く可能性ある)
                • 上限は現実的範囲に制限
              • ν(ニュー)
                • 頑健な推定のためにνの値が小さい(=両端が厚い分布になる)方に高い事前確率を割り当てたい
                • 0をピークに右に裾が長い指数分布は好都合だが、νは0より大きい必要がある。またt分布はνが30を超えるとほぼ正規分布になる(ν=1はCauchy分布と同じ)
                • 以上から平均29(ラムダλ=1/29)の指数分布を右に1だけシフトしている
                • これにより観測データの外れ値を許容しやすいν=1近辺(典型的なt分布)から、ν=30近辺(ほぼ正規分布)まで広く探索できる
            • 関心のある指標自体もモデリング

              • 観測データの生成プロセスを推定するついでに、結果の判断や意思決定に有用な情報もモデル化する
              • ここでは以下4指標をDeterministic (各種パラメータから導出される決定論的変数)に推定する
                • 平均の差分: リフト差分(Test群の平均 - Control群の平均)
                • 標準偏差の差分: バラツキの差(Test群の標準偏差 - Control群の標準偏差)
                • 効果量: 差の大きさがバラツキに対してどれだけインパクト(大きな効果、意味を持つ差)があるか
                • 平均の変化率: リフトの比率(Control群を基準としたときの相対比率 1=100%すなわち等倍)
            # Model Definition
            
            # x_A:Control, x_B:Test
            x_A = [465.0, 458.6, 466.5, 475.2, 457.7, 457.7, 475.8, 467.7, 455.3, 465.4, 455.4, 455.3, 462.4, 440.9]
            x_B = [454.1, 471.6, 464.8, 484.7, 466.4, 458.8, 502.0, 476.6, 481.0, 458.6, 471.8, 481.7, 462.7, 485.6]
            
            # prior distributions of mu 観測データの全体から設定
            combined_data = np.concatenate([x_A, x_B])
            pooled_mean = combined_data.mean()
            pooled_std = combined_data.std() * 2
            
            # prior distributions of sigma データのスケールに応じて動的に設定
            std_low = pooled_std * 0.001
            std_high = pooled_std * 10
            
            # prior distributions of nu クルシュケさんのベストプラクティスに準じる
            lambda_kruschke = 29
            
            # 平均と標準偏差それぞれの2群間差分、効果量、平均の相対比率についてもモデル作成
            
            with pm.Model() as model_weakly:
                mu_A = pm.Normal('mu_A', mu=pooled_mean, sigma=pooled_std)
                mu_B = pm.Normal('mu_B', mu=pooled_mean, sigma=pooled_std)
                # muが負の値を取るのを完全に防ぐなら、TruncatedNormalを使いlowerを指定する方法もあり
                # lower=0よりは、ドメイン知識を反映して、ラテの最低価格にするのがより現実的
                # mu_A = pm.TruncatedNormal('mu_A', mu=pooled_mean, sigma=pooled_std, lower=0)
                # mu_B = pm.TruncatedNormal('mu_B', mu=pooled_mean, sigma=pooled_std, lower=0)
            
                std_A = pm.Uniform('std_A', lower=std_low, upper=std_high)
                std_B = pm.Uniform('std_B', lower=std_low, upper=std_high)
                nu_kruschke = pm.Exponential('nu', lam=1/lambda_kruschke) + 1
            
                obs_A = pm.StudentT('obs_A', mu=mu_A, sigma=std_A, nu=nu_kruschke, observed=x_A)
                obs_B = pm.StudentT('obs_B', mu=mu_B, sigma=std_B, nu=nu_kruschke, observed=x_B)
            
                mu_diff = pm.Deterministic('mean_diff', mu_B - mu_A)
                mu_diff_rr = pm.Deterministic('relative_mean_diff', mu_diff / mu_A)
                std_diff = pm.Deterministic('std_diff', std_B - std_A)
                effect_size = pm.Deterministic('effect_size', mu_diff / np.sqrt((std_A**2 + std_B**2) / 2))
            
            
            # MCMC Sampling
            with model_weakly:
                prior_weakly = pm.sample_prior_predictive()
                trace_weakly = pm.sample(tune=2000, draws=2000, random_seed=42, return_inferencedata=True, chains=4, 
                                        #  target_accept=0.95,  # Uncomment if divergences occur (Raise to 0.9-0.95)
                                         idata_kwargs={"log_likelihood": True})  # モデル比較に使用する対数尤度を保存
                posterior_predictive_weakly = pm.sample_posterior_predictive(trace_weakly)
            



            Sampling Quality Check

            • ベイズ推定においては、サンプリング(マルコフ連鎖)が正常に機能し、事後分布に正しく収束しているかを確認する必要がある

            • trace_plotとsummaryを確認し、基準値をクリアしていれば適切な推定結果と解釈しやすい

            • trace_plotによる視覚的チェック

              • 左側はKDE(カーネル密度推定)による事後分布の形状、右側はサンプリングの軌跡(トレースライン)。いずれのグラフもchainsで指定した本数(例: 4本)の線がプロットされる
              • 左側のグラフでは4本の線がだいたい同じ形に、右側のグラフでは毛虫のような見た目(縦軸の値が一定範囲を何度も行き来して変動幅がだいたい同じくらい)になっていれば概ね問題ない
              • もしも左右グラフの下部に縦のバーが表示されている場合は、divergence 発散が起きていることを表す(縦バーの箇所ではサンプラーが空間の急斜面で足を踏み外してる、シミュレーションが真の軌道から大きく外れてる、つまりサンプリングがうまくいっていないことを表す)
                • 対処策1: target_acceptの値を0.90〜0.95程度に上げてみる(歩幅を細かくして慎重に探索させる)
                • 対処策2: tuneの回数を増やしてみる(ウォーミングアップ期間を伸ばして、地形の学習を確実にする)
            • summaryによる数値的チェック

              • r_hat
                • chain間の不一致度を表す
                • 目安として1.05以下(理想は1.00)であれば問題ない
                • そうなってない=各chainが同じ分布にたどり着いていない(収束していない)、つまりサンプリングがうまくいっていない
              • mcse_mean, mcse_sd(マルコフ連鎖モンテカルロ誤差)
                • サンプリングのブレが原因で生じる推定値の誤差(の平均と標準偏差)を表す
                • 目安としてmcse_meanが0.01以下(パラメータの変動範囲が0〜1の場合)、またはパラメータの標準偏差の5%以下(できれば2%以下)と十分に小さければ問題ない
              • ess_bulk, ess_tail(有効サンプルサイズ)
                • 自己相関を考慮した実質的なサンプル数
                • 事後分布の形状やHDIを安定して推定できているかを表す
                • 目安として400以上(できれば数千)確保されていれば問題ない
            • plot_autocorrによる自己相関チェック(任意)

              • summaryでess_bulkとr_hatが基準値をクリアしていれば自己相関は心配無用なので実行せずともよい
              • 問題ありの場合は、該当のパラメータのみを指定して実行(することでグラフが少ないぶん見やすい)
              • どこに問題あるかの原因の切り分けに役立つ
                • 特定のchainだけ自己相関が高い→tuneを増やす、サンプリングの初期化オプションを調整するなど
                • どのchainも自己相関が高い→モデルの構造を変える(パラメータ間の相関などが疑われる)
            # trace_plot
            az.plot_trace(trace_weakly)
            plt.tight_layout();
            
            # summary
            az.summary(trace_weakly)
            
            # mcse_meanが各パラメーターの標準偏差の5%以下(できれば2%以下)という基準値に収まっているかをチェック
            summary_df = az.summary(trace_weakly)
            summary_df['mcse_mean / sd'] = summary_df['mcse_mean'] / summary_df['sd']
            summary_df['mcse_mean / sd (%)'] = (summary_df['mcse_mean'] / summary_df['sd']) * 100 
            output_df = summary_df[['sd', 'mcse_mean', 'mcse_mean / sd', 'mcse_mean / sd (%)']]
            rounded_df = output_df.round({'sd': 1, 'mcse_mean': 3, 'mcse_mean / sd': 4, 'mcse_mean / sd (%)': 2 })
            rounded_df
            
            # # 自己相関
            # az.plot_autocorr(trace_weakly, var_names=["nu"], figsize=(8,3), textsize=10)
            # plt.tight_layout();
            
            # forestplot 
            # HDIを一覧で視覚的に解釈しやすい(太線は50%HDI)
            az.plot_forest(trace_weakly, figsize=(6,4), textsize=10);
            



            PPC

            1. 事後分布のchainから任意のパラメータをランダムに取り出す(例: mu_A=450 std_A=20 nu=5)
            2. 取り出したパラメータから成る分布から、観測データと同じサンプルサイズの擬似データを生成する(t分布から14サンプル取り出す)
            3. このKDE(カーネル密度推定)をプロットしたのが青線
            4. ここまでを指定の数(num_pp_samples=100)繰り返す。観測データのサンプルサイズが多い場合や分布次第では、青線が帯のように密集状態になる
            5. 青線の平均をとったのがオレンジ点線(=モデルの平均的な予測)
            • 読み解き方

              • 黒線(観測データのKDE)が青線の変動範囲やオレンジ線と同じような位置、形であれば、モデルは観測データをよく近似していると解釈できる
              • 大きくズレていたら、分布の選定や事前分布の見直し、例えばt分布以外がよかったかな?事前分布の探索範囲を変えた方がよい?など、モデル修正方針の検討材料になる
              • あくまで今手元にある観測データの発生メカニズムを矛盾なくシミュレーションできているかを見てるだけ。観測データやモデル自体の確からしさを裏付けるものではない(観測データが偏ってる可能性や過学習リスクは残る)
            • 本件の場合

              • 観測データのサンプルサイズが少ないため、青線はあまり密集していない
              • 黒線がモデルの予測範囲(青線たちの広がり)の中に収まっており、いい感じのモデルといえそう
              • ダメなモデルだったら、黒線が青線たちの外側に大きく飛び出していたり、山の位置が全くズレてたりするだろう
              • muの事前分布をNormalにしたことで、ごく僅かに左端がマイナスの値を取る。これを100サンプルが引き当てた場合には、違和感のあるプロットになる。2群の平均値の差の事後分布にはほぼ影響ないが、どうにも気になる場合はTruncatedモデルを採用する手もある
            az.plot_ppc(posterior_predictive_weakly, num_pp_samples=100, figsize=(10, 4));
            



            Interpretation

            • Posterior Inference and Interpretation: 推論された事後分布の解釈
            • plot_posterior
              • 事後分布のKDE, mean,HDIを一覧表示。視覚的に判断しやすい
              • ref_valで指定した値を基準に、その値を上回る(下回る)確率を表示することも可能
            • 2群の平均値の差について詳しく
              • もっとも関心のあるところなので加工してグラフにいろいろ装飾している
            # posterior
            az.plot_posterior(trace_weakly, figsize=(10,6), textsize=10)
            plt.tight_layout();
            
            # posterior
            # 差分、効果量、平均の変化率のmeanやhdiの表示
            
            az.plot_posterior(trace_weakly, # hdi_prob=0.95,
                              var_names=["mean_diff", "relative_mean_diff"],
                              ref_val=0, color='#87ceeb', figsize=(8,2), textsize=10);
            
            az.plot_posterior(trace_weakly, # hdi_prob=0.95,
                              var_names=["std_diff", "effect_size"],
                              ref_val=0, color='#87ceeb', figsize=(8,2), textsize=10);
            
            
            
            # 下準備
            
            # 多次元配列を一次元のサンプル配列として抽出
            mu_diff_samples = az.extract(trace_weakly, var_names="mean_diff").values
            
            # posterior_meanと94%HDIをグラフに表示するために値取得
            posterior_mean = mu_diff_samples.mean()
            hdi_lower = np.percentile(mu_diff_samples, 3)
            hdi_upper = np.percentile(mu_diff_samples, 97)
            
            
            # 2群間の平均値の差分の事後分布を表示
            fig, ax = plt.subplots(figsize=(6,4))
            ax.hist(mu_diff_samples, bins='auto', density=True,  # 縦軸を確率密度(全体の面積が1)にする
                    color="tab:orange", alpha=0.5)
            # bins='auto'にすると、データの四分位範囲とサンプルサイズから、外れ値に影響されにくい最適なビン幅を自動計算してくれる
            # density=Trueにすると、ヒストグラムの面積の合計が1になる(確率密度関数と同じ状態)になる!
            
            ax.axvline(0, lw=0.8, linestyle="dashed")  # ゼロのタテ線
            
            # observed_meanと95%CIの描画(観測データの平均値と95%信頼区間)
            # y位置を決める(グラフの一番下から少し上げた高さ)
            ymin, ymax = ax.get_ylim()
            ci_y = ymin + 0.07 * (ymax - ymin)
            ax.scatter(diff_mean, ci_y, s=30, facecolors="white", edgecolors='gray', linewidths=2, label= f"Observed Average: {diff_mean:.2f}" , zorder=5)  # mean の点
            ax.hlines(y=ci_y, xmin=ci_lower_w, xmax=ci_upper_w, color='gray', linewidth=3, label=f"95% CI: [{ci_lower_w:.2f}, {ci_upper_w:.2f}]")  # 95%CIの横線
            
            # posterior_meanと94%HDIの描画(ベイズ推定での事後分布)
            # y位置を決める(グラフの一番下から少し上げた高さ)
            ymin, ymax = ax.get_ylim()
            hdi_y = ymin + 0.03 * (ymax - ymin)
            ax.scatter(posterior_mean, hdi_y, s=30, facecolors="white", edgecolors='#7f2704', linewidths=2, label= f"Posterior Average: {posterior_mean:.2f}" , zorder=5)  # mean の点
            ax.hlines(y=hdi_y, xmin=hdi_lower, xmax=hdi_upper, color='#cc5500', linewidth=3, label=f"94% HDI: [{hdi_lower:.2f}, {hdi_upper:.2f}]")  # 94%HDIの横線
            
            ax.legend(loc='upper right')
            ax.set_xlabel("Difference in Average (JPY, Test - Control)", fontsize=10)
            ax.set_ylabel("Probability Density (Area integrates to 1)", fontsize=10)
            ax.set_yticklabels([])  # y軸の目盛りラベルを非表示にする(確率密度関数の値自体に意味を見出さなくていいように)
            ax.tick_params(axis='y', which='both', length=0)  # y軸の目盛り線の長さを0にして非表示状態にする
            # ax.get_yaxis().set_visible(False)  # これだとlabelも非表示になる
            ax.set_title("Estimated Lift of Latte \n(t_dist Weakly Prior Model)", fontsize=12)
            plt.tight_layout()
            plt.show()
            
            # print('observed average: {0:,.2f} 95%CI: ({1:,.2f}, {2:,.2f})'.format(diff_mean, ci_lower_w, ci_upper_w))
            # print('posterior average: {0:,.2f} 94%HDI: ({1:,.2f}, {2:,.2f})'.format(posterior_mean, hdi_lower, hdi_upper))
            
            
            



            Informative Model

            • ベイズ推定っぽく、事前分布に事前情報を適用したモデル
            • 他チェーンでは新POPで単価が50円上がったらしいという事前情報を反映した事前分布に書き換える
            • 「Test店はControl店よりもあらかじめ50円くらい高くなるポテンシャルを秘めているはずだ」との考えを反映したモデル
            • 尤度関数は引き続きt分布を想定
            • 想定される弱事前情報分布モデルからの変化
              • Test店の平均値と94%HDIが上ブレする。ベイズ推定は「他チェーンでは50円上がったらしいけど、今回のデータは11円か…じゃあ間をとってこれくらいが真の実力かな」という、データの不確実性と過去の信頼性を天秤にかけた、いわゆる「収縮効果(Shrinkage)」を起こす。
              • ひょっとすると94%HDIが狭まるかも。ベイズ推定は「情報が増えて、より確信を持って(不確かさを減らして)真の値を予測できるぞ」という状態になるので、事後分布の山が尖って、94%HDIの横棒が95%CIに比べて狭く引き締まる可能性がある。
            # Model Definition
            
            with pm.Model() as model_informative:
                # A店は、手元のデータの全体平均をベースに緩やかに置いておく
                mu_A = pm.Normal('mu_A', mu=pooled_mean, sigma=pooled_std)
                # B店(Test群)の事前分布に「50円プラス」の知識を組み込む。
                # 過去の実績(50円アップ)を信じつつ、ブレ(sigma)も考慮する
                prior_B_mean = pooled_mean + 50 
                mu_B = pm.Normal('mu_B', mu=prior_B_mean, sigma=pooled_std) 
            
                std_A = pm.Uniform('std_A', lower=std_low, upper=std_high)
                std_B = pm.Uniform('std_B', lower=std_low, upper=std_high)
                nu_kruschke = pm.Exponential('nu', lam=1/lambda_kruschke) + 1
            
                obs_A = pm.StudentT('obs_A', mu=mu_A, sigma=std_A, nu=nu_kruschke, observed=x_A)
                obs_B = pm.StudentT('obs_B', mu=mu_B, sigma=std_B, nu=nu_kruschke, observed=x_B)
            
                mu_diff = pm.Deterministic('mean_diff', mu_B - mu_A)
                mu_diff_rr = pm.Deterministic('relative_mean_diff', mu_diff / mu_A)
                std_diff = pm.Deterministic('std_diff', std_B - std_A)
                effect_size = pm.Deterministic('effect_size', mu_diff / np.sqrt((std_A**2 + std_B**2) / 2))
            



            Truncated Model

            • 結果変数が負の値をとらないようにするモデル
            • 弱情報事前分布モデルも事前情報を組み込んだモデルも、muの事前分布をNormalにしていた
            • 推定への影響は軽微だが、現実世界のドメイン知識をより厳密に反映したモデルにする
            • 尤度関数は引き続きt分布を想定しつつ、muの事前分布をTruncated Normalに変更する
            • ドメイン知識を反映したモデルで納得感高めることを企図(副次的にPPCでの違和感ある出力回避可能)
            with pm.Model() as model_truncated:
                # muが負の値を取るのを完全に防ぐなら、TruncatedNormalを使いlowerを指定する方法もあり
                # lower=0よりは、ドメイン知識を反映して、ラテの最低価格にするのがより現実的
                mu_A = pm.TruncatedNormal('mu_A', mu=pooled_mean, sigma=pooled_std, lower=0)
                mu_B = pm.TruncatedNormal('mu_B', mu=pooled_mean, sigma=pooled_std, lower=0)
            
                std_A = pm.Uniform('std_A', lower=std_low, upper=std_high)
                std_B = pm.Uniform('std_B', lower=std_low, upper=std_high)
                nu_kruschke = pm.Exponential('nu', lam=1/lambda_kruschke) + 1
            
                obs_A = pm.StudentT('obs_A', mu=mu_A, sigma=std_A, nu=nu_kruschke, observed=x_A)
                obs_B = pm.StudentT('obs_B', mu=mu_B, sigma=std_B, nu=nu_kruschke, observed=x_B)
            
                mu_diff = pm.Deterministic('mean_diff', mu_B - mu_A)
                mu_diff_rr = pm.Deterministic('relative_mean_diff', mu_diff / mu_A)
                std_diff = pm.Deterministic('std_diff', std_B - std_A)
                effect_size = pm.Deterministic('effect_size', mu_diff / np.sqrt((std_A**2 + std_B**2) / 2))
            



            Gamma Model

            • Truncated Model同様に、結果変数が負の値をとらないようにするモデル
            • 尤度関数はガンマ分布を想定
            • 負の値をとらない連続値であれば、t分布と切断分布の組み合わせよりは、こちらの方が汎用性は高いかも
            # Model Definition
            
            with pm.Model() as model_gamma:
                # ガンマ分布のパラメータは「正の実数」でないとなので弱情報事前分布としてExponentialやHalfNormalを使うことが多い
                alpha_A = pm.Exponential('alpha_A', lam=0.1)
                beta_A = pm.Exponential('beta_A', lam=0.1)
                alpha_B = pm.Exponential('alpha_B', lam=0.1)
                beta_B = pm.Exponential('beta_B', lam=0.1)
            
                obs_A = pm.Gamma('obs_A', alpha=alpha_A, beta=beta_A, observed=x_A)
                obs_B = pm.Gamma('obs_B', alpha=alpha_B, beta=beta_B, observed=x_B)
                
                # ガンマ分布の数理特性から、事後分布の平均と標準偏差を逆算する(deterministic用)
                # 各群の期待値(平均値 = alpha / beta)の計算
                mu_A_calc = pm.Deterministic('mu_A_calc', alpha_A / beta_A)
                mu_B_calc = pm.Deterministic('mu_B_calc', alpha_B / beta_B)    
                # 各群の標準偏差(sd = sqrt(alpha) / beta)の計算
                std_A_calc = pm.Deterministic('std_A_calc', np.sqrt(alpha_A) / beta_A)
                std_B_calc = pm.Deterministic('std_B_calc', np.sqrt(alpha_B) / beta_B)
            
                # 平均と標準偏差それぞれの2群間差分、効果量、平均の相対比率についてもモデル作成
                mu_diff = pm.Deterministic('mean_diff', mu_B_calc - mu_A_calc)
                mu_diff_rr = pm.Deterministic('relative_mean_diff', mu_diff / mu_A_calc)
                std_diff = pm.Deterministic('std_diff', std_B_calc - std_A_calc)
                effect_size = pm.Deterministic('effect_size', mu_diff / np.sqrt((std_A_calc**2 + std_B_calc**2) / 2))
            



            Compare Models

            • どの尤度関数(モデル)が優れているかを比較
            • 事後分布を丸ごと使って比較する
            • LOOやWAICといったベイズ専用の指標を計算する。
            • 単に手元のデータへのフィット度を見るだけでなく、「パラメータの不確実性も含めた上で、未来の予測能力が一番高いのはどのモデルか?」を厳密にスコアリングしてくれる。
            • 基本的には WAIC よりも LOO を使う方が推奨とされている。
              • 理由は数理的な頑健性(ロバストさ)にある。
              • WAIC: 計算がめちゃくちゃ高速だけど、データが少なかったり、極端な外れ値があったりすると、ペナルティ項(p_waic)の計算が少し不安定になって、スコアがブレやすいという弱点がある。
              • LOO(正確にはPSIS-LOO): WAIC とほぼ同じ予測力を測る指標なんだけど、内部で「外れ値に対する警告システム(Pareto k 統計量)」が動いてくれるから、14サンプルみたいな少サンプルデータに対して、より安全で正確に機能する。
            # 各モデルのサンプリング結果を格納して、どの観測値の尤度で比較するかを変数名で指定する
            model_compare = az.compare({
                "t_dist Weakly Prior Model": trace_weakly,
                "t_dist Informative Prior Model": trace_informative,
                "t_dist Truncated Model": trace_truncated,
                "Gamma Weakly Prior Model": trace_gamma
                },
                var_name="obs_B",
                # ic="waic"  # デフォルトはloo
            )
            az.plot_compare(model_compare);
            
            
            model_compare
            

            表の見方

            • rank: どのモデルが優秀か。
              • 予測性能がいい順番。
            • elpd_loo(elpd_waic): 予測性能のトータルスコア。
              • 期待対数予測密度(対数予測密度の期待値 Expected Log Pointwise Predictive Density)。値が大きい、つまり0に近いほど予測性能が優秀。未来のデータをどれだけ精度よく予測できるかを表す。
              • t分布たちはほぼ互角だけど、ガンマ分布はかなり低いスコア。つまり「14サンプルの手元のデータに対しては、t分布のほうが圧倒的に座りが良かった」ということを意味している
            • p_loo(p_waic): 有効パラメータ数。
              • モデルの複雑さ(過学習のしやすさ、ペナルティの大きさ)を表す。
              • パラメータ数が多かったり、観測データに無理やり形を合わせよう(過剰適合)とすると、この数値が大きくなりelpdが減点される仕組み。
              • t分布勢に対してガンマ分布は小さい。ガンマ分布モデルは無駄な複雑さがなく、シンプルにデータを表現していることを示している
            • elpd_diff: 1位との予測スコアの差分。
              • 差が4以上あると有意な差とみなされることが多い
              • t分布たちの差分は微量なので1位とほぼ同等と言える。ガンマ分布はずいぶん離れており、今回データにおいては予測力不足と言える。
            • weight: 予測ブレンドの重み付け
              • もしこれらのモデルを合体させて未来を予測するなら、どのモデルの意見を何割信じるべき?というブレンド比率(0〜1)。
              • LOOの場合(内部ではスタッキング法という技術が使われることが多い)、モデルの実力が伯仲していたときに0.6と0.4みたいに綺麗に分散して出力されやすい(複数モデルの予測パワーのバランスをリアルに反映しやすい。重み付けの計算がより安定的になる)
              • WAICの場合は微差であっても1位のモデルに 1.0(100%)と極端に全振りされやすい。
            • se: トータルスコアの標準誤差
              • 各モデルのelpd_loo(elpd_waic)が、サンプリングのブレによってどれくらいバラつく可能性があるかを表す不確実性の幅(標準誤差)。
            • dse: 差分の標準誤差(elpd_diff自体の標準誤差)。
              • elpd_diff ÷ dseの計算結果が2を超えているかどうかが、実務上の超重要ラインになる。
              • 2未満であれば、1位のモデルと数理的には完全に互角・誤差の範囲内。
              • ガンマ分布は2を大きく超えており、ガンマ分布が負けているのはサンプリングの偶然ではなく明確に実力差であると言い切れる。
            • warning: 計算が破綻していないかの警告
              • データの中にLOO(WAIC)の前提を揺るがすような過度なばらつき(極端な値)があり、指標の計算が数理的に変になってないかのフラグ。
              • True だと数値が信用できない、False だと健康に計算できたという意味。
              • LOOのwarning=Trueは、
                • 内部で パレートk統計量(Pareto k diagnostics)という厳密なデバッグシステムが動いて警告を出す。
                • データ1件1件に対して、このデータはモデルにとって予測しづらい外れ値になってないか?を全件チェックして、基準値(k>0.7)を超えたデータが1件でもあるとwarning=Trueになる。
              • WAICのwarningは、
                • データ全体のバラつきをなんとなく見て、なんか破綻してそうってアバウトに警告を出すだけ。
                • WAICではt分布勢はサンプルの少なさや裾の厚さのせいでTrueだが、ガンマ分布モデルは Falseだった。
                • ガンマ分布は非負のデータ構造を数理的に正しく捉えているから、警告を出さずにものすごく健康に計算できたという、ガンマ分布の構造的な美しさが証明されている。
            • scale: 計算の単位空間。
              • 対数尤度をどのスケールで計算したか。ArviZでは一律でlog(対数空間)が使われる

            モデル評価

            • 4モデルの中ではTruncated Modelが最も予測能力が高いと評価された(僅差のためサンプリング次第でTOP3の並びは変わる可能性あり)
            • t分布の3モデルはほぼ同程度に対し、ガンマ分布モデルは予測能力が劣ると評価された
            • ガンマ分布モデルは微量ながらdivergenceが発生していた。また94%HDIの幅が広すぎる推定だった
            • 以上からすると、ガンマ分布モデルを採用するのはなさそう。t分布についてはどれを採用してもよさそうとの結論