前回の記事で、
- 中小企業診断士第一次試験の統計情報(10年分:h22~h31)をサンプルに、
- tabulaライブラリをつかって、PDFから表データを抽出し、
- describe()メソッドで要約統計量を確認してみました。
【Python】tabulaでPDFの『表』を抽出して統計分析する方法

きょうは、そのつづき、
- 『Jupyter Notebook(Python)』を使って pandasと scipyライブラリから、相関係数とp値を計算し、
- 2変数(科目)間の関係の強さ(相関関係)を確認してみようと思います。また、
- 算出した統計量をもとに、 matplotlibや seaborn で、グラフを作成し、相関関係の分析
をやってみようと思います。
今回も前回同様、例として中小企業診断士第一次試験の統計情報(10年分:h22~h31)を使って分析します。
相関係数とp値の算出
必要なライブラリをインポート
まずはライブラリの import ↓
1 2 3 4 5 6 7 8 |
import itertools # 効率的なループ実行のためのイテレータ生成関数のインポート import pandas as pd # データ解析用ライブラリ import matplotlib.pyplot as plt # グラフ描画ライブラリ import seaborn as sns # データの可視化を行うライブラリ sns.set() # デフォルトスタイルにseabornを適用 from scipy.stats import pearsonr # 科学技術計算ライブラリ import numpy as np # 数値計算を効率的に行うための拡張モジュール |
統計分析前のデータ分布の確認
前回の記事で作成した統計表 pandas.DataFrame(データフレーム) df2[0] を使います。
統計分析前にデータ分布を確認。
seabornの .distplotメソッドで全科目のヒストグラムを重ねて表示。
kdeオプションを Trueにして、カーネル密度関数のグラフ(曲線)を表示します。
1 2 3 4 5 6 7 8 9 |
# ヒストグラムデータ分布の確認 sns.distplot(df2[0]["Economic_policy"], bins=5, norm_hist=True, kde=True, label='Economic_policy') sns.distplot(df2[0]["Accounting"], bins=5, norm_hist=True, kde=True, label='Accounting') sns.distplot(df2[0]["Business_theory"], bins=5, norm_hist=True, kde=True, label='Business_theory') sns.distplot(df2[0]["Operating"], bins=5, norm_hist=True, kde=True, label='Operating') sns.distplot(df2[0]["Legal_affairs"], bins=5, norm_hist=True, kde=True, label='Legal_affairs') sns.distplot(df2[0]["Information_system"], bins=5, norm_hist=True, kde=True, label='Information_system') sns.distplot(df2[0]["Corporate_policy"], bins=5, norm_hist=True, kde=True, label='Corporate_policy') plt.legend() |
このようなヒストグラムが表示されます↓↑データ数は比較的少ないですが、15%~25%付近にデータが集中していることがわかります。
要約統計量の確認
ここで、前回の記事で .describe メソッドから算出した要約統計量をもういちど確認します。
1 |
df2[0].describe().round(2) #descraibeで統計情報を表示(少数第2位まで) |
↑各科目とも平均値 mean と中央値 50% が近い数値となっており、おおよそ釣り鐘型のデータ分布となっています。データ数が少ないため左右対称とまではいきませんね。。。
pandasの.corrメソッドで相関係数を算出
それでは、 pandas の .corr メソッド(ピアソンの積率相関係数=デフォルト)で相関係数を算出します↓
1 2 |
df2_corr = df2[0].corr() # 変数:df2_corrに相関係数の算出値を代入 df2_corr # 相関係数の表示 |
相関係数の値と相関の目安はこちら↓
相関係数 の値 | 相関 |
---|---|
−1.0≤r≤−0.7 | 強い負の相関 |
−0.7≤r≤−0.4 | 負の相関 |
−0.4≤r≤−0.2 | 弱い負の相関 |
−0.2≤r≤0.2 | ほとんど相関がない |
弱い正の相関 | |
正の相関 | |
強い正の相関 |
相関係数を可視化する
seabornの.hatmapメソッドで相関係数を可視化
pandas.DataFrameだけでは特徴をつかみにくいので、 seaborn の .hatmap メソッドを使って、データを可視化します。
1 |
sns.heatmap(df2_corr, vmax=1, vmin=-1, center=0) # 相関係数を可視化 |
このようなヒートマップが作成されます↓
↑暖色は正の相関、寒色は負の相関を表します。
読み取れる特徴は、
- 経営法務と経営情報システムは正の相関(暖色)、
- 経済政策と経営法務は負の相関(寒色)
- 経済政策と経営情報システムは負の相関(寒色)
という点でしょうか。
さらに分析します。
seabornの.pairplotメソッドでペアプロット図(散布図行列)を作成
seaborn の .hatmap メソッドだけでは、詳細な分析はできません。もう少し掘り下げます。
seaborn の .pairplot メソッドでペアプロット図(散布図行列)を作成し、データ間の特徴を分析します。
1 |
sns.pairplot(df2[0]) # ペアプロット図の作成 |
このようなグラフができます↓
↑正の相関:右肩上がりの直線的分布、負の相関:右肩下がりの直線的分布、無相関:バラバラに散らばっている状態、となります。
データ数が少なく特徴がつかみにくですがやはり、
- 経営法務と経営情報システムは正の相関(右肩上がり)、
- 経済政策と経営法務は負の相関(右肩下がり)
- 経済政策と経営情報システムは負の相関(右肩下がり)
ということが言えそうです。
p値から相関係数の有意性を検定
p値を算出し相関係数が統計的に有意(意味がある)か検定してみます。ここでは0.10以下のp値のみ抽出します。
1 2 3 4 5 6 7 8 9 10 11 |
# p値の算出 # for文を使い科目の組み合わせで計算実行 for i, j in itertools.combinations(df2[0], 2): #組み合わせでforループを実行 x = df2[0].loc[:,[i]].values y = df2[0].loc[:,[j]].values a, b = pearsonr(np.ravel(x), np.ravel(y)) # リストを整形し相関係数:aとp値:bの計算 if 0 != b.round(10) < 0.10: # p値 < 0.10 print("=" * 45) print(i + "----" + j) print("相関係数:", a.round(4)) print("p値:", b.round(4)) |
抽出された相関関係は以下の4つ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
============================================= Economic_policy----Legal_affairs 相関係数: -0.7055 p値: 0.0226 ============================================= Economic_policy----Information_system 相関係数: -0.6023 p値: 0.0654 ============================================= Business_theory----Information_system 相関係数: -0.612 p値: 0.0601 ============================================= Legal_affairs----Information_system 相関係数: 0.6893 p値: 0.0274 |
結果から、
- p値<0.05の「経営法務ー経営情報システム」、「経済政策ー経営法務」は、有意であると解釈でき、
- 0.05<p値<0.10の「経済政策ー経営情報システム」、「企業経営理論ー経営情報システム」は、有意傾向である
と解釈できます。
まとめると、
- 経営法務と経営情報システムは正の相関(右肩上がり)、
- 経済政策と経営法務は強い負の相関(右肩下がり)
- 経済政策と経営情報システムは負の相関(右肩下がり)
- 企業経営理論と経営情報システムは負の相関(右肩下がり)
の関係があると言えそうです。
詳しい因果関係はわかりませんが、これらの科目で意図的にポートフォリオが組まれているかもしれませんね。
次回は・・・
次回は、受験科目数別の合格率の推定をしてみたいと思います。
自分も受験生時代、1次は、
- 「7科目受験がおすすめ」
- 「少ない科目受験は危ない」
などの情報を耳にしていましたが、これって本当に正しかったのでしょうか?
次回の記事では、そこらへんを中心に分析してみたいと思います。
お楽しみに!
参考サイトと講座
今回、以下のサイトと講座を参考にコーディング、統計分析しました。
– DATA SCIENCE LIFE –
アメリカ在住データサイエンティストのかめ(@usdatascientist)さんのブログ。
Pythonのコーディングについて、めちゃくちゃわかりやすく解説してあります。超ハイクオリティな講座でほんとにぜんぶ無料なの?ってなるくらいすごいブログです。
Python初心者の方にはかなりお勧めです。
note.nkmk.me
nkmk(@nkmk_me)さんのブログです。
こちらも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),
などなど、盛りだくさんの内容となっております。