Get Started with Python 2 – Coursera

Computer

はい、それでは引き続き、Coursera にて提供されているオンラインコース ‘”Get started with Python” のまとめです。

Module 4: Data structures in Python

Python における、データ構造についてです。特に list, dictionary はよく使う型なので、便利なメソッドと共に頭に入れておくと良いです。

List

さて、続いて、こちらも Python で非常によく利用する型、リストです。他の言語で言うところの array や配列のような形式で記述されますが、Python のリストは、デフォルトでサイズが可変です。あとで要素を追加したりが簡単にできます。

list_a = ['olive', 'palm', 'coconut']

また、リスト内の要素の型は、異なっていてもOKです。整数、文字列、小数、はたまた別のリストなどなど。それぞれの要素にはインデックスを指定してアクセスします。スライスでインデックスの範囲を指定することも可能です。

list_b = ['Abidjan', 14.2, [1, 2, None], 'Zagreb']
print(list_b[1])
print(list_b[0:2])

そして、リストは、文字列型と違い、ミュータブル(可変)なデータ型となります。要するに、要素の一部だけを変更することができます。

my_list = ['Macduff', 'Malcolm', 'Duncan', 'Banquo']
my_list[2] = 'Macbeth'
print(my_list)

もちろん、リスト型にも文字列型と同じように、便利なメソッドが多く定義されています。例えば、list.pop() や、list.append() などなど。詳細は、Python Documentation > Built-in Types > Sequence Types — list, tuple, range

zip(), enumerate(), リスト内包表記

リストと合わせて使いたいツールに、zip()関数、enumerate()関数、そして、リスト内包表記があります。

zip()関数では、複数のリストの要素をインデックスごとにリストにまとめてくれます。

cities = ['Paris', 'Lagos', 'Mumbai']
countries = ['France', 'Nigeria', 'India']
places = zip(cities, countries)

[(‘Paris’, ‘France’), (‘Lagos’, ‘Nigeria’), (‘Mumbai’, ‘India’)] のような形で各要素をタプルでまとめたリストとして出力されます。

逆に unzip つまりバラバラに分解するには、’ * ‘ アスタリスクマークを引数のリストにつけて渡します。

cities, countries = zip(*places)

cities と countries はそれぞれ、(‘Paris’, ‘Lagos’, ‘Mumbai’) と (‘France’, ‘Nigeria’, ‘India’) となります。

enumerate() 関数は、引数のリストに対して、各要素と対応するインデックスを返します。

letters = ['a', 'b', 'c']
for index, letter in enumerate(letters):
print(index, letter)

(index, letter) のタプルがそれぞれ、(0, ‘a’), (1, ‘b’), (2, ‘c’) のような形になります。

ちなみに、enumerate は、以下のような意味です。

to name things separately, one by one:
一つ一つものの名前をあげる(列挙する)

Cambridge Dictionary – enumerate

ちなみに Rust に Enum型がありますが、上の意味通りの型です。

リスト内包表記は、新しくリストを生成する際に、わざわざループを使わなくて良いため、簡潔にコードを記述することができます。構文は以下、

my_list = [<式> for <要素> in <イテラブル> if <条件式>]

例として、

numbers = [1, 2, 3, 4, 5]
new_list = [x + 10 for x in numbers]

とすると、new_list は、 [11, 12, 13, 14, 15] となります。

辞書型 – dictionary

辞書型は、”{}” と、その中にある key : value のペアで表現されます。

smallest_countries = {'Africa': 'Seychelles',
                     'Asia': 'Maldives',
                     'Europe': 'Vatican City',
                     'Oceania': 'Nauru',
                     'North America': 'St. Kitts and Nevis',
                     'South America': 'Suriname'
                     }

辞書型の要素にアクセスするには、以下のようにします。

smallest_countries["Asia"]

辞書型への新しい要素の追加や、要素の変更は、通常の代入演算子 “=” を使って表現します、。

my_dict = {'nums': [1, 2, 3],
          'abc': ['a', 'b', 'c']
          }

# Add a new 'floats' key
my_dict['floats'] = [1.0, 2.0, 3.0]

要素を変更したい場合も同様に、my_dict[“nums”] = [4, 5, 6] のようにします。

また、特定の要素を削除したい場合は、del キーワードを利用して、

del my_dict['abc']

のように記述します。

辞書型にも、リストや文字列と同様に便利なメソッドが実装されており、dictionary.keys(), dictionary.values(), dictionary.items() メソッドを使うことで、それぞれ、キー、値、キーと値のペアに対する view object を返します。(view object は、データの中身を表示するのに便利なオブジェクトだと思います。たぶん…名前からして)

set

set は、ユニークな要素を有するオブジェクトです。セット自体に、数学でよく使われる「集合」と言う意味があります。

a group of similar things that belong together in some way:
ある種の、似たようなものをまとめたグループ

Cambridge Dictionary – set

and とか or とかのいわゆる、論理演算子を使って処理をかけることができ、set オブジェクトの要素はそれぞれがユニークである必要があります。

set オブジェクトの要素には、イミュータブル(不変なもの)であれば入れることができます。String とか 数値とかですね。

set オブジェクトをインスタンス化するには、set() 関数かまたは “{}” の表記を使いますが、後者については、要素が空の set を生成できません。辞書型と同じ表記となるため、空の set を作るときには set() 関数を利用します。コードだとこんな感じですね。

my_set = {5, 10, 10, 20}
example_a = [1, 2, 2.0, '2']
set(example_a)

set() 関数の引数にはイレラブル(反復可能)なデータを渡してあげます。上記ではリスト型。

set オブジェクトそれ自体は、基本的にはミュータブル(可変)であるため、他の set オブジェクトの要素とはなれませんが、frozen set オブジェクトはイミュータブルなオブジェクトのため、set オブジェクトの要素となることができます。

set オブジェクトには、論理演算(ベン図を描いたりするあれ)用に演算子やメソッドが定義されています。

  • intersection() メソッド ー 論理積、または and 演算、演算子は ‘&’ アンパサンド。
  • union() メソッド ー 論理和、または or 演算、演算子は ‘|’ パイプ。
  • differential() メソッド ー 差、演算子は ‘-‘ マイナス
  • symmetric_difference() メソッド ー 対称差、演算子は、’^’ キャレット

Python libraries, packages, and modules

Python でプログラミングをしていく上で避けては通れない、外部ライブラリやモジュールについてです。

基本的には、Python の文脈では ライブラリとパッケージは区別しません、が、公式ドキュメントを読む限りでは、パッケージって言及されていることの方が多いような気がします。

ライブラリやパッケージは、偉い人たちの作った、(すごく)便利な Python の関数やクラスの集まり、のように考えると良いです。

データ分析でも、例はなんでも良いのですが、ある種のデータの処理にはある種のパターンがあり、これを抽象化して、汎用的に使えるようなコードの塊として開発してあるものが、パッケージまたはライブラリです。

いわゆる、プログラミングの世界でよく言われる、”DO NOT REINVENT THE WHEEL” 「車輪の再発明をするな」ってやつです。

同様に、モジュールは、パッケージやライブラリの構成要素だと思うとわかりやすいです。モジュールが複数個集まって、パッケージやライブラリを構成します。

また、ややこしい話ですが、もっと大規模かつ特定の用途に特化した「発展型ライブラリ」のようなものをフレームワークと呼んだりします。こちらはビジネス用語に近いので、ソフトウェア開発というよりも、ビジネスレベルで役に立たせるもの、ようなニュアンスが強いです。例えば、Webアプリケーションフレームワークなんかがそれに該当します。

外部パッケージやライブラリを利用するは、まず、プログラミングを行っている端末(コンピュータ)にインストールし、その後に、作成しているプログラムにインポートしてあげる必要があります。ただし、 built-in モジュールは標準でインストールされているため、事前のインストールは不要です。

“numpy” というパッケージがインストールされている前提で、

import numpy

と記述すると、それ以降で、”numpy” ライブラリに含まれている、クラスや関数を利用できます。例えば、

numpy.array([2, 4, 6])

と書くことによって、”numpy” ライブラリの、array()関数を呼び出せます。ちなみに、ライブラリ名と関数名は ‘ . ‘ ドット記号で繋いであげます。これは Dot notation: ドット記法と呼ばれます。

また、エイリアス(別名)で名前づけしてあげることも可能で、

import numpy as np
np.array([2, 4, 6])

も、前のコードと全く同じものとなります。

よく使われるライブラリには、よく使われるエイリアス(別名)があり、これらは基本的に慣例に則ることが推奨されます。特に、チームでプログラミングをするときに余計な混乱を招かないことを目的とします。以下、特にデータ分析の文脈でよく使われる外部ライブラリ(パッケージ)とそのエイリアスです。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

NumPy ライブラリは、高パフォーマンスなベクトルや行列の処理に、Pandas ライブラリはテーブルデータの処理に、Seaborn と matplotlib ライブラリは、共にグラフやチャートなどのデータ微ジュアライゼーションに利用されます。

また、<ライブラリ名>.<モジュール名> のようにインポートするモジュールや関数、クラスを指定したり、from キーワードを使って、インポート元を指定することもでます。

from sklearn.metrics import precision_score, recall_score

上の例では、”sklearn” ライブラリから、”metrics” モジュールを指定し、そこから、”precision_score” と “recall_score” 関数をインポートしています。

ちなみに、glob のような記法で

from library.module import *

のように、モジュールにあるインポート可能な要素全てをインポートする構文もありますが、こちらは、関数やクラスがどこで定義されているのかをわかりづらくしてしまします。(同じスコープ内で意図しない名前の衝突が起こる場合もあり)

よく使う built-in モジュールとしては、以下のものがあります。

  • datetime:日付や時間の変換、計算を行う
  • math:特に数学的な処理をまとめたモジュール
  • random:ランダムな条件を生成できます

モジュール関連の講義の中で、たまに見かけて気になってた表現があったので、メモです。

“There are packages designed for applications as diverse as chemistry, audio editing, natural language processing, and video games. Whatever it is you’re trying to do, chances are someone has developed a suite of tools to help you!”
「化学や音声編集、自然言語処理、ゲームなど、広範なアプリケーション向けにデザインされたパッケージがあり。あなたがやろうとしていることがなんであれ、たぶん誰かが役立つツール群をすでに開発しているよ。」

“chances are (that)” という表現が、「たぶん〜だろう」という意味で使われてます。口語っぽい表現なので、文章で見るとちょっと二度見しちゃいます。

一応、英英辞書にも載ってますね。

it is likely:
・Chances are that they’ll be late anyway.

Cambridge Dictionary – chances are

NumPy – ndarray (n-dimensional array)

NumPy モジュールを使うことで、Python のリスト型を使うよりもより高速で効率よく大量のデータを操作することができます。NumPy のもつ強みのうちの一つに、array (ndarray) を扱える点が挙げられます。

ちなみに、NumPy は、Numerical Python の略で、「ナンパイ」と発音されます。ずっと「ナンピー」だと思ってました…

ndarray では、ほぼ無制限の次元数でデータを扱うことができます。

ndarray のインスタンス化は、以下のように記述

import numpy as np
array_1d = np.array([1, 2, 3])
array_1d

array() 関数にリストやタプルなどのイテラブルなデータを引数として渡してあげれば良いです。

そのほかにも、特定の数値、特に ‘0’ や ‘1’ などで初期化する場合には専用のメソッドが定義されています。

np.zeros((3, 2)) # 3行 X 2列の ndarray の全ての要素を '0' で初期化
np.ones((2, 2)) # 2行 X 2列の ndarray の全ての要素を '1' で初期化
np.full((5, 3), 8) # 5行 X 3列の ndarray の全ての要素を '8' で初期化

引数が、(<行数>, <列数>) のタプルとなります。

また、ndarray オブジェクトにも、その他のオブジェクトと同様に、有用なメソッドが多数定義されています。そのうちのいくつかが以下、

  • ndarray.flatten():1次元にフラット化された配列のコピーを返す
  • ndarray.reshape():配列の shape (行数と列数) を変更する。
  • ndarray.tolist():配列を list オブジェクトに変換する。
  • ndarray.max():配列、または指定した軸に対する最大値を返す。
  • ndarray.min():配列、または指定した軸に対する最小値を返す。
  • ndarray.mean():配列、または指定した軸に対する平均値を返す。
  • ndarray.std():配列、または指定した軸に対する標準偏差を返す。

ちなみに、”std” は “standard deviation” の略です。エクセルにも似たような関数が組み込まれています。

同様に、使用頻度の高い属性(attributes)です。

  • ndarray.shape:配列の次元を示すタプルを返す。
  • ndarray.dtype:配列の内容のデータ型を返す。
  • ndarray.size:配列内の要素の総数を返す。
  • ndarray.T:転置された配列を返す。(列が行に、行が列に)

“T” は、”transpose” 自体が数学で「転置行列」の意なので、これの略でしょうね。

ndarray でもリストと同様に、インデックスから要素を指定することができます。

a = np.array([(1, 2, 3), (4, 5, 6)])


print(a[1]) # 1行目の要素(1次元配列) -> [4, 5, 6]
print(a[0, 1]) # 0行 1列目 -> 2
print(a[1, 2]) # 1行 2列目 -> 6

多次元配列の場合は、インデックスを、「行 -> 列」の順にカンマで区切ることに注意です。

もちろんスライスの利用も可、

a = np.array([(1, 2, 3), (4, 5, 6)])

a[:, 1:] # 全ての行、の1列目以降 -> [[2, 3], [5, 6]]

ndarray は、通常の算術演算子を使って、各要素に対する操作を行えます。

a = np.array([(1, 2, 3), (4, 5, 6)])
b = np.array([[1, 2, 3], [1, 2, 3]])
print(a + b)
print(a * b)

注意点として、ndarray は、制限付きのミュータブルなオブジェクトとなります。具体的には、「すでに存在する要素の変更は可能であるが、新しく要素を追加したり、削除したりはできない。」といった制限があります。

今まで気にしたことはなかったんですが、NumPy の配列では、データをメモリ上の連続した領域に保存するようです。こうすることによって、データの高速な操作が可能になる、その反面、配列用に確保した領域の隣側が常に利用可能なメモリ領域とは限らないので、ndarray が制限付きのミュータブルなオブジェクトとなっている、ということでした。

“The abutting memory is occupied by other information. There’s no room for more data at that memory address.”
「隣接するメモリは、他の情報で占有されています。そのメモリアドレスには、これ以上データのための余地はありません。」

If a building or area of land abuts something or on something, it is next to it or touches it on one side:
建物や土地の一部が何かに “abut” している場合、それは隣接しているか、一部がそれに触れていることを意味する。

Cambridge Dictionary – abut

The fundamentals of pandas

Python のかなり有名なデータ分析ライブラリです。

データ分析までしないにしても、業務用のCSVファイル(例えば製造業なら客先の注文データとか)を取り込んで一気に編集かけたりするときにとても便利ですね。

Pandas の基本的なデータ構造には以下の2種類があります:

  • Series:シリーズは、1次元のラベル付き配列のことで、色々なデータを格納できます。スプレッドシートで言うところの、列に該当し、NumPy では1次元配列に該当します。それぞれの要素には、インデックスと呼ばれるラベルが紐付けられています。インデックスを利用することで、簡単にデータフレーム内の要素を参照でき、より効率的で直感的なデータ操作を可能とします。
  • DataFrame: データフレームは、二次元のラベル付き行列構造となっています。エクセルのスプレッドシートとか、SQLのテーブルと同じです。データフレームの行と列はそれぞれがシリーズで表現されます。

pandas も NumPy と同様、使用するにはまず端末へのライブラリのインストールと、プログラムへのインポートが必要です。

import pandas as pd

エイリアスに関して、pandas にも慣例があるので、”pd”  とする流れに則っておくのがベターです。

データフレームの生成は、色々な方法で行えます。

辞書型から、

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)

二次元リストから、

df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
                  columns=['a', 'b', 'c'])

csv ファイルから、

df3 = pd.read_csv('/file_path/file_name.csv')

もちろん、データフレームにも便利な属性とメソッドが定義されています。

属性:

  • columns:列ラベル
  • dtypes:データタイプ
  • iloc:整数ベースで指定された行と列
  • loc:ラベルまたはブーリアンで指定された行と列
  • shape:データフレームの形状をタプルとして
  • values:NumPy形式のデータフレーム

※ “iloc” は “integer-location-based position” の意味

メソッド:

  • apply():関数をデータフレームの軸上で実行
  • copy():インデックスとデータをコピー
  • describe():データフレームの詳細情報を表示。最小、最大、行や列数など
  • drop():指定したラベルの行や列を削除
  • head(n=5):最初のn行のデータフレームを返す。デフォルトは5行
  • groupby():指定したグループごとにデータを分割した groupby オブジェクトを返す
  • info():簡潔なデータフレームの情報を返す
  • isna():null値の部分だけ True な同じサイズのデータフレームを返す
  • sort_values():指定した軸に対してソートする

ついでによくわからない英語表現があったので、こちらもメモで、
(例としてタイタニックのデータを dataframe として分析している、って文脈です)

“Today, that ticket would have cost her 10,417 pounds sterling.”
「今日では、そのチケットは、10,417ポンド(英国)になるだろう。」

the official name of the pound used as money in the UK
イギリスで使用されている、貨幣としてのポンドの正式名

Cambridge Dictionary – pound sterling

イギリスのポンドとその他の国で使われているポンドを明確に分けるために使われる表現ってことでした。まだまだ知らない表現がたくさんあります。

Selection statements

さて、次が若干ややこしいですが、行や列の選択の方法についてです。

Row selection

まずは行の選択からですが、loc[ ] や iloc[ ] の構文を使います。

loc[ ] は、ラベル名で行を指定できます。例えばこんなデータがあったとして、

df = pd.DataFrame({
   'A': ['alpha', 'apple', 'arsenic', 'angel', 'android'],
   'B': [1, 2, 3, 4, 5],
   'C': ['coconut', 'curse', 'cassava', 'cuckoo', 'clarinet'],
   'D': [6, 7, 8, 9, 10]
   },
   index=['row_0', 'row_1', 'row_2', 'row_3', 'row_4'])

以下のように記述することで、

df.loc['row_1']

データフレーム内の列をシリーズとして取得できます。または、'[ ]’ 内にラベル名ではなく、ラベル名のリストを渡してあげることで、データフレームのサブセットを取得できます。

df.loc[['row_1']]

複数行を選択する際は、リストを拡張性てあげます。

df.loc[['row_2', 'row_4']]

スライスのような表記も可能です。

df.loc['row_0':'row_3']

iloc[ ] を使用すると、ラベル名ではなく、数字で位置を指定することができます。(行ナンバーや列ナンバーみたいな)

行番号1(0ベースなので2行目)を選択するには、

df.iloc[1]

データフレームを取得したければ、先の方法と同様に、行番号のリストを渡してあげて、

df.iloc[[1]]

複数行指定するには、

df.iloc[[0, 2, 4]]

Column selection

行の時と同様に、このデータがあったとして、

df = pd.DataFrame({
   'A': ['alpha', 'apple', 'arsenic', 'angel', 'android'],
   'B': [1, 2, 3, 4, 5],
   'C': ['coconut', 'curse', 'cassava', 'cuckoo', 'clarinet'],
   'D': [6, 7, 8, 9, 10]
   },
   index=['row_0', 'row_1', 'row_2', 'row_3', 'row_4'])

列の選択では、loc[ ] などの属性を指定することなく、データフレームに対して直接ブラケット ‘[ ]’ を使って、列を指定できます。

df['C']

複数の列を取得するには、

df[['A', 'C']]

また、通常の要素と同じように、ドット記法も使えますが、条件付き選択のような複雑なことをしようとすると、コードの可読性が落ちるので推奨はされていません。

行の選択で先に述べた、loc[ ] に、列の指定を加えてあげることで、列を選択することもできます。

df.loc[:, ['B', 'D']] # 全ての行の、'B' と 'D' 列

iloc[ ] でも同様に、

df.iloc[:, [1,3]] # 全ての行の、列番号1〜2まで(3は含まない)

また、行と列を同時に選択するには以下のようにする。

df.loc['row_0':'row_2', ['A','C']]

※ loc[ ] を使い、ラベル名でスライスを使用した場合、終わりの値も含むので注意 (上では、”row_2″)

その他に注意する点として、行または列の選択の性質上、数値での選択とラベル名での選択を混在させることができないので、その場合は、index[ ] 属性などを利用して、数値のスライスからラベルを取得し、そのラベルを用いて、意図した行や列の選択を行うような処理が必要。

df.loc[df.index[0:3], 'D'] # index[0:3] で 0〜2行のラベル(インデックス)を取得

Boolean masking in pandas

上の説明では、行ベースまたは列ベースでのデータの選択を行いましたが、pandas では、もちろんデータの値ベースでの選択を行うことが可能です。これには、Boolean mask という手法を用います。

大まかにいうと、任意の列の値に対して条件を設定し、その条件を満たす行に対して True 、満たさない行に対しては Fause となるようなシリーズを取得します。そして、そのシリーズでデータフレームをマスク(Trueの列のみ抽出)することで値ベースのデータ選択を実現します。

具体的なコードで書くと、

data = {'planet': ['Mercury', 'Venus', 'Earth', 'Mars',
                   'Jupiter', 'Saturn', 'Uranus', 'Neptune'],
       'radius_km': [2440, 6052, 6371, 3390, 69911, 58232,
                     25362, 24622],
       'moons': [0, 0, 1, 2, 80, 83, 27, 14]
        }
df = pd.DataFrame(data)
mask = df['moons'] < 20 # ここで Boolean mask を取得して mask 変数に代入
df[mask] # Boolean mask をデータフレームに適用してデータ選択

複数の条件を指定するには、各条件を ‘( )’ カッコで括り、その間に、pandas で定義されている論理演算子を挿入します。演算子は以下、

  • ‘&’ (and)
  • ‘|’ (or)
  • ‘~’ (not)

列 ‘moon’ の値が20以上、かつ、列 ‘moon’ の値が80ではなく、かつ、列 ‘radius_km’ の値が、50,000以下である行を選択する場合は以下となる。

mask2 = (df['moons'] > 20) & ~(df['moons'] == 80) & ~(df['radius_km'] < 50000)
df[mask2]

Grouping and aggregation

グループ化と、集約についてです。

これは SQL で GROUP BY 構文や 集約関数使ったことあれば、理解しやすいです。というより、やってることは全く同じです。

例えば、以下のデータフレームに対して、

clothes = pd.DataFrame({'type': ['pants', 'shirt', 'shirt', 'pants', 'shirt', 'pants'],
                       'color': ['red', 'blue', 'green', 'blue', 'green', 'red'],
                       'price_usd': [20, 35, 50, 40, 100, 75],
                       'mass_g': [125, 440, 680, 200, 395, 485]})

次の、グループ化を実行してやると、

group_by_object = clothes.groupby('type')

groupby オブジェクトが返されます。このデータフレームでは、”type”列の要素である “pants” と “shirts” にグループ分けされます。このgroupby オブジェクトで定義されている、max(), mean() メソッド(集約関数)などを実行してあげることで、そのメソッドがデータに対して実行されます。

group_by_object.mean()

この max() や min()、mean() などのメソッドは、その性質上当然に数値のみの列(シリーズ)にしか処理ができません。「文字列の平均」を計算する、っていうのはコンピュータ上では可能ですが、統計的には意味をなさないですね。

また、複数の列を指定してグループ化することも可能です。size() メソッドは、グループごとにまとめられたデータのサイズを算出します。

clothes.groupby(['type', 'color']).size()

Built-in (デフォルトで組み込み済み)な集約関数は、以下です。

  • count():グループごとに、非 null 値のデータをカウント
  • sum():グループごとに、数値の合計を算出
  • mean():グループごとに、数値の平均を算出
  • median():グループごとに、中央値を算出
  • min():グループごとに、最小値を算出
  • max():グループごとに、最大値を算出
  • std():グループごとに、標準偏差(standard deviation)を算出
  • var():グループごとに、分散(variance)を算出

データフレームに対して、複数の集約関数を適用したい場合には、dataframe オブジェクトに定義されている agg() メソッドが有用です。

agg() メソッドの特に重要な引数は:

  • func:適用される関数
  • axis:関数が適用される方向(行方向か列方向)、デフォルトは ’0’ の列方向

引き続き、同じデータフレームに対して、

clothes = pd.DataFrame({'type': ['pants', 'shirt', 'shirt', 'pants', 'shirt', 'pants'],
                       'color': ['red', 'blue', 'green', 'blue', 'green', 'red'],
                       'price_usd': [20, 35, 50, 40, 100, 75],
                       'mass_g': [125, 440, 680, 200, 395, 485]})

以下を実行すると、sum() と mean() それぞれをデータフレームに対して適用します。

clothes[['price_usd', 'mass_g']].agg(['sum', 'mean'])

上記では、二つの列にそれぞれ二つの集約関数を適用しましたが、agg() メソッドに、辞書型の引数を渡すことによって、列ごとに集約関数を指定することができます。

clothes.agg({'price_usd': 'sum',
            'mass_g': ['mean', 'median']
            })

集計の軸(方向)を変更するには、axis 引数を指定します。

clothes[['price_usd', 'mass_g']].agg(['sum', 'mean'], axis=1)

“axix=0″ で列方向、”axis=1” で行方向。

groupby() メソッドと、agg() メソッドは、組み合わせて使われることがよくあります。”color” 列でグループ化を実行し、返された groupby オブジェクトで agg() メソッドを呼び出すには以下、

clothes.groupby('color').agg({'price_usd': ['mean', 'max'],
                             'mass_g': ['mean', 'max']})

Merging and joining data

pandas では複数のデータフレームを連結するメソッドが良いされています。簡単に、

  • merge():SQL の JOIN のような連結を行います。(行方向)
  • concat():より細かく設定可能な連結を行います。(行方向でも列方向でも可)

Module 4 は Python 自体やその外部モジュールのデータ構造に触れるだけあって、かなり広範な内容でしたが、実際にコーディングするときには全て必須の知識ですね。

Module 5: End-of-course project

いよいよ最終モジュールですが、これは、3つある課題の中から自分が選んだものを完成させていくスタイルのものなので、簡単に触れるだけにしておきます。

基本的には、ロールプレイングをするような内容となっており、データ分析を行う背景と実際に操作するデータを理解した上で、利害関係者に対して分かりやすい資料(データのインサイトをまとめていく)という流れです。

コース1が、架空のコンサルティングファームのスタッフになって、ニューヨークのタクシー関係のデータを分析するというもの。

コース2は、 TikTok のユーザ要求を分類する機械学習モデルを作るため、必要なデータを準備するというもの。

コース3は、Waze の “user churn” ユーザ離脱率?解約率? を予測するモデル用データのインサイトを得るというもの。

そこまで難しい内容でもないので、Jupyter Notebook の中に記載のある Hint など読みながら進めれば特につまづくところもないかと思います。

まとめ

ということで、一通り、終わらせてみましたが、モジュール4以降がかなり有益かなと思う反面、本当に Python を使い始めたばかりの人だと結構戸惑うかもしれないです。(SQL や R 言語を触ったことがあれば大丈夫と思います)

逆に、モジュール3までは、本当の初学者にも分かりやすくて、良いドキュメントになってると思います。前半と後半で急に難易度が変わるので、ある程度データ分析に関するバックグラウンドがあって、そこからさらに Python を使ったアプローチをしてみたいな、って人におすすめのコースだと思いました。

Python の基本操作とともに、pandas を用いたデータ分析に重点を置いて解説してくれているのは嬉しい点です。

興味がある人は、ぜひ受講してみてください。

コメント

タイトルとURLをコピーしました