u++の備忘録

Googleトレンドで「隅田川花火大会」と調べてみた結果

 2017年7月29日18時、この時間になってようやく、隅田川花火大会が本日開催されると知りました。

 ふと、Googleトレンドで「隅田川花火大会」を調べてみると、以下のような結果が得られました。

 最もグラフが高くなっている2013年は、隅田川花火大会が初めて中止になった年でした。

www.nikkei.com

 中止になると更なる話題になるとは、流石ですね。

山本・地方創生相「アメリカのいい大学は田舎にしかない」発言を可視化して検証してみた

背景と目的

 朝日新聞デジタルは7月28日、山本幸三地方創生相の発言録として、以下のような内容*1を報じました。

(東京一極集中の是正に向けて東京23区内にある大学の定員を抑制する政府の方針に関連して)アメリカを見てみれば、よい大学は田舎にしかない。それで、ニューヨークやワシントンの国際競争力がなくなったことはない。ハーバード大はボストンの郊外にあり、スタンフォード大だって田舎にある。大学は田舎にあって全然問題がない。むしろいい勉強ができる。東大を(地方へ)移した方がよいくらいに思っている。

 この発言に関して、ハフィントンポスト日本版(HuffPost Japan)は同日、以下の記事を公開し、山本大臣の発言を批判しました*2

 山本大臣の発言も、ハフィントンポスト日本版の批判も、残念なのは恐らく個人の憶測に基づく定性的な面でしか議論できていない点です。今回の記事では、山本大臣の「アメリカのいい大学は田舎にしかない」という発言について、可能な範囲で定量的に考えてみたいと思います。

検証内容

 ここでは、今回の記事の目的のために、どのような検証をするかについて述べます。いろいろな方法があると思いますが、今回は以下を検証してみます。

「アメリカのいい大学」が東大と比べて「田舎」にあると言えるか

 この検証のために、本記事では、以下のように二つの言葉を定義しました。

  1. アメリカのいい大学
  2. 田舎

 1については、国(文科省)が国立大学改革の指標にも掲げる「世界大学ランキング」を基に定義したいと思います。今回は、英国の教育誌「タイムズ・ハイアー・エデュケーション(THE)」の最新版のランキング*3を使用します。本記事では、39位の東大より上位にランクインしたアメリカの大学21校を「アメリカのいい大学」と呼ぶことにします。

 2については、単純化して人口密度のみを指標とすることにしました。田舎については様々な定義があります。例えば大平ら*4は以下の要素を複合的に考慮して田舎(Rural)を定義しています。

  • 想定的に人口が少ない地域
  • 人口密度が低い地域
  • 第一次産業従事者の居住率が高い地域
  • 交通アクセスの困難さなどが存在する地域
  • 現行法規にある,過疎地域自立促進特別措置法離島振興法,山村振興法,へき地教育振興法則などで定義や指定されている地域

データセットの作成

 検証のため、以下のようなデータセットを作成しました。左から行は以下の情報を有しています。

  1. Rank(THEランキングの順位)
  2. Name(大学名)
  3. Overall(総合評価点)
  4. Address(大学の所在地)
  5. Population Density(人口密度)
  6. Population(人口)
  7. Area(面積)

f:id:upura:20170729162933p:plain

 最初にTHEランキングから東大より上位の22校の総合評価点を抜き出しました。その後、Google検索の情報を基に、大学がある都市の人口密度を抽出しました。都市を跨いでキャンパスが存在する大学もありますが、ここではTHEランキングで表示されている住所を基に作成しています。人口密度については、都市別にまとまっているデータベースがなく*5Google検索による断片的な情報をExcelにまとめることにしました。

データの可視化

 まず単純に総合評価点と人口密度を2次元散布図で示すと、以下のようになります。水色はアメリカのいい大学、紺色が東大です。

f:id:upura:20170729173144p:plain

[可視化のソースコード(R)]

data <- read.csv("C:\\data.csv", row.names = 1)
library(ggplot2)
library("ggrepel")

g <- ggplot(
  data,
  aes (
    x = data$PD, # 人口密度
    y = data$Overall, # 総合評価点
    colour = data$Country,
    label = rownames(data)
  )
)

g <- g +  geom_point(
  size = 3
)

g <- g + geom_text_repel()
g <- g + xlab("Population Density")
g <- g + ylab("Overall Score in THE Ranking")
g <- g + ggtitle("Relation between Population Density & Overall Score in THE Ranking")

plot(g)

 一見、「アメリカのいい大学」が東大と比べて「田舎」にあると言えそうです。しかし、そもそも日本の方が圧倒的に人口密度が高いことを忘れていはいけません。

 そこで、日本(335.79人/km2)とアメリカ(33.7人/km2)の人口密度を同列で比較できるようにデータを正規化します。具体的には、東大の所属する文京区の人口密度を、以下のように変換しました。

data[22,2] <- data[22,2]*33.7/335.79

 変換後の総合評価点と人口密度の2次元散布図を以下に示します。「アメリカのいい大学」と東大を比べても、そこまで違いがあるとは言えない結果となりました。

f:id:upura:20170729173249p:plain

 特に16位のコロンビア大学や32位のニューヨーク大学は、ニューヨーク州ニューヨーク市にあり、とても田舎にあるとは言えなさそうです。

おわりに

 今回の記事では、山本大臣の「アメリカのいい大学は田舎にしかない」という発言について、適宜簡略化や仮定を置きながら定量的に検証しました。今回の記事の仮定の下では、東大と比べて「アメリカのいい大学は田舎にしかない」と言い切ることはできないという結果になりました。

 今回の記事を通して強調したいのは「定性的な視点だけでなく大雑把な仮定を置いてでも定量的に議論してみては」ということです。定性的な視点だけだと水掛け論になってしまいがちな議論も、定量的にやろうとすると少しは具体的かつ建設的な議論になるのではないかと思います。

(例えば今回の記事で言えば「田舎を人口密度だけで定義してよいのか」「アメリカと日本の人口密度を同列で比較するためにこんな正規化でよいのか」など)

脚注

*1:www.asahi.com

*2:www.huffingtonpost.jp

*3:www.timeshighereducation.com

*4:大平ら: 日本におけるルーラルナーシングの役割モデルについての研究, 三重県立看護大学紀要, 6, 75-84, 2002. PDFへのリンク

*5:正確にはWorld Cities Database | Simplemaps.comというサイトで有料でダウンロードできそうです

正準相関分析に関する文献

 『画像認識』(機械学習プロフェッショナルシリーズ)の第3章「統計的特徴抽出」に登場した正準相関分析について、更なる理解の参考になりそうな文献。以下は書籍における説明を抜粋した。

正準相関分析(canonical correlation analysis, CCA)は,複数の情報源に共通して含まれる情報を抽出する次元削減方法です.射影された2つの変量の相関が高くなるような線形部分空間を求めます

 後ほど読み込んで要点をまとめたい。

Canonical correlation analysis

W Härdle, Z Hlávka - Multivariate Statistics: Exercises and Solutions, 2007 - Springer
Link to Information
Link to PDF

『画像認識』における統計的特徴抽出手法の可視化 Pythonでの実装

 『画像認識』(機械学習プロフェッショナルシリーズ)の第3章「統計的特徴抽出」に登場した手法について、Pythonで実装しようと思います。

www.kspub.co.jp

 この章で紹介されている手法は、以下の5つです。

  1. 主成分分析
  2. 白色化
  3. フィッシャー線形判別分析
  4. 正準相関分析
  5. 偏最小2乗法

 データセットとしては、iris datasetを使います。

import matplotlib.pyplot as plt
from sklearn import datasets

iris = datasets.load_iris()

Y = iris.target
X = iris.data[:,2:]
length = X[:,0]
breadth = X[:,1]

plt.plot(length[0:50],breadth[0:50],'o',label='setosa')
plt.plot(length[50:100],breadth[50:100],'o',label='versicolor')
plt.plot(length[100:150],breadth[100:150],'o',label='virginica')
plt.xlim([0,8])
plt.ylim([-1,3])
plt.xlabel('length')
plt.ylabel('breadth')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722154250p:plain

1. 主成分分析

主成分分析(principle component analysis, PCA)は,線型空間におけるデータの分布をある基準で最もよく近似する,低次元の部分空間を求める次元削減法です

 この章では、分散最大化を基準とした主成分分析を紹介しています。
 詳細は割愛しますが、ざっくりと説明すると分散(データの散らばり)の大きい方向で新しい評価軸を見つけ、データを再構成する手法です。

# PCA
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca.fit(X)
X_pca = pca.transform(X)

plt.plot(X_pca[0:50,0],X_pca[0:50,1],'o',label='setosa')
plt.plot(X_pca[50:100,0],X_pca[50:100,1],'o',label='versicolor')
plt.plot(X_pca[100:150,0],X_pca[100:150,1],'o',label='virginica')
plt.xlim([-4,4])
plt.ylim([-2,2])
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722154421p:plain

2. 白色化

主成分分析の応用例として白色化(whitening)があげられます.白色化とは,異なる変数を無相関化しスケールをそろえる手法で,データの前処理として頻繁に活用されます

# whitening
import numpy as np

mean = np.mean(X,0)
cov = np.cov(X, rowvar=0)
v, S = np.linalg.eig(cov)
Lambda = np.dot(np.dot(np.linalg.inv(S), cov), S)
xmu =  X - mean
Lambda_invhalf = np.linalg.inv(np.sqrt( np.diag (Lambda) ) * np.identity(2))
X_whiten =xmu.dot(S).dot(Lambda_invhalf.transpose())

plt.plot(X_whiten[0:50,0],X_whiten[0:50,1],'o',label='setosa')
plt.plot(X_whiten[50:100,0],X_whiten[50:100,1],'o',label='versicolor')
plt.plot(X_whiten[100:150,0],X_whiten[100:150,1],'o',label='virginica')
plt.xlim([-3,3])
plt.ylim([-4,4])
plt.title('whiten')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722161331p:plain

3. フィッシャー線形判別分析

フィッシャー線形判別分析(Fisher linear discriminant analysis, Fisher LDA)は,教師情報が得られたときに,クラスの分離を強調するような射影を求める次元削減法です

 主成分分析はデータ全体の散らばりを最大化するような空間への変換を行いますが、これは必ずしも分類に適した変換とは限りません。
 フィッシャー線形判別分析は各クラス内分散を最大化する手法です。

 次の記事の説明が、イメージをつかみやかったです。
s0sem0y.hatenablog.com

# Fisher LDA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(X, Y)
X_lda = lda.transform(X)

plt.plot(X_lda[0:50,0],X_lda[0:50,1],'o',label='setosa')
plt.plot(X_lda[50:100,0],X_lda[50:100,1],'o',label='versicolor')
plt.plot(X_lda[100:150,0],X_lda[100:150,1],'o',label='virginica')
plt.title('Fisher LDA')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722170414p:plain

[追記 170726]
ちなみにn=1のときは、次のような結果を得ました。

# Fisher LDA n=1
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
lda = LinearDiscriminantAnalysis(n_components=1)
lda.fit(X, Y)
X_lda = lda.transform(X)

plt.plot(X_lda[0:50,0],'o',label='setosa')
plt.plot(X_lda[50:100,0],'o',label='versicolor')
plt.plot(X_lda[100:150,0],'o',label='virginica')
plt.title('Fisher LDA (n=1)')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170726081516p:plain

[追記終]

4. 正準相関分析

正準相関分析(canonical correlation analysis, CCA)は,複数の情報源に共通して含まれる情報を抽出する次元削減方法です.射影された2つの変量の相関が高くなるような線形部分空間を求めます

# CCA
from sklearn.cross_decomposition import CCA
cca = CCA(n_components=2)
cca.fit(X, Y)
X_cca = lda.transform(X)

plt.plot(X_cca[0:50,0],X_cca[0:50,1],'o',label='setosa')
plt.plot(X_cca[50:100,0],X_cca[50:100,1],'o',label='versicolor')
plt.plot(X_cca[100:150,0],X_cca[100:150,1],'o',label='virginica')
plt.xlim([-8,9])
plt.ylim([-4,4])
plt.title('CCA')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722171446p:plain

5. 偏最小2乗法

偏最小2乗法(partial least squares, PLS)は正準相関分析と同様に,複数情報源に共通して含まれる情報を抽出する方法です.ただし,正準相関分析は2変量の相関最大化で定式化されますが,偏最小2乗法は2変量の共分散最大化で定式化されます

# PLS
from sklearn.cross_decomposition import PLSRegression
pls2 = PLSRegression(n_components=2)
pls2.fit(X, Y)
X_pls = pls2.transform(X)

plt.plot(X_pls[0:50,0],X_pls[0:50,1],'o',label='setosa')
plt.plot(X_pls[50:100,0],X_pls[50:100,1],'o',label='versicolor')
plt.plot(X_pls[100:150,0],X_pls[100:150,1],'o',label='virginica')
plt.xlim([-3,3])
plt.ylim([-1,1])
plt.title('PLS')
plt.legend(loc='lower right')
plt.show()

f:id:upura:20170722172059p:plain

おわりに

 正直なところ、各手法の特徴が可視化された結果のどこに現れているかは、まだ十分に読み取れていません。その辺りを今後分析し、追記していく予定です。

【遊戯王デュエルリンクス】4ターン目でデッキ0枚 高速デッキ破壊デッキ

 うまく動くと4ターン目にも相手のデッキを0枚にできる高速デッキ破壊デッキを作りました。

f:id:upura:20170718015816j:plain

 例えば「連鎖破壊」を自らの「ウォーム・ワーム」に対して発動し、手札・デッキから2枚の「ウォーム・ワーム」を破壊。さらに召喚した「ウォーム・ワーム」は「本陣強襲」で破壊します。この3枚のコンボで計11枚のデッキを破壊できます。

f:id:upura:20170718015325p:plain
f:id:upura:20170718015609p:plain
f:id:upura:20170718015614p:plain

 スキル「デュエルスタンバイ」の効果で初期のデッキ枚数が15枚になっていることもあり、かなりの速度で相手のデッキを削られます。安定性を考慮して「イクタァの暴風」や「陽動作戦」もデッキに入れています。

デッキレシピ

f:id:upura:20170718015232p:plain

ヒアリの画像識別分類器を作るのに良さげな「AntWeb」

最近、強い毒を持つ南米原産のアリ「ヒアリ」が日本国内で数例発見され、注目が集まっています。
www.nikkei.com

暇な時にでも画像からアリの種類を分類するアルゴリズムを実装しようかと思い、最初にデータを探していたところ、良さげなデータベースを見つけました。

www.antweb.org

AntWeb is the world's largest online database of images, specimen records, and natural history information on ants.

ヒアリ(学名・Solenopsis invicta)含め、体系的にアリが管理されています。
Species: Solenopsis invicta - AntWeb

画像もアップロードされています。
f:id:upura:20170708142527p:plain
Species: Solenopsis invicta - AntWeb

APIも整備されているようです。
Antweb API

[追記 20170708 19:40]
なんかヒアリ学習済みのAPIが公開されてるらしい。
dotnsf.blog.jp

matplotlibでラベルの向きを変える

Pythonによる勾配降下法の実装 - u++の備忘録の記事で、以下のような図を作成した。

f:id:upura:20170705111311p:plain

y軸のラベルは横を向いている。これで全く問題ないのだが、ラベルの向きを変えたい場合には、次のように"rotation"のオプションを指定すれば良い。

import numpy as np
import matplotlib.pyplot as plt

def J(x):
    return x*(x-4)+5

n = 100
x = np.linspace(0, 5, n)
np.random.seed(seed = 32)
stack = [] # プロット用のリスト

# Graph
plt.xlim(-1, 6)
plt.ylim(-1, 8)
plt.xlabel(r"$\omega$")
plt.ylabel(r"$J(\omega)$", rotation=0)
plt.plot(x, J(x), "b")
plt.show()

f:id:upura:20170705165941p:plain