ゼロからはじめるデータサイエンス 第2版

―Pythonで学ぶ基本と実践

[cover photo]
TOPICS
Data Science , Database , Python
発行年月日
PRINT LENGTH
456
ISBN
978-4-87311-911-3
原書
Data Science from Scratch, 2nd Edition
FORMAT
Print PDF
Ebook
3,740円
Ebookを購入する
Print
3,740円

本書はPythonプログラミングを通してデータサイエンスの基本知識を「ゼロから学ぶ」ことができる入門書です。読者は架空のソーシャルネットワーク運営企業、データサイエンス・スター社のデータサイエンティストとして、さまざまな課題を解決しながら、必要な知識とスキルを着実に積み上げていきます。第1版の発刊から5年。その間、データサイエンスへの注目はますます高まり、Pythonはバージョンアップが進み、ライブラリは一層充実しました。このような変化に伴い、内容を全面的にアップデート。Pythonプログラミングの基礎から線形代数、統計確率の基礎、回帰、機械学習、ナイーブベイズ、決定木、ニューラルネットワーク、ディープラーニング、自然言語処理、ネットワーク分析、リコメンドシステム、データベースとSQL、MapReduce、データ倫理まで、データサイエンスに必要な幅広い知識をカバーします。

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

第1刷正誤表


pix、「コード例の使用」の後に囲みを追加

コードサンプル使用方法の追記(訳者補)

本書のコードは、各章のロジックを説明するためのものであると共に、ゼロからはじめるアプローチにより後の章のロジックを汲み上げる基礎でもあります。そのためGitHubで提供されている各章のコードは、ライブラリとして他の章のソースコードをimportしていますし、他の章のコードからimportされています。それらのコードが1つのサブディレクトリに格納されているため、実行に際して行うべき作業例を示します。


1. GitHubリポジトリをクローンする
筆者のGitHubから、コードをクローンします。ディレクトリ構造は以下のようになっています。


$ git clone https://github.com/joelgrus/data-science-from-scratch
$ tree -d data-science-from-scratch
data-science-from-scratch/
├── first-edition
│   ├── code
│   └── code-python3
├── im
└── scratch

2. 環境変数PYTHONPATHを設定する
クローンしたディレクトリを、環境変数PYTHONPATHに設定します。

Linux, macOSの場合
$ export PYTHONPATH=(git cloneを実行したパス)/data-science-from-scratch
Windowsの場合
C:\> set PAYTHONPATH=(git cloneを実行したパス)/data-science-from-scratch

3. ソースコードを実行する
Anacondaなどをインストール済みでpythonコマンドは実行できる状態になっていることを想定しています。pythonコマンドの実行はクローンしたリポジトリの直下、つまり、data-science-from-scratchの下で行います。環境変数を設定したことで、実行はどこからでも可能になりますが、data-science-from-scratchにあるデータファイルの読み込みや、imサブディレクトリへファイルを出力するコードがあるためです。

ソースコードはすべてscratchサブディレクトリの下にあるので、pythonコマンドに指定するソースコードは、ファイル名にscratch/を補います。


$ python scratch/introduction.py

なお、それぞれの章で使ったコードに対応するソースコードのファイル名は以下の通りです。


ファイル名
1章introduction.py
2章crash_course_in_python.py
3章visualization.py
4章linear_algebra.py
5章statistics.py
6章probability.py
7章inference.py
8章gradient_descent.py
9章getting_data.py
10章working_with_data.py
11章machine_learning.py
12章k_nearest_neighbors.py
13章naive_bayes.py
14章simple_linear_regression.py
15章multiple_regression.py
16章logistic_regression.py
17章decision_trees.py
18章neural_networks.py
19章deep_learning.py
20章clustering.py
21章nlp.py
22章network_analysis.py
23章recommender_systems.py
24章databases.py
25章mapreduce.py

p42、下から9行目

【誤】

def doubler(f):
    # 関数fへの参照を持つ関数を定義する
    def g(x):
        return 2 * f(x)

# その関数を返す
return g

【正】

def doubler(f):
    # 関数fへの参照を持つ関数を定義する
    def g(x):
        return 2 * f(x)

    # その関数を返す
    return g

p71から72にかけてのコード片

【誤】

# 関数名のアンダースコアは、これらが「プライベート」関数であることを示している。
# これらは、median関数によって呼び出されることを目的としているが、
# 我々の統計ライブラリを使用する人から呼び出されることを意図していない。
def _median_odd(xs: List[float]) -> float:
    """len(xs)が偶数の場合、中央値は中央の要素"""
    return sorted(xs)[len(xs) // 2]

def _median_even(xs: List[float]) -> float:
    """len(xs)が奇数の場合、中央値は中央の2つの要素の平均"""
    sorted_xs = sorted(xs)
    hi_midpoint = len(xs) // 2  # 例えば lengthが4ならhi_midpointは2
    return (sorted_xs[hi_midpoint - 1] + sorted_xs[hi_midpoint]) / 2

【正】

# 関数名のアンダースコアは、これらが「プライベート」関数であることを示している。
# これらは、median関数によって呼び出されることを目的としているが、
# 我々の統計ライブラリを使用する人から呼び出されることを意図していない。
def _median_odd(xs: List[float]) -> float:
    """len(xs)が奇数の場合、中央値は中央の要素"""
    return sorted(xs)[len(xs) // 2]

def _median_even(xs: List[float]) -> float:
    """len(xs)が偶数の場合、中央値は中央の2つの要素の平均"""
    sorted_xs = sorted(xs)
    hi_midpoint = len(xs) // 2  # 例えば lengthが4ならhi_midpointは2
    return (sorted_xs[hi_midpoint - 1] + sorted_xs[hi_midpoint]) / 2

p194、下から15~10行目のコード(最後の3行のインデントを修正)

【誤】

        else:
            log_prob_if_spam += math.log(1.0 - prob_if_spam)
            log_prob_if_ham += math.log(1.0 - prob_if_ham)
            prob_if_spam = math.exp(log_prob_if_spam)
            prob_if_ham = math.exp(log_prob_if_ham)
            return prob_if_spam / (prob_if_spam + prob_if_ham)

【正】

        else:
            log_prob_if_spam += math.log(1.0 - prob_if_spam)
            log_prob_if_ham += math.log(1.0 - prob_if_ham)

    prob_if_spam = math.exp(log_prob_if_spam)
    prob_if_ham = math.exp(log_prob_if_ham)
    return prob_if_spam / (prob_if_spam + prob_if_ham)

p308、脚注

【誤】
訳注:ページの構造が変更されたのだと思われるが、翻訳の時点ではarticle-bodyではなく、main-post-radarcontentを探す必要があった。
【正】
訳注:ページの構造が変更されたのだと思われるが、翻訳の時点ではarticle-bodyではなく、main-post-radar-contentを探す必要があった。


p328、下から9行目から5行目のコード

【誤】

model = Sequential([
    # (word_idのベクトルとして)単語が与えられたら、その埋め込み層を調べる
    # 周囲の単語のスコアを計算するために、線形層を使う
    Linear(input_dim=EMBEDDING_DIM, output_dim=vocab.size)
])

【正】

model = Sequential([
    # (word_idのベクトルとして)単語が与えられたら、その埋め込み層を調べる
    embedding,
    # 周囲の単語のスコアを計算するために、線形層を使う
    Linear(input_dim=EMBEDDING_DIM, output_dim=vocab.size)
])

p351、下から13行目から7行目のコード

【誤】

    for iter in tqdm.trange(num_iters):
        next_pr = {user.id : base_pr for user in users}  # 初期値をbase_prとする

    for source, target in endorsements:
        # リンクもとのページランクを減らしてリンク先のページランクに追加
        next_pr[target] += damping * pr[source] / outgoing_counts[source]

        pr = next_pr

    return pr

【正】

    for iter in tqdm.trange(num_iters):
        next_pr = {user.id : base_pr for user in users}  # 初期値をbase_prとする

        for source, target in endorsements:
            # リンクもとのページランクを減らしてリンク先のページランクに追加
            next_pr[target] += damping * pr[source] / outgoing_counts[source]

        pr = next_pr

    return pr

p367

【誤】
24.1 表の作成(CLEATE TABLE)と行の追加(INSERT)

【正】
24.1 表の作成(CREATE TABLE)と行の追加(INSERT)

目次

訳者まえがき
第2版のまえがき
第1版のまえがき

1章 イントロダクション
    1.1 データに支配された世界
    1.2 データサイエンスとは
    1.3 仮想事例:データサイエンス・スター社にて
        1.3.1 キーコネクタを探せ
        1.3.2 知り合いかも?
        1.3.3 給与と経験値
        1.3.4 有料アカウント
        1.3.5 興味に関するあれこれ
        1.3.6 明日以降に向けて

2章 Python速習コース
    2.1 Zen of Python
    2.2 Pythonの入手
    2.3 仮想環境
    2.4 空白によるフォーマット
    2.5 モジュール
    2.6 関数
    2.7 文字列
    2.8 例外
    2.9 リスト
    2.10 タプル
    2.11 辞書
        2.11.1 defaultdict クラス
    2.12 Counter クラス
    2.13 集合
    2.14 実行順制御
    2.15 真偽
    2.16 ソート
    2.17 リスト内包表記
    2.18 自動テストとアサート
    2.19 オブジェクト指向プログラミング
    2.20 イテレータとジェネレータ
    2.21 乱数
    2.22 正規表現
    2.23 関数型プログラミング
    2.24 zipと引数展開
    2.25 args とkwargs
    2.26 型アノテーション
        2.26.1 型アノテーションの書き方
    2.27 データサイエンス・スター社へようこそ!
    2.28 さらなる探求のために

3章 データの可視化
    3.1 matplotlib
    3.2 棒グラフ
    3.3 折れ線グラフ
    3.4 散布図
    3.5 さらなる探求のために

4章 線形代数
    4.1 ベクトル
    4.2 行列
    4.3 さらなる探求のために

5章 統計
    5.1 データの特徴を表す
        5.1.1 代表値
        5.1.2 散らばり
    5.2 相関
    5.3 シンプソンのパラドクス
    5.4 その他相関係数についての注意点
    5.5 相関関係と因果関係
    5.6 さらなる探求のために

6章 確率
    6.1 従属と独立
    6.2 条件付き確率
    6.3 ベイズの定理
    6.4 確率変数
    6.5 連続確率分布
    6.6 正規分布
    6.7 中心極限定理
    6.8 さらなる探求のために

7章 仮説と推定
    7.1 統計的仮説検定
    7.2 事例:コイン投げ
    7.3 p値
    7.4 信頼区間
    7.5 pハッキング
    7.6 事例:A/Bテストの実施
    7.7 ベイズ推定
    7.8 さらなる探求のために

8章 勾配降下法
    8.1 勾配降下法の考え方
    8.2 勾配の評価
    8.3 勾配を利用する
    8.4 最善の移動量を選択する
    8.5 勾配降下法を使用してモデルを適合させる
    8.6 ミニバッチと確率的勾配降下法
    8.7 さらなる探求のために

9章 データの取得
    9.1 stdin とstdout
    9.2 ファイルの読み込み
        9.2.1 テキストファイルの基礎
        9.2.2 区切り文字を使ったファイル
    9.3 Webスクレイピング
        9.3.1 HTMLとその解析
        9.3.2 事例:議会の行動に目を光らせる
    9.4 API を使う
        9.4.1 JSONとXML
        9.4.2 認証が不要なAPIを使う
        9.4.3 必要なAPIの探索
    9.5 事例:Twitter API
        9.5.1 認証の取得
    9.6 さらなる探求のために

10章 データの操作
    10.1 データの調査
        10.1.1 1次元データの調査
        10.1.2 2次元データ
        10.1.3 多次元データ
    10.2 名前付きタプル(NamedTuple)の利用
    10.3 データクラス(Dataclass)
    10.4 データの整理と変換
    10.5 データの操作
    10.6 スケールの変更
    10.7 余談:tqdm
    10.8 次元削減
    10.9 さらなる探求のために

11章 機械学習
    11.1 モデリング
    11.2 機械学習とは?
    11.3 過学習と未学習
    11.4 正確さ
    11.5 バイアス-バリアンス トレードオフ
    11.6 特徴抽出と特徴選択
    11.7 さらなる探求のために

12章 k近傍法
    12.1 モデル
    12.2 事例:Irisデータセット
    12.3 次元の呪い
    12.4 さらなる探求のために

13章 ナイーブベイズ
    13.1 非常に単純なスパムフィルタ
    13.2 より高度なスパムフィルタ
    13.3 実装
    13.4 モデルの検証
    13.5 モデルの適用
    13.6 さらなる探求のために

14章 単純な線形回帰
    14.1 モデル
    14.2 勾配降下法
    14.3 最尤推定
    14.4 さらなる探求のために

15章 重回帰分析
    15.1 モデル
    15.2 最小二乗モデルへの追加前提
    15.3 モデルの適合
    15.4 モデルの解釈
    15.5 適合度
    15.6 余談:ブートストラップ
    15.7 回帰係数の標準誤差
    15.8 正則化
    15.9 さらなる探求のために

16章 ロジスティック回帰
    16.1 問題
    16.2 ロジスティック関数
    16.3 モデルの適用
    16.4 適合度
    16.5 サポートベクタマシン
    16.6 さらなる研究のために

17章 決定木
    17.1 決定木とは
    17.2 平均情報量(エントロピー)
    17.3 分割のエントロピー
    17.4 決定木の生成
    17.5 ひとつにまとめる
    17.6 ランダムフォレスト
    17.7 さらなる探求のために

18章 ニューラルネットワーク
    18.1 パーセプトロン
    18.2 フィードフォワードニューラルネットワーク
    18.3 逆伝播誤差法(バックプロパゲーション)
    18.4 事例:Fizz Buzz
    18.5 さらなる探求のために

19章 ディープラーニング
    19.1 テンソル(Tensor)
    19.2 層の抽象化
    19.3 線形層
    19.4 層のシーケンスで表現するニューラルネットワーク
    19.5 損失の最適化
    19.6 事例:修正版XOR
    19.7 その他の活性化関数
    19.8 事例:修正版Fizz Buzz
    19.9 ソフトマックスと交差エントロピー
    19.10 ドロップアウト(Dropout)
    19.11 事例:MNIST
    19.12 モデルの保存と読み込み
    19.13 さらなる探求のために

20章 クラスタリング
    20.1 考え方
    20.2 モデル
    20.3 事例:交流会
    20.4 kの選択
    20.5 事例:色のクラスタリング
    20.6 凝集型階層的クラスタリング
    20.7 さらなる探求のために

21章 自然言語処理
    21.1 ワードクラウド
    21.2 n-gramモデル
    21.3 文法
    21.4 余談:ギブスサンプリング
    21.5 トピックモデリング
    21.6 ワードベクトル
    21.7 リカレントニューラルネットワーク
    21.8 事例:文字単位のRNN
    21.9 さらなる探求のために

22章 ネットワーク分析
    22.1 媒介中心性
    22.2 固有ベクトル中心性
        22.2.1 行列乗算
        22.2.2 中心性
    22.3 有向グラフとページランク
    22.4 さらなる探求のために

23章 リコメンドシステム
    23.1 手作業によるキュレーション
    23.2 人気の高いものをお勧めする
    23.3 ユーザベース協調フィルタリング
    23.4 アイテムベース協調フィルタリング
    23.5 行列分解
    23.6 さらなる探求のために

24章 データベースとSQL
    24.1 表の作成(CLEATE TABLE)と行の追加(INSERT)
    24.2 行の更新(UPDATE)
    24.3 行の削除(DELETE)
    24.4 行の問い合わせ(SELECT)
    24.5 グループ化(GROUP BY)
    24.6 並び替え(ORDER BY)
    24.7 結合(JOIN)
    24.8 サブクエリ
    24.9 インデックス
    24.10 クエリ最適化
    24.11 NoSQL
    24.12 さらなる探求のために

25章 MapReduce
    25.1 事例:単語のカウント
    25.2 MapReduceを使う理由
    25.3 一般的なMapReduce
    25.4 事例:近況更新の分析
    25.5 事例:行列乗算
    25.6 余談:コンバイナ
    25.7 さらなる探求のために

26章 データ倫理
    26.1 データ倫理とは
    26.2 実際のところデータ倫理とは何なのか
    26.3 データ倫理を考慮する必要はあるか
    26.4 データ問題を引き起こした製品
    26.5 精度と公平性のトレードオフ
    26.6 対敵協力
    26.7 解釈可能性
    26.8 リコメデーション
    26.9 偏ったデータ
    26.10 データ保護
    26.11 まとめ
    26.12 さらなる探求のために

27章 前進しよう、データサイエンティストとして
    27.1 IPython
    27.2 数学
    27.3 既存のライブラリを活用する
        27.3.1 NumPy
        27.3.2 pandas
        27.3.3 scikit-learn
        27.3.4 可視化
        27.3.5 R
        27.3.6 ディープラーニング
    27.4 データの供給源
    27.5 データサイエンスを活用しよう
        27.5.1 Hacker News記事分類器
        27.5.2 消防車ランク
        27.5.3 固有Tシャツ
        27.5.4 ツイート地球儀
        27.5.5 データサイエンスを使って何をしますか?

付録A 日本語に関する補足
    A.1 和文対応のtokenize関数

索引