Группа Т(О), ТГ(О), С(О)–24-02, 2025 год
Занятие по рабочей программе №31
Дисциплина: БД.08 «Информатика»
Прикладной модуль 1. Основы аналитики и визуализации данных.
Тема: Практическая работа №23. Анализ и обработка данных.
Цель занятия: Дидактическая:
сформулировать представление студентов и получить практические навыки работы Дата - сетами;
выяснить назначение применения ПО во время выполнения работы;
систематизировать и объяснить сущность работы с потоками данных;
определение основ аналитики и визуализации данных в принятии решений;
углубить и закрепить знания по дисциплине «Информатика».
Воспитательная:
развивать коммуникативные способности;
развивать аналитические способности;
развивать творческий подход к процессу обучения.
воспитывать самостоятельность, дисциплинированность;
стимулировать студентов к изучению дисциплины;
побуждать к формированию активной жизненной позиции;
прививать уважение и любовь к будущей профессии.
Вид занятия: практическая работа.
Тип занятия: обобщение и систематизация знаний.
Форма проведения занятия: репродуктивная и эвристическая беседа.
Междисциплинарные связи:
Обеспечивающие Математика, Охрана труда, Безопасность жизнедеятельности.
Обеспечиваемые
Информационные технологии в профессиональной деятельности, и др.
Методическое обеспечение: опорный конспект.
Литература:
Филимонова, Е. В. Информатика и информационные технологии в профессиональной деятельности: учебник / Е. В. Филимонова. – Москва: Юстиция, 2019. – 213 с. – (Среднее профессиональное образование). - ISBN 978-5-4365-2703-1.
Зимин, В. П. Информатика. Лабораторный практикум в 2 ч. Часть 1 : учебное пособие для среднего профессионального образования / В. П. Зимин. — 2-е изд., испр. и доп. — Москва : Издательство Юрайт, 2023. — 126 с. — (Профессиональное образование). — ISBN 978-5-534-11851-3. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/514893
ХОД ЗАНЯТИЯ
Ознакомление с темой, целью и планом занятия.
Тема: ПР №23. Анализ и обработка данных.
Цель работы: Получить практические навыки пользования Дата – сетами.
ПЛАН
Шпаргалка для быстрого Data preprocessing.
Получили dataset. Что делать дальше?
3. Волшебная визуализация. 4. Работаем с количественными данными.
5. Качественные данные.
Изложение и изучение нового материала, практическая работа.
ЛИТЕРАТУРА: [5], стр.
1. Шпаргалка для быстрого Data preprocessing
Часто люди, заходящие в область Data Science, имеют не совсем реалистичные представления о том, что их ждет. Многие думают, что сейчас они будут круто писать нейросети, создавать голосового помощника или обыгрывать всех на финансовых рынках.
Но работа Data Scientist завязана на данных, и один из важнейших и время затратных моментов — это обработка данных перед тем, как их подавать в нейросеть или анализировать определенным способом.
Чтобы код был довольно гибким и его можно было применять для разных датасетов, а также каждый, кто давно мечтал сделать себе отдельный notebook для быстрой и структурированной обработки данных может скопировать код и отформатировать его под себя, или скачать готовый notebook с Github.
2. Получили dataset. Что делать дальше?
Итак, стандарт: нужно понять, с чем имеем дело, общую картину. Для этого используем pandas, чтобы просто определить разные типы данных.
import pandas as pd #импортируем pandas
import numpy as np #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df.
df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения
df.info() #Демонстрируем информацию о колонках
Смотрим на значения колонок:
Соответствует ли количество строчек каждой колонки общему количеству строчек?
Какова суть данных в каждой колонке?
Какую колонку мы хотим сделать target, чтобы делать предсказания для нее?
Ответы на эти вопросы позволят проанализировать датасет, и примерно нарисовать план ближайших действий.
Также, для более глубокого взгляда на значения в каждой колонке, можем воспользоваться функцией pandas describe(). Правда, недостаток этой функции в том, что она не дает информацию про колонки со значениями string. С ними мы разберемся позже.
df.describe()
3. Волшебная визуализация
Посмотрим на то, где у нас отсутствуют значения вообще:
import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
Это был небольшой взгляд сверху, сейчас же мы приступим к более интересным вещам.
Попробуем найти и по возможности удалить колонки, в которых есть всего одно значение во всех строчках (они на результат влиять никак не будут):
df = df[[c for c
in list(df)
if len(df[c].unique()) 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения
Теперь предохраняем себя и успех нашего проекта от строк-дубликатов (строк, которые содержат одну и ту же информацию в одном и том же порядке, что и уже одна из существующих строчек):
df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
#В некоторых проектах удалять такие данные с самого начала не стоит.
Разделяем датасет на два: один с качественными значениями, а другой - с количественными.
Здесь нужно сделать небольшое уточнение: если строчки с пропущенными данными у качественных и количественных данных сильно не соотносятся между собой, то нужно будет принять решение, чем мы жертвуем - всеми строчками с пропущенными данными, только их частью или определенными колонками. Если же строчки соотносятся, то мы имеем полное право разделить датасет на два. В противном случае нужно будет сначала разобраться со строчками, в которых не соотносятся пропущенные данные в качественных и количественных, и только потом разделять датасет на два.
df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])
Мы делаем это, чтобы нам было легче обрабатывать эти два разных типа данных - в последствии мы поймем, насколько это упрощает нам жизнь.
4. Работаем с количественными данными
Первое, что нам стоит сделать — определить, нет ли «колонок — шпионов» в количественных данных. Мы называем эти колонки так, потому что они выдают себя за количественные данные, а сами работают как качественные.
Как нам их определить? Конечно, все зависит от природы данных, которые Вы анализируете, но в основном такие колонки могут иметь мало уникальных данных (в районе 3-10 уникальных значений).
print(df_numerical.nunique())
После того, как мы определимся с колонками-шпионами, мы переместим их из количественных данных в качественные:
spy_columns = df_numerical[['колонка1', 'колока2', 'колонка3']]#выделяем колонки-шпионы и записываем в отдельную dataframe
df_numerical.drop(labels=['колонка1', 'колока2', 'колонка3'], axis=1, inplace = True)#вырезаем эти колонки из количественных данных
df_categorical.insert(1, 'колонка1', spy_columns['колонка1']) #добавляем первую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка2', spy_columns['колонка2']) #добавляем вторую колонку-шпион в качественные данные
df_categorical.insert(1, 'колонка3', spy_columns['колонка3']) #добавляем третью колонку-шпион в качественные данные
Наконец-то мы полностью отделили количественные данные от качественных и теперь можно с ними как следует поработать. Первое — следует понять, где у нас есть пустые значения (NaN, а в некоторых случаях и 0 будут приниматься как пустые значения).
for i in df_numerical.columns:
print(i, df[i][df[i]==0].count())
На этом этапе важно понять, в каких колонках нули могут означать отсутствующие значения: связано ли это с тем, как собирались данные? Или это может быть связано со значениями данных? На эти вопросы нужно отвечать в каждом отдельном случае.
Итак, если мы все-таки решили, что данные у нас могут отсутствовать там, где есть нули, следует заменить нули на NaN, чтобы было легче потом работать с этими утерянными данными:
df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)
Теперь посмотрим, где у нас пропущены данные:
sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()
Здесь должны быть отмечены желтым цветом те значения внутри столбцов, которые отсутствуют. И самое интересное начинается теперь — как вести себя с этими значениями? Удалить строчки с этими значениями или столбцы? Или заполнить эти пустые значения какими-нибудь другими?
Вот приблизительная схема, которая может Вам помочь определиться с тем, что можно в принципе сделать с пустыми значениями:
0. Удаляем ненужные колонки
df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)
1. Количество пустых значений в этой колонке больше 50%?
print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)
df_numerical.drop(labels=["колонка1","колонка2"], axis=1,inplace=True) #Удаляем, если какая-то колонка имеет больше 50 пустых значений
2. Удаляем строчки с пустыми значениями
df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения
4.1. Вставляем случайное значение
import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы
4.2. Вставляем константное значение
from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='constant', fill_value="") #вставляем определенное значение с помощью SimpleImputer
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями
4.3. Вставляем среднее или максимально частое значение
from sklearn.impute import SimpleImputer #импортируем SimpleImputer, который поможет вставить значения
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вместо mean можно также использовать most_frequent
df_numerical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_numerical[['колонка1', 'колонка2', 'колонка3']]) #Применяем это для нашей таблицы
df_numerical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True) #Убираем колонки со старыми значениями
4.4. Вставляем значение, вычисленное другой моделью
Порой значения можно вычислить с помощью регрессионных моделей, используя модели из библиотеки sklearn или других похожих библиотек. Наша команда посвятит отдельную статью по тому, как это можно сделать в ближайшем будущем.
Итак, пока повествование о количественных данных прервется, потому что есть множество других нюансов о том, как лучше делать data preparation и preprocessing для разных задач, и базовые вещи для количественных данных были учтены в этой статье, и сейчас самое время вернуться в качественным данным, которые мы отделили несколько шагов назад от количественных. Вы же можете изменять этот notebook так, как Вам угодно, подстраивая его под разные задачи, чтобы data preprocessing проходил очень быстро!
5. Качественные данные
В основном для качественных данных используется метод One-hot-encoding, для того, чтобы отформатировать их из string (или object) в число. Перед тем как перейти к этому пункту, воспользуемся схемой и кодом сверху, для того, чтобы разобраться с пустыми значениями.
df_categorical.nunique()
sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')
0. Удаляем ненужные колонки
df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)
1. Количество пустых значений в этой колонке больше 50%?
print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)
df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка #имеет больше 50% пустых значений
2. Удаляем строчки с пустыми значениями
df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями,
#если потом останется достаточно данных для обучения
5.1. Вставляем случайное значение
import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)
5.2. Вставляем константное значение
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["колонка1","колонка2","колонка3"], axis = 1, inplace = True)
Итак, наконец, мы разобрались с пустыми значениями в качественных данных. Теперь время произвести one-hot-encoding для значений, которые есть в вашей базе данных. Этот метод крайне часто используется для того, чтобы Ваш алгоритм мог обучаться с учетом качественных данных.
def encode_and_bind(original_dataframe, feature_to_encode):
dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
res = pd.concat([original_dataframe, dummies], axis=1)
res = res.drop([feature_to_encode], axis=1)
return(res)
features_to_encode = ["колонка1","колонка2","колонка3"]
for feature in features_to_encode:
df_categorical = encode_and_bind(df_categorical, feature))
Итак, наконец, мы закончили обрабатывать отдельно качественные и количественные данные - время совмещать их, обратно.
new_df = pd.concat([df_numerical,df_categorical], axis=1)
После того, как мы соединили вместе датасеты в один, под конец мы можем использовать трансформацию данных с помощью MinMaxScaler из библиотки sklearn. Это сделает наши значения в пределах от 0 до 1, что поможет при обучении модели в будущем.
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)
Эти данные теперь готовы ко всему - к нейронным сетям, стандартным ML алгоритмам и т.д.
В этой статье мы не учли работу с данными, относящимся к временным рядам, так как для таких данных следует использовать немного иные техники их обработки, в зависимости от Вашей задачи. В будущем наша команда посвятит этой теме отдельную статью, и мы надеемся, что она сможет принести в Вашу жизнь что-то интересное, новое и полезное, как и эта.
Откроем ноутбук к этому занятию⧉
В первую очередь подготовим датасеты.
ДОМАШНЕЕ ЗАДАНИЕ
Изучить теоретический материал по данной теме.
Выполнить Практическое задание.
Результаты представить в виде крин-шотов.
Перечень рекомендуемых учебных изданий, Интернет-ресурсов, дополнительной литературы.
Основные источники:
Информатика. 10 класс : учебник для общеобразоват. организаций: базовый и углубленный уровни / [А.Г.Гейн , А.Б Ливчак, А.И. Сенокосов, Н.А. Юнерман]. – 4-е изд. – М. : Просвещение, 2018. – 272 с. : ил. – ISBN 978-5-09-058130-1
Информатика. 11 класс : учебник для общеобразоват. организаций: базовый и углубленный уровни / [А.Г.Гейн, А.И. Сенокосов]. – 6-е изд. – М. : Просвещение, 2019. – 336 с. : ил. – ISBN 978-5-09-072326-8.
Электронные источники:
Зимин, В. П. Информатика. Лабораторный практикум в 2 ч. Часть 1 : учебное пособие для среднего профессионального образования / В. П. Зимин. — 2-е изд., испр. и доп. — Москва : Издательство Юрайт, 2023. — 126 с. — (Профессиональное образование). — ISBN 978-5-534-11851-3. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/514893
Зимин, В. П. Информатика. Лабораторный практикум в 2 ч. Часть 2 : учебное пособие для среднего профессионального образования / В. П. Зимин. — 2-е изд. — Москва : Издательство Юрайт, 2023. — 153 с. — (Профессиональное образование). — ISBN 978-5-534-11854-4. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/514918
Мойзес, О. Е. Информатика. Углубленный курс : учебное пособие для среднего профессионального образования / О. Е. Мойзес, Е. А. Кузьменко. — Москва: Издательство Юрайт, 2020. — 164 с. — (Профессиональное образование). — ISBN 978-5-534-07980-7. — Текст : электронный // ЭБС Юрайт [сайт]. — URL: https://urait.ru/bcode/455803 .
Советов, Б. Я. Информационные технологии : учебник для среднего профессионального образования / Б. Я. Советов, В. В. Цехановский. — 7-е изд., перераб. и доп. — Москва : Издательство Юрайт, 2020. — 327 с. — (Профессиональное образование). — ISBN 978-5-534-06399-8. — Текст: электронный // ЭБС Юрайт [сайт]. — URL: https://urait.ru/bcode/450686 .
Новожилов, О. П. Информатика в 2 ч. Часть 1 : учебник для среднего профессионального образования / О. П. Новожилов. — 3-е изд., перераб. и доп. — Москва: Издательство Юрайт, 2020. — 320 с. — (Профессиональное образование). — ISBN 978-5-534-06372-1. — Текст : электронный // ЭБС Юрайт [сайт]. — URL: https://urait.ru/bcode/448995 .
Новожилов, О. П. Информатика в 2 ч. Часть 2 : учебник для среднего профессионального образования / О. П. Новожилов. — 3-е изд., перераб. и доп. — Москва: Издательство Юрайт, 2020. — 302 с. — (Профессиональное образование). — ISBN 978-5-534-06374-5. — Текст : электронный // ЭБС Юрайт [сайт]. — URL: https://urait.ru/bcode/448996
Гаврилов, М. В. Информатика и информационные технологии : учебник для среднего профессионального образования / М. В. Гаврилов, В. А. Климов. — 4-е изд., перераб. и доп. — Москва: Издательство Юрайт, 2020. — 383 с. — (Профессиональное образование). — ISBN 978-5-534-03051-8. — Текст: электронный // ЭБС Юрайт [сайт]. — URL: https://urait.ru/bcode/449286
Дополнительные источники:
Филимонова, Е. В. Информатика и информационные технологии в профессиональной деятельности: учебник / Е. В. Филимонова. – Москва: Юстиция, 2019. – 213 с. – (Среднее профессиональное образование). - ISBN 978-5-4365-2703-1.
Цветкова М.С., Информатика. Практикум для профессий и специальностей естественно-научного и гуманитарного профилей: : учеб. пособие для студентов учреждений сред. проф. образования / М.С. Цветкова, И.Ю. Хлобыстова. - 5-е изд., стер. - М. : Издательский центр "Академия", 2019. - 240 с. ISBN 978-5-4468-7901-4
Электронные источники:
Гаврилов, М. В. Информатика и информационные технологии : учебник для среднего профессионального образования / М. В. Гаврилов, В. А. Климов. — 4-е изд., перераб. и доп. — Москва : Издательство Юрайт, 2021. — 383 с. — (Профессиональное образование). — ISBN 978-5-534-03051-8. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/469424
Акопов, А. С. Компьютерное моделирование : учебник и практикум для среднего профессионального образования / А. С. Акопов. — Москва : Издательство Юрайт, 2023. — 389 с. — (Профессиональное образование). — ISBN 978-5-534-10712-8. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/517999
Демин, А. Ю. Информатика. Лабораторный практикум : учебное пособие для среднего профессионального образования / А. Ю. Демин, В. А. Дорофеев. — Москва : Издательство Юрайт, 2023. — 133 с. — (Профессиональное образование). — ISBN 978-5-534-07984-5. — Текст : электронный // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/516857
Преподаватель: Владимир Александрович Волков