はじめに
本記事は、Pythonとpandasを使って効率的なデータ解析を行いたい方々に向けて、基礎から応用まで幅広く解説します。特にデータ解析初心者や、Pythonをこれから学びたい方にとって有益な情報を提供できればと考えています。
Pythonとpandasの組み合わせの重要性
Pythonは多機能なプログラム言語であり、その上に多数のライブラリが存在します。pandasはその中でもデータ解析に特化したライブラリであり、この組み合わせは非常に強力です。データの前処理から分析、可視化まで一貫して行えるため、分析作業が格段に効率的になります。
Pythonとpandasとは?
Pythonとは
Pythonは、1991年に登場した高レベルなプログラミング言語です。以下がPythonの主な特徴です。
- コードが非常に読みやすい
- ライブラリが豊富で多機能
- コミュニティが活発
- クロスプラットフォーム対応
ライブラリが豊富なことも特徴であり、主要なライブラリとして下記が挙げられます。
用途 | ライブラリ名 | 主な特性 |
---|---|---|
データ分析 | Pandas | データフレーム操作、CSV/Excelの読み書きが得意 |
NumPy | 数値計算、配列操作 | |
SciPy | 科学計算、線形代数、統計分析 | |
機械学習 | scikit-learn | 機械学習のためのアルゴリズムが豊富 |
TensorFlow | ニューラルネットワーク、深層学習 | |
PyTorch | ニューラルネットワーク、深層学習 | |
Web開発 | Django | 高機能なWebフレームワーク |
Flask | シンプルで軽量なWebフレームワーク | |
FastAPI | 高速で現代的なWebフレームワーク | |
グラフ作成 | Matplotlib | 2Dグラフ作成が得意 |
Seaborn | 美しいグラフ作成、Matplotlibの拡張 | |
Plotly | インタラクティブなグラフ作成 | |
自然言語処理 | NLTK | 自然言語処理のための多くのツールとテキストデータ |
spaCy | 高速な自然言語処理 | |
Gensim | テキストマイニング、トピックモデリング | |
ネットワーク・通信 | Requests | HTTPリクエスト送信 |
Scrapy | Webスクレイピング | |
WebSocket | WebSocketプロトコルでの通信 |
Pythonについて詳しくは下記のページでも解説しております。
pandasとは
pandasはPythonのデータ解析ライブラリで、以下のような特徴があります。
- 表形式のデータ操作が得意
- 様々なデータソースに対応(CSV, Excel, SQLなど)
- データのクリーニングや変換、集計が容易
Pythonとpandasの組み合わせの強力さ
この二つが合わさることで、さまざまなデータ解析作業が格段に効率化されます。具体的な利点としては以下のようなものがあります。
- 大量のデータも素早く処理
- コードが簡潔で読みやすいため、再現性とメンテナンス性が高い
- 他のデータ解析関連のライブラリ(例:matplotlib, seaborn, scikit-learn)との連携が容易
基本的なデータ操作
データの読み込み
データソースによって読み込み方法が少々異なります。
データソース | 読み込み方法 |
---|---|
CSV | pd.read_csv(‘file.csv’) |
Excel | pd.read_excel(‘file.xlsx’) |
SQL | pd.read_sql_query(‘query’, connection) |
例えばCSVファイルを読み込んで、先頭の5行を表示するコードは下記になります。とてもシンプルに書けることが分かります。
import pandas as pd
# CSVファイルの読み込み
df = pd.read_csv("sample.csv")
# 先頭5行を表示
print(df.head())
データの概観
データの概観を得るための関数がいくつか用意されています。
- df.head():最初の5行を表示
- df.describe():数値データの統計量を表示
- df.info():各カラムのデータ型や欠損値を確認
データのフィルタリングと整形
データの抽出や整形もpandasで容易です。
- df.query(‘条件式’):条件式に合ったデータを抽出
- df.drop(‘カラム名’, axis=1):指定したカラムを削除
- df.rename(columns={‘old’: ‘new’}):カラム名の変更
以下のようなコードでは’Age’列が25より大きい行をフィルタリングしています。
import pandas as pd
# サンプルデータ作成
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [24, 27, 22, 32],
'Occupation': ['Engineer', 'Doctor', 'Artist', 'Lawyer']
}
df = pd.DataFrame(data)
# Ageが25より大きいデータをフィルタリング
result = df.query('Age > 25')
print("Age > 25:\n", result)
下記のように複数条件でのフィルタリングも可能です。
この例では、’Age’列が25より大きく、かつ’Occupation’列が’Doctor’である行をフィルタリングしています。
# Ageが25より大きく、Occupationが'Doctor'であるデータをフィルタリング
result = df.query('Age > 25 and Occupation == "Doctor"')
print("Age > 25 and Occupation == 'Doctor':\n", result)
統計量の計算
基本的な統計量は簡単に計算できます。例えば、以下のようなコードで平均、中央値、標準偏差などを計算できます。
# 平均値を計算
mean = df.mean()
# 中央値を計算
median = df.median()
# 分散を計算
variance = df.var()
print(f"平均値:\n{mean}\n")
print(f"中央値:\n{median}\n")
print(f"分散:\n{variance}\n")
応用的なデータ操作
データの結合
mergeやjoinを使用すると、異なるデータフレームの結合が可能です。
pd.merge()関数は、特定のキーに基づいて2つのDataFrameを結合します。この例では、ID列をキーとしてdf1とdf2を結合しています。
import pandas as pd
# サンプルデータ作成
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Charlie']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Age': [27, 22, 32]})
# 'ID'列をキーとして結合
merged_df = pd.merge(df1, df2, on='ID')
print(f"Merged DataFrame with 'ID' as key:\n{merged_df}")
pd.join()関数は、インデックス(index)に基づいて2つのDataFrameを結合します。
# サンプルデータ作成
df1 = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie']}, index=[1, 2, 3])
df2 = pd.DataFrame({'Age': [27, 22, 32]}, index=[2, 3, 4])
# インデックスを基に結合
joined_df = df1.join(df2)
print(f"Joined DataFrame based on index:\n{joined_df}")
データのピボット
pivot_tableを用いると、データの集計や可視化が容易になります。非常に強力な機能のためデータ分析で頻繁に用いられます。
この例では、いくつかの人々が購入した商品とその価格、購入した量を表しています。
import pandas as pd
# サンプルデータ
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'Item': ['Apple', 'Apple', 'Orange', 'Orange', 'Banana', 'Banana'],
'Quantity': [1, 2, 2, 3, 1, 2],
'Price': [100, 90, 80, 70, 110, 85]
}
df = pd.DataFrame(data)
そしてデータフレームを使って、pivot_tableを作成します。
# NameとItemごとにQuantityの合計を計算
pivot_df = pd.pivot_table(df, values='Quantity', index=['Name'], columns=['Item'], aggfunc='sum', fill_value=0)
print(f"Pivot table:\n{pivot_df}")
このコードは、Nameをインデックス、Itemをカラムとして、Quantityを集計(合計)します。fill_value=0は、該当するデータがない場合には0を埋めるという意味です。
Item Apple Banana Orange
Name
Alice 1 0 3
Bob 2 1 0
Charlie 0 2 2
このように、pivot_tableを使用すると、複数のカテゴリーにわたってデータを簡単に集計できます。aggfuncには他の関数(例:’mean’, ‘min’, ‘max’)も指定可能です。
データビジュアライゼーション
基本的なグラフの作成
pandasはmatplotlibを使ってグラフも簡単に作成することができます。以下は最も基本的なグラフの一つである折れ線グラフの作成例になります。
import matplotlib.pyplot as plt
# データ
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
# グラフの描画
plt.plot(x, y)
# タイトルとラベル
plt.title("Line Graph Example")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
# 表示
plt.show()
頻繁に利用される関数の一覧
関数名 | 機能 |
---|---|
pd.read_csv() | CSVファイルを読み込み、DataFrameを生成する。 |
pd.read_excel() | Excelファイルを読み込み、DataFrameを生成する。 |
pd.read_sql() | SQLクエリまたはデータベーステーブルを読み込み、DataFrameを生成する。 |
df.head() | DataFrameの先頭n行を返す。デフォルトは5行。 |
df.tail() | DataFrameの末尾n行を返す。デフォルトは5行。 |
df.describe() | 数値型の列に対して、基本的な統計量(平均、中央値など)を計算する。 |
df.mean() | 列または行の平均値を計算する。 |
df.median() | 列または行の中央値を計算する。 |
df.va r() | 列または行の分散を計算する。 |
df.std() | 列または行の標準偏差を計算する。 |
df.sum() | 列または行の合計値を計算する。 |
df.fillna() | 欠損値(NaN)を指定した値や方法で埋める。 |
df.dropna() | 欠損値(NaN)を含む行または列を削除する。 |
df.sort_values() | 指定した列の値に基づいてDataFrameをソートする。 |
df.filter() | 指定した条件に基づいて列または行をフィルタリングする。 |
df.groupby() | 一つ以上の列の値に基づいてデータをグループ化する。 |
df.apply() | 列または行に対して任意の関数を適用する。 |
df.merge() | 一つまたは複数のキーを基にして、二つのDataFrameを結合する。 |
df.join() | インデックスに基づいて、二つ以上のDataFrameを結合する。 |
df.pivot_table() | ピボットテーブルを生成する。 |
df.to_csv() | DataFrameをCSVファイルとして保存する。 |
df.to_excel() | DataFrameをExcelファイルとして保存する。 |
df.to_sql() | DataFrameをSQLデータベースに書き込む。 |
ピンバック: AI時代におけるPythonの役割:なぜ今、Pythonなのか - すまでぶ | スマートで新しい開発の知識を授ける | Smart Develop
ピンバック: Pythonとスクレイピング:効率的なデータ収集手法をマスターする - すまでぶ | スマートで新しい開発の知識を授ける | Smart Develop
ピンバック: Pythonを用いた動的サイトのスクレイピング:実践的なガイド - すまでぶ | スマートで新しい開発の知識を授ける | Smart Develop