【Pandas】 melt メソッドで解析しやすいデータを作る

Pandas
この記事は約12分で読めます。

こんにちは、JS2IIUです。

今回は、Pythonのデータ分析ライブラリpandasの強力なツールの一つ、meltメソッドについて解説します。meltメソッドは、データの形式を変換する際に非常に役立ち、データ分析や可視化の前処理をグッと楽にしてくれます。この記事では、meltの基本的な使い方から、実際のデータ分析、可視化までを、具体的な例を通して丁寧に説明していきます。

1. meltメソッドって何?

meltメソッドは、pandasのDataFrameを「ワイドフォーマット」から「ロングフォーマット」へ変換するためのメソッドです。「ワイドフォーマット」とは、複数の種類のデータが複数の列にまたがって格納されている形式で、「ロングフォーマット」とは、それらのデータが特定の列(通常は「変数」と「値」の2つの列)にまとめられている形式です。

言葉だけでは少しわかりにくいので、具体的な例を見てみましょう。

ワイドフォーマットのデータ (例:月別商品売上)

MonthProductAProductBProductC
Jan15090120
Feb16095125
Mar175110135
Apr180115140
May190125150
Jun200130160

ロングフォーマットのデータ (例:月別商品売上)

MonthProductSales
JanProductA150
FebProductA160
MarProductA175
JunProductC160

meltメソッドを使うと、このようなデータフォーマットの変換を簡単に行うことができます。

2. meltメソッドの使い方

meltメソッドの基本的な使い方は以下の通りです。

.melt()メソッドのシグネチャ:

Python
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)

使い方解説:

Python
df_long = pd.melt(df_wide, id_vars=['識別変数となる列'], var_name='変数名となる列の名前', value_name='値となる列の名前')
  • df_wide: 変換前のワイドフォーマットのDataFrame
  • id_vars: 識別変数として残す列名のリスト(例:'Month'
  • var_name: value_varsで指定した列名をまとめる新しい列の名前(例:'Product'
  • value_name: value_varsで指定した列の値を格納する新しい列の名前(例:'Sales'
  • value_vars: 値としてまとめたい列をリストで指定します。指定しない場合、id_vars以外のすべての列が対象になります。
  • pandas.melt — pandas 2.2.3 documentation

3. 実践!meltでデータ分析&可視化

それでは、実際にmeltメソッドを使ってデータ分析と可視化を行ってみましょう。ここでは、月別の商品売上データを使って、以下のステップで進めていきます。

  1. ワイドフォーマットのDataFrameを作成
  2. meltを使ってロングフォーマットに変換
  3. データ分析:商品ごとの平均売上を計算
  4. データ可視化:月別売上推移を折れ線グラフで表示
  5. データ可視化:月別売上を商品別に棒グラフで表示

3.1 ワイドフォーマットのDataFrameを作成

まず、分析対象となる月別商品売上データ(ワイドフォーマット)を作成します。

Python
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Create a wide-format DataFrame
data = {
    'Month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
    'ProductA': [150, 160, 175, 180, 190, 200],
    'ProductB': [90, 95, 110, 115, 125, 130],
    'ProductC': [120, 125, 135, 140, 150, 160]
}

df_sales = pd.DataFrame(data)
print("Wide-Format DataFrame:")
print(df_sales)
Plaintext
Wide-Format DataFrame:
  Month  ProductA  ProductB  ProductC
0   Jan       150        90       120
1   Feb       160        95       125
2   Mar       175       110       135
3   Apr       180       115       140
4   May       190       125       150
5   Jun       200       130       160

3.2 meltを使ってロングフォーマットに変換

次に、meltメソッドを使って、このデータをロングフォーマットに変換します。

Python
# Transform to long format
df_sales_long = pd.melt(df_sales, id_vars=['Month'], var_name='Product', value_name='Sales')
print("\nLong-Format DataFrame:")
print(df_sales_long)
Plaintext
Long-Format DataFrame:
   Month   Product  Sales
0    Jan  ProductA    150
1    Feb  ProductA    160
2    Mar  ProductA    175
3    Apr  ProductA    180
4    May  ProductA    190
5    Jun  ProductA    200
6    Jan  ProductB     90
7    Feb  ProductB     95
8    Mar  ProductB    110
9    Apr  ProductB    115
10   May  ProductB    125
11   Jun  ProductB    130
12   Jan  ProductC    120
13   Feb  ProductC    125
14   Mar  ProductC    135
15   Apr  ProductC    140
16   May  ProductC    150
17   Jun  ProductC    160

Month列は識別変数として残し、ProductAProductBProductCの各列をProductSalesという2つの列にまとめています。

3.3 データ分析:商品ごとの平均売上を計算

ロングフォーマットに変換したデータを使って、商品ごとの平均売上を計算してみましょう。

Python
# Data Analysis: Calculate average sales per product
average_sales = df_sales_long.groupby('Product')['Sales'].mean()
print("\nAverage Sales per Product:")
print(average_sales)
Plaintext
Average Sales per Product:
Product
ProductA    175.833333
ProductB    110.833333
ProductC    138.333333
Name: Sales, dtype: float64

groupby()メソッドを使うことで、簡単に商品ごとの平均売上を算出できました。

3.4 データ可視化:月別売上推移を折れ線グラフで表示

最後に、seabornライブラリを使って、月別売上推移を折れ線グラフで可視化します。

Python
# Data Visualization: Plot monthly sales trend for each product
plt.figure(figsize=(10, 6))
sns.lineplot(x='Month', y='Sales', hue='Product', data=df_sales_long)
plt.title('Monthly Sales Trend by Product')
plt.xlabel('Month')
plt.ylabel('Sales')
plt.show()

各商品の売上推移が一目でわかるグラフが作成できました!

3.5 データ可視化:月別売上を商品別に棒グラフで表示

最後に、seabornライブラリを使って、月別売上を商品別に棒グラフで可視化します。

Python
# Data Visualization: Plot monthly sales by product using barplot
plt.figure(figsize=(10, 6))
sns.barplot(x='Month', y='Sales', hue='Product', data=df_sales_long)
plt.title('Monthly Sales by Product')
plt.xlabel('Month')
plt.ylabel('Sales')
plt.show()

各月の各商品の売上が一目でわかるグラフが作成できました!

4. ロングフォーマットとワイドフォーマット:利点と使い所

ロングフォーマット

利点:

  • データの可視化: 特にseabornなどのライブラリと相性が良く、複数カテゴリのデータを簡単に可視化できます。例えば、異なる商品の売上推移を1つのグラフで比較する際に便利です。
  • データの分析: groupby()などの集計処理と組み合わせやすく、特定の項目(例:商品ごと、月ごと)での統計量を簡単に算出できます。
  • データ容量の削減: 同じ値が繰り返し現れるようなデータの場合、ワイドフォーマットよりもデータ容量を小さく抑えられる可能性があります。
  • データベースの正規化: データベースに格納する際、正規化された形式として扱いやすい。

使い所:

  • 複数のカテゴリにまたがるデータを比較・分析したい場合。
  • データの可視化を簡単に行いたい場合。
  • データベースに格納するための、正規化された形式が必要な場合。

ワイドフォーマット

利点:

  • データの直感的な理解: 人間にとって直感的に理解しやすい形式です。表計算ソフトなどでデータを閲覧・編集する際に便利です。
  • 特定の項目の比較: 特定の項目(例:ある月の各商品の売上)を横並びで比較しやすい。
  • 特定のセルへのアクセス: 特定の行と列を指定して、特定の項目のデータに簡単にアクセスできます。

使い所:

  • データを表計算ソフトなどで閲覧・編集したい場合。
  • 特定の項目を横並びで比較したい場合。
  • 特定の項目のデータに素早くアクセスしたい場合。

まとめ

特徴ロングフォーマットワイドフォーマット
データの可視化容易(特に複数カテゴリ)特定の項目の比較は容易
データの分析集計処理と組み合わせやすい特定のセルへのアクセスが容易
データ容量場合によっては削減可能繰り返しが多いと冗長になる場合がある
直感的な理解やや慣れが必要人間にとって理解しやすい
データベース正規化された形式として扱いやすい場合によっては正規化が必要

多くの場合、データ分析や可視化の前処理にはロングフォーマットが適しており、人間が閲覧・編集する際にはワイドフォーマットが適しています。 pandasmeltpivotを使いこなして、状況に応じて適切なフォーマットを選択しましょう!

5. まとめ

pandasmeltメソッドは、データ分析や可視化の前処理として非常に強力なツールです。ワイドフォーマットのデータをロングフォーマットに変換することで、データの集計や可視化がより簡単かつ柔軟に行えるようになります。この記事を参考に、meltメソッドを使いこなして、データ分析のスキルアップを目指しましょう!

このmeltメソッドとは反対にロングフォーマットをワイドフォーマットに変換するpivotメソッドについての記事を書きましたので、こちらも併せて参考にして下さい。

6. 参考情報

これらのリソースも活用して、さらに理解を深めていってください!

Pythonに関する書籍のです。

24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。

ぜひFREE PREVIEWで内容チェックしてみて下さい!

最後まで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました