【Python】tabulaでPDFの『表』を抽出して統計分析する方法

Python

前回の記事では、Pythonでwebスクレイピング(PDFファイル抽出)してみました。

【Python】英文PDFファイルをスクレイピングして結合・一括翻訳する方法 

【Python】英文PDFファイルをスクレイピングして結合・一括翻訳する方法 
今回はPythonを使い、①たくさんのPDFファイルをwebスクレイピングして、②PDFファイルの特定ページ(英語問題ページ)を抽出し、③ページ抽出したPDFデータを結合して、④最後に結合データをGoogle翻訳で翻訳してみたいと思います。Pythonで生産性向上!!!

 

きょうは、

  1. Pythonの tabula というライブラリを使い、PDF内の『表』を抽出整形し、
  2. describeメソッドで要約統計量を取得みようと思います。また、
  3. 統計情報をもとに『Jupyter Notebook』で matplotlibseaborn を使い、美しいグラフを描画する方法を解説します。

今回は、例として中小企業診断士第一次試験の統計情報(10年分:h22~h31)をつかってみたいと思います。

スポンサード リンク

PDFの『統計表』を抽出

必要なライブラリをインポート

まずはライブラリの import 。

PDFデータ(中小企業診断士統計資料)のURLをリスト化

つぎにweb上にあるPDFデータの URL をリスト化していきます。

中小企業診断士第一次試験の統計情報(10年分:h22~h31)を使います。

中小企業診断士資格取得を目指す方に中小企業診断士試験のご案内です

 

 

オリジナルPDFファイル(令和元年度)はこちら↓このデータを10年分抽出します。映り込んじゃったみどりのぞうさん(Evernote)は気にしないでください。

いちばん下の表:「科目受験者数・科目合格者数」を抽出します。

 

URL をリスト化するコードはこちら↓

 

tabulaで表を抽出(for文でdf[]に追加)

tabula でPDF内の表を pandas.DataFrame (データフレーム)として抽出します。for文で各年度の統計情報をアペンド。

 

オリジナルデータを確認します。以下はh22のデータ。グラフ作成や統計情報を確認したいので、ちょっと整えていきます(前処理です)。

 

データ整形(前処理)の関数定義

オリジナルデータを整形していきます。まずは関数定義。

‘科目合格者数’と’科目合格率’の列の数字については、あらたに’科目合格率’を追加する必要があったため、データタイプを int (整数)に変換。

 

オリジナルデータのデータタイプは、下のようにすべて object でしたので、、、

データタイプはすべて object となってます↓

 

整形後はこのようになります↓

 

for文で前処理実行(10年分) + df2[ ]に追加

for文で各年度のデータ整形 + 空のリスト(: df2 = [] )にアペンド↓

 

平成22年度のデータをベースにfor文で各年度の科目合格率を追加

平成22年度のデータをベースにfor文で各年度の科目合格率を追加していきます。

 

このようになります↓

 

行列を転置して扱いやすくする

行列を .T メソッドで転置(入れ替え)して後々扱いやすい pandas.DataFrameにします↓

 

このようになります↓

 

科目名を英語名に変更

科目名を. rename で英語名に変更します。グラフ作成は英語の方が扱いやすいです。日本語で表示できないこともないのですが、設定が面倒なので、、、

ついでにh22データの 科目合格率h22 へ名前変更。

 

↓このようになります。

 

先頭の 科目名 の行はもう必要なし。 .drop で削除します。 axis=0 で方向指定(0:横、1:縦)

 

このようになります↓

 

一次試験全体の合格率を追加

さいごに各年度一次試験全体の合格率 Pepr を追加します。

 

このようになります↓これで前処理完了。

matplotlibでグラフ描画

グラフの設定と描画(matplotlib)

前処理が完了したので、まず matplotlib でグラフを描画してみます。

 

こちらがそのグラフ↓ Pepr (一次試験全体の合格率)以外はバラつきがすごいですね。

ちょっとこれだけじゃよくわからないので、要約統計量を確認したいと思います。

 

describeメソッドで要約統計量の確認

まずは、前処理。データタイプの変更です。 objectのままでは統計処理ができないので float に変更します。

変更前のデータタイプがこちら↓

 

.astype(float) でデータタイプを float 型(浮動小数点)に変更。

もう一度データタイプを確認します。

 

これで、データタイプの変更完了。

 

続いて describe() メソッドで要約統計量を確認します。 .round(2) で小数第2位まで表示。

count :データ数、 mean:平均値、 std:標準偏差、 min:最小値、 25%:第1四分位数、 50% :第2四分位数、 75% :第3四分位数、 max :最大値

要約統計量から読み取れる特徴は、

  • 経営法務の mean, std, 50%および maxは7科目中もっとも小さい。安定して難度高い。
  • 経営情報システムの stdおよび maxは7科目中もっとも大きい。が、 50%75%の差が1未満。バラつきが大きい。
  • minは7科目すべて1桁台(7%以下)。
  • 1次試験全体の合格率 Pepr はバラつきが小さい。 mean:21.98%, std:4.43%。7科目のバラつき(標準偏差)は伝播してない。むしろポートフォリオが組まれバラつきが小さくなる。

と、まだまだ色々読み取れそうですが、、、どうも科目間の相関関係がありそう。。。

 

ということで次回は、各科目間の相関関係を Python を使って見ていきたいと思います。

Pythonならたった1行のコードでこんな感じで相関関係が視覚化できます↓

お楽しみに!

 

参考サイトと講座

今回、以下のサイトと講座を参考にコーディング、統計分析しました。

– DATA SCIENCE LIFE –

アメリカ在住データサイエンティストのかめ(@usdatascientist)さんのブログ。

Pythonのコーディングについて、めちゃくちゃわかりやすく解説してあります。超ハイクオリティな講座でほんとにぜんぶ無料なの?ってなるくらいすごいブログです。

Python初心者の方にはかなりお勧めです。

データサイエンスのためのPython入門講座全33回〜目次とまとめ〜

 

note.nkmk.me

nkmk(@nkmk_me)さんのブログです。

こちらもPythonプログラミングについて、かなり詳しく書いてあります。

nkmk note
学んだことを書く。Pythonなどプログラミング関連がメイン。

 

現役シリコンバレーエンジニア(酒井 潤さん)が教えるPython 3 入門(Udemy)

現役シリコンバレーエンジニアの酒井 潤(@sakaijun)さんがUdemyで教えるPython講座もおすすめです。なんといっても解説がとても分かりやすい。

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

この講座ではPython3の基礎はもちろんのこと、応用編では

  • データーベースアクセス(SQLite, MySQL, MongoDB, SQLAlchemy etc)、
  • WEB(Flask, socket, RPC etc)、
  • インフラ自動化(Fabric, Ansible)、
  • データ解析(numpy, pandas, matplotlib, scikit-learn),

などなど、盛りだくさんの内容となっております。

現在、Udemyはセール中で、かなりの講座が大幅割引(90%ぐらい?)されています。本日(2020/6/4  24:00)までみたいですね。

興味のある方はぜひのぞいてみてください。