準備
!apt install python3-tk ghostscript
!pip install camelot-py[cv]
# PDFをダウンロード
!wget https://www.mhlw.go.jp/content/11200000/000541154.pdf -O data.pdf
!pip install japanmap
!pip install japanize-matplotlib
スクレイピング
import re
import camelot
import pandas as pd
tables = camelot.read_pdf(
"data.pdf", pages="all", split_text=True, strip_text=" \n", line_scale=40
)
dfs = []
for table in tables:
df0 = table.df
df_col = df0.head(2)
# セル結合部の空白を補完
idx = pd.MultiIndex.from_arrays(
df_col.mask(df_col == "").fillna(method="ffill", axis=1).values
)
df1 = df0.iloc[2:].set_axis(idx, axis=1)
df1.set_index(("年度", "都道府県名"), inplace=True)
df1.index.name = "都道府県名"
# 行から列に変換
df2 = df1.unstack().reset_index().set_axis(["年度", "分類", "都道府県", "内容"], axis=1)
# 年度・都道府県ごとに再構築
df3 = df2.pivot(index=["年度", "都道府県"], columns="分類", values="内容")
dfs.append(df3)
df = pd.concat(dfs).reset_index()
df.to_csv("data.tsv", sep="\t")
camelotの「copy_text」を使えば結合セルをコピーできた
h:水平 v:垂直
https://camelot-py.readthedocs.io/en/master/user/advanced.html#copy-text-in-spanning-cells
tables = camelot.read_pdf(
"data.pdf",
pages="all",
split_text=True,
strip_text=" \n",
line_scale=40,
copy_text=["h"],
)
dfs = []
for table in tables:
data = table.data
df1 = pd.DataFrame(data[2:], columns=data[:2])
df1.set_index(("年度", "都道府県名"), inplace=True)
df1.index.name = "都道府県名"
df2 = df1.unstack().reset_index().set_axis(["年度", "分類", "都道府県", "内容"], axis=1)
df3 = df2.pivot(index=["年度", "都道府県"], columns="分類", values="内容")
dfs.append(df3)
df = pd.concat(dfs).reset_index()
df.to_csv("data.tsv", sep="\t")
元号から西暦
def era2year(s):
m = re.search("(平成|令和)([0-9元]{1,2})年度", s)
if m:
era = m.group(1)
nen = m.group(2)
year = 1 if nen == "元" else int(nen)
if era == "平成":
year += 1988
elif era == "令和":
year += 2018
return year
return None
データラングリング
from japanmap import pref_code
# 都道府県名から都道府県コードを付与
df["都道府県コード"] = df["都道府県"].apply(pref_code)
# 元号から西暦に変換
df["西暦"] = df["年度"].apply(era2year)
# コンマを除去し、数字に変換
df["改定額(円)"] = df["改定額(円)"].str.replace(",", "").astype(int)
# 都道府県別に並び替え
pv = df.pivot(index=["都道府県コード", "都道府県"], columns="西暦", values="改定額(円)").droplevel(
"都道府県コード"
)
pv
最新年度をスクレイピング
# スクレイピング
df = pd.read_html(
"https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/minimumichiran/",
index_col=0,
header=0,
)[0]
df.index = df.index.str.replace("\s", "")
df.rename(columns={"最低賃金時間額【円】": 2020}, inplace=True)
# PDFの一覧と結合
pv1 = pd.concat([pv, df[2020]], axis=1)
pv1.to_csv("minimumichiran.csv")
データ
2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
全国加重平均額 | 663 | 664 | 665 | 668 | 673 | 687 | 703 | 713 | 730 | 737 | 749 | 764 | 780 | 798 | 823 | 848 | 874 | 901 | 902 |
北海道 | 637 | 637 | 638 | 641 | 644 | 654 | 667 | 678 | 691 | 705 | 719 | 734 | 748 | 764 | 786 | 810 | 835 | 861 | 861 |
青森 | 605 | 605 | 606 | 608 | 610 | 619 | 630 | 633 | 645 | 647 | 654 | 665 | 679 | 695 | 716 | 738 | 762 | 790 | 793 |
岩手 | 605 | 605 | 606 | 608 | 610 | 619 | 628 | 631 | 644 | 645 | 653 | 665 | 678 | 695 | 716 | 738 | 762 | 790 | 793 |
宮城 | 617 | 617 | 619 | 623 | 628 | 639 | 653 | 662 | 674 | 675 | 685 | 696 | 710 | 726 | 748 | 772 | 798 | 824 | 825 |
秋田 | 605 | 605 | 606 | 608 | 610 | 618 | 629 | 632 | 645 | 647 | 654 | 665 | 679 | 695 | 716 | 738 | 762 | 790 | 792 |
山形 | 605 | 606 | 607 | 610 | 613 | 620 | 629 | 631 | 645 | 647 | 654 | 665 | 680 | 696 | 717 | 739 | 763 | 790 | 793 |
福島 | 610 | 610 | 611 | 614 | 618 | 629 | 641 | 644 | 657 | 658 | 664 | 675 | 689 | 705 | 726 | 748 | 772 | 798 | 800 |
茨城 | 647 | 647 | 648 | 651 | 655 | 665 | 676 | 678 | 690 | 692 | 699 | 713 | 729 | 747 | 771 | 796 | 822 | 849 | 851 |
栃木 | 648 | 648 | 649 | 652 | 657 | 671 | 683 | 685 | 697 | 700 | 705 | 718 | 733 | 751 | 775 | 800 | 826 | 853 | 854 |
群馬 | 644 | 644 | 645 | 649 | 654 | 664 | 675 | 676 | 688 | 690 | 696 | 707 | 721 | 737 | 759 | 783 | 809 | 835 | 837 |
埼玉 | 678 | 678 | 679 | 682 | 687 | 702 | 722 | 735 | 750 | 759 | 771 | 785 | 802 | 820 | 845 | 871 | 898 | 926 | 928 |
千葉 | 677 | 677 | 678 | 682 | 687 | 706 | 723 | 728 | 744 | 748 | 756 | 777 | 798 | 817 | 842 | 868 | 895 | 923 | 925 |
東京 | 708 | 708 | 710 | 714 | 719 | 739 | 766 | 791 | 821 | 837 | 850 | 869 | 888 | 907 | 932 | 958 | 985 | 1013 | 1013 |
神奈川 | 706 | 707 | 708 | 712 | 717 | 736 | 766 | 789 | 818 | 836 | 849 | 868 | 887 | 905 | 930 | 956 | 983 | 1011 | 1012 |
新潟 | 641 | 641 | 642 | 645 | 648 | 657 | 669 | 669 | 681 | 683 | 689 | 701 | 715 | 731 | 753 | 778 | 803 | 830 | 831 |
富山 | 644 | 644 | 644 | 648 | 652 | 666 | 677 | 679 | 691 | 692 | 700 | 712 | 728 | 746 | 770 | 795 | 821 | 848 | 849 |
石川 | 645 | 645 | 646 | 649 | 652 | 662 | 673 | 674 | 686 | 687 | 693 | 704 | 718 | 735 | 757 | 781 | 806 | 832 | 833 |
福井 | 642 | 642 | 643 | 645 | 649 | 659 | 670 | 671 | 683 | 684 | 690 | 701 | 716 | 732 | 754 | 778 | 803 | 829 | 830 |
山梨 | 647 | 647 | 648 | 651 | 655 | 665 | 676 | 677 | 689 | 690 | 695 | 706 | 721 | 737 | 759 | 784 | 810 | 837 | 838 |
長野 | 646 | 646 | 647 | 650 | 655 | 669 | 680 | 681 | 693 | 694 | 700 | 713 | 728 | 746 | 770 | 795 | 821 | 848 | 849 |
岐阜 | 668 | 668 | 669 | 671 | 675 | 685 | 696 | 696 | 706 | 707 | 713 | 724 | 738 | 754 | 776 | 800 | 825 | 851 | 852 |
静岡 | 671 | 671 | 673 | 677 | 682 | 697 | 711 | 713 | 725 | 728 | 735 | 749 | 765 | 783 | 807 | 832 | 858 | 885 | 885 |
愛知 | 681 | 681 | 683 | 688 | 694 | 714 | 731 | 732 | 745 | 750 | 758 | 780 | 800 | 820 | 845 | 871 | 898 | 926 | 927 |
三重 | 667 | 667 | 668 | 671 | 675 | 689 | 701 | 702 | 714 | 717 | 724 | 737 | 753 | 771 | 795 | 820 | 846 | 873 | 874 |
滋賀 | 651 | 651 | 652 | 657 | 662 | 677 | 691 | 693 | 706 | 709 | 716 | 730 | 746 | 764 | 788 | 813 | 839 | 866 | 868 |
京都 | 677 | 677 | 678 | 682 | 686 | 700 | 717 | 729 | 749 | 751 | 759 | 773 | 789 | 807 | 831 | 856 | 882 | 909 | 909 |
大阪 | 703 | 703 | 704 | 708 | 712 | 731 | 748 | 762 | 779 | 786 | 800 | 819 | 838 | 858 | 883 | 909 | 936 | 964 | 964 |
兵庫 | 675 | 675 | 676 | 679 | 683 | 697 | 712 | 721 | 734 | 739 | 749 | 761 | 776 | 794 | 819 | 844 | 871 | 899 | 900 |
奈良 | 647 | 647 | 648 | 652 | 656 | 667 | 678 | 679 | 691 | 693 | 699 | 710 | 724 | 740 | 762 | 786 | 811 | 837 | 838 |
和歌山 | 645 | 645 | 645 | 649 | 652 | 662 | 673 | 674 | 684 | 685 | 690 | 701 | 715 | 731 | 753 | 777 | 803 | 830 | 831 |
鳥取 | 610 | 610 | 611 | 612 | 614 | 621 | 629 | 630 | 642 | 646 | 653 | 664 | 677 | 693 | 715 | 738 | 762 | 790 | 792 |
島根 | 609 | 609 | 610 | 612 | 614 | 621 | 629 | 630 | 642 | 646 | 652 | 664 | 679 | 696 | 718 | 740 | 764 | 790 | 792 |
岡山 | 640 | 640 | 641 | 644 | 648 | 658 | 669 | 670 | 683 | 685 | 691 | 703 | 719 | 735 | 757 | 781 | 807 | 833 | 834 |
広島 | 644 | 644 | 645 | 649 | 654 | 669 | 683 | 692 | 704 | 710 | 719 | 733 | 750 | 769 | 793 | 818 | 844 | 871 | 871 |
山口 | 637 | 637 | 638 | 642 | 646 | 657 | 668 | 669 | 681 | 684 | 690 | 701 | 715 | 731 | 753 | 777 | 802 | 829 | 829 |
徳島 | 611 | 611 | 612 | 615 | 617 | 625 | 632 | 633 | 645 | 647 | 654 | 666 | 679 | 695 | 716 | 740 | 766 | 793 | 796 |
香川 | 618 | 619 | 620 | 625 | 629 | 640 | 651 | 652 | 664 | 667 | 674 | 686 | 702 | 719 | 742 | 766 | 792 | 818 | 820 |
愛媛 | 611 | 611 | 612 | 614 | 616 | 623 | 631 | 632 | 644 | 647 | 654 | 666 | 680 | 696 | 717 | 739 | 764 | 790 | 793 |
高知 | 611 | 611 | 611 | 613 | 615 | 622 | 630 | 631 | 642 | 645 | 652 | 664 | 677 | 693 | 715 | 737 | 762 | 790 | 792 |
福岡 | 643 | 644 | 645 | 648 | 652 | 663 | 675 | 680 | 692 | 695 | 701 | 712 | 727 | 743 | 765 | 789 | 814 | 841 | 842 |
佐賀 | 605 | 605 | 606 | 608 | 611 | 619 | 628 | 629 | 642 | 646 | 653 | 664 | 678 | 694 | 715 | 737 | 762 | 790 | 792 |
長崎 | 605 | 605 | 606 | 608 | 611 | 619 | 628 | 629 | 642 | 646 | 653 | 664 | 677 | 694 | 715 | 737 | 762 | 790 | 793 |
熊本 | 606 | 606 | 607 | 609 | 612 | 620 | 628 | 630 | 643 | 647 | 653 | 664 | 677 | 694 | 715 | 737 | 762 | 790 | 793 |
大分 | 606 | 606 | 607 | 610 | 613 | 620 | 630 | 631 | 643 | 647 | 653 | 664 | 677 | 694 | 715 | 737 | 762 | 790 | 792 |
宮崎 | 605 | 605 | 606 | 608 | 611 | 619 | 627 | 629 | 642 | 646 | 653 | 664 | 677 | 693 | 714 | 737 | 762 | 790 | 793 |
鹿児島 | 605 | 605 | 606 | 608 | 611 | 619 | 627 | 630 | 642 | 647 | 654 | 665 | 678 | 694 | 715 | 737 | 761 | 790 | 793 |
沖縄 | 604 | 605 | 606 | 608 | 610 | 618 | 627 | 629 | 642 | 645 | 653 | 664 | 677 | 693 | 714 | 737 | 762 | 790 | 792 |
可視化
import japanize_matplotlib
import matplotlib as mpl
import matplotlib.pyplot as plt
# 解像度
mpl.rcParams["figure.dpi"] = 200
pv1.T.plot(subplots=True, layout=(7, 7), figsize=(30, 30), ylim=(600, 1100))
# グラフを保存
plt.savefig("minimumichiran.png", dpi=200, bbox_inches="tight")
plt.show()