PythonでPandas入門|データ分析の基本操作を実例で解説

kento_morota 15分で読めます

業務データの分析やレポート作成は、多くの企業で日常的に行われています。Excelでの手作業では対応しきれないデータ量や複雑な集計処理に直面したとき、PythonのPandasライブラリが強力な解決策となります。

本記事では、Pandasの基本操作をCSVデータの読み込みから加工・集計・可視化まで、実務に直結するサンプルコードとともに解説します。データ分析の第一歩として、すぐに業務で活用できる内容をお届けします。

Pandasとは?できることと環境準備

Pandasは、Pythonでデータ分析を行うための中核ライブラリです。表形式(行と列)のデータを効率的に扱うための機能を豊富に備えており、Excelのような直感的なデータ操作をプログラムで実現できます。

Pandasでできること

  • CSV・Excel・JSON・SQL・HTMLなど多様な形式のデータ読み書き
  • データのフィルタリング、ソート、グルーピング、結合
  • 欠損値の処理やデータ型の変換
  • 統計量の計算(平均、中央値、標準偏差など)
  • ピボットテーブルやクロス集計
  • 時系列データの分析

インストールと基本的なimport

# インストール
pip install pandas matplotlib openpyxl

# 基本的なimport
import pandas as pd
import matplotlib.pyplot as plt

# バージョン確認
print(pd.__version__)

pandaspdとしてインポートするのは、Pythonコミュニティ全体で広く使われている慣例です。

DataFrameの基本|作成・読み込み・構造の確認

Pandasの中心的なデータ構造がDataFrameです。行と列で構成される2次元のテーブル形式で、Excelのワークシートに相当します。

DataFrameの作成

import pandas as pd

# 辞書からDataFrameを作成
data = {
    "社員ID": [1, 2, 3, 4, 5],
    "名前": ["田中太郎", "佐藤花子", "鈴木一郎", "山田美咲", "高橋健太"],
    "部署": ["営業", "開発", "営業", "開発", "人事"],
    "年齢": [30, 28, 35, 32, 27],
    "年収": [500, 550, 600, 580, 450],
}

df = pd.DataFrame(data)
print(df)

出力結果:

   社員ID    名前  部署  年齢  年収
0      1  田中太郎  営業   30  500
1      2  佐藤花子  開発   28  550
2      3  鈴木一郎  営業   35  600
3      4  山田美咲  開発   32  580
4      5  高橋健太  人事   27  450

CSVファイルの読み込み

# CSVファイルの読み込み
df = pd.read_csv("sales_data.csv", encoding="utf-8")

# Excel読み込み
df_excel = pd.read_excel("report.xlsx", sheet_name="Sheet1")

# 文字コード指定(日本語CSVでよく必要)
df = pd.read_csv("data.csv", encoding="cp932")

# 先頭数行の確認
print(df.head())       # 先頭5行
print(df.head(10))     # 先頭10行
print(df.tail())       # 末尾5行

DataFrameの構造を確認する

# 形状の確認(行数、列数)
print(df.shape)  # (100, 5)

# データ型とメモリ使用量
print(df.info())

# 基本統計量
print(df.describe())

# 列名の一覧
print(df.columns.tolist())

# 重複行の確認
print(df.duplicated().sum())

データの選択・フィルタリング

DataFrameから必要なデータを抽出する方法を解説します。

列の選択

# 単一列の選択(Series として取得)
names = df["名前"]

# 複数列の選択(DataFrame として取得)
subset = df[["名前", "部署", "年収"]]

行の選択

# インデックス番号で選択(iloc)
first_row = df.iloc[0]       # 1行目
first_three = df.iloc[0:3]   # 1〜3行目

# ラベルで選択(loc)
df_indexed = df.set_index("社員ID")
employee = df_indexed.loc[3]  # 社員ID=3のデータ

条件によるフィルタリング

# 単一条件
sales_dept = df[df["部署"] == "営業"]
print(sales_dept)

# 複数条件(AND)
senior_sales = df[(df["部署"] == "営業") & (df["年齢"] >= 30)]

# 複数条件(OR)
target = df[(df["部署"] == "営業") | (df["部署"] == "開発")]

# 特定の値のリストでフィルタ
target_depts = df[df["部署"].isin(["営業", "開発"])]

# 文字列を含むかどうか
tanaka = df[df["名前"].str.contains("田中")]

# 年収が上位30%のデータ
top_earners = df[df["年収"] >= df["年収"].quantile(0.7)]

データの加工・変換

データ分析では、元データの加工や変換が不可欠です。Pandasは多様な加工機能を提供しています。

列の追加・変更

# 新しい列の追加
df["月収"] = df["年収"] / 12
df["年収ランク"] = pd.cut(df["年収"], bins=[0, 450, 550, 700], labels=["C", "B", "A"])

# 条件に基づく列の作成
df["ベテラン"] = df["年齢"].apply(lambda x: "○" if x >= 30 else "")

# 列名の変更
df = df.rename(columns={"年収": "年収(万円)"})

# 列の削除
df = df.drop(columns=["月収"])

欠損値の処理

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

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

# 特定の列の欠損値を削除
df_clean = df.dropna(subset=["年収"])

# 欠損値を埋める
df["年収"] = df["年収"].fillna(df["年収"].median())  # 中央値で補完
df["部署"] = df["部署"].fillna("未所属")              # 固定値で補完

データ型の変換

# データ型の確認
print(df.dtypes)

# 型変換
df["社員ID"] = df["社員ID"].astype(str)
df["年収"] = df["年収"].astype(float)

# 日付型への変換
df["入社日"] = pd.to_datetime(df["入社日"], format="%Y-%m-%d")
df["入社年"] = df["入社日"].dt.year
df["入社月"] = df["入社日"].dt.month

文字列操作

# 文字列の一括処理
df["名前_カナ"] = df["名前_カナ"].str.strip()  # 前後の空白削除
df["メール"] = df["メール"].str.lower()          # 小文字化
df["姓"] = df["名前"].str.split(" ").str[0]     # 全角スペースで分割

集計・グルーピング

業務データ分析で最も頻繁に行う操作がグルーピングと集計です。

基本的な集計

# 列ごとの統計量
print(df["年収"].mean())    # 平均
print(df["年収"].median())  # 中央値
print(df["年収"].std())     # 標準偏差
print(df["年収"].sum())     # 合計
print(df["年収"].max())     # 最大値
print(df["年収"].min())     # 最小値

# 値のカウント
print(df["部署"].value_counts())

groupbyによるグルーピング

# 部署ごとの平均年収
dept_avg = df.groupby("部署")["年収"].mean()
print(dept_avg)

# 複数の集計を同時に行う
dept_stats = df.groupby("部署")["年収"].agg(["mean", "median", "min", "max", "count"])
print(dept_stats)

# 複数列でのグルーピング
dept_age_stats = df.groupby(["部署", "年収ランク"]).agg(
    人数=("社員ID", "count"),
    平均年齢=("年齢", "mean"),
    平均年収=("年収", "mean"),
).reset_index()
print(dept_age_stats)

ピボットテーブル

# ピボットテーブルの作成
pivot = pd.pivot_table(
    df,
    values="年収",
    index="部署",
    columns="年収ランク",
    aggfunc="mean",
    fill_value=0,
)
print(pivot)

DataFrameの結合とマージ

複数のデータソースを組み合わせて分析する場面も多くあります。

concat(縦結合・横結合)

# 縦結合(行の追加)
df_2024 = pd.read_csv("sales_2024.csv")
df_2025 = pd.read_csv("sales_2025.csv")
df_all = pd.concat([df_2024, df_2025], ignore_index=True)

# 横結合(列の追加)
df_combined = pd.concat([df_basic, df_detail], axis=1)

merge(SQLのJOINに相当)

# 部署マスタ
dept_master = pd.DataFrame({
    "部署コード": ["S01", "D01", "H01"],
    "部署名": ["営業", "開発", "人事"],
    "フロア": ["3F", "5F", "2F"],
})

# 社員データとマスタの結合(INNER JOIN)
df_joined = pd.merge(df, dept_master, left_on="部署", right_on="部署名", how="inner")

# LEFT JOIN(左側のデータをすべて残す)
df_left = pd.merge(df, dept_master, left_on="部署", right_on="部署名", how="left")

# 結合キーが同じ名前の場合
df_merged = pd.merge(df1, df2, on="社員ID", how="inner")

データの可視化とファイル出力

分析結果を可視化することで、データの傾向を直感的に理解できます。

Matplotlibとの連携

import matplotlib.pyplot as plt

# 日本語フォントの設定(macOS)
plt.rcParams["font.family"] = "Hiragino Sans"
# Windows の場合
# plt.rcParams["font.family"] = "MS Gothic"

# 棒グラフ:部署別平均年収
dept_avg = df.groupby("部署")["年収"].mean()
dept_avg.plot(kind="bar", title="部署別平均年収", ylabel="年収(万円)")
plt.tight_layout()
plt.savefig("dept_salary.png", dpi=150)
plt.show()

# 折れ線グラフ:月別売上推移
monthly_sales = df.groupby("月")["売上"].sum()
monthly_sales.plot(kind="line", marker="o", title="月別売上推移")
plt.tight_layout()
plt.savefig("monthly_sales.png", dpi=150)
plt.show()

# ヒストグラム:年齢分布
df["年齢"].plot(kind="hist", bins=10, title="年齢分布", edgecolor="black")
plt.tight_layout()
plt.show()

ファイルへの出力

# CSVへの出力
df.to_csv("output.csv", index=False, encoding="utf-8-sig")

# Excel出力
df.to_excel("output.xlsx", index=False, sheet_name="分析結果")

# 複数シートへの出力
with pd.ExcelWriter("report.xlsx", engine="openpyxl") as writer:
    df_summary.to_excel(writer, sheet_name="サマリー", index=False)
    df_detail.to_excel(writer, sheet_name="詳細データ", index=False)
    dept_stats.to_excel(writer, sheet_name="部署別集計")

実践:売上データの分析パイプライン

ここまでの知識を組み合わせた実践的な分析例を紹介します。

import pandas as pd
import matplotlib.pyplot as plt

# 1. データの読み込み
df = pd.read_csv("sales_data.csv", encoding="utf-8", parse_dates=["日付"])

# 2. データの前処理
df = df.dropna(subset=["売上金額"])                   # 欠損値の除去
df["年月"] = df["日付"].dt.to_period("M")            # 年月列の追加
df["曜日"] = df["日付"].dt.day_name()                # 曜日列の追加
df["売上金額"] = df["売上金額"].astype(int)           # 型変換

# 3. 基本的な分析
print("=== 基本統計量 ===")
print(df["売上金額"].describe())

print("\n=== 商品カテゴリ別売上 ===")
category_sales = df.groupby("カテゴリ").agg(
    合計売上=("売上金額", "sum"),
    平均単価=("売上金額", "mean"),
    件数=("売上金額", "count"),
).sort_values("合計売上", ascending=False)
print(category_sales)

print("\n=== 月別売上推移 ===")
monthly = df.groupby("年月")["売上金額"].sum()
print(monthly)

# 4. レポートの出力
with pd.ExcelWriter("sales_report.xlsx", engine="openpyxl") as writer:
    category_sales.to_excel(writer, sheet_name="カテゴリ別")
    monthly.to_excel(writer, sheet_name="月別推移")

print("\nレポートを sales_report.xlsx に出力しました。")

このようなパイプラインをスクリプトとして保存しておけば、毎月のデータ更新時にコマンド一つでレポートを再生成できます。

まとめ

本記事では、PythonのPandasライブラリを使ったデータ分析の基本操作を解説しました。

  • Pandasはデータの読み込み・加工・集計・出力をプログラムで効率化するライブラリ
  • DataFrameが中心的なデータ構造で、Excelのようにデータを操作できる
  • 条件フィルタリング、groupby集計、merge結合が実務での主要操作
  • Matplotlibと組み合わせることでデータの可視化も可能
  • 分析パイプラインをスクリプト化することで、繰り返し作業を自動化できる

Excelでの手作業に限界を感じている方は、まずはCSVの読み込みと基本的な集計から始めてみてください。Pandasを使いこなすことで、データに基づく迅速な意思決定が可能になります。

#Python#Pandas#データ分析
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

起業準備に役立つ情報、もっとありますよ。

まずは話だけ聞いてもらう