kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Pandas を基礎から学ぶために「Kaggle Courses」の学習コンテンツを受講した

機械学習コンペティションを開催する Kaggle のサイトを見ていたら「Kaggle Courses」という「学習コンテンツ」が公開されていて,Python や SQL や 機械学習など様々なトピックを学べるようになっていた.なんと無料💰現時点でコースは「計17種類」もある.今回は今まで何となく使っていた「Pandas」を学ぶコースを受講してみた.Pandas 未経験者や Pandas の基本的な機能を一通り学びたい人におすすめ👌

www.kaggle.com

アジェンダ 📊

Pandas コースは「計6個」のレッスンから構成されていて,Pandas の基礎(DataFrameSeries)から,Pandas でのデータ取得や欠損値の取り扱いまで幅広く学べる.そして,一歩一歩「歩幅を小さく」学べるため,理解できずに挫折することなく進められる点も素晴らしい!

  1. Creating, Reading and Writing
  2. Indexing, Selecting & Assigning
  3. Summary Functions and Maps
  4. Grouping and Sorting
  5. Data Types and Missing Values
  6. Renaming and Combining

「Kaggle Courses」のレッスンには大きく「2種類」の学習コンテンツがある.まずは「Tutorial」Notebook を読みながら機能を学べる(座学的な).次に「Exercise」Notebook に実際にコードを実装しながら学ぶ(演習的な).特に「Exercise」ではすぐにコードを実装できるわけではなく,ドキュメントを調べたりもするため,理解を深められる仕組みになっていると思う.また以下のような便利機能も組み込まれているため,答え合わせをしたり,ヒントを確認できたりもする.便利!

q1.check()
q1.hint()
q1.solution()

f:id:kakku22:20210410124713p:plain
Exercise 画面サンプル

1. Creating, Reading and Writing 📊

最初は Pandas の代表的なオブジェクトとして DataFrameSeries の操作から学ぶ.それぞれのコンストラクタに Python の dict を指定してオブジェクトを作ったり,index パラメータを指定したりする.コンストラクタ経由でオブジェクトを作れるのはサクッと試すには便利だけど,実用的ではなく,多くの場面ではデータファイルを扱うため,次のトピックに繋がる.

pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']})
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']}, index=['Product A', 'Product B'])

次に read_csv() 関数を使ってデータファイルを読み込む.read_csv() 関数には多くのパラメータが実装されているけど,今回は index_col パラメータを使って DataFrame の行ラベルを指定している.また読み込んだデータを head() 関数で表示したり,to_csv() 関数でエクスポートしたりする.

reviews = pd.read_csv('../input/wine-reviews/winemag-data_first150k.csv', index_col=0)

animals = pd.DataFrame({'Cows': [12, 20], 'Goats': [22, 19]}, index=['Year 1', 'Year 2'])
animals.to_csv('cows_and_goats.csv')

2. Indexing, Selecting & Assigning 📊

次に Pandas でデータを取得するテクニックを学ぶ.Pandas では Python の構文と同じようにデータを取得することができるため,簡単ではあるけど,Pandas では iloc() 関数(行と列をインデックスで指定する)や loc() 関数(行と列をラベルで指定する)を使う.例えば loc() 関数を条件を組み合わせるとデータに対して AND (&)OR (|) を使うこともできる.他にも isin() 関数を条件に使った例なども学べる.便利!

reviews.iloc[0]
reviews.iloc[:, 0]
reviews.iloc[1:3, 0]

reviews.loc[0, 'country']
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

reviews.loc[reviews.country == 'Italy']
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
reviews.loc[reviews.country.isin(['Italy', 'France'])]

3. Summary Functions and Maps 📊

実際に Pandas でデータを扱う場合,単に取得するだけではなく,サマリを取得したり値を変換したりする場面もある.今度はサマリ関数を学ぶ.例えば describe() 関数を使って最小値や最大値やパーセンタイルをまとめて取得したり,min() 関数や max() 関数を使って個別に取得することもできる.他にも平均値や中央値や標準偏差なども取得できる.SQL のイメージと似ている.

reviews.describe()
#               points          price
# count  129971.000000  120975.000000
# mean       88.447138      35.363389
# std         3.039730      41.022218
# min        80.000000       4.000000
# 25%        86.000000      17.000000
# 50%        88.000000      25.000000
# 75%        91.000000      42.000000
# max       100.000000    3300.000000

reviews.price.describe()
# count    120975.000000
# mean         35.363389
# std          41.022218
# min           4.000000
# 25%          17.000000
# 50%          25.000000
# 75%          42.000000
# max        3300.000000
# Name: price, dtype: float64

後半では map() 関数と apply() 関数を使ってデータを変換する.map() 関数は,Series から取得した単一の値を変換する場合などに使って,apply() 関数は,より広範囲に DataFrame 全体の値を変換する場合などに使う.ここまで学ぶと,データをうまく扱えているような気分になってくる!

reviews.points.map(lambda p: p - review_points_mean)
reviews.apply(remean_points, axis='columns')

4. Grouping and Sorting 📊

今度は groupby() 関数を使って値をグループ化して集計する.以下のように「ポイント値」ごとにカウントしたり,「ポイント値」ごとに「値段」の最小値を取得したりできる.また agg() 関数と組み合わせてデータセットのサマリ情報を取得することもできる.

reviews.groupby('points').points.count()
# points
# 80     397
# 81     692
#       ... 
# 99      33
# 100     19
# Name: points, Length: 21, dtype: int64

reviews.groupby('points').price.min()

reviews.groupby(['country']).price.agg([len, min, max])

同じく SQL のイメージと似ていて,データをソートすることもできる.DataFrameSeries に対して sort_values() 関数を使う.

countries_reviewed.sort_values(by='len')
countries_reviewed.sort_values(by='len', ascending=False)

5. Data Types and Missing Values 📊

今度は Pandas で扱う DataFrameSeries「データ型」を学ぶ.Pandas では dtype プロパティで Pandas が解釈をした「型」を取得できる.以下は DataFrame のカラムごとに型を取得している.

reviews.points.dtype
# int64

reviews.country.dtype
# object

また astype() 関数を使うと,型を変換できる.以下は「ポイント値」int64 から float64 に型変換している.

reviews.points
# 0         87
# 1         87
# 2         87
# 3         87
# 4         87
#           ..
# 129966    90
# 129967    90
# 129968    90
# 129969    90
# 129970    90
# Name: points, Length: 129971, dtype: int64

reviews.points.astype('float64')
# 0         87.0
# 1         87.0
# 2         87.0
# 3         87.0
# 4         87.0
#           ... 
# 129966    90.0
# 129967    90.0
# 129968    90.0
# 129969    90.0
# 129970    90.0
# Name: points, Length: 129971, dtype: float64

後半では「欠損値 (Missing data) : NaN」の取り扱いを学ぶ.データセットはキレイに揃ったデータばかりではないため,Pandas では NaN を取り扱う関数が多く用意されている.例えば isnull()notnull()isna()notna()fillna() など.

reviews.region_2.fillna("Unknown")

6. Renaming and Combining 📊

最後はデータセットの名前を変更したり,複数の DataFrame を結合したり,現場で使えそうなテクニックを学ぶ.まず,DataFrame に対して rename() 関数を使ってカラム名やインデックス名を変更する.ただし,インデックス名を変更する場面は少ないとも書いてあった.

reviews.rename(columns={'points': 'score'})
reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})

そして,複数の DataFrame を結合するために concat() 関数(データセットをシンプルに結合)と join() 関数(rightinner など軸を指定して結合)と merge() 関数(rightinner など軸を指定して結合)を学ぶ.なお,1番複雑な merge() 関数で実行できることはほとんど join() 関数で実行できるため,Pandas コースでは merge() 関数は割愛されていた.それぞれに細かくプロパティがあるため,あくまで基本的な操作を試すところまでを学べる.

canadian_youtube = pd.read_csv("../input/youtube-new/CAvideos.csv")
british_youtube = pd.read_csv("../input/youtube-new/GBvideos.csv")

pd.concat([canadian_youtube, british_youtube])

left = canadian_youtube.set_index(['title', 'trending_date'])
right = british_youtube.set_index(['title', 'trending_date'])

left.join(right, lsuffix='_CAN', rsuffix='_UK')

まとめ 📊

「Kaggle Courses」Pandas コースを受講してみた.わかりやすく歩幅も小さく学べて素晴らしい学習体験だった.さすが Kaggle👏 Pandas の基本的な機能を一通り学べるため,未経験者にもおすすめできる.なお,最後までレッスンを受講すると証明書も取得できるため,モチベーションを刺激する仕組みになっていた!

f:id:kakku22:20210410124743p:plain

最近は Pandas の機能をより深く学ぶため,並行して「Pandas ライブラリ活用入門」を読んでいる.読み終わったら書評記事を書く予定.今回紹介した Pandas コースよりも詳しくまとまっているため,興味があれば読んでみると良いかと📖