2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

厚生労働省の地域別最低賃金の全国一覧のPDFをスクレイピング

Last updated at Posted at 2020-10-08

準備

!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()

グラフ

minimumichiran.png

2
6
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
2
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?