Подобрете информативната сила на вашите визуализации на данни

Визуализацията на данни е неразделна част от науката за данните. Създаваме визуализации на данни, за да получим структуриран преглед на наличните данни. Те също така служат като ефективен инструмент за постигане на резултати.

Тъй като това е толкова важна тема, има разнообразие от софтуерни инструменти и пакети за създаване на визуализации на данни.

Една от тях е Altair, която е декларативна библиотека за статистическа визуализация за Python.

В тази статия ще научим как да създаваме интерактивни диаграми на разсейване с Altair. Интерактивните графики са в състояние да осигурят по-голяма информативна сила от стандартните графики. Те също така позволяват добавяне на гъвкавост към визуализацията.

Не забравяйте да се абонирате, ако искате да получавате имейл всеки път, когато публикувам нова статия.

Първото и основно изискване е, разбира се, набор от данни. Ще използваме набора от данни на списъците на Airbnb от Барселона, Испания на 7 юли 2021 г. Той се споделя с лиценз creative commons, така че не се колебайте да ги използвате и изследвате.

Нека започнем с импортиране на библиотеките и създаване на рамка с данни на Pandas.

import pandas as pd
import altair as alt
col_list = ["accommodates", "instant_bookable", "room_type", "reviews_per_month", "price"]
df = pd.read_csv(
    "listings_2.csv",
    usecols = col_list,
    nrows = 1000
)
df.dropna(inplace=True)
print(df.shape)
(965, 5)
df.head()

В оригиналния набор от данни има 17 000 реда и 74 колони. Създадохме рамка с данни, която съдържа само 5 колони и 1000 реда, като използвахме параметрите usecols и nrows на функцията read_csv.

Важно е да се отбележи, че Altair може да се използва с максимум 5000 наблюдения (т.е. редове) с настройките по подразбиране. Това ограничение може да бъде деактивирано чрез следната команда. Благодаря на Наталия Голоскокова за вниманието!

alt.data_transformers.disable_max_rows()

Също така използвахме функцията dropna, за да премахнем редовете, които имат липсваща стойност.

Има още една операция за обработка на данни, преди да започнем да създаваме диаграми на разсейване. Колоната за цена се съхранява с тип данни обект, но трябва да се преобразува в числов формат.

Трябва да премахнем знака „$“ и „,“ използвани като разделител на хиляди. След това можем да го преобразуваме в числов тип данни.

df.loc[:, "price"] = \
df.loc[:, "price"].str[1:].str.replace(",","").astype("float")
df = df[df["price"] < 1000]
df.head()

Точкова диаграма

Точковите диаграми обикновено се използват за визуализиране на връзката между две непрекъснати променливи. Те предоставят преглед на корелацията между променливите.

Можем да създадем точкова диаграма, за да проверим връзката между колоните за настаняване и цена. Колоната за настаняване е индикация за капацитета на дадено място, така че очакваме тя да има положителна корелация с цената.

alt.Chart(df).mark_circle(size=50).encode(
    alt.X("accommodates"),
    alt.Y("price"),
    alt.Color("room_type", 
              legend=alt.Legend(
                  title="Room Type",  
                  orient='left',
                  titleFontSize=15,
                  labelFontSize=13)
             )
).properties(
    height=350, width=500
).configure_axis(
    titleFontSize=20,
    labelFontSize=15
)

Първата стъпка е да предадем рамката с данни към обекта Chart от най-високо ниво и след това указваме типа на визуализацията. Функцията mark_circle създава точкова диаграма.

Във функцията encode записваме имената на колоните, които да бъдат начертани по оста x и y. Параметърът color се използва за разграничаване на различни категории, които са показани в легендата. Подобно е на параметъра hue в Seaborn.

И накрая, функциите properties и configure_axis коригират визуалните свойства като размери на фигури и етикети.

Този кодов фрагмент създава следната точкова диаграма:

Това е стандартна точкова диаграма. Сега ще видим как да го направим интерактивен по няколко различни начина.

Интерактивната функция

Интерактивната функция е най-простият начин да направите сюжет интерактивен. Позволява увеличаване и намаляване на графиката.

Нека подобрим сюжета в предишния пример, като добавим атрибута size. Ще използваме колоните за настаняване и рецензии на месец съответно по оста x и y.

Цветът ще показва типа стая и размерът на всяка точка ще бъде пропорционален на цената.

Като добавим функцията interactive в края, ще можем да увеличаваме и намаляваме.

alt.Chart(df.sample(100)).mark_circle(size=50).encode(
    alt.X("accommodates"),
    alt.Y("reviews_per_month"),
    alt.Color("room_type", 
              legend=alt.Legend(
                  title="Room Type",  
                  orient='left',
                  titleFontSize=15,
                  labelFontSize=13)
             ),
    alt.Size("price",
            legend=alt.Legend(
                  title="Price",  
                  orient='left',
                  titleFontSize=15,
                  labelFontSize=13))
).properties(
    height=350, width=500
).configure_axis(
    titleFontSize=20,
    labelFontSize=15
).interactive()

Взех извадка със 100 наблюдения (т.е. редове) от нашата рамка с данни, за да направя графиката да изглежда по-привлекателна. Ето първия ни интерактивен сюжет.

Интерактивна легенда

Интерактивността може да се използва и за създаване на по-информативни и функционални сюжети. Например, можем да използваме легендата като филтър, като я направим интерактивна.

Можем да направим това, като създадем обект за избор и го обвържем с легендата.

selection = alt.selection_multi(fields=['room_type'], bind='legend')
alt.Chart(df).mark_circle(size=50).encode(
    alt.X("accommodates"),
    alt.Y("price"),
    alt.Color("room_type", 
              legend=alt.Legend(
                  title="Room Type",  
                  orient='left',
                  titleFontSize=15,
                  labelFontSize=13)
             ),
    opacity=alt.condition(selection, alt.value(1), alt.value(0))
).properties(
    height=350, width=500
).configure_axis(
    titleFontSize=20,
    labelFontSize=15
).add_selection(
    selection
)

Има 3 промени в сравнение с предишната точкова диаграма.

  • Обект за избор в колоната room_type. Обвързано е с легендата.
  • Параметър Opacity, който променя непрозрачността на точките според избраните типове стаи.
  • Функцията add_selection, която се използва за добавяне на обекта за избор към нашия график.

Ето резултата:

Интерактивна легенда с множество сюжети

Altair позволява свързване на легенда с множество подсюжети. Така можем да видим ефектите от нашия избор върху различни взаимоотношения едновременно.

selection = alt.selection_multi(fields=['room_type'], bind='legend')
chart = alt.Chart(df).mark_circle(size=50).encode(
    y='price',
    color='room_type',
    opacity=alt.condition(selection, alt.value(1), alt.value(0))
).properties(
    height=200, width=300
).add_selection(
    selection
)
chart.encode(x='reviews_per_month:Q') | chart.encode(x='accommodates:Q')

Първо създаваме обект на диаграма, без да посочваме колоната за оста x. Създаването и обвързването на частта за избор е същото. В последните два реда добавяме две различни x-оси и ги комбинираме с оператора „или“ (|).

Премахнах частта, използвана за форматиране на легенда и заглавия на осите, за да изглежда кодът по-лесен за разбиране.

Заключение

Обхванахме как интерактивността може да се използва за подобряване на визуализацията на данни. Има много повече функции на Altair по отношение на интерактивните компоненти. След като разберете концепциите за интерактивност като избор, обвързване и условие, можете да създадете зашеметяващи визуализации на данни.

Не забравяйте да се абонирате, ако искате да получавате имейл всеки път, когато публикувам нова статия.

Можете да станете член на Medium, за да отключите пълен достъп до моето писане, плюс останалата част от Medium. Ако го направите чрез следната връзка, ще получа част от вашия членски внос без допълнителни разходи за вас.



Благодаря ви, че прочетохте. Моля, уведомете ме, ако имате отзиви.