Шаблон Data Science

Шаблон для практики в области науки о данных с 6 простыми шагами

Практика науки о данных

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

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

Практический цикл

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

  1. Найдите набор данных, содержащий проблему или проблему.
  2. Выберите вопрос о таком наборе данных, на который можно ответить с помощью фундаментальной науки о данных.
  3. Очистить данные
  4. Проведите базовый анализ данных, чтобы ответить на вопрос, который у вас был изначально.
  5. Представьте результаты в каком-либо стандартном формате, например в блокноте jupyter.
  6. Еще раз подумайте, действительно ли представленные вами результаты отвечают на ваш вопрос и что можно улучшить.

Практический пример

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

1. Найдите набор данных

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

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

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

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

Теперь мой процесс прост:

  • Выберите слово, связанное с тем, что меня интересует (на этот раз я выбрал обучение)
  • Используйте api kaggle для поиска доступных наборов данных, содержащих это конкретное слово, и загрузите его.

Он не на 100% случайный, а достаточно случайный, чтобы я не чувствовал трения, которое могло бы сделать меня менее продуктивным. Команда для поиска набора данных по ключевому слову с помощью kaggle api:

kaggle datasets list -s learning

Выход:

ref    title    size    lastUpdated    downloadCount    voteCount    usabilityRating  
kaggle/kaggle-survey-2018                                       2018 Kaggle Machine Learning & Data Science Survey    4MB  2018-11-03 22:35:07          14892        965  0.85294116       
kaggle/kaggle-survey-2017                                       2017 Kaggle Machine Learning & Data Science Survey    4MB  2017-10-27 22:03:03          22297        821  0.8235294        
alopez247/pokemon                                               Pokémon for Data Mining and Machine Learning        715KB  2017-03-05 15:01:26          10102        234  0.85294116       
rocki37/open-university-learning-analytics-dataset              Open University Learning Analytics Dataset           84MB  2018-10-27 22:30:00           3595        124  0.7058824        
rohan0301/unsupervised-learning-on-country-data                 Unsupervised Learning on Country Data                 5KB  2020-06-17 07:45:45           3956         79  0.8235294        
.
.
.
.
.

Из предложенных вариантов я выбрал open-university-learning-analytics-dataset. Для его загрузки я использовал:

kaggle datasets download rocki37/open-university-learning-analytics-dataset 

Затем я разархивировал данные и сохранил их в папке с именем: learning_analytics

unzip -d open-university-learning-analytics-dataset.zip learning_analytics

2. Выберите вопрос

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

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

Теперь посмотрим на данные:

df_scores

df_assessments

df_student_info

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

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

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

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

  • Каков средний балл студентов?
  • Какой средний балл по региону?
  • Каково распределение «сданных» и «не сдавших экзамен» по каждому экзамену?
  • Какое время является идеальным для сдачи работы, чтобы повысить шансы на сдачу экзамена?
  • Есть ли связь между возрастом и успеваемостью?
  • Могу ли я написать двоичный классификатор, который предсказывает, сдаст ли студент, учитывая всю доступную информацию о студенте и курсе?
  • Есть ли связь между количеством кредитов, изученных до этого момента, и успеваемостью ученика?

Как видите, есть много возможных вопросов, которые можно задать о данном наборе данных. Итак, с чего начать? Стоит ли мне начать отвечать на все? Стоит ли начинать с самых простых?

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

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

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

Идея здесь состоит в том, чтобы выбрать повествование, которое можно резюмировать вопросом, и заполнить пробелы в повествовании (например, строительные блоки истории) более мелкими вопросами. которые образуют сплоченную структуру.

Для целей этой статьи давайте будем простыми. У меня будет следующий вопрос: Какие основные факторы влияют на результативность курса?

3. Очистите данные.

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

Наиболее важными моментами здесь будет удаление NaN и столбцов, которые не будут способствовать анализу, и объединение таблиц в одну, в которой есть все столбцы с соответствующей информацией. Я буду использовать следующие вспомогательные функции:

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

# Output:
df_student_info
Column: code_module
Number of NaNs: 0
Column: code_presentation
Number of NaNs: 0
Column: id_student
Number of NaNs: 0
Column: gender
Number of NaNs: 0
Column: region
Number of NaNs: 0
Column: highest_education
Number of NaNs: 0
Column: imd_band
Number of NaNs: 1111
Column: age_band
Number of NaNs: 0
Column: num_of_prev_attempts
Number of NaNs: 0
Column: studied_credits
Number of NaNs: 0
Column: disability
Number of NaNs: 0
Column: final_result
Number of NaNs: 0
***
df_scores
Column: id_assessment
Number of NaNs: 0
Column: id_student
Number of NaNs: 0
Column: date_submitted
Number of NaNs: 0
Column: is_banked
Number of NaNs: 0
Column: score
Number of NaNs: 173
***
df_assessments
Column: code_module
Number of NaNs: 0
Column: code_presentation
Number of NaNs: 0
Column: id_assessment
Number of NaNs: 0
Column: assessment_type
Number of NaNs: 0
Column: date
Number of NaNs: 11
Column: weight
Number of NaNs: 0
***

Теперь давайте удалим записи NaN из соответствующих столбцов, а также удалим нерелевантные столбцы: code_presentation и is_banked.

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

Давайте посмотрим, что у нас есть на данный момент:

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

  • CMA: оценка с пометкой компьютера
  • TMA: репетитор отметил оценку
  • Exam: экзамен или экзамены по курсу

Взглянем на df_scores:

df_scores

Отлично, теперь давайте объединим все вместе в один фрейм данных, используя метод merge() и удалив результирующие записи NaN из столбцов score и studied_credits:

# Output
5768
0
7480
0
df_merged

В заключение изменим столбец imd_band на числовой:

4. | 5. Базовый анализ и представление результатов.

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

Учитывая, что меня интересуют факторы, связанные с оценкой учащихся, давайте начнем с рассмотрения распределения оценок:

Теперь давайте посмотрим на баллы по различным типам оценивания:

Давайте посмотрим на средний балл по каждому типу оценивания:

# Output:
Average score for TMA
72.5633924663878
Average score for CMA
81.02705346888426
Average score for Exam
63.546800382043934

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

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

pearsonr(df_merged["score"],df_merged["studied_credits"])
# Output
(-0.05601315081954174, 1.2536559468075267e-134)

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

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

pearsonr(df_merged["date_submitted"],df_merged["score"])
# Output
(-0.020750337032287382, 6.150386473714662e-20)

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

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

Давайте начнем с числа сдавших экзамен и числа сдавших экзамен или отказавшихся от участия:

print(f"Number of people that passed the course: {len(df_pass)}")
print(f"Number of people that failed the course: {len(df_fail)}")
Number of people that passed the course: 137503
Number of people that failed the course: 56546

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

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

Как и ожидалось, распределение оценок для людей, которые не прошли, показывает пик в интервале 60–70, в то время как для людей, прошедших пик, составляет 100.

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

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

# Output
Ttest_indResult(statistic=91.87803726695681, pvalue=0.0)

Значительная разница в 30 дней. Круто, а теперь давайте посмотрим на уровень образования.

Самая большая разница, которую мы наблюдаем здесь, заключается в том, что в группе, не сдавшей экзамен (42,8%), пропорционально больше студентов с уровнем образования ниже А (42,8%) по сравнению с группой, которая проходит курс (33%).

Теперь посмотрим на возможные возрастные различия:

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

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

Здесь, когда мы смотрим на различия между регионами, мы видим небольшие различия: на 1,6% больше людей, живущих в Южном регионе, чувствуют себя лучше, а на 1,7% больше людей из Северо-Западного региона - хуже.

Наконец, давайте посмотрим на imd_band, который, по сути, является мерой бедности для небольших территорий и широко используется в Великобритании. Согласно этому отчету Департамента сообществ и местного самоуправления, индекс отражает процентное соотношение наиболее обездоленных к наименее обездоленным районам, так что по мере увеличения числа это означает, что район менее обездоленный, поэтому 10% наиболее обездоленных будут самыми бедными. площадь и 90-100% будет наименее бедной областью.

Здесь мы видим, что наибольшая разница составляет 0–10%, отражающих самый бедный район, где на 4,1% больше людей, которые терпят неудачу, прибывают из беднейшего района Великобритании, по сравнению с людьми, которые проходят.

Аналогично для группы 10–20%, где среди людей, потерпевших неудачу, 11,7% были из второго самого бедного региона Великобритании по сравнению с 9,4% в случае успешного прохождения.

Другой интересный аспект заключается в том, что на другой стороне спектра, в менее бедных районах, эти процентные значения меняются, и мы видим, что 10% сдавших экзамен людей были из менее бедных районов страны по сравнению с 7,3% в группе неудачников. То же самое для второй менее бедной области, где мы видим 10,2% людей, которые сдали экзамен, по сравнению с 8,2% в случае неудачи.

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

pearsonr(df_merged["imd_band"],df_merged["score"])
(0.08166717850681035, 2.3543308016802156e-284)

В общей группе студентов мы видим небольшую 8% -ную положительную корреляцию между оценкой успеваемости и показателем бедности.

Давайте посмотрим на эту корреляцию отдельно для успешных и неуспешных случаев:


pearsonr(df_pass["imd_band"],df_pass["score"])
(0.0642002991822996, 1.6041785827156085e-125)
pearsonr(df_fail["imd_band"],df_fail["score"])
(0.052778778980020466, 3.5499376419846515e-36)

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

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

Когда мы смотрим на обе группы, мы видим схожую тенденцию, но, что интересно, в группе неудач мы видим большую волатильность в интервале 20–70% и больший скачок производительности между интервалом 70–80% по сравнению с группой успешно.

Чтобы исследовать это дальше, давайте подберем линию регрессии для общей оценки производительности по отношению к IMD-рангу.

print(f"Slope of the Regression Line: {coef}")
# Output 
Slope of the Regression Line: [[0.05571216]]

Чтобы подтвердить эти результаты, давайте воспользуемся API statsmodels, чтобы получить значение p для регрессионного теста:

Мы наблюдаем, что мы получаем хорошее соответствие и что для каждого увеличения индекса депривации на один балл мы видим увеличение производительности примерно на 0,055, а также получаем значимый t-тест с p-значением <0,05.

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

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

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

6. Пересмотреть

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

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

  • Построение линии регрессии по отношению ко всей оценке и значениям рейтинга IMD ​​для получения информации о вариативности взаимосвязи между бедностью и показателями оценки
  • Изучение более подробной информации о статистических различиях между успешными и неудачными группами
  • Запуск моделей машинного обучения, таких как random forest и xgboost, для классификации учащихся на успешные или неуспешные с учетом доступной информации за вычетом фактических результатов успеваемости.

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

Блокнот с исходным кодом этого поста можно найти здесь.

Мысли о практике

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

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

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

Если вам понравился этот пост, свяжитесь со мной в Twitter, LinkedIn и подпишитесь на меня в Medium. Спасибо и увидимся в следующий раз! :)

использованная литература