各国の25歳以上の女性の平均就学期間をグラフ化する。
・1970年と2009年の比較
・1970年の平均就学期間が大きい順に横向き棒グラフにする。
データはこちら↓
Gapminder Data
https://www.gapminder.org/data/
Mean years in school (women 25 years and older)
https://docs.google.com/spreadsheets/d/1kmnYQzXLGVF9RbKB3Y-WuUsJFumnE4s2UWdmlskv6r4/pub
200ヶ国の1970年から2009年までの25歳以上の女性の平均就学期間のデータです。
データをweb上から取得するところまでは前回書きました。
プログラミング学習:pandasでweb上の表を取得する。(python)
https://eneprog.blogspot.com/2018/04/pandaswebpython.html
まずは必要なモジュールの読み込み。pandasのほか、matplotlibもインポートします
import pandas as pd import matplotlib import matplotlib.pyplot as plt
read_htmlでweb上の表を取得。
df_tmp = pd.read_html("https://docs.google.com/spreadsheets/d/1kmnYQzXLGVF9RbKB3Y-WuUsJFumnE4s2UWdmlskv6r4/pub#",header=0)
取得した最初の表をschoolとして保存し、不要な列を除去。ここまでが前回記載分。
school=df_tmp[0]
school=school.drop("1",axis=1)
school.head()
| Row Labels | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | ... | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Afghanistan | 0.0 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | ... | 0.2 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.4 |
| 1 | Albania | 3.9 | 4.0 | 4.1 | 4.2 | 4.3 | 4.5 | 4.6 | 4.7 | 4.8 | ... | 8.0 | 8.2 | 8.3 | 8.5 | 8.6 | 8.8 | 8.9 | 9.1 | 9.2 | 9.4 |
| 2 | Algeria | 0.6 | 0.6 | 0.6 | 0.7 | 0.7 | 0.8 | 0.8 | 0.9 | 0.9 | ... | 3.0 | 3.1 | 3.2 | 3.4 | 3.5 | 3.6 | 3.8 | 3.9 | 4.0 | 4.2 |
| 3 | Angola | 0.5 | 0.5 | 0.5 | 0.5 | 0.6 | 0.6 | 0.6 | 0.7 | 0.7 | ... | 1.9 | 2.0 | 2.1 | 2.2 | 2.3 | 2.4 | 2.5 | 2.6 | 2.7 | 2.8 |
| 4 | Antigua and Barbuda | 7.0 | 7.1 | 7.2 | 7.4 | 7.5 | 7.7 | 7.8 | 8.0 | 8.1 | ... | 11.2 | 11.4 | 11.5 | 11.6 | 11.7 | 11.8 | 11.9 | 12.0 | 12.1 | 12.2 |
"Row Labels"をindex(行名)に指定。
school=school.set_index("Row Labels")
school.head()
| 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | ... | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Row Labels | |||||||||||||||||||||
| Afghanistan | 0.0 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | ... | 0.2 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.4 |
| Albania | 3.9 | 4.0 | 4.1 | 4.2 | 4.3 | 4.5 | 4.6 | 4.7 | 4.8 | 4.9 | ... | 8.0 | 8.2 | 8.3 | 8.5 | 8.6 | 8.8 | 8.9 | 9.1 | 9.2 | 9.4 |
| Algeria | 0.6 | 0.6 | 0.6 | 0.7 | 0.7 | 0.8 | 0.8 | 0.9 | 0.9 | 1.0 | ... | 3.0 | 3.1 | 3.2 | 3.4 | 3.5 | 3.6 | 3.8 | 3.9 | 4.0 | 4.2 |
| Angola | 0.5 | 0.5 | 0.5 | 0.5 | 0.6 | 0.6 | 0.6 | 0.7 | 0.7 | 0.7 | ... | 1.9 | 2.0 | 2.1 | 2.2 | 2.3 | 2.4 | 2.5 | 2.6 | 2.7 | 2.8 |
| Antigua and Barbuda | 7.0 | 7.1 | 7.2 | 7.4 | 7.5 | 7.7 | 7.8 | 8.0 | 8.1 | 8.3 | ... | 11.2 | 11.4 | 11.5 | 11.6 | 11.7 | 11.8 | 11.9 | 12.0 | 12.1 | 12.2 |
set_indexで特定の列をindex(行名)に設定できます。
データを見るために、1970年の女性の就学期間が長い順に並べ変えてみます。
1970年の値が大きい順に並べ替え
school.sort_values(by="1970",ascending=False)[:10]
| 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | ... | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Row Labels | |||||||||||||||||||||
| United States | 11.0 | 11.1 | 11.2 | 11.3 | 11.4 | 11.5 | 11.6 | 11.7 | 11.8 | 11.9 | ... | 13.3 | 13.3 | 13.4 | 13.4 | 13.4 | 13.5 | 13.5 | 13.6 | 13.6 | 13.7 |
| Czech Rep. | 8.8 | 8.9 | 9.1 | 9.3 | 9.5 | 9.6 | 9.8 | 9.9 | 10.1 | 10.2 | ... | 12.6 | 12.7 | 12.7 | 12.8 | 12.9 | 13.0 | 13.1 | 13.1 | 13.2 | 13.3 |
| Canada | 8.7 | 8.9 | 9.1 | 9.3 | 9.5 | 9.7 | 9.9 | 10.1 | 10.3 | 10.5 | ... | 13.5 | 13.6 | 13.6 | 13.7 | 13.8 | 13.9 | 14.0 | 14.1 | 14.1 | 14.2 |
| Australia | 8.4 | 8.5 | 8.6 | 8.7 | 8.8 | 8.9 | 9.0 | 9.1 | 9.2 | 9.3 | ... | 10.9 | 11.0 | 11.1 | 11.1 | 11.2 | 11.3 | 11.3 | 11.4 | 11.4 | 11.5 |
| United Kingdom | 8.3 | 8.4 | 8.6 | 8.8 | 9.0 | 9.1 | 9.3 | 9.5 | 9.6 | 9.8 | ... | 12.2 | 12.3 | 12.4 | 12.5 | 12.6 | 12.7 | 12.8 | 12.8 | 12.9 | 13.0 |
| Japan | 8.2 | 8.3 | 8.5 | 8.6 | 8.7 | 8.8 | 8.9 | 9.0 | 9.1 | 9.2 | ... | 11.4 | 11.5 | 11.6 | 11.7 | 11.8 | 11.9 | 12.0 | 12.0 | 12.1 | 12.2 |
| Denmark | 7.9 | 8.1 | 8.3 | 8.5 | 8.6 | 8.8 | 9.0 | 9.1 | 9.3 | 9.5 | ... | 12.1 | 12.1 | 12.2 | 12.3 | 12.4 | 12.5 | 12.6 | 12.7 | 12.7 | 12.8 |
| Switzerland | 7.4 | 7.6 | 7.8 | 8.0 | 8.2 | 8.4 | 8.6 | 8.8 | 9.0 | 9.1 | ... | 11.9 | 12.0 | 12.1 | 12.2 | 12.3 | 12.3 | 12.4 | 12.5 | 12.6 | 12.6 |
| Georgia | 7.4 | 7.5 | 7.7 | 7.8 | 8.0 | 8.1 | 8.3 | 8.4 | 8.6 | 8.7 | ... | 11.6 | 11.7 | 11.8 | 11.9 | 12.0 | 12.1 | 12.2 | 12.3 | 12.4 | 12.5 |
| Poland | 7.3 | 7.5 | 7.6 | 7.8 | 7.9 | 8.1 | 8.3 | 8.4 | 8.6 | 8.7 | ... | 11.5 | 11.6 | 11.7 | 11.8 | 11.9 | 12.0 | 12.1 | 12.2 | 12.3 | 12.4 |
sort_values byで値順に並べ替え、ascending=Falseで降順を指定します。[:10]で上位10ヶ国(0-9行)を抽出しています。
1970年の女性の平均就学期間はアメリカが11.0年で1位。2位のチェコの8.8年を大きく引き離しています。日本は8.2年で6位。
完全一致で行抽出。
school[school.index=="China"]
| 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | ... | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Row Labels | |||||||||||||||||||||
| China | 1.2 | 1.3 | 1.4 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 1.9 | 2.0 | ... | 4.8 | 5.0 | 5.1 | 5.3 | 5.5 | 5.7 | 5.9 | 6.0 | 6.2 | 6.4 |
.index==""で、indexと完全一致した行を取り出します。
中国は1970年で女性の平均就学期間は1.2年。2009年でも6.4年となっています。
部分一致で行抽出
school[school.index.str.contains("Korea")]
| 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | ... | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Row Labels | |||||||||||||||||||||
| Korea, Rep. | 4.8 | 5.0 | 5.1 | 5.3 | 5.5 | 5.7 | 5.9 | 6.1 | 6.3 | 6.5 | ... | 10.4 | 10.6 | 10.8 | 11.0 | 11.1 | 11.3 | 11.4 | 11.6 | 11.8 | 11.9 |
"Korea"は完全一致指定では抽出できなかったので、部分一致(.str.contains)で抽出しました。("Korea"ではなく、"Korea,Rep."と表記されていたため)
韓国は1970年から2009年で女性の就学期間は4.8年から11.8年に伸びています。
グラフ化
school.sort_values(by='1970').plot.barh(y=["1970","2009"],figsize=(5,50)) plt.legend(loc='upper left',bbox_to_anchor=(1, 1))
いよいよグラフ描画。sort_valuesで1970年の値で並べ替え、barhは横向き棒グラフ、yはy軸に描く項目(1970年と2009年)、figsizeでグラフの大きさを指定しています。indexを項目軸にする場合は省略できます(xを省略)。
plt.legendは凡例の表示形式で、loc=upper leftで凡例の左上角を、bbox_to_anchor(グラフの角)にそろえます。bbox_to_anchorは(0,0)でグラフ左下、(1,1)で右上です。この場合は、凡例の左上角をグラフエリアの右上と合わせるので、グラフの外側、右上に凡例が表示されます。
凡例の表示位置については下記の記事が大変参考になりました。
matplotlibでの凡例(ラベル)の表示場所・形式を変更する
http://paper.hatenadiary.jp/entry/2017/05/02/152223
出力
グラフが出来ました。各国で1970年に比べて2009年では女性の平均就学期間が長くなっていますが、まだまだ低い国もあります。アフガニスタンは2009年でも0.4年となっています。今はもっと伸びているのでしょうか。
参考:
edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
ttps://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
Computational Thinking with Python(pythonによるプログラミング的思考)
https://www.edx.org/course/foundations-data-science-computational-uc-berkeleyx-data8-1x
PythonでPandasのPlot機能を使えばデータ加工からグラフ作成までマジでシームレス
https://qiita.com/hik0107/items/de5785f680096df93efa
ゼロから始めるPython Jupyterでいろいろなグラフを描画しよう
https://news.mynavi.jp/article/zeropython-4/
matplotlibでの凡例(ラベル)の表示場所・形式を変更する
http://paper.hatenadiary.jp/entry/2017/05/02/152223
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:pandasでweb上の表を取得する。(python)
https://eneprog.blogspot.com/2018/04/pandaswebpython.html