Pythonによるデータ処理のテキスト

Pythonでデータ処理をするために必要となる方法についてのテキストを作成しています．
　
－－－－－－－－－－－－－－－－－－－－－
● [テキストの試作品（PDF形式148ページ:1.32MB）](http://www.k-techlabo.org/www_python/python_stat.pdf)　2022/03/31更新
　[（→ミラーサイトからDL）](https://ktechlabo.xsrv.jp/www_python/python_stat.pdf)
　使用しているモジュール：
　JupyterLab, pandas, NumPy, SciPy, matplotlib, SQLAlchemy
　[→テキスト中の実行例（Jupyter Notebook）](http://www.k-techlabo.org/blog2/?page_id=1318)
－－－－－－－－－－－－－－－－－－－－－
[Python自体のテキストはこちら](https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975)で公開しています．
　
(2018/05/12)
学校でプログラミング教えています．
学生にデータ処理を教えるためのテキストを作っています．
　
Pythonをベースにしていますが，色んなシステムやパッケージを混在して使うことになりますので，初心者が見ると「何がどれだけあって，何をしているのか分からない」という状態になると思います．
それでとりあえず，
・作業環境はPython + JupyterLab
・表の扱いはpandas
・データの保存形式はCSVファイルとSQLデータベース（SQLite3）
・統計処理はNumPy + SciPy
と，使用するツールを限定して使い方を解説しています．
　
このテキストはまだ試作品の段階ですので，ご使用になる場合はあくまで「参考資料」というご理解でお願いします．
　
最終的には，Pythonによる統計処理の入門テキストにしたいと考えていまして，ご指摘やご提案，ご助言いただけましたらありがたいです．
　
テキストの著作権は保持していますが，フリーソフトとして公開します．

### 補足事項，ご案内など
---------------------------------------
【補足】(2022/03/14-31)
　DataFrameの複製に関する基本的な解説を追加．
　Intervalクラスに関する部分に加筆．
　Timestampクラスに関する部分に加筆．
　折れ線グラフに関する部分に加筆．
　円グラフ，棒グラフ，散布図に関する基本的な解説を追加．
　crosstabとpivot_tableを明確に区別して解説する形にしました．
　その他，修正多数．（まだ続きます）

---------------------------------------
【補足】(2021/09/01-16)
　pandasの非推奨の機能（.valuesプロパティ）を使用して解説している部分を修正．
　DataFrameの解説の章の構成を若干変更．
　DataFrameの連結方法の解説が誤解を与えるものでしたので修正しました．
　Excelファイルの入出力機能に関する解説は一旦削除しました．（今後検討）
　統計学の用語解説の部分に良くない点が散見されます．これに関してもメンテナンス続けます．

---------------------------------------
【補足】(2021/08/04-30)
　pandasのSeries，DataFrameに関する解説に若干追記しました．
　pandasのアップデートへの対応．Seriesが重複するインデックス要素を持つ際のatプロパティの参照結果が旧版と異なっていたので修正しました．

　非推奨の機能を使用して説明している箇所が散見されます．しばらくメンテナンス続けます．

---------------------------------------
【補足】(2019/03/21-07/16)
　全面的に作り直しました．（修正ではなく）
[旧版](http://www.k-techlabo.org/www_python/python_stat_old.pdf)は，実際の教育現場で使ってみたところ使いにくさが露呈しました．pandasのデータ構造に関することから細かく解説することにしました．
　当分は修正と加筆が続くと思います．

---------------------------------------
【補足】(2018/05/13)
　統計学の用語や基礎知識についても解説していますが，このあたりはまだ「要注意項目」です．標準的な教科書に沿って，要約した解説をしていますが，かなり手を加えないといけないと考えています．「統計検定」の教科書も参考にしはじめています．
　機械学習用パッケージの使用方法についても掲載を検討中です．

### 目次
1　はじめに　---　1
　　1.1　本書を読むに当たって　---　1
　　1.2　作業環境について　---　1
2　データ構造　---　1
　　2.1　Series（pandasのデータ構造）　---　2
　　　　2.1.1　インデックスに基づくアクセス　---　3
　　　　　　2.1.1.1　ドット ’.’表記によるアクセス　---　4
　　　　2.1.2　格納順位に基づくアクセス　---　5
　　　　2.1.3　スライスを用いたアクセス方法　---　5
　　　　　　2.1.3.1　スライスに整数値を与える場合　---　5
　　　　　　2.1.3.2　スライスに非整数のインデックス項目を与える場合　---　6
　　　　2.1.4　要素の抽出　---　7
　　　　　　2.1.4.1　条件式から真理値の列を生成する方法　---　7
　　　　2.1.5　重複するインデックスを持つSeriesの扱い　---　8
　　　　2.1.6　Seriesからndarrayへの変換　---　9
　　　　　　2.1.6.1　データとしてのインデックス　---　9
　　　　　　2.1.6.2　インデックスの検索　---　10
　　　　2.1.7　ndarrayからSeriesへの変換　---　11
　　　　2.1.8　整列（ソート）　---　12
　　　　　　2.1.8.1　整列順序の指定　---　12
　　　　　　2.1.8.2　インデックスに沿った整列　---　13
　　　　2.1.9　要素の削除　---　13
　　　　　　2.1.9.1　dropメソッド　---　13
　　　　　　2.1.9.2　del文による削除　---　15
　　　　2.1.10　Seriesオブジェクトの変更と複製について　---　15
　　　　2.1.11　Seriesオブジェクトの連結　---　16
　　　　2.1.12　インデックスの再設定　---　16
　　　　　　2.1.12.1　reset＿indexメソッドによる方法　---　16
　　　　　　2.1.12.2　与えた項目列でインデックスで置き換える方法　---　17
　　　　2.1.13　マルチインデックス　---　17
　　　　　　2.1.13.1　インデックスレベルを指定した整列　---　18
　　　　　　2.1.13.2　インデックスレベルへの名前の付与　---　19
　　　　2.1.14　その他　---　20
　　　　　　2.1.14.1　開始部分/終了部分の取り出し　---　20
　　2.2　DataFrame（pandasのデータ構造）　---　21
　　　　2.2.1　DataFrameの生成　---　21
　　　　　　2.2.1.1　リストからDataFrameを生成する方法　---　21
　　　　　　2.2.1.2　NumPyの配列（ndarray）からDataFrameを生成する方法　---　22
　　　　　　2.2.1.3　辞書からDataFrameを生成する方法　---　22
　　　　2.2.2　DataFrameの要素にアクセスする方法　---　23
　　　　　　2.2.2.1　at によるアクセス　---　23
　　　　　　2.2.2.2　NaN（欠損値）について　---　23
　　　　　　2.2.2.3　iat によるアクセス　---　24
　　　　　　2.2.2.4　loc による方法　---　25
　　　　　　2.2.2.5　iloc による方法　---　26
　　　　　　2.2.2.6　列（カラム）の取出しと追加　---　27
　　　　　　2.2.2.7　ドット ’.’表記による列（カラム）へのアクセス　---　29
　　　　　　2.2.2.8　行の取出しと追加　---　30
　　　　　　2.2.2.9　DataFrameをNumPyの配列（ndarray）に変換する方法　---　31
　　　　　　2.2.2.10　データとしてのインデックスとカラム　---　32
　　　　　　2.2.2.11　データの格納位置の調査　---　32
　　　　2.2.3　整列（ソート）　---　33
　　　　　　2.2.3.1　整列順序の指定　---　33
　　　　　　2.2.3.2　インデックスに沿った整列　---　33
　　　　2.2.4　行，列の削除　---　34
　　　　　　2.2.4.1　カラムの抹消　---　35
　　　　2.2.5　DataFrameの連結　---　35
　　　　　　2.2.5.1　最も単純な連結処理　---　35
　　　　　　2.2.5.2　横方向（カラム方向）の連結　---　36
　　　　2.2.6　指定した条件によるデータの抽出　---　37
　　　　　　2.2.6.1　真理値を用いた抽出　---　37
　　　　　　2.2.6.2　条件式から真理値列を生成する方法　---　38
　　　　　　2.2.6.3　論理演算子による条件式の結合　---　38
　　　　2.2.7　DataFrameに関する情報の取得　---　39
　　　　　　2.2.7.1　要約統計量　---　39
　　　　　　2.2.7.2　データ構造に関する情報の表示　---　39
　　　　2.2.8　その他　---　40
　　　　　　2.2.8.1　開始部分/終了部分の取り出し　---　40
　　　　　　2.2.8.2　行と列の転置　---　40
　　2.3　日付と時刻　---　41
　　　　2.3.1　Timestampクラス　---　41
　　　　　　2.3.1.1　タイムゾーン　---　42
　　　　　　2.3.1.2　コンストラクタのキーワード引数に日付・時刻の値を与える方法　---　43
　　　　　　2.3.1.3　現在時刻の取得　---　43
　　　　2.3.2　Timestampの差：Timedelta　---　44
　　　　　　2.3.2.1　Timedeltaの生成　---　44
　　　　2.3.3　Timestampの列：date＿rangeとDatetimeIndex　---　45
　　　　　　2.3.3.1　他の型への変換　---　45
　　　　　　2.3.3.2　頻度の規則　---　46
　　　　2.3.4　NaT（欠損値）について　---　46
　　2.4　データ集合に対する一括処理　---　47
3　ファイル入出力　---　49
　　3.1　DataFrameをCSVファイルとして保存する方法　---　49
　　3.2　CSVファイルを読み込んでDataFrameにする方法　---　50
　　　　3.2.1　CSVの指定した列をインデックスと見なす方法　---　50
　　　　3.2.2　CSVの先頭行をデータと見なす方法　---　51
4　統計処理のための基本的な操作　---　52
　　4.1　基本的なソフトウェアライブラリ　---　52
　　　　4.1.1　ライブラリの読込み　---　52
　　4.2　乱数生成の初期状態について　---　52
　　　　4.2.1　得られる乱数の系列について　---　53
　　4.3　サンプルデータの作成　---　53
　　4.4　データの分析　---　54
　　　　4.4.1　分位数（パーセンタイル，パーセント点）　---　55
　　　　　　4.4.1.1　中央値　---　55
　　　　4.4.2　基本的な統計量　---　55
　　　　　　4.4.2.1　最大値，最小値　---　56
　　　　　　4.4.2.2　合計　---　56
　　　　　　4.4.2.3　平均　---　56
　　　　　　4.4.2.4　分散（不偏分散，標本分散）　---　56
　　　　　　4.4.2.5　標準偏差（不偏標準偏差/標本標準偏差）　---　57
　　　　　　4.4.2.6　尖度，歪度　---　57
　　　　　　4.4.2.7　配列（ndarray）の統計量の算出　---　58
　　　　4.4.3　要素/区間毎のデータ個数の調査　---　59
　　　　　　4.4.3.1　要素の個数の調査　---　59
　　　　　　4.4.3.2　最頻値　---　59
　　　　　　4.4.3.3　区間毎の要素の個数の調査　---　60
　　　　　　4.4.3.4　最頻の区間　---　61
　　　　　　4.4.3.5　区間（Intervalオブジェクト）　---　61
　　4.5　データの可視化　---　63
　　　　4.5.1　matplotlibによる作図の手順　---　63
　　　　4.5.2　ヒストグラムの作成　---　63
　　　　　　4.5.2.1　ヒストグラム作成方法のバリエーション　---　64
　　　　4.5.3　図を画像ファイルとして保存する方法　---　65
　　　　4.5.4　複数の図を重ねて表示する方法　---　65
　　　　4.5.5　箱ひげ図の作成　---　65
　　　　4.5.6　折れ線グラフの作成　---　67
　　　　　　4.5.6.1　線の太さ，線種，マーカー　---　67
　　　　　　4.5.6.2　グラフの色　---　69
　　　　4.5.7　グラフ描画に関する各種の設定　---　69
　　　　4.5.8　応用例：value＿countsの結果をヒストグラムにする　---　70
　　　　4.5.9　円グラフの作成　---　72
　　　　　　4.5.9.1　グラフ作成における日本語フォントの使用　---　72
　　　　　　4.5.9.2　円グラフ描画の開始角度と回転方向　---　73
　　　　　　4.5.9.3　扇部の突出，百分率の表示　---　73
　　　　　　4.5.9.4　扇部の色の設定　---　74
　　　　4.5.10　棒グラフの作成　---　75
　　　　　　4.5.10.1　複数のカラムを棒グラフにする　---　76
　　4.6　集計処理　---　77
　　　　4.6.1　グループ集計　---　77
　　　　4.6.2　クロス集計　---　78
　　　　　　4.6.2.1　crosstab　---　79
　　　　　　4.6.2.2　pivot＿table　---　80
　　　　4.6.3　ダミー変数の取得（ワンホットエンコーディング）　---　81
　　4.7　ランダムサンプリング，シャッフル　---　82
　　4.8　変数間の関係の調査　---　83
　　　　4.8.1　相関係数　---　83
　　　　4.8.2　共分散　---　84
　　　　4.8.3　多項式回帰　---　85
　　4.9　統計検定　---　87
　　　　4.9.1　z検定　---　87
　　　　4.9.2　t検定　---　89
5　データベース　---　91
　　5.1　データベースについての基本的な考え方　---　91
　　　　5.1.1　データベースに対する基本的な操作　---　91
　　5.2　本書で取り扱うデータベース関連のソフトウェア　---　92
　　　　5.2.1　SQLite　---　92
　　　　5.2.2　SQLAlchemy　---　92
　　5.3　データベースに対するアクセスの例 (1)：DataFrameを基本とする処理　---　92
　　　　5.3.1　サンプルデータの作成　---　92
　　　　5.3.2　Engineオブジェクトの生成　---　93
　　　　5.3.3　SQLクエリの表示　---　93
　　　　5.3.4　DataFrameのテーブルへの新規保存　---　93
　　　　5.3.5　テーブルからDataFrameへの読込み　---　94
　　　　5.3.6　既存のテーブルへの追加保存　---　94
　　　　5.3.7　既存のテーブルを新しいデータで置き換える　---　95
　　　　5.3.8　指定した条件によるデータの抽出　---　95
　　5.4　データベースに対するアクセスの例 (2)：トランザクション処理　---　96
　　　　5.4.1　トランザクションの開始　---　96
　　　　5.4.2　既存のレコードの変更（データベースの更新）　---　96
　　　　5.4.3　既存のレコードの削除　---　97
　　　　5.4.4　新規レコードの追加　---　97
　　　　5.4.5　executeメソッドの戻り値　---　98
　　　　5.4.6　トランザクションの終了　---　98
　　5.5　SQL　---　98
　　　　5.5.1　データベースの作成　---　99
　　　　5.5.2　テーブルの作成　---　99
　　　　　　5.5.2.1　カラムのデータ型　---　99
　　　　5.5.3　テーブルの結合　---　101
6　各種ライブラリが提供する関数やメソッド　---　103
　　6.1　scipy.special　---　103
　　　　6.1.1　階乗 n!　---　103
　　　　6.1.2　順列 n P r，組合せ n C r　---　104
　　6.2　scipy.stats　---　105
　　　　6.2.1　確率密度関数：PDF（Probability Density Function）　---　105
　　　　　　6.2.1.1　正規分布　---　105
　　　　　　6.2.1.2　t分布　---　106
　　　　　　6.2.1.3　χ2 分布　---　107
　　　　　　6.2.1.4　指数分布　---　108
　　　　　　6.2.1.5　対数正規分布　---　109
　　　　6.2.2　確率質量関数：PMF（Probability Mass Function）　---　110
　　　　　　6.2.2.1　二項分布　---　110
　　　　　　6.2.2.2　幾何分布　---　111
　　　　　　6.2.2.3　超幾何分布　---　112
　　　　　　6.2.2.4　ポアソン分布　---　113
　　　　6.2.3　累積分布関数：CDF（Cumulative Density Function）　---　114
　　　　6.2.4　パーセント点関数：PPF（Percent Point Function）　---　115
　　　　6.2.5　乱数生成：RVS（Random Variates）　---　116
　　　　　　6.2.5.1　一様乱数の生成　---　116
　　　　　　6.2.5.2　乱数生成の初期設定：random＿state　---　117
A　統計学の用語　---　119
　　A.1　確率変数と確率を表す関数　---　119
　　　　A.1.1　確率に関する重要な事柄　---　119
　　　　A.1.2　確率質量関数　---　120
　　　　　　A.1.2.1　二項分布　---　120
　　　　　　A.1.2.2　幾何分布　---　120
　　　　　　A.1.2.3　超幾何分布　---　120
　　　　　　A.1.2.4　ポアソン分布　---　120
　　　　A.1.3　確率密度関数　---　121
　　　　　　A.1.3.1　正規分布　---　121
　　　　　　A.1.3.2　指数分布　---　121
　　　　　　A.1.3.3　対数正規分布　---　121
　　　　A.1.4　尖度，歪度　---　121
　　　　A.1.5　分位数，パーセント点　---　123
　　A.2　母集団と標本に関する重要な事柄　---　124
　　　　A.2.1　標本の抽出　---　124
　　　　　　A.2.1.1　標本分散と不偏分散　---　124
　　　　A.2.2　推定　---　124
　　　　　　A.2.2.1　点推定　---　125
　　　　　　A.2.2.2　区間推定　---　126
　　　　A.2.3　χ2分布　---　128
　　　　A.2.4　t分布（スチューデントのt分布）　---　128
　　A.3　仮説検定　---　129
　　　　A.3.1　有意水準と誤りについて　---　129
　　　　A.3.2　母平均に関する検定（t検定）　---　130
　　　　A.3.3　母分散に関する検定（χ2検定）　---　131

-----
written by 中村勝則