Save 37% off PRO during our Black Friday Sale! »

Большие данные - лекция-4 - Титаник + Matplotlib + Pandas

3a855e4e8dd144b8942da2463831a067?s=47 Anton
March 06, 2019

Большие данные - лекция-4 - Титаник + Matplotlib + Pandas

Визуализация данных с pandas и matplotlib

Обновлено: 05.03.2020

3a855e4e8dd144b8942da2463831a067?s=128

Anton

March 06, 2019
Tweet

Transcript

  1. Визуализация данных в Python: pandas+matplotlib

  2. matplotlib.org • pip install --user matplotlib • github.com/matplotlib/matplotlib • много

    примеров: > examples: matplotlib.org/gallery/index.html
  3. None
  4. None
  5. None
  6. None
  7. None
  8. None
  9. None
  10. None
  11. None
  12. None
  13. None
  14. None
  15. None
  16. None
  17. None
  18. None
  19. None
  20. None
  21. None
  22. 3d: Matplotlib vs Mayavi • Matplotlib — 3d не настоящее

    (проблемы проявляются при пересечении плоскостей и фигур) • Mayavi — настоящий OpenGL При этом • API matplotlib достаточно удобен и интуитивен • С Mayavi нужно привыкнуть к тому, что некоторые вещи сделаны не так, как можно ожидать
  23. Matplotlib axis-3d

  24. Mayavi

  25. Seaborn seaborn.pydata.org • Библиотека визуализации данных, на базе matplotlib •

    Больше графиков • Некоторые графики те же, что и matplotlib, но симпатичнее
  26. Еще любопытно

  27. Круговые диаграммы circos.ca (Perl)

  28. Просто Matplotlib

  29. import matplotlib.pyplot as plt import numpy as np X =

    np.linspace(0,1) Y = X**3 - X**2 - 2 plt.plot(X, Y) plt.show()
  30. Pandas + Matplotlib: pivot_table + plot

  31. Titanic plots: pandas + matplotlib • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame .pivot_table.html •

    pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame .plot.html
  32. Также пригодятся • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.html • pandas.pydata.org/pandas- docs/stable/reference/api/pandas.Series.html • numpy.org/doc/1.18/reference/index.html

    numpy.org/doc/1.18/reference/routines.html numpy.org/doc/1.18/reference/routines.math.html numpy.org/doc/1.18/reference/routines.statistics.html ...
  33. Колонки • PassengerId — порядковый номер записи • Survived —

    выжил/погиб • Pclass — класс билета: 1/2/3 • Name — имя • Sex — пол: male/female • Age — возраст
  34. Колонки • SibSp — количество родных братьев и сестер (siblings)

    и супругов (spouses) на борту судна • Parch — количество детей и родителей на борту судна • Ticket — номер билета • Fare — стоимость проезда • Cabin — номер каюты • Embarked — порт посадки: C = Cherbourg (Шербур, Франция), Q = Queenstown (Квинстаун, Ирландия), S = Southampton (Саутгемптон, гр. Гэмпшир, Англия)
  35. Pandas + Matplotlib: pivot_table + plot • Генерируем сводную таблицу

    с DataFrame.pivot_table • Рисуем график с DataFrame.plot • Под капотом Matplotlib
  36. titanic-plot.py # coding=utf-8 import pandas import numpy as np import

    matplotlib.pyplot as plt # PassengerId Survived Pclass Name Sex Age # SibSp Parch Ticket Fare Cabin Embarked data = pandas.read_csv('titanic-train.csv')
  37. titanic-plot.py # Pclass → Survived print("#### Pclass -> Survived") #

    Сформировать сводную таблицу pivot = data.pivot_table(values='PassengerId', index='Pclass', columns='Survived', aggfunc='count') print(pivot)
  38. #### Pclass -> Survived Survived 0 1 Pclass 1 80

    136 2 97 87 3 372 119
  39. pandas.DataFrame.pivot_table • Pivot table — сводная таблица • Результат DataFrame.pivot_table

    — объект DataFrame • values: колонка исходной таблицы — значения, которые будут сгруппированы в сводной таблице • index: колонка исходной таблицы — первая колонка сводной таблицы, уникальные значения колонки исходной таблицы — ключи для группировки в сводной таблице • columns: колонка исходной таблицы — колонки сводной таблицы, уникальные значения колонки исходной таблицы — колонки сводной таблицы • aggfunc: функция группировки значений values
  40. pandas.DataFrame.pivot_table:aggfunc • Операция аггрегирования — функция (или набор функций), применяемая

    к столбцу value • Если строка, то функция из Series (он же — одномерный ndarray) (??) 'sum', 'mean', 'count', 'min', 'max' и т. п. • Или функция из Numpy (без кавычек): np.xxx np.sum, np.mean, np.min и т. п. (те, которые принимают на входе массив, а на выходе дают число?) • Может быть собственная функция • По умолчанию: numpy.mean (np.mean)
  41. titanic-plot.py # Построить график pivot.plot(title="Pclass -> Survived", kind='bar', stacked=True) #

    Показать график plt.show()
  42. None
  43. titanic-plot.py # Построить график pivot.plot(title="Pclass -> Survived", kind='bar', stacked=False) #

    Показать график plt.show()
  44. None
  45. Замечание • Matplotlib на Python 2.7 по умолчанию не дружит

    с юникодом • Например, если в заголовок plot:title добавить что-то на русском, получим: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128) • С Python 3 — всё ок
  46. pandas.DataFrame.plot:kind : str • ‘line’ : line plot (default) •

    ‘bar’ : vertical bar plot • ‘barh’ : horizontal bar plot • ‘hist’ : histogram • ‘box’ : boxplot • ‘kde’ : Kernel Density Estimation plot • ‘density’ : same as ‘kde’ • ‘area’ : area plot • ‘pie’ : pie plot • ‘scatter’ : scatter plot • ‘hexbin’ : hexbin plot
  47. None
  48. None
  49. None
  50. None
  51. Самостоятельно: построить графики • Sex → Survived • Age →

    Survived • Parch → Survived* (см дальше) • SibSp → Survived • Embarked → Survived • Fare → Survived** (см далее)
  52. None
  53. None
  54. None
  55. Parch → Survived (дети и родители)

  56. None
  57. None
  58. None
  59. Parch → Survived • Проблема: в правых колонках ничего не

    видно • Левая колонка слишком высокая, поэтому правые колонки слишком низкие • Задание: придумать, как сделать так, чтобы было видно и правую и левые колонки • Решение: использовать логарифмическую шкалу по вертикальной оси
  60. Всё ли хорошо?

  61. Подводный камень: • Логарифмическая шкала может исказить соотношение размеров блоков

    внутри одной колонки • Решение: включить логарифмическую шкалу, выключить режим стека
  62. Теперь нормально

  63. SibSp → Survived (близкие родственники)

  64. None
  65. None
  66. SibSp → Survived • На графиках видно, что если у

    человека более 3-х родственников на корабле, его шансы на выживание заметно уменьшаются • Творческое задание: попробуйте найти этому объяснение, подтвердите дополнительными графиками • Примеры гипотез: - Они искали родственников, не хотели садиться на шлюпки поодиночке - Большие семьи ехали 3-м классом, поэтому у них было больше шансов погибнуть, как и у остальных в 3-м классе - Внутри 3-го класса у больших семей было больше шансов погибнуть - Это статистическая погрешность
  67. None
  68. Обсуждение • Распределение классов по портам посадки Embarked (определить по

    графику, где Англия, где Франция, где Ирландия? — исторический контекст) • В каких классах больше людей ехали с семьями?
  69. Fare → Survived (цена билета)

  70. None
  71. None
  72. Fare → Survived • На первый взгляд должен подтверждать график

    Pclass • Но значений по X слишком много: со столбиками месиво, линии не спасают • Задача: придумать подходящий способ визуализации