Занятие 6
Лабораторная работа 6¶
1. Seaborn¶
Seaborn - это библиотека, в основном используемая для построения графиков в Python. Он построен на основе Matplotlib и предоставляет красивые стили и цветовые палитры по умолчанию, чтобы сделать графики более "наглядными".
import seaborn as sns # импортируем библиотеку
Рассмотрим датасет Ирисы Фишера - это многомерный набор данных, используемый британским статистиком и биологом Рональдом Фишером в его статье 1936 года «Использование множественных измерений в таксономических задачах как пример линейного дискриминантного анализа».
data = sns.load_dataset("iris") # скачаем данный датасет
data.head(5)
Рассмотрим данный датасет внимательнее. Он содержит 5 столбцов:
- Sepal - наружный лепесток околоцветника
- Petal - внутренний лепесток околоцветника
- Length - длина
- Width - ширина
- Species - вид цветка(всего три вида)
Датасет небольшой содержит 150 цветков.
1.1 Использование Seaborn с Matplotlib¶
import matplotlib.pyplot as plt # импортируем библиотеку
sns.lineplot(x="petal_length", y="petal_width", data=data) # построим график с помощью seaborn
plt.title('Seaborn with matplotlib') # установим заголовок с помощью matplotlib
plt.show()
1.2 сюжеты в Seaborn¶
В seaborn есть несколько сюжетов, которые позволяют сделать графики более "привлекательными". Метод set_style() задаёт один из пяти тем(сюжетов) графика:
- darkgrid
- whitegrid
- dark
- white
- ticks
plt.figure(figsize=(18, 16))
for i, style in enumerate(['darkgrid', 'whitegrid',
'dark', 'white', 'ticks']):
sns.set_style(style) # Устанавливаем стиль
plt.subplot(3, 2, i+1)
sns.lineplot(x="petal_length", y="petal_width", data=data)
plt.title(style)
1.3 set_context¶
set_context(context=None, font_scale=1, rc=None) управляет масштабированием элементов графика.
context — параметры контекста, влияющие на размер меток, линий и других элементов, но не на общий стиль(notebook, paper, talk, poster)
font_scale - коэффициент масштабирования
import matplotlib.pyplot as plt # импортируем библиотеку
plt.figure(figsize = (4, 2)) # размер картинки
sns.set_context("notebook", font_scale=1.25) # увеличим шрифт элементов графика
sns.lineplot(x="petal_length", y="petal_width", data=data) # построим график с помощью seaborn
sns.set_style("whitegrid") # установим тему "whitegrid"
plt.title('ticks') # установим заголовок с помощью matplotlib
plt.show()
plt.figure(figsize=(18, 15))
for i, context in enumerate(['notebook', 'paper',
'talk', 'poster']):
sns.set_context(context=context) # Устанавливаем стиль
plt.subplot(2, 2, i+1)
sns.lineplot(x="petal_length", y="petal_width", data=data)
plt.title(context)
1.4 Цветовая палитра¶
Здесь нам могут быть полезны два метода:
- color_palette() задаёт цвет графику
- palplot() создаёт цветовую палитру в виде горизонтального массива
import seaborn as sns
import matplotlib.pyplot as plt
palette = sns.color_palette('Spectral', 15)
sns.palplot(palette)
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(7, 6))
sns.set_palette('vlag')
sns.set_context("notebook", font_scale=0.75)
plt.subplot(211)
sns.lineplot(x="petal_length", y="petal_width", data=data)
sns.set_palette('Accent')
sns.set_context("notebook", font_scale=0.75)
plt.subplot(212)
sns.lineplot(x="petal_length", y="petal_width", data=data)
plt.show()
1.5 Создание различных типов графиков¶
Точечная диаграмма¶
plt.figure(figsize=(6, 3))
sns.scatterplot(x="petal_length", y="petal_width", data=data)
plt.title("Точечная диаграмма")
plt.show()
Линейный график¶
plt.figure(figsize=(6, 3))
sns.lineplot(x="petal_length", y="petal_width", data=data)
plt.title("Линейный график")
plt.show()
Столбчатая диаграмма¶
Столбчатая диаграмма используется для агрегирования категориальных данных в соответствии с некоторыми методами, и по умолчанию это среднее значение.
plt.figure(figsize=(6, 3))
sns.barplot(x="species", y="petal_width", data=data)
plt.title("Столбчатая диаграмма")
plt.show()
Ящичковая диаграмма¶
Показывает диапазон значений определённой категории.
# Ящичковая диаграмма
plt.figure(figsize=(6, 3))
sns.boxplot(x="species", y="petal_width", data=data)
plt.title("Ящичковая диаграмма")
plt.show()
Полосовой график¶
По сути это точечная диаграмма по категориям.
plt.figure(figsize=(6, 3))
sns.stripplot(x="species", y="petal_width", data=data)
plt.title("Полосовой график")
plt.show()
1.6 Distplot¶
Distplot позволяет отображать гистограмму.
plt.figure(figsize=(6, 3))
sns.distplot(data['sepal_width'])
plt.title("Распределение ширины наружного лепестка околоцветника")
plt.show()
Мы видим, что распределение ширины наружного лепестка околоцветника близко к нормальному распределению.
1.7 Парный график¶
С помощью sns.pairplot мы можем создать точечные графики, между различными значениями признаков.
Здесь в целом лучше один раз увидеть, чем читать какие-то объяснения.
sns.pairplot(data=data, hue='species')
sns.set_context("notebook", font_scale=1)
plt.show()
1.8 Тепловая карта¶
Тепловая карта определяется как графическое представление данных с использованием цветов для визуализации значения матрицы. Для представления более распространённых значений используюься более яркие цвета для менее ярких тёмные(синие).
tc = data.corr()
sns.heatmap(tc)
plt.show()
Сравните с обычной матрицей корелляции.
data.corr()
Задача 1 (2 балла)¶
tit = sns.load_dataset('titanic') # загрузим датасет
tit
Рассмотрим популярный датасет, связанный с пассажирами Титаника.
- Survived: Признак, показывающий был ли спасен данный пассажир или нет. 1 означает, что удалось выжить, и 0 - не удалось спастись.
- Pclass: Класс билета. 1 - означает Первый класс билета. 2 - означает Второй класс билета. 3 - означает Третий класс билета.
- Name: Имя пассажира. Имя также может содержать титулы и обращения. "Mr" для мужчин. "Mrs" для женщин. "Miss" для девушек (тут имеется в виду что для тех, кто не замужем, так было принято, да и сейчас тоже, говорить в западном обществе). "Master" для юношей.
- Sex: Пол пассажира. Либо мужчины (=Male) оибо женщины (=Female).
- Age: Возраст пассажира. "NaN" значения в этой колонке означают, что возраст данного пассажира отсутствует/неизвестен/или не был записанv в датасет.
- SibSp: Количество братьев/сестер или супругов, путешествующих с каждым пассажиром.
- Parch: Количество родителей детей (Number of parents of children travelling with each passenger).
- Embark_town Город отправления
- Fare: Сумма, которую заплатил пассажир за путешествие.
Постройте:
- Точечную диаграмму
- Линейный график
- Столбчатую диаграмму
- Ящичковую диаграмму
- Полосовой график
- Парный график
- Тепловую карту
В качестве признаков можете выбрать те признаки, которые вам понравятся.
Pandas(часть 2)¶
2.1 Работа с пропусками¶
Так как данные бывают разных форм и видов и даже с пропусками, то необходимо уметь обрабатывать их.
import pandas as pd
import numpy as np
Создадим тренировочную таблицу с пропусками.
df = pd.DataFrame({
'ord_no':[70001,np.nan,70002,70004,np.nan,70005,np.nan,70010,70003,70012,np.nan,70013],
'purch_amt':[150.5,np.nan,65.26,110.5,948.5,np.nan,5760,1983.43,np.nan,250.45, 75.29,3045.6],
'sale_amt':[10.5,20.65,np.nan,11.5,98.5,np.nan,57,19.43,np.nan,25.45, 75.29,35.6],
'customer_id':[3002,3001,3001,3003,3002,3001,3001,3004,3003,3002,3001,3001],
'salesman_id':[5002,5003,5001,np.nan,5002,5001,5001,np.nan,5003,5002,5003,np.nan]})
df
Отсутствующие данные объектов можно заменить на конкретные числовые значения, для этого можно использовать метод fillna(). Для экспериментов будем использовать структуру df, созданную в предыдущем разделе.
Этот метод не изменяет текущую структуру, он возвращает структуру DataFrame, созданную на базе существующей, с заменой NaN значений на те, что переданы в метод в качестве аргумента.
К примеру, данные можно заполнить средним значением по столбцу.
df.fillna(df.mean())
Задача 2(3 балла)¶
Заполните пропущеные значения таблицы следующими способами:
- Медианными значениями
- Нулями
- Наиболее часто встречающимися
- Линейной интерполяцией
Читайте документацию: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html
2.2 Удаление столбцов и строк с пропусками¶
Довольно часто используемый подход при работе с отсутствующими данными – это удаление записей (строк) или полей (столбцов), в которых встречаются пропуски. Для того, чтобы удалить все объекты, которые содержат значения NaN используется метод dropna() без аргументов.
df = pd.DataFrame({
'ord_no':[70001,np.nan,70002,70004,np.nan,70005,np.nan,70010,70003,70012,np.nan,70013],
'purch_amt':[150.5,np.nan,65.26,110.5,948.5,np.nan,5760,1983.43,np.nan,250.45, 75.29,3045.6],
'sale_amt':[10.5,20.65,np.nan,11.5,98.5,np.nan,57,19.43,np.nan,25.45, 75.29,35.6],
'customer_id':[3002,3001,3001,3003,3002,3001,3001,3004,3003,3002,3001,3001],
'salesman_id':[5002,5003,5001,np.nan,5002,5001,5001,np.nan,5003,5002,5003,np.nan]})
df.dropna()
Однако, как кажется, мы потеряли с вами слишком много данных. Метод dropna() имеет множество аргументов о которых можно подробно почитать в документации: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html
Задача 3(2 балла)¶
df = pd.DataFrame({
'ord_no':[70001,np.nan,70002,70004,np.nan,70005,np.nan,70010,70003,70012,np.nan,70013],
'purch_amt':[150.5,np.nan,65.26,110.5,948.5,np.nan,5760,1983.43,np.nan,250.45, 75.29,3045.6],
'sale_amt':[10.5,20.65,np.nan,11.5,98.5,np.nan,57,19.43,np.nan,25.45, 75.29,35.6],
'customer_id':[3002,3001,3001,3003,3002,3001,3001,3004,3003,3002,3001,3001],
'salesman_id':[5002,5003,5001,np.nan,5002,5001,5001,np.nan,5003,5002,5003,np.nan]})
Удалите все столбцы, в которых:
- количество не-NaN элементов меньше трех.
- в которых все элементы NaN.
- в которых хотя бы один элемент NaN.
Удалите все строки, в которых:
- количество не-NaN элементов меньше трех.
- в которых все элементы NaN.
- в которых хотя бы один элемент NaN.
Задача 4(5 баллов)¶
Рассмотрим популярный датасет, связанный с пассажирами Титаника.
tit = sns.load_dataset('titanic') # загрузим датасет
tit
- Survived: Признак, показывающий был ли спасен данный пассажир или нет. 1 означает, что удалось выжить, и 0 - не удалось спастись.
- Pclass: Класс билета. 1 - означает Первый класс билета. 2 - означает Второй класс билета. 3 - означает Третий класс билета.
- Name: Имя пассажира. Имя также может содержать титулы и обращения. "Mr" для мужчин. "Mrs" для женщин. "Miss" для девушек (тут имеется в виду что для тех, кто не замужем, так было принято, да и сейчас тоже, говорить в западном обществе). "Master" для юношей.
- Sex: Пол пассажира. Либо мужчины (=Male) оибо женщины (=Female).
- Age: Возраст пассажира. "NaN" значения в этой колонке означают, что возраст данного пассажира отсутствует/неизвестен/или не был записанv в датасет.
- SibSp: Количество братьев/сестер или супругов, путешествующих с каждым пассажиром.
- Parch: Количество родителей детей (Number of parents of children travelling with each passenger).
- Embark_town Город отправления
- Fare: Сумма, которую заплатил пассажир за путешествие.
- Удалите все строки, содержащие строчки с пропусками.
- Постройте гистограммы количество выживших от возраста для женщин, мужчин и общую.
- Найдите средние цены для каждого из классов билета.
- Выясните, какие значения признаков pclass, sex, sibsp, parch соответствуют максимальной выживаемости.
- Заполните все пропуски, средними значениями в таблице и проделайте пункты 2-4 для данной таблице.
- Выясните, какой признак имеет максимальную линейную зависимость с выживаемостью(survived, alive)
- Выведите 25% пассажиров, потративших на билеты больше всех.
Задача 5(немного творческая 2 балла)¶
Подумайте и напишите, какие признаки влияют на выживаемость сильно, а какие не очень. Обоснуйте свою точку зрения.
Задача 6 (3 балла)¶
Рассмотрим датасет car_crashes
- total – Количество водителей, участвующих в ДТП со смертельным исходом, на миллиард миль
- speeding – количество водителей, участвовавших в столкновениях со смертельным исходом, которые превысили скорость.
- alchol – количество водителей, участвовавших в авариях со смертельным исходом, которые находились в состоянии алкогольного опьянения
- not_distracted – Количество водителей, попавших в ДТП со смертельным исходом, которые не были отвлечены
- no_previous – Количество водителей, попавших в ДТП со смертельным исходом, которые ранее не попадали в аварии
- ins_premium – Страховые взносы по автострахованию
- ins_loses – Убытки, понесенные страховыми компаниями при ДТП на одного застрахованного водителя
- abbrev – Штат
car = sns.load_dataset('car_crashes') # загрузим датасет
car
- Найдите топ 5 штатов с наибольшим числом аварий на пройденную милю.
- Какой признак больше всего влияет на аварию. Обоснуйте ваш выбор, используя pandas и seaborn.