Pythonによるデータ分析入門 第2版

―NumPy、pandasを使ったデータ処理

[cover photo]
TOPICS
Programming , Database , Python
発行年月日
PRINT LENGTH
596
ISBN
978-4-87311-845-1
原書
Python for Data Analysis, 2nd Edition
FORMAT
PDF
Print
4,180円
この商品は品切れ再入荷未定です

NumPy、SciPy、pandas、Matplotlib、Jupyterをはじめ、高機能で使いやすい数学・科学計算用ライブラリが充実しているPythonは、科学計算、統計解析、機械学習のみならず、金融や経済分野でも広く利用されています。本書はPythonの代表的なデータ分析ツール、pandasの開発者Wes McKinneyによる、データ分析を行うための基本を網羅しています。すべてのサンプルコードはダウンロード可能で、Jupyter Notebookで対話的に試し、実際に手を動かしながら知識を確実なものにすることが可能です。Python 3に対応した待望の改訂版です。

正誤表

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

第1刷正誤表

第1刷正誤表

2018年12月28日更新

p.17、8行目

【誤】
IPythonのより深い部分について「付録A NumPy:応用編」で触れたいと思います。

【正】
IPythonのより深い部分について「付録B IPython システム上級編」で触れたいと思います。

p.20、図2-2の下2行目

【誤】
.ipynb.という拡張子のファイルができます

【正】
.ipynbという拡張子のファイルができます

p.82、表3-2、1項目目

【誤】

combinations(iterable, k)可能なk個の要素を持つタプルをiterableの中から生成する。この際、並び順は無視し、置換はしない(置換についてはcombinations_with_replacement関数のドキュメント参照)。

【正】

combinations(iterable, k)可能なk個の要素を持つタプルをiterableの中から生成する。この際、並び順が異なっていても組み合わせが同じであれば同一とみなし、復元抽出(訳注: たとえば、A、B、Cから2つ組み合わせ(combination)を取得するとき、復元抽出なしであれば、AB、BC、CAの3つとなるが、復元抽出をする場合、これらの3つに加えて、AA、BB、CCが追加されます。復元抽出をする場合、1つ目を引いて、2つ目を引くときに1つ目を除外しません。)はしない(復元抽出をする場合についてはcombinations_with_replacement関数のドキュメント参照)

p.98、表4-1、2項目目

【誤】

asarrayarrayと同様にndarrayを生成する。ただし入力がndarrayだった場合は新規に変数を生成しない。

【正】

asarrayarrayと同様にndarrayを生成する。ただし入力がndarrayだった場合は、コピーを作成することはない。

p.115、下から4行目

【誤】
modfはその一例で、Python標準のdivmodベクトル化したものです。divmodは実数を整数部分と小数部分に分ける関数であり、modfはこれを要素ごとに計算します。

【正】
modfはその一例で、Python組み込みのdivmod関数と同様な計算をベクトル化したものです。divmod関数を使うと実数を整数部分と小数部分に分けることができますが、modfではこの計算を要素ごとに行ってベクトルを戻します。

p.131、図4-4のすぐ下の段落

【誤】
したがって、np.randomを用いてこの1,000回のコイントスを記述し、それぞれの累積和を求めることができます。

【正】
したがって、np.randomを用いて(訳注:1つ前のコード例では、0か1をランダムに取得するために、NumPyではなくPython組み込みのrandom.randint(0, 1)を使っていました。NumPyでは、これとは仕様が異なり、np.random.randint(0, 2)とした場合、結果に2は含まれません。)この1,000回のコイントスを記述し、それぞれの累積和を求めることができます。

p.158、表の最終項目

【誤】

get_value, set_value メソッド行と列のラベルを指定して、1つの値を取得する。

【正】

get_value, set_value メソッド行と列のラベルを指定して、1つの値を選択する。

p.178、表5-9、2項目目

【誤】

matchある配列を、一意な値を持つ別の配列にするために、各値のインデックス位置を求める。データを整理するときや結合するときなどに役立つ。

【正】

get_indexerある配列を、一意な値を持つ別の配列にするために、各値のインデックス位置を求める。データを整理するときや結合するときなどに役立つ。

p.202、下から3行目

【誤】
これらのツールは、XLSファイルを読むのにxlrd、XLSXファイルを読むのにopenpyxlというアドオンパッケージを内部で使用しているので、

【正】
これらのツールは、Excelファイルの読み込みにはxlrd、書き込みにはxlrd(XLSファイル用)やopenpyxl(XLSXファイル用)というアドオンパッケージを内部で使用しているので、

p.224、下から2行目

【誤】
cutqcutは、この後の「データの集約とグループ演算」の章でも登場します。

【正】
cutqcutは、「10章 データの集約とグループ演算」でも登場します。

p.237

【誤】

findall指定した文字列に対してパターンマッチングを行い、重複せずに見つかったパターンすべてをリストにして戻す。

【正】

findall指定した文字列に対してパターンマッチングを行い、見つかったパターンから位置がオーバーラップしないものすべてをリストにして戻す。

p.291、訳者補記の3行目

【誤】
設定については、この後の説で扱っているのでそちらも参照してください

【正】
設定については、この後の「9.1.6 Matplotlibの設定」で紹介しているので、そちらも参照してください

p.312、「9.3 その他のPython用可視化ツール」の5行目

【誤】
対話的に画像を作成することが可能になっています。

【正】
対話的に操作できる画像を作成することが可能になっています。

p.320、一番下の段落

【誤】
例えば、例に使っているdfの例をdtypeを使って次のようにグループ化することができます。

【正】
例に使っているdfでは、dtypeを使って次のようにグループ化することができます。

p.322、「10.1.3 ディクショナリやシリーズのグループ化」のコードブロック内コメント

【誤】

In [36]: people.iloc[2:3, [1, 2]] = np.nan # Add a few NA values


【正】

In [36]: people.iloc[2:3, [1, 2]] = np.nan # NA値をいくつか追加

p.323、1番目のコードブロックの下

【誤】
シリーズにも固定サイズマッピングという似たような機能があります。

【正】
シリーズも固定サイズのマッピングとみなせるため、groupbyに渡して使うことができます。

p.338、一番下の段落

【誤】
先ほどのないように基づき、

【正】
先ほどの内容に基づき、

p.374、1段落目

【誤】
これは、頻度を目次に変換することで確認できます。

【正】
これは、頻度を日次に変換することで確認できます。

p.381、一番下のコードブロック

【誤】

In [216]: ts.resample('5min', closed='right').sum()
Out[216]:
1999-12-31 23:55:00     0
2000-01-01 00:00:00    15
2000-01-01 00:05:00    40
2000-01-01 00:10:00    11
Freq: 5T, dtype: int64


【正】

In [216]: ts.resample('5min').sum()
Out[216]:
2000-01-01 00:00:00    10
2000-01-01 00:05:00    35
2000-01-01 00:10:00    21
Freq: 5T, dtype: int64

p. 418, 「13.2 Patsyを使ったモデルの記述」の2段落目

【誤】
読者習得を手助けすることにします。

【正】
読者習得を手助けすることにします。

p.444、訳者補記の1番目のコードブロック

【誤】

agg_counts.take(24)    ->  America/Mazatlan     1     0
agg_counts.take(20)    ->  America/La_Paz       0     1
agg_counts.take(21)    ->  America/Lima         0     1
agg_counts.take(92)    ->  Europe/Volgograd     0     1
agg_counts.take(87)    ->  Europe/Sofia         0     1

この考え方について説明します。indexerの1列目のタイムゾーン情報と、2列目のインデックスの間には関連はありません。


【正】

agg_counts.take([24])    ->  America/Mazatlan     1     0
agg_counts.take([20])    ->  America/La_Paz       0     1
agg_counts.take([21])    ->  America/Lima         0     1
agg_counts.take([92])    ->  Europe/Volgograd     0     1
agg_counts.take([87])    ->  Europe/Sofia         0     1

この考え方について説明します。aggsort()で得られたindexerというシリーズのインデックスには意味がありません。

p.445、真ん中あたりの段落

【誤】

そうしたら、前出のコードのようにこの結果を横棒グラフとして描画しましょう。今回はseabornのbarplotに追加のオプションを指定し、積み上げグラフを作成します(図14-2)。

【正】
そうしたら、前出のコードのようにこの結果を横棒グラフとして描画しましょう。今回はseabornのbarplotに追加のオプションを指定し、タイムゾーンごとにOSデータを並べたグラフを作成します(図14-2)。

p.465、訳者補記の下から2行目

【誤】
1880年から2010年までの132年分が男女それぞれで262列

【正】
1880年から2010年までの131年分が男女それぞれで262列

p.540、下から3段落目

【誤】

Jupyter Notebook環境でコードブロックをプロファイリングするには、%%prunマジックコマンドを使用します。これはセルマジックであり、%記号が2つ重なることに注意してください。前出のrun_experiment関数を%%prunでプロファイリングする例を次に示します。

%%prun -s cumulative some_results = run_experiment()
print('Largest one we saw: {0}'.format(np.max(some_results)))
}

【正】

Jupyter Notebook環境でコードブロックをプロファイリングするには、%%prunマジックコマンドを 使用します。セル内の対象が1行のときはラインマジックである%prunを用い、セル内の複数行を対象にする場合はセルマジックである%%prunを用います。次の例は前出のrun_ experiment関数をラインマジック%prunでプロファイリングする例です。

%prun -s cumulative some_results = run_experiment()

第2刷正誤表

第2刷正誤表

2019年5月13日更新

p79、下から9行目

【誤】
他の例として、文字列のリストを、各文字列を構成する文字の数でソートするような場合を考えます。

【正】
他の例として、文字列のリストを、各文字列に含まれるユニークな文字の数でソートするような場合を考えます。

第3刷正誤表

第3刷正誤表

2020年12月7日更新


p.383、1行目

【誤】
loofsetに文字列か日付オフセットを指定します。
【正】
loffsetに文字列か日付オフセットを指定します。


p.383、一番上のコード片の直下の行

【誤】
shiftメソッドを使うことでも、looffsetを使わずにlooffsetと同じ結果を得ることはできます。
【正】
shiftメソッドを使うことでも、loffsetを使わずにloffsetと同じ結果を得ることはできます。

目次

訳者まえがき
まえがき

1章 はじめに
    1.1 この本で説明する内容
        1.1.1 どういうデータを扱うのか
    1.2 なぜPythonをデータ分析に使うのか
        1.2.1 「糊(グルー)」としてのPython
        1.2.2 「2つの言語」問題を解決する
        1.2.3 Pythonを使うべきではないケース
    1.3 必須のPythonライブラリ
        1.3.1 NumPy
        1.3.2 pandas
        1.3.3 Matplotlib
        1.3.4 IPythonとJupyter
        1.3.5 SciPy
        1.3.6 scikit-learn
        1.3.7 statsmodels
    1.4 インストールとセットアップ
        1.4.1 Windows
        1.4.2 Apple(macOS)
        1.4.3 GNU/Linux
        1.4.4 Pythonパッケージのインストールとアップデート
        1.4.5 Python 2とPython 3
        1.4.6 統合開発環境(IDE)とテキストエディタ
    1.5 コミュニティとカンファレンス
    1.6 この本の案内
        1.6.1 コード例
        1.6.2 例で使用しているデータ
        1.6.3 インポートにおける慣習
        1.6.4 専門用語(ジャーゴン、Jargon)

2章 Pythonの基礎、IPythonとJupyter Notebook
    2.1 Pythonインタプリタ
    2.2 IPythonの基礎
        2.2.1 IPythonシェルの起動
        2.2.2 Jupyter Notebookの実行
        2.2.3 タブ補完
        2.2.4 イントロスペクション
        2.2.5 %runコマンド
        2.2.6 クリップボード経由の実行
        2.2.7 IPythonのキーボードショートカット
        2.2.8 マジックコマンド
        2.2.9 Matplotlibとの連携
    2.3 Pythonの基礎
        2.3.1 セマンティクス
        2.3.2 スカラー型
        2.3.3 制御フロー

3章 Python組み込みのデータ構造と関数、ファイルの扱い
    3.1 データ構造とシーケンス
        3.1.1 タプル
        3.1.2 リスト
        3.1.3 組み込みのシーケンス関数
        3.1.4 ディクショナリ
        3.1.5 セット
        3.1.6 リスト、セット、ディクショナリの内包表記
    3.2 関数
        3.2.1 名前空間、スコープ、ローカル関数
        3.2.2 複数の値を戻す
        3.2.3 関数はオブジェクトである
        3.2.4 無名(ラムダ)関数
        3.2.5 カリー化:引数の部分適用
        3.2.6 ジェネレータ
        3.2.7 エラーと例外の処理
    3.3 ファイルとオペレーティングシステム
        3.3.1 ファイルにおけるバイトとUnicode
    3.4 まとめ

4章 NumPyの基礎:配列とベクトル演算
    4.1 NumPy ndarray:多次元配列オブジェクト
        4.1.1 ndarrayの生成
        4.1.2 ndarrayのデータ型
        4.1.3 ndarrayの算術演算
        4.1.4 インデックス参照とスライシングの基礎
        4.1.5 ブールインデックス参照
        4.1.6 ファンシーインデックス参照
        4.1.7 転置行列、行と列の入れ替え
    4.2 ユニバーサル関数:すべての配列要素への関数適用
    4.3 ndarrayによる配列指向プログラミング
        4.3.1 条件制御のndarrayでの表現
        4.3.2 数学関数、統計関数
        4.3.3 真偽値配列関数
        4.3.4 ソート
        4.3.5 集合関数:uniqueなど
    4.4 ndarrayのファイル入出力
    4.5 行列計算
    4.6 擬似乱数生成
    4.7 例:ランダムウォーク
        4.7.1 多重ランダムウォーク
    4.8 まとめ

5章 pandas入門
    5.1 pandasのデータ構造
        5.1.1 シリーズ(Series)
        5.1.2 データフレーム(DataFrame)
        5.1.3 インデックスオブジェクト
    5.2 pandasの重要な機能
        5.2.1 再インデックス付け
        5.2.2 軸から要素を削除する
        5.2.3 インデックス参照、選択、フィルタリング
        5.2.4 整数のインデックス
        5.2.5 算術とデータの整形
        5.2.6 関数の適用とマッピング
        5.2.7 ソートとランク
        5.2.8 重複したラベルを持つ軸のインデックス
    5.3 要約統計量の集計と計算
        5.3.1 相関と共分散
        5.3.2 一意な値、頻度の確認、所属の確認
    5.4 まとめ

6章 データの読み込み、書き出しとファイル形式
    6.1 テキスト形式のデータの読み書き
        6.1.1 テキストファイルを少しずつ読み込む
        6.1.2 テキスト形式でのデータの書き出し
        6.1.3 区切り文字で区切られた形式を操作する
        6.1.4 JSONデータ
        6.1.5 XMLとHTML:ウェブスクレイピング
    6.2 バイナリデータ形式
        6.2.1 HDF5形式の使用
        6.2.2 Microsoft Excelファイルの読み込み
    6.3 Web APIを用いたデータの取得
    6.4 データベースからのデータの取得
    6.5 まとめ

7章 データのクリーニングと前処理
    7.1 欠損値の取り扱い
        7.1.1 欠損値を削除する
        7.1.2 欠損値を穴埋めする
    7.2 データの変形
        7.2.1 重複の除去
        7.2.2 関数やマッピングを用いたデータの変換
        7.2.3 値の置き換え
        7.2.4 軸のインデックスの名前を変更する
        7.2.5 離散化とビニング
        7.2.6 外れ値の検出と除去
        7.2.7 順列(ランダムな並べ替え)やランダムサンプリング
        7.2.8 標識変数やダミー変数の計算
    7.3 文字列操作
        7.3.1 文字列オブジェクトのメソッド
        7.3.2 正規表現
        7.3.3 pandasにおける文字列関数のベクトル化
    7.4 まとめ

8章 データラングリング:連結、結合、変形
    8.1 階層型インデックス
        8.1.1 階層の順序変更やソート
        8.1.2 階層ごとの要約統計量
        8.1.3 データフレームの列をインデックスに使う
    8.2 データセットの結合とマージ
        8.2.1 データフレームをデータベース風に結合する
        8.2.2 インデックスによるマージ
        8.2.3 軸に沿った連結
        8.2.4 重複のあるデータの結合
    8.3 変形とピボット操作
        8.3.1 階層型インデックスによる変形
        8.3.2 「縦持ち」フォーマットから「横持ち」フォーマットへのピボット
        8.3.3 「横持ち」フォーマットから「縦持ち」フォーマットへのピボット
    8.4 まとめ

9章 プロットと可視化
    9.1 Matplotlib APIの概要
        9.1.1 図とサブプロット
        9.1.2 色、マーカー、線種
        9.1.3 目盛り、ラベル、凡例
        9.1.4 サブプロットへの注釈や描画
        9.1.5 プロットのファイルへの保存
        9.1.6 Matplotlibの設定
    9.2 pandasとseabornのプロット関数
        9.2.1 折れ線グラフ
        9.2.2 棒グラフ
        9.2.3 ヒストグラムと密度プロット
        9.2.4 散布図
        9.2.5 ファセットグリッドとカテゴリ型データ
    9.3 その他のPython用可視化ツール
    9.4 まとめ

10章 データの集約とグループ演算
    10.1 GroupByの仕組み
        10.1.1 グループをまたいだ繰り返し
        10.1.2 列や列の集合の選択
        10.1.3 ディクショナリやシリーズのグループ化
        10.1.4 関数を使ったグループ化
        10.1.5 インデックス階層によるグループ化
    10.2 データの集約
        10.2.1 列に複数の関数を適用する
        10.2.2 集約されたデータを行インデックスなしで戻す
    10.3 applyメソッド:一般的な分離-適用-結合の方法
        10.3.1 グループキーの抑制
        10.3.2 分位点とビン分析
        10.3.3 例:グループ固有の値で欠損値を埋める
        10.3.4 例:ランダムサンプリングと順列
        10.3.5 例:グループの加重平均と相関
        10.3.6 例:グループ指向の線形回帰
    10.4 ピボットテーブルとクロス集計
        10.4.1 クロス集計:crosstabメソッド
    10.5 まとめ

11章 時系列データ
    11.1 日付、時間のデータ型とツール
        11.1.1 文字列とdatetimeの変換
    11.2 時系列の基本
        11.2.1 インデックス参照、データの選択、サブセットの抽出
        11.2.2 重複したインデックスを持つ時系列
    11.3 日付範囲、頻度、シフト
        11.3.1 日付範囲の生成
        11.3.2 頻度と日付オフセット
        11.3.3 データの前方と後方へのシフト
    11.4 タイムゾーンを扱う
        11.4.1 タイムゾーンのローカライゼーションと変換
        11.4.2 タイムゾーンを考慮したタイムスタンプオブジェクト
        11.4.3 別のタイムゾーンとの演算
    11.5 期間を使った算術演算
        11.5.1 期間頻度の変換
        11.5.2 四半期の頻度
        11.5.3 タイムスタンプから期間への変換(とその逆)
        11.5.4 配列からPeriodIndexを作成する
    11.6 再サンプリングと頻度変換
        11.6.1 ダウンサンプリング
        11.6.2 アップサンプリングと穴埋め
        11.6.3 期間で再サンプリングする
    11.7 移動する窓関数
        11.7.1 指数加重関数
        11.7.2 2つ値がある場合の移動する窓関数
        11.7.3 ユーザ定義の移動する窓関数
    11.8 まとめ

12章 pandas:応用編
    12.1 カテゴリ型データ
        12.1.1 開発の背景と動機
        12.1.2 pandasにおけるカテゴリ型
        12.1.3 カテゴリを用いた計算
        12.1.4 カテゴリメソッド
    12.2 グループ演算の使い方:応用編
        12.2.1 グループの変換とGroupByの「分解」
        12.2.2 時系列データの再サンプリングを伴うグループ化
    12.3 メソッドチェーンを行うためのテクニック
        12.3.1 pipeメソッド
    12.4 まとめ

13章 Pythonにおけるモデリングライブラリ入門
    13.1 pandasとモデルとのやり取りを行う
    13.2 Patsyを使ったモデルの記述
        13.2.1 Patsy式におけるデータ変換
        13.2.2 カテゴリ型データとPatsy
    13.3 statsmodels入門
        13.3.1 線形モデルの推定
        13.3.2 時系列モデルの推定
    13.4 scikit-learn入門
    13.5 この後の学びのために

14章 データ分析の実例
    14.1 短縮URL Bitlyにおける1.usa.govへの変換データ
        14.1.1 Python標準機能でのタイムゾーン情報の集計
        14.1.2 pandasを使用したタイムゾーン情報の集計
    14.2 MovieLens 1M(映画評価データ)
        14.2.1 評価の分かれた映画の抽出
    14.3 アメリカの赤ちゃんに名付けられた名前リスト(1880-2010)
        14.3.1 名付けの傾向分析
    14.4 アメリカ合衆国農務省の食糧データベース
    14.5 2012年度連邦選挙委員会データベース
        14.5.1 職業別・雇用者別の寄付の分析
        14.5.2 寄付金額ごとの分析
        14.5.3 州ごとの寄付の分析
    14.6 まとめ

付録A NumPy:応用編
    A.1 ndarrayオブジェクトの内部構造
        A.1.1 NumPy dtypeの階層構造
    A.2 配列操作:応用編
        A.2.1 配列の形状の再成形
        A.2.2 C型の順序とFortran型の順序
        A.2.3 配列の結合と分割
        A.2.4 要素の繰り返し:tileとrepeat
        A.2.5 ファンシーインデックス参照の別法:takeとput
    A.3 ブロードキャスト
        A.3.1 他の軸へのブロードキャスト
        A.3.2 ブロードキャストによる配列への値の設定
    A.4 ufuncの使い方:応用編
        A.4.1 ufuncのインスタンスメソッド
        A.4.2 Pythonで新しいufuncを書く方法
    A.5 構造化配列とレコード配列
        A.5.1 ネストした構造を持つdtypeと多次元フィールド
        A.5.2 構造化配列を使うべき理由
    A.6 ソートについてさらに詳しく
        A.6.1 間接ソート:argsortとlexsort
        A.6.2 使用可能な他のソートアルゴリズム
        A.6.3 配列の一部分をソートする

        A.6.4 numpy.searchsorted:ソート済みの配列内で要素を探す
    A.7 Numbaを用いて高速なNumPy関数を書く
        A.7.1 独自定義のnumpy.ufuncオブジェクトをNumbaを用いて作成する
    A.8 配列の入出力:応用編
        A.8.1 メモリマップファイル
        A.8.2 HDF5やその他の配列保存方法
    A.9 パフォーマンス改善のための豆知識
        A.9.1 連続したメモリの重要性

付録B IPythonシステム上級編
    B.1 コマンド履歴
        B.1.1 コマンド履歴の検索とその再利用
        B.1.2 入出力変数
    B.2 オペレーティングシステムとの連携
        B.2.1 シェルコマンドとエイリアス(別名定義)
        B.2.2 ディレクトリブックマークシステム
    B.3 ソフトウェア開発ツール
        B.3.1 対話的デバッガ
        B.3.2 処理時間の計測:%timeと%timeit
        B.3.3 プロファイリングの基礎:%prunと%run -p
        B.3.4 行ごとのプロファイリング
    B.4 IPythonでの生産的コード開発に向けたヒント
        B.4.1 依存関係を考慮したモジュールの再読み込み
        B.4.2 コード設計のヒント
    B.5 高度なIPython機能
        B.5.1 自前のクラスのIPythonへの親和性を高める技法
        B.5.2 IPythonプロファイルと構成機能
    B.6 まとめ

索引