こんにちは、JS2IIUです。
今回は、Pythonのデータ分析ライブラリpandasの強力なツールの一つ、meltメソッドについて解説します。meltメソッドは、データの形式を変換する際に非常に役立ち、データ分析や可視化の前処理をグッと楽にしてくれます。この記事では、meltの基本的な使い方から、実際のデータ分析、可視化までを、具体的な例を通して丁寧に説明していきます。
1. meltメソッドって何?
meltメソッドは、pandasのDataFrameを「ワイドフォーマット」から「ロングフォーマット」へ変換するためのメソッドです。「ワイドフォーマット」とは、複数の種類のデータが複数の列にまたがって格納されている形式で、「ロングフォーマット」とは、それらのデータが特定の列(通常は「変数」と「値」の2つの列)にまとめられている形式です。
言葉だけでは少しわかりにくいので、具体的な例を見てみましょう。
ワイドフォーマットのデータ (例:月別商品売上)
| Month | ProductA | ProductB | ProductC |
|---|---|---|---|
| Jan | 150 | 90 | 120 |
| Feb | 160 | 95 | 125 |
| Mar | 175 | 110 | 135 |
| Apr | 180 | 115 | 140 |
| May | 190 | 125 | 150 |
| Jun | 200 | 130 | 160 |
ロングフォーマットのデータ (例:月別商品売上)
| Month | Product | Sales |
|---|---|---|
| Jan | ProductA | 150 |
| Feb | ProductA | 160 |
| Mar | ProductA | 175 |
| … | … | … |
| Jun | ProductC | 160 |
meltメソッドを使うと、このようなデータフォーマットの変換を簡単に行うことができます。
2. meltメソッドの使い方
meltメソッドの基本的な使い方は以下の通りです。
.melt()メソッドのシグネチャ:
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)使い方解説:
df_long = pd.melt(df_wide, id_vars=['識別変数となる列'], var_name='変数名となる列の名前', value_name='値となる列の名前')df_wide: 変換前のワイドフォーマットのDataFrameid_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メソッドを使ってデータ分析と可視化を行ってみましょう。ここでは、月別の商品売上データを使って、以下のステップで進めていきます。
- ワイドフォーマットのDataFrameを作成
meltを使ってロングフォーマットに変換- データ分析:商品ごとの平均売上を計算
- データ可視化:月別売上推移を折れ線グラフで表示
- データ可視化:月別売上を商品別に棒グラフで表示
3.1 ワイドフォーマットのDataFrameを作成
まず、分析対象となる月別商品売上データ(ワイドフォーマット)を作成します。
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)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 1603.2 meltを使ってロングフォーマットに変換
次に、meltメソッドを使って、このデータをロングフォーマットに変換します。
# 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)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 160Month列は識別変数として残し、ProductA、ProductB、ProductCの各列をProductとSalesという2つの列にまとめています。
3.3 データ分析:商品ごとの平均売上を計算
ロングフォーマットに変換したデータを使って、商品ごとの平均売上を計算してみましょう。
# Data Analysis: Calculate average sales per product
average_sales = df_sales_long.groupby('Product')['Sales'].mean()
print("\nAverage Sales per Product:")
print(average_sales)Average Sales per Product:
Product
ProductA 175.833333
ProductB 110.833333
ProductC 138.333333
Name: Sales, dtype: float64groupby()メソッドを使うことで、簡単に商品ごとの平均売上を算出できました。
3.4 データ可視化:月別売上推移を折れ線グラフで表示
最後に、seabornライブラリを使って、月別売上推移を折れ線グラフで可視化します。
# 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ライブラリを使って、月別売上を商品別に棒グラフで可視化します。
# 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()などの集計処理と組み合わせやすく、特定の項目(例:商品ごと、月ごと)での統計量を簡単に算出できます。 - データ容量の削減: 同じ値が繰り返し現れるようなデータの場合、ワイドフォーマットよりもデータ容量を小さく抑えられる可能性があります。
- データベースの正規化: データベースに格納する際、正規化された形式として扱いやすい。
使い所:
- 複数のカテゴリにまたがるデータを比較・分析したい場合。
- データの可視化を簡単に行いたい場合。
- データベースに格納するための、正規化された形式が必要な場合。
ワイドフォーマット
利点:
- データの直感的な理解: 人間にとって直感的に理解しやすい形式です。表計算ソフトなどでデータを閲覧・編集する際に便利です。
- 特定の項目の比較: 特定の項目(例:ある月の各商品の売上)を横並びで比較しやすい。
- 特定のセルへのアクセス: 特定の行と列を指定して、特定の項目のデータに簡単にアクセスできます。
使い所:
- データを表計算ソフトなどで閲覧・編集したい場合。
- 特定の項目を横並びで比較したい場合。
- 特定の項目のデータに素早くアクセスしたい場合。
まとめ
| 特徴 | ロングフォーマット | ワイドフォーマット |
|---|---|---|
| データの可視化 | 容易(特に複数カテゴリ) | 特定の項目の比較は容易 |
| データの分析 | 集計処理と組み合わせやすい | 特定のセルへのアクセスが容易 |
| データ容量 | 場合によっては削減可能 | 繰り返しが多いと冗長になる場合がある |
| 直感的な理解 | やや慣れが必要 | 人間にとって理解しやすい |
| データベース | 正規化された形式として扱いやすい | 場合によっては正規化が必要 |
多くの場合、データ分析や可視化の前処理にはロングフォーマットが適しており、人間が閲覧・編集する際にはワイドフォーマットが適しています。 pandasのmeltとpivotを使いこなして、状況に応じて適切なフォーマットを選択しましょう!
5. まとめ
pandasのmeltメソッドは、データ分析や可視化の前処理として非常に強力なツールです。ワイドフォーマットのデータをロングフォーマットに変換することで、データの集計や可視化がより簡単かつ柔軟に行えるようになります。この記事を参考に、meltメソッドを使いこなして、データ分析のスキルアップを目指しましょう!
このmeltメソッドとは反対にロングフォーマットをワイドフォーマットに変換するpivotメソッドについての記事を書きましたので、こちらも併せて参考にして下さい。
6. 参考情報
- pandas melt documentation – pandas meltの公式ドキュメント
- seaborn – データ可視化ライブラリseabornの公式ウェブサイト
これらのリソースも活用して、さらに理解を深めていってください!
Pythonに関する書籍のです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。
ぜひFREE PREVIEWで内容チェックしてみて下さい!
最後まで読んでいただきありがとうございました。



コメント