АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON Edu.Vsu.Ru

Время на прочтение

Pandas — главная Python-библиотека для анализа данных. Она быстрая и мощная: в ней можно работать с таблицами, в которых миллионы строк. Вместе с Марией Жаровой, ментором проекта на курсе по Data Science
, рассказываем про команды, которые позволят начать работать с реальными данными.

Содержание
  1. Почему Python
  2. Вводная
  3. Основные библиотеки Python
  4. Jupyter
  5. NumPy
  6. SciPy
  7. Освоение основных принципов программирования
  8. Постановка задачи
  9. Анализ входных данных
  10. Предварительная обработка входных данных
  11. Построение моделей классификации и их анализ
  12. Заключение
  13. Изучение библиотек, необходимых для анализа данных
  14. Разработка
  15. Что не требуется для изучения Python
  16. Библиотеки Python для визуализации
  17. Seaborn
  18. Bokeh
  19. Basemap
  20. NetworkX
  21. Как установить Python
  22. Как изучать Python для анализа данных
  23. Среда разработки
  24. Matplotlib
  25. Работа с отдельными столбцами или строками
  26. Добавление новых строк и столбцов
  27. Удаление строк и столбцов
  28. Копирование датафрейма
  29. Уникальные значения
  30. Подсчет количества значений
  31. Группировка данных
  32. Сводные таблицы
  33. Сортировка данных
  34. Фильтрация
  35. Применение функций к столбцам
  36. Очистка данных
  37. Построение графиков
  38. Сохранение датафрейма на компьютер
  39. Библиотеки для работы с данными
  40. Scikit-learn
  41. TensorFlow
  42. Keras
  43. Анализ данных в Pandas
  44. Библиотеки для интеллектуального анализа и обработки естественного языка
  45. Scrapy
  46. NLTK (Natural Language Toolkit)
  47. Pattern
  48. Закрепление знаний на практике
  49. Требования и план разработки
  50. Заключение
  51. Результат

Почему Python

Это популярный язык.
Python — распространенный язык программирования. Поэтому нетрудно найти сообщества специалистов, которые используют его в работе. Возьмем для примера сообщество Stackoverflow
. Там вы найдете обучающие материалы, фрагменты кода и способы исправления распространенных ошибок, а участники сообщества всегда помогут советом.

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
Python занимает четвертое место по популярности среди языков программирования. Источник: TIOBE

Легко освоить.
Синтаксис Python хорошо продуман, поэтому по сравнению с другими языками требуется меньше кода для написания программы.

Есть средства для анализа данных.
Этими средствами являются библиотеки Python. О них мы расскажем ниже.

Не все умеют использоваться Python, но многие хотят этому научиться. Рассказываем, с чего начать и в каком направлении двигаться, чтобы не потратить время впустую.

Если вместе с этим хотите разобраться и в data science, почитайте наш материал « Разобраться в data science: подборка статей, курсов и конференций
».

Задача анализа данных — собрать, исследовать, очистить и преобразовать данные в наглядные графики. Так человек видит картину происходящего и понимает, какие действия предпринять. Для анализа используются разные инструменты: Excel, Google-таблицы, BI-системы и языки программирования.

Языки программирования предпочтительнее. С их помощью данные обрабатываются быстрее и можно автоматизировать выполнение большинства задач, которые в Excel и Google-таблицах выполняются вручную.

Для анализа данных мы советуем использовать язык программирования Python.

Язык Python часто применяется в Data Science, потому что, во-первых, по сравнению с другими языками код для сложных задач на Python проще и короче. А во-вторых, есть много мощных прикладных библиотек для решения разных задач: первичной обработки и анализа данных, обработки естественного языка и визуализации. Эта подборка будет полезна аналитикам данных, математикам и тем, кто занимается Data Science на разных уровнях. Составить ее нам помогли эксперты старший аналитик «Ростелеком» Константин Башевой, руководитель отдела аналитики в Mail.ru Петр Ермаков и ментор курса SkillFactory Анна Агабекян.

Библиотеки Python
— это файлы с шаблонами кода. Их придумали для того, чтобы людям не приходилось каждый раз заново набирать один и тот же код: они просто открывают файл, вставляют свои данные и получают нужный результат. В этом материале вы найдете описание библиотек, которые используются чаще всего для анализа данных на Python.

Вводная

В рамках расширения своих компетенций периодически провожу анализ данных датасетов. В какой-то момент осознал, что трачу время на столбцы с аналитиками, в которых все в порядке. Данные полные, тип данных единый, интерпретация понятна. Если столбцов несколько десятков, то обзорная проверка атрибутов каждого столбца занимает довольно значительное время.

Посмотрел в сторону библиотеки pandas-profiling
.

Мне показалось, что инструмент хорошо подходит для датасета в котором отработаны аномалии, пропуски, выбросы, типы данных. Вызвав df.profile_report() получаешь добротный отчет и остается только рыться во всех вкладках отчета и анализировать интересующие столбцы.

Меня смутил большой объем информации, который выдает profile_report(). Мне не хватило более простой обзорной формы, где легко можно сделать вывод и решить для себя стоит обратить внимание на столбец или нет. Возникла потребность самому настроить выдачу отчета под себя.

Разработчиком я не являюсь, поэтому попытался накидать простой код своими силами, который бы позволил немного ускорить процесс проверки. Возможно он поможет и вам. Был бы признателен, если в комментариях, напишите ваше предложение, что можно улучшить, добавить, скорректировать.


Основные библиотеки Python

Вот базовые библиотеки, которые делают из языка программирования Python инструмент для анализа и визуализации данных. Иногда их называют SciPy Stack. На них основываются более специализированные библиотеки.

Jupyter

Интерактивная оболочка
для языка Python. В ней есть дополнительный командный синтаксис; она сохраняет историю ввода во всех сеансах, подсвечивает и автоматически дополняет код. Если вы когда-либо пользовались Mathematica или MATLAB
, то разберетесь и в Jupyter.

Интерфейс библиотеки подходит для исследования и первичной обработки данных, тестирования первых версий кода и его улучшения. Используя язык разметки Markdown
для форматирования текста и библиотеки для визуализации, можно формировать аналитические отчеты в браузере или преобразовать отчет в презентацию. С помощью JupyterHub
можно настроить совместную работу команды на сервере.

Пример небольшого анализа данных в браузере:

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

NumPy

NumPy
— основная библиотека Python, которая упрощает работу с векторами и матрицами. Содержит готовые методы для разных математических операций: от создания, изменения формы, умножения и расчета детерминанта матриц до решения линейных уравнений и сингулярного разложения. Например, возьмем такую систему уравнений:

Чтобы ее решить, достаточно воспользоваться методом lialg.solve:

Пример работы с библиотекой NumPy

SciPy

Библиотека SciPy
основывается на NumPy и расширяет ее возможности. SciPy похожа на Matlab. Включает методы линейной алгебры и методы для работы с вероятностными распределениями, интегральным исчислением и преобразованиями Фурье.

Пример
расчета определителя двумерной матрицы:

Пример работы с библиотекой SciPy

Освоение основных принципов программирования

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

Главное в программировании — не знание синтаксиса, а понимание того, как сделать так, чтобы машина исполняла ваши поручения. И вот что мы советуем:

Начинающим.
Прочитать четыре книги:

  1. Automate the Boring Stuff with Python (Автоматизация рутинных задач с помощью Python). Купить бумажную книгу на английском в Озоне
    или на русском в Лабиринте
    . Читать на английском и бесплатно на сайте книги
    .
  2. How to Think Like a Computer Scientist (Научись думать, как программист). Читать на английском и бесплатно на сайте книги
    .
  3. Изучаем программирование на Python. Купить бумажную книгу в КомБук
    .
  4. Изучаем Python. Купить бумажную книгу в КомБук
    .

Тем, кто знает другой язык программирования.

Это видео разъясняет многие вопросы:

  • В чем разница между такими типами данных, как целое число, число с плавающей точкой (запятой) и строкой?
  • Как сделать калькулятор на «Python»?
  • Что такое цикл for и когда его использовать?
  • Какую структуру имеет функция?
  • Как использовать условные операторы (if… else…), чтобы привести выражение к логическому типу?
  • Как работают операторы импорта?

Для закрепления пройденного.
Использовать эти ресурсы:

Code Fights
— предлагаются разные по сложности задачи: одни решаются за пять минут, другие — за несколько часов. Выдалась свободная минутка — решаете легкие задачи, появилось больше свободного времени — задачи посложнее.

PracticePython.org
— предлагаются задачи по программированию на Python. К каждой задаче прилагаются ссылки на то, как ее решили другие люди. Можно сравнить свое решение с решениями других и найти сильные и слабые стороны своего подхода. Новые задачи появляются почти каждую неделю.

Время на прочтение

Добрый день уважаемые читатели. В сегодняшней посте я продолжу свой цикл статей посвященный анализу данных на python c помощью модуля Pandas
и расскажу один из вариантов использования данного модуля в связке с модулем для машинного обучения scikit-learn
. Работа данной связки будет показана на примере задачи
про спасенных с «Титаника&quot. Данное задание имеет большую популярность среди людей, только начинающих заниматься анализом данных и машинным обучением
.

Постановка задачи

Итак суть задачи состоит в том, чтобы с помощью методов машинного обучения построить модель, которая прогнозировала бы спасется человек или нет. К задаче прилагаются 2 файла:

  • train.csv
    — набор данных на основании которого будет строиться модель ( обучающая выборка
    )
  • test.csv
    — набор данных для проверки модели

Как было написано выше, для анализ понадобятся модули Pandas и scikit-learn. С помощью Pandas
мы проведем начальный анализ данных, а sklearn
поможет в вычислении прогнозной модели. Итак, для начала загрузим нужные модули:

Кроме того даются пояснения по некоторым полям:

Анализ входных данных

>Итак, задача сформирована и можно приступить к ее решению.

Для начала загрузим тестовую выборку и посмотрим как она выглядит::

   from pandas import read_csv, DataFrame, Series
data = read_csv('Kaggle_Titanic/Data/train.csv')  
  

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

   data.pivot_table('PassengerId', 'Pclass', 'Survived', 'count').plot(kind='bar', stacked=True)  
  

image

Наше вышеописанное предположение про то, что чем выше у пассажиров их социальное положение, тем выше их вероятность спасения. Теперь давайте взглянем, как количество родственников влияет на факт спасения:

   fig, axes = plt.subplots(ncols=2)
data.pivot_table('PassengerId', ['SibSp'], 'Survived', 'count').plot(ax=axes[0], title='SibSp')
data.pivot_table('PassengerId', ['Parch'], 'Survived', 'count').plot(ax=axes[1], title='Parch')
  
  

image

Как видно из графиков наше предположение снова подтвердилось, и из людей имеющих больше 1 родственников спаслись не многие.

Сейчас порассуждаем на предмет данных, которые находятся номера кают. Теоретически данных о каютах пользователей может не быть, так что давайте посмотрим на столько это поле заполнено:

   data.PassengerId[data.Cabin.notnull()].count()  
  

В итоге заполнено всего 204 записи и 890, на основании этого можно сделать вывод, что данное поле при анализе можно опустить.

Следующее поле, которое мы разберем будет поле с возрастом ( Age
). Посмотрим на сколько оно заполнено:

   data.PassengerId[data.Age.notnull()].count()  
  

Данное поле практически все заполнено (714 непустых записей), но есть пустые значения, которые не определены. Давайте зададим ему значение равное медиане по возрасту из всей выборки. Данный шаг нужен для более точного построения модели:

   data.Age = data.Age.median()  
  

У нас осталось разобраться с полями Ticket
, Embarked
, Fare
, Name
. Давайте посмотрим на поле Embarked, в котором находится порт посадки и проверим есть ли такие пассажиры у которых порт не указан:

   data[data.Embarked.isnull()]  
  

Итак у нас нашлось 2 таких пассажира. Давайте присвоим эти пассажирам порт в котором село больше всего людей:

   MaxPassEmbarked = data.groupby('Embarked').count()['PassengerId']
data.Embarked[data.Embarked.isnull()] = MaxPassEmbarked[MaxPassEmbarked == MaxPassEmbarked.max()].index[0]
  
  

Ну что же разобрались еще с одним полем и теперь у нас остались поля с имя пассажира, номером билета и ценой билета.

По сути нам из этих трех полей нам нужна только цена( Fare
), т.к. она в какой-то мере определяем ранжирование внутри классов поля Pclass
. Т. е. например люди внутри среднего класса могут быть разделены на тех, кто ближе к первому(высшему) классу, а кто к третьему(низший). Проверим это поле на пустые значения и если таковые имеются заменим цену медианой по цене из все выборки:

   data.PassengerId[data.Fare.isnull()]  
  

В нашем случае пустых записей нет.

В свою очередь номер билета и имя пассажира нам никак не помогут, т. к. это просто справочная информация. Единственное для чего они могут пригодиться — это определение кто из пассажиров потенциально являются родственниками, но так как люди у которых есть родственники практически не спаслись (это было показано выше) можно пренебречь этими данными.

Теперь, после удаления всех ненужных полей, наш набор выглядит так:

   data = data.drop(['PassengerId','Name','Ticket','Cabin'],axis=1)  
  

Предварительная обработка входных данных

Предварительный анализ данных завершен, и по его результатам у нас получилась некая выборка, в которой содержатся несколько полей и вроде бы можно преступить к построению модели, если бы не одно «но»: наши данные содержат не только числовые, но и текстовые данные.

Поэтому переде тем, как строить модель, нужно закодировать все наши текстовые значения.

Можно это сделать в ручную, а можно с помощью модуля sklearn.preprocessing
. Давайте воспользуемся вторым вариантом.

Закодировать список с фиксированными значениями можно с помощью объекта LabelEncoder()
. Суть данной функции заключается в том, что на вход ей подается список значений, который надо закодировать, на выходе получается список классов индексы которого и являются кодами элементов поданного на вход списка.

   from sklearn.preprocessing import LabelEncoder
label = LabelEncoder()
dicts = {}

label.fit(data.Sex.drop_duplicates()) #задаем список значений для кодирования
dicts['Sex'] = list(label.classes_)
data.Sex = label.transform(data.Sex) #заменяем значения из списка кодами закодированных элементов 

label.fit(data.Embarked.drop_duplicates())
dicts['Embarked'] = list(label.classes_)
data.Embarked = label.transform(data.Embarked)  
  

В итоге наши исходные данные будут выглядеть так:

Теперь нам надо написать код для приведения проверочного файла в нужный нам вид. Для этого можно просто скопировать куски кода которые были выше(или просто написать функцию для обработки входного файла):

   test = read_csv('Kaggle_Titanic/Data/test.csv')
test.Age[test.Age.isnull()] = test.Age.mean()
test.Fare[test.Fare.isnull()] = test.Fare.median() #заполняем пустые значения средней ценой билета
MaxPassEmbarked = test.groupby('Embarked').count()['PassengerId']
test.Embarked[test.Embarked.isnull()] = MaxPassEmbarked[MaxPassEmbarked == MaxPassEmbarked.max()].index[0]
result = DataFrame(test.PassengerId)
test = test.drop(['Name','Ticket','Cabin','PassengerId'],axis=1)

label.fit(dicts['Sex'])
test.Sex = label.transform(test.Sex)

label.fit(dicts['Embarked'])
test.Embarked = label.transform(test.Embarked)
  
  

Код описанный выше выполняет практически те же операции, что мы проделали с обучающей выборкой. Отличие в том, что добавилась строка для обработки поля Fare
, если оно вдруг не заполнено.

Построение моделей классификации и их анализ

Ну что же, данные обработаны и можно приступить к построению модели, но для начала нужно определиться с тем, как мы будем проверять точность полученной модели. Для данной проверки мы будем использовать скользящий контроль
и ROC-кривые
. Проверку будем выполнять на обучающей выборке, после чего применим ее на тестовую.

Итак рассмотрим несколько алгоритмов машинного обучения:

  • Метод опорных векторов
  • Метод ближайших соседей
  • Random forest
  • Логистическая регрессия

Загрузим нужные нам библиотеки:

   from sklearn import cross_validation, svm
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
import pylab as pl
  
  

Для начала, надо разделить нашу обучаюшую выборку на показатель, который мы исследуем, и признаки его определяющие:

   target = data.Survived
train = data.drop(['Survived'], axis=1) #из исходных данных убираем Id пассажира и флаг спасся он или нет
kfold = 5 #количество подвыборок для валидации
itog_val = {} #список для записи результатов кросс валидации разных алгоритмов
  
  

Теперь наша обучающая выборка выглядит так:

Теперь разобьем показатели полученные ранее на 2 подвыборки(обучающую и тестовую) для расчет ROC кривых (для скользящего контроля этого делать не надо, т.к. функция проверки это делает сама. В этом нам поможет функция train_test_split
модуля cross_validation
:

   ROCtrainTRN, ROCtestTRN, ROCtrainTRG, ROCtestTRG = cross_validation.train_test_split(train, target, test_size=0.25) 
  
  

В качестве параметров ей передается:

  • Массив параметров
  • Массив значений показателей
  • Соотношение в котором будет разбита обучающая выборка (в нашем случае для тестового набора будет выделена 1/4 часть данных исходной обучающей выборки)

На выходе функция выдает 4 массива:

  1. Новый обучающий массив параметров
  2. тестовый массив параметров
  3. Новый массив показателей
  4. тестовый массив показателей

Далее представлены перечисленные методы с наилучшими параметрами подобранные опытным путем:

   model_rfc = RandomForestClassifier(n_estimators = 70) #в параметре передаем кол-во деревьев
model_knc = KNeighborsClassifier(n_neighbors = 18) #в параметре передаем кол-во соседей
model_lr = LogisticRegression(penalty='l1', tol=0.01) 
model_svc = svm.SVC() #по умолчанию kernek='rbf'
  
  

Теперь проверим полученные модели с помощью скользящего контроля. Для этого нам необходимо воcпользоваться функцией cross_val_score

   scores = cross_validation.cross_val_score(model_rfc, train, target, cv = kfold)
itog_val['RandomForestClassifier'] = scores.mean()
scores = cross_validation.cross_val_score(model_knc, train, target, cv = kfold)
itog_val['KNeighborsClassifier'] = scores.mean()
scores = cross_validation.cross_val_score(model_lr, train, target, cv = kfold)
itog_val['LogisticRegression'] = scores.mean()
scores = cross_validation.cross_val_score(model_svc, train, target, cv = kfold)
itog_val['SVC'] = scores.mean()
  
  

Давайте посмотрим на графике средний показатель тестов перекрестной проверки каждой модели:

   DataFrame.from_dict(data = itog_val, orient='index').plot(kind='bar', legend=False)
  
  

image

Как можно увидеть из графика лучше всего себя показал алгоритм RandomForest. Теперь же давайте взглянем на графики ROC-кривых, для оценки точности работы классификатора. Графики будем рисовать с помощью библиотеки matplotlib
:

   pl.clf()
plt.figure(figsize=(8,6))
#SVC
model_svc.probability = True
probas = model_svc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('SVC', roc_auc))
#RandomForestClassifier
probas = model_rfc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('RandonForest',roc_auc))
#KNeighborsClassifier
probas = model_knc.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('KNeighborsClassifier',roc_auc))
#LogisticRegression
probas = model_lr.fit(ROCtrainTRN, ROCtrainTRG).predict_proba(ROCtestTRN)
fpr, tpr, thresholds = roc_curve(ROCtestTRG, probas[:, 1])
roc_auc  = auc(fpr, tpr)
pl.plot(fpr, tpr, label='%s ROC (area = %0.2f)' % ('LogisticRegression',roc_auc))
pl.plot([0, 1], [0, 1], 'k--')
pl.xlim([0.0, 1.0])
pl.ylim([0.0, 1.0])
pl.xlabel('False Positive Rate')
pl.ylabel('True Positive Rate')
pl.legend(loc=0, fontsize='small')
pl.show()
  
  

image

Как видно по результатам ROC-анализа лучший результат опять показал RandomForest. Теперь осталось только применить нашу модель к тестовой выборке:

   model_rfc.fit(train, target)
result.insert(1,'Survived', model_rfc.predict(test))
result.to_csv('Kaggle_Titanic/Result/test.csv', index=False)
  
  

Заключение

В данной статье я постарался показать, как можно использовать пакет pandas
в связке с пакетом для машинного обучения sklearn
. Полученная модель при сабмите на Kaggle показала точность 0.77033. В статье я больше хотел показать именно работу с инструментарием и ход выполнения исследования, а не построение подробного алгоритма, как например в этой
серии статей.

Изучение библиотек, необходимых для анализа данных

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

Библиотеки — это собрание функций и объектов, которые используются в скриптах. Они экономят время, так как не нужно прописывать функции с нуля.

Что понадобится для изучения.
Jupyter Notebook
— набор средств для разработки программ. Если вы скачали Python с помощью дистрибутива Anaconda, то используйте Anaconda Navigator, чтобы создать и сохранить Jupyter Notebook. Как это делается, показывается в видео.

  1. Почитать справочную информацию, выделив на это примерно 30 минут.
  2. Открыть Jupyter Notebook и загрузить библиотеку.
  3. Посмотреть, как работает библиотека, используя инструкцию по работе с библиотекой.
  4. Снова выделить минут 30 на изучение справочной информации.

Действуя в таком порядке, вы освоите библиотеку достаточно, чтобы начать использовать ее в работе.

  1. NumPy
    — для числовых расчетов. Является основой для многих библиотек, используемых в анализе данных. Справочная информация
    и инструкция по работе с библиотекой
    .
  2. Pandas
    — для анализа данных. Содержит структуры данных и операции для обработки числовых таблиц и временных рядов. Работа с этой библиотекой строится поверх NumPy. Справочная информация
    и инструкция по работе с библиотекой
    .
  3. Matplotlib
    — для двумерной или трехмерной визуализации данных. Она мощная, но довольно громоздкая. Справочная информация
    и инструкция по работе с библиотекой
    .
  4. Seaborn — для визуализации данных. Изучите ее, если библиотека Matplotlib показалась сложной. Справочная информация
    и инструкция по работе с библиотекой
    .

Разработка

На вход подаем Dataframe

   import pandas as pd

class DataAnalysisColumns():

    def __init__(self, df: pd.DataFrame):
        self.df = df
        self.columns = df.columns
        self.TotalRows = df.shape[0]
        self.BoxResult = []

        self.СolumnsDict = {
                  'AnalysisParams':'',
                  'NameColumns' : '',
                  'Value': ''}  
  

Делаем доступными для функций:

CreateDf принимает список с результатом анализа и создает DataFrame. Очищает список, в котором хранились результаты с целью использования в следующих функциях.

     def CreateDf(self,BoxResult:list):
      
      OutputDf = pd.DataFrame(data=BoxResult, columns=list(self.СolumnsDict.keys()))
      self.BoxResult.clear()
          
      return OutputDf  
  

Напишем несколько простых функций с анализом. Проанализируем имена столбцов на предмет наличия пробелов. Ранее при использовании query в pandas пробелы в названиях столбцов попортили нервы.

Второй анализ будет связан с наличием пустых строк в столбце. Выведем абсолютное и относительное число.

Каждая функция завершается созданием отдельного dataframe

    def AnalysisOfColumnNames(self):
      for NameColumn in self.columns:
          if " " in NameColumn:
              ListAttributes = ['Сolumn name', NameColumn, NameColumn]
              self.BoxResult.append(ListAttributes)
      
      return self.CreateDf(self.BoxResult)

    
  def AnalysisOfNull(self):

      for NameColumn in self.columns:
          CountNull = self.df[NameColumn].isnull().sum()

          if CountNull > 0:
              ListAttributes = ['Null Count', 
                             NameColumn , 
                             f'{CountNull} of {self.TotalRows} or {"{0:.0%}".format(CountNull/self.TotalRows)}']
          
              self.BoxResult.append(ListAttributes)
      
      return self.CreateDf(self.BoxResult)  
  

Третья функция немного сложнее. Анализируем состав типа данных внутри столбца. Результаты выводим так же в абсолютных и относительных значениях.

В строках 18-20 пытаюсь выдернуть из <class ‘str’>, тип данных c кавычки ‘str’. Переменные FirsttNumOfSymbol, LatsNumOfSymbol. Наверное, его можно заменить регулярным выражением. Пытался сделать не получилось. Был бы рад, если в комментариях подскажите это сократит код.

    def AnalysisOfType(self): 
        # анализируем каждый столбец
        for NameColumn in self.columns:
            TypeColumn = str(self.df[NameColumn].dtype)

            # для типа 'object' пробегаемся по всему столбцу
            # формируем сводную по типу данных и считаем кол-ву строк
            if TypeColumn == 'object':
                self.df['TypeData'] = self.df[NameColumn].apply(lambda x: str(type(x)))

                PivotTable = self.df.groupby('TypeData').agg({'TypeData': ['count']}).reset_index()
                PivotTable.columns = ['TypeData', 'count']
                ColumnType = PivotTable['TypeData']
                BoxResult = []

                # собираем все в один результат(строку)
                for i in range(len(PivotTable)):
                    FirsttNumOfSymbol = ColumnType[i].find("'")
                    LatsNumOfSymbol = ColumnType[i].rfind("'") + 1
                    NameTypeRow = ColumnType[i][FirsttNumOfSymbol:LatsNumOfSymbol]

                    Percent = "{0:.0%}".format(PivotTable['count'][i]/self.TotalRows)

                    StringForAppend = f"{NameTypeRow}:{PivotTable['count'][i]}({Percent})"

                    BoxResult.append(StringForAppend)

                ListAttributes = ['Type', 
                                NameColumn, 
                                ",".join(BoxResult)]
                
                self.BoxResult.append(ListAttributes)

        return self.CreateDf(self.BoxResult)  
  

Функции для анализа выбросов и анализ уникальности я оставлю в коде на GitHub
.

Сбор всего анализа

Наши функции выдают отдельные DataFrame, соберем их в отдельный список. При помощи concat объединим в один.

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

   def AnalysisOfDf(self):
        ListOfAnalysis = [self.AnalysisOfColumnNames(),
                          self.AnalysisOfNull(),
                          self.AnalysisOfType(),
                          self.AnalysisOfOutlier(),
                          self.AnalysisOfUniqueText(),
                         ]
           
        OutputDf = pd.concat(ListOfAnalysis).reset_index(drop=True)

        OutputDf = OutputDf[['NameColumns', 'AnalysisParams', 'Value']]

        return OutputDf.sort_values(by=['NameColumns']).reset_index(drop=True)  
  

Что не требуется для изучения Python

Ученая степень по информатике.
Все, что требуется для анализа данных с помощью Python, — это написать работающий код, чтобы программа правильно делала то, что от нее требуется. Ученая степень по информатике для этого не понадобится.

Полное освоение Python:

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

Заучивать синтаксис.
Нет смысла учить синтаксис наизусть. Он отложится в памяти сам по себе во время изучения справочных материалов и практики. Лучше направить силы на поиск смысла в программировании, например, задаваясь такими вопросами: зачем нужна эта функция? как работают условные операторы? и т.д.

Для тех, кто хочет изучить Python и его инструменты под руководством наставника:  «Курс по Python для анализа данных»

Библиотеки Python для визуализации

Библиотеки, которые пригодятся в визуализации данных и построении графиков.

Seaborn

Библиотека
более высокого уровня, чем matplotlib. С ее помощью проще создавать специфическую визуализацию: тепловые карты, временные ряды и скрипичные диаграммы. Пример визуализации
:

Пример визуализации в Seaborn
Пример использования библиотеки в Seaborn

Bokeh

Создает
интерактивные и масштабируемые графики в браузерах, используя виджеты JavaScript. Сложность графиков может быть разная: от стандартных диаграмм до сложных кастомизированных схем. Примеры визуализации
:

Пример визуализации в Bokeh
Пример использования библиотеки Bokeh

Basemap

Basemap
используется для создания карт. На ее основе сделана библиотека Folium, с помощью которой создают интерактивные карты в интернете. Пример карты
:

Пример визуализации в Basemap
Пример использования библиотеки Basemap

NetworkX

Используется
для создания и анализа графов и сетевых структур. Предназначена для работы со стандартными и нестандартными форматами данных.

Пример визуализации в NetworkX
Пример использования библиотеки NetworkX

Это малая часть библиотек Python, но и их достаточно, чтобы на серьезном уровне анализировать данные, создавать и обучать нейронные сети и визуализировать результаты.

Как установить Python

Советуем сделать это с помощью  дистрибутива Anaconda
, так как в нем содержатся необходимые библиотеки для анализа данных.

Как изучать Python для анализа данных

Мы сторонники обучения на практике: учеба не наскучивает, Python усваивается быстрее и сразу видно, в чем надо подтянуться. Однако сначала необходимо набрать базовые знания, чтобы понимать, с чего начинать, когда приступаешь к практике. Поэтому мы разделили план по изучению Python для анализа данных на три ступени:

  1. Освоение основных принципов программирования.
  2. Изучение библиотек, необходимых для анализа данных.
  3. Закрепление знаний на практике.

Среда разработки

Pandas работает как в IDE (средах разработки), так и в облачных блокнотах для программирования. Как установить библиотеку в конкретную IDE, читайте тут
. Мы для примера будем работать в облачной среде Google Colab. Она удобна тем, что не нужно ничего устанавливать на компьютер: файлы можно загружать и работать с ними онлайн, к тому же есть совместный режим для работы с коллегами. Про Colab мы писали в этом обзоре
.

Пройдите тест и узнайте, какой вы аналитик данных и какие перспективы вас ждут. Ссылка в конце статьи.

Matplotlib

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

АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
Пример работы с библиотекой Marplotlib

Работа с отдельными столбцами или строками

Выделить несколько столбцов можно разными способами.

как сделать срез фрейма Pandas

Теперь можно выполнить любое действие с этим сокращенным фреймом.

2. Использовать метод
loc

использование метода loc Pandas

В этом случае мы оставили все столбцы от Места в рейтинге
до Социальной поддержки
.

3. Использовать метод
iloc

Первый параметр показывает индексы строк, которые останутся, второй — индексы столбцов. Получаем такой фрейм:

Использование метода iloc Pandas

В методе iloc
значения в правом конце исключаются, поэтому последняя строка, которую мы видим, — 99.

4. Использовать метод
tolist()

Часто бывает нужно получить в виде списка названия столбцов датафрейма. Это тоже можно сделать с помощью метода tolist()
: df.columns.tolist()

Использование метода tolist() в Pandas

Добавление новых строк и столбцов

Добавление новых строк и столбцов
Добавим еще одну страну

Важно:
при добавлении новой строки методом .append()
не забывайте указывать параметр ignore_index=True
, иначе возникнет ошибка.

Иногда бывает полезно добавить строку с суммой, медианой или средним арифметическим) по столбцу. Сделать это можно с помощью агрегирующих ( aggregate
(англ.) — группировать, объединять) функций: sum()
, mean()
, median()
. Для примера добавим в конце строку с суммами значений по каждому столбцу: df = df.append(df.sum(axis=0), ignore_index = True)

добавим в конце строку с суммами значений по каждому столбцу

Удаление строк и столбцов

В других случаях лучше воспользоваться описанными выше срезами.

Обратите внимание, что этот метод требует дополнительного сохранения через присваивание датафрейма с примененным методом исходному. Также в параметрах обязательно нужно указать axis = 1
, который показывает, что мы удаляем именно столбец, а не строку.

Копирование датафрейма

Можно полностью скопировать исходный датафрейм в новую переменную. Это пригодится, если нужно преобразовать много данных и при этом работать не с отдельными столбцами, а со всеми данными: df_copied = df.copy()

Уникальные значения

Подсчет количества значений

Подсчет количества значений в Pandas

Группировка данных

Некоторым обобщением . value_counts()
является метод .groupby()
— он тоже группирует данные какого-либо столбца по одинаковым значениям. Отличие в том, что при помощи него можно не просто вывести количество уникальных элементов в одном столбце, но и найти для каждой группы сумму / среднее значение / медиану по любым другим столбцам.

1) Сгруппируем данные по новому столбцу баллов и посчитаем, сколько уникальных значений для каждой группы содержится в остальных столбцах. Для этого в качестве агрегирующей функции используем .count()
: df.groupby('Баллы_new').count()

Получается, что чаще всего страны получали 6 баллов (таких было 49):

Группировка данных для анализа Pandas

2) Получим более содержательный для анализа данных результат — посчитаем сумму значений в каждой группе. Для этого вместо .count()
используем sum()
: df.groupby('Баллы_new').sum()

посчитаем сумму значений в каждой группе

3) Теперь рассчитаем среднее значение по каждой группе, в качестве агрегирующей функции в этом случае возьмем mean()
: df.groupby('Баллы_new').mean()

рассчитаем среднее значение по каждой группе

4) Рассчитаем медиану. Для этого пишем команду  median()
: df.groupby('Баллы_new').median()

Рассчитаем медиану в Pandas

Это самые основные агрегирующие
функции, которые пригодятся на начальном этапе работы с данными.

Сводные таблицы

Бывает, что нужно сделать группировку сразу по двум параметрам. Для этого в Pandas используются сводные таблицы или pivot_table()
. Они составляются на основе датафреймов, но, в отличие от них, группировать данные можно не только по значениям столбцов, но и по строкам.

В ячейки такой таблицы помещаются сгруппированные как по «координате» столбца, так и по «координате» строки значения. Соответствующую агрегирующую функцию указываем отдельным параметром.

Сводные таблицы Pandas

Сортировка данных

Сортировка данных

Видно, что самые высокие ВВП совсем не гарантируют высокое место в рейтинге.

Чтобы сделать сортировку по убыванию, можно воспользоваться параметром ascending
(от англ.
«по возрастанию») = False:
df.sort_values(by = 'ВВП на душу населения', ascending=False)

как сделать сортировку по убыванию

Фильтрация

Иногда бывает нужно получить строки, удовлетворяющие определенному условию; для этого используется «фильтрация» датафрейма. Условия могут быть самые разные, рассмотрим несколько примеров и их синтаксис:

фильтрация в Pandas
Получение строк для анализа в Pandas
строки датасета в Pandas
анализ данных в Pandas

Таким образом, если внутри внешних квадратных скобок стоит истинное выражение, то строка датасета будет удовлетворять условию фильтрации. Поэтому в других ситуациях можно использовать в условии фильтрации любые функции/конструкции, возвращающие значения True
или False
.

Применение функций к столбцам

Зачастую встроенных функций и методов для датафреймов из библиотеки бывает недостаточно для выполнения той или иной задачи. Тогда мы можем написать свою собственную функцию, которая преобразовывала бы строку датасета как нам нужно, и затем использовать метод .apply()
для применения этой функции ко всем строкам нужного столбца.

Применение функций к столбцам

Очистка данных

Это целый этап работы с данными при подготовке их к построению моделей и нейронных сетей. Рассмотрим основные приемы и функции.

Этот метод не требует дополнительного присваивания в исходную переменную, чтобы результат сохранился, — поэтому предварительно создадим копию нашего датасета, чтобы не форматировать исходный.

Очистка данных в Pandas

2) Для замены пропусков NaN на какое-либо значение используется функция fillna()
. Например, заполним появившиеся после предыдущего пункта пропуски в последней строке нулями: df_copied.fillna(0)

замена пропусков NaN в Pandas

3) Пустые строки с NaN можно и вовсе удалить из датасета, для этого используется функция dropna()
(можно также дополнительно указать параметр inplace = True
): df_copied.dropna()

Построение графиков

В Pandas есть также инструменты для простой визуализации данных.

1) Обычный график по точкам.

Построим зависимость ВВП на душу населения от места в рейтинге: df.plot(x = 'Место в рейтинге', y = 'ВВП на душу населения')

Обычный график по точкам в Pandas

Отобразим ту же зависимость в виде столбчатой гистограммы: df.plot.hist(x = 'Место в рейтинге', y = 'ВВП на душу населения')

гистограмма в Pandas

3) Точечный график.



df.plot.scatter(x = 'Место в рейтинге', y = 'ВВП на душу населения')

точечный график в Pandas

Мы видим предсказуемую тенденцию: чем выше ВВП на душу населения, тем ближе страна к первой строчке рейтинга.

Сохранение датафрейма на компьютер

Сохраним наш датафрейм на компьютер: df.to_csv('WHR_2019.csv')

Теперь с ним можно работать и в других программах.

Тест-симулятор по аналитике данных

Библиотеки для работы с данными

Библиотеки Python для анализа данных, Machine Learning и обучения сложных нейронных сетей.

Scikit-learn

Scikit-learn
основана на NumPy и SciPy. В ней есть алгоритмы для машинного обучения и интеллектуального анализа данных: кластеризации, регрессии и классификации. Это одна из самых лучших библиотек для компаний, работающих с огромным объемом данных — ее используют Evernote, OKCupid, Spotify и Birchbox.

Пример
визуализации частичной зависимости стоимости домов в Калифорнии в зависимости от особенностей местности:

Пример визуализации данных в Scikit-learn
Пример использования библиотеки Scikit-learn

TensorFlow

Библиотеку
создали в Google, чтобы заменить DistBelief — фреймворк для обучения, настройки и тренировки нейронных сетей. Благодаря этой библиотеке Google может определять объекты на фотографиях, а приложение для распознавания голоса — понимать речь.

Пример
архитектуры сверточной нейронной сети:

Пример работы с библиотекой Tensorflow

Keras

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

Пример
кода обучения модели по классификации изображений:

Пример использования библиотеки Keras

Анализ данных в Pandas

Пошаговая инструкция по анализу данных на Python.

  1. Создание блокнота в Google Colab

    На сайте
    Google Colab сразу появляется экран с доступными блокнотами. Создадим новый блокнот:

    Google Colab

  2. Импортирование библиотеки

    Pandas недоступна в Python по умолчанию. Чтобы начать с ней работать, нужно ее импортировать с помощью этого кода:

    import pandas as pd

    df.groupby('Баллы_new').median() pd

    — это распространенное сокращенное название библиотеки. Далее будем обращаться к ней именно так.

  3. Загрузка данных df.groupby('Баллы_new').mean()

    В качестве тренировочного набора данных будем использовать « рассчитаем среднее значение по каждой группе Отчет об уровне счастья

    » в разных странах за 2019 год (World Happiness Report). Открыть его можно двумя способами.

    Загрузка в сессионное хранилище



    И прочитать с помощью такой команды:

    Рассчитаем медиану в Pandas

    Создать объект типа DataFrame вручную

    Сводные таблицы Pandas Например, если есть несколько списков и нужно соединить их в одну таблицу или если хотите наглядно оформить небольшой набор данных.

    Это можно сделать через словарь и через преобразование вложенных списков (фактически таблиц).


    Сортировка данных

    Просмотр данных

    Загруженный файл преобразован во фрейм и теперь хранится в переменной df
    . Посмотрим, как он выглядит, с помощью метода . head()
    , который по умолчанию выводит пять первых строк: df.sort_values(by = 'ВВП на душу населения', ascending=False)

    как сделать сортировку по убыванию

    Если нужно посмотреть на другое количество строк, оно указывается в скобках, например
    . Последние строки фрейма выводятся методом df.groupby('Баллы_new').sum()

    .

    посчитаем сумму значений в каждой группе Также чтобы просто полностью красиво отобразить датасет, используется функция

    . По умолчанию в Jupyter Notebook, если написать имя переменной на последней строке какой-либо ячейки (даже без ключевого слова

    display
    ), ее содержимое будет отображено.

    display(df) #эквивалентно команде df,
    е сли это последняя строка ячейки

  • Узнать размер датасета

    Количество строк и столбцов в датафрейме можно узнать, используя метод .shape:

  • Переименование столбцов

    Названия столбцов можно переименовать под себя с помощью команды rename
    :

    image-2

  • Характеристики датасета

    Чтобы получить первичное представление о статистических характеристиках нашего датасета, достаточно этой команды: df.describe()

    АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

    Обзор содержит среднее значение, стандартное отклонение, минимум и максимум, верхние значения первого и третьего квартиля и медиану по каждому столбцу.

  • Узнать формат и количество значений

    Еще одна команда показывает другую справку: сколько значений в каждом столбце (в нашем случае в столбцах нет пропущенных значений) и формат данных: df.info()
    АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

  • Библиотеки для интеллектуального анализа и обработки естественного языка

    Полезные иблиотеки для работы с текстом, которые используются для извлечения данных из интернет-ресурсов и обработки естественного языка.

    Scrapy

    Библиотека
    используется для создания ботов-пауков, которые сканируют страницы сайтов и собирают структурированные данные: цены, контактную информацию и URL-адреса. Кроме этого, Scrapy может извлекать данные из API.

    Пример кода для создания бота-паука:

    Пример использования библиотеки Scrapy

    NLTK (Natural Language Toolkit)

    Набор библиотек
    для обработки естественного языка. Основные функции: разметка текста, определение именованных объектов, отображение синтаксического дерева, раскрывающего части речи и зависимости.

    Например, так выглядит обучение
    классификатора, который будет определять тональность текста:

    АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

    Pattern

    Пример
    визуализации графа:

    Пример визуализации в Pattern
    Пример использования библиотеки Pattern

    Закрепление знаний на практике

    АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

    К этой ступени вы подходите с необходимыми знаниями для начала аналитической работы с Python. Осталось их закрепить и приумножить на практике. Мы знаем три способа попратиковаться с пользой: участвовать в конкурсах Kaggle, придумать и решить задачу самому, пройти практический курс.

    Участвовать в конкурсах.
    Kaggle часто проводит конкурсы по анализу данных. Советуем сначала участвовать в конкурсах без призов, потому что они самые простые. И со временем перебираться к более сложным.

    Вряд ли в реальной работе вам встретятся задачи похожие на те, что вы решали на конкурсах, зато потренируетесь в нахождении верных путей решения.

    Если такой способ практики вам подходит, почитайте руководство, как участвовать в конкурсах Kaggle, — The Beginner’s Guide to Kaggle
    .

    Придумать и решить задачу самому.
    Давайте представим маркетолога, который устал допоздна засиживаться на работе из-за того, что приходится вручную собирать и обрабатывать данные и делать на их основе наглядные отчеты. Чтобы упростить себе работу и возвращаться вовремя домой, он ставит задачу — автоматизировать этот процесс, используя Python, и решает ее.

    Подобным образом вы находите то, что затрудняет вам работу, и придумываете, как это устранить. Единственное, что вам может помешать, — это незнание последовательности действий. От этого вы можете пропустить необходимые шаги и потерпеть неудачу. Либо застрять посередине, не зная, как действовать дальше.

    Если это произойдет, воспользуйтесь способом ниже.

    Пройти практический курс
    . Под практическим курсом мы понимаем получение необходимых знаний и закрепление их на реальной задаче под присмотром наставника.

    Мы не стали искать подобные курсы у других, а сделали свой. Называется он «Курс по Pytnon для анализа данных»
    . Участники изучат Python и научатся использовать его для анализа данных на примере реальных бизнес-задач.

    Теперь вы знаете, в каком направлении двигаться, чтобы научиться использовать Python для анализа данных. Если сомневаетесь, что осилите это самостоятельно, приходите к нам на курс.

    Требования и план разработки

    При построении нужно предусмотреть добавление функций для анализа данных, если возникнет потребность расширить пул анализируемых параметров. Возможность вызывать, как отдельную функцию с конкретным анализом, так и все сразу. Функции должны перебирать каждый столбец в DateFrame.

    Подумав над решением пришел к выводу, что понадобиться класс, в котором инициализируются переменные, которые будут доступны всем функциям. Графически вижу это так:

    Графическое изображение плана разработки класса
    Графическое изображение плана разработки класса

    Подумал, как выстроить алгоритм для анализа столбцов. На вход функция получает таблицу с данными, анализирует через цикл каждый столбец. По итогу должна родиться строка с результатом. Один столбец = одной строке с результатом.

    Функция должна иметь возможность быть вызвана независимо от других, следовательно, чтобы удовлетворить это требование результатом работы (return) должен быть DateFrame

    Графическое изображение алгоритма работы функции для анализа
    Графическое изображение алгоритма работы функции для анализа

    Функция вывода всех результатов анализа, решил построить следующим образом

    Графическое изображение алгоритма работы функции для сбора всего анализа
    Графическое изображение алгоритма работы функции для сбора всего анализа

    Заключение

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

    Код и данные на GitHub

    Результат

    Тестируем на реальных данных. Вызовем весь анализ. Размер таблицы (7043, 24)

    Вывод функции AnalysisOfDf
    Вывод функции AnalysisOfDf

    Посмотрим, как работает отдельно функция по анализу типов данных

    Вывод функции AnalysisOfType
    Вывод функции AnalysisOfType

    Оцените статью