チュートリアル

Pythonライブラリ活用:pandasでデータ分析

Pythonpandasデータ分析DataFrame
広告エリア

はじめに

pandasはPythonでデータ分析を行うための必須ライブラリです。表形式のデータを効率的に操作できます。

インストール

pip install pandas

基本概念

Series(1次元データ)

import pandas as pd

# Seriesの作成
s = pd.Series([1, 2, 3, 4, 5])
print(s)

# インデックス付き
s = pd.Series([100, 200, 300], index=["apple", "banana", "orange"])
print(s["apple"])  # 100

DataFrame(2次元データ)

# 辞書から作成
data = {
    "name": ["太郎", "花子", "次郎"],
    "age": [25, 22, 30],
    "city": ["東京", "大阪", "名古屋"]
}
df = pd.DataFrame(data)
print(df)

# 出力:
#   name  age  city
# 0  太郎   25   東京
# 1  花子   22   大阪
# 2  次郎   30  名古屋

データの読み込み

# CSV
df = pd.read_csv("data.csv")
df = pd.read_csv("data.csv", encoding="utf-8")

# Excel
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")

# JSON
df = pd.read_json("data.json")

# SQLデータベース
import sqlite3
conn = sqlite3.connect("database.db")
df = pd.read_sql("SELECT * FROM users", conn)

データの書き出し

# CSV
df.to_csv("output.csv", index=False, encoding="utf-8")

# Excel
df.to_excel("output.xlsx", index=False)

# JSON
df.to_json("output.json", orient="records", force_ascii=False)

データの確認

df.head()        # 最初の5行
df.tail(10)      # 最後の10行
df.shape         # (行数, 列数)
df.columns       # 列名一覧
df.dtypes        # 各列のデータ型
df.info()        # データフレームの情報
df.describe()    # 統計情報

列・行の選択

# 列の選択
df["name"]           # 1列(Series)
df[["name", "age"]]  # 複数列(DataFrame)

# 行の選択
df.iloc[0]           # インデックス番号で選択
df.iloc[0:3]         # スライス
df.loc[0]            # ラベルで選択

# 条件による選択
df[df["age"] > 25]
df[(df["age"] > 20) & (df["city"] == "東京")]
df[df["name"].str.contains("郎")]

列の追加・変更・削除

# 列の追加
df["country"] = "日本"
df["birth_year"] = 2026 - df["age"]

# 列の変更
df["age"] = df["age"] + 1

# 列の削除
df = df.drop(columns=["country"])
del df["birth_year"]

欠損値の処理

# 欠損値の確認
df.isnull().sum()

# 欠損値を含む行を削除
df = df.dropna()

# 欠損値を埋める
df["age"] = df["age"].fillna(0)
df["age"] = df["age"].fillna(df["age"].mean())

# 前後の値で埋める
df = df.fillna(method="ffill")  # 前の値
df = df.fillna(method="bfill")  # 後の値

データの集計

# 基本統計
df["age"].mean()    # 平均
df["age"].sum()     # 合計
df["age"].max()     # 最大
df["age"].min()     # 最小
df["age"].std()     # 標準偏差
df["age"].count()   # カウント

# 値のカウント
df["city"].value_counts()

# グループ化
df.groupby("city")["age"].mean()
df.groupby("city").agg({
    "age": ["mean", "max"],
    "name": "count"
})

# ピボットテーブル
pd.pivot_table(df, values="age", index="city", aggfunc="mean")

データの結合

# 縦結合
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
df = pd.concat([df1, df2], ignore_index=True)

# 横結合(merge)
users = pd.DataFrame({
    "user_id": [1, 2, 3],
    "name": ["太郎", "花子", "次郎"]
})
orders = pd.DataFrame({
    "user_id": [1, 1, 2],
    "product": ["りんご", "みかん", "バナナ"]
})

# INNER JOIN
df = pd.merge(users, orders, on="user_id")

# LEFT JOIN
df = pd.merge(users, orders, on="user_id", how="left")

データの並べ替え

# 1列でソート
df = df.sort_values("age")
df = df.sort_values("age", ascending=False)  # 降順

# 複数列でソート
df = df.sort_values(["city", "age"], ascending=[True, False])

# インデックスでソート
df = df.sort_index()

データの変換

# 型変換
df["age"] = df["age"].astype(int)
df["date"] = pd.to_datetime(df["date"])

# 値の置換
df["city"] = df["city"].replace({"東京": "Tokyo", "大阪": "Osaka"})

# apply関数
df["name_len"] = df["name"].apply(len)
df["age_group"] = df["age"].apply(lambda x: "若者" if x < 30 else "大人")

# map関数
df["city_code"] = df["city"].map({"東京": "TKY", "大阪": "OSK"})

日付データの処理

df["date"] = pd.to_datetime(df["date"])

# 日付の要素を抽出
df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day"] = df["date"].dt.day
df["weekday"] = df["date"].dt.day_name()

# 日付でフィルタ
df[df["date"] >= "2026-01-01"]
df[(df["date"] >= "2026-01-01") & (df["date"] < "2026-02-01")]

# 期間でグループ化
df.groupby(df["date"].dt.to_period("M"))["sales"].sum()

実践例:売上データ分析

import pandas as pd

# サンプルデータの作成
data = {
    "date": pd.date_range("2026-01-01", periods=100, freq="D"),
    "product": ["A", "B", "C", "D"] * 25,
    "region": ["東日本", "西日本"] * 50,
    "sales": [100 + i * 10 + (i % 7) * 5 for i in range(100)],
    "quantity": [10 + i % 20 for i in range(100)]
}
df = pd.DataFrame(data)

# 基本情報
print(f"期間: {df['date'].min()}{df['date'].max()}")
print(f"総売上: {df['sales'].sum():,}円")
print(f"平均売上: {df['sales'].mean():,.0f}円")

# 商品別売上
product_sales = df.groupby("product")["sales"].agg(["sum", "mean", "count"])
print("\n商品別売上:")
print(product_sales.sort_values("sum", ascending=False))

# 地域別・商品別売上
pivot = pd.pivot_table(
    df,
    values="sales",
    index="region",
    columns="product",
    aggfunc="sum"
)
print("\n地域別・商品別売上:")
print(pivot)

# 月別推移
df["month"] = df["date"].dt.to_period("M")
monthly = df.groupby("month")["sales"].sum()
print("\n月別売上:")
print(monthly)

# 結果を保存
df.to_csv("sales_analysis.csv", index=False, encoding="utf-8")

まとめ

  • DataFrameは表形式データを扱う中心的なオブジェクト
  • read_csv/to_csvでCSVファイルを読み書き
  • iloc/locで行を選択、df[列名]で列を選択
  • groupbyでグループ化して集計
  • mergeでテーブルを結合
  • applyで各要素に関数を適用

次回はmatplotlibでデータ可視化を学びます。

広告エリア