kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Pandas の機能を実践的に学ぶならこの1冊!「Pandas ライブラリ活用入門」を読んだ

個人的に Pandas を使ってデータ分析をする機会が増えてきて,今までの浅い経験ではうまく使いこなせず,Pandas を中心に細かく学び直している.最近 Pandas 関連の記事を多く書いていることにも関連しているし,少し前には Pandas を学べる「Kaggle Courses」を紹介した.そして並行して「Pandas ライブラリ活用入門」を読んだため,書評をまとめておく.

目次 📚

全部で「第18章」から構成されている.また Python 入門者のために充実した付録も載っている.本書の序盤にも「読み方」が載っているけど,個人的には Pandas を優先的に学ぶなら「第1,2,3部」を読んで,機械学習にも興味があれば「第4部」まで読むと良いと思う.とは言え,Pandas を中心に主要な機能を解説したリファレンス的な内容になるため,全体をザッと流し読みしてから,気になった機能を実際に試しながら読み直すスタイルが僕には1番合っていた👍

  • 第1部「基本的な使い方の基本」
    • 第1章 : DataFrame の基礎
    • 第2章 : pandas のデータ構造
    • 第3章 : プロットによるグラフ描画
  • 第2部「データ操作によるクリーニング」
    • 第4章 : データを組み立てる
    • 第5章 : 欠損データへの対応
    • 第6章 : "整然データ"を作る
  • 第3部「データの準備―変換/整形/結合など」
    • 第7章 : データ型の概要と変換
    • 第8章 : テキスト文字列の操作
    • 第9章 : apply による関数の適用
    • 第10章 : groupby 演算による分割-適用-結合
    • 第11章 : 日付/時刻データの操作
  • 第4部「モデルをデータに適合させる」
    • 第12章 : 線形モデル
    • 第13章 : 一般化線形モデル
    • 第14章 : モデルを診断する
    • 第15章 : 正則化で過学習に対処する
    • 第16章 : クラスタリング
  • 第5部「締めくくり―次のステップへ」
    • 第17章 : pandas 周辺の強力な機能
    • 第18章 : さらなる学びのための情報源
  • 第6部「付録」
    • 付録 A : インストール
    • 付録 B : コマンドライン
    • 付録 C : プロジェクトのテンプレート
    • 付録 D : Python の使い方
    • 付録 E : ワーキングディレクトリ
    • 付録 F : 環境
    • 付録 G : パッケージのインストール
    • 付録 H : ライブラリのインポート
    • 付録 I : リスト
    • 付録 J : タプル
    • 付録 K : 辞書
    • 付録 L : 値のスライス
    • 付録 M : ループ
    • 付録 N : 内包表記 (comprehension)
    • 付録 O : 関数
    • 付録 P : 範囲とジェネレータ
    • 付録 Q : 複数代入
    • 付録 R : numpy の ndarray
    • 付録 S : クラス
    • 付録 T : Odo (TheShapeshifter)

本書の誤植は以下に載っている.

book.impress.co.jp

本書で使う Jupyter Notebook とデータセットは以下の GitHub リポジトリに公開されている.

github.com

Pandas 基礎の基礎 : DataFrame と Series 📚

第1章「DataFrame の基礎」と第2章「pandas のデータ構造」を読めば,Pandas の代表的なオブジェクトである DataFrameSeries の基本的な操作(関数や属性など)を学べる.例えばよく使う関数だと pd.read_csv() / head() / tail() / loc() / iloc() や,プロパティだと shape / columns など.他にもいろいろ載っている.

import pandas as pd
df = pd.read_csv('../data/gapminder.tsv', sep='\t')
type(df)
# pandas.core.frame.DataFrame
df.shape
# (1704, 6)
df.columns
# Index(['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap'], dtype='object')

f:id:kakku22:20210506100321p:plain

可視化 📚

第3章「プロットによるグラフ描画」では可視化テクニックを学べる.読む前は Matplotlib の解説かなぁーと予想していたけど,実際には Matplotlib だけではなく SeabornPandasDataFrame.plot を使った例も紹介されていた.Seaborn を使えばより高度なグラフをお手軽に描けるし,シンプルなグラフで良ければ Pandas でも描ける.また本書の冒頭にはグラフの例がカラー印刷で載っているため,グラフを見るだけでも楽しめる📊

  • ヒストグラム
  • 密度プロット
  • 散布図
  • hexbin(六角形ビニング)プロット
  • 箱ひげ図
  • etc
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset('tips')
sns.lmplot(x='total_bill', y='tip', data=tips)
plt.show()

f:id:kakku22:20210506100430p:plain

実際に自分で考えたグラフを描こうとすると用語も理解しておく必要があり,Matplotlib のドキュメントに載っている Anatomy of a figure がとてもわかりやすかった.以下に引用して載せておく.

f:id:kakku22:20210506100640p:plain
Anatomy of a figure — Matplotlib documentation より引用

そして Seaborn を使った「ペアプロット図(散布図行列)」の実装は以下の記事で試したりもした

kakakakakku.hatenablog.com

整然データ 📚

第6章「"整然データ"を作る」を中心に第4,5,6章では「整然データ (Tidy Data)」を実現する Tips を学んでいく.「整然データ」は簡単に言えば,データセットを解析しやすくするために構造化したフレームワークで,以下の記事がとてもわかりやすかった.

id.fnshr.info

具体的な Tips としては,具体的には pd.concat()merge() 関数を使ったデータセットの連結やインデックスの再設定,そして melt() 関数を使って「横持ち」のデータセットを「縦持ち」に変換するなど,実践的で参考になった.

また「欠損値 (Missing data) : NaN」の取り扱いも出てくる.NaN に関しては以下の記事で詳しく試した.

kakakakakku.hatenablog.com

日付操作 📚

第11章「日付/時刻データの操作」では,Pandas の日付や時刻に関連する機能を学べる.例えば pd.to_datetime() 関数を使うと指定したカラムを object 型から datetime64 型に変換できる.以下の例では Datedate_dtdatetime64 型として変換している.

import pandas as pd
ebola = pd.read_csv('../data/country_timeseries.csv')
ebola['date_dt'] = pd.to_datetime(ebola['Date'])
ebola.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 122 entries, 0 to 121
# Data columns (total 19 columns):
#  #   Column               Non-Null Count  Dtype         
# ---  ------               --------------  -----         
#  0   Date                 122 non-null    object        
#  1   Day                  122 non-null    int64         
#  2   Cases_Guinea         93 non-null     float64       
#  3   Cases_Liberia        83 non-null     float64       
#  4   Cases_SierraLeone    87 non-null     float64       
#  5   Cases_Nigeria        38 non-null     float64       
#  6   Cases_Senegal        25 non-null     float64       
#  7   Cases_UnitedStates   18 non-null     float64       
#  8   Cases_Spain          16 non-null     float64       
#  9   Cases_Mali           12 non-null     float64       
#  10  Deaths_Guinea        92 non-null     float64       
#  11  Deaths_Liberia       81 non-null     float64       
#  12  Deaths_SierraLeone   87 non-null     float64       
#  13  Deaths_Nigeria       38 non-null     float64       
#  14  Deaths_Senegal       22 non-null     float64       
#  15  Deaths_UnitedStates  18 non-null     float64       
#  16  Deaths_Spain         16 non-null     float64       
#  17  Deaths_Mali          12 non-null     float64       
#  18  date_dt              122 non-null    datetime64[ns]
# dtypes: datetime64[ns](1), float64(16), int64(1), object(1)
# memory usage: 18.2+ KB

f:id:kakku22:20210506100833p:plain

また pd.read_csv() 関数に parse_dates パラメータを指定すると,データセットを読み込むときに datetime64 型に変換できる.

import pandas as pd
ebola = pd.read_csv('../data/country_timeseries.csv', parse_dates=[0])
ebola.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 122 entries, 0 to 121
# Data columns (total 18 columns):
#  #   Column               Non-Null Count  Dtype         
# ---  ------               --------------  -----         
#  0   Date                 122 non-null    datetime64[ns]
#  1   Day                  122 non-null    int64         
#  2   Cases_Guinea         93 non-null     float64       
#  3   Cases_Liberia        83 non-null     float64       
#  4   Cases_SierraLeone    87 non-null     float64       
#  5   Cases_Nigeria        38 non-null     float64       
#  6   Cases_Senegal        25 non-null     float64       
#  7   Cases_UnitedStates   18 non-null     float64       
#  8   Cases_Spain          16 non-null     float64       
#  9   Cases_Mali           12 non-null     float64       
#  10  Deaths_Guinea        92 non-null     float64       
#  11  Deaths_Liberia       81 non-null     float64       
#  12  Deaths_SierraLeone   87 non-null     float64       
#  13  Deaths_Nigeria       38 non-null     float64       
#  14  Deaths_Senegal       22 non-null     float64       
#  15  Deaths_UnitedStates  18 non-null     float64       
#  16  Deaths_Spain         16 non-null     float64       
#  17  Deaths_Mali          12 non-null     float64       
# dtypes: datetime64[ns](1), float64(16), int64(1)
# memory usage: 17.3 KB

f:id:kakku22:20210506100846p:plain

さらに後半では「リサンプリング」「タイムゾーン変換」の例も載っている.Pandas では resample() 関数を使って「ダウンサンプリング(高い周期から低い周期)」「アップサンプリング(低い周期や高い周期)」に変換できる.tz_convert() 関数を使うとタイムゾーンを変換できる.

機械学習 📚

Pandas だけではなく機械学習にも興味があれば,第12章「線形モデル」から第16章「クラスタリング」までを読むと,Python の statsmodelsscikit-learn を使った機械学習モデルの実装例を学べる.目次の一部を抜粋すると以下などが載っている.ただし統計学の基礎から学べるわけではなく,あくまでライブラリを使った実装例の紹介が中心となるため,機械学習関連の他の本を併読するべきだと思う.前提知識に依存するところではあるけど,個人的には知識不足もあり本書だけだと理解できないところもあったし,本書の読者層も似た傾向になる気がする.

  • 線形モデル
    • 線形回帰
    • 重回帰
  • 一般化線形モデル
    • ロジスティック回帰
    • ポアソン回帰
  • 正規化
    • リッジ回帰
    • ラッソ回帰
    • 交差検証

まとめ 📚

Pandas の機能を深く理解するために「Pandas ライブラリ活用入門」を読んだ.実際に試して気付くことも多く,全体をザッと流し読みしてから,気になった機能を試しながら読み直した.リファレンス的な内容ではあるけど,Pandas でできることを全体把握できたため,読んで良かった💡今後は Pandas を使った機械学習など,実践的な内容に学習項目をステップアップしていくぞー!