PandasにおけるTidy Dataの原則と整形方法
Tidy Data(整然データ)とは、データ分析を効率的に行うためのデータの構造に関する考え方であり、 Hadley Wickhamによって提唱されました。PandasはこのTidy Dataの原則に沿ったデータ操作を得意としており、その原則を理解し、データ整形を行うことで、より直感的で強力なデータ分析が可能になります。
Tidy Dataの3つの原則
Tidy Dataの原則は、以下の3つの要素から構成されます。
1. 各変数(Variable)は列(Column)として格納する
これは、分析したい対象となる各指標や属性が、それぞれ独立した列として存在することを意味します。例えば、ある企業の月ごとの売上データがある場合、「月」という変数、「売上」という変数はそれぞれ別の列に格納されるべきです。
2. 各観測(Observation)は行(Row)として格納する
各行は、ある特定の時点や対象における観測値の集合を表します。例えば、上記の企業の売上データでは、各行が特定の月の売上データ(月、売上金額など)をまとめて表すことになります。
3. 各種テイク(Type)は1つのスカラー値(Scalar Value)として格納する
これは、各セルの値が単一のデータポイントであることを意味します。複数の値が1つのセルに格納されていたり、空のセルが意図せず存在したりすることは避けるべきです。
これらの原則に従うことで、データは以下のような利点を得ます。
- 直感的な理解: データの構造が明確になり、人間が理解しやすくなります。
- 簡便な操作: Pandasの様々な関数(集計、フィルタリング、結合など)が、Tidy Dataの構造を前提としているため、操作が容易になります。
- 一貫性: 複数のデータセットを扱う場合でも、一貫した構造を保つことで、結合や比較が容易になります。
- 可視化の容易さ: 多くの可視化ライブラリは、Tidy Dataの構造を想定して設計されているため、グラフ作成がスムーズになります。
PandasでのTidy Data整形方法
Pandasでは、Tidy Dataの原則に沿わない「Untidy Data」をTidy Dataに変換するための強力な機能が提供されています。主に、以下の関数が活用されます。
1. melt()関数: Wide FormatからLong Formatへ
Wide Format(横長形式)とは、観測値が複数の列に分散している形式です。melt()関数は、このWide Formatのデータを、指定したID変数以外をすべて「値」の列にまとめ、元の列名を「変数」の列に格納することで、Long Format(縦長形式)に変換します。
例:
もし、以下のようなWide Formatのデータがあるとします。
“`
ID Q1 Q2 Q3 Q4
0 A 10 12 11 15
1 B 15 14 16 18
“`
これをmelt()関数で整形すると、以下のようになります。
“`python
import pandas as pd
df_wide = pd.DataFrame({
‘ID’: [‘A’, ‘B’],
‘Q1’: [10, 15],
‘Q2’: [12, 14],
‘Q3’: [11, 16],
‘Q4’: [15, 18]
})
df_long = pd.melt(df_wide, id_vars=[‘ID’], var_name=’Quarter’, value_name=’Sales’)
print(df_long)
“`
出力:
“`
ID Quarter Sales
0 A Q1 10
1 B Q1 15
2 A Q2 12
3 B Q2 14
4 A Q3 11
5 B Q3 16
6 A Q4 15
7 B Q4 18
“`
このLong Formatでは、「ID」が観測対象、「Quarter」が変数、「Sales」がその観測値となり、Tidy Dataの原則に合致しています。
2. pivot()関数およびpivot_table()関数: Long FormatからWide Formatへ
pivot()関数は、Long FormatのデータをWide Formatに変換します。指定した列の値を新しい列名として使用し、別の列の値をそのセルの値として格納します。ただし、pivot()関数は、インデックスとカラムの組み合わせが一意でないとエラーになります。
pivot_table()関数は、pivot()関数に似ていますが、インデックスとカラムの組み合わせが一意でなくても、指定した集計関数(デフォルトは平均)を用いて値を集計してくれるため、より柔軟な操作が可能です。
例:
先ほどのLong Formatのデータから、特定の「ID」と「Quarter」の「Sales」をWide Formatに戻す場合:
“`python
# pivot()関数の例 (indexとcolumnの組み合わせが一意な場合)
df_wide_again = df_long.pivot(index=’ID’, columns=’Quarter’, values=’Sales’)
print(df_wide_again)
# pivot_table()関数の例 (集計が必要な場合など)
# df_pivot_table = df_long.pivot_table(index=’ID’, columns=’Quarter’, values=’Sales’, aggfunc=’sum’)
# print(df_pivot_table)
“`
出力(pivot()関数の場合):
“`
Quarter Q1 Q2 Q3 Q4
ID
A 10 12 11 15
B 15 14 16 18
“`
3. stack()関数とunstack()関数: MultiIndexの操作
stack()関数とunstack()関数は、DataFrameのインデックスを操作して、データの形状を変更します。
- stack(): 列をインデックスに移動させ、DataFrameをより縦長にします。
- unstack(): インデックスを列に移動させ、DataFrameをより横長にします。
これらは、特にMultiIndex(階層的なインデックス)を持つDataFrameで効果を発揮し、Tidy Dataへの変換やTidy Dataからの変換に役立ちます。
例:
“`python
# MultiIndexを持つDataFrameを作成
index = pd.MultiIndex.from_tuples([(‘A’, ‘Q1’), (‘A’, ‘Q2’), (‘B’, ‘Q1’), (‘B’, ‘Q2’)], names=[‘ID’, ‘Quarter’])
df_multi = pd.DataFrame({‘Sales’: [10, 12, 15, 14]}, index=index)
print(“Original DataFrame with MultiIndex:”)
print(df_multi)
# stack()関数
df_stacked = df_multi.stack()
print(“nAfter stack():”)
print(df_stacked) # Seriesになります
# unstack()関数
df_unstacked = df_stacked.unstack()
print(“nAfter unstack() on the stacked Series:”)
print(df_unstacked)
“`
出力:
“`
Original DataFrame with MultiIndex:
Sales
ID Quarter
A Q1 10
Q2 12
B Q1 15
Q2 14
After stack():
ID Quarter
A Q1 10
Q2 12
B Q1 15
Q2 14
Name: Sales, dtype: int64
After unstack() on the stacked Series:
Quarter Q1 Q2
ID
A 10 12
B 15 14
“`
その他のTidy Data整形に関連する操作
Tidy Dataの原則を適用する上で、上記以外にも以下のPandasの機能が重要になります。
1. データクリーニング
- 欠損値処理: `dropna()`, `fillna()` などを用いて、意図しない欠損値や重複などを処理し、各セルにスカラー値が存在するようにします。
- データ型変換: `astype()` などを用いて、各列のデータ型を適切に設定することで、意図しないエラーを防ぎ、分析の精度を高めます。
2. 列名の変更
`rename()` 関数などを用いて、列名をわかりやすく、かつ一貫性のあるものにすることは、Tidy Dataの「各変数(Variable)は列(Column)として格納する」という原則を維持する上で重要です。
3. データの結合と分割
`merge()`, `join()`, `concat()` などの関数を用いて、複数のデータセットを適切に結合したり、1つのデータセットを分割したりすることで、分析に必要な形にデータを整えることができます。
まとめ
PandasにおけるTidy Dataの原則の理解と、それを実現するための`melt()`, `pivot()`, `pivot_table()`, `stack()`, `unstack()` といった関数群の活用は、データ分析の効率と品質を飛躍的に向上させます。データ整形は、分析の初期段階で最も重要なプロセスの一つであり、これらのTidy Dataの考え方とPandasの機能を駆使することで、より迅速かつ正確な知見を得ることが可能になります。常にデータの構造を意識し、Tidy Dataの原則に沿った整形を心がけることが、Pandasを用いたデータ分析における成功の鍵となります。
