Ch_1 競争 ー 正しい考え方|『[エッセンシャル版]マイケル・ポーターの競争戦略』読解メモ #2

f:id:lib-arts:20190625182650p:plain

本の選定などの経緯は#1にまとめました。

#1では「はじめに」で記述されていた、本の概要についてまとめました。#2では第1章の内容として「競争 ー 正しい考え方」についてまとめていきます。
以下、目次になります。
1. 冒頭部
2. なぜ最高を目指すべきでないのか?
3. 独自性を目指す競争
4. 感想・まとめ



1. 冒頭部(簡単な要約)
GEのジャック・ウェルチが述べたような「GEの戦略は全ての事業で一位か二位になることだ」などはポーターのいう「戦略」の基準を満たさない。ポーターのいう「戦略」とは、好業績を持続的にもたらす優れた競争戦略のことであるとされている。戦略は競争にさらされた企業がいかにして卓越した業績をあげるかについての方法を説明する。この定義は単純そうだがそうではない。
経営陣は競争の本質と仕組みを誤解しがちであるため、競争をどのように捉えるかでどのような競争方法を選択するかが決まることに注意しなければならない。競争を正しく理解することで、あり得る選択肢を批判的に分析できるようになるため、戦略について考える前にまず競争と競争優位という問題に取り組む必要がある。

 

2. なぜ最高を目指すべきでないのか?(簡単な要約)
マイケル・ポーターの名付ける「最高を目指す競争」に対し、ポーター自身は競争に対する全く誤った考え方であるとしている。ビジネスではライバルを壊滅させずとも勝利を得ることができるのにも関わらず、戦争のように勝つのがどちらか一方であるような敵を無力化し破壊するようなやり方をしてしまいがちである。
ビジネスでは複数の勝者が反映、共存することができ、このような競争においては競合他者を破壊することではなく、顧客のニーズを満たすことに焦点を置くと良い。ビジネスの競争はスポーツと違い、戦いの形式はより複雑で自由で多面的である。そのため、同じ業界内でも、対象とする顧客やニーズごとに、一つではなく複数の競争が繰り広げられる。

・たいていの事業には「最高」なるものは存在しない。
一例として空港の待合エリアの座席のようなごく一般的な製品について考えたときでさえも、空港によってニーズが異なり「最高の」空港の座席が存在しないことがわかる。経済を構成する全ての業界を考えてみても、ほとんどの業界が異なるニーズを持つ、実に多様な顧客を抱えている。ある顧客にとって最高のカスタマーサービスが他の人にとって最高とは限らない。
生産や物流、マーケティングといった機能を実行する方法についてもこれといった最善の方法はない。
そんなわけで、最高を目指す競争の第一の問題点は、組織が最高を目指すことで自らに不可能な目標を課してしまうことである。このようにして最高を目指す競争は、誰も勝てない破壊的なゼロサム競争と化す。製品・サービスの同質化が進み、誰かの利益は他の誰かの損失になる。勝利が誰かの敗北によって成り立つものとなってしまう。

・全ての競合企業が「唯一最善の」方法で競争すれば、衝突コースをまっしぐらに進むことになる。
全ての競合企業が同じ視点での「唯一最善」で競争してしまうと、全ての企業が同じ顧客を追いかけることで必ず競争が生じてしまう。ポーターはこれを『競争の収斂』と呼んでいる。航空会社や家電事業、PC業界などの多くのビジネスにおいてこれが生じている。注目すべき例外はアップルで、アップルはPC業界の大手企業としては珍しく、一貫して独自路線を歩んでいる。
このような『競争の収斂』による価格圧力が業界の収益性を破壊するときには、合併を通じて競争を制限することで事態を打開できる場合が多い。

・「最高のもの」は顧客のためになるのではないのか?
一見価格の低下は顧客にとって良いことのように思われる。が、企業が最高を目指して競争するとき、価格は低下するものの選択肢が減少するかもしれず、それによって結局顧客にとってのメリットが損なわれるかもしれない。業界が標準的な製品・サービスに向かって同質化すれば、「平均的」な顧客は恩恵にあずかるが、要求の多い顧客と少ない顧客のニーズを満たすことができない。
選択肢が限られるとき、価格が破壊されることが多い。が、このとき顧客は欲しくもない余計なものに費用を払わされているか、本当に必要なものではないので、企業が提供するもので仕方なく間に合わせているかのどちらかになってしまう。

 

3. 独自性を目指す競争(簡単な要約)
ポーターのいう戦略的競争とは、他社と異なる道筋を選ぶことをいう。企業は最高を目指して競争する代わりに、独自性を目指して競争することができるし、そうすべきである。この競争では価値が全てで、生み出す価値の独自性と、それを生み出す方法がものをいう。

・戦略的競争とは、他社と異なる道筋を選ぶことをいう
独自性を目指す競争は、競争の本質に関する異なる見方を反映している。ライバル企業を完璧に模倣することではなく、自らが選んだ顧客のために一層大きな価値を生み出すことに焦点をおいている。顧客には多くの選択肢が開かれるため、価格は競争の一変数でしか無くなる。
独自性を目指す競争が戦争と違うのが、ある一社が勝つために競合他社が負ける必要がない点などもある。戦争やスポーツというよりも舞台芸術に近く、一人一人が独自の方法で注目を集めることで、それぞれが観客を獲得し、新しい顧客を生み出す。優れたパフォーマーが増えれば増えるほど観客層は厚みを増し、芸術が栄え、プラスサムの競争となる。現実の競争には数多くの次元があり、戦略とは一つだけではなく様々な次元での選択に関わることである。
なぜ一部の企業が他よりも収益性が高いかについては二つの部分があり、詳細はそれぞれ第2章と第3章で取り扱うが、第一に「企業は業界構造によって恩恵を受けることも痛手を受けることもあること」、第二に「企業が業界内で占める相対的なポジショニングは企業間の違いをもたらすさらに大きな要因であること」がある。


4. 感想・まとめ
#2で取り扱った競争については、戦争やスポーツのような同一の価値基準における勝利を目指すと、うまくいかないので独自性での競争をすべきだというのがありました。いわゆるニッチャー戦略の話であり、アップルが具体例として挙がっていたのが非常に興味深かったです。
概ね直感的には理解していた内容でしたが、違った視点から眺めることで多角的に見えて良かったと思います。
続く#3では第2章の五つの競争要因について取り扱います。

公式ドキュメントやチュートリアルを元にPyTorchの概要を把握する|DeepLearningの実装 #8

f:id:lib-arts:20190620151942p:plain

#2~#7まではTensorFlowのチュートリアルについて取り扱ってきました。

Tutorial実装で確認するTensorFlow①(Tutorialsの概要とMNIST問題のサンプル実装の確認)|DeepLearningの実装 #2 - lib-arts’s diary

Tutorial実装で確認するTensorFlow②(MobileNetによる画像分類とTensorFlow Hub)|DeepLearningの実装 #3 - lib-arts’s diary

Tutorial実装で確認するTensorFlow③(MobileNetによる転移学習)|DeepLearningの実装 #4 - lib-arts’s diary

Tutorial実装で確認するTensorFlow④(Pix2Pixの概要と実装)|DeepLearningの実装 #5 - lib-arts’s diary

Tutorial実装で確認するTensorFlow⑤(Simple Audio Recognition_前編)|DeepLearningの実装 #6 - lib-arts’s diary

¥下記の記事で物体検出(Object Detection)系のトレンドを調べていたら、2018年11月時点でSOTAとなったM2Detの著者実装がPyTorchのようなので、#8ではPyTorchの入門として公式ドキュメントやチュートリアルを元に概要をまとめたいと思います。

https://lib-arts.hatenablog.com/entry/object_detection3
下記のM2Detの著者実装を読み解いていけるだけの概要や基本的な書き方について抑えるのを目標とします。

GitHub - qijiezhao/M2Det: M2Det: A Single-Shot Object Detector based on Multi-Level Feature Pyramid Network

以下目次になります。
1. PyTorchの概要
2. インストール&簡易実行
3. まとめ


1. PyTorchの概要
1節ではPyTorchの概要についてまとめます。まずはWikipediaから引用します。

f:id:lib-arts:20190620154023p:plain

PyTorch - Wikipedia
以下簡単に要約します。
要約:『PyTorchはコンピュータのソフトウェアで、Torchライブラリに基づいて自然言語処理(NLP; Natural Language Processing)のような用途に用いられる、プログラミング言語Pythonから呼び出される機械学習ライブラリである。PyTorchは主にはFacebookのAI研究チーム(FAIR)によって開発され、Uberの確率的なプログラミング言語であるPyroも中に組み込まれている。フリーのOSSで、BSDライセンスに基づいてリリースされている。PyTorchは二つの特徴を持っており、「NumPyのようなTensor計算をGPUを介して高速化する」と「tape-based autodiff systemにおいて組み立てられる深層のニューラルネットである」の二つが挙げられています。』
"tape-based autodiff"など、一部わからないことも書いてありますが、この辺はPyTorch独自の仕様と思われるため、一旦気にせず話を進めて良さそうです。

f:id:lib-arts:20190620155223p:plain

また、上記ではModuleについて言及されており、"Autograd module"、"Optim module"、"nn module"の三つが挙げられていますので、キーワードとしてこちらも抑えておくと良さそうです。それぞれ雑に解釈すると、自動微分、最適化、ニューラルネットワークと考えられそうです。
ここまでで大体の概要はつかめたので、次に公式のPyTorchのドキュメントを見ていきます。

f:id:lib-arts:20190620155615p:plain

PyTorch

上記がPyTorchドキュメントのトップページです。"FROM RESEARCH TO PRODUCTION(研究から製品へのデプロイまで)"ということで、R&Dから実際の開発までということを示唆されています。
概要についてはこの辺で十分そうなので、1節はここまでとし、2節ではPyTorchのインストールから簡単な実行まで確認していきます。


2. インストール&簡易実行
2節ではPyTorchのインストールから簡易実行まで見ていきます。

f:id:lib-arts:20190620161747p:plain

Start Locally | PyTorch
まずはPyTorchのトップページにリンクがあるGet Startedを確認していきます。Get Startedにはインストール手順やインストールができているかどうかの確認用のサンプルコードについて載っています。

f:id:lib-arts:20190620161818p:plain
まずは上記を元に、PyTorchをインストールします。(この方式でインストールするとバージョン1.1.0がインストールされるのですが、後述するようにローカルのMacの環境だと1.1.0ではエラーが出たので、1.0.0を入れ直しました。)

f:id:lib-arts:20190620162222p:plain
次に上記を元にインストールの確認を行います。ここで通常だと上記のようにtensorが出力されるはずなのですが、Mac+Pyenv+Python3.6.3で構築したローカル環境だと"from torch._C import *"の実行にあたって、"ImportError"が生じてしまいました。エラー解決にあたって調べたところ、公式リポジトリで下記のイシューを見つけました。

f:id:lib-arts:20190620162714p:plain

from torch._C import * (ImportError: DLL load failed: The specified module could not be found. · Issue #4518 · pytorch/pytorch · GitHub
下まで見ていったところ、下記のようなコメントを見つけ、バージョンの入れ直しをしたら直ったとのことでした。

f:id:lib-arts:20190620163219p:plain
一度アンインストールを行なって、バージョンをダウングレードすると実際に下記のように公式のドキュメントと同様の出力がされることを確認することができました。

f:id:lib-arts:20190620163239p:plain

これまででインストールの確認はできたので、次にTutorialの"What is PyTorch?"を元にもう少し動作確認を行なってみます。

What is PyTorch? — PyTorch Tutorials 1.1.0 documentation

from __future__ import print_function
import torch
x = torch.empty(5, 3)
print(x)

f:id:lib-arts:20190620164207p:plain

x = torch.rand(5, 3)
print(x)

f:id:lib-arts:20190620164247p:plain

x = torch.zeros(5, 3, dtype=torch.long)
print(x)

f:id:lib-arts:20190620164346p:plain

x = torch.tensor([5.5, 3])
print(x)

f:id:lib-arts:20190620164411p:plain

x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes
print(x)

x = torch.randn_like(x, dtype=torch.float) # override dtype!
print(x)

f:id:lib-arts:20190620164439p:plain

上記を見た感じだと、NumPyライクな値の持ち方をしていることがわかります。何例かの動作確認を通して、大体の動作イメージがつかめたかと思いますので、簡易実行としてはここまでとします。


3. まとめ
#8ではPyTorchの概要の把握や、インストール、簡易実行について行いました。
#9以降では使い方のより詳細について確認するにあたって、公式のチュートリアルを確認していければと思います。

Introduction_はじめに|『[エッセンシャル版]マイケル・ポーターの競争戦略』読解メモ #1

f:id:lib-arts:20190625182650p:plain

時折ビジネス系の本も読むようにしたいので、『[エッセンシャル版]マイケル・ポーターの競争戦略』を読み進めていきます。

<エッセンシャル版>マイケル・ポーターの競争戦略 | 種類,単行本 | ハヤカワ・オンライン

選定の経緯としては、名著のガイダンス的な役割の本を読めればと探していたところ、こちらを見つけ良さそうだったので選びました。また内容としても競争戦略はより深く知りたい内容ではあったのでちょうど良かったというのがあります。
#1でははじめにのところで記載されている、執筆にあたっての背景と、各章のロードマップについて見ていきます。
以下、目次になります。
1. 執筆にあたっての背景
2. 各章のロードマップ
3. 感想・まとめ


1. 執筆にあたっての背景、本の概要
1節では執筆にあたっての背景のところについてまとめていければと思います。この本はHBS(ハーバード・ビジネス・レビュー)や、ハーバード・ビジネス・スクールの運営にあたって、マイケル・ポーター(本書に習い敬称は略します。)と仕事をされている、ジョアン・マグレッタ(Joan Magretta)さんによって執筆されたものです。マイケル・ポーターによって執筆協力もなされているので、かなり参考になる内容であると思われます。
執筆にあたってはマイケル・ポーターの著作は素晴らしいことについて述べた上で、古典の厄介なところとして「誰もが読んでおけば良かったと思うが、誰も読みたいとは思わない」という点をあげています。とはいえ、戦略に本気で取り組もうという人にとっては、ポーターの研究こそが土台となるため、こちらの本を通してマイケルポーターの研究のエッセンスを「企業の経営者や管理職のためにまとめた」とあります。一冊丸々が要旨のようなものだとされています。
この本の前提となる基本的な考え方は実に単純なものであるとされており、「明晰な戦略思考は、どんな状況におかれたどんな経営者にとっても不可欠であり、ポーターの研究が習得すべき基本的な原則と枠組みを与えてくれる」とされています。「戦略の本質は、何をやらないかを選択することだ」とポーターはことごとく述べているとも強調されています。
また、以下に本のテーマを絞るにあたってまとめられている、「やらない」ことについてまとめておきます。

・戦略研究者向けの学術向けの本を目指さず、想定読者は経営者、管理職、コンサルタントなどである
・競争と戦略に焦点を絞り、ポーターの研究の全てを要約しようとしない
・後の研究を反映させたりはするが、ポーターの研究を拡張はしない
・How to本ではなく、どのように考えるべきかの指針を示し、優れた戦略とそうでない戦略を見きわめる方法を示す

上記で大体の執筆にあたっての背景や本の概要がつかめたので、1節はここまでとします。

 

2. 各章のロードマップ
2節では各章のロードマップについてまとめていきます。大きく分けると二部構成になっていて、第Ⅰ部は競争、第Ⅱ部は戦略を扱うとされています。
まず第Ⅰ部については「競争とは何か?」ということで、競争について取り扱われています。競争を取り上げる理由としては、「競争があるからこそ戦略が必要になる」という単純な理由とされています。第Ⅰ部では戦略を考えるための重要な下準備として、競争が起きる仕組みを詳しく説明し、競争と競争優位についての最もありがちで企業を誤りに導く思い込みを取り扱うとされています。第Ⅰ部は1〜3章の三つの章で成り立っており、以下それぞれについて簡単に要約します。

第1章 競争 ー 正しい考え方
競争の本質と仕組みに対する思い違いは戦略の誤りを招くが、競争に勝つには「最高を目指す」のが一番というのもよくある誤解である。この考え方は実は自己破壊的で、底辺に向かうゼロサム競争をあおりかねない。組織は独自性を目指して競い合うことでこそ、卓越した業績を持続させることができる。

第2章 五つの競争要因 ー 利益をめぐる競争
第2章では競争が、売り上げをめぐる強豪企業間の直接対決にとどまらない、より幅広いものであることを見ていく。競争とは利益をめぐる広い意味での攻防であり、業界が生み出す価値の分配をめぐる駆け引きである。「五つの競争要因」を使うことで利益をめぐる競争をわかりやすく表すことができる。

第3章 競争優位 ー バリューチェーン損益計算書
「競争優位」という言葉は漫然と使われるようになってしまったが、正しく理解すれば自社の創造する価値(価値創造)とそれを創造する方法(バリューチェーン、そして業績(損益計算書)とのつながりをはっきりたどることができる。

第Ⅱ部では「戦略とは何か」という問いに答えるとされています。

大まかに言って卓越した経済的業績をもたらす戦略とは競争から身を守るための防御手段であるとされており、第4章〜第8章にそれぞれ挙げる5つの基本的な条件をクリアするものを堅牢な戦略と言うとされています。以下、第4章〜第7章についてそれぞれ要約します。

第4章 価値創造 ー 戦略の核 (第一、第二の条件)
戦略の第一の条件としては顧客への独自の価値提案をするところにある。また、独自の価値提案をするにあたって必要となる、特別に調整されたバリューチェーンを持っていることが優れた戦略の第二の条件となる。

第5章 トレードオフ ー 戦略のかすがい (第三の条件)
戦略の第三の条件はトレードオフで、模倣されにくい選択を行うものである。トレードオフを行うというのは制約を受け入れることなので、おそらく最も厳しいものと見ることもできる。

第6章 適合性 ー 戦略の増幅装置 (第四の条件)
戦略の第四の条件は適合性(fit)であり、適合性は単なる連携を超えて、競争優位を「増幅」させ、その持続性を高める働きがある。

第7章 継続性 ー 戦略の実現要因 (第五の条件)
戦略の第五の条件としては継続性がある。企業は変化しすぎるまたは誤った方法で変化することがある。戦略における継続性の役割を理解すれば変化そのものに対する考え方が変わり、組織は戦略を継続することで適応力とイノベーション能力を高めることができる。

ここまでで本書の一通りのロードマップについては把握できたので2節はここまでとします。


3. 感想・まとめ
はじめにを一通り流して見た感想としては、「競争と戦略」についてが非常に興味深いということです。競争においての論述が第Ⅰ部、戦略が第Ⅱ部ですが、第Ⅱ部の戦略が特に面白そうな印象を受けます。独自性、トレードオフ、適合性はよく触れられると思うのですが、7章で戦略の第五の条件として挙げられている継続性が非常に興味深かったです。
確かに戦略は継続的に用いることで成果の出るものなので、この視点は大事にすべきだと思われました。
#1ではこのように「はじめに」の内容を見てきました。
#2ではこれを受けて第1章の「競争 ー 正しい考え方」について見ていきます。

Tutorialに学ぶseabornの使い方④(Visualizing linear relationships)|Pythonによる可視化入門 #8

f:id:lib-arts:20190614213755p:plain

連載の経緯は#1をご確認ください。

#1〜#4まではMatplotlibに関して、#5はseabornチュートリアルの"Visualizing statistical relationships"、#6では"Plotting with categorical data"、#7では"Visualizing the distribution of a dataset"を元に使い方についてまとめました。

Tutorialに学ぶseabornの使い方①(概要&Visualizing statistical relationships)|Pythonによる可視化入門 #5 - lib-arts’s diary

Tutorialに学ぶseabornの使い方②(Plotting with categorical data)|Pythonによる可視化入門 #6 - lib-arts’s diary

Tutorialに学ぶseabornの使い方③(Visualizing the distribution of a dataset)|Pythonによる可視化入門 #7 - lib-arts’s diary
#7では#5、#6、#7に引き続きseabornのチュートリアルから"Visualizing linear relationships"について取り扱います。
以下目次になります。
1. Visualizing linear relationshipsについて
1-1. Functions to draw linear regression models
1-2. Fitting different kinds of models
1-3. Conditioning on other variables
1-4. Controlling the size and shape of the plot
1.5. Plotting a regression in other contexts
2. まとめ


1. Visualizing linear relationshipsについて
1節ではチュートリアルの"Visualizing linear relationships"について取り扱っていきます。

f:id:lib-arts:20190615232755p:plain

Visualizing linear relationships — seaborn 0.9.0 documentation

まずは簡単な概要をつかめればということで、冒頭のみ和訳します。(若干読みにくかったので意訳しました)

Many datasets contain multiple quantitative variables, and the goal of an analysis is often to relate those variables to each other. We previously discussed functions that can accomplish this by showing the joint distribution of two variables. It can be very helpful, though, to use statistical models to estimate a simple relationship between two noisy sets of observations. The functions discussed in this chapter will do so through the common framework of linear regression.

和訳:『多くのデータセットは複数の量的変数を持っており、分析の目的が変数間の関係性を知ることになることはよくあります。前のチュートリアル(#7)で二変数の連結した分布を用いて機能についてディスカッションしました。二つの観測データ間の単純な関係を推定する統計モデルを用いるにあたって非常に役に立つものです。このチャプターでは、線形回帰というよく使われる考え方を用いることについて説明します。』
タイトルからもわかるように、線形回帰(linear regression)の可視化を行ってくれるようです。大体の概要はつかめたので、下記のコードを実行して1-1の内容に入っていきましょう。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(color_codes=True)

tips = sns.load_dataset("tips")


1-1. Functions to draw linear regression models
1-1の"Functions to draw linear regression models"では、線形回帰モデル(linear regression model)の描画を行っていきます。まずは下記を実行してみましょう。

sns.regplot(x="total_bill", y="tip", data=tips);

実行結果は下記のようになります。

f:id:lib-arts:20190616000334p:plain

オーソドックスな線形回帰として、回帰直線が描画されている他に、傾きを表すaの95%信頼区間(CI; confidence interval)についても可視化が行われています。その他のグラフは似通っている印象だったので、1-1はここまでとします。


1-2. Fitting different kinds of models
1-2の"Functions to draw linear regression models"では、多項式近似やロジスティック回帰を用いた描画について取り扱われています。まずは下記を実行してみましょう。

anscombe = sns.load_dataset("anscombe")
sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
                ci=None, scatter_kws={"s": 80});

f:id:lib-arts:20190616000928p:plain
上記を見るにうまくフィッティングできていないことがわかります。そこで下記のように二次関数でフィッティングを行います。

sns.lmplot(x="x", y="y", data=anscombe.query("dataset == 'II'"),
                order=2, ci=None, scatter_kws={"s": 80});

f:id:lib-arts:20190616001215p:plain
元々のデータが二次関数から生成させたものだったため、フィッティングがうまくいっていることがわかります。
また、同様にロジスティック回帰によるフィッティングも行ってみます。下記を実行してみてください。

tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip", data=tips,
                logistic=True, y_jitter=.03);

f:id:lib-arts:20190616001553p:plain

上記のように多項式近似やロジスティック回帰を行うことができました。


1-3. Conditioning on other variables
1-3の"Conditioning on other variables"では、他の変数を用いて条件付けを行なった状況でのグラフの描き分けについてまとめられています。下記がサンプルコードになります。

sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);

f:id:lib-arts:20190616002048p:plain
実行結果を確認すると、smokerの条件で分けた上でそれぞれ回帰分析を行なっていることがわかります。その他の例も概ね同様のことを行なっているようなので、1-3はここまでとします。


1-4. Controlling the size and shape of the plot
1-4の"Controlling the size and shape of the plot"では、描画するグラフのサイズの設定についてまとめられています。下記がサンプルコードになります。

f, ax = plt.subplots(figsize=(8, 6))
sns.regplot(x="total_bill", y="tip", data=tips, ax=ax);

f:id:lib-arts:20190616002539p:plain

実行結果を確認すると横の方がサイズの大きなグラフになっていることがわかります。figsizeの一つ目の値が横のサイズ、二つ目の値が縦のサイズを表しています。また下記のように複数グラフの描画でもfigsizeは設定することができます。

sns.lmplot(x="total_bill", y="tip", col="day", data=tips,
                col_wrap=2, height=3);

f:id:lib-arts:20190616002825p:plain
上記のように、figsizeを指定することで、グラフのサイズを指定することができます。


1.5. Plotting a regression in other contexts
1-5の"Plotting a regression in other contexts"では、その他の描画の状況において回帰を用いた例になります。下記がサンプルコードになります。

sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg");

f:id:lib-arts:20190616003433p:plain
このように前回までに触れた状況にも回帰直線を入れ込むことができます。


2. まとめ
#8では回帰曲線をグラフに導入するにあたって"Visualizing linear relationships"について取り扱いました。
seabornのチュートリアルについては大体の内容を取り扱えたので、#8をもってseabornについては一区切りとできればと思います。

PASCAL VOC③(Datasetの確認)|機械学習の有名データセットや評価指標を確認する #3

f:id:lib-arts:20190624163551p:plain
機械学習の研究を読み解いたり実際に取り組んだりする中でデータセットや評価指標について知っておくと良いので、それらについての整理を行うにあたって連載を行なっていきます。
#1、#2では2005年〜2012年頃の画像認識のデータセットとして有名なPASCAL VOCの概要と初期のデータセットとしてよく見かけるPASCAL VOCの2007、2010、2012について取り扱いました。

#1、#2で大体のコンペティションの概要がつかめたので、#3では2012のデータセットを実際に確認していければと思います。
以下目次になります。
1. ダウンロードしたdatasetのフォルダ構成について
2. datasetのドキュメントについて
3. まとめ


1. ダウンロードしたdatasetのフォルダ構成について
まず2012年のデータのダウンロードを行います。

f:id:lib-arts:20190624164532p:plain

The PASCAL Visual Object Classes Challenge 2012 (VOC2012)

ダウンロードは2012年のページの"Development Kit"から行うことができます。ファイルのサイズが2GBほどあるので注意が必要です。ダウンロードした"VOCtrainval_11-May-2012.tar"を解凍すると、"VOCdevkit"というフォルダが作成され、"VOCdevkit/VOC2012"の中に下記のようなフォルダ(ディレクトリ)が入っています。

f:id:lib-arts:20190624164602p:plain

1節ではこれらのディレクトリ構成を確認していきます。
まずはJPEGImagesディレクトリについて確認します。

f:id:lib-arts:20190624183246p:plain
上記のように、JPEGImagesの中に写真のデータが入っていることが確認できます。次にSegmentation関連のディレクトリを確認していきます。こちらについてはJPEGImages、SegmentationObject、SegmentationClassの順番で確認していくとわかりやすいのでそのようにします。まずJPEGImagesについては下記です。

f:id:lib-arts:20190624184206p:plain

上記は"2007_000042.jpg"の画像です。二両の電車が写っていますがこちらの例を元にすると分かりやすいと思われたためチョイスしました。次にSegmentationObjectについて見ていきます。

f:id:lib-arts:20190624184224p:plain
"2007_000042.jpg"に対応するIDを持つ"2007_000042.png"を確認すると、上記のように二両の電車にそれぞれ色付けされています。最後にSegmentationClassについて確認します。

f:id:lib-arts:20190624184240p:plain
ここでは二つのセグメンテーションの画像が両方とも電車のため同じクラスに分類されています。
次に"Annotations"について見ていきます

f:id:lib-arts:20190624184834p:plain
一度見た例の方が良いと思われるため、こちらも同様のIDを持つ"2007_000042.xml"について確認します。

f:id:lib-arts:20190624184849p:plain
上記のように画像のアノテーションがつけられています。こちらを解釈していくと、まず重要なのが<object>のタグの中身が物体の情報を表しているということです。こちらを確認すると、<object>と</object>の間に<name>タグや<bndbox>タグなどがあることが確認できます。まず<name>については<name>train</name>となっており、画像の中の物体(object)に電車というアノテーションがついているということがわかります。また、<bndbox>はbounding boxの略で、座標を表すための物体を囲む長方形のことです。ここで<xmin>、<ymin>、<xmax>、<ymax>の四つのタグがあり、(xmin,ymin)(xmax,ymax)の二つの点を対角に取った際の長方形をこちらでは表しています。
また、<size>タグでは画像のサイズを表しており、こちらのスコープは物体(object)にかかっていないことに注意です。このようにXMLファイル形式でアノテーションについての諸々が表現されています。

f:id:lib-arts:20190624190223p:plain
最後にImageSetsについては上記のようにいくつかフォルダが出てきたため、一旦後回しとします。
ここまでで、datasetの大体のディレクトリ構成については理解できたため、1節はここまでとします。


2. datasetのドキュメントについて
1節でdatasetの大体のディレクトリ構成や概要についてはわかったため、2節ではドキュメントの確認をしていければと思います。

f:id:lib-arts:20190624190539p:plain

The PASCAL Visual Object Classes Challenge 2012 (VOC2012) Development Kit

ドキュメントは上記で確認することができます。全部読むと長そうなので、重要そうなところを随時抜粋して要約していきます。

f:id:lib-arts:20190624191159p:plain
まず1のChallengeですがコンペティションの概要について書かれています。データセットの確認だけなら不要な項目ですが、問題定義の仕方として参考になるので少しだけ確認しておきます。『このコンペティションの目的は写真から数多くの物体の検出を行うことで、20クラスのデータがあり、Classifiaction、Detection、Segmentation、Action Classification、Large Scale Recognitionなどの五つのタスクがあります。』とされており、概ね#2で確認したことに一致しています。次に2のDataを見ていきます。

f:id:lib-arts:20190624191631p:plain
2.1ではClassification/Detectionのデータセットについて触れられています。train、val、trainval、testなどについての説明や、それぞれのクラスの総数についてTable 1でまとめられています。表を見る際の注意はobjは一つのimgに対し複数ある際もあるのでimg<objとなっていることと、trainvalがtrainとvalを足したものであるため、二つの合計になっているということです。同様に2.2のTable2ではSegmentationについて、2.3のTable3ではAction Classificationについてまとめられています。
・2.2 Segmentation

f:id:lib-arts:20190624192931p:plain
・2.3 Action Classification

f:id:lib-arts:20190624192956p:plain

また、2.5では正解データ(Ground Truth)のアノテーションについてまとめられています。

f:id:lib-arts:20190624193226p:plain
Section3以降は各コンペティションのタスクについて言及されています。

f:id:lib-arts:20190624193237p:plain
データセットに関する内容については一通り確認できたので、2節はここまでとします。


3. まとめ
#1~#3までで、ImageNetの一世代前のような位置付けの2005年〜2012年にかけて整備された画像のデータセットであるPASCAL VOCについて取り扱いました。
#4からは言語処理におけるデータセットとして2018年よりしばしば用いられているGLUE(GGeneral Language Understanding Evaluation)について取り扱います。

Tutorialに学ぶseabornの使い方③(Visualizing the distribution of a dataset)|Pythonによる可視化入門 #7

f:id:lib-arts:20190614213755p:plain

連載の経緯は#1をご確認ください。

#1〜#4まではMatplotlibに関して、#5はseabornチュートリアルの"Visualizing statistical relationships"、#6では"Plotting with categorical data"を元に使い方についてまとめました。

#7では#5、#6に引き続きseabornのチュートリアルから"Visualizing the distribution of a dataset"について取り扱います。
以下目次になります。
1. Visualizing the distribution of a datasetについて
1-1. Plotting univariate distributions
1-2. Plotting bivariate distributions
1-3. Visualizing pairwise relationships in a dataset
2. まとめ


1. Visualizing the distribution of a datasetについて
1節ではチュートリアルの"Visualizing the distribution of a dataset"について取り扱っていきます。

f:id:lib-arts:20190615222626p:plain

Visualizing the distribution of a dataset — seaborn 0.9.0 documentation

まずは簡単な概要をつかめればということで、冒頭のみ和訳します。

When dealing with a set of data, often the first thing you’ll want to do is get a sense for how the variables are distributed. This chapter of the tutorial will give a brief introduction to some of the tools in seaborn for examining univariate and bivariate distributions. You may also want to look at the categorical plots chapter for examples of functions that make it easy to compare the distribution of a variable across levels of other variables.

和訳:『データ集合を取り扱うにあたって、一番最初に知りたいのがどのように変数が分布しているか(distributed)です。チュートリアルのこの章を読むことで、単変数や二変数について知るためのseabornのツールの簡易的な導入を行うことができます。"categorical plots"の章も読むことで、変数間の分布の比較について参考になるかもしれません。』
冒頭部の説明より、1次元や2次元の変数に対して変数の分布を知るための機能を提供してくれているというのが読み取れます。大体の概要はつかめたので、下記のコードを実行して1-1の1変数の分布の描画に移りましょう。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

sns.set(color_codes=True)

 

1-1. Plotting univariate distributions
1-1では1変数のデータの分布の描画を行う"Plotting univariate distributions"についてまとめます。まずは下記を実行してみましょう。

np.random.seed(0)
x = np.random.normal(size=100)
sns.distplot(x);

実行結果は下記になります。

f:id:lib-arts:20190615225635p:plain
ヒストグラムカーネル密度推定(KDE; Kernel Density Estimation)で推定した、確率密度関数(PDF; probability density function)が図示されています。サンプルコードにチュートリアルにないnp.random.seed(0)を追加したのは、乱数のシードを固定することで結果に再現性を持たせるためです。ヒストグラムだけを描画したい際は下記のようにすることでヒストグラムを描画できます。

sns.distplot(x, bins=20, kde=False);

f:id:lib-arts:20190615225706p:plain
また、下記のようにすることで推定した確率密度関数のみを出力することもできます。

sns.distplot(x, hist=False);

f:id:lib-arts:20190615225733p:plain
確率密度関数の推定についてはKDEを用いる以外にも、近しい確率分布を用いて近似する方法もあります。下記のようにすれば正規分布を用いて確率密度関数を計算することができます。

from scipy.stats import norm

np.random.seed(0)
x = norm.rvs(0, 1, size=200)
sns.distplot(x, fit=norm, kde=False);

f:id:lib-arts:20190615225809p:plain

このようにdistplotを用いることで、ヒストグラム確率密度関数を描画することができます。

 

1-2. Plotting bivariate distributions
1-2では2変数のデータの分布の描画を行う"Plotting bivariate distributions"について取り扱います。まずは下記を実行してみましょう。

np.random.seed(0)
mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])

sns.jointplot(x="x", y="y", data=df);

実行結果は下記のようになります。

f:id:lib-arts:20190615230256p:plain

それぞれの変数のヒストグラムと散布図が可視化されています。また同様のデータにKDEを用いることで、二次元の確率分布を可視化することができます。

sns.jointplot(x="x", y="y", data=df, kind="kde");

f:id:lib-arts:20190615230804p:plain
真ん中に推定した二次元の確率密度関数を表す等高線、上と右にそれぞれの周辺分布を表す確率密度関数が可視化されています。
2変数についてもこのように分布の可視化を行うことができます。


1-3. Visualizing pairwise relationships in a dataset
1-3ではデータセット内の二つの変数ペアの相関性の可視化を行う"Visualizing pairwise relationships in a dataset"について取り扱います。まずは下記を実行してみましょう。

iris = sns.load_dataset("iris")
sns.pairplot(iris);

f:id:lib-arts:20190615231510p:plain
irisは4次元のデータセットですが、上記のようにsns.pairplotを用いることで4変数×4変数の可視化が行えています。対角に配置されているグラフはヒストグラム、対角以外に配置されているグラフは散布図を表しています。また下記のようにすることで、カーネル密度推定をそれぞれの変数の組について行うことができます。

g = sns.PairGrid(iris)
g.map_diag(sns.kdeplot)
g.map_offdiag(sns.kdeplot, n_levels=6);

f:id:lib-arts:20190615231707p:plain
このように、データセットを入力するだけでそれぞれの変数間の関係性をまとめてグラフ化してくれるので非常に便利です。


2. まとめ
#7では変数の分布を知るにあたって"Visualizing the distribution of a dataset"について取り扱いました。
#8では引き続き"Visualizing linear relationships"について取り扱います。

PASCAL VOC②(PASCAL VOC 2010、2012)|機械学習の有名データセットや評価指標を確認する #2

f:id:lib-arts:20190622163957p:plain

機械学習の研究を読み解いたり実際に取り組んだりする中でデータセットや評価指標について知っておくと良いので、それらについての整理を行うにあたって連載を行なっていきます。
#1では2005年〜2012年頃の画像認識のデータセットとして有名なPASCAL VOCの概要と初期のデータセットとしてよく見かけるPASCAL VOC2007について取り扱いました。

#2では#1に引き続きPASCAL VOCの2010と2012について取り扱えればと思います。
以下目次になります。
1. PASCAL VOC 2010について
2. PASCAL VOC 2012について
3. まとめ


1. PASCAL VOC 2010について
1節ではPASCAL VOC 2010について取り扱います。2010年はImageNetを大元のデータセットとする、ILSVRC(ImageNet Large Scale Visual Recognition Challenge)が始まったことでも着目です。

f:id:lib-arts:20190622164501p:plain

The PASCAL Visual Object Classes Challenge 2010 (VOC2010)

まずはIntroductionについて簡単に見ていきます。

f:id:lib-arts:20190622164739p:plain
#1でまとめたPASCAL VOC 2007との違いとしては、メインのコンペティションもお試し用の(taster)コンペティションも2つではなく、3つになっているという点です。メインのコンペティションに関しては『画像識別(classification)、物体検出(detection)、意味分割(segmentation)』の三つであり、"taster"のコンペティションは『person layout、行動分類、ImageNetを用いた大規模の認識』となっています。メインのコンペティションは2007の4つのコンペティションから、3つが選ばれています。また、"taster"に関しては2007と引き続き"Person Layout"に加え、"Action Classification"と"ImageNet Large Scale Visual Recognition Taster Competition"が追加されています。

f:id:lib-arts:20190622170138p:plain
"Action Classification"に関しては上記のようなデータのように、行なっている行動(action)を分類する問題です。

・Phoning(電話をかける)
・PlayingInstrument(楽器を演奏する)
・Reading(読書を行う)
・RidingBike(バイクや自転車に乗る)
・RidingHorse(馬に乗る)
・Running(走る)
・TakingPhoto(写真を撮る)
・UsingComputer(コンピュータを使用する)
・Walking(歩く)

上記の9つのタグにそれぞれの行動が分類される形となっています。

f:id:lib-arts:20190622170210p:plain
また、"ImageNet Large Scale Visual Recognition Taster Competition"に関しては上記のように記載があります。簡単に要約しておきます。

要約:
コンペティションの目的は、1,000万ほどの手動でラベルづけされたデータセットであるImageNetデータセットを用いた写真の内容を推定することです。検証用の画像はアノテーション(セグメンテーション、ラベルなど)が初期では与えられず、アルゴリズムによって画像にどの物体があるかのラベルを生み出します。このコンペティションのはじめとして、画像の識別だけを目的とします。

上記で大体の概要については確認できたので1節はここまでとします。


2. PASCAL VOC 2012について
2節では、PASCAL VOC 2012について取り扱います。PASCAL VOCは2012年をもって終了したので、開催された最後のPASCAL VOCとなっています。

f:id:lib-arts:20190622172807p:plain

The PASCAL Visual Object Classes Challenge 2012 (VOC2012)

ページのファーストビューは2010とさほど変わらないので、次はIntroductionを確認します。

f:id:lib-arts:20190622172839p:plain
確認したところ、概要としてはさほど違いがないようです。前年である2011との差分を記述しているので、こちらを確認します。
f:id:lib-arts:20190622172900p:plain
以下簡単に要約します。

要約:
VOC2012におけるアノテーションの取り組みの大半はセグメンテーション(segmentation)や行動分類(action classification)のデータセットに対して行われました。一方で分類/検出のタスクのアノテーションの追加は行いませんでした。VOC2011とVOC2012の差分は下記のリストでまとめました。


・Classification/Detection
2012のデータセットは2011で用いられたデータセットと同様です。

・Segmentation
2012のデータセットアノテーションがすでについた2008〜2011の画像を含んでいます。セグメンテーションのための画像の総数は7,062から9,993に増加しました。

・Action Classification
2012のデータセットは2011のデータセットと追加したアノテーション画像を含みます。

・Person Layout Taster
2012のデータセットは2011のデータセットと同様です。

2012は2011から大きな変化がなかったと考えて良さそうです。ILSVRCの出現によってプロジェクトの意味合いが変わってきたという影響もあるように思われます。ここまでで大体の概要は把握できたので2節はここまでとします。


3. まとめ
#1、#2ではPASCAL VOCの2007、2010、2012の三つに関して概要の確認を行いました。
大体のイメージはついたので、#3ではこれらを踏まえて実際にデータを確認していければと思います。