(Большой) мастер-класс: как подойти к задаче Kaggle Analytics

Я должен согласиться с критиками: задачи аналитики Kaggle лишь отдаленно связаны с написанием реальных отчетов по анализу данных. Но мне они нравятся, потому что они могут многому вас научить основам рассказывания истории с помощью данных.

Проблемы Kaggle Analytics лишь отдаленно связаны с написанием реальных отчетов об анализе данных. Но [...] они могут многому вас научить […].

Эта статья изначально должна была быть полноценной статьей с абзацами и изображениями. Но в первом черновике уже было более 7000 слов, так что вместо этого вы получаете список.

В этой статье я делюсь «секретным соусом», благодаря которому я попал в пятерку лучших [1] из пяти задач Kaggle Analytics.

Не принимайте этот список за набор правил. Я не всегда следовал этим советам в своих предыдущих выигрышных блокнотах Kaggle. Вместо этого этот список представляет собой сборник уроков, которые я усвоил на этом пути.

Для этой статьи я предоставлю фрагменты кода на Python с функциями из библиотек Pandas, Matplotlib и Seaborn. Не стесняйтесь использовать любой язык программирования и дополнительные библиотеки визуализации, которые вам нравятся.

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

Подготовка

  1. Поймите разницу между исследовательским и объяснительным анализом данных.

«Когда мы проводим исследовательский анализ, это похоже на поиск жемчуга в устрицах. Возможно, нам придется открыть 100 устриц [...], чтобы найти две жемчужины. Когда мы доводим наш анализ до нашей аудитории, мы действительно хотим быть в объяснительном пространстве, то есть у вас есть конкретная вещь, которую вы хотите объяснить, конкретная история, которую вы хотите рассказать — возможно, об этих двух жемчужинах. ” — [3]

2. Прочитайте постановку задачи — поймите постановку задачи.

3. Получите обзор всего набора данных:

  • Какова файловая структура?
  • Сколько файлов содержит весь набор данных?
  • Какое отношение имеют файлы?
  • Что такое общие ключевые столбцы?

4. Получите обзор каждого файла в наборе данных с помощью df.info():

  • Сколько столбцов в файле?
  • Сколько строк в файле?
  • Что означают имена столбцов?
  • Какие типы данных у вас есть (например, числовые, категориальные, временные ряды, текст и т. д.)?

5. Прочтите описание набора данных.

6. Проверьте уникальные значения с помощью df.nunique() на правдоподобие и кардинальность.

7. Получите обзор отсутствующих значений.

# Display the percentage of missing values
df.isna().sum(axis = 0) / len(df) * 100
# Visualize the missing values
sns.heatmap(df.isna(),       
            cbar = False,    
            cmap = "binary") 

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

9. Будьте готовы к тому, что не каждый созданный вами график попадет в окончательный отчет. В любом случае делайте много сюжетов.

10. Вам нужны только три типа графиков одномерного анализа:гистограммы или диаграммы для числовых признаков и гистограммы (графики подсчета) для категориальных признаков.

# Explore numerical features
sns.histplot(data = df, 
             x = num_feature)
sns.boxplot(data = df, 
            y = num_feature)
# Explore categorical features
sns.countplot(data = df, 
              x = cat_feature)

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

12. Очистка данных и разработка признаков должны происходить естественно во время исследовательского анализа данных (EDA).

13. Числовые признаки могут быть замаскированы под категориальные признаки и наоборот.

14. Обращайте внимание на значения NaN, замаскированные под неправдоподобные значения (например, -1, 0 или 999). Иногда они проявляют себя как подозрительные пики в не вызывающих подозрений распределениях.

# Replace invalid values with NaN
invalid_value = 9999
df["feature"] = np.where((df["feature"] == invalid_value), 
                          np.nan, 
                          df["feature"])

15. Не игнорируйте выбросы. Вы просто можете найти что-то интересное.

16. Посмотрите на крайние случаи (верхние 5 и нижние 5).

17. Создавайте новые функции, либо разделяя одну функцию на несколько функций, либо сочетая несколько функций в новую.

# Splitting features
df["main_cat"] = df[feature].map(lambda x: x.split('_')[0])
df["sub_cat"] = df[feature].map(lambda x: x.split('_')[1])
df[["city", "country"]] = df["address"].str.split(', ', expand=True)
# Combining features
df["combined"] = df[["feature_1", "feature_2"].agg('_'.join, axis=1)
df["ratio"] = df["feature_1"] / df["feature_2"]

18. Создайте функции количества и длины из текстовых функций.

# Creating word count and character count features
df["char_cont"] = df["text"].map(lambda x: len(x))
df["word_count"] = df["text"].map(lambda x: len(x.split(' ')))

19. Функции datetime64[ns] содержат много новых функций:

# Convert to datetime data type
df["date"] = pd.to_datetime(df["date"], 
                            format = '%Y-%m-%d')
# Creating datetimeindex features
df["year"] = pd.DatetimeIndex(df["date"]).year
df["month"] = pd.DatetimeIndex(df["date"]).month
df["day"] = pd.DatetimeIndex(df["date"]).dayofyear
df["weekday"] = pd.DatetimeIndex(df["date"]).weekday
# etc.

20. Для координат первым числом всегда является широта, а вторым — долгота (но при построении координат широта соответствует оси y, а долгота — оси x).

# Splitting coordinates into longitude and latitude
df["lat"] = df["coord"].map(lambda x: x.split(", ")[0]))
df["lon"] = df["coord"].map(lambda x: x.split(", ")[1]))

21. Расширьте свой набор данных дополнительными данными. Это демонстрирует ваше творчество. У вас есть три варианта получения дополнительных данных (в порядке убывания усилий):

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

22. Не теряйте ценные данные при объединении двух фреймов данных. Кроме того, убедитесь, что написание ключевого столбца совпадает в обоих кадрах данных. Дважды проверьте свою работу, проверив длину полученного DataFrame с помощью len(df).



23. Просмотрите критерии оценки.

Исследовательский анализ данных

24. Примите тот факт, что вы (вероятно) не можете просмотреть все взаимосвязи в данных. Рассмотрение всех возможных комбинаций будет увеличиваться экспоненциально с (n + (n больше 2) + (n больше 3)), если n — количество функций.

25. Начните с построения нескольких (случайных) взаимосвязей — просто чтобы освоиться с данными.

26. Не тратьте время на создание причудливых визуализаций данных во время EDA (обещаю, мы вернемся к этому позже).

27. Знание предметной области — король. Проведите небольшое исследование, чтобы ознакомиться с темой.

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

29. Прежде чем приступить к многомерному анализу, получите обзор возможных взаимосвязей (но имейте в виду, что оба следующих метода будут учитывать только числовые характеристики).

# Display pair plot
sns.pairplot(df)
# Display correlation matrix
sns.heatmap(df.corr(),         
            annot = True,      
            fmt = ".1f",       
            cmap = "coolwarm", 
            vmin = -1,         
            vmax = 1)

30. Делайте заметки о своих выводах в виде маркированного списка после каждого графика.

31. Вам нужны только четыре типа графиков для двумерного анализа:

  • Диаграммы рассеяния для связи между двумя числовыми признаками
sns.scatterplot(data = df, 
                x = "num_feature_1", 
                y = "num_feature_2")
  • Блочные диаграммы для связи между категориальным и числовым признаком
sns.boxplot(data = df, 
            x = "cat_feature", 
            y = "num_feature")
  • Тепловые карты или гистограммы для связи между двумя категориальными функциями
temp = pd.crosstab(index = df["cat_feature_1"],
                   columns = df["cat_feature_2"])

# Bar chart
temp.plot.bar()
# Heatmap
sns.heatmap(temp, annot = True)

32. Метод groupby() — ваш друг для многомерного анализа.

# How many feature_1 per feature_2?
df.groupby("feature_2")["feature_1"].nunique()
# What is the average feature_1 for each feature_2?
df.groupby("feature_2")["feature_1"].mean()

33. Есть данные временных рядов? Проведите анализ тенденций с помощью линейных графиков.

sns.lineplot(data = df, 
             x = "time_feature", 
             y = "num_feature")

34. Вы можете проводить многомерный анализ без изучения новых графиков:

  • Диаграмма рассеяния с оттенком или размером для связи между тремя числовыми признаками
sns.scatterplot(data = df, 
                x = "num_feature_1", 
                y = "num_feature_2",
                hue = "num_feature_3")
sns.scatterplot(data = df, 
                x = "num_feature_1", 
                y = "num_feature_2",
                size = "num_feature_3")
  • Диаграмма рассеяния с оттенком или стилем для связи между двумя числовыми признаками и категориальным признаком
sns.scatterplot(data = df, 
                x = "num_feature_1", 
                y = "num_feature_2",
                style = "cat_feature")
sns.scatterplot(data = df, 
                x = "num_feature_1", 
                y = "num_feature_2",
                hue = "cat_feature")
  • Сгруппированные столбчатые диаграммы или диаграммы для связи между двумя категориальными признаками и числовым признаком
sns.barplot(data = df,
            x = "cat_feature_1", 
            y = "num_feature", 
            hue = "cat_feature_2")
sns.boxplot(data = df,
            x = "cat_feature_1", 
            y = "num_feature", 
            hue = "cat_feature_2")
  • Сгруппированные гистограммы с накоплением для связи между тремя категориальными признаками

35. Всегда сомневайтесь в своих выводах. Потратьте некоторое время на проверку работоспособности и перепроверьте свои графики на наличие ошибочных данных, таких как парадокс Симпсона[2].

«Явление, при котором тенденция появляется в разных группах данных, но исчезает или меняется на противоположную при объединении групп». — [2]

36. Читай, читай, читай. Расширьте свой EDA с помощью исследований.

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

38. Потратьте минуту, чтобы убедиться, что вы правильно интерпретируете сюжеты.

39. Убедитесь, что у вас достаточно сюжетов (или идей, чтобы построить на их основе историю).

40. Рефакторинг вашего кода. Это помогает вам обнаруживать ошибки и делает ваш код более доступным и воспроизводимым для вашей аудитории.

41. Ничего страшного, если разнообразие визуализаций данных на данном этапе не впечатляет.

Объяснительный анализ данных

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

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

44. Запись для задачи Kaggle Analytics — это не набор графиков. Она нуждается во вступлении, основной части и заключении.

45. Создайте план на основе ваших выводов.

46. ​​Пока что не стесняйтесь отказываться от большинства своих планов.

47. Расскажите аудитории о наборе данных. С какими данными вы работаете? Сколько точек данных имеется? Вы добавили внешние данные?

48. Объясните, что вы сделали.

49. Покажи то, чего ты не видел. У вас была интересная гипотеза, но данные ее не подтверждали? Покажите это и обсудите.

50. Не ставьте точку только потому, что вы считаете визуализацию данных крутой. Если находка не имеет отношения к общей истории, которую вы рассказываете, вырежьте ее.

51. Напишите первый черновик.

52. Настало время причудливых сюжетов (видите, я сдержал свое обещание).

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

54. Еще раз проверьте, подходит ли используемая вами метрика для того, что вы хотите показать. Например, чтобы измерить популярность платформы, вы бы использовали общее количество учетных записей или среднее количество активных пользователей в день?

55. Избегайте тщеславных показателей.

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

57. Решите, какую визуализацию данных использовать, исходя из того, что (распределение, взаимосвязь, состав, сравнение) вы хотите показать.

58. Лучше всего использовать эти шесть типов графиков и их разновидности: гистограммы, тепловые карты, гистограммы, диаграммы рассеяния, ящичные диаграммы и линейные графики.

59. Помните, что отдельные числа и таблицы тоже могут быть визуализацией данных.



60. Пожалуйста, не используйте круговые диаграммы. Кроме того, пожалуйста, не используйте кольцевые диаграммы. Если ваш участок назван в честь десерта, не используйте егокогда вы это сделаете, знайте, что вы не должны это делать).

61. Замените облака слов гистограммами.

62. Пожалуйста, пожалуйста, не используйте 3D-эффекты.

63. Используйте картограммы намеренно (а не только потому, что у вас есть географические данные).

64. Определите цветовую палитру. Имейте по крайней мере один основной цвет и один контрастный цвет.

# Set color theme
highlight_color = "#1ebeff"
contrast_color = '#fae042'
from matplotlib.colors import LinearSegmentedColormap
custom_palette = LinearSegmentedColormap.from_list(" ",  [highlight_color,  '#ffffff', contrast_color])
plt.cm.register_cmap("custom_palette", custom_palette)

65. Убедитесь, что вы используете правильную цветовую палитру для вашей цели:

  • Последовательно для упорядоченных значений (например, 1, 2, 3, …, )
  • Расхождение для противоположных значений с нейтральным средним значением (например, -1, 0, 1)
  • Качественный для категориальных значений

66. Серый — ваш друг, когда вам нужно отвлечь внимание от контекстной информации.

67. Убедитесь, что ваши цвета безопасны для дальтоников и фотокопирования.



68. Визуализируйте как взрослый: добавьте заголовок и метки к своему сюжету.

69. Добавьте легенду, если она подходит.

70. Установите подходящий размер шрифта.

plt.rcParams.update({"font.size": 14}) 

71. Будьте проще. Удалите все отвлекающие факторы и лишнее из сюжета.

72. Не начинайте количественную ось ваших гистограмм нигде, кроме 0.

73. Не сравнивайте два графика с разными диапазонами осей.

74. Не вводите аудиторию в заблуждение визуализацией данных. игнорируя 72. и 73.

75. Добавляйте аннотации прямо на график.

ax.annotate("Annotation text", 
            xy = (x_pos, y_pos))

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

77. Используйте предварительную обработку.

78. Думайте «сначала мобильные» (потому что большая часть вашей аудитории будет читать ваш отчет на своем телефоне).

79. Посмотрите на каждую визуализацию данных. Передает ли он сообщение без контекста? Если нет, то пересмотреть.

Последние штрихи

80. Напишите второй черновик.

81. Визуализация данных всегда должна сопровождаться текстом. Превратите маркеры в текст. Одними сюжетами этого не сделаешь.

82. Пересмотрите и отредактируйте свой второй черновик.

83. Используйте привлекающее внимание изображение в начале вашего отчета. (Вы можете найти отличные фотографии на Unsplash, но не забудьте указать свой источник.)

84. Никто не хочет видеть ваш код — прячьте его.

85. Также скройте предупреждения консоли.

import warnings # Supress warnings
warnings.filterwarnings("ignore")

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

87. Руководствуйтесь инсайтами. Никто не будет читать каждое слово вашего отчета. Добавьте краткое изложение в виде маркированного списка в начале.

88. Используйте жирный шрифт, чтобы выделить важные моменты в вашем тексте (потому что никто не будет читать каждое слово вашего отчета).

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

90. Используйте проверку орфографии. Мне нравится Грамматика.

91. Убедитесь, что вы отметили все флажки критериев оценки задач.

92. Уф, эмодзи. Люби их или ненавидь — только пообещай мне не переусердствовать, хорошо?

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

94. Укажите свои источники.

95. Потратьте некоторое время на то, чтобы придумать хорошее название.

96. Попросите друга просмотреть ваш отчет и/или прочитать его вслух.

97. Оставьте отчет на несколько дней.

98. Дайте вашему отчету окончательную оценку.

99. Отпустите перфекционизм и подчинитесь.

Понравилась эта история?

Если вы хотите получать мои новые истории прямо на свой почтовый ящик, не забудьте подписаться!

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



Найди меня в LinkedIn и Kaggle!

Рекомендации

[1] Ниже я перечислил свое портфолио отмеченных наградами ноутбуков Kaggle для справки:

[2] geckoboard, Ошибки данных. gekoboard.com. https://www.geckoboard.com/best-practice/statistical-fallacies/ (по состоянию на 14 августа 2022 г.)

[3] Нуссбаумер Кнафлик, К. (2015). Рассказывание историй с помощью данных. Джон Уайли и сыновья.