-
ビジネスデータサイエンス実践力養成講座
Pythonによるビッグデータ解析
回答
df にデータを格納した上で、下記コードを実行しても中の数字は表示されませんでしょうか。
import matplotlib.pyplot as plt
import seaborn as sns
colormap = plt.cm.RdBu_r
sns.heatmap(df.corr(numeric_only=True), linewidths=0.1, linecolor=’white’,
vmax=1.0, vmin=-1.0, cmap=colormap, annot=True, annot_kws={‘fontsize’:8}, fmt=’.2f’)
上記コードの annot=True が箱内への数字を出力するためのオプションです。
また、もしかするとその後の数値書式設定(annot_kws)が悪さをしている可能性もあるので、annot_kws={‘fontsize’:8}, fmt=’.2f’ 部分を削除した上で改めて実行してみてください。
上記でうまくいかない場合、ご指摘の通り、バージョンの問題の可能性があります。
この場合、Jupyter Notebookというよりは、当該描画機能のseabornのバージョンの問題の可能性が高いです。バージョン確認のために以下を実行してみてください。
import seaborn as sns
print(sns.__version__)
私は “0.12.2” でしたので、これよりもかなり古そうであれば、バージョンアップデートをしていただいた方が良いかと思います。
(Anaconda環境→ Jupyter Notebook上で !conda update seaborn / それ以外の環境→ Jupyter Notebook上で ! pip install seaborn –upgrade)
回答
コードを全部覚える必要は全くありません。
例えば今回配布したコードは、dfという変数名でデータを入れ替えるだけで(別のExcelデータをdfという変数にread_excelするだけで)先程の相関行列も含め、多くの部分がそのまま動作します。
私もそうですが、多くの分析者は、過去に自分が作ったコードや、Web上に掲載されているコードを流用しています。
逆に言えば、都度、流用しやすいようにコードを作っておく工夫はした方が良いかと思います。(例えば、dfのように、大元となるデータの変数名は共通化しておく、など)
一方で、まさにご指摘の通りで、pairplotやgroupbyなど、非常に有名かつ頻度の高いものは(自ずと)覚えてしまっているケースが多いです。裏を返せば、使っていく中で覚えていけば良いかと思います。
プログラミング言語も、あくまで「言語」の一種なので、継続的、日常的に使っていくことが何よりも大切です。(使用頻度が低いと英語が上手くならないのと類似)
できる限り、毎日に近いくらい触れていくことと、これも自然言語同様、そのままリピート実行するのではなく少し自分でアレンジして実行してみることが極めて重要です。
回答
大変良いご指摘です。第一のお答えとしては、お好みになるかなと思います。
これは非常に深い話にも繋がり、そもそもカテゴリー値(名義尺度、順序尺度)の相関係数にどれほど意味があるか?という点にも繋がります。
通常の相関係数(ピアソンの積率相関係数)は本来、数値間の間隔に意味を持つ、数値データ(間隔尺度、比例尺度)が前提です。
したがって、性別の0/1や、順序尺度(アンケート回答の1~5など)では、本来間隔に意味を持たないので、この相関係数自体、あまり意味をなさないことになります。
しかしながら、数値化(ダミー変数化)していれば、とりあえず相関係数の算出自体はできてしまいますし、その算出値には(定量的な厳密性はなくとも)ある程度の傾向は反映されていますので、参考値にはなります。
ただ、そこから得られる情報は、後述するクロス集計でも十分読み取れるため、わざわざ相関係数を出さなくても問題ないケースも多いです(無論、別途カテゴリー値を対象としたデータ観察を丁寧に行うことが前提です)。
一方で、出港地(Embarked)に関しては、講義では手始めとして、C, Q, Sを0, 1, 2と連続値化しましたが、
本来これらには大小関係が定義できないはずですので、この相関係数自体、意味を持ちません。
※1 ただし、出港地の時間的順序関係がC→Q→Sの順で、かつ、この順序関係が目的変数に影響を与えているという前提があれば、相関係数にもある程度意味が出てくるかと思います
※2 なお、この出港地という変数に関しては、厳密には、C or not (0/1), Q or not (0/1), S or not (0/1) といった、0/1フラグ(one-hotベクトル形式)でのダミー変数化が有効となります
したがって、出港地については、講義でも扱ったように、ダミー変数化した後にクロス集計などで観察するのが一般的です。
ヒストグラムも同様で、カテゴリー値のヒストグラムは単なる棒グラフに他ならない(カテゴリーごとの頻度集計)ので、カテゴリー値を対象としたデータ観察の中で、棒グラフで確認すれば十分です。
ただ、例えばdf.hist()などで、数値データと合わせて一括して確認したい場合には、あらかじめダミー変数化しておく必要があります。
まとめると、カテゴリー値を対象としたデータ観察(クロス集計、棒グラフなど)を丁寧に行なっていれば、事前にダミー変数化する必要は特にありませんが、
先述のように、数値データと一緒くたにして俯瞰的に観察したい場合には、ダミー変数化を事前にしても良いかと思います。
プロセスを定型化するよりも、「何をどう観察するか」の目的意識が重要です。
また、ご参考までに、相関係数の代わりに、カテゴリー値で用いられる類似指標として下記のようなものがあります。
こちらのサイト(https://www.neclearning.jp/sample_text/DB101-1.pdf)が非常にわかりやすいですので、参考にしていただければと思います。
l 数値データ×数値データ・・・ ピアソンの積率相関係数
(順序尺度×順序尺度・・・ スピアマンの順位相関係数)
l 数値データ×カテゴリー値・・・ 相関比
l カテゴリー値×カテゴリー値・・・ クラメールの連関係数
回答
seabornライブラリ側のバグの可能性があるかと思います。
下記でも同様の現象が報告されていますが、seabornのバージョンアップで解決されています。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10296680025
下記の通り、seabornのバージョンアップを試して見ていただけますでしょうか。
(再掲:Anaconda環境→ Jupyter Notebook上で !conda update seaborn / それ以外の環境→ Jupyter Notebook上で ! pip install seaborn –upgrade)
※バージョンアップ後、Jupyter Notebookの再起動が必要です
上記で解消されない場合、seabornのバージョン、matplotlibのバージョンをご教示いただければと思います。
▼seabornバージョン確認方法
import seaborn as sns
print(sns.__version__)
▼matplotlibのバージョン確認方法
import matplotlib
matplotlib.__version__
回答
大変鋭いご指摘をありがとうございます。
おっしゃる通りで、決定係数は説明変数が増えれば上昇する性質のものなので、ある説明変数を追加して決定係数が改善した場合に、
追加した説明変数が本質的に目的変数に影響を与えているのか、(本当は影響していないのに)説明変数の数が増えただけの影響なのか、の判断が難しくなります。
従って、厳密には他講師の説明通り、説明変数の数(正確には自由度の数)で補正した補正Rを用いて、追加した説明変数の影響度を見るべきかと思います。
一方で、今回私の講義内にてメインで用いている “scikit-learn” の機械学習ライブラリでは、回帰分析において、この補正R(自由度調整済み決定係数)を求めるメソッド(関数)が用意されていません。
従って、これを求めるには、自作関数を作るか、statsmodelライブラリの回帰分析を用いる必要があります。
“scikit-learn” と “statsmodel” は思想の違いがあり、scikit-learnはどちらかというとデータマイニング的にTrial and Errorを重ねながらクイックに分析を行う位置付けになっている印象です。(例えば多重共線性を評価する指標である “VIF” 統計量も、scikit-learnにはありませんが、statsmodelにはあります)
今回私が補正Rを用いていないのは、あくまでデータマイニング的に分析を行なっており必ずしも厳密性を追求する目的ではない(例えば、追加した説明変数の有意性を示したいわけではない)ために簡便に扱えるscikit-learnのアルゴリズムを用いていることと、また、補正Rの定義式上、差が生じるのは {(n – 1)/(n – k – 1)} の部分なので、データ数が十分あればそこまでの大きなインパクトがないだろうという理由からです。
(参考)
・決定係数 = 1 – (残差平方和)/(偏差平方和)
・自由度調整済み決定係数 = 1 – {(残差平方和)/(偏差平方和)} x {(n – 1)/(n – k – 1)} ※n: データ数、k: 説明変数の数
繰り返しますが、厳密性を追求する場合(アカデミックや、当該変数の有意性を調べたい場合など)には、補正Rを用いた方が良いです。