PyInv

プログラミングのメモ、海外投資のメモ

住友銀行秘史

住友銀行秘史

住友銀行秘史


 バブルの象徴として名高い「イトマン事件」の告発当事者(住銀)のメモを基にした備忘録。メモの抜粋が紙面の多くを占めているのでページ数のわりには短時間で読了した。


 反社に付け込まれた上場企業がキャッシュの引き出し器として食い物にされていく姿が克明に描かれている。 当事者がメモから起した記録であるのでリアリティの面では申し分ない一方、中立性の問題からどこまで信憑性があるかは判別できない。
 本文中ではぼかされているものの、筆者の協力者として描かれている人物さえも反社の人間であることからその複雑さが窺い知れる。
 しかし書かれている事柄だけでも現在では一発懲戒かお縄の犯罪オンパレードである。そういう観点からは今(2020年夏)話題の、銀行を舞台としたテレビドラマよりはるかにシビれる内容である。



 また、銀行・反社・協力企業・政治のカネを巡る癒着の酷さからは、当時のニュースを知っている世代が株式や不動産取引に及び腰になるのは仕方がないと思えるようになる。



 随所で気になった、登場人物たちは損失が膨らんでいくこと・このままでは破滅することを明敏に考察しながらも何故か責任者を更迭するという本丸に中々切り込めないでいることである。そして結局、マスコミにリーク→規制官庁の介入という外圧を使って解決を図っている。


 個人的にこの「なぜか」という考察をすると、その根本はあいまいな権力構造にあるように思える。確固たる法的な権力ではなく「先輩・後輩」、「御恩と奉公」、「親族の弱み」、「監督官庁と規制産業(命令ではなくお願いを繰り返す)」といった間柄であいまいな「影響力」を背景とした人事、命令(正確にはお願い)であるために当事者たちに都合の良い解釈が生じて行動が発生しなかったのではないだろうか。


 まず、このような権力構造では相手を慮ることや忖度することが非常に重要となるため、思い違いが感情のもつれが予想もつかない意思決定を導いている。そして、確固たる法的な力学ではないために、いざとなれば命令された側は内容が意に反している場合は知らんぷりを決め込むことができる。


 また、部外者であってもこのような構造を読むことができる人物は、弱みを握ったり恩を売ったりすることで内部に影響を及ぼすことができる。そうして侵入されると、内部には最早それを排除する力学が存在しない。


 上記のような関係性から、患部を取り除くためには「説得」を繰り返すか逆に弱みを握って排除するという政治的で非合理的な行動しかとれなくなってしまう。その結果が問題が判明してからも数千億を反社へと垂れ流した本事件へとつながったのであろう。

Unsupervised Learning: Clustering (K-means)の流れ

Clustering (K-means)を1からやってみる

流れ

  • 準備:Sample Dataの作成
  • Sample Dataをグラフ化してクラスター数の目途をつける
  • エルボー法で最適なクラスター数を決定する
  • K-meansによる結果の確認



Sample Dataの作成

make_blobs関数で生成。シードは適当。

import sklearn.datasets import make_blobs
data, _ =make_blobs(random_state=5) #make_blobsは2つの値を返すため、一方は'_'で受け取っておいた
data[:5] 
f:id:singapp:20200915130859p:plain
ちょっとDataをみてみる


Sample Dataの可視化

散布図でデータがどんな塩梅かみてみる

import matplotlib.pyplot as plt
import matplotlib as mpl

plt.scatter(data[:,0], data[:,1], color ='blue)
plt.show()



ぱっと見でクラスターは2ぐらい(なんと面白くないものが生成されたのか。。。)
f:id:singapp:20200915131455p:plain

エルボー法でクラスター数を決める

データの可視化で検討を付けたクラスター数近傍に対して、エルボー法で実際の集合具合を計算する。
減少幅が低下する直前が理想的なクラスター数。

from sklearn.cluster import KMeans

dist_list=[]
for i in range(1,10):  #'2'を含む前後の結果をみたい
    km = KMeans(n_clusters=i, random_state=0, init='random') #init='random'でK-meansにしてある。これを取り除くとK-means++
    km.fit(data)
    dist_list.append(km.inertia_)

plt.figure(figsize=(10,6))
plt.plot(range(1,10), dist_list, marker='+')
plt.show()



結果は予想通り、クラスター数2より大きくなると勾配が緩やかになる。つまりクラスター数2が最適。
f:id:singapp:20200915132809p:plain

最適なクラスター数を使った結果の確認

クラスター数2の結果を確認する

mearge_data=[]
km = KMeans(n_clusters=2, random_state=0, init='random')
km.fit(data)
y_pred = km.predict(data)
mearge_data = pd.concat([pd.DataFrame(data[:,0]), pd.DataFrame(data[:,1]),pd.DataFrame(y_pred)],axis=1)
mearge_data.columns = ['feature1', 'feature2', 'cluster']

ax=None
colors = ['blue', 'green']
for i, dd in mearge_data.groupby('cluster'):
    ax=dd.plot.scatter(x='feature1', y='feature2',ax=ax,color=colors[i], label=f'cluster{i}')

plt.show()

きれいにできました
f:id:singapp:20200915140154p:plain

Decision Treeのvisualisation

Decision Treeを可視化

Decision Treeは図にして俯瞰すると大変理解しやすくなる。ありふれた(諸先輩方には既知)コードではあるが自分用のメモとして残しておく。


準備

Decision Treeの作り方をおさらい。sklearnのcancer dataを使う

  • Impurity: Gini
  • Max Depth 5
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

 #Extract Data
cn = load_breast_cancer()
X_cn_df = pd.DataFrame(data=cn.data, columns=cn.feature_names)
y_cn = pd.Series(data=cn.target)

#model fit
X_train, X_test, y_train, y_test = train_test_split(X_cn_df, y_cn, random_state=0)
dt=DecisionTreeClassifier(criterion='gini', max_depth=5, random_state=0)
dt.fit(X_train,y_train)

#score
dt.score(X_train,y_train)
print('Accuracy(Train):{:.3f}'.format(dt.score(X_train,y_train)))
print('Accuracy(Test):{:.3f}'.format(dt.score(X_test,y_test)))

Visualisation Code

from sklearn import tree
import pydotplus
from sklearn.externals.six import StringIO
from IPython.display import Image

data = StringIO()
tree.export_graphviz(dt, out_file=data)
visual = pydotplus.graph_from_dot_data(data.getvalue())
Image(visual.create_png())


ヒルビリー・エレジー アメリカの繁栄から取り残された白人たち

ヒルビリー・エレジー アメリカの繁栄から取り残された白人たち

ヒルビリー・エレジー アメリカの繁栄から取り残された白人たち

  • 作者:J.D.ヴァンス
  • 発売日: 2017/03/15
  • メディア: 単行本(ソフトカバー)


 アパラチア近郊のラストベルトの貧困を脱して弁護士となった著者の自伝。トランプ大統領が当選した背景を説明するものとして米国でベストセラーになった。米国大統領選挙も佳境ということで現職トランプ大統領支持層を理解するおさらいという観点でよんでみた。


 読んでいて泣きたくなるような内容。一族・コミュニティの誰もが貧困と暴力、家庭環境の不和に幼少時から曝されてその環境を再生産していく。救いようがない、無力感のみ感じる。こういった地域ではそもそも教育が大切だという概念すらないので、テレビやインターネットといった情報技術は社会的資本の格差をならす効果はあるものの、貧困や格差をなくす決定的手段とはなりえないことがわかる。なぜならそういったメディアは積極的な情報取得という本人の姿勢により価値を産むものであることから、情報を取捨選択できなかったり、そもそもそこにアクセスする手段を知らない層ではその価値を引き出せないからである。


 重要なのは筆者の気づきにあるように「『なにかを成し遂げられる自信』と『向上心』をもつことで自分を変えることができる」というマインドセットなのだが、マインドセットが周りから与えられないためにそのマインドセットをもつことすら叶わないというトートロジーにはまっているのが根本にあるのであろう。
 筆者ほど大きな格差を埋めた経験はないが、大学進学率の低い田舎から出てきた自分にはこの構図は身に染みるほどよく理解できる。そして筆者と同様にアイデンティティの帰属に悩まされる。


 余談だが、日本語版の解説者はリベラルかつ(米国の)民主党支持だと一読してわかる。

世界一「考えさせられる」入試問題



 本書内では、フレームワークとしての思考方法を紹介するのではなく、筆者の自身の思索した結果を紹介しているので問題の意図が分かりづらい。結果として「オックスブリッジは難しい質問をするんですね」という感想で止まりがちである。「物事にはいろんな見方と側面がある」というのを学ぶだけではあまりに短絡にすぎるのでは。



 重要なのは、本書で紹介されている問題の発題者が「受験者の思考方法を探っている」ということではないだろうか。つまり問題に取り組むフレームワークが試されているだと思う。
 質問の前提と問いかけの意味を暗黙のものも含めて逃さないように自分で解釈し、最低限求められる教養で穴埋めをし、時には推論で補いながら自説を論じる行為そのものが求められているのであろう。(実際の受験時には受験者からの問題を明確化するための逆質問が許されるのかも)。課題設定、フェルミ推定、一般教養等の総合問題である。


 
 そのような観点でみれば、オックスブリッジの出題は受験者の資質を測るにふさわしい問題であるし、筆者の回答自体は優れたものだとわかる。



 ただ、自分でフレームワークを学ぶためには本書ではなく「知的複眼思考法」や「いかにして問題を解くか」といった本を手に取ったほうが再現性が高い。

いかにして問題をとくか

いかにして問題をとくか

  • 作者:G. ポリア
  • 発売日: 1975/04/01
  • メディア: 単行本

JupyterLab Env Note

JupyterLabの設定

JupyterNotebook からJupyterLabに引っ越しを考えるのでメモ

Packages

packagesはJupyterNotebookと内容も導入も共通なのでこちらを
singapp.hatenablog.com

Extension

相変わらずバージョンは気にしない

  • nodejs
    • まずはこれを追加しないと他のExtensionが動かない。
    • anaconda ではconda-forgeのchannelを追加しておく必要がある。*1
conda install -c conda-forge nodejs
  • Variable Inspector
    • 変数名や型をサイドウインドウに表示
    • こちらもconda-forgeで
conda install -c conda-forge jupyterlab-variableinspector
  • jupyterlab-lsp
    • Autocomplete(入力補完)の候補を探しています。。。。
    • JupyterNotebookにおけるHinterland in Nbextensionと同様の機能をさがしているがいまのところはjupyterlab-lspしかみつからず。
  • 2021/11/24追記
    • kiteがよさげです
    • conda ではkvedalaのchannelからいけます
conda install -c kvedala jupyterlab-kite

*1:Jupyter Env MemoのNbextentionを参照

Jupyter Env Note

Memorandam of Jupyter Setup

どんな設定か忘れないように(バージョンはきにしない)

Packages

pipよりcondaが好き

  • pandas
  • pandas-datareader
    • 使えないソースが増えてきている(yahoo Finance, Google Finance)ので注意
  • matplotlib
    • おなじみのMatlab式図形描写
  • seaborn
    • 統計に特化した描写
  • bokeh
    • matplotlib よりも細かい図形描写
  • ipywidgets, plotly
  • scikit-learn
  • scipy
  • statsmodels
    • 統計テスト
  • sqlalchemy
    • pandasのread_sqlに簡単にデータを渡せるDB Con用のツール
  • xlrd, xlwt
    • excelデータを取得
  • lxml, beautifulsoup4, html5lib
    • htmlのweb scraping用
  • pydotplus, graphviz
    • Decision Treeの可視化用

Packages 2

condaのdefaultにないもの

  • Nbextention
    • まずはconda-forgeを追加)
conda config --add channels conda-forge
    • 追加されたことを確認
conda config --get channels
--add channels 'conda-forge'   # lowest priority
    • インストール
conda install -c conda-forge jupyter_contrib_NbExtensions
  • fitter
    • 分布の形状を判別してくれる
conda config --add channels bioconda
conda install fitter

Japanese

特にmatplotlibでの日本語表示用にrcParamsを設定する(つまりNotebookごと)

import os
from matplotlib import rcParams
rcParams['font.sans-serif']='' #日本語表示を含むフォントを指定



もしくはmatplotlibrcを編集(matplotlibのデフォルトにする)

#現在のmatplotlibrcのパスを調べて
from matplotlib import matplotlib_fname
matplotlib.fname()
  
#現在のmatplotlibrcのコピーをとっておき
import shutil
shutil.copyfile(matplotlib_fname(), 'matplotlibrc')

#ファイルを直接書き換え後、キャッシュのクリア
from matplotlib import matplotlib_font_manager
font_manager._rebuild()