業務データの分析やレポート作成は、多くの企業で日常的に行われています。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__)
pandasをpdとしてインポートするのは、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を使いこなすことで、データに基づく迅速な意思決定が可能になります。
関連記事
AIエージェント開発入門|自律型AIの仕組みと構築方法を解説【2026年版】
AI駆動コーディングワークフロー|Claude Code・Cursor・Copilotの実践的使い分け
プロンプトエンジニアリング上級編|Chain-of-Thought・Few-Shot・ReActの実践
APIレート制限の設計と実装|トークンバケット・スライディングウィンドウ解説
APIバージョニング戦略|URL・ヘッダー・クエリパラメータの使い分け
BIツール入門|Metabase・Redash・Looker Studioでデータ可視化する方法
チャットボット開発入門|LINE Bot・Slack Botの構築方法と活用事例
CI/CDパイプラインの基礎|継続的インテグレーション・デリバリーの全体像