Przejdź do treści

#005 Wykres skrzypcowy (violin plot)

  • Wykresy
  • 4 min read

Wykres skrzypcowy (ang. Violin Plot) jest jednym z ciekawszych i jednocześnie rzadko spotykanych wykresów. Pozwala wizualizować jednocześnie gęstość prawdopodobieństwa oraz rozkład dla kilku grup jednocześnie. Można powiedzieć, że jest to tak naprawdę połączenie wykresu pudełkowego (ang. Box Plot) oraz wykresu gęstości (Dense Plot), który jest umieszczony z każdej strony by zobrazować kształt rozkładu danych. Zaskakujące jest to, że wykres skrzypcowy jest znacznie rzadziej używany niż pudełkowy, nawet jeśli moim zdaniem zawiera więcej informacji.

Każde „skrzypce” przedstawiają grupę lub zmienną. Kształt skrzypiec reprezentuje tak naprawdę oszacowanie gęstości zmiennej: im więcej punktów danych w określonym zakresie, tym większe skrzypce będą w tym miejscu.

Skrzypce są szczególnie przystosowane, gdy ilość danych jest ogromna, a pokazanie indywidualnych obserwacji staje się niemożliwe. W przypadku małych zestawów danych lepszym rozwiązaniem jest prawdopodobnie wykres pudełkowy, ponieważ pokaże wszystkie informacje.

Biała kropka na środku to wartość mediany, a gruby czarny pasek na środku reprezentuje zakres międzykwartylowy. Cienka czarna linia przedłużona od niej reprezentuje górne i dolne wartości w danych.

Dodatkowo warto wspomnieć, że wypełnieniem wykresu skrzypcowego nie musi być boxplot – może być zarówno pusty, jak i wypełniony konkretnymi obserwacjami oznaczonymi poprzez punkty / kropki lub inne wizualizacje.

Główne zalety:

  • Daje prosty sposób porównania kilku cech na jednym wykresie.
  • Przekazuje więcej informacji niż tylko wykres pudełkowy bądź wykres gęstości – łączy dwa wykresy w jednym.
  • W przypadku obserwacji o specyficznym rozkładzie (np. bimodalnym – dwa pagórki) dzięki wyświetleniu informacji o rozkładzie przekaże więcej informacji niż sam wykres pudełkowy.

Główne wady:

  • Wykres skrzypcowy wciąż jest bardzo mało popularny, dlatego często trudniejszy do interpretacji. Nie jest na pierwszy rzut oka intuicyjny i należy się zorientować, co jest na nim przedstawione. Dlatego pod względem prostoty przegrywa zarówno z histogramem jak i z wykresem pudełkowym.
  • Trudno go narysować „odręcznie” – histogramu czy wykresu pudełkowy możemy łatwo narysować na kartce papieru, posiadając tylko kilka podstawowych informacji.

Kod w Python

Do pokazania przykładu użyję wcześniej już używanego zbioru z pokemonami.

import pandas as pd
import seaborn as sns

import matplotlib.pyplot as plt

print(f'pandas: {pd.__version__}')
print(f'seaborn: {sns.__version__}')
packages versions
df = pd.read_csv('../data/pokemon.csv')
df = df[df['type1'].isin(['water', 'psychic', 'electric', 'fire'])]
pd.options.display.max_columns = 100
df.head(3)

Najpierw narysujmy dla powyższych danych informacje jak wygląda cecha opisująca wysokość ataku pokemonów 🙂

plt.figure(figsize=(10,5))
ax = sns.violinplot(x = df['attack'])
wykres skrzynkowy (violin plot)

Teraz porównajmy tą informację w podziale na typy pokemonów:

plt.figure(figsize=(10,8))
ax = sns.violinplot(x=df['type1'], y = df['attack'])
wykres skrzynkowy (violin plot)

A teraz zobaczcie jak za pomocą parametru inner możemy zmienić pudełko wewnątrz w linie przedstawiające pierwszy, drugi i trzeci kwartyl:

plt.figure(figsize=(10,8))
ax = sns.violinplot(x=df['type1'], y = df['attack'], inner="quartile")
wykres skrzynkowy (violin plot)

Możemy jeszcze w prosty sposób dokonać kolejnego podziału po kolejnej charakterystyce, np. czy pokemon jest legendarny (czyli taki rzadki :))

plt.figure(figsize=(10,8))
ax = sns.violinplot(x=df['type1'], y = df['attack'], hue = df['is_legendary'])
wykres skrzynkowy (violin plot)

… oraz dla uproszczenia analizowania przedstawmy te informacje na jednych skrzypcach

plt.figure(figsize=(10,8))
ax = sns.violinplot(x=df['type1'], y = df['attack'], 
                    hue = df['is_legendary'], split=True)
wykres skrzynkowy (violin plot)

W przypadku specyficznych rozkładów możecie dobrać odpowiedni poziom wygładzenia poprzez parametr bandwith (dokładniej z przykładem było w wpisie o wykresie gęstości)

plt.figure(figsize=(10,8))
ax = sns.violinplot(x=df['type1'], y = df['attack'], hue = df['is_legendary'], 
                    split=True, bw=0.25)
wykres skrzynkowy (violin plot)

Podsumowanie:

Wykresy skrzypcowe są naprawdę wygodnym sposobem wyświetlania danych i prawdopodobnie zasługiwałyby na większą uwagę w porównaniu do wykresów pudełkowych.

Mam nadzieję, że chętniej będziecie teraz ich używać.

Pozdrawiam,

podpis Mirek

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Spodobało Ci się? Udostępnij ten post w social mediach! ❤️❤️❤️