Боксплот з підписами даних та налаштуванням кольорів у Python

pic

Для чого використовується боксплот?

Боксплот — це простий графік, який допомагає швидко зрозуміти групу чисел, а також порівняти різні групи чисел. Він показує, де знаходяться більшість чисел, наскільки вони розкидані, і чи є якісь незвичайні значення. Це чудовий інструмент для виявлення шаблонів, аномалій та різниць, тому його часто використовують для швидкого аналізу даних.

Що показує боксплот?

Боксплот показує таку інформацію для групи чисел:

  • Середнє число (медіана): Це число, яке знаходиться посередині, коли всі числа розташовані від найменшого до найбільшого.
  • Розмах більшості чисел (міжквартильний розмах): Він малює коробку навколо середньої групи чисел — тих, що не дуже високі, не дуже низькі, а ближчі до середини. Ця коробка покриває середні 50% чисел.
  • Найменші та найбільші "нормальні" числа: Лінії, які називаються "вуса", виступають з коробки і показують, як далеко розкидані числа, не враховуючи дуже незвичайні.
  • Незвичайні числа (викиди): Якщо число набагато вище або нижче за більшість інших, його показують як точку або маленьку мітку за межами вусів.

Боксплоти в цих контекстах дають чітке уявлення про те, як значення розподілені, допомагаючи приймати рішення, аналізувати шаблони, визначати тенденції, області для покращення та виявляти аномалії для подальшого вивчення.

Приклади з повсякденного життя, де можна використовувати боксплоти

Освіта: Оцінки на іспитах
- Приклад: Порівняйте оцінки з математики у студентів
- Використання: Зрозуміти, яка школа має кращі результати

Охорона здоров’я: Час відновлення пацієнтів
- Приклад: Порівняйте часи відновлення при різних методах лікування
- Використання: Визначити, яке лікування є найбільш ефективним (найкоротший час відновлення)

Навколишнє середовище: Якість повітря
- Приклад: Дослідження рівнів забруднення повітря з часом
- Використання: Виявлення та реагування на аномальні значення

Бізнес: Рівні запасів
- Приклад: Порівняйте рівні запасів різних продуктів на складі
- Використання: Виявлення незвично високих/низьких запасів

Індустрія: Аналіз часу простою машин
- Приклад: Моніторинг часу простою машини протягом певного періоду
- Використання: Виявлення очікуваних втрат

Комбінування боксплоту зі свормплотом

Для кращого розуміння розподілу даних додаткова візуальна інформація, така як свормплот, може бути корисною. Для більших наборів даних часто більш корисним є віоліновий графік.

Позначення та кольорування боксплоту

У стандартній бібліотеці matplot позначення значень на боксплоті не є простим.
pic

Для чого використовується боксплот?

Боксплот — це простий графік, який допомагає швидко зрозуміти групу чисел і порівняти різні групи. Він показує, де знаходяться більшість чисел, наскільки вони розкидані і чи є якісь незвичайні значення. Це відмінний інструмент для виявлення шаблонів, аномалій та відмінностей, тому він є незамінним для швидкого аналізу даних.

Що показує боксплот?

Боксплот надає таку інформацію для групи чисел:

  • Середнє число (медіана): Це число, яке знаходиться посередині, коли всі значення впорядковані від найменшого до найбільшого.
  • Розмах більшості значень (міжквартильний розмах): Боксплот малює коробку навколо середніх значень — тих, що не надто високі, не надто низькі, а ближчі до середини. Ця коробка покриває середні 50% значень.
  • Найменші та найбільші "нормальні" значення: Лінії, які називаються "вуса", виступають з коробки, показуючи, як далеко розкидані значення, без врахування дуже незвичайних.
  • Незвичайні значення (викиди): Якщо значення набагато вище або нижче більшості інших, воно показується як точка чи маленька мітка за межами вусів.

Боксплоти в цих контекстах надають чітке уявлення про те, як значення розподілені, що допомагає приймати рішення, аналізувати шаблони, визначати тенденції, області для покращення та аномалії для подальшого вивчення.

Приклади з повсякденного життя, де можна використовувати боксплоти

Освіта: Оцінки на іспитах
- Приклад: Порівняйте оцінки з математики у студентів
- Використання: Зрозуміти, яка школа має кращі результати

Охорона здоров’я: Час відновлення пацієнтів
- Приклад: Порівняйте часи відновлення при різних методах лікування
- Використання: Визначити, яке лікування є найбільш ефективним (найкоротший час відновлення)

Навколишнє середовище: Якість повітря
- Приклад: Дослідження рівнів забруднення повітря з часом
- Використання: Виявлення та реагування на аномальні значення

Бізнес: Рівні запасів
- Приклад: Порівняйте рівні запасів різних продуктів на складі
- Використання: Виявлення незвично високих/низьких запасів

Індустрія: Аналіз часу простою машин
- Приклад: Моніторинг часу простою машини протягом певного періоду
- Використання: Виявлення очікуваних втрат

Комбінування боксплоту зі свормплотом

Для кращого розуміння розподілу даних додаткова візуальна інформація, така як свормплот, може бути корисною. Для більших наборів даних часто більш корисним є віоліновий графік.

Позначення та кольорування боксплоту

У стандартній бібліотеці matplot позначення значень на боксплоті не є простим.

import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
import seaborn as sns  

# Колірні визначення, див. графіку під назвою 'Coloring Parameters'  
figure_facecolor_color = 'black' # 1  
axes_facecolor_color = 'black' # 2  
axes_edgecolor_color = 'white' # 3  
title_color='white' #4  
meanprops_markerfacecolor_color = 'yellow' # 5  
meanprops_markeredgecolor_color = 'white' # 6  
text_max_value_color = 'limegreen' # 7; найвищий викид  
text_upper_whisker_color ='orange' # 8  
text_q3_value_color = 'orange' # 9  
text_median_color = 'yellow' # 10  
text_q1_value_color = 'orange' # 11  
text_lower_whisker_color = 'orange' # 12  
text_min_value_color = 'limegreen' # 13; найнижчий викид  
xlabel_color = 'white' # 14  
swarmplot_color = 'limegreen' # 15  
grid_color = 'gray' # 16  
boxprops_edge_color = 'orange' # 17  
boxprops_facecolor_color = 'mediumblue' # 18  
medianprops_color = 'yellow' # 19  
ylabel_color = 'white' # 20  
tick_params_color = 'white' # 21  
whiskerprops_color = 'orange' # 22  
capprops_color = 'orange' # 23  

# Дані для презентації  
np.random.seed(42) # Початкове значення для відтворюваності  
# Генерація 120 випадкових значень із нормального розподілу  
mean = 125 # Середина між 100 і 150  
std_dev = (150 - 100) / 6 # Приблизне стандартне відхилення для вміщення 99.7% значень в межах діапазону  
values = np.random.normal(loc=mean, scale=std_dev, size=120)  
values = np.clip(values, 100, 150) # Обрізка значень, щоб вони потрапляли в діапазон 100-150  
df = pd.DataFrame({'Random Values': values}) # Створення DataFrame  

# Обчислення значень для боксплоту  
median = df.median() # Обчислення медіани  
q1 = df.quantile(0.25) # Обчислення 25% квартилю  
q3 = df.quantile(0.75) # Обчислення 75% квартилю  
# Перетворення значень на тип float  
median_value = float(median.iloc[0])  
q1_value = float(q1.iloc[0])  
q3_value = float(q3.iloc[0])  

# Визначення значень для вусів (найближчі точки в межах меж)  
# Обчислення IQR  
iqr = q3_value - q1_value  
# Обчислення меж вусів  
lower_whisker_limit = q1_value - 1.5 * iqr  
upper_whisker_limit = q3_value + 1.5 * iqr  
lower_whisker = df['Random Values'][df['Random Values'] >= lower_whisker_limit].min()  
upper_whisker = df['Random Values'][df['Random Values'] <= upper_whisker_limit].max()  

# Визначення найвищих та найнижчих викидів  
max_value = df.max().max()  
min_value = df.min().min()  
upper_outlier = True if max_value > upper_whisker else False  
lower_outlier = True if min_value < lower_whisker else False  

# Налаштування фону графіка  
plt.rcParams['axes.facecolor'] = axes_facecolor_color  
plt.rcParams['axes.edgecolor'] = axes_edgecolor_color  
plt.rcParams['figure.facecolor'] = figure_facecolor_color  

# Створення нової фігури розміром 8x6 дюймів  
plt.figure(figsize=(8, 6))  

# Обчислення розміру пікселя в координатах даних для визначення кроку пікселя  
ax = plt.gca() # Поточна вісь  
ylim = ax.get_ylim() # Масштаб по осі y  
pixel_height = (ylim[1] - ylim[0]) / ax.figure.dpi # Розмір одного пікселя в координатах даних  
pixel_height = 50 * pixel_height # бажаний крок пікселів  

# Створення боксплоту з свормплотом  
sns.boxplot(data=df, y='Random Values', showmeans=True, meanprops={"marker":"o", "markerfacecolor":meanprops_markerfacecolor_color, "markeredgecolor":meanprops_markeredgecolor_color},
boxprops=dict(facecolor=boxprops_facecolor_color, edgecolor=boxprops_edge_color), whiskerprops=dict(color=whiskerprops_color), capprops=dict(color=capprops_color), medianprops=dict(color=medianprops_color))  
sns.swarmplot(data=df, y='Random Values', color=swarmplot_color, alpha=0.8)  
# Дизайн для графіку  
plt.title('Боксплот/Свормплот з відображеними значеннями', color=title_color)  
plt.ylabel("Значення", color = ylabel_color)  
plt.xlabel("Вибірки", color = xlabel_color)  
plt.tick_params(colors = tick_params_color)  
plt.grid(color = grid_color, linestyle='--', linewidth=0.5)  
# Відображення значень на графіку  
plt.text(0.4, median_value + pixel_height, f'{median_value:.2f}', ha='right', color = text_median_color, fontsize=12)  
plt.text(0.4, q1_value + pixel_height, f'{q1_value:.2f}', ha='right', color=text_q1_value_color, fontsize=12)  
plt.text(0.4, q3_value + pixel_height, f'{q3_value:.2f}', ha='right', color=text_q3_value_color, fontsize=12)  
plt.text(0.2, lower_whisker + pixel_height, f'{lower_whisker:.2f}', ha='right', color=text_lower_whisker_color, fontsize=12)  
plt.text(0.2, upper_whisker + pixel_height, f'{upper_whisker:.2f}', ha='right', color=text_upper_whisker_color, fontsize=12)  
# Максимальні та мінімальні значення відображаються тільки, якщо вони дійсно є викидами  
if upper_outlier == True:  
 plt.text(0.4, max_value + pixel_height, f'{max_value:.2f}', ha='right', color=text_max_value_color, fontsize=12)  
if lower_outlier == True:  
 plt.text(0.4, min_value + pixel_height, f'{min_value:.2f}', ha='right', color=text_min_value_color, fontsize=12)  
# Відображення графіку  
plt.show()

Сподіваюся, цей код допоможе вам швидше та легше здійснити налаштування дизайну.

Перекладено з: Boxplot with Data Labels and Color Customization in Python

Leave a Reply

Your email address will not be published. Required fields are marked *