この講座では、Pythonの外部ライブラリに焦点を当て、Numpy、Pandas、requests、BeautifulSoup、PILといったライブラリを通じて、外部ライブラリの活用方法を理解し、Pythonでの開発をさらに強化することを目指します。
1. Numpy
• 数値計算を手軽に!
Numpyは、CやFortranで実装された高性能な数値計算ライブラリであり、Python上で高速な数値演算を実現します。
Pythonのリストよりも効率的な多次元配列オブジェクト ndarray を提供し、大規模データ処理や数値解析に最適です。
また、Numpyはベクトル化された操作をサポートしており、ループを使わずに配列間での要素ごとの演算が可能です。
このため、大規模なデータ処理を効率的に実行でき、特に機械学習やデータサイエンスの分野で重要な役割を果たします。
• Numpyの基本操作
Numpyでは、以下の基本操作を習得することが重要です。
• 配列の生成・操作
Numpy配列は、np.array()を使ってリストやタプルから作成できます。
dtype(データ型)を指定することで、メモリの効率を高めることができます。
さらに、reshape()を使って配列の形状を変更したり、T属性で転置を行うことができます。また、broadcastingによって異なる形状の配列間で自動的に計算が可能です。
• 例:
import numpy as np
a = np.array([1, 2, 3], dtype=np.float32) # 浮動小数点型の配列
b = a.reshape((3, 1)) # 配列の形状を変更
c = np.array([4, 5, 6])
d = a + c # 要素ごとの加算 (ブロードキャストを自動適用)
• インデクシングとスライシング
NumpyではPythonのリスト同様にスライシングが可能です。ただし、スライス操作は新しいコピーを作らず、元のデータのビューを返すため、メモリ効率が高いです。また、複数の軸を持つ配列では、複数のインデックスを使ったインデクシングが可能です。
• 配列の生成・操作
配列生成には、以下の関数が頻繁に使用されます。
- np.array():リストやタプルを基に配列を生成する基本関数。dtypeでデータ型を指定でき、メモリ効率を向上させます。
- np.zeros() / np.ones() / np.empty():特定の形状の全要素が0、1、または未初期化の配列を生成します。np.empty()は高速に未初期化配列を作るが、要素の値は不定です。
- np.linspace() / np.arange():np.linspace()は開始値と終了値を指定し、その範囲を均等に分割した配列を生成します。np.arange()は指定したステップで連続した数値配列を生成します。np.linspace()は特に、数値シミュレーションなどで等間隔に分割されたデータが必要な場合に便利です。
• 例:
import numpy as np
arr1 = np.arange(0, 10, 2) # 0から9までの範囲でステップ2の配列
arr2 = np.linspace(0, 1, 5) # 0から1まで5等分した配列
• 配列の形状変更・結合:
配列の形状を変更する場合、reshape()を用います。
さらに、複数の配列をnp.vstack()やnp.hstack()などを使って縦・横に結合できます。
これにより、異なる次元の配列を効率的に統合することが可能です。
• 例:
arr = np.arange(6).reshape(2, 3) # 2x3の配列に形状変更
arr_vstack = np.vstack((arr, arr)) # 縦方向に結合
arr_hstack = np.hstack((arr, arr)) # 横方向に結合
• 数学的計算(線形代数、統計量の算出)
Numpyは、単純な四則演算だけでなく、線形代数や統計計算においても豊富な関数を提供しています。
これらの関数は、多次元配列を対象とし、効率的な数値計算を実現します。
• 線形代数
Numpyにはnp.dot()やnp.linalgモジュールを使って行列積や逆行列、特異値分解(SVD)、固有値計算などの高度な線形代数演算を行うための関数が含まれています。
特にnp.matmul()は、行列の積を効率よく行うための演算子で、機械学習や数値解析でよく使用されます。
• 例:
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
product = np.dot(A, B) # 行列の積
inv_A = np.linalg.inv(A) # 逆行列の計算
• 統計的計算
Numpyでは、mean()やstd()、var()を使って、平均値、標準偏差、分散を簡単に計算できます。また、sum()やcumsum()、min()、max()などの集計関数も豊富に備えています。
• 例:
data = np.random.randn(1000) # 正規分布に従うランダムなデータ生成
mean_value = np.mean(data) # 平均値
std_value = np.std(data) # 標準偏差
このように、Numpyでは大規模データや数値解析の基本操作に加え、線形代数や統計分析などの高度な数値演算も手軽に行うことが可能です。
2. Pandas
• データ分析の力を手に入れよう!
Pandasは、データ分析や操作を効率的に行うためのPythonライブラリです。
特に表形式データ(行と列を持つデータ)に対して、SQLのようなデータ操作やExcelのようなデータ処理が可能です。
データフレーム(DataFrame)は、Pandasの中核を成す構造で、行列形式のデータを高速に操作できます。
データサイエンスや機械学習の前処理、ビジネスインテリジェンスなどで広く活用されている強力なツールです。
• データフレームの作成
Pandasの基本となるデータフレームは、さまざまなデータソースから生成できます。
主なデータソースとして、CSV、Excel、SQLデータベース、さらにはPythonの辞書やリストも使用可能です。
• データフレームの作成方法
データフレームの作成は、以下のような方法で行われます。
• 辞書からの作成:
辞書形式のデータを元にデータフレームを作成します。
キーが列名、値がその列のデータとして扱われます。
• 例:
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Salary': [50000, 60000, 70000]}
df = pd.DataFrame(data)
• リストからの作成:
リストやリストのリストからもデータフレームを生成できます。
• 例:
data = [['Alice', 25, 50000], ['Bob', 30, 60000], ['Charlie', 35, 70000]]
df = pd.DataFrame(data, columns=['Name', 'Age', 'Salary'])
• インデックスの設定と操作
データフレームでは、indexという行ラベルを使ってデータを管理できます。
デフォルトでは0から始まる連番が自動的に付与されますが、任意の列をインデックスとして設定することも可能です。
また、set_index()で特定の列をインデックスに設定したり、reset_index()でインデックスを初期化することもできます。
• CSVやExcelファイルの読み込み・書き込み
Pandasは外部ファイルとの連携が非常に強力で、CSVやExcelファイルからデータを読み込んでデータフレームとして操作することができます。
• CSVファイルの読み込み・書き込み
pd.read_csv()を使って、CSVファイルを簡単に読み込むことができます。
さらに、to_csv()を使ってデータフレームをCSV形式で出力できます。
• 例:
df = pd.read_csv('data.csv') # CSVファイルの読み込み
df.to_csv('output.csv', index=False) # CSVファイルへの書き出し(インデックスを含めない)
• Excelファイルの読み込み・書き込み
pd.read_excel()を使って、Excelファイルも簡単に読み込めます。
また、to_excel()を使ってデータフレームをExcelファイルに書き出すことができます。
Pandasは複数のシートを扱うこともでき、sheet_name引数で指定することが可能です。
• 例:
df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # Excelファイルの読み込み
df.to_excel('output.xlsx', sheet_name='Results') # Excelファイルへの書き出し
• データのフィルタリングと集計
Pandasでは、SQLのように条件に基づいてデータを抽出したり、グループ化して集計することが可能です。
これにより、大量のデータを効率的に分析できます。
• データのフィルタリング
特定の条件に基づいて、データを抽出することができます。
例えば、特定の列の値が一定の条件を満たす行だけを抽出することが可能です。locやilocを使った位置ベースでの抽出も可能です。
• 例:
# 年齢が30歳以上のデータを抽出
filtered_df = df[df['Age'] >= 30]
• データのグループ化と集計
groupby()を使って、特定の列でデータをグループ化し、そのグループごとに集計を行うことができます。
これにより、簡単に統計情報を取得したり、データを要約できます。集計にはmean()、sum()、min()、max()などの集約関数を使用します。
• 例:
# 職業ごとに平均給与を算出
grouped = df.groupby('Job')['Salary'].mean()
• ピボットテーブル
PandasはExcelのピボットテーブルと同様に、データを要約して整理するためのピボットテーブルを作成できます。
pivot_table()を使うと、行、列、集計方法を指定してデータの要約が可能です。
• 例:
# 職業ごとの平均給与を年齢別に集計したピボットテーブル
pivot = pd.pivot_table(df, values='Salary', index='Job', columns='Age', aggfunc='mean')
Pandasを使うことで、データの抽出、整形、集計を一貫して行うことができ、複雑なデータ分析のフローを簡潔に構築することが可能です。
特に、大量データや複数のソースからのデータ統合、集計が必要なビジネスやデータサイエンスの現場で強力に活用されています。
3. requests
• 簡単にWebリソースへアクセス!
requestsライブラリは、HTTPリクエストを簡単に送信し、WebリソースへアクセスするためのPythonライブラリです。
urllibなどの標準ライブラリと比べて、簡潔なAPIでリクエストの作成やレスポンスの取得が可能であり、データの取得やAPIとの連携を行うための強力なツールです。
HTTPプロトコルに基づいて、GET、POST、PUT、DELETEなど、さまざまなメソッドをサポートしています。
• HTTPリクエストの送信方法
HTTPリクエストにはさまざまなメソッドがありますが、requests.get()やrequests.post()が代表的です。
GETリクエストはデータの取得に、POSTリクエストはサーバーにデータを送信する際に使用されます。
• GETリクエスト
GETリクエストは、主にリソースを取得するために使用します。
URLにパラメータを付与して送信することができ、例えば、検索クエリなどをURLに埋め込んで送信できます。
• 例:
import requests
url = 'https://api.example.com/data'
params = {'key': 'value'}
response = requests.get(url, params=params) # URLにパラメータを付与してGETリクエストを送信
print(response.status_code) # ステータスコードの確認
print(response.text) # レスポンスの内容を表示
• POSTリクエスト
POSTリクエストは、主にサーバーにデータを送信する際に使用します。
特にフォームデータやJSONデータをサーバーに送信する場合によく使われます。
• 例:
url = 'https://api.example.com/submit'
data = {'username': 'testuser', 'password': 'password123'}
response = requests.post(url, data=data) # フォームデータをPOSTリクエストで送信
print(response.status_code) # ステータスコードを表示
• リクエストの応用
GETやPOST以外にも、PUTやDELETEなどのメソッドを用いて、リソースの更新や削除を行うことができます。
requests.put()やrequests.delete()を使うことで、RESTfulなAPIとの連携が容易になります。
• JSONデータの取得と解析
多くのAPIは、レスポンスとしてJSON形式のデータを返します。
requestsでは、返されたレスポンスを簡単にJSON形式で解析でき、取得したデータをPythonの辞書やリストに変換して扱うことが可能です。
• JSONデータの取得方法
APIから返されたレスポンスをJSONとして扱うためには、response.json()を使用します。
これにより、レスポンスデータがPythonの辞書として扱えるようになります。
• 例:
url = 'https://api.example.com/data'
response = requests.get(url)
data = response.json() # JSONデータをPythonの辞書として取得
print(data['key']) # 必要な情報を辞書から抽出
• エラーハンドリング
APIとの通信では、サーバーからエラーが返されることもあります。
レスポンスのステータスコードを確認することで、リクエストが成功したかどうかを判定します。
response.raise_for_status()を使用することで、エラーが発生した場合に例外をスローすることも可能です。
• 例:
try:
response = requests.get(url)
response.raise_for_status() # エラーが発生した場合に例外をスロー
data = response.json()
except requests.exceptions.HTTPError as err:
print(f"HTTP error occurred: {err}") # エラー処理
• APIとの連携方法
RESTful APIと連携してデータを取得したり、送信したりする基本的なワークフローを学びます。
APIへのリクエストは、認証が必要な場合もあります。requestsライブラリは、認証情報の送信も簡単に行えます。
• パラメータ付きリクエスト
GETリクエストでは、paramsを使ってURLにパラメータを追加できます。
これにより、特定の条件に合ったデータを取得することができます。
• 例:
url = 'https://api.example.com/search'
params = {'query': 'Python', 'limit': 10}
response = requests.get(url, params=params) # パラメータを指定してリクエストを送信
data = response.json()
print(data)
• ヘッダーや認証情報の追加
APIのリクエストには、追加のヘッダーや認証トークンを含める場合があります。
これを行うには、headers引数を使用します。特にBearerトークン認証では、Authorizationヘッダーにトークンを設定します。
• 例:
url = 'https://api.example.com/protected'
headers = {'Authorization': 'Bearer YOUR_TOKEN'}
response = requests.get(url, headers=headers) # 認証トークンを含めてリクエストを送信
print(response.json())
• ファイルのアップロードとダウンロード
requestsライブラリは、ファイルのアップロードやダウンロードにも対応しています。
ファイルのアップロードには、files引数を使用し、ダウンロードする場合はレスポンスのバイナリデータを扱います。
• ファイルのアップロード:
url = 'https://api.example.com/upload'
files = {'file': open('example.txt', 'rb')}
response = requests.post(url, files=files) # ファイルをサーバーにアップロード
• ファイルのダウンロード:
url = 'https://api.example.com/download'
response = requests.get(url)
with open('downloaded_file.txt', 'wb') as f:
f.write(response.content) # ファイルをローカルに保存
requestsライブラリを活用することで、Web APIやWebリソースに対して柔軟にアクセスし、データをやり取りすることができます。
特にAPIを介したデータ取得や送信、認証など、実践的なWebアプリケーション開発の基本スキルが習得できます。
4. BeautifulSoup
• Webスクレイピングの基本!
BeautifulSoupは、PythonでWebページのHTMLやXMLドキュメントを解析し、特定のデータを抽出するためのライブラリです。
Webスクレイピングとは、公開されているWebサイトからデータを自動的に取得する技術のことを指し、例えば製品情報やニュース、株価情報などを効率的に収集する際に使用されます。
requestsライブラリと組み合わせて使用されることが多く、取得したHTMLを解析し、指定されたデータを抽出します。
• HTMLの解析とデータ抽出
WebページはHTML形式で構成されており、BeautifulSoupはそれをツリーストラクチャーとして解析し、任意の要素を容易に検索・抽出することが可能です。
Webページの構造を理解し、目的のデータにアクセスすることがWebスクレイピングの第一歩です。
• BeautifulSoupオブジェクトの生成
BeautifulSoupでは、まずHTMLデータを解析するために、HTMLのソースを読み込み、解析ツールを指定してオブジェクトを生成します。
ここでは、html.parserやlxmlなどのパーサーを指定できます。
• 例:
from bs4 import BeautifulSoup
import requests
url = 'https://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser') # HTMLドキュメントを解析
• HTMLの要素を探索する基本操作
BeautifulSoupでは、HTML要素をタグ名で探索するためのメソッドが用意されています。
例えば、find()は最初に見つかった要素を返し、find_all()はすべての一致する要素をリストで返します。
• 例:
# ページのタイトルを取得
title = soup.find('title').text
print(title)
# すべてのリンクを取得
links = soup.find_all('a')
for link in links:
print(link.get('href')) # リンクのURLを抽出
• CSSセレクタによる要素の抽出
select()を使用して、CSSセレクタを使って要素を抽出することも可能です。
これにより、特定のクラスやID、ネストされた要素を簡単に検索できます。
• 例:
# クラス名 'content' を持つ要素を抽出
content = soup.select('.content')
for section in content:
print(section.text)
• タグ、属性の操作方法
BeautifulSoupを使えば、HTMLタグの内容や属性に簡単にアクセスし、必要な情報を取得・操作できます。
• タグの属性にアクセス
特定のタグの属性にアクセスする場合、get()メソッドやattrs属性を使用します。
例えば、画像のsrc属性やリンクのhref属性など、要素に付随する属性を取得することができます。
• 例:
# 画像タグのsrc属性を取得
img_tag = soup.find('img')
print(img_tag.get('src')) # 画像のURLを表示
# リンクの属性を取得
link = soup.find('a')
print(link['href']) # href属性を取得
• テキストの抽出
タグの間にあるテキストデータにアクセスするには、textやget_text()メソッドを使用します。
これにより、HTMLタグを除いた純粋なテキストを取得できます。
• 例:
# ページ内のすべてのテキストを取得
all_text = soup.get_text()
print(all_text)
• Webサイトからの情報取得方法
実際にWebサイトからデータを収集するための手法を具体的に見ていきます。
リクエストを送り、ページを解析して、必要なデータを抽出するプロセスを実践します。
• ステップ1: requestsライブラリでページ取得
まずはrequestsライブラリを使って、対象のWebページのHTMLデータを取得します。
取得したHTMLはそのまま解析に使用されます。
url = 'https://example.com/products'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser') # ページをBeautifulSoupで解析
• ステップ2: データの抽出
取得したHTMLから、目的のデータを抽出します。
例えば、商品名や価格、リンクなど、特定の要素をfind()やfind_all()を使って取り出します。
• 例:
# すべての商品名を抽出
products = soup.find_all('h2', class_='product-title')
for product in products:
print(product.text)
• ステップ3: 複数ページのスクレイピング
もしページが複数に分かれている場合、ページネーションを扱う必要があります。
次のページのリンクを取得し、順次スクレイピングを行う手法も一般的です。
• 例:
# 次のページへのリンクを取得し、繰り返しデータを抽出
while True:
next_page = soup.find('a', {'rel': 'next'})
if next_page:
next_url = next_page.get('href')
response = requests.get(next_url)
soup = BeautifulSoup(response.content, 'html.parser')
# データの抽出処理
else:
break
エラーハンドリングと倫理的な問題
Webスクレイピングには、Webサイトの利用規約を遵守することや、サーバーに過負荷をかけないようにするための配慮が必要です。
頻繁なリクエストを送る場合は、リクエスト間に適度な遅延を設けたり、robots.txtファイルを確認して、スクレイピングが許可されているかをチェックすることが推奨されます。
BeautifulSoupは、HTMLやXMLを効率的に解析してデータを抽出するための強力なツールです。
これを用いることで、Webサイトのデータを自動的に収集し、活用するためのスキルが習得できます。
5. PIL (Pillow)
• 画像処理の第一歩!
PIL(Python Imaging Library)はPythonの標準ライブラリではないものの、Pythonで画像を扱う際のデファクトスタンダードであり、現在はPillowという名称でメンテナンスされています。
Pillowは、画像ファイルを読み込み、編集し、保存するための豊富な機能を提供しています。
基本的な画像処理から高度な画像操作まで対応可能で、シンプルかつ強力なAPIを提供しています。
• 画像ファイルの読み込み・保存
Pillowを使えば、さまざまな形式の画像ファイルを簡単に読み込んだり、別の形式で保存することができます。
JPEG、PNG、GIFなど多くの画像形式に対応しており、画像処理の前提となる基本的な操作をサポートしています。
• 画像ファイルの読み込み
画像を読み込む際には、Image.open()を使用します。
これは指定したファイルパスから画像を開き、編集が可能なオブジェクトを返します。
• 例:
from PIL import Image
img = Image.open('example.jpg') # 画像ファイルを読み込み
img.show() # 画像を表示
• 画像ファイルの保存
読み込んだ画像を別の形式やパスに保存することも簡単です。
save()メソッドを使用することで、JPEGからPNGへの変換や圧縮率の設定が可能です。
• 例:
img.save('output.png') # 画像をPNG形式で保存
• 画像のリサイズ、フィルタ適用
画像のサイズ変更やフィルタの適用は、画像処理における基本的な操作です。
Pillowはこれらの操作を簡単に行うことができ、さまざまな用途に応用できます。
• 画像のリサイズ
Pillowのresize()メソッドを使って、画像の解像度を変更することができます。
Image.ANTIALIAS(高品質)などのオプションを指定することで、リサイズ時の品質を調整することも可能です。
• 例:
img_resized = img.resize((200, 200), Image.ANTIALIAS) # 200x200にリサイズ
img_resized.show()
• 画像のトリミング
crop()メソッドを使って、画像の特定の領域を切り取ることもできます。
切り取る領域は左上と右下の座標で指定します。
• 例:
cropped_img = img.crop((50, 50, 200, 200)) # 座標 (50, 50) から (200, 200) の範囲を切り取り
cropped_img.show()
• フィルタの適用
Pillowは画像に対するフィルタ処理も提供しています。
例えば、ImageFilterモジュールを使って画像をぼかしたり、シャープにすることができます。
• 例:
from PIL import ImageFilter
blurred_img = img.filter(ImageFilter.BLUR) # ぼかしフィルタを適用
blurred_img.show()
sharpened_img = img.filter(ImageFilter.SHARPEN) # シャープフィルタを適用
sharpened_img.show()
• 画像の描画やテキストの追加
画像に対して図形やテキストを追加する操作は、Pillowを使うことで容易に行えます。
ImageDrawモジュールを用いると、画像の上に線を引いたり、四角形、円などの図形を描画できます。
また、テキストを追加して、簡単なバナーやロゴなどの作成も可能です。
• 図形の描画
ImageDraw.Draw()を使って描画オブジェクトを生成し、rectangle()、ellipse()などを使って図形を描きます。
• 例:
from PIL import ImageDraw
draw = ImageDraw.Draw(img)
draw.rectangle((50, 50, 150, 150), outline="red", width=5) # 赤色の四角形を描画
img.show()
• テキストの追加
ImageDraw.text()メソッドを使って画像にテキストを追加できます。
フォントを指定するために、ImageFontモジュールを使うことでカスタムフォントの利用も可能です。
• 例:
from PIL import ImageFont
draw = ImageDraw.Draw(img)
font = ImageFont.load_default() # デフォルトフォントを使用
draw.text((10, 10), "Hello, World!", font=font, fill="white") # 白色でテキストを追加
img.show()
応用: 自動化による一括画像処理
Pillowを使うことで、大量の画像を自動的に処理するスクリプトを作成できます。たとえば、特定のフォルダ内のすべての画像をリサイズしたり、ウォーターマークを追加するスクリプトがよく使用されます。
• 例: すべての画像をリサイズして保存するスクリプト
import os
from PIL import Image
folder_path = 'images/'
output_folder = 'resized_images/'
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for filename in os.listdir(folder_path):
if filename.endswith('.jpg') or filename.endswith('.png'):
img = Image.open(os.path.join(folder_path, filename))
img_resized = img.resize((300, 300)) # 300x300にリサイズ
img_resized.save(os.path.join(output_folder, filename))
Pillowを使えば、画像の基本的な編集や加工、さらに高度なフィルタ適用やテキスト追加などが簡単に行えます。
これにより、Pythonを使用して画像処理の自動化や加工が可能となり、アプリケーション開発やデータサイエンスの分野でも幅広く活用できます。
まとめ
このカリキュラムを通じて、Pythonの外部ライブラリを活用したデータ処理や分析、Webスクレイピング、画像処理の基礎について学びました。
これらの技術は、現代のプログラミングの中心に位置し、データサイエンスや機械学習、さらにはディープラーニングといった先端技術へと進むための土台となる重要なスキルです。
まず、NumpyとPandasを習得することで、数値計算やデータ操作がスムーズになり、大規模データの処理や整形、集計といった基礎的な作業を効率化できるようになります。特に機械学習においては、データの前処理がモデルの精度を左右するため、これらのライブラリの使い方を深く理解しておくことが、後々の成功に繋がります。
requestsとBeautifulSoupを利用したWebスクレイピングは、必要なデータをインターネットから自動的に収集し、機械学習のためのデータセットを構築する際に役立ちます。豊富なデータソースにアクセスし、それを自分のモデルに適用できる形に整形する能力は、データサイエンティストにとって貴重なスキルです。
また、Pillowを使った画像処理技術も、ディープラーニングの分野で重要な役割を果たします。
画像認識や物体検出といった領域では、適切に画像データを前処理し、機械学習モデルに入力することが成功の鍵です。
Pillowを活用することで、画像のサイズ変更、フィルタ適用、テキストの追加といった基礎的な操作を自在に行い、ディープラーニング用のデータセットを準備できます。
最終的に、これらの外部ライブラリを理解することで、Pythonを使った機械学習やディープラーニングのプロジェクトに取り組む準備が整います。
NumpyやPandasを使用したデータの整形、requestsやBeautifulSoupで収集したデータの利用、Pillowで前処理された画像を使ったディープラーニングモデルの構築など、学んだ技術は広く応用が可能です。
今後は、TensorFlowやPyTorchといった機械学習・ディープラーニングフレームワークに進むことで、さらに高度な分析やモデル構築が可能になるでしょう。