GoogleアナリティクスGA4ではGTMを使わない?

  • Googleアナリティクスが、今までの「ユニバーサルアナリティクス(UA)」というもの(プロパティ)から「アナリティクス4(GA4)」というものに変わったみたい。
  • ユニバーサル アナリティクスでは、収集されたデータの基本単位は「ヒット」と呼ばれた。そして、ページビューとイベントという 2 つのヒットタイプがよく使用された。
  • このアナリティクスで「あるページから外部リンクが何回クリックされたか」など、いろいろなデータを計測するために「イベント」を自分で作成する必要があった
  • そして、イベントを作成するためには、これまで(UAで)はページに「タグ」と呼ばれるものを埋め込まなければならなかった。そのために、直接ページにタグを埋め込む方法と「Googleタグマネージャー(GTM)」と呼ばれるもので管理する方法と2つあった。
  • 多くのタグを管理するためにはGTMが便利であり、それを解説しているページが多い。
  • 一方、GA4ではイベントの概念が変わった。GA4ではデータの収集単位がイベントになった。ページビューもイベントの1つだ。
  • そしてイベントはタグを埋め込まなくても、アナリティクスで直接管理できるようなしくみが多く導入された。
  • したがってUA4から解析しているときは、GTMは必要ない?GTMで管理しているような記事は参照にしないほうが良い?
  • まだまだ、わからないことが多く勉強が必要?

numpyをimportしたcgiをさくらのレンタルサーバーで動かす。

前の記事「さくらのレンタルサーバーにPython3とNumpyをインストールする」で、見事にPython3とNumpyのインストールに成功したと思った自分だったが、pythonで書かれたcgiプログラムを動かすと、再びnumpyがimportできず「ctypeがない問題」が発生した。試行錯誤の結果、numpyのバージョンを更に下げて、動かすことに成功した。

ITやや素人の私が、ナッシュ均衡を計算するwebアプリを作るための記録。前回は「さくらのレンタルサーバーにPython3とNumpyをインストールする」で、苦労の末、遂にPython3とNumpyのインストールに成功した…と思ったのだが…。

ターミナルでは問題なく動く

webアプリを作るためにいろいろ試行錯誤。これについては、また改めて記事にしようと思う。とりあえず、現時点の目標「htmlからフォームでデータを送り、python3で(numpyをインポートして書かれた)cgiプログラムを動かして出力する」こと。

まず自分のPCのwindows上でやってみて、うまく行った。そこで次に、さくらのレンタルサーバー上で、動かすことに挑戦。ところがうまく動かない。Internal Server Errorになるのである。

そこでまず、以下の簡単なプログラムをファイル名 investigation2.cgi として作った。

#!$HOME/local/python/bin/python3

import cgi
import cgitb
import numpy as np

cgitb.enable() 
print("Content-type: text/html <br>")
print()
print("Hello World!<br>")
print(np.zeros(5))

($HOMEは実際には正しいパス名が入る)。windowsではうまく動いたし、シェルから動かすと、以下のようにちゃんと動く

% python3 investigation2.cgi
Content-type: text/html <br>

Hello World!<br>
[0. 0. 0. 0. 0.]

そこでブラウザから http://正しいURL/investigation2.cgiとしても、うまく行かない。パーミションはきちんとしているし、だいいちここから、import numpy as npと print(np.zeros(6)) を削除し http://正しいURL/investigation2.cgiとすると

とちゃんと出てくるじゃないか。どう見ても import numpy as np が悪さをしている。しかしcgiでエラーが出るとエラーをブラウザに吐いてくれるcgitbというモジュールも、エラーを吐いてくれない。これはどうしたことだろうか?

いろいろネットでべると「import numpy を直接ではなく、関数に入れるとできる」のようなっ記事を目にしたので(ごめんなさい、どの記事か忘れてしまいました)、以下のように変更してみた。essential_mainという関数を定義し、そこでnumpyをインポートする、というものだ。

#!/home/nabepremium/local/python/bin/python3

import cgi
import cgitb

def essential_main():
    import numpy as np
    print("in the main function")
    print(np.zeros(5))

cgitb.enable() 
print("Content-type: text/html <br>")
print()
print("Hello World!<br>")
essential_main()

うーん、これでもダメだった。しかし、これだと Internal Server Errorにならず、アクセスはできていた、しかも幸いなことに、cgitbがエラーをブラウザに吐き出してくれたのである。エラーの内容は多いので、ここには記さないが、エラーを読むと

numpyのモジュールは探し出せているが、numpyをインポートするときにnumpy自身がいろんなライブラリを呼び出していて、その際に

import _ctypes_ctypes undefined

とか

ImportError: Shared object “libffi.so.6” not found, required by “_ctypes.cpython-38.so”

とかいうエラーが出ているようだ。…ん?ctypeがないって…

まだゾンビのように生き残っていたのか!ctypes問題!(詳しくは 「さくらのレンタルサーバーにPython3とNumpyをインストールする」 を参照せよ)

環境変数やsys.path.insertなど試してみるもダメ

Shared object “libffi.so.6” not found, required by “_ctypes.cpython-38.so とあるが、この libffi.so.6 というファイルは、前回のlibffiをインストールしたときに入っている。なので、これを見つけることができないということは、環境変数かパスを通してやれば、いいんじゃないか?と考えたのだが、ここからはpythonやnumpyに通じてない、やや素人の私には無理な話。とりあえずpathとか、いろいろな環境変数にlibffi.so.6があるパスを入れたりしたのだがダメである。

自分がターミナルから動かしたときには動くのに、cgiからは動かない、というのはlibffi.so.6のある位置が、外部のnobodyだったかotherがcgiを動かすときに、これが見えなくなっていることだから、 プログラムの内部にこれを教えてやればいいんじゃないか?と推測する。でもも、ここからはpythonやnumpyに通じてない、やや素人の私にはやっぱり無理な話。

また調べてみると、プログラムがモジュールを検索するときはsys.pathというものを使うということで、プログラム内でsys.path.insertというコマンドによって、モジュールを検索する場所を教えることができるようだ。そこでこのコマンドでいろいろパスを追加するもやっぱりダメ。

そもそもnumpyというモジュールの位置は探し出していて、それをインポートするときに、numpyが呼び出すライブラリのようなものが見つからないって言っているので、上記のやり方は違う気がする。

エラーは「_ctypes.cpython-38.soによって要求されるlibffi.so.6がない」と言っている。だからpythonに教えると言うよりは、この_ctypes.cpython-38.soにlibffi.so.6の位置を教えてやらないとダメだということだろう。しかし、どうやって教えればいいのかが分からない。_ctypes.cpython-38.soは$HOME/local/python/lib/python3.8/lib-dynloadにあるので、ここに libffi.so.6 をコピーしてみたのだが、やはり動かないようだ。やや素人の私には限界である。

Numpyのバージョンを下げる

_ctypes.cpython-38.soやlibffi.so.6はバイナリファイルだ。いろんな記事を読み、前回の記事で見たpyproject.toml-based projectの話も考慮して、素人の私の勝手な推測は、以下のようなことだ。

  • pythonのモジュールやNumpyは、初期の頃より複雑で巨大化している。だからモジュールで使われるライブラリなどは、最初はソースファイルで提供され、モジュールのインストール時にコンパイルされていたが、だんだんとバイナリで出来上がったものが提供されたり、利用されるようになってきたんじゃないだろうか。
  • ところがその「出来合いのバイナリファイル」が問題を起こしている。それは、ライブラリがモジュールのインストール時にコンパイルされたときには、持っている情報を使えるんだが、出来合いだとそれが使えないから、後で教えなければならない。
  • でも教え方は分からない。
  • じゃあ、モジュールのバージョンを下げて、ライブラリをモジュールのインストール時にコンパイルする時代まで戻れば、なんとかなるんじゃないか?だいたい、最初もNumpyのバージョンを下げればうまくいったじゃないか。

Numpyの最新のバージョンは1.21.5だが、先のインストール時に1.18.4に下げている(「さくらのレンタルサーバーにPython3とNumpyをインストールする」 を参照)。どこまで下げればいいんだろう?じゃあ、思いっきり下げてバージョン1.8.1くらいにしてみよう!

ということで、一応、Pythonを再インストールしてきれいにし、

%pip3 install numpy==1.8.1

としてみた。すると
Using legacy ‘setup.py install’ for numpy, since package ‘wheel’ is not installed.
として、かなり時間がかかっている。うーん、よくわからないが「(現在はwheelという完成品のパッケージを使うんだけど)、それがないから古いやりかた(古い遺産:legacy)である setup.py によってインストールしている」と言ってるのだろう、とやや素人の私は解釈。 かなり時間がかかって、エラーが出てないのはいい兆候だ、と思い、しばらく待つも、最後には大量のエラーが吐き出され失敗。

古すぎたのだろうか。それじゃあということで、適当にバージョン 1.14.6で挑戦してみた。すると、さっきと同じで
Using legacy ‘setup.py install’ for numpy, since package ‘wheel’ is not installed.
して、かなり時間がかかっている。

「こんな当てずっぽうなやり方じゃダメだな、これで同じエラーが出たら推測もだめだってことで、もう諦めよう」と思うが、とりあえず最後と思ってずっと待つ。「もうダメだ」と思った瞬間、なんとインストールに成功したじゃないか!

びっくりした。エラーが出るかと思ったが。

次に、先の http://正しいURL/investigation2.cgi にアクセスしてみると、ちゃんと動く。

さらに、import numpyを関数内の呼び出しからメインプログラムへ移したのだが、やはりちゃんと動いている。かくしてCGIでも正しく動作したのであった。

推測は正しくないかも知れないがまとめると、Python3.8.12とNumpy 1.14.6 の組み合わせで、cgiプログラムも正しく動作したのであった。

やっとここまで来た。しかし、まだwebアプリへの道のりは続くのであった。

さくらのレンタルサーバーにPython3とNumpyをインストールする

「さくらのレンタルサーバー」にPython3とNumpyを、やや素人の私がroot権限なしのレンタルサーバーにPython3とNumpyをインストールし、ホームページにナッシュ均衡を計算するwebアプリを作るまでの記録。「ctyesがない問題」と「Numpyのダウングレード」が鍵

ナッシュ均衡を計算するwebアプリを作るための記録。今回は、20年近く使ってきた(このサイト)「さくらのレンタルサーバー」に、<ややIT素人>の私がPythonとNumpyをインストールする話。

コンピュータやネットワークの問題を解決するのに、ネットでいろいろ検索して解決する人が多いと思うが(自分はそう)、重要なことは「問題を解決するためのやり方は、日々、変わっていて、その記事がいつ書かれたのかに注意し、古い記事ではなく新しい記事を参照すること」だ。古い記事を参考にして、ハマってしまうことも多い。今回もそれを痛感した。だいたいの場合、世の中は便利になっていて、時間が経つに連れ「インストールのやり方は簡単になっている」ことが多い。本記事は2021年12月26日のものだ。読んでいる人は、他に新しい記事がないかを、まず検討して欲しい。

さくらインターネットにもPython3の導入予定はないか問い合わせてみたところ「Python3の需要は近年高まっている事は弊社にても感じており、今回もお客様の声を頂いたという事を社内で共有させて頂き、今後のサーバアップデートの検討項目とさせて頂きたく存じます」との回答。もう皆さんがこの記事を読むころにはPython3は、さくらにはインストール済も知れない。

Python3をインストールする

さくらのレンタルサーバーは、ユーザーはroot権限がないので、PythonやNumpyの導入に関する多くのネット記事は参考にならない。sudoなどのコマンドは使えない。いろいろなネット情報を試したが、現時点では、以下の記事が一番良かった。

さくらのレンタルサーバに Python3 をインストールする方法

結果的には、この通りにやったらできた。

  1. ssh でさくらレンタルサーバにログイン
  2. ダウンロード用のフォルダを作る(自分は~/work/python3の中にPython3.9.2をダウンロードしてインストールした。以下、記事はそれに基づいているが、フォルダ、Pythonのバージョンは、各自で考える)
  3. wget でファイルをダウンロード。このとき上の記事ではPython-3.9.0をダウンロードしている。自分はPython3.8.12とした。後述するが、このPythonのバージョンをどうするかも鍵になる。後述するが、Python-3.9.0や3.9.2だと、うまく行かないようだ。
  4. tarコマンドでファイルを解凍
  5. Pythonをインストール。インストールの手順は以下の通り。
    1. まずダウンロードしたディレクトリに移動
    2. ./configure を実行するが、その際 prefix を使ってインストールするディレクトリを指定するとともに
      • 自分は $HOME/local/pythonとした
    3. make を実行
    4. make install を実行
  6. パスを通す
    • .cshrc ファイルの最後にset path = ($path $HOME/local/python/bin)を追記(記事ではviエディタを使ってますが、私はwindowsで作成しFTPでアップしました)
    • source ~/.cshrcとrehashで設定を反映
  7. whichコマンドでパスを確認、python3と打ってpython3が動くか、pip3と打ってpip3が動くかどうかを確認して完了

コマンドをまとめると以下のようになる。

%mkdir -p ~/work/python3
%cd ~/work/python3
%wget --no-check-certificate https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz
%tar zxf Python-3.8.12.tgz
%cd ./Python-3.8.12
%./configure --prefix=$HOME/local/python/
% make
% make install

以上だが、間違っているかもしれないので、ぜひ元の記事のさくらのレンタルサーバに Python3 をインストールする方法 を読み、確認しながら進めて欲しい。非常にわかりやすい記事だ。

Numpyをインストールする

次にNumpyのインストールだが、これはとても大変だった。さくらのレンタルサーバーにPython3を導入する記事も少ないが、Numpyを導入して成功したという記事は、さらにぐっと少なくなる。私が見たのは、以下の2つ。

  1. さくらレンタルサーバーにgcc、Python3、numpy、scipy、scikit-learn、gensimをインストールする
  2. さくらレンタルサーバーでのpython環境のセットアップ

しかし、結果的には、この記事ではうまく行かなかった。

まず最初に

%pip3 list

で、インストールされている外部モジュールを確認しておくと、

となる。最初はpipとsetuptoolsしかインストールされていないことが分かる。そして「pipのバージョンが古いから」と警告が出るので

%pip3 install --upgrade pip

として、pipのバージョンをアップグレードしておく。さて、ここで

%pip3 install numpy

とすれば、うまくインストールできるはずだが、真っ赤なエラー文がいっぱいいっぱいいっぱい出てきて失敗する。この赤い警告文にビビり、最初はいろんなことを試し、ハマってしまった。

落ち着いて、たくさんのエラーの最後の方を見ると

とある。「_ctypesというモジュールがない!」と言っている。これが「ctypesモジュールがない問題」である。

ctypesモジュールがない問題

これに対しては

【Python3】_ctypes と libffi のインストールに苦しんだ記録

というありがたい記事を発見した。詳しくは、この記事を読んでほしいが、まず最初のSTEPとしては、libffiというライブラリをインストールすることだ。このために参考にするのは、上の記事から引用されている

さくらレンタルサーバーに libffi をインストールする

である。なんと先ほど参考にした「 さくらのレンタルサーバに Python3 をインストールする方法 」のnotemite.comさんの記事なんですね!ありがたや、ありがたや。

ctpyesの前にlibffiをインストールする

上記の記事を参照してほしいのだが、(間違っているかも知れないが)内容をまとめると、以下の通りになる。まず、以下のコマンドで 、libffiというライブラリをインストールする。、

%mkdir -p ~/work/libffi
%cd ~/work/libffi
%wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
%tar xvfz libffi-3.2.1.tar.gz
%cd libffi-3.2.1
%./configure --prefix=$HOME/local/libffi/3_2_1
% make
% make install

次に、以下のコマンドで、シンボリックリンクを貼る。

%mkdir -p ~/local/include
%ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h  $HOME/local/include/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/
%mkdir -p ~/local/lib
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/
%ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/
%mkdir -p ~/local/lib/pkgconfig/
%ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig

そして環境変数の設定をする。.cshrc の末尾に下記を追記し、

setenv LD_LIBRARY_PATH $HOME/local/lib
setenv PKG_CONFIG_PATH $HOME/local/lib/pkgconfig

.cshrc で追記した内容を反映させる。

% source ~/.cshrc
% rehash

notemite.comさんの丁寧な解説で、素人の私でも理解できた。

再びctypesのインストールへ

再び「 【Python3】_ctypes と libffi のインストールに苦しんだ記録 」の記事に戻り、ctypesのインストールに移る。ここで./configure 文を以下のように修正したうえで、pythonを再インストールする。(自分は~/work/pythonの中にPython-3.8.12をダウンロードし、解凍しインストールしたので以下のようになっているが、フォルダ、Pythonのバージョンは、各自で)

%cd ~/work/python/Python-3.8.12
%./configure --prefix=$HOME/local/python/ --with-system-ffi LDFLAGS="-L $HOME/local/lib/" CPPFLAGS="-I $HOME/local/include/"
%make
%make install

とし、さらにpipのバージョンをアップグレードしておく。

ここで再チャレンジで、pipでnumpyをインストールしようと

%pip3 install numpy

とする。ここで赤字のエラーが出るが「_ctypesがない」というエラーから、以下のようなエラーに変わっているならば、あと一歩のところまで来ているので、以下は飛ばして後述の「NumpyとPython3のバージョン問題」に進めば良い。

ここでctypeエラーがまだ起きているならば

しかし、ここでまだ「_ctypesがない」というエラーが出ることもある。このエラーが出るときは、makeするときに

のようなエラーが観察されるようだ。この記事を書くために、何度か手順を変えてインストールを繰り返し、根本的な原因を考えてみた。しかし、すると、このエラーが出るときと出ないときがあったり、いつの間にか解消してしまって、再現できなくなることがある。

はっきり分かっていないが、これはPythonのバージョンの問題のようだ。記憶では、最初にPython3.9.2でやってみたところ、ここでも 「_ctypesがない」 エラーが出て問題は解消しなかった。そこでPython3.8.12でやると、このエラーは出なくなった。たぶん、上記のライブラリlibffi-3.2.1とPythonのバージョンの依存問題があるのだろう

ややこしいのは、解消後に再びバージョンを上げたりすると、ctype問題が解消していることがあるということだ。これは/$HOME/localのファイルを削除せずにpython3のインストールとアンインストールを繰り返すと、新しいバージョンのPython3が古いバージョンのライブラリを参照することがあり、それで見かけ上、解決しているのではないだろうか。そして、これは、後述の「pip3ではモジュールはインストールされているが、python3内ではインストールされてない問題」が起きる原因になる。Pythonを再インストールするときは、Pythonだけではなく、これはローカルフォルダ$HOME/localにあるライブラリも削除し、きれいにしておかないとダメだ。この点はrootではなくユーザーでやっているので、あまり心配なく削除できる。

あともう1つ考えられることは環境変数の問題である。記事によっては、環境変数を、以下に設定しろというものがある。

setenv PYTHON $HOME/local
setenv PYTHONPATH $HOME/local/lib/python3.8/site-packages
setenv C_INCLUDE_PATH $HOME/local/include
setenv CPLUSE_INCLUDE_PATH $HOME/local/include
setenv LIBRARY_PATH $HOME/local/lib

いろいろやってみると、上記の環境変数は影響してないように思える。しかし少なくとも、上記の環境変数を追加してからmakeしてみるのは損はない。追加するためには既にやったように、.cshrcの末尾にこれを付け加えて、source ~/.cshrcとrehashで追記した内容を反映させる。

NumpyとPython3のバージョン問題

さて、ctypesがない問題が解決して、あと一歩まで来ている。ここでエラーをよく見ると、

ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

とある。pyproject.toml-based projectのinstallが必要と言っている。これをインストールすれば良いのだろうか。そこでこのtomlプロジェクトを調べてみると、これは最近のモジュールの新しいインストール方法らしい。昔は、pythonはsetup.pyというものでインストールしていたが、最近はpyproject.tomlというものでインストールを行うようだ。

参考:え、まだsetup.py使ってるの? pyproject.tomlとsetup.cfgで宣言的パッケージング

正しいのは、この pyproject.toml が使えるようにすることかもしれないが、結構、大変そうだ。しろうとの私が推測したのは「pip3で最新のnumpy(このときはnumpy-1.21.5)をインストールすると この pyproject.toml を使うのでうまく行かないのだから、 numpy のバージョンを下げてみれば解決するだろう」というものだ。そこで

% pip3 install numpy==1.18.4

と低いバージョンを適当に選びインストールしてみた。すると、

となった。なんと、インストールはうまく行ったのである!確認のためpip3 listと打ってみると

となって、無事numpyがインストールされていることが分かる。

結局、PythonとNumpyのバージョンに注意し、必要に応じてバージョンを下げるということが1つの手段なんだろう。 これに加えて「ctypesがない問題」においては、ライブラリlibffiのバージョンも関連している気がする。できるだけ新しいバージョンを使うことがいいのだろうが、どんな組み合わせが最新になるのかは試行錯誤だし、そんなにたくさんはできない。今回のことをまとめると

  • Python 3.8.12
  • Numpy 1.18.4
  • libffi 3.2.1

の組み合わせはうまく行ったということだ。

さて、ここで安心してはいけない。最後にpython3に入り、

>>import numpy as numpy

と入力してみる。pip3でもnumpyがインストールされていることが確認できているので、あっさりimportされるはず...。

ここまでまっすぐに来た方は、エラーが出ずにインポートされてくれるはずだ。その人は以下の「pipの認識とpythonのバージョンがずれる問題」を見る必要はなく、最後の「まとめ?まだまだ苦難は続いた」へ。

pipの認識とpythonのバージョンがずれる問題

ところが、ここまで曲がりくねって、いろいろなバージョンのpython3をインストールとアンインストールした自分には、もう一つ山が待っていた。

python3のコマンドラインに入り、import numpy as npと打つと「そんなmoduleはない」と叱られてしまったのだ。

これはPCに複数のpythonのバージョンがインストールされた際に、pipとpythonのバージョンがずれてしまう問題である。これについては以下の記事を参照にして欲しい。

Pythonのpipコマンドでうまくパッケージがインストールできない場合がある理由と対処法

自分の場合は、確認するために

%pip3 install numpy

と入力すると、

Requirement already satisfied: numpy in $HOME/local/python/lib/python3.8/site-packages

のようにpipが認識するインストール先が出てきた。次にpython3に入って

>>> import sys
>>> print(sys.path)

として、モジュールの入力先を見てみる。すると、

 '$HOME/local/python/lib/python39.zip',$HOME/local/python/lib/python3.9','$HOME/local/python/lib/python3.9/lib-dynload',
$HOME/local/python/lib/python3.9/site-packages'

のようになった($HOMEは実際はパス名)。pythonのバージョンを調べてみると

% python3 --version
Python 3.9.2

tとなる。つまり、python3のバージョンは3.9.2であり、python3も、モジュールのインストール先を $HOME/local/python/lib/python3.9 と認識しているのに対し、pipはインストール先をpython3.8にしていたのである。

曲がりくねって、いろいろなバージョンのpython3をインストールとアンインストールすると、この問題が起きる。これを解決するには、local以下のファイルをすべて削除して、pythonをきれいに再インストールすることであった。

以上で、python3とnumpyのインストールは完了したと思えたが…。

まとめ?まだまだ苦難は続いた(2021年12月29日追記)

長い道のりだったが、さくらのレンタルサーバーへのpython3とnumpyのインストールは成功した。python3のコマンドラインに入り、

>>> import numpy as np

と打つと今度はエラーは出ず、print(np.zeros(6))と打ってみると

>>> print(np.zeros(6))
[0. 0. 0. 0. 0. 0.]

とちゃんと動いている(なんちゅうテストだ)。そしてシェルに戻り、numpyで書かれたプログラムのファイルnumpy_test1.pyを実行しても

% python3 numpy_test1.py
[array([2, 5, 8]), array([3, 6, 9])]
方法1
[[2, 8], [3, 9]]
方法2
[[2, 8], [3, 9]]

とちゃんと動く(どんなテストプログラムかは内緒...)。

やったやった!これで万事、うまく行った!次のステップに入ろう!と喜んだのだが...。実はあの「_ctpesがない問題」は、ゾンビのように生き残っていたのである。

詳しくは

numpyを使ったcgiを、さくらのレンタルサーバーで動かす

に記したが、結論を言うとcgiプログラムにnumpyをインポートして使うためには、numpyのバージョンを(1.18.4からさらに)1.14.6まで下げなければならなかったのである。

部分ゲーム完全均衡(ざっくりとした説明)

部分ゲーム完全均衡について、ざっくりと説明します。

部分ゲーム完全均衡(Subgame Perfect Equilibrium, SPE)とは「ある点から後がゲーム(部分ゲーム)とみなせるときには、プレイヤーはそのゲームのナッシュ均衡を選んでいる」と考えるゲームの解です。

次のようなゲームを考えてみましょう。

このゲームは最初にプレイヤー1がYNかを選択。Nを選べば右上の戦略形ゲーム(同時ゲーム)に突入し、Nを選べばゲームは終了してプレイヤー1と2の利得が共に2となるゲームです。

このゲームの解はどうなると予想されるでしょう?プレイヤー1は最初の点で、Yを選んだときに、その結果がどうなるかを予想しなければなりません。右上の戦略形ゲームでは、ナッシュ均衡は(B,B)なので、プレイヤー1の利得は1になると予想されます。

このことからプレイヤー1は最初の点でYを選べば利得は1、Nを選べば利得は2になるのでNを選ぶと考えられます。部分ゲーム完全均衡は「プレイヤー1は最初の点でYを選び、次の戦略形ゲームでプレイヤー1と2は共にBを選ぶ」となります。

部分ゲーム完全均衡を正確に学ぶためには、(1)展開形ゲームはどのように書けて、それを戦略形ゲームに変換するにはどうするのか、(2)展開形ゲームにおいて、ある点から後をゲーム(部分ゲーム)とみなせるのはどういうときか、を学ぶ必要があります。それはまた今度にします。今はこちらの動画を参考にしてください。

部分ゲーム完全均衡はナッシュ均衡の1つ

部分ゲーム完全均衡はナッシュ均衡の1つ(精緻化されたもの)です。例を使って、(ボンヤリとですが)説明してみましょう。

次のゲームを考えます。

  • 最初にプレイヤー1がUDを選びます。Uを選べばゲームは終わり、プレイヤー1と2の利得は1と3になります。
  • プレイヤー1がDを選ぶと、プレイヤー2がLRを選びます。Lを選べばゲームプレイヤー1と2の利得は0と1、Rを選べばプレイヤー1と2の利得は共に2となります。

このゲームは、プレイヤー1がUDを選び、プレイヤー2がLRを選ぶ戦略形ゲーム(同時のゲーム)と考えることもできます。

ここで「交互にプレイする展開形ゲームを、同時にプレイする戦略形ゲームに変換できるのか?」という疑問があるかと思います。確かにそこが最大のポイントですね。確かにプレイヤー2は、プレイヤー1がDを選んだのを知ってから、LかRを選ぶわけです。しかし、プレイヤー2はゲームが始まる前に「もしプレイヤー1がDを選んだらどうするか」を決めておくことはできるはずです。またプレイヤー1は、「もしDを選んだらプレイヤー2はどうするか」を推測しなければ自分の選択を決めることができません。プレイヤー1の頭の中では、プレイヤー2がどうするかは、自分が選択をする前(ゲームが始まる前)に決まっていなければなりません。このように展開形ゲームでは「すべてのプレイが行われる前に、各プレイヤーはどの点で何が選ばれるかを決定しておく」として、戦略形ゲームとして考えることができるわけです。

この戦略形ゲームのナッシュ均衡は(U,L)(D,R)の2つです。

一方、このゲームの部分ゲーム完全均衡はどうなるでしょう。プレイヤー2が行動する点は部分ゲームと考えることができます。プレイヤー2はLを選べば利得1、Rを選べば利得2ですからRを選びます。このプレイヤー2の行動を推測すると、プレイヤー1はDを選びます。

均衡の精緻化

ナッシュ均衡がすべて、部分ゲーム完全均衡になるわけではありません。ここで、部分ゲーム完全均衡ではない(U,L)というナッシュ均衡が、どういうものかを考えてみましょう。図では以下のようになりますね。

このナッシュ均衡では、各プレイヤーが(U,L)が起こると予想しています。プレイヤー2は、プレイヤー1がUを選ぶと予想すれば、Lを選んでもRを選んでも利得は同じなので、Lを選んでも悪くはありません。そして、プレイヤー1は、プレイヤー2がLを選ぶと予想すれば、Uを選ぶことが最適です。したがって、この戦略の組は「すべてのプレイヤーにとって、相手がその戦略を選ぶならば、自分にとって最適な戦略を選んでいる」ようなナッシュ均衡になるのです。

確かにプレイヤー2は「プレイヤー1がUを選んだと予想したときは、Lを選んでもRを選んでも利得は同じ」です。しかし、このゲームは同時のゲームではありません。予想ではなく、実際にプレイヤー1がDを選んだ場合には、プレイヤー2は、もはやLを選ばずRを選ぶでしょう。

このように展開形ゲームを戦略形ゲームに変換すると、「プレイヤーが選択した行動の情報」を考慮せずに、プレイヤーの推測を考えることになってしまうように見えます(そう見えますが、本当にそうかどうかは、難しいところです)。

そのため、変換した戦略形ゲームのナッシュ均衡をそのまま解として考えると不完全で、展開形ゲームの構造を考慮して、ナッシュ均衡の中から適切でない解を除く必要があります。これを均衡の精緻化(equilibrium refinement)と呼びます。部分ゲーム完全均衡はナッシュ均衡の精緻化による解の1つです。

  • 部分ゲーム完全均衡は「ある点から後がゲーム(部分ゲーム)とみなせるときには、プレイヤーはそのゲームのナッシュ均衡を選んでいる」と考えるゲームの解
  • 部分ゲーム完全均衡はナッシュ均衡の1つ
  • ナッシュ均衡から、適切でない解を取り除き、解の候補を絞り込むことを均衡の精緻化と言う
  • 完全情報ゲームにおいては、部分ゲーム完全均衡はバックワードインダクションにいよる解になります。

東京都立大学 2020ゲーム理論1 オンライン講義(2020:コロナ対応)

一般向けの原稿や講演など

ゲーム理論に関する一般向けの投稿や講演の履歴、インタビュー記事などをまとめています。(研究業績に記したものと、一部重複があります)

  • 研究論文や学会発表などの研究業績、著書などは、別にしてこちらにあります。
  • 大学での講義と教育履歴は、別にしてこちらにあります

投稿や記事

  1. ゲーム理論の基礎知識(6回のweb連載)、株式会社イプロスからの依頼
  2. 「なぜ非常時にトイレットペーパーがなくなるのか?-経済学で見る買い占め行動」、望星、2021年6月号、44-50、東海教育研究所、2021。
  3. 「ノーベル経済学賞でわかった、「ヤフオク!」を100%使いこなす方法」、講談社「現代ビジネス」、2020年10月27日
  4. 「デマ拡散で買い占め」のワケ:識者に聞く対処法(日経MJ、2020年5月7日)
  5. 「初めてのゲーム理論編」(誌上講義)、週間ダイヤモンド、特集「ゲーム理論入門」、2018年8月4日。
  6. 「企業経営に活かすゲーム理論(後編)」、渡辺隆裕、調査月報、11月号,38-43, 2014。
  7. 「企業経営に活かすゲーム理論(前編)」、渡辺隆裕、調査月報、10月号,38-43, 2014。
  8. 「ゲーム理論入門/「ゲーム理論」は数学か?」、渡辺隆裕、数学セミナー、2014年10月号、 636号、ゲーム理論の数理。
  9. 「囚人のジレンマから見る価格競争」(もし経済学で日本の公共工事を論じたら第2回), 建設マネジメント技術, 32-37, 2013.
  10. 「経済学では公共工事をどうみるか」(もし経済学で日本の公共工事を論じたら第1回), 建設マネジメント技術, 3-6, 2013.
  11. 「経営者のためのゲーム理論入門」(第1回-第18回)、戦略経営者(TKC全国会)、2011年4月号から2012年9月号まで連載。
  12. 「ゲーム理論のキーワード」,現代思想, vol.36, 44-57, 2008.
  13. 「ゲーム理論の基礎知識」, ゲーム理論プラス(経済セミナー増刊号), 37-50, 日本評論社, 2007.
  14. 「ネットオークションでの賢い入札方法とは」, 経済セミナー, 2006年増刊号「経済学が分かる本」, 2006.
  15. 「解説、ゲーム理論とは」(日経ビジネスAssocie 2006年1月3日号)。
  16. 「企業の社会的責任と情報公開-ゲーム理論の観点から」, ESP, No.403, 23-26 , 2005.
  17. 「急成長するネットオークション」(2004年4月19日産経新聞コメント)。

一般の方向けの講演など

大学での講義(教育履歴、非常勤講師等)は、別にしてこちらにまとめています。

  1. 「ゲーム理論-その過去・現在・未来」、パルシステム協力会講演、2022年7月5日
  2. 「高校生のためのゲーム理論入門」<高校生のための大学授業体験シリーズ>東京都立大学オープンユニバーシティ。2022年10月16日(オンライン)
  3. 八王子東高校「探求学習」(2021年10月-2022年1月、3回程度)
  4. 筑波大学附属高校「総合的な探究の時間における探究学習」(2021年10月-2022年1月、3回程度)
  5. 「ゲーム理論って何だろう?」、八王子東高校で講義、2020年11月20日、朝日新聞社企画「プロフェッサービジット」。
  6. 東京都管理職候補者研修(2007年-)
  7. 伊藤忠テクノロジーソリューションズ「ゲーム理論で考える交渉と入札」(2018年1月18日)
  8. 数学検定協会「数学コーチャー研修会」(2015年6月6日東京、6月20日京都)
  9. 「ゲーム理論って何だろう」北海道室蘭栄高校Super Science Highschool講演(2016年10月7日)
  10. 麹町アカデミア「ゲーム理論入門」(全4回、2015年)
  11. 東京工業大学東京工業大学プロダクティブリーダー養成機構「異分野チャレンジ学」(2010年5月18日、2011年1月18日)
  12. 筑波大学ビジネススクール企業科学専攻:(2009年3月)
  13. シブヤ大学「情けはあなたのためになる~ゲーム理論が明かす「情けはひとのためならず」の真実~」(2008年10月18日)。
  14. 東京都特別区職員研修所研修「ゲーム理論と制度設計」(2009年12月7日)
  15. 日本生産性本部「労使交渉などに役立つ論理的思考 ~ゲーム理論を学ぶ」(2013年10月28日、2014年10月23日、2015年10月30日、2016年2月6日、)
  16. 中小企業大学校「経営後継者コース」(2004年-2006年)
  17. 関西電力 社内研修(2007年11月17日、2008年11月15日、2009年11月14日、12月5日、2010年11月13日、12月4日、2012年1月14日、1月28日)
  18. 住友経営テクノロジーフォーラム(2007年1月)
  19. Link and Motivation 社(2005年7月)
  20. 八王子学園都市大学「いちょう塾」(2005年10月)
  21. 政策研究大学院大学「ゲーム理論」(2004年-2006年)
  22. 東京都立大学公開講座(2003年2月)
  23. 岩手県滝沢村「青春ゼミナール」(2000年「賭けの科学」120分1回)

教育・講義の履歴

大学における講義履歴(ゲーム理論、ミクロ経済学、経済数学、オペレーションズ・リサーチなど)をまとめています。一般向けの講演の履歴はこちらにあります。研究業績などはこちらにまとめています。プロフィールはこちら

  • 東京都立大学経済経営学部(2004年-2019年は首都大学東京都市教養学部経営学系)教授
    • ゲーム理論1、ゲーム理論2
    • 入門ミクロ経済学
    • 演習(ゼミ)
    • 2年次専門セミナー
  • 東京都立大学大学院経営学研究科MEcプログラム(2018-現在、教授)
    • ゲーム理論
    • 経済学特別演習(ミクロ経済学)
  • 静岡大学工学部数理システム工学科(非常勤講師)
    • 社会システム工学
  • 首都大学東京大学院経営学専攻(2004年-2017年、教授)
    • 戦略的ゲーム理論(2004年-2017年)
    • 経営学特別演習(2004年-2017年)
    • 研究指導(2004年-2017年)
  • 東京都立大学経済学部(2002年-2004年、助教授)
    • ミクロ経済学(2002年-2004年)
    • 統計I、統計II(2004年)
    • 基礎経済学 (2003年)
    • 経済外国書購読(2002年-2004年、ミクロ経済学テキスト)
    • 「情報の経済学特論」(2004年大学院講義)
    • 経済学演習(2002年-2004年、3年生、4年生ゼミ)
  • 政策研究大学院大学公共政策プログラムコース(2004年-2008年、非常勤講師)
    • ゲーム理論
  • 筑波大学情報学類非常勤講師 (2001-2002年、非常勤講師)
    • 情報学特別講義 (「ゲーム理論」)
  • 筑波大学経営システム専攻(経営学修士(MBA)課程)(2002年、非常勤講師)
    • ゲーム理論
  • 岩手県立大学総合政策学部(1998年-2002年、助教授)
    • オペレーションズリサーチ(1999年-2002年、2002年は非常勤講師)
    • ゲーム理論(1999年-2002年、2002年は非常勤講師)
    • 学の世界入門(1年生基礎演習 「論文・レポートの書き方等」 1998、1999、2001年)
    • 2年生基礎演習(「ファイナンスとポートフォリオ演習」「ビジネスゲーム演習」1999年-2001年)
    • 3年生専門演習(「社会統計とSPSSの利用」 2000年、 2001年)
    • 4年生専門演習(卒論指導、政策分析等、 2001年)
  • 東洋大学経済学部 (1991年-1998年、非常勤講師)
    • 経済数学I  (1991年-1998年)
    • 経済数学II (1991年-1998年)
  • 東京工業大学工学部社会工学科(1989年-1998年、助手、宮嶋研究室)
    • 卒論・修士論文指導 補助 (自治体政策分析、 公益事業論、 電気通信産業の分析等)
    • 社会工学演習 (「駐輪場の設計」演習)

それ「協力ゲーム」じゃないから

ゲーム理論において、間違いられやすい用語は「協力ゲーム」だ。

多くの場合、世の中の状況は「競争」と「協力」に分けられる。
そこで、一般の人(?)は、競争を非協力ゲーム、協力や協調を協力ゲームと呼びがちだ。

呼びがちな人にとって競争とは、「一方が勝ち、一方が負ける」ような状況、例えば、将棋とか囲碁などの遊戯の<ゲーム>、スポーツなどを意味している。
一方、協力とは、交渉とかコーディネーションや囚人のジレンマなどなど、両者の行動によっては、良くなるウィンウィンの状態が存在する状況を意味しているように思える。

ゲーム理論では、上記の状況は両方とも非協力ゲームとして分析される。
あえて上記の状況を呼ぶのならば、競争はゼロサムゲームで、協力はノンゼロサムゲームである。

非協力ゲームと協力ゲームとは何かについては、別の記事に書いてあるが、ここでは使われている用語から見分ける方法を書いておこう。

利得行列、戦略、行動、ゲームの木、ナッシュ均衡、進化などの用語が使われているならば、それは非協力ゲーム。
特性関数、コア、シャープレイ値、仁などの用語が使われていれば、それは協力ゲームである。

八王子東高校で探求学習のサポート

10月11日、八王子東高校の「探求学習」のお手伝いに行ってきました。ゲーム理論の囚人のジレンマとコーディネーションゲームについて、高校1年生を相手にワークショップをしました。実際に、囚人のジレンマを実験してみるなどして、高校生たちは楽しんでくれたようです。

90分の講義に慣れている私達にとって、高校生の50分の授業は短く感じます。あの時間で要領よく教えている高校の先生たちは、なかなかすごいですね!
八王子東高校の探求学習では、生徒たちがゲーム理論から何かテーマを見つけて探究活動をして研究発表をするようです。私はアドバイスのために、あと2-3回高校にお邪魔する予定。

後期は、他にも高校生向けの活動を多くする予定です。今週末は、東京都立大学の高校生向けの公開講座で講演予定、再来週は筑波大附属高校の探求学習のお手伝いをします。

備忘録:ゲーム理論の力1

私たち経済学者が研究の中に有用となりうる証拠を見つけると喜ぶのは、世界が数えきれないほどの問題に直面しているにもかかわらず、自分たちは意味のない研究に人生を費やしているという罪悪感に苛まれているからです。ルービンシュタイン(著)、松井彰彦(監訳)、ゲーム理論の力、東洋経済新報社

ゲーム理論の基礎知識(6回連載)

株式会社イプロス様からの依頼で、ゲーム理論の基礎知識という連載を6回に渡って行うことになりました。

ゲーム理論とは:ゲーム理論の基礎知識1

ゲーム理論とは:ゲーム理論の基礎知識2

ゲーム理論とは:ゲーム理論の基礎知識3

ゲーム理論とは:ゲーム理論の基礎知識4

ゲーム理論とは:ゲーム理論の基礎知識5

ゲーム理論とは:ゲーム理論の基礎知識6

6回の連載で、ゲーム理論とは?、戦略形ゲームと戦略の支配、ナッシュ均衡、混合戦略、情報の非対称性とシグナリング、などを紹介します。コンパクトに、うまくまとめることができたと思います。