【Pandas Style】データの分布を瞬時に把握!四分位数強調表示テクニック


使い方

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                   'B': [4, 3, 5, 2, 1, 7, 6, 8, 9, 10]})

# 四分位数に基づいて値を強調表示
styler = df.style.highlight_quantile(
    q_left=0.25,  # 下位25%の値を強調表示
    q_right=0.75,  # 上位25%の値を強調表示
    color='lightblue'  # 強調表示の色
)

# 結果を表示
styler.render()

このコードを実行すると、以下の出力が表示されます。

|      | A  | B  |
|------|----|----|
| 0    | 1  | 4  |
| 1    | 2  | 3  |
| 2    | 3  | 5  |
| 3    | 4  | 2  |
| 4    | 5  | 1  |
| 5    | 6  | 7  |
| 6    | 7  | 6  |
| 7    | 8  | 8  |
| 8    | 9  | 9  |
| 9    | 10 | 10 |

オプション

  • q_right: 上位 x % の値を強調表示します。デフォルトは 1 です。
  • q_left: 下位 x % の値を強調表示します。デフォルトは 0 です。
  • colorstr: 強調表示の色を指定できます。デフォルトは 'yellow' です。
  • axis: 0 または 'index' で行を、1 または 'columns' で列を強調表示します。
  • subset: 強調表示を適用する列を指定できます。
  • highlight_quantile は、Styler クラスの他のメソッドと組み合わせて使用できます。

以下の例では、highlight_quantilebar を組み合わせて、データ分布を視覚化しています。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                   'B': [4, 3, 5, 2, 1, 7, 6, 8, 9, 10]})

# 四分位数に基づいて値を強調表示し、棒グラフを表示
styler = df.style.highlight_quantile(
    q_left=0.25,
    q_right=0.75,
    color='lightblue'
).bar(align='center')

# 結果を表示
styler.render()
|      | A  | B  |
|------|----|----|
| 0    | 1  | 4  | |
| 1    | 2  | 3  | |
| 2    | 3  | 5  | |
| 3    | 4  | 2  | |
| 4    | 5  | 1  | |
| 5    | 6  | 7  | |
| 6    | 7  | 6  | |
| 7    | 8  | 8  | |
| 8    |


データの準備

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 100, 5, 6, 7, 8, 9, 10],
                   'B': [4, 3, 5, 2, 1, 7, 6, 8, 9, 10]})

このコードは、A 列と B 列を含むデータフレームを作成します。 A 列には、1 から 100 までの値が含まれていますが、50 番目の行には 100 という異常な値が含まれています。 B 列には、ランダムな値が含まれています。

四分位数に基づいた強調表示

styler = df.style.highlight_quantile(
    q_left=0.25,  # 下位 25% の値を強調表示
    q_right=0.75,  # 上位 25% の値を強調表示
    color='lightblue'  # 強調表示の色
)

styler.render()

このコードは、highlight_quantile 関数を使用して、データフレームの値を四分位数に基づいて強調表示します。 下位 25% の値と上位 25% の値は、薄い青色で強調表示されます。 100 番目の行の値は、上位 25% の値よりも大きいため、強調表示されません。

特定の列の強調表示

styler = df.style.highlight_quantile(
    columns=['A'],  # 'A' 列のみを強調表示
    q_left=0.3,
    q_right=0.8,
    color='yellow'
)

styler.render()

このコードは、highlight_quantile 関数の columns 引数を使用して、A 列のみを強調表示します。 下位 30% の値と上位 80% の値は、黄色で強調表示されます。

軸の指定

styler = df.style.highlight_quantile(
    axis=1,  # 列を強調表示
    q_left=0.1,
    q_right=0.9,
    color='red'
)

styler.render()

このコードは、highlight_quantile 関数の axis 引数を使用して、列を強調表示します。 各列の下位 10% の値と上位 90% の値は、赤色で強調表示されます。

styler = df.style.highlight_quantile(
    q_left=0.2,
    q_right=0.8,
    color=['lightgreen', 'lightcoral']  # 色をリストで指定
)

styler.render()

このコードは、highlight_quantile 関数の color 引数を使用して、強調表示の色をカスタマイズします。 下位 20% の値は薄緑色で、上位 80% の値は薄珊瑚色で強調表示されます。

これらの例は、pandas.io.formats.style.Styler.highlight_quantile 関数の基本的な使用方法を示しています。 この関数は、さまざまなオプションを使用して、データフレームの値を効果的に強調表示するために使用できます。

  • 他の Styler 関数と組み合わせて使用することで、より複雑なデータ可視化を作成できます。


カスタム CSS クラスを使用する

HTML と CSS を直接使用して、データフレームの値を強調表示することができます。 この方法は、柔軟性が高く、細かい制御が可能ですが、HTML と CSS の知識が必要となります。

import pandas as pd
from IPython.display import HTML

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 100, 5, 6, 7, 8, 9, 10],
                   'B': [4, 3, 5, 2, 1, 7, 6, 8, 9, 10]})

# 四分位数を計算
q1 = df['A'].quantile(0.25)
q3 = df['A'].quantile(0.75)

# カスタム CSS クラスを作成
style = f"""
<style>
.q1 {{
    background-color: lightblue;
}}

.q3 {{
    background-color: lightcoral;
}}
</style>
"""

# データフレームを HTML に変換
html = df.style.render()

# カスタム CSS クラスを挿入
html = html.replace('<table border=0 style="border: 1.2px solid #c6c6c6 !important; border-spacing: 2px; width: auto !important;">',
                    style + html[html.find('<table>'):])

# HTML を表示
HTML(html)

このコードは、まず四分位数を計算します。 次に、.q1.q3 という 2 つの CSS クラスを作成し、それぞれ下位 25% の値と上位 25% の値を強調表示します。 最後に、カスタム CSS クラスをデータフレームの HTML に挿入して、値を強調表示します。

利点

  • 複雑な強調表示を作成できる
  • 柔軟性が高く、細かい制御が可能

欠点

  • コードが冗長になる可能性がある
  • HTML と CSS の知識が必要

matplotlib を使用する

matplotlib ライブラリを使用して、データフレームの値をヒストグラムや箱ひげ図などの可視化で強調表示することができます。 この方法は、視覚的に分かりやすいですが、データフレームのすべての値を強調表示することはできません。

import pandas as pd
import matplotlib.pyplot as plt

# データフレームを作成
df = pd.DataFrame({'A': [1, 2, 3, 100, 5, 6, 7, 8, 9, 10],
                   'B': [4, 3, 5, 2, 1, 7, 6, 8, 9, 10]})

# ヒストグラムを作成
df['A'].hist(bins=20, edgecolor='black')

# 四分位数を線で表示
plt.axvline(df['A'].quantile(0.25), color='lightblue', linestyle='dashed', linewidth=1, label='Q1')
plt.axvline(df['A'].quantile(0.75), color='lightcoral', linestyle='dashed', linewidth=1, label='Q3')

# 凡例を表示
plt.legend()
plt.show()

このコードは、まず A 列のヒストグラムを作成します。 次に、axvline 関数を使用して、四分位数を破線で表示します。 凡例を使用して、線の色と意味を説明します。

利点

  • データの分布を理解しやすい
  • 視覚的に分かりやすい

欠点

  • インタラクティブ性が低い
  • データフレームのすべての値を強調表示することはできない

seaborn を使用する

seaborn ライブラリを使用して、データフレームの値を箱ひげ図などの可視化で強調表示することができます。 この方法は、matplotlib よりも視覚的に洗練されており、データの分布だけでなく外れ値も確認することができます。

import pandas as pd
import seaborn as sns

# データフレームを作成
df = pd.DataFrame({'A': [1, 2,