4
2

More than 3 years have passed since last update.

結局どこに住むのがコスパがいいのか調べてみた。

Last updated at Posted at 2019-10-10

環境

  • python==3.7.9
  • bs4==0.0.1
  • pandas==1.1.4
  • matplotlib==3.3.3

前書き

就職活動期や転職を考える時期で気になるのは、年収。
それゆえ、東京や大阪等の大都市圏に出るパターンは数多くあります。
しかし、それが本当に最適解なのでしょうか?
確かに、大都市圏では平均年収が高いのは異論はありませんが、物価も高いわけです。
逆に、地方では平均年収が都市に比べて低いかもしれませんが、その分物価を安く済むわけです。
では、物価と年収の塩梅がベストな県は結局どこなのしょうか。
調べてみました。

参考資料

年収に関して
https://www.nenshuu.net/prefecture/pre/index_prefecture.php
物価に関して
https://todo-ran.com/t/kiji/23029

ファイル構成

- prg
    - Nensyu1.py
    - Nensyu2.py
    - Nensyu3.py
    - Nensyu4.py
    - Nensyu5.py
- data
    - data.csv
    - data2.csv
    - data3.csv
- Graph
    - result1.png
    - result2.png

解析

とりあえず、スクレイピングしてデータを集め、csvに落とし込みます。

Nensyu1
import requests
from bs4 import BeautifulSoup
import pandas as pd

url = requests.get("https://www.nenshuu.net/prefecture/pre/index_prefecture.php")
soup = BeautifulSoup(url.content, "html.parser")

tag1 = soup.find_all("td",class_="top_td")
tag2 = soup.find_all("td")

pref = [];numb = [];money = []
for name in range(len(tag1)):
    pref.append(tag1[name].string)
    numb.append(tag2[4 * name + 2].string)
    money.append(tag2[4 * name + 5].string)

df = pd.DataFrame({0:numb,1:pref,2:money})
df.to_csv('../data/data.csv',index=None,header=None)
Nensyu2
import requests
from bs4 import BeautifulSoup
import pandas as pd

url = requests.get('http://grading.jpn.org/SRC5201.html')

soup = BeautifulSoup(url.content,'html.parser')

tag1 = soup.find_all("td" ,class_="nowrap")


pref = [];score = []
i=0
while True:
    if i <= 59:
        if i%3 == 0 or i == 0:
            pref.append(tag1[i].get_text())
        if i%3 == 1:
            score.append(tag1[i].get_text())
    elif i == 60:
        i+=1
        continue
    else:
        if i%3 == 1:
            pref.append(tag1[i].get_text())
        if i%3 == 2:
            score.append(tag1[i].get_text())
    i += 1
    if len(tag1) <= i:
        break

df = pd.DataFrame({0:pref,1:score})
df[1] = df[1].str.replace('-','')
df.to_csv('../data/data2.csv',header=None,index=None)

続いて、年収と物価に関するパラメーターに関して、偏差値を計算します。

Nensyu3
import pandas as pd
import japanmap as jp
import matplotlib.pyplot as plt
from pylab import rcParams
import numpy as np
import math
import matplotlib as mpl

def coloring(c):
    return (255-int(c)*255/47,0,0+int(c)*255/47)

def cal_Dev_value(row):
    data = list(row)
    mean = sum(data)/len(data)
    dev_data = []
    for dev in data:
        dev_data.append((dev-mean)**2)

    dispersion_data = sum(dev_data)/len(dev_data)
    result_sd = math.sqrt(dispersion_data)
    dispersion_value = []
    for t in data:
        dispersion_value.append(int(10*((t-mean)/result_sd)+50))
    return dispersion_value

df = pd.read_csv('../data/data.csv',header=None)

for k in range(len(df)):
    df.loc[k,'pref_code'] = jp.pref_code(df.loc[k,1])

df[2] = np.float64(df[2])
df[3] = cal_Dev_value(df[2])
print(df)
df.to_csv('../data/data.csv',header=False,index=False)
Nensyu4
import pandas as pd
import math

def cal_Dev_value(row):
    data = list(row)
    mean = sum(data)/len(data)
    dev_data = []
    for dev in data:
        dev_data.append((dev-mean)**2)

    dispersion_data = sum(dev_data)/len(dev_data)
    result_sd = math.sqrt(dispersion_data)
    dispersion_value = []
    for t in data:
        dispersion_value.append(int(10*((t-mean)/result_sd)+50))
    return dispersion_value


df = pd.read_csv('../data/data2.csv',header=None)
dx = pd.read_csv('../data/data.csv',header=None)
df[1] = 200-df[1]

df[2] = cal_Dev_value(df[1])

i = 0
while True:
    k = 0
    while True:
        if df.loc[i,0] == dx.loc[k,1]:
            df.loc[i,3] = dx.loc[k,2];df.loc[i,4]=dx.loc[k,4]
        k += 1
        if len(dx) <= k:
            break
    i += 1
    if len(df) <= i:
        break
df[5] = df[2]+df[4]
print(df)
df.to_csv('../data/data3.csv',header=False,index=False)

その結果を出力します。

Nensyu5
import pandas as pd
import japanmap as jp
import matplotlib.pyplot as plt
import os

os.makedirs('../Grapic',exist_ok=True)

def coloring(c):
    return (255-int(c)*12,0,0+int(c)*8)

df = pd.read_csv('../data/data3.csv',header=None)
df = df.sort_values([5],ascending=False)
df = df.reset_index(drop=True)
df[0] = df[0].str.replace('県','')

numb = list(df.index)
col = []
for k in range(len(numb)):
    cl = coloring(numb[k])
    col.append(cl)
pref = list(df[0])

data = {}
for name,color in zip(pref,col):
    data[name] = color

plt.rcParams['figure.figsize'] = 9,7
plt.tick_params(labelleft=False,labelbottom=False,left=False,bottom=False) 
plt.imshow(jp.picture(data))
plt.savefig('../Grapic/result1.png')
plt.close()

plt.rcParams['figure.figsize'] = 25,5
plt.rcParams["font.family"] = "IPAexGothic"
p1 = plt.bar(df.index,df[2],width=0.6)
p2 = plt.bar(df.index,df[4],width=0.6,bottom = df[2])
plt.xticks(df.index,df[0])
plt.ylabel('Score')
plt.legend((p1[0],p2[4]),('物価','年収'),loc='upper left')
plt.tight_layout()
plt.savefig('../Grapic/result2.png')
plt.show()

結論

年収と物価に関して偏差値を計算し、その合計を各県のスコアとして使用しました。
はじめに、Japanmapを使用して、各県のスコアをプロットしました。

赤(High Score)<------------------------>青(Low Score)

result1.png
続いて、各県のスコアを棒グラフにしました。
result2.png

最高スコアは沖縄県でした。が、物価でスコアを稼いているものの、年収はかなり低いですね。。
両方のパラメーターでそこそこの結果だったのは、大都市圏周辺でした。
やっぱりこの辺りがいいのかもしれまんね。
ちなみに東京は、年収はぶっちぎちの一位でしたが、物価が高すぎて最下位でした。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2