Interface2017-12号第1章メカニズム実験 対話する人工知能を読む

STEP 2 日本語解析の処理(つづき)

TensorFlowのinstall

condaの仮想環境を使ってinstallする

仮想環境管理のコマンド
◆仮想環境を作る
    conda create -n(または--name) py27(これが仮想環境の名前) python=3.5(pythonのバージョンを指定可能)
  パッケージが全部入っている仮想環境を構築する
    conda create -n <my_env_name> anaconda(これを最後に追加する)
◆すでにある仮想環境をクローンして新しい仮想環境を作る
    my_env -> cloned_envの場合
      conda create -n cloned_env --clone my_env 
◆仮想環境をアクティベート(有効化)
    source activate py27(仮想環境名)
    通常状態だとrootがデフォルトなので他の仮想環境を有効にするにはこれが必要
      仮想環境が有効化するとプロンプトの前に仮想環境名がつく
◆仮想環境をディアクティベート(無効化:環境がなくなるのではない)
    source deactivate
◆現在currentな仮想環境
      conda info -e(または--envs)
      現在カレントな環境にはアスタリスクがつく

◆パッケージのinstall(仮想環境に入ったあと)
    conda install <package name>
◆パッケージのuninstoall(仮想環境に入ったあと)
     conda uninstall <package name>
◆仮想環境の削除
  conda remove -n <my_env_name> --all
◆その他
   ヘルプ
   conda help

ここを参考にinstall

Ubuntu Linux に TensorFlow をインストール – Python でデータサイエンス

GPUが使えない、Pythonのバージョンは3.5

$conda create -n tensorflow python=3.5 anaconda
全部いれておきかたので文末にanacondaを追加した

$conda info -e
tensorflow /home/user_name/anaconda3/envs/tensorflow
root * /home/user_name/anaconda3

source activate tensorflow

$pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp35-cp35m-linux_x86_64.whl
最後にinstallが成功したとのメッセージがでたので

import tensorflow as tf  
hello = tf.constant('Hello, TensorFlow!')  
sess = tf.Session()  
print(sess.run(hello))  
#結果  
b'Hello, TensorFlow'      

pipでinstall したパッケージとcondaでinstallしたパッケージしたものの差

str_pip = !pip list
pip_list = []
for s in str_pip[3:]:
    pip_list.append(s.split(' ')[0].strip())
pip_set = set(pip_list)

str_conda = !conda list
conda_list = []
for s in str_conda[2:]:
    conda_list.append(s.split(' ')[0].strip())
conda_set = set(conda_list)
print("pip install count =   %d" % len(pip_set))
print("conda install count = %d" % len(conda_set))
print("すべての要素(重複なし)= %d 共通の要素 = %d 片方にしかないもの = %d" % (len(pip_set | conda_set),len(pip_set & conda_set),len(conda_set - pip_set)))

結果
pip install count = 185
conda install count = 241
すべての要素(重複なし)= 272
共通の要素 = 154
片方にしかないもの = 87
condaが多かった。

Interface2017-12号第1章メカニズム実験 対話する人工知能を読む

ステップ1会話データ・セット構築

Jupyter notebookで構築していく
フォルダ構造

.
├── data
│   ├── conversation_data.txt
│   └── urllist.txt
└── 対話する人工知能.ipynb

urllist.txt
http://www.aozora.gr.jp/cards/000148/files/773_14560.html
http://www.aozora.gr.jp/cards/000148/files/789_14547.html

get_data.pyはgithub.comに行ってもらってくる。dataフォルダの構造が
違うので若干手直しする。

get_data.pyで会話部分を抽出してファイルに書き出したのが  
conversation_data.txt  
文書の一部  

これから折々お宅へ伺っても宜ござんすか   ええいらっしゃい  
誰の墓へ参りに行ったか、妻がその人の名をいいましたか  いいえ、そんな事は何もおっしゃいません  
これは何と読むんでしょう    アンドレとでも読ませるつもりでしょうね  
すぐお宅へお帰りですか   ええ別に寄る所もありませんから  
....  
わからんですか、困りますな。寒月君は出てくれるでしょうね。今までの関係もあるから    きっと出る事にします、僕の作った曲を楽隊
が奏するのを、きき落すのは残念ですからね
そうですとも。君はどうです東風君    そうですね。出て御両人の前で新体詩を朗読したいです
大分遅くなった。もう帰ろうか  僕も帰る

ステップ2日本語解析

まずはMecabをinstallする

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

このページのダウンロード UNIX:ソースmecab-0.996.tar.gzをダウンロード

$ tar zxfv mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure 
$ make
$ make check
$ sudo make install

次に辞書(推奨)IPA 辞書をダウンロード

$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ sudo make install

makeのところで「 libmecab.so.2: cannot open shared object file: No such file or directory Makefile:253: ターゲット 'matrix.bin' のレシピで失敗しました 」とでて進まない。 ネットで調べて以下のサイトを参考に解決した

MeCab 用の辞書インストール - 今日もBlueSky

ldconfigを打って共有ライブラリーの依存関係状態を更新させる
ldconfigコマンド自体はこちらを参考

Linuxコマンド集 - 【ldconfig】共有ライブラリの依存関係情報を更新する:ITpro

つづいてsudo make installと打って
最後にmecabを起動

$ mecab
今日も一日ありがとう  <-ユーザが入力する
今日  名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
も 助詞,係助詞,*,*,*,*,も,モ,モ
一 名詞,数,*,*,*,*,一,イチ,イチ
日 名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
ありがとう 感動詞,*,*,*,*,*,ありがとう,アリガトウ,アリガトー
EOS

pythonバインディングのインストールをおこなう

MeCab downloads - Google ドライブ

mecab-python-0.996.tar.gzをダウンロードする(mecabのバージョンと合うものを選んだ)

$ tar xzf mecab-python-0.996.tar.gz
$ cd mecab-python-0.996
READMEにinstall方法が書いてあったので
python setup.py buildと打つ
string関係のエラーがでる。ver2.*とver3.*の違いに起因するものと思われる。
修正が終わって
$ sudo python setup.py installと打って
付属していたsampleスクリプト test.pyを使って動作テストを行うが
エラーがでるのでネットを調べる。

qiita.com

pip install mecab-python3と打って
>>>import sys
>>>import MeCab
でインポートエラーがでる
ImportError: /home/beetle/anaconda3/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 
(required by /usr/local/lib/libmecab.so.2)

ネットでしらべると

blueskydb.blog.jp

$ conda install libgcc
Fetching package metadata ...
........
Solving package specifications: 
.

Package plan for installation in environment /home/beetle/anaconda3:

The following NEW packages will be INSTALLED:

libgcc-ng:    7.2.0-h7cc24e2_2
libstdcxx-ng: 7.2.0-h7a57d05_2

The following packages will be UPDATED:

libgcc:       4.8.5-2          --> 7.2.0-h69d50b8_2

Proceed ([y]/n)? 
libgcc-ng-7.2. 100% |################################| Time: 0:00:01   4.75 MB/s
libstdcxx-ng-7 100% |################################| Time: 0:00:00   4.69 MB/s
libgcc-7.2.0-h 100% |################################| Time: 0:00:00   4.13 MB/s

$python
>>>import sys
>>>import MeCab
>>>>>> m = MeCab.Tagger ("-Ochasen")
>>> print(m.parse("今日も一日ありがとう"))
今日  キョウ   今日  名詞-副詞可能     
も モ も 助詞-係助詞        
一 イチ  一 名詞-数      
日 ニチ  日 名詞-接尾-助数詞     
ありがとう アリガトウ ありがとう 感動詞       
EOS

***************************************************************
直接MeCabに聞いたときの返答、Pythonから帰ってくるアンサーとは若干違いがあるようです
    今日も一日ありがとう  <-ユーザが入力する
今日  名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
も 助詞,係助詞,*,*,*,*,も,モ,モ
一 名詞,数,*,*,*,*,一,イチ,イチ
日 名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ
ありがとう 感動詞,*,*,*,*,*,ありがとう,アリガトウ,アリガトー
EOS
****************************************************************

「PythonとJavaScriptではじめるデータビジュアライゼーション」を読む

12.2静的ファイルの配信

フォルダ構成
viz/  
    data/  
        nobel_winners.json
    index.html
    script.js

#index.html
<!DOCTYPE html>
<meta charset="utf-8">
<style>
    body{font-family: sans-serif;}
</style>

<h2 id='data-title'></h2>
<div id='data'>
    <pre></pre>
</div>

<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="script.js"></script>

#script.js
d3.json('data/nobel_winners_plus_bornin.json',function(error,data){
    if(error){
        console.log(error);
    }
    d3.select('h2#data-title').text('All the Nobel-winners');
    d3.select('div#data pre').html(JSON.stringify(data,null,4));
});

シエル上でpython -m http.serverで待機状態にする。
Webブラウザーhttp://localhost:8000にアクセスすると

f:id:bitop:20171015095155p:plain

国別に受賞者リストを分ける

ファイルを分割する

フォルダ構成
viz/  
    data/  
        nobel_winners.json
        winners_by_country/
    index.html
    script.js

#group_by_country.py
import pandas as pd

df_winners = pd.read_json('data/nobel_winners_plus_bornin.json')
for name,group in df_winners.groupby('country'):
    group.to_json('data/winners_by_country/' + name + '.json',orient='records')

winners_by_countryフォルダ下に国別のjsonファイルができる。

script.jsを書き換える

#script.js
var loadCountryWinnersJSON = function(country){
    d3.json('data/winners_by_country/' + country + '.json', 
        function(error, data) {
            if (error) {
                console.log(error);
            }
            d3.select('h2#data-title').text('All the Nobel-winners from ' + country);
            d3.select('div#data pre').html(JSON.stringify(data, null, 4));
        });
};

loadCountryWinnersJSON('Australia');

シエル上でpython -m http.serverで待機状態にする。
Webブラウザーhttp://localhost:8000にアクセスすると

f:id:bitop:20171015104020p:plain

「PythonとJavaScriptではじめるデータビジュアライゼーション」を読む

12.1 データ配信

#nobel_viz.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello world!"

if __name__ == "__main__":
    app.run(port=8000,debug=True)

nobel_viz.pyがあるフォルダで
$ python nobel_viz.py
と実行させると

d-js/data$ python nobel_viz.py 
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 186-114-981

と表示され待機状態になる。
Webブラウザのアドレス欄にhttp://localhost:8000と入力して
アクセスさせるとHello world!と表示される。  

Jinja2を使ったテンプレート
フォルダ構成
nobel_viz.py  
  templates/  
    testj2.html  


from flask import Flask,render_template

app = Flask(__name__)
winners = [
    {'name':'Albert Einstein','category':'Physics'},
    {'name':'V. S. Naipaul','category':'Literature'},
    {'name':'Dorothy Hodgkin','category':'Chemistry'}
]

@app.route("/")
def hello():
    return "Hello world!"

@app.route("/demolist")
def demo_list():
    return render_template('testj2.html',heading="A little winners list",winners = winners)

if __name__ == "__main__":
    app.run(port=8000,debug=True)

#testj2.html
<!DOCTYPE html>
<meta charset="utf-8">
<body>
    <h2>{{ heading }}</h2> #/があるとエラーがでるので除外した
    <ul>
        {% for winner in winners %}
        <li><a href="{{ 'http://wikipedia.com/wiki/'+winner.name }}">
        {{ winner.name }}</a>
        {{ ', category: ' + winner.category}}
        </li>
        {% endfor %}
    </ul>
</body>

nobel_viz.pyがあるフォルダで python nobel_viz.pyと実行
さきほどと同じように待機状態になる

Webブラウザのアドレス欄にhttp://localhost:8000/demolistと入力して
アクセスさせると

f:id:bitop:20171014113946p:plain

となる。リンク先をクリックさせるとWikiに飛んでいく。

「PythonとJavaScriptではじめるデータビジュアライゼーション」を読む

11.5 受賞者の年齢と没年齢

df['award_age'].hist(bins=20)
<matplotlib.axes._subplots.AxesSubplot at 0x7f1459757978>

[f:id:bitop:20171009090400p:plain]

sns.distplot(df['award_age'])
<matplotlib.axes._subplots.AxesSubplot at 0x7f1458f80fd0>

png

箱ひげ図
sns.boxplot(df.gender,df.award_age)
plt.show()
sns.violinplot(df.gender,df.award_age)
plt.show()

png

png

11.5.2 受賞者の没年齢
df['age_at_death'] = (df.date_of_death - df.date_of_birth).dt.days/365
age_at_death = df[df.age_at_death.notnull()].age_at_death
sns.distplot(age_at_death,bins=40)
<matplotlib.axes._subplots.AxesSubplot at 0x7f14596b5668>

png

100歳以上の受賞者
df[df.age_at_death > 100][['name','category','year']]
name category year
101 Ronald Coase Economics 1991
329 Rita Levi-Montalcini Physiology or Medicine 1986
男性と女性の寿命の差
df2 = df[df.age_at_death.notnull()]
sns.kdeplot(df2[df2.gender == 'male'].age_at_death,shade=True,label='male')
sns.kdeplot(df2[df2.gender == 'female'].age_at_death,shade=True,label='female')
<matplotlib.axes._subplots.AxesSubplot at 0x7f1457f58400>

png

sns.violinplot(df.gender,age_at_death)
<matplotlib.axes._subplots.AxesSubplot at 0x7f1457f40828>

png

11.5.3 時代に伴う寿命の延長
df_temp = df[df.age_at_death.notnull()]
data = pd.DataFrame({'age_at_death':df_temp.age_at_death,
                    'date_of_birth':df_temp.date_of_birth.dt.year})
sns.lmplot('date_of_birth','age_at_death',data,size=6,aspect=1.5)
<seaborn.axisgrid.FacetGrid at 0x7f1457da0d30>

png

11.6 受賞者の移住

#birth_inフィールド付のjsonファイルを読み込み、今までのdfにはbirth_in列はないので11.6章は実行できなかった
df = pd.read_json('nobel_winners_plus_bornin.json', orient='records')
by_bornin_nat = df[df.born_in.notnull()].groupby(['born_in','country']).size().unstack()
by_bornin_nat.index.name = 'Born_in'
by_bornin_nat.columns.name = 'Move_to'
plt.figure(figsize= (8,8))
ax=sns.heatmap(by_bornin_nat,vmin=0,vmax=8)
ax.set_title('The Nobel Diaspora')
<matplotlib.text.Text at 0x7f1417def080>

png




    
    
  

「PythonとJavaScriptではじめるデータビジュアライゼーション」を読む

11.1 探索の開始

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import json
import seaborn as sb

%matplotlib inline
plt.rcParams['figure.figsize'] = 8,4
#Mongoデータベースがうまく動かないのでjsonファイルをDataFrameに読み込ませる
df = pd.DataFrame(pd.read_json('nobel_winners_cleaned.json'))
print(df.info())
<class 'pandas.core.frame.DataFrame'>
Int64Index: 858 entries, 0 to 857
Data columns (total 12 columns):
award_age         858 non-null int64
category          858 non-null object
country           858 non-null object
date_of_birth     858 non-null object
date_of_death     559 non-null object
gender            858 non-null object
link              858 non-null object
name              858 non-null object
place_of_birth    831 non-null object
place_of_death    524 non-null object
text              858 non-null object
year              858 non-null int64
dtypes: int64(2), object(10)
memory usage: 87.1+ KB
None

date_of_birthとdate_of_deathをobject型からdatetime型に変換する

df.date_of_birth = pd.to_datetime(df.date_of_birth)
df.date_of_death = pd.to_datetime(df.date_of_death)
df.info('data_of_death')
<class 'pandas.core.frame.DataFrame'>
Int64Index: 858 entries, 0 to 857
Data columns (total 12 columns):
award_age         858 non-null int64
category          858 non-null object
country           858 non-null object
date_of_birth     858 non-null datetime64[ns]
date_of_death     559 non-null datetime64[ns]
gender            858 non-null object
link              858 non-null object
name              858 non-null object
place_of_birth    831 non-null object
place_of_death    524 non-null object
text              858 non-null object
year              858 non-null int64
dtypes: datetime64[ns](2), int64(2), object(8)
memory usage: 87.1+ KB

11.2 pandasを使ったプロット

by_gender = df.groupby('gender')
print(by_gender.size())
print(type(by_gender.size()))
by_gender.size().plot(kind='bar') #Seriesデータに対しplotメソッドを実行している
gender
female     47
male      811
dtype: int64

[f:id:bitop:20171008101748p:plain]

11.3 男女間の格差

by_cat_gen = df.groupby(['category','gender'])
print(type(by_cat_gen.get_group(('Physics','female'))))
by_cat_gen.get_group(('Physics','female'))[['name','year']] #物理賞を取った女性の名前と受賞年を取得
<class 'pandas.core.frame.DataFrame'>
name year
267 Maria Goeppert-Mayer 1963
614 Marie Skłodowska-Curie 1903
#女性受賞者はPeace,Literature(文学賞)、Physiology or Medicine(生理学及び医学賞)におおい
print(by_cat_gen.size())
by_cat_gen.size().plot(kind="barh")
plt.show()
#縦軸でも
by_cat_gen.size().plot(kind="bar")
category                gender
Chemistry               female      4
                        male      167
Economics               female      1
                        male       74
Literature              female     13
                        male       93
Peace                   female     16
                        male       87
Physics                 female      2
                        male      199
Physiology or Medicine  female     11
                        male      191
dtype: int64

[f:id:bitop:20171008101837p:plain] [f:id:bitop:20171008101816p:plain]

<matplotlib.axes._subplots.AxesSubplot at 0x7efce45467f0>

png

11.3.1 グループのアンスタック
by_cat_gen.size().unstack().plot(kind="barh")
<matplotlib.axes._subplots.AxesSubplot at 0x7efce1f9bcf8>

png

性別グループの並び替えと合計
cat_gen_sz = by_cat_gen.size().unstack()
print(cat_gen_sz,"\n",type(cat_gen_sz))
cat_gen_sz['total'] = cat_gen_sz.sum(axis=1) #cat_gen_sz(DataFrame)を列方向(性別方向)に合計をとってtotal列に代入する
cat_gen_sz = cat_gen_sz.sort_values(by = 'female',ascending=True)
cat_gen_sz[['female','total','male']].plot(kind='barh')
gender                  female  male
category                            
Chemistry                    4   167
Economics                    1    74
Literature                  13    93
Peace                       16    87
Physics                      2   199
Physiology or Medicine      11   191 
 <class 'pandas.core.frame.DataFrame'>





<matplotlib.axes._subplots.AxesSubplot at 0x7efce1e67588>

png

11.3.2 歴史的傾向
by_year_gender = df.groupby(['year','gender'])
year_gen_sz = by_year_gender.size().unstack()
year_gen_sz.plot(kind = 'bar',figsize=(16,4))
<matplotlib.axes._subplots.AxesSubplot at 0x7efce1e77278>

png

x軸ラベルの削減
def thin_xticks(ax,tick_gap=10,rotation=45):
    #x軸を減らして回転を調整する
    ticks = ax.xaxis.get_ticklocs() #xaxisはtickに関するobject
    ticklabels = [l.get_text() for l in ax.xaxis.get_ticklabels()]
    ax.xaxis.set_ticks(ticks[::tick_gap])
    ax.xaxis.set_ticklabels(ticklabels[::tick_gap],rotation=rotation)
    ax.figure.show()
    
new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_gender = df.groupby(['year','gender'])
year_gen_sz = by_year_gender.size().unstack().reindex(new_index)
year_gen_sz.plot(kind = 'bar',figsize=(16,4))
thin_xticks(year_gen_sz.plot(kind="bar",figsize=(16,4)))
/home/beetle/anaconda3/lib/python3.6/site-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

png

png

上下に並べた年ごとの性別での受賞者数
new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_gender = df.groupby(['year','gender'])
year_gen_sz = by_year_gender.size().unstack().reindex(new_index)

fig,axes = plt.subplots(nrows=2,ncols=1,sharex=True,sharey=True)
ax_f = axes[0]
ax_m = axes[1]

fig.suptitle('Nobel Prize-winners by gender',fontsize=16)
ax_f.bar(year_gen_sz.index,year_gen_sz.female)
ax_f.set_ylabel('Female winner')
ax_m.bar(year_gen_sz.index,year_gen_sz.male)
ax_m.set_ylabel('male winner')
<matplotlib.text.Text at 0x7efce0a5edd8>

png

11.4 国の傾向

#orderメソッドを使うとそのようなものはないとエラーがでるのでsort_valuesメッソドを使用
#ascending=Falseは降順でソートの指定
df.groupby('country').size().sort_values(ascending=False).plot(kind='bar',figsize=(12,4))
#受賞した国数は
print(len(df.groupby('country'))) #56国 wikiによれは世界全体の国家数は206なので残り150国はノーベル受賞者を出していない
56

png

ノーベル賞データ可視化のための国データの取得

MogoDBがうまく動かないのでwinning_country_data.jsonファイルから直接DataFrame化する

df_countries = pd.DataFrame(pd.read_json('winning_country_data.json'))
print(df_countries.info())
print(df_countries['Argentina'])
#本とは列と行が逆になっている,行列を転置する
df_countries = df_countries.T
print(df_countries.info())
print(df_countries.ix[0])
<class 'pandas.core.frame.DataFrame'>
Index: 7 entries, alpha3Code to population
Data columns (total 57 columns):
Argentina                7 non-null object
Australia                7 non-null object
Austria                  7 non-null object
Azerbaijan               7 non-null object
Bangladesh               7 non-null object
Belgium                  7 non-null object
Canada                   7 non-null object
Chile                    7 non-null object
China                    7 non-null object
Colombia                 7 non-null object
Costa Rica               7 non-null object
Cyprus                   6 non-null object
Czech Republic           7 non-null object
Denmark                  7 non-null object
East Timor               7 non-null object
Egypt                    7 non-null object
Finland                  7 non-null object
France                   7 non-null object
Germany                  7 non-null object
Ghana                    7 non-null object
Greece                   7 non-null object
Guatemala                7 non-null object
Hungary                  7 non-null object
Iceland                  6 non-null object
India                    7 non-null object
Iran                     7 non-null object
Ireland                  7 non-null object
Israel                   7 non-null object
Italy                    7 non-null object
Japan                    7 non-null object
Kenya                    7 non-null object
Korea, South             7 non-null object
Liberia                  7 non-null object
Macedonia                7 non-null object
Mexico                   7 non-null object
Myanmar (Burma)          6 non-null object
Netherlands              7 non-null object
Nigeria                  7 non-null object
Norway                   7 non-null object
Pakistan                 7 non-null object
Palestinian Territory    6 non-null object
Poland                   7 non-null object
Portugal                 7 non-null object
Russia                   7 non-null object
Saint Lucia              7 non-null object
South Africa             7 non-null object
Spain                    7 non-null object
Sweden                   7 non-null object
Switzerland              7 non-null object
Taiwan                   6 non-null object
Turkey                   7 non-null object
United Kingdom           7 non-null object
United States            7 non-null object
Venezuela                7 non-null object
Vietnam                  7 non-null object
Yemen                    7 non-null object
Yugoslavia               7 non-null object
dtypes: object(57)
memory usage: 3.2+ KB
None
alpha3Code               ARG
area              2.7804e+06
capital         Buenos Aires
gini                    44.5
latlng        [-34.0, -64.0]
name               Argentina
population          42669500
Name: Argentina, dtype: object
<class 'pandas.core.frame.DataFrame'>
Index: 57 entries, Argentina to Yugoslavia
Data columns (total 7 columns):
alpha3Code    57 non-null object
area          56 non-null object
capital       57 non-null object
gini          53 non-null object
latlng        57 non-null object
name          57 non-null object
population    57 non-null object
dtypes: object(7)
memory usage: 6.1+ KB
None
alpha3Code               ARG
area              2.7804e+06
capital         Buenos Aires
gini                    44.5
latlng        [-34.0, -64.0]
name               Argentina
population          42669500
Name: Argentina, dtype: object


/home/beetle/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:7: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate_ix
  import sys
1人当たりの国別のノーベル受賞者数
#本の上から9行目df.countriesではエラーがでるdf_countriesと変更
#print(df_countries)
nat_group = df.groupby('country')
ngsz = nat_group.size() #国別の受賞者数
#print(ngsz)
#df_countries = df_countries.set_index('name')
df_countries['nobel_wins'] = ngsz
df_countries['nobel_wins_per_capita'] = df_countries.nobel_wins / df_countries.population
#print(df_countries)
df_countries.sort_values(by='nobel_wins_per_capita',ascending=False).nobel_wins_per_capita.plot(kind='bar',figsize=(16,4))
<matplotlib.axes._subplots.AxesSubplot at 0x7efce14de908>

png

ノーベル賞3個以上受賞している国限定
df_countries[df_countries.nobel_wins > 2].sort_values(by='nobel_wins_per_capita',ascending=False).nobel_wins_per_capita.plot(kind='bar',figsize=(16,4))
<matplotlib.axes._subplots.AxesSubplot at 0x7efce1033f98>

png

11.4.1 分野別の受賞数
nat_cat_sz = df.groupby(['country','category']).size().unstack()
print(nat_cat_sz)
category               Chemistry  Economics  Literature  Peace  Physics  \
country                                                                   
Argentina                    1.0        NaN         NaN    2.0      NaN   
Australia                    NaN        1.0         1.0    NaN      1.0   
Austria                      3.0        1.0         1.0    2.0      4.0   
Azerbaijan                   NaN        NaN         NaN    NaN      1.0   
Bangladesh                   NaN        NaN         NaN    1.0      NaN   
Belgium                      1.0        NaN         1.0    3.0      1.0   
Canada                       4.0        1.0         1.0    1.0      2.0   
Chile                        NaN        NaN         2.0    NaN      NaN   
China                        NaN        NaN         1.0    2.0      2.0   
Colombia                     NaN        NaN         1.0    NaN      NaN   
Costa Rica                   NaN        NaN         NaN    1.0      NaN   
Cyprus                       NaN        1.0         NaN    NaN      NaN   
Czech Republic               1.0        NaN         1.0    NaN      NaN   
Denmark                      1.0        NaN         3.0    1.0      3.0   
East Timor                   NaN        NaN         NaN    2.0      NaN   
Egypt                        1.0        NaN         1.0    2.0      NaN   
Finland                      NaN        NaN         NaN    1.0      NaN   
France                       8.0        2.0        16.0    9.0     12.0   
Germany                     28.0        1.0         8.0    4.0     23.0   
Ghana                        NaN        NaN         NaN    1.0      NaN   
Greece                       NaN        NaN         2.0    NaN      NaN   
Guatemala                    NaN        NaN         1.0    1.0      NaN   
Hungary                      1.0        NaN         1.0    NaN      NaN   
Iceland                      NaN        NaN         1.0    NaN      NaN   
India                        NaN        NaN         1.0    2.0      1.0   
Iran                         NaN        NaN         NaN    1.0      NaN   
Ireland                      NaN        NaN         2.0    3.0      1.0   
Israel                       5.0        1.0         1.0    3.0      NaN   
Italy                        1.0        NaN         6.0    1.0      4.0   
Japan                        5.0        NaN         2.0    1.0      8.0   
Kenya                        NaN        NaN         NaN    1.0      NaN   
Korea, South                 NaN        NaN         NaN    1.0      NaN   
Liberia                      NaN        NaN         NaN    2.0      NaN   
Mexico                       NaN        NaN         1.0    1.0      NaN   
Myanmar (Burma)              NaN        NaN         NaN    1.0      NaN   
Netherlands                  3.0        2.0         NaN    1.0      9.0   
Nigeria                      NaN        NaN         1.0    NaN      NaN   
Norway                       1.0        3.0         3.0    2.0      NaN   
Pakistan                     NaN        NaN         NaN    1.0      1.0   
Palestinian Territory        NaN        NaN         NaN    1.0      NaN   
Poland                       NaN        NaN         3.0    1.0      1.0   
Portugal                     NaN        NaN         1.0    NaN      NaN   
Russia                       1.0        1.0         3.0    2.0      9.0   
Saint Lucia                  NaN        NaN         1.0    NaN      NaN   
South Africa                 NaN        NaN         2.0    4.0      NaN   
Spain                        NaN        NaN         5.0    NaN      NaN   
Sweden                       4.0        2.0         8.0    5.0      4.0   
Switzerland                  6.0        NaN         2.0    3.0      3.0   
Taiwan                       1.0        NaN         NaN    NaN      NaN   
Turkey                       NaN        NaN         1.0    NaN      NaN   
United Kingdom              26.0        6.0         9.0   10.0     22.0   
United States               69.0       53.0        11.0   21.0     89.0   
Venezuela                    NaN        NaN         NaN    NaN      NaN   
Vietnam                      NaN        NaN         NaN    1.0      NaN   
Yemen                        NaN        NaN         NaN    1.0      NaN   
Yugoslavia                   NaN        NaN         1.0    NaN      NaN   

category               Physiology or Medicine  
country                                        
Argentina                                 2.0  
Australia                                 6.0  
Austria                                   4.0  
Azerbaijan                                NaN  
Bangladesh                                NaN  
Belgium                                   4.0  
Canada                                    2.0  
Chile                                     NaN  
China                                     NaN  
Colombia                                  NaN  
Costa Rica                                NaN  
Cyprus                                    NaN  
Czech Republic                            NaN  
Denmark                                   5.0  
East Timor                                NaN  
Egypt                                     NaN  
Finland                                   NaN  
France                                   12.0  
Germany                                  16.0  
Ghana                                     NaN  
Greece                                    NaN  
Guatemala                                 NaN  
Hungary                                   1.0  
Iceland                                   NaN  
India                                     NaN  
Iran                                      NaN  
Ireland                                   NaN  
Israel                                    NaN  
Italy                                     1.0  
Japan                                     2.0  
Kenya                                     NaN  
Korea, South                              NaN  
Liberia                                   NaN  
Mexico                                    NaN  
Myanmar (Burma)                           NaN  
Netherlands                               2.0  
Nigeria                                   NaN  
Norway                                    2.0  
Pakistan                                  NaN  
Palestinian Territory                     NaN  
Poland                                    NaN  
Portugal                                  1.0  
Russia                                    2.0  
Saint Lucia                               NaN  
South Africa                              1.0  
Spain                                     1.0  
Sweden                                    6.0  
Switzerland                               9.0  
Taiwan                                    NaN  
Turkey                                    NaN  
United Kingdom                           27.0  
United States                            95.0  
Venezuela                                 1.0  
Vietnam                                   NaN  
Yemen                                     NaN  
Yugoslavia                                NaN  
#python3では割り算の結果が浮動小数点になるので/ではなく//を使う
#orderメソッドはないのでsort_valuesメソッドをつかう
COL_NUM = 2
ROW_NUM = 3
fig,axes = plt.subplots(ROW_NUM,COL_NUM,figsize = (12,12))
for i, (lable,col) in enumerate(nat_cat_sz.iteritems()):
    ax = axes[i//COL_NUM,i % COL_NUM]
    col = col.sort_values(ascending=False)[:10]
    col.plot(kind='barh',ax=ax)
    ax.set_title(lable)
    plt.tight_layout()

png

11.4.3 受賞分布の歴史的傾向
#国家:nation  別の訳としてはstate, country, homeland, sovereign state, kingdomがある
plt.rcParams['font.size'] = 20
new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_nat_sz = df.groupby(['year','country']).size().unstack().reindex(new_index)
by_year_nat_sz['United States'].cumsum().plot(figsize=(16,4))
<matplotlib.axes._subplots.AxesSubplot at 0x7efce0bf8780>

png

日本の受賞者の歴史的傾向を見てみる

new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_nat_sz = df.groupby(['year','country']).size().unstack().reindex(new_index)
by_year_nat_sz['Japan'].cumsum().plot(figsize=(16,4)) #ここのkeyをJapanに変えた
<matplotlib.axes._subplots.AxesSubplot at 0x7efce0010b38>

png

Nanを0に置換する
#fillnaメソッドは欠損値を引数の定数値に置換する
by_year_nat_sz['United States'].fillna(0).cumsum().plot(figsize=(16,4))
<matplotlib.axes._subplots.AxesSubplot at 0x7efce1465f28>

png

日本も0に置換してみる

new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_nat_sz = df.groupby(['year','country']).size().unstack().reindex(new_index)

fig,axes = plt.subplots(2,1,figsize = (16,4))
#axes[0]の描画は大きいところだけ描画しているような?
by_year_nat_sz['Japan'].cumsum().plot(ax=axes[0])
by_year_nat_sz['Japan'].fillna(0).cumsum().plot(ax=axes[1])
<matplotlib.axes._subplots.AxesSubplot at 0x7efcdf9a2e10>

png

生データの表示

import math as m

sum = 0
for item in by_year_nat_sz['Japan']:
    if not m.isnan(item):
        print(item)
        sum += item
print('sum:',sum)
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
2.0
2.0
1.0
1.0
2.0
sum: 18.0
米国を除いた他の国の推移
#第二次世界大戦終結は1945年
new_index = pd.Index(np.arange(1901,2015),name='year')
by_year_nat_sz = df.groupby(['year','country']).size().unstack().reindex(new_index)

not_US = by_year_nat_sz.columns.tolist()
print(type(not_US))
not_US.remove('United States')
by_year_nat_sz['Not_US'] = by_year_nat_sz[not_US].sum(axis=1)
ax = by_year_nat_sz[['United States','Not_US']].fillna(0).cumsum().plot(figsize=(16,4))
<class 'list'>

png

地域差の詳細
by_year_nat_sz = df.groupby(['year','country']).size().unstack().reindex(new_index).fillna(0)
regions = [
    {'label':'N.America','countries':['United States','Canada']},
    {'label':'Europe','countries':['United Kingdom','Germany','France']},
    {'label':'Asia','countries':['Japan','Russia','India']}    #Russia=ロシアだがアジアにいれていいの?、India=インドもアジアなの
]                                                              #WikiによるとOKらしいユーラシヤ大陸のヨーロッパ以外のすべての国を言うらしい
for region in regions:
    by_year_nat_sz[region['label']] = by_year_nat_sz[region['countries']].sum(axis=1)
by_year_nat_sz[[r['label'] for r in regions]].cumsum().plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7efce453e940>

png

受賞数上位16カ国(米国除く)の詳細
#page266の上から9行目by_nat.index(1:17]となっているがby_nat_szでは)
COL_NUM = 4
ROW_NUM = 4
by_nat_sz = df.groupby('country').size()
by_nat_sz.sort_values(ascending=False,inplace=True)
fig, axes = plt.subplots(COL_NUM,ROW_NUM,sharex=True,sharey=True,figsize=(12,12))
for i,nat in enumerate(by_nat_sz.index[1:17]):
    ax = axes[i//COL_NUM,i%COL_NUM]
    by_year_nat_sz[nat].cumsum().plot(ax=ax)
    ax.set_title(nat)

png

ヒートマップ

import seaborn as sns

bins = np.arange(df.year.min(),df.year.max(),10)
by_year_nat_binned = df.groupby([pd.cut(df.year,bins,precision=0),'country']).size().unstack().fillna(0)
plt.figure(figsize=(16,16))
sns.heatmap(by_year_nat_binned[by_year_nat_binned.sum(axis=1) > 2])
<matplotlib.axes._subplots.AxesSubplot at 0x7efcdebe5048>

png