Pythonで学ぶあたらしい統計学の教科書の紹介

Pythonで学べる統計学の入門書を執筆しました。
「Pythonで学ぶあたらしい統計学の教科書」というタイトルです。

この記事では「Pythonで学ぶあたらしい統計学の教科書」の紹介をします。
サンプルコードやデータは出版社さんのサイトからダウンロードできます

 


Pythonで学ぶあたらしい統計学の教科書

 
出版社さんへのリンク
(詳細な情報はこちらを参照してください)
 
2018年 4月:初版第1刷発行
2018年 5月:初版第2刷発行
2018年10月:初版第3刷発行
2020年11月:初版第4刷発行

2019年11月:韓国語版が刊行されました

 

基本情報

出版社  : 翔泳社
著者   : 馬場真哉(このサイト、Logics of Blueの管理人です)
タイトル : Pythonで学ぶあたらしい統計学の教科書
発売日  : 2018年4月19日

 
2018年10月19日追記
目次などは出版社のサイトから確認できます。
出版社の書籍紹介記事でも、コンパクトに書籍の特徴を説明してくださっています。
対談形式でこの書籍の特徴について説明した記事はこちらです。この対談記事で伝えたいことはほぼ伝えたつもりです。

大変ありがたいことに、レビューをいくつかいただいています。
Pythonで学ぶあたらしい統計学の教科書|清水川のScrapbox
【書評】「Pythonで学ぶあたらしい統計学の教科書」|いのいち勉強日記

(追記終わり)

 

書籍の特徴

この本はPythonで学べる統計学の入門書です。
確率変数や確率分布という用語がなぜデータ分析に必要となるのかといった基礎の基礎から、区間推定や統計的仮説検定、そして統計モデルや機械学習とのつながりまで、少しずつステップアップしていくような構成になっています。

Pythonを使ったデータ分析に興味がある方はもちろん、高度な教科書の副読本として、あるいは機械学習を学ぶ前の基礎固めとしてもお使いいただけると思っています。

 
2018年10月19日追記
発売から半年たちましたので、「Pythonで学ぶあたらしい統計学の教科書」の立ち位置や特徴を、もう少し詳細にここで説明します。

「Pythonで学ぶあたらしい統計学の教科書」の大きな特徴は、区間推定や仮説検定で終わるのではなく、統計モデリングまで対象としたことです。回帰分析は、正規線形モデルあるいは一般化線形モデルという枠組みから解説されます。
機械学習にも一部触れました。

扱うテーマが多岐にわたるため、書籍の書き方を工夫しました。
まずは、「日本語・数式・Pythonコードで3回同じことを説明する」というやり方です。個別のテーマに関する理解度を高めるために導入しました。前段についての最低限の理解をした後で次に移る構成になっています。
テーマ同士の関連を理解していただくために、節を細かく分割し、「用語」や「補足」「実装」といったヘッダーを節のタイトルに付けました。自分が今、何を学んでいるのかを整理しながら読み進めていただくためです。節タイトルを含めた詳細な目次は、出版社サイトで書籍の立ち読みをすることで参照できます。

サンプルコードは、Pythonらしい簡潔な物を目指しました。変数名1つ1つにも(スペースが許す限り)こだわっています。例えば変数名「a1」みたいなのはほとんど出てきません。

実務面に配慮して、パッケージは有名なものだけを使いました。仮説検定はscipyを多用し、統計モデル(正規線形モデル・一般化線形モデル)ではstatsmodelsを中心に使いました。両者ともに、短いコードで効率的に実装できます。細かいことを書くと、statsmodelsによるモデリングの際はstatsmodels.formula.apiを中心に使い、例えば『sales ~ temperature』のように『応答変数 ~ 説明変数』のformula形式で実装する方式を採用しました。これはR言語でも採用されているもので、直観的にモデルの構造を指定することができます。

グラフはほぼすべてseabornの使用を前提としているので、単にmatplotlibを使うよりも美麗なグラフが描けます。グラフのコードにもこだわりました。整然データというデータ形式を重視したため、短いコードで美しいグラフが描けます。整然データについては本文中で説明があります。
(追記終わり)

 

書籍の内容

第1部で統計学の基礎を学びます。数量データとカテゴリデータの違いや階級・ヒストグラムといった基本事項から説明します。

第2部でPythonの基礎を学びます。基本的な構文やnumpy、pandasの簡単な解説があります。

第3部でPythonを用いたデータ分析を学びます。データの集計やseabornを使った図示、標本分布のシミュレーションから始まり、scipy.statsを用いた区間推定や統計的仮説検定までを学びます。

第4部で統計モデルの基礎を学びます。線形モデルの構築方法の概要や、最尤法や最小二乗法といった理論を学びます。

第5部でstatsmodelsパッケージを用いた正規線形モデルの構築を学びます。

第6部でstatsmodelsパッケージを用いた一般化線形モデルの構築を学びます。

第7部で正則化やニューラルネットワークを通して、機械学習と統計学のつながりに触れます。sklearnを用いた分析事例も併せて紹介します。

 

この本に載っていること・載っていないこと

統計学の基礎から統計モデルまで少しずつステップアップしていこうという方針で執筆しました。
基礎の基礎から統計モデルへ至る流れがわかるのは長所だと思います。
一方で、個別のテーマはやや内容が少なくなっています。適宜参考文献を挙げるようにはしましたが、詳細な議論はこういった文献に譲るところも一部あります。
また、ベイズ統計学への言及はありません。

Pythonで検定やGLMを手軽に実行したいと思っている方にはちょうど良いと思います。scipy.statsやstatsmodels、sklearnを積極的に活用したため、この本に載っているレベルの分析であれば、R言語のようにスムーズな実装ができます。
また、シミュレーションもしばしば利用したので、しっかりした入門書を読む際の副読本としても使いやすい構成になったかと思います。標準偏差と標準誤差の違いがよくわからないという方は、第3部のシミュレーションの結果を眺めると少し理解が深まるかもしれません。
逆に、こういったところを重視しているので、応用面はやや少なくなっています。
初学者寄りの内容であることには留意してください。

 
 
更新履歴
2018年4月4日:新規追加
2018年4月20日:データのダウンロードページへのリンクを追加
2018年10月19日:重版に合わせて、書籍の説明などを追記
2020年 6月26日:韓国語版について追記
2020年12月27日:重版した旨を追記

 

Pythonで学ぶあたらしい統計学の教科書の紹介” に対して10件のコメントがあります。

  1. TK より:

    大学のAI・データサイエンス教育の推薦図書に入れさせていただきました。昨今のデータサイエンス教育熱の高まりで、大学業界でも続々と「データサイエンス学部(学科・専攻)」などの設置がされています。
    http://between.shinken-ad.co.jp/univ/2019/08/datascience.html

    理系学生はもとより、文系学生もリテラシーとしてAI・数理・データサイエンスが必須とされてきているようです(文理融合)。馬場さんの著書は、これからデータサイエンスを学ぶ文理すべての学生の助けとなる貴重な本です。引き続き、良書のご出版を期待しています。

    1. 馬場真哉 より:

      KT様

      コメントありがとうございます。
      また、拙著を推薦図書に入れていただき、誠にありがとうございます。
      これからも、微力ながら、統計学などのデータ活用技術の普及に努めて参ります。
      今後ともよろしくお願いいたします。

  2. 小山 雄平 より:

    いつも馬場先生のサイトや書籍で勉強させて頂いております。
    Pythonで学ぶあたらしい教科書のp280についてです。
    ここで、
    import statsmodels.formula.api as smf
    import statsmodels.api as sm
    と2つの統計分析ライブラリをインポートしていますが、
    これらの違いはどのようなものでしょうか。
    また、これらは二つともインポートしないと本書に記載されている分析はできないのでしょうか。
    恐れ入りますがよろしくお願いいたします。

    1. 馬場真哉 より:

      小山様

      コメントありがとうございます。
      管理人の馬場です。
      拙著をお読みいただき、ありがとうございます。

      「import statsmodels.formula.api as smf」はformula構文を利用してモデルを推定するために利用します。
      例えばp283のコードでは「formula = “beer ~ temperature”」のように応答変数と説明変数をシンプルに記述しています。
      このような実装をするためにformula.apiが必要です。

      一方で、formula構文を使ったモデル化以外では、「import statsmodels.api as sm」の機能を利用します。
      例えばp298のQ-Qプロットを作成するコードでは、こちらをインポートしないと動きません。

      一部の章では片方だけインポートすれば動くこともあるかもしれませんが、
      基本的には両方ともインポートすることをお勧めします。

      1. 小山 雄平 より:

        馬場先生
        ご丁寧にご回答頂きありがとうございました。
        両方ともインポートするようにいたします。
        こちらの書籍、基礎から大変わかりやすく解説されており大変勉強になります。
        今後、増刷や改訂版が続くことを期待しております。

  3. T.F より:

    馬場先生
    Python初心者です。丁寧なStep By Stepに進めて頂く先生の書籍を基に少しずつ独学しております。
    1つ基本的な質問をさせてください。
    P160 5-4標本平均を何度も計算してみる のパートで
    randam.seed(1)を指定していますので、何回試行しても同じサンプルが取得できるのでsp.mean(sample)も10000回同じになります。
    (下記でためしたところ3.22)
    np.random.seed(1)
    sample = population.rvs(size = 10)
    sample_mean = sp.mean(sample)
    sample_mean
    #sample結果は毎回同じ

    一方で、書籍に記載頂いているfor構文で10000回繰り返すと確かに10000回違う標本平均が格納されているのですが、np.random.seed(1)がfor構文の中では同じ乱数を取得しなくなるのはどのように理解すればよろしいでしょうか?
    ご教授頂けると幸いです

    1. 馬場真哉 より:

      拙著お読みいただきありがとうございます。

      np.random.seed(1)を実行するたびに、乱数が固定されます。
      すなわち「1度だけ」np.random.seed(1)を実行した後、「複数回連続して」population.rvs(size = 10)を実行するとpopulation.rvs(size = 10)は毎回異なる結果を出力します。

      以下の3行のコードをまとめて実行してみてください。おそらく異なる乱数が出力されるはずです。
      np.random.seed(1)
      population.rvs(size = 10)
      population.rvs(size = 10)

      forループでは、population.rvs(size = 10)を複数回実行しているので、10000回違う標本平均が格納されます。

      参考になれば幸いです。

      1. T.F より:

        馬場先生、突然の質問に対し丁寧にご返事頂きありがとうございます。

        np.random.seed(1)
        population.rvs(size = 10)
         を実行すると、乱数が固定されるため、何回実行しても、配列は下記で一定です。
        array([5.299, 3.511, 3.577, 3.142, 4.692, 2.159, 5.396, 3.391, 4.255, 3.801])

        次に先生にご提示頂いた
        np.random.seed(1)
        population.rvs(size = 10)
        population.rvs(size = 10)
         を実行するとこちらも何回実行しても結果は下記の配列で一定でした。
        array([5.17 , 2.352, 3.742, 3.693, 4.907, 3.12 , 3.862, 3.298, 4.034, 4.466])

        冒頭のnp.random.seed(1)の指定で乱数は固定されるため、1回目は必ずarray([5.299, 3.511, 3.577, 3.142, 4.692, 2.159, 5.396, 3.391, 4.255, 3.801])が取得するされ、2回目に試行した時の配列は1回目とは違う配列ではあるが、必ずarray([5.17 , 2.352, 3.742, 3.693, 4.907, 3.12 , 3.862, 3.298, 4.034, 4.466])を返すという認識で合っておりますでしょうか?

        1. 馬場真哉 より:

          > 2回目に試行した時の配列は1回目とは違う配列ではあるが、必ずarray([5.17 , 2.352, 3.742, 3.693, 4.907, 3.12 , 3.862, 3.298, 4.034, 4.466])を返すという認識で合っておりますでしょうか?
          はい。その通りです。
          だからこそ10000回population.rvs(size = 10)を実行するforループにおいては、10000回異なる乱数が得られるわけですね。

          1. T.F より:

            馬場先生
            返信ありがとうございます。お礼が遅くなりすみません。
            ※本日、書店で第2版を見つけ、拝読させて頂く事にしました。まだ読み始めた所ですが、単なる刷り直しではなく、更にPhythonと統計学を平行して理解を進めやすい作り立てになっていると感じました。この場をお借りしてお礼申し上げます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください