Pandas. Корректно ли сделал решения?

Есть дата-фрейм (картинка со структурой во вложении)введите сюда описание изображения:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32561 entries, 0 to 32560
Data columns (total 15 columns):
Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 32561 non-null int64

1 workclass 32561 non-null object

2 fnlwgt 32561 non-null int64

3 education 32561 non-null object

4 education-num 32561 non-null int64

5 marital-status 32561 non-null object

6 occupation 32561 non-null object

7 relationship 32561 non-null object

8 race 32561 non-null object

9 sex 32561 non-null object

10 capital-gain 32561 non-null int64

11 capital-loss 32561 non-null int64

12 hours-per-week 32561 non-null int64

13 native-country 32561 non-null object

14 salary 32561 non-null object

dtypes: int64(6), object(9)

Вот так я решал ( или подсмотрел ) решения заданий:

  • Шаг 1. Загрузить данные с файла расширения csv (adult.data.csv) -

Изучить содержание признаков

df.head()

Определить количество строк, колонок

df.shape
  • Шаг 2. Провести очистку данных -

Выполнить проверку на пустые значения (достаточно ли этого?)

df.isnull().sum()

Определить типы данных

df.info()

Поиск дубликатов ( возможно ли задать больше подробностей? )

df.duplicated().sum()

Поиск аномалий ( хотелось бы вывести более полную информацию )

for i in df.columns:
    print(i)
    print(df[i].unique(), '\n')
  • Шаг 3. С помощью библиотеки Pandas ответить на несколько вопросов по данным набора Adult по доходу населения, каждый объект которого содержит социальные характеристики некоторого человека (возраст, пол, профессиональная деятельность и т.п.) -
  1. Сколько неженатых граждан (признак relationship = Unmarried) представлено в этом наборе данных? ( не уверен, что это полное решение )
df[df['marital-status'] == 'Never-married']['marital-status'].value_counts()
  1. Каков средний возраст (признак age ) женщин (признак sex = Female)), которые зарабатывают много? ( признак salary = >50K) ( решение кажется логичное, но получаю: nan )
df[(df['sex'] == 'female') & (df['salary'] == '>50K')]['age'].mean()
  1. Какое наибольшее количество часов человек работает в неделю? (признак hours-per-week)
df['hours-per-week'].describe()['max']
  1. Сколько граждан много зарабатывают (признак salary = >50K), которые закончили 9 классов? (признак education = 9th)
df[(df['education'] == '9th') & (df['salary'] == '>50K')]['salary'].value_counts()
  1. Посчитайте среднее время работы (признак hours-per-week) зарабатывающих мало и много (признак salary).
df.pivot_table( ["hours-per-week"], ["salary"], aggfunc="mean", ).head()
  • Шаг 4. Написать код для записи результатов в файл с разделителями (csv) -
df.to_csv('my_written_file.csv ', sep=',')

Пожалуйста, проверьте и поправьте решения.

Не хватает четкости понимания и хотелось оформить выводы как-то более красиво и полнее - тут у меня ступор.

Мой уровень "начинающий" и многие моменты "плывут".

Не могу найти русскоязычной литературы или онлайн-ресурсы где бы это всё последовательно разжевывалось от простого к сложному по всем темам (особенно изложенным выше).


Ответы (1 шт):

Автор решения: CrazyElf

Ну тут явных прямо ошибок может и нет, но есть некоторые непонятки.

  • Например, вопрос "что такое аномалии" - он не тривиальный. Вот тот value_counts, который вы мне кажется не везде к месту применяете, как-раз для выявления аномалий мог бы и пригодиться, но только для категориальных признаков. Те категориальные значения, доля которых мала (долю можно взять через параметр normalized=True) - могут быть аномалиями. А вот для непрерывных значений может быть нужно уже смотреть квантили или ещё какие-то статистики и что там выходит за рамки этих статистик, там просто уникальными значениями можно не обойтись.
  • Вообще mean по умолчанию значения NA не должен учитывать, значит скорее всего у вас получилась пустая выборка, если на выходе NA. Значит нужно проверять оба условия по отдельности и смотреть, работают они или нет, может что-то напутано (например, в строке >50K может быть русская буква K, а может быть английская). Если по отдельности они работают, значит возможно у вас просто нет таких строк в датасете, где выполняются оба условия вместе.
  • Там, где нужно взять просто количество одинаковых значений и значение одно, там излишне использовать .value_counts(), а можно взять .shape[0], например.

Ну и по мелочи ещё что-то было, без самих данных, довольно сложно так "на пальцах" анализировать код.

→ Ссылка