原文


実践力の養成3

実践力の養成2

実践力の養成1

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を用いた方が良いです。

提出課題4

Pythonによるデータ解析入門

回答

少々文字化けしていて分かりませんでしたが、labelsにtipとあるので、データセットはtipsだと思いますので、それで説明します。
まず、labelsは何の設定か分からないという部分についてお伝えします。講義で使っていたデータは下記データです。

さらに、講義のときの命令文は

#設定
fig, ax = plt.subplots()
NAME = BOX.columns#線の凡例用に、DataFrameの列名を取得
ax.boxplot(BOX,showmeans = True, labels = NAME)

こうなっていたと思います。BOXという変数に上の表のデータが入っています。
ここで、NAMEという変数には、BOXのカラムが格納されていますね?
カラムとは列のことであり、BOX.columnsによって列名が取得されています。
すなわち、labelsには列名を入れているということが分かると思います。
実際のこの命令を実行したら、箱ひげ図が3つ作成されて、ラベルがShopAとBとCになっていたと思います。
ここから、labelsというのはその名の通り、ラベルを振る名前のことです。

さて、tipsのデータで箱ひげ図を作ろうとしてもうまくいかないとことでしたね?
なぜうまくいなかいかというと、tipsのデータは下記の通りです。

まず

> NAME = I.columns
> ax.boxplot(I,showmeans = True, labels =tip )

ここですが、上図の列名がNAMEに格納されています。
続いて、ax.boxplotによって、Iという変数の箱ひげ図を作れと命令され、平均値も算出しろ、と命令していますが、上図のとおり、どう見ても平均値の算出とか、四分位数の計算すらできなさそうな列が入っていることが分かります。
そのためエラーが出るのです。
四分位計算して箱ひげ図作って、かつ平均値出せと言われたけど、どうやって出したら良いの?とコンピューター側が困っている、という状態です。
なので、たとえば、total_billとtipとsizeの箱ひげ図を出すとしましょう。
まず複数の列を抽出してほかの変数に格納しましょう。

I2 = I[[“total_bill”, “tip”, “size”]]
I2

この時注意するのは、I[“”]で列名を出せたと思いますが、今回複数なので、複数のときにはST = [“a”,”b”,”c”]と[]で入れてましたよね?
だからここでは[]の中に複数の[]を入れていて、[]の中に[]でリスト化していると思います。カッコの数を間違えるとエラーが出るのでお気を付けください。
これで、I2に数値だけのデータフレームができましたので、箱ひげ図を作ってみましょう。

fig, ax = plt.subplots()
NAME = I2.columns
ax.boxplot(I2,showmeans = True, labels =NAME )

同じ図が出来ましたでしょうか?
もしまた何か分からないことがありましたら、お気軽にお問い合わせください。

回答

I.corr()は、相関係数を算出する関数です。
相関係数を算出するためには、平均値と標準偏差が必要ですね?
すなわち、量的な計算することが可能な状態ではないと計算できません。
恐らくtipsを使っているのだと思うので、そのデータをまず見てみましょう。

このようなデータがtipsのデータです。
この中から、sexやsmokerなど、平均値と標準偏差が計算できないようなデータが入っています。
Pairplotは動いたとのことですが、図を見ると

こういう感じでしたよね?
これ、自動的に数値として計算できないものは入ってないことが分かりますか?pairplotは自動的に、数値データじゃないものを除外して、図を作ってくれます。しかしながら、corr()は真面目な関数で、愚直に全てで相関を出そうと頑張ってくれる結果、数値データも計算しようとして、混乱してエラーが出てます。
なので、私たち側がcorr()の関数で計算できるように、数値データだけの変数を作ります。

I2 = I[[“total_bill”, “tip”, “size”]]
I2

このように列を複数選択します。
このとき、注意するのは、I[“”]で列名を出せたと思いますが、今回複数なので、複数のときにはST = [“a”,”b”,”c”]と[]で入れてましたよね?
だからここでは[]の中に複数の[]を入れていて、[]の中に[]でリスト化していると思います。
カッコの数を間違えるとエラーが出るのでお気を付けください。
このI2に対して、corr()をやってみてください。恐らく問題なく動くと思います。

ちなみに、sexやsmokerをダミー変数としてreplaceしてってことであれば、相関係数も算出可能になります。
またはget_dummiesなどを使って、ダミー変数に変換するとそのまま使えたりします。

回答

Python3が表示されない場合で考えられるのはPython3がインストールされていないことが原因である可能性が高いと考えられます。
以下のサイトにあります、ダウンロードのページからPython3をダウンロードし、インストールしてみてください。

https://www.python.org/

これによって表示されるようになると思われます。

回答

こちらのZ値の算出は、不偏分散から算出されております。母集団を想定した、分析となるため、回帰分析に使用するZ値は基本不偏分散を使用します。
恐らく値が一致しなかったのは、STDEV.Pの関数での計算を実施していたのではないかと思います。
RでZ値変換の関数を使用すると、基本母集団想定のバラつきが算出され、Pythonでは基本は普通のバラつきが算出されます。

 

提出課題3

   統計学活用支援サイト