#006 wykres rozrzutu (Scatter Plot)

wykres rozrzutu (scatter plot)

Wykres rozrzutu (ang. scater plot)  ma wiele nazw. Znany jest jeszcze jako: wykres punktowy, wykres X-Y, wykres rozproszenia lub „Scattergram”.

Wykres rozrzutu jest zbiorem punktów umieszczonych na współrzędnych kartezjańskich (układ osi X i Y pod kątem prostym względem siebie) do wyświetlania wartości z dwóch zmiennych. Prościej mówiąc jedna oś odpowiada wynikom dla jednej zmiennej, natomiast druga oś odpowiada wynikom drugiej zmiennej. Skala w wykresie rozrzutu zawsze odzwierciedla skalę dla danej zmiennej a każdy punkt na wykresie odpowiada poszczególnym wartościom zmiennych.

Zazwyczaj stosuje się je do porównywania zmiennych ilościowych. Niemniej jednak również można użyć ich do zmiennych kategorycznych (wówczas jeśli jedna cecha ma 3 wartości kategoryczne a druga jest ciągła wówczas otrzymamy trzy linie). Natomiast w przypadku obu zmiennych kategorycznych (np. po 3 kategorie) otrzymamy na wykresie 9 punktów i nie wiele nam to powie 🙂

wykres rozrzutu (scatter plot)

Warto dodatkowo pamiętać, że punkt jest najprostszym sposobem prezentacji danych! Pojedynczy punkt bardzo precyzyjnie może pokazać odległość od punktu odniesienia (np. początku układu współrzędnych) lub innych punktów. Zatem warto stosować ten wykres również do wizualizacji dla pojedynczych wartości zmiennych.

wykres rozrzutu (scatter plot)

Główne zalety

Wykres rozrzutu służy do badania związku między 2 zmiennymi. Można z nich wyciągnąć informacje o trzech głównych elementach:

  • Istotności zależności: silna / słaba / brak. Siła korelacji może być określona przez to, jak ściśle upakowane są punkty na wykresie.
wykres rozrzutu (scatter plot)
  • Rodzaj korelacji: liniowa (dodatnia lub ujemna), wykładnicza, w kształcie U, sinusoidy itp.. Czyli tak naprawdę jeśli występuje korelacja to jaka jest zależność między zmiennymi.
wykres rozrzutu (scatter plot)
  • Łatwa identyfikacja czy są wartości odstające. Punkty, które kończą się daleko poza ogólnym skupieniem punktów, są znane jako wartości odstające.
wykres rozrzutu (scatter plot)

Uwaga! Warto pamiętać by pokazać czasami różne podgrupy dzięki czemu można ujawnić ukryte wzorce w naszych danych (np. płeć patrząc na wykresie rozrzutu wiek & płeć).

Najczęstsze błędy:

  • Do zmiennych kategorycznych. W przypadku porównywania zmiennych kategorycznych wykres nie da nam zbyt wielu informacji
  • Wykorzystywany wykres to zbyt dużej próbki danych (overplotting). Oznacza to, że większość danych pokrywa się na wykresie i staje się on nieczytelny. Można temu przeciwdziałać na kilka sposobów:
    • Zmniejszyć same kropki
    • Narysować dodatkowo rozkład cech
    • Lub najprościej wylosować mniejszy zbiór (np. 5%).

Kod w Python

Dla przykładu wizualizacji wykresu rozrzutu wykorzystamy dwie dane: PKB (ang GDP) kraju oraz średni wiek populacji. Dzięki temu będziemy mogli poszukać zależności.

Zacznijmy od wczytania bibliotek oraz pobrania danych:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
url = 'https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv'
df = pd.read_csv(url)
df = df[df['year'] == 2007]
df.head()
wykres rozrzutu (scatter plot) python

Podstawową biblioteką jest matplotlib. Poniżej przykład jak na szybko można narysować wykres rozrzutu:

plt.figure(figsize=(15,6))
plt.plot("lifeExp", "gdpPercap", data=df, linestyle='none', marker='o')
plt.xlabel('avarage age in country', fontsize='12', 
           horizontalalignment='center')
plt.ylabel('avarage GDP in country', fontsize='12', 
           horizontalalignment='center')
plt.title('Avarage age vs GDP in countries')
plt.show()
wykres rozrzutu (scatter plot) python

Inną biblioteką, która bardzo upraszcza rysowanie wykresów jest seaborn. Można chociażby wykorzystać wykres lmplot. Dokumentacje znajdziecie tutaj: https://seaborn.pydata.org/generated/seaborn.lmplot.html

Poniżej prosty przykład, gdzie za pomocą jednego parametru mamy dodatkową przygotowaną regresję liniową.

fig = sns.lmplot(x="lifeExp", y="gdpPercap", data=df, fit_reg=True, 
                 truncate=True, height=5, aspect=2.5)
fig.set_axis_labels("avarage age in country", "avarage GDP in country")
fig.set(title='Avarage age vs GDP in countries');
wykres rozrzutu (scatter plot) python

Największą zaletą jest, że w bardzo prosty sposób można dodać inne kolory w zależności od rożnych kategorii. W tym przypadku zobaczcie jak wygląda po kontynentach. Widzicie od razu jakieś wnioski?

palette1 = ['blue','orange','green','red','violet',]
fig1 = sns.lmplot(x="lifeExp", y="gdpPercap", data=df, fit_reg=False, 
                  legend=True, height=5, aspect=2.5, hue='continent',
                  palette=palette1)
fig1.set_axis_labels("avarage age in country", "avarage GDP in country")
fig1.set(title='Avarage age vs GDP in countries by continent');

palette2 = ['b','g','r']
fig2 = sns.lmplot(x="lifeExp", y="gdpPercap", data=df[df['lifeExp']<=70], 
                  fit_reg=False, legend=True, height=5, aspect=1.25, 
                  hue='continent',palette=palette2)
fig2.set_axis_labels("avarage age in country", "avarage GDP in country")
fig2.set(title='Avarage age vs GDP with age <= 70')

palette3 = ['orange','green','red','violet','blue']
fig3 = sns.lmplot(x="lifeExp", y="gdpPercap", data=df[df['lifeExp']>70], 
                  fit_reg=False, legend=True, height=5, aspect=1.25, 
                  hue='continent',palette=palette3)
fig3.set_axis_labels("avarage age in country", "avarage GDP in country")
fig3.set(title='Avarage age vs GDP with age > 70');
wykres rozrzutu (scatter plot) python
wykres rozrzutu (scatter plot) python

A można też za pomocą argumentu „col” zdefiniować automatycznie podział na osobne wykresy:

palette1 = ['blue','orange','green','red','violet',]
fig1 = sns.lmplot(x="lifeExp", y="gdpPercap", data=df, fit_reg=False, 
                  legend=True, height=3, aspect=0.9, hue='continent',
                  palette=palette1, col='continent')
fig1.set_axis_labels("avarage age in country", "avarage GDP in country");
wykres rozrzutu (scatter plot) python

W przypadku jak jest mnóstwo punktów tak jak wspominałem można narysować wykres rozrzutu wraz z rozkładem:

sns.jointplot(x=df["lifeExp"], y=df["gdpPercap"], kind='scatter');
wykres rozrzutu (scatter plot) python

Albo przedstawić wykres rozrzutu za pomocą podobnych wykresów 🙂

sns.jointplot(x=df["lifeExp"], y=df["gdpPercap"], kind='hex');
wykres rozrzutu (scatter plot) python
sns.jointplot(x=df["lifeExp"], y=df["gdpPercap"], kind='kde');
wykres rozrzutu (scatter plot) python

Mam nadzieję, że nie raz wykorzystanie powyższą wiedzę 🙂

Pozdrawiam Was serdecznie,

podpis Mirek
.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *