pythonで学歴と賃金の関係を簡単にプロットする

こんにちは、entershareの大森です。

大学の時に本当に少しだけPythonを触ったりしていましたが、最近ではRubyとPHPしか触っていない気がします。
今回は少しだけmatplotlibを使ってグラフを描画してみたいと思います。
単にデータをプロットしているだけなので入門と考えてください。

また今回Jupyter Notebookを使用しています。
下記のInstallを見るとAnacondaとpipでのインストールが可能なようですが、Anacondaを使うのが簡単で公式サイトもおすすめしているようです。
https://jupyter.org/

それではやっていきましょう。

## 必要なモジュールをインストール

まずは必要なモジュールをインポートしていきます。
今回はグラフを描画するために必要なmatplotlibと数値計算を簡単にしてくれるnumpyをインポートしています。

```python
# こう書くことでjupyter notebookの中でmatplotlibをいい感じに描画してくれる
%matplotlib inline
# matplotlibはグラフなどの描画モジュール
import matplotlib.pyplot as plt
# numpyは数値計算を効率的に行うためのモジュール
import numpy as np
```

## ひたすら数値を入れる

後はプロットする前にひたすら数値をいれていきます。
numpyの配列を使うことでmatplotlibで簡単に描画ができます。

世代(generations)をX軸、全世代(average_data)、中学卒業後就職(junior_high)、高校卒業後就職(high_school)、短大・高専卒業後就職(short_university)、大学卒業後就職(univercity)のそれぞれの平均収入をY軸に描画する予定です。

なお使用したデータは厚生労働省の[平成30年賃金構造基本統計調査](https://www.mhlw.go.jp/toukei/itiran/roudou/chingin/kouzou/z2018/index.html)になります。


```python
generations = np.array([ 
  '20-24',
  '25-29',
  '30-34',
  '35-39',
  '40-44',
  '45-49',
  '50-54',
  '55-59',
  '60-64',
  '65-69',
  '70-'
])

average_data = np.array([
  209.7,
  240.3,
  273.5,
  301.7,
  327.4,
  352.4,
  373.8,
  370.3,
  278.4,
  245.3,
  243.3

])

junior_high = np.array([
  197.1,
  217.4,
  237.0,
  256.9,
  271.4,
  285.7,
  288.8,
  292.1,
  227.2,
  206.6,
  199.8
])

high_school = np.array([
  195.5,
  217.9,
  240.0,
  260.2,
  281.3,
  296.4,
  309.2,
  310.8,
  237.1,
  214.4,
  209.3
])

short_university = np.array([
  207.0,
  229.5,
  252.8,
  273.5,
  296.0,
  320.4,
  330.5,
  325.8,
  267.8,
  250.0,
  261.0
])

university = np.array([
  226.9,
  257.2,
  306.8,
  355.1,
  405.3,
  462.2,
  513.2,
  505.0,
  375.2,
  372.0,
  443.0
])
```

## グラフをプロット
最後にグラフをプロットします。
最初の3行はタイトル、X軸のラベル、Y軸のラベルを設定しています。

次に`plt.plot()`を使ってグラフを描画しています。
第1引数はX軸のデータ、第2引数はY軸のデータ、第３引数はグラフのラベルです。

`plt.grid()`を使うことで、グリットを表示させることもできます。

また`plt.legend()`で凡例(グラフのラベル)を表示させるともできます。
引数に`loc = 'upper left'`のように渡すことで位置の指定も可能です。

```python
plt.title('education and income')
plt.xlabel('age')
plt.ylabel('income')

plt.plot(generations, average_data, label='all')
plt.plot(generations, university, label='univercity')
plt.plot(generations, junior_high, label='junior_highschool')
plt.plot(generations, short_university, label='short_university')
plt.plot(generations, high_school, label='high_school')
plt.grid()
plt.legend(loc = 'upper left')
```

以上のコードを実行すると以下のようにプロットされます。

<img width="428" alt="スクリーンショット 2019-05-07 1.17.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249679/7e8c3869-736e-6e5a-e658-496325bf9f50.png">

予想通りの結果ではあると思いますが、簡単に傾向を読み解いてみましょう。

やはり大学卒業後就職の場合の収入は、平均で飛び抜けて高いようです。
全体的な傾向としては50-54歳までは賃金は上昇傾向にあり、55を過ぎると横ばいに近づきます。
そして定年後はガクッと落ちるパターンがどの場合にも見受けられます。

また目立つのが大学卒業後就職した人の収入が60~69で落ち込み、その後70歳をすぎると跳ね上がることです。
短大・高専卒業後就職の場合でもこのような傾向は多少ありますが、この2つ以外ではそのような傾向は見られません。

こちらは賃金の調査なので年金などは含まれていないはずです。
それでもこのような結果が出るのは70歳を超えても、現役時に働いていた知識や経験を生かして価値を生み出せている可能性が1つ。
もしくはそもそも働いている人が少ないので、高い役職についていた人が引き続き働き、平均賃金を押し上げているというのが1つ。

どちらなのか、もしくは他の答えがあるのかはこの表からだけではわかりません。
ただ雇用されて働く場合には、平均的にこのグラフのように賃金が変化することを頭にいれて人生設計をする必要はあるでしょう。

それではまた！

## 全体のコード

最後に全体のコードを載せておきます。

```python
# こう書くことでjupyter notebookの中でmatplotlibをいい感じに描画してくれる
%matplotlib inline
# matplotlibはグラフなどの描画モジュール
import matplotlib.pyplot as plt
# numpyは数値計算を効率的に行うためのモジュール
import numpy as np

generations = np.array([ 
  '20-24',
  '25-29',
  '30-34',
  '35-39',
  '40-44',
  '45-49',
  '50-54',
  '55-59',
  '60-64',
  '65-69',
  '70-'
])

average_data = np.array([
  209.7,
  240.3,
  273.5,
  301.7,
  327.4,
  352.4,
  373.8,
  370.3,
  278.4,
  245.3,
  243.3

])

university = np.array([
  226.9,
  257.2,
  306.8,
  355.1,
  405.3,
  462.2,
  513.2,
  505.0,
  375.2,
  372.0,
  443.0
])


junior_high = np.array([
  197.1,
  217.4,
  237.0,
  256.9,
  271.4,
  285.7,
  288.8,
  292.1,
  227.2,
  206.6,
  199.8
])

short_university = np.array([
  207.0,
  229.5,
  252.8,
  273.5,
  296.0,
  320.4,
  330.5,
  325.8,
  267.8,
  250.0,
  261.0
])

high_school = np.array([
  195.5,
  217.9,
  240.0,
  260.2,
  281.3,
  296.4,
  309.2,
  310.8,
  237.1,
  214.4,
  209.3
])

plt.title('education and income')
plt.xlabel('age')
plt.ylabel('income')

plt.plot(generations, average_data, label='all')
plt.plot(generations, university, label='univercity')
plt.plot(generations, junior_high, label='junior_highschool')
plt.plot(generations, short_university, label='short_university')
plt.plot(generations, high_school, label='high_school')
plt.grid()
plt.legend(loc = 'upper left')
```