【Pandas入門 最終回】実践!データ結合・時系列操作・Matplotlibでの可視化まで一気通貫! 🚀

「別々のCSVファイルにある顧客データと購買データを、どうやって組み合わせればいいの?」
「日付データを使って、月ごとの売上集計みたいなことをやってみたい!」
「Pandasで集計した結果を、分かりやすくグラフにするにはどうすれば?」

こんにちは! Pandas探検隊、隊長のPythonistaです! 前回の第4回では、groupby()メソッドを駆使して、データを様々な角度から集計・分析する強力なテクニックを学びましたね。データの奥に潜む洞察を引き出す力が、格段に向上したはずです。

いよいよ今回で、Pandas入門シリーズは最終回を迎えます! この集大成となる第5回では、これまでに学んだ全ての知識を総動員し、より現実世界のデータ分析に近い**実践的なワークフロー**に挑戦します。具体的には、

  • 複数のDataFrameをキーで結合するmergeと、単純に連結するconcat
  • データ分析で頻出する、簡単な時系列データの扱い方
  • そして、分析結果を視覚的に伝えるためのMatplotlibと連携したデータ可視化

までを一気通貫で解説します。この記事を終える頃には、あなたはデータを読み込み、整形し、複数の情報を組み合わせ、分析し、そして結果を可視化するという、データ分析の一連のプロセスを自分自身の手で実行できるようになっています。さあ、冒険のクライマックスを楽しみましょう!


1. 準備:複数のサンプルDataFrameを用意する

今回は、複数のデータを結合する操作が中心となるため、2つの異なる情報を持つサンプルDataFrameを用意します。「顧客データ」と、その顧客たちの「注文データ」です。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# --- 顧客データ ---
customers_data = {
    '顧客ID': ['C001', 'C002', 'C003', 'C004'],
    '氏名': ['佐藤', '鈴木', '高橋', '田中'],
    '登録日': ['2023-01-10', '2023-02-20', '2023-01-15', '2023-03-05']
}
customers_df = pd.DataFrame(customers_data)

# --- 注文データ ---
orders_data = {
    '注文ID': ['O01', 'O02', 'O03', 'O04', 'O05', 'O06'],
    '顧客ID': ['C001', 'C003', 'C001', 'C002', 'C005', 'C003'], # C005は顧客データにいない
    '注文日': ['2023-03-15', '2023-03-18', '2023-04-02', '2023-04-05', '2023-04-08', '2023-04-20'],
    '金額': [5000, 8000, 3500, 12000, 7000, 4000]
}
orders_df = pd.DataFrame(orders_data)

print("--- 顧客データ ---")
print(customers_df)
print("\n--- 注文データ ---")
print(orders_df)

これらの2つのDataFrameには、共通の「顧客ID」列があります。これをキーにして、データを結合していきます。


2. 複数のDataFrameを結合する:mergeconcat

関連するデータを一つにまとめるのは、データ分析の基本です。Pandasには、主に2つの結合方法があります。

2.1. pd.merge():キーを基準にしたデータベース風の結合

pd.merge()は、SQLのJOINのように、共通の列(キー)を基準にして複数のDataFrameを結合します。how引数を指定することで、結合の方法を制御できます。

  • how='inner' (内部結合、デフォルト): 両方のDataFrameに存在するキーのデータだけを結合します。
  • how='left' (左外部結合): 左側(第一引数)のDataFrameのキーを全て残し、それに右側のDataFrameのデータを結合します。対応するキーが右側にない場合は欠損値(NaN)になります。
  • how='right' (右外部結合): 右側(第二引数)のDataFrameのキーを全て残します。
  • how='outer' (完全外部結合): 両方のDataFrameのキーを全て残します。
# '顧客ID'をキーにして、内部結合 (両方にIDが存在する注文データのみ)
merged_inner_df = pd.merge(customers_df, orders_df, on='顧客ID', how='inner')
print("\n--- 内部結合 (inner) ---")
print(merged_inner_df)

# 左外部結合 (顧客データは全て残り、注文がない顧客も表示される)
# C004の田中さんは注文がないので、注文関連の列がNaNになる
merged_left_df = pd.merge(customers_df, orders_df, on='顧客ID', how='left')
print("\n--- 左外部結合 (left) ---")
print(merged_left_df)


「どのデータを基準に情報をまとめたいか」によって、howを使い分けることが重要です。

2.2. pd.concat():単純な連結(縦積み・横並び)

pd.concat()は、複数のDataFrameを単純に行方向(縦)または列方向(横)に連結します。同じ列構造を持つ複数のファイルをまとめる場合などによく使われます。

df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})

# 行方向に連結 (デフォルト)
concat_rows = pd.concat([df1, df2], ignore_index=True) # ignore_index=Trueでインデックスを振り直す
print("\n--- 行方向の連結 (concat) ---")
print(concat_rows)

キーに基づいた結合はmerge、単純な積み重ねはconcatと覚えておきましょう。


3. 簡単な時系列データの扱い

Pandasは時系列データの扱いに非常に優れています。日付や時刻の列をインデックスに設定することで、強力な機能が使えるようになります。

3.1. `datetime`型への変換とインデックス設定

まずは、結合したDataFrameの「注文日」列を、ただの文字列からPandasのdatetime型に変換し、それをインデックスに設定します。

# merged_inner_df を使う
df_time = merged_inner_df.copy() # 元のDFを壊さないようにコピー

# '注文日'列をdatetime型に変換
df_time['注文日'] = pd.to_datetime(df_time['注文日'])

# '注文日'列をインデックスに設定
df_time = df_time.set_index('注文日')
print("\n--- 時系列インデックスを持つDataFrame ---")
print(df_time)
df_time.info() # インデックスがDatetimeIndexになっていることを確認

3.2. 時間ベースのデータ抽出とリサンプリング

インデックスがdatetime型になると、特定期間のデータを簡単に抽出したり、集計したりできます。

# df_time を使う

# 2023年4月のデータだけを抽出
april_data = df_time['2023-04']
print("\n--- 2023年4月の注文データ ---")
print(april_data)

# リサンプリング: 日々のデータを月ごとの合計に変換
# 'M' は月の最終日 (Month End) を意味する
monthly_sales = df_time['金額'].resample('M').sum()
print("\n--- 月ごとの合計売上 (リサンプリング) ---")
print(monthly_sales)

resample()は非常に強力な機能で、日次データを週次、月次、四半期、年次データなどに簡単に変換・集計できます。


4. 実践!分析結果をMatplotlibで可視化する

それでは、これまでの全ての知識を総動員して、「顧客ごとの合計購買金額」を計算し、棒グラフで可視化してみましょう!

# 1. データの結合 (内部結合)
df_merged = pd.merge(customers_df, orders_df, on='顧客ID')

# 2. データの集計 ('氏名'でグループ化し、'金額'を合計)
customer_sales = df_merged.groupby('氏名')['金額'].sum().sort_values(ascending=False)
print("\n--- 顧客ごとの合計購買金額 ---")
print(customer_sales)

# 3. データの可視化 (Matplotlib)
plt.style.use('ggplot')
plt.figure(figsize=(8, 5))

# 棒グラフを作成
customer_sales.plot(kind='bar', color='#3498db')

plt.title('顧客ごとの合計購買金額', fontsize=16)
plt.xlabel('顧客名')
plt.ylabel('合計金額 (円)')
plt.xticks(rotation=0) # X軸ラベルの回転をなくす
plt.grid(axis='y', linestyle='--') # 横のグリッド線だけにする

plt.tight_layout() # レイアウトを自動調整
plt.show()

このように、Pandasでデータを処理・集計し、その結果をMatplotlibに渡して可視化する、というのがデータ分析の王道パターンです!


まとめ:Pandas入門シリーズ完結!そして、データ分析の冒険はここから始まる!

今回の実践編、そしてPandas入門シリーズ全体を通して、私たちは以下の壮大な旅をしてきました。

  • 第1回: SeriesDataFrameというデータ構造を知り、CSV/Excelからデータを読み書きする術を覚えた。
  • 第2回: loc, iloc, ブールインデックスを使い、巨大なデータから必要な情報だけを抜き出す技術を身につけた。
  • 第3回: 欠損値や重複、間違ったデータ型と戦い、データを分析できる状態に整えるクリーニング術をマスターした。
  • 第4回: groupby()を駆使して、データをグループに分け、意味のある洞察を引き出す集計スキルを習得した。
  • そして今回: 複数のデータをmergeで結合し、時系列データを扱い、最後にMatplotlibで分析結果を可視化するという、一連のデータ分析ワークフローを完遂した。

おめでとうございます!あなたはもう、PythonとPandasを使って現実世界のデータを扱い、そこから価値を生み出すための基本的なスキルセットを完全に手に入れました。これは、データサイエンティストとしてのキャリア、あるいはあなたの仕事や研究をデータドリブンに進めるための、非常に大きな一歩です。

Pandasの世界はまだまだ奥深く、より高度な機能がたくさんあります。しかし、このシリーズで固めた基礎があれば、どんな応用的な課題にも自信を持って挑戦できるはずです。ぜひ、Kaggleなどのプラットフォームで実際のデータセットに触れたり、ご自身の興味のあるデータを分析したりして、そのスキルをさらに磨いていってください。

これまでの探検、本当にお疲れ様でした。そして、ありがとうございました。あなたのデータ分析の旅が、これからもエキサイティングで実り多いものになることを心から願っています!

Happy Data Analyzing! 🐼

その他の投稿はこちら

コメント

このブログの人気の投稿

タイトルまとめ

これで迷わない!WindowsでPython環境構築する一番やさしい方法 #0

【Python標準ライブラリ完結!】11の冒険をありがとう!君のPython力が飛躍する「次の一歩」とは? 🚀