コスホリの世界

コスホリとはなんなのか

「いつかコスホリにいってみたい」そんなイニシエーションの一種を昨冬経験した。
尚コスホリの会場写真は安易には撮れないため、画像の掲載はない。Twitterハッシュタグ検索を推奨する。

  • 「コスホリ」は「コスプレホリック」の略で、同人&企業による成人向け即売会の一種。
  • ブースにてROM/写真集/撮影券等を販売しており、撮影エリアにて撮影券に応じた撮影が可能。
  • 入場前には18歳以上であることを身分証明書で要提示、時間による2部制で入場者数を制限。
  • 場内の無許可撮影は厳しく管理・取り締まられる
  • チケット代わりのA4写真集つきパンフレット(2000円)は、まんだらけ/駿河屋にて事前購入を推奨。
  • 羽田空港の近く東京流通センターで開催される。

cosholic.jp

コスホリとはなんだったのか

入場前

 東京流通センターまではモノレールでしか行けないので、必然車両の雰囲気は異様なものだった。風呂に頼む入ってくれ男+売り子orモデルガール+ニュートラルオタク+タイミング悪く乗り合わせた他乗客。しかし不協和音とはいえない場の謎の協調感は、整然とした待機列と円滑な運営にも表れており、迫りくるイベントへの安心感につながった。
 一方パンフレットをまともに読めておらず、周りの玄人感あふれる同士らの雰囲気にのまれ、巡回プランを考えていないことに焦燥を覚えた。そこでTwitterも駆使して同伴人と待機列にて巡回プランを熟考を重ね、「とりあえず順番にまわる」というシンプルすぎるプランに帰着した。
 
 つまり素人には何がコスホリで起きるのか等、到底検討もつかないのである。

入場

 始まった。足早に皆会場に吸い込まれていく。会場が目に入る、思ったより広すぎはしない会場だ。テンションが上がってくる。
 「とりあえず順番にまわる」プランにそって、ブースから2m程離れてやや遠めにブースの机に載せられた商品を眺める。ここで気付く。決して安くはない商品群(単価は約3000円)。購入は慎重になる一方で、立ち止まらなければよくわからない。止まりたいけど止まれない。売り子さんらと目を合わせられない。服屋さんで店員さんに声かけられるシチュエーションをレベル2段階くらい上げた感じだ。

 歪な愛想笑いでコーティングした強烈な好奇心と購入しない罪悪感で受け取るビラ。ただ視界に入るのは肌色と、来場者の吐く二酸化炭素と体温で息詰まる空間で、五感が鈍化していく。10スペース巡回+5分休憩。最早遠泳クロールだ。
 
 息も絶え絶え1周して漸く全体感を把握しはじめた。だいたいどこで何を売っているのか、気になるものはどこか。ぼちぼち、撮影エリアですごい恰好になっているモデルとすごい恰好でとっているカメラマンも、風景として脳も処理できるようになってきた。RPGよろしく、歴戦の参加者オジサンが教えてくれるROMのエロさも冷静に聴けるようになってきた。なるほどなるほど。
 
 なればこそ、これだぁ!!キミにキメタァーーー!

 twitter.com
 twitter.com
 

退場後

 新鮮な冬の空気で脳をリフレッシュする。品川駅のレストランで戦利品開いてたら斜向かいのフェミっぽいおばさんがすごい顔で退席した。全然全年齢内容なのだが。コスホリはまだまだこんなもんではないぞ。下記、反省会議事録。
 

  • 撮影へのハードルタケェ

金額もそうだし一眼レフないときつそう、というか撮ってもどうしようもない個人だけど、さらなるイニシエーションだ

  • 緊縛系は手が出なかった

 ROMとかの結果、ではなくて、手法解説とかの方がほしいと思う

  • 完全R18作品あまり食指がうごかない

 フェチズムのほうが好きだなと思った

  • 男の売り子、さけるか黒服スーツにした方がいい

 同人AVとかの男の売り子、普通に逆販促になっていると思った

最後に

 まさかの売り子さん側からやり取りの中で「こんな濃ゆいイベントによくきましたね」との発言もあった通り、やはりコスホリは魔界の一種のようだ。しかし、少なくとも私には想像していたよりは現実的な世界だったし、しっかりとしたルールに則った意味で健全なイベントであった。
 寧ろその意味では「物足りなさ」を感じたことも本心だった。とにかく脱げば、扇情的な恰好をすれば、そんなドラゴンボールパワーにも似た「エロさ」のインフレが垣間見えることに、物足りなさを感じたのだった。その点、フェチフェスもやや似た感想を頂いた想い出が去来する。
 勿論、モデル&カメラマンの方々の趣向は数知れない。尊敬にあたう。ただ発見を尊んでしまう私の価値観では、「知らない」がエロさとすると「知っている」が増えることは諸刃の剣なのだ。
 これからも、「知らない」を探していきたい。

重回帰と制約条件

ビジネスの要請

 多くのビジネスにおいて「この数字は何をいじれば変わるのか」に対する回答を迫られる。この時、因果の検証を目的とした重回帰や、変数への考察から因子分析を行うことが考えられる。しかし、多くの陥穽に気付かず、単純なプログラムのコピペによる結果を解釈することほど哀しいものもない。

 ここで予測ではなく、解釈可能性=特徴量重要度の観点から幾つか検証と理解の整理を試みた

重回帰と信憑性

 予測ではなく、解釈可能性=特徴量重要度の観点から幾つか検証と理解の整理を試みた。ボストン市の住宅価格データを使用する。

# 必須モジュール
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

# データ読み込み
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['PRICE'] = boston.target

# 説明変数、目的変数を定義
X, y = boston.data, boston.target

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size =0.8, random_state=0)

 重回帰では、各種特徴量がみられる statsmodels のほうがscikit-learnより好み。定数項を入れるのはやや面倒。

import statsmodels.api as sm

# 回帰モデル作成
mod = sm.OLS(y_train, sm.add_constant(X_train))

# 訓練
result = mod.fit() 

# 統計サマリを表示
print(result.summary())

    OLS Regression Results                            
==============================================================================
Dep. Variable:                  PRICE   R-squared:                       0.773
Model:                            OLS   Adj. R-squared:                  0.765
Method:                 Least Squares   F-statistic:                     102.2
Date:                Sun, 20 Jun 2021   Prob (F-statistic):          9.64e-117
Time:                        21:52:40   Log-Likelihood:                -1171.5
No. Observations:                 404   AIC:                             2371.
Df Residuals:                     390   BIC:                             2427.
Df Model:                          13                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         38.0917      5.522      6.898      0.000      27.234      48.949
CRIM          -0.1194      0.037     -3.257      0.001      -0.192      -0.047
ZN             0.0448      0.014      3.102      0.002       0.016       0.073
INDUS          0.0055      0.063      0.087      0.931      -0.119       0.130
CHAS           2.3408      0.902      2.595      0.010       0.567       4.115
NOX          -16.1236      4.212     -3.828      0.000     -24.404      -7.843
RM             3.7087      0.458      8.106      0.000       2.809       4.608
AGE           -0.0031      0.014     -0.218      0.828      -0.031       0.025
DIS           -1.3864      0.214     -6.480      0.000      -1.807      -0.966
RAD            0.2442      0.070      3.481      0.001       0.106       0.382
TAX           -0.0110      0.004     -2.819      0.005      -0.019      -0.003
PTRATIO       -1.0459      0.137     -7.636      0.000      -1.315      -0.777
B              0.0081      0.003      2.749      0.006       0.002       0.014
LSTAT         -0.4928      0.054     -9.086      0.000      -0.599      -0.386
==============================================================================
Omnibus:                      141.494   Durbin-Watson:                   1.996
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              629.882
Skew:                           1.470   Prob(JB):                    1.67e-137
Kurtosis:                       8.365   Cond. No.                     1.55e+04
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.55e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

 この結果から、決定係数、係数、t値、p値あたりをパッとみつつ説明変数の重要度をみることができる。そしてVIF計算して多重共線性を疑ったり、交絡因子を考えたり、ステップワイズ法なり主成分分析から変数減らしたり、操作変数法云々と、兎に角こねくり回すのが重回帰におけるプロセスになる。

 だがビジネス側の要請として、変数を落としたくない!でも係数はマイナスになる筈がない!特徴量重要度として列挙するんだ!という話があるのではないだろうか(あった)

 その意味の在処はさておき、そんな話が振ってきたらどうすればよいのか。結論として、制約条件をかけた最適化処理が必要となるであろう。ここの備忘録を記す。 


 係数のマイナスを許さない法 

 重回帰における最小二乗法は行列式で比較的容易に表現できる。そこで係数がマイナスなのが嫌ならば、マイナスにしなければ良いのだ。決定係数の行方は如何に。 

# 普通の重回帰
class LinearRegression1:
    def __init__(self):
        self.w_ = None

    def fit(self, X, y):
        # 切片の計算のため先頭列に1を追加
        X = np.insert(X, 0, 1, axis=1)
        self.w_ = np.linalg.inv(X.T @ X) @ X.T @ y

    def predict(self, X):
        X = np.insert(X, 0, 1, axis=1)
        return X @ self.w_
    
    def score(self, X, t):
        #残差の分散を求める
        u = ((t - self.predict(X))**2).sum()
        #実測値の分散を求める
        v = ((t - t.mean())**2).sum()
        #決定係数を返す       
        return 1 - u/v

# 結果出力
clf1 = LinearRegression1()
clf1.fit(X_train, y_train)
print(clf1.score(X_test,y_test))

# 横軸がy(実際値)、縦軸がy-y_pred(誤差)
y_pred1 = clf1.predict(X)
plt.figure(figsize=(6, 6))
plt.hlines([0], min(y)-5, max(y) , color='blue')
plt.scatter(y, y - y_pred1, color='red', marker='o', alpha=0.2)
plt.xlabel('y')
plt.ylabel('y - y_pred1');

# 係数確認
coef_df = pd.DataFrame(clf1.w_[1:],
                       index=boston.feature_names,
                       columns=['clf1'])
coef_df

 Scipyは、Non-negative least squaresを有している。sklearnで作っておく。

# NLS 係数非負 重回帰
from scipy.optimize import nnls

class LinearRegression2:
    def __init__(self):
        self.w_ = None

    def fit(self, X, y):
        # 先頭列に1を追加
        # 追加の理由は先ほどの説明を参照(切片の計算のため)
        X = np.insert(X, 0, 1, axis=1)
        #self.w_ = np.linalg.inv(X.T @ X) @ X.T @ y
        self.w_ = nnls(X,y)[0]
        
    def predict(self, X):
        X = np.insert(X, 0, 1, axis=1)
        return X @ self.w_
    def score(self, X, t):
        #残差の分散を求める
        u = ((t - self.predict(X))**2).sum()
        #実測値の分散を求める
        v = ((t - t.mean())**2).sum()
        #決定係数を返す       
        return 1 - u/v

clf2 = LinearRegression2()
clf2.fit(X_train, y_train)
print(clf1.score(X_test,y_test))

coef_df['clf2'] = clf2.w_[1:]
coef_df.round(2)

# 横軸がy(実際値)、縦軸がy-y_pred(誤差)
y_pred2= clf2.predict(X)
plt.figure(figsize=(6, 6))
plt.hlines([0], min(y)-5, max(y) , color='blue')
plt.scatter(y, y - y_pred2, color='red', marker='o', alpha=0.2)
plt.xlabel('y')
plt.ylabel('y - y_pred2');

 Scipyは、完全な0も困る場合は、lsq_linearで。

from scipy.sparse import rand
from scipy.optimize import lsq_linear

class LinearRegression3:
    def __init__(self):
        self.w_ = None

    def fit(self, X, y):
        # 先頭列に1を追加
        # 追加の理由は先ほどの説明を参照(切片の計算のため)
        X = np.insert(X, 0, 1, axis=1)
        #self.w_ = np.linalg.inv(X.T @ X) @ X.T @ y
   # 0.01 ~ 100 にする場合はboundsで指定
        res = lsq_linear(X, y, bounds=(0.01, 100), lsmr_tol='auto', verbose=1)
        self.w_ =res.x
        
    def predict(self, X):
        X = np.insert(X, 0, 1, axis=1)
        return X @ self.w_


 ちな決定係数は準に、0.76, 0.41, 0.17という悲惨な結果。しかし良いのだ。。問題は係数を負にしないことだけなのだから、、、


ところでランダムフォレストでお茶は濁せないのか?

 ランダムフォレストつまりは決定木における特徴量重要度(Gain)は、多重共線性の影響を受けないわけでは勿論ない。だが、係数として顕現しないので説明時にはごまかせるのではないか…?

qiita.com


# 自由度調整済みr2を算出
def adjusted_r2(X,Y,model):
    from sklearn.metrics import r2_score
    import numpy as np
    r_squared = r2_score(Y, model.predict(X))
    adjusted_r2 = 1 - (1-r_squared)*(len(Y)-1)/(len(Y)-X.shape[1]-1)
    #yhat = model.predict(X) \ #SS_Residual = sum((Y-yhat)**2) \ #SS_Total = sum((Y-np.mean(Y))**2)
    #r_squared = 1 - (float(SS_Residual))/ SS_Total
    return adjusted_r2

# 予測モデルの精度確認の各種指標を算出
def get_model_evaluations(X_train,Y_train,X_test,Y_test,model):
    from sklearn.metrics import explained_variance_score
    from sklearn.metrics import mean_absolute_error
    from sklearn.metrics import mean_squared_error
    from sklearn.metrics import mean_squared_log_error
    from sklearn.metrics import median_absolute_error

   # 評価指標確認
   # 参考: https://funatsu-lab.github.io/open-course-ware/basic-theory/accuracy-index/
    yhat_test = model.predict(X_test)
    return "adjusted_r2(train)     :" + str(adjusted_r2(X_train,Y_train,model)) \
         , "adjusted_r2(test)      :" + str(adjusted_r2(X_test,Y_test,model)) \
         , "平均誤差率(test)       :" + str(np.mean(abs(Y_test / yhat_test - 1))) \
         , "MAE(test)              :" + str(mean_absolute_error(Y_test, yhat_test)) \
         , "MedianAE(test)         :" + str(median_absolute_error(Y_test, yhat_test)) \
         , "RMSE(test)             :" + str(np.sqrt(mean_squared_error(Y_test, yhat_test))) \
         , "RMSE(test) / MAE(test) :" + str(np.sqrt(mean_squared_error(Y_test, yhat_test)) / mean_absolute_error(Y_test, yhat_test)) #better if result = 1.253


# 必須モジュール
import xgboost as xgb
import matplotlib.pylab as plt
from sklearn.ensemble import RandomForestRegressor


# 説明変数、目的変数を定義
X = df.drop('PRICE', axis=1)
y = df['PRICE']

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size =0.8, random_state=1)

# sklearnによるランダムフォレスト
rf_reg = RandomForestRegressor(n_estimators=10)
rf_reg = rf_reg.fit(X_train, y_train)
fti = rf_reg.feature_importances_

print('Feature Importances:')
for i, feat in enumerate(boston['feature_names']):
    print('\t{0:10s} : {1:>.6f}'.format(feat, fti[i]))

# 結果評価
get_model_evaluations(X_train,y_train,X_test,y_test,rf_reg)

######################################
# xgboost による回帰①

# Dmatrix作りつつ、説明変数は入れておく
dtrain = xgb.DMatrix(X_train, label=y_train,feature_names=boston['feature_names'])
dtest = xgb.DMatrix(X_test, label=y_test,feature_names=boston['feature_names'])

# 回帰パラメタ設定
xgb_params = {"objective": "reg:linear", "eta": 0.1, "max_depth": 6, "silent": 1}
num_rounds = 100

# 学習
gbdt = xgb.train(xgb_params, dtrain, num_rounds)

# 特徴量重要度を、weight と gainで出したい
fig = plt.figure(figsize=(13, 5))
ax1 = plt.subplot(121)
ax1 = xgb.plot_importance(gbdt, ax=ax1,importance_type='weight')
ax2 = plt.subplot(122)
ax2 = xgb.plot_importance(gbdt, ax=ax2,importance_type='gain')


######################################
# xgboost による回帰②
model_A = xgb.XGBRegressor(feature_names=boston['feature_names'])
model_A.fit(X_train, y_train)
get_model_evaluations(X_train,y_train,X_test,y_test,model_A)


y_train_pred = model_A.predict(X_train)
y_test_pred = model_A.predict(X_test)

from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error

print('MSE   train: %.3f,  test: %.3f' % (
        mean_squared_error(y_train, y_train_pred),
        mean_squared_error(y_test, y_test_pred)))
print('RMSE  train: %.3f,  test: %.3f' %(
        np.sqrt(mean_squared_error(y_train, y_train_pred)),
        np.sqrt(mean_squared_error(y_test, y_test_pred))))
print('R^2   train: %.3f,  test: %.3f' % (
        r2_score(y_train, y_train_pred),
        r2_score(y_test, y_test_pred)))



# feature importance のプロット
import pandas as pd
import matplotlib.pyplot as plt
importances = pd.Series(model_A.feature_importances_, index = boston.feature_names)
importances = importances.sort_values()
importances.plot(kind = 'barh')
plt.title('XGBRegressorの重要度')
plt.show()


fig = plt.figure(figsize=(13, 5))
ax1 = plt.subplot(121)
ax1 = xgb.plot_importance(model_A, ax=ax1,importance_type='weight')
ax2 = plt.subplot(122)
ax2 = xgb.plot_importance(model_A, ax=ax2,importance_type='gain')

import shap
shap.initjs()
explainerA = shap.TreeExplainer(model = model_A)
shap_valuesA = explainerA.shap_values(X = X_train)

とくに、単調整制約という概念を学んだ。

entre-temps.hatenablog.com

決定木で別れるノードの重みを、親兄弟の平均を境界として決める事で木全体の単調整を担保できる模様。Xgboostだと、parameterで指定可能というのもそそる仕様だ。

# 単調性制約を課した XGBoost で回帰モデルを構築します.
print(X_train.shape)
model_B = xgb.XGBRegressor(monotone_constraints=(1,1,1,1,1,1,1,1,1,1,1,1,1))
#model_B = xgb.XGBRegressor(monotone_constraints=(0,0,0,0,0,0,0,0,0,0,0,0,0))
model_B.fit(X_train, y_train)
get_model_evaluations(X_train,y_train,X_test,y_test,model_B)


shap.initjs()
explainerB = shap.TreeExplainer(model = model_B)
shap_valuesB = explainerB.shap_values(X = X_train)
shap.summary_plot(shap_valuesB, X_train, plot_type = "bar")



結果に対する解釈については、もう少し時間を取ってゆっくり考えることとしたい。一旦。

キャスティング妄想 『あげくの果てのカノン』実写化があるのなら

 

あげくの果てのカノン

3年前位に知ってすきだった漫画。ご存じない方は是非。

あげくの果てのカノン - Wikipedia

あげくの果てのカノン』(あげくのはてのカノン)は、米代恭による日本青年漫画地球外生命体の侵略を受けた近未来の東京を舞台に、長年恋焦がれていた男性との不倫に走る女性を描いた恋愛漫画[3]

f:id:yoshi_2210:20210612222337p:plain

 

妻と一緒に架空のキャスティングを妄想してみると、結構合意できたし楽しかった。

キャスティング希望

ストーリーへの世の中の風当たり的に、実写化は困難かもしれない。

だがもしも、可能性があるのならば、こちらで実写化して頂けると泣いて劇場に課金しますという意思表示をインターネットに残したいと思う。

 

f:id:yoshi_2210:20210612222828j:plain

キャスティング妄想

う~ん、良さ。

もう一回読み直そう。

 

 

自然言語処理(NLP)をやりたい 環境構築編 (Python,Mecab,Cabocha,KHcoder)

自然言語処理できるようになりたい

 日本語NLPで知ったような事が言いたいので、浅く広く急いで勉強する

とりあえす使いたいNLPのソフトウェア

 基本言語:Python

 形態素解析Mecab

 係り受け解析:CaboCha

 (計量テキスト分析:KH Coder)

環境構築① ローカル環境

 構成

  windows10 64bit

  python 3.7.6

  Anaconda 1.7.2

  Mecab 公式32bit 0.996

  CaboCha 公式 0.69

  Mecab-python バインド mecab

 情報散在混乱しすぎで焦る

  大目的はKH Coder以外はPythonで全部操作できるようにすること。

  まず必要ソフトとPython環境の選定フローの存在に気付くのに時間を要した。

  • 前提1:Mecab/Cabochaは単体ソフトウェアで、Pythonから使うならバインディングの為に非公式ライブラリをpipしないと動かない(当然)
  • 前提2:Mecabは公式32bitと野良ビルド64bitがあり、Python32bit/64bitと対応させる必要がある
  • 前提3:CMDはshift-jisだけどPythonはむり、Mecab/CaboChaはutf-8でインストール
  • 前提4:CabochaはMecab公式32bitでないと動かない(まじか)
  • 前提5:WindowsのWheelでVisual C++必要な場合あるから入れといた方がいい

 実施したこと

  1. Mecab32bit、Cabochaを utf-8でインストールしてそれぞれPATHを通す
  2. cmd mecab, cmd cabochaで文字化けしてても作動はしてることを確認
  3. KH coder はひっかりなく起動まで実施
  4. Anaconda Prompt で 32bit Python で仮想環境を構築してからのconda activate
  5. pip install mecabPythonMecabバインディングして、Import MeCabをOKに
  6. Python&Cabochaのバインディング連携を諦めて、Subprocessで動かす(各種Web記事参考にしても解らんので諦念)

 *なぜかPython64bitでもMeCabが動くが神々のいたずらと思って放置

環境構築② Google Colaboratory 

 ローカル環境構築も毎度ながら大変面倒でふと、Google Colaboなら秒で終わるのでは?と思い先人をググるそれっぽいのがあった。神々の偉大さに感謝しながら下記をコピペして起動確認終了。ローカル環境構築の苦労なぞ何のそのである

 !でコマンドになるのがGoogle Colaboの仕様。ただ何もしないと追加インストールしたパッケージ等は消えるらしいので、自分のGoogle Driveマウントした後は下記リンクのような対応が必要。

Google Colab/Drive に pip インストール: これなら消えない😃 - GGCS ごたごた気流調査所

環境構築コード

MecabCaboChaおよびCaboChaの実行に必要なCRF++インストール

# MeCabのインストール

!apt install mecab libmecab-dev mecab-ipadic-utf8

# CRF++のソースファイルのダウンロード・解凍・インストール

FILE_ID = "0B4y35FiV1wh7QVR6VXJ5dWExSTQ"

FILE_NAME = "crfpp.tar.gz"

!wget 'https://docs.google.com/uc?export=download&id=$FILE_ID' -O $FILE_NAME

!tar xvf crfpp.tar.gz

%cd CRF++-0.58

!./configure && make && make install && ldconfig

%cd ..

# CaboChaのソースファイルのダウンロード・解凍・インストール

FILE_ID = "0B4y35FiV1wh7SDd1Q1dUQkZQaUU"

FILE_NAME = "cabocha-0.69.tar.bz2"

!wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=$FILE_ID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$FILE_ID" -O $FILE_NAME && rm -rf /tmp/cookies.txt

!tar -xvf cabocha-0.69.tar.bz2

%cd cabocha-0.69

!./configure -with-charset=utf-8 && make && make check && make install && ldconfig

%cd ..

 

総括

 ローカル環境構築に時間を要した。MecabもCabochaも飽くまでツールであり、Pythonバインディングしようがしなかろうが、基礎的なプログラムで整形し、N-gramなりに変換する必要がありそう。

 正直な感想は「うっ...めんどくさい…」なので、根幹理論は本めくりつつ、言語100本ノックをまず写経しながらアプリの挙動体験してモチベーションを保ちたい。

 

 

効果検証入門のまとめ

セレクションバイアスとRCT、介入効果を測るための回帰分析

  1. セレクションバイアスを防ぐRCT
  2. 因果推論の為の回帰分析では介入を表す共変量の係数で程度を推し量る
  3. 共変量で抜け漏れがあると、セレクションバイアスに誤差が吸収され脱落変数バイアスOVBが発生する
  4. 回帰分析による推論では、介入変数Zの決定に関連があり、目的変数Yとも相関がある変数(=交絡因子)をモデルに加えるとバイアスが低減
  5. いずれにしても共変量の選択は、実施者により変化しうるため、操作変数法や固定効果モデルが提唱されている
  6. Sensitive Analysis?
  7. 介入後に決定される値は共変量から除く
  8. Yが0/1であればロジスティック回帰、整数値であればポアソン回帰
  9. 目的変数や共変量の自然対数を取るのは、変化の割合をみるため
  10. 多重共線性の問題とは、回帰分析によるある変数kによる推定値の分散式が分母に(1-Rk) *Rk:変数kと多重共線性を起こしていると考えられる変数の相関 をもち、相関が強いと推定されたパラメータの標準誤差が大きく信頼できないという点。 だが予測ではなく介入変数以外で多重共線性がおきていても、介入効果を測る上で問題はない
  11. つまり、回帰分析は共変量の選定および線形項か非線形項かの選択が非常に難しい

傾向スコアを用いた分析

  1. 傾向スコアを用いた効果推定には、傾向スコアマッチングとIPWがある
  2. スコアマッチングは傾向スコアが類似する集団で比較を行う
  3. IPW=逆確立重み付き推定で、介入の有無で分けて、サンプルごとの傾向スコアの逆数で目的変数とN数を補正して比較する
  4. 良い傾向スコアの指標として、共変量のバランスをみるとよい
  5. つまり、目的変数の仕組みの情報が豊富なら回帰分析がよいが、そうでないなら傾向スコアを用いたい
  6. マッチングは時間がかかるが、IPWは介入/非介入の傾向差が大きいと重みによる過大過少評価により信頼しにくいことが共変量のバランスみてもわかる

差分の差分法(DID)とCasual Impact

  1. ”地域”への一括介入等、非介入データが得難い場合には、DIDが有効
  2. DIDであっても、同時に複数の介入が行われた際の影響を分離することは不可能
  3. 反実仮想としての非介入データの作り方として、他”地域”をあてがうか、非介入時データからモデリングするCasual Impactを選ぶ
  4. DIDは前提としてCTA (Common Trend Assumption)を必要とするため、近隣”地域”のデータとするか、モデリングの際にトレンド乖離を表現する共変量を加えてバイアスを下げる
  5. Casual Impactのモデリング共変量として、他”地域”の目的変数を加える事がある

回帰不連続デザイン(RDD

  1. 介入基準がランダムでもCIA (Controll Independence Assumpution)もなく、明確なカットオフで設計される場合は多くあるが、nonparametric RDDが有効
  2. カットオフ付近では疑似的なRCT状態である仮定から、参照幅を狭くすれば精度は高いが標準誤差が大きくなるトレードオフがある
  3. 他にも、DID同様に別介入が存在しないこと、カットオフ周辺でデータ密度が偏るような分析対象者の挙動ができないこと(non-manipulation)が必要

 

おみくじ

要約と目次

 

凶ってどんなこと書いてあるんだろう

さる日曜の夜、翌日からの業務への呪いに満ち溢れた私は「おみくじ 凶」で画像検索をかけて、この世にはどんな酷い宣告をうけた人々がいるのか調べることにした。

 

予想通り、凶をひいてしまったことに耐えかねて画像をネットにアップロードしている事例は散見され、小躍りしながらTwitter APIを用いて300枚程度画像を収集し、目視で関係ない画像を削除することで集まった200枚前後のおみくじ画像を読み始めた。

f:id:yoshi_2210:20210429190724p:plain

OMIKUJI_folder

だいたい凶でも「色々悪いけど、信心を怠らなければよくなるよ」の文言で結ぶものかと思えば結構辛辣に突き放す感じもあることが分かった。以下、いくつか実例紹介。

f:id:yoshi_2210:20210429192839p:plain

ノーフォローな上に具体的にキツイ例

f:id:yoshi_2210:20210429192723p:plain

ノーフォロー例2

f:id:yoshi_2210:20210429192014p:plain

シンプルすぎて打ち手がないよな。



f:id:yoshi_2210:20210429192349p:plain

前向き系

f:id:yoshi_2210:20210429192439p:plain

ド前向き系

そもそもおみくじってどうやってつくってるんでしたっけ

浅草寺のおみくじのアップロードも多く、何番が凶かリストつくれるかもなぁと考えつつ眺めていると、別神社であっても書かれた漢詩が同じ場合があることに気付く。そういえば、そもそもおみくじって誰がどこでどうやって作っているか調べていなかったので、ググると下記がわかった。

"観音籤"というベースは内容および確率が公開されており、その他もまとめサイトがある

観音籤は漢詩つけて大吉~凶までの7段階評価を用意。その他、大凶や、凶向吉などの独自評価は個別制作となる。住吉神社の15番が大凶らしい。戸隠神社は日本神話を題材にしているらしくアガる。

おみくじの制作は、明治の女性自立および資金活動の一環として連綿と山口県女子道社が制作しており。現在シェア率は70%ほどらしい

女子道社では今も印刷した後は人力で折り畳みらしいし、正月のおみくじ市場規模を100円*1億6千万*10%としても16億になるしいいビジネスかも。機械化持ちかけるワンチャンある。その他は調べ切れなかった。

おみくじを作っているところを知りたいかい?日本一の製造会社が山口県にあった!! | 神社・寺 御朱印めぐり.COM

 

最後に、一番こわいのはGoogle photoの技術力

今後も効率的におみくじ画像、凶や大凶の写真か文言を集められないかとスクレイピングとか画像認識とかツール調べながらふと、自分のGoogle photoで「おみくじ」と調べると数年前のハワイで撮った写真がでてきたのである。嘘だろ…まさか右上のOMIKUJIをOCRしているとでもいうのか…? さすがに日本語の「おみくじ」とかかれた写真は検出できなかったところからは日本語OCRまではしていないようだが、全くGoogle先生...ぱないっす。

 

f:id:yoshi_2210:20210429204620p:plain

まさかOCR…?

 

サーバーとセキュリティの備忘録

基礎事項をまとめて備忘録

 

・レイヤー層は問題の切り分けで便利と気付く

  物理層NICやLANケーブル

  データリンク層デフォルトゲートウェイMACアドレス認識

         Ping default gw ipaddress

               No reply - Arp gw問題かスイッチか

  ネットワーク層ping IP , traceroute IP

     トランスポート層Firewallの設定

  アプリケーション層:nslookup

 

ポート番号:通信するアプリケーション指定

・NATはlocal IPとglobal IPを変換、NAPTはIPとPortで変換

              Q:アクセスする時のIPは、local IP でいいのかな。ルータ/FWで固定IPとportのみ許可にしていると、手動でルータにクライアントのIPとポートを許可しないといけないのか? LAN内であればグローバルIPに変換する必要はないのかな。

 

・仮想化ソフトウェアはホストOS型(VMware, Virtual BOX)とハイパーバイザー型(VSphere, XEN Server, Hyper-V)がある。当然ホストOS型だと2段OSがいるから処理が重い。

              Q:ホストOS型だとOSのライセンス2倍で費用かかるのかな。

 

・UNX系サーバーOSの例はLinuxAIXWindows系サーバーOSの例はWindows Server 2008とか。

 

DHCPサーバ:IPアドレスの動的割り振り用

              配布IP範囲、有効期間、デフォルトゲートウェイのIP、DNSサーバのIPを設定

              家庭用レベルならルータとかFW側のDHCP機能で事足りる。

 

DNSサーバ:ドメインとIPを紐づけ。ホスト名wwwで、jpから順にツリー構造

              aaa.co.jpのサブドメインではbbb.aaa.co.jpとすればよいのかな

              キャッシュサーバーとコンテンツサーバがあって基本は冗長化

 

Active Directory:管理システム増大時の管理対応

              それ以上は今の所よくわからん:https://www.lanscope.jp/tips/12638/

              とりあえずドメインコントローラというサーバとDNSを使えば管理がしやすくなる目的だけはわかった。

 

NASってでかい外付けHDDじゃなくて、ファイルサーバ機能に特化したアプライアンスサーバだったんだ…ストレージにNICが付いたとはその通りだ。

 

・SSOサーバには、「エージェント型」「リバースプロキシ型」がある。クライアントがWebアプリケーションサーバとSSOサーバどっちと繋がるかの話か。

 

・プロキシサーバー:クライアントからのインターネットに対する通信を代理で行うサーバー

 Qプロキシサーバーとファイアウォールって何かちがうのか?

              http://tooljp.com/windows/chigai/html/Security/proxy-firewall-chigai.html

              プロキシサーバーの目的は内部のネットワーク構成(特にIPアドレス)を隠すためで、ファイアウォールはセキュリティ対策。不正なパケットが出入りしないように、フィルタリングする。プロキシサーバーはもともと回線帯域利用の効率化が目的だが、最近はセキュリティ機能の強化始めたから余計ややこしい。

              通信時のIPもプロキシサーバーではProxy IP。ファイアウォールではNATしない限りクライアントのIPアドレスだけど、普通グローバルIPにNATする。

             

SMTPサーバーはSMTPプロトコルを用いて、@以降のドメインDNSに問い合わせて相手先のSMTPサーバーへたどり着く。SMTPが認証機能を持たなかった為、なりすましを防ぐため、SMTP AUTH(メール送信前のID/PW), POP before SMTP(送信前にPOP3サーバーで認証)。受信側は電源入ってないこと多いからPULL型のPOP3プロトコルおよびPOP3サーバーで取得。POP3S機能だとSSL暗号化できる。

 

プライベートクラウドのメジャーどころはOpenStack 

 

・サービス提供開始の為には、、、

 公開サーバー用意(クラウドサービスでない限りDMZがベター。クラウドDDoS攻撃くらうと費用が掛かる)

 オンプレの場合

 クラウドの場合

 

・WebサーバーはApacheWindowsサーバーのIIS

SSLサーバーはOpenSSLかWindowsサーバーのIIS

SSLサーバーにはデジタル証明書が必要

  • 管理者はサーバーソフトウェアで秘密鍵と公開鍵つくる
  • 公開鍵をCSR(Certification signing request)として認証局(CA局)という第三者期間に提出。秘密鍵は大切にもっておく
  • CA局が与信判断して、デジタル証明書をくれる
  • デジタル証明書をサーバーにインストール

これで

  • クライアントはサーバーにアクセスするとデジタル証明書(公開鍵つき)をえる
  • サーバーの身元確認して共通鍵の下を公開鍵で暗号化して暗号化データ送信
  • サーバーは秘密鍵で復号して共通鍵を作る
  • 共通鍵で暗号化通信をする

 

FTPサーバーは暗号化されていないのでSSLで暗号化させるFTPSかSSHで暗号化させたSFTPもあり。

 

・WebアプリケーションサーバーはJavaEE.NET Frameworkで開発される。IISは.NETアプリケーションサービスを提供。

 

VPNサーバが使うプロトコルIPsec。リモートアクセスVPNではIPsec VPNと、SSLを利用するSSL-VPNがある。SSL-VPNだと専用のアプライアンスサーバがいる。

 

ファイアウォールにも、トラディショナルと、Unified Threat Management, WAFとかある。

 

・サーバー運用保守の作業分類としては、設定変更(ユーザーアカウント追加削除変更、OSやアプリケーションの更新検証と実施、OSやアプリケーションの設定調整)、トラブル事前対応(SNMPサーバの定期的性能/状態/障害監視、Syslogサーバによるエラーログ監視、バックアップ取得)、トラブル事後対応(ログ解析と対応、バックアップからのリストア)

  

・サーバのSSH(鍵をファイル指定)を使用したリモート管理