Изучение закономерностей доходов с помощью Python Pandas, Matplotlib и Seaborn.
Простой и понятный для начинающих метод разведочного анализа данных переписи населения США.
Делиться

Когда мы говорим о доходах, мы склонны приписывать успех упорному труду и интеллекту. В других случаях мы просто предполагаем, что некоторым людям просто повезло, и, несмотря на низкий уровень образования или отсутствие опыта, они смогли добиться успеха в своей профессии и комфортно зарабатывать. Однако истина находится где-то посередине между этими двумя крайностями. Да, некоторым людям действительно везет, и они становятся миллионерами в молодом возрасте, но мы также видим людей, которые упорно работают, чтобы подняться по карьерной лестнице, и прилагают усилия там, где это необходимо для профессионального роста и, следовательно, увеличения дохода.
В этой статье мы будем использовать Python для изучения взаимосвязи дохода с различными факторами, а именно возрастом, полом, профессией, уровнем образования и т. д. Хотя в наше время мы можем проводить анализ с помощью ИИ, строить графики и извлекать полезную информацию, очень важно знать, как извлекать полезную информацию из необработанных данных, сочетая человеческий анализ с вычислительными мощностями. Это руководство по Python для начинающих, требующее определенных предварительных знаний основ Python. Используя Python и его мощные библиотеки для обработки данных, мы выявим некоторые предсказуемые закономерности, которые помогут нам получить представление о факторах, влияющих на доход в целом, в соответствии с используемым нами набором данных!
Проект
В этом проекте мы с помощью Python изучим набор данных переписи населения и воспользуемся мощными библиотеками для анализа данных, такими как pandas, matplotlib и seaborn, чтобы выявить закономерности в доходах. Используя инструменты очистки данных, визуализации данных и исследовательского анализа, мы преобразуем эти необработанные данные в ценные сведения о том, какие факторы влияют на доход и в какой степени. Это проект для начинающих и пользователей среднего уровня программирования на Python, и от вас ожидается знание основных принципов Python, особенно того, как импортировать и использовать функции из различных библиотек для исследования и анализа данных.
Набор данных
В этом проекте мы будем использовать набор данных о доходах взрослого населения США, представляющий собой реальные данные, полученные в результате переписи населения США. Хотя этот набор данных относится к 1990-м годам, мы можем использовать его для анализа структуры доходов с учетом того, что за 30 лет ситуация изменилась, особенно в отношении ранее существовавшего гендерного разрыва. Этот набор данных содержит демографическую информацию и данные о занятости, включая возраст, профессию, уровень образования, семейное положение, пол, рабочее время и т.д., большая часть которых имеет важное значение для целей нашего проекта. Этот набор данных находится в открытом доступе и широко используется в образовательных и исследовательских проектах.
Набор данных: Данные о доходах взрослого населения по переписи населения
Источник: Репозиторий машинного обучения UCI (CC BY 4.0)
Исходные данные получены из базы данных Бюро переписи населения США.
Итак, начнём!
Инициализация среды программирования
Прежде чем начать, давайте убедимся, что наша среда разработки настроена должным образом. Для этого убедитесь, что Python установлен в вашей системе, и откройте любую IDE по вашему выбору. Я буду использовать PyCharm из-за его удобства для начинающих и доступности пакетов.
Для начала создадим новый проект под названием «Анализ структуры доходов взрослых» и напишем файл main.py на языке Python. Именно здесь мы будем писать код.
Установка и импорт соответствующих библиотек
Далее установим необходимые библиотеки/пакеты Python. Для исследования и анализа данных мы будем использовать следующие библиотеки:
- Pandas — одна из самых популярных библиотек, помогающая работать с табличными данными, такими как CSV-файлы.
- Matplotlib — эта библиотека Python позволяет создавать графики, диаграммы и другие средства визуализации данных.
- Seaborn — это библиотека, построенная на основе matplotlib, которая значительно расширяет возможности визуализации данных, упрощая и делая более привлекательными диаграммы и графики.
Мы установим указанные выше библиотеки, используя опцию терминала в PyCharm (найдите инструкцию по установке для вашей конкретной IDE).
pip install pandas matplotlib seaborn
После завершения установки мы импортируем эти библиотеки в наш файл main.py
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
Загрузка набора данных и базовый анализ.
Теперь мы загрузим набор данных в виде DataFrame в переменную с именем df. Это стандартный способ загрузки набора данных в DataFrame для дальнейшего использования, используемый библиотекой pandas:
df = pd.read_csv("https://huggingface.co/api/resolve-cache/datasets/scikit-learn/adult-census-income/fbeef6ec0e6fd88a5028b94683144000a6b380d5/adult.csv?%2Fdatasets%2Fscikit-learn%2Fadult-census-income%2Fresolve%2Fmain%2Fadult.csv=&etag=%225cf74ede1a6de37d85c96a61d30819a694dee749%22") print(df.head())

Как видите, сначала мы загрузили набор данных по указанному ранее URL-адресу, а затем использовали функцию df.head() для вывода первых 5 строк набора данных, чтобы получить представление о его структуре. Мы видим названия столбцов: age, workclass, fnlweight, hours.per.week, native.country и income. Здесь пунктирные линии разделяют fnlweight и hours.per.week, что указывает на наличие и других столбцов, которые не удалось корректно отобразить из-за ограниченного пространства на экране вывода. Эту проблему можно решить с помощью нескольких строк кода (мы рассмотрим это позже).
Теперь давайте посмотрим, сколько строк и столбцов содержит наш набор данных. Мы сделаем это с помощью команды df.shape , которая выведет количество строк и столбцов, чтобы мы могли получить представление о размере набора данных, с которым имеем дело.
print(df.shape)

Наконец, давайте рассмотрим подробную информацию о столбце, включая тип хранимых в нем данных:
print(df.info())

Как видно из приведенных выше результатов, наш набор данных представляет собой сочетание категориальных и числовых признаков со следующими названиями столбцов:
| Название столбца | Значение |
|---|---|
age |
Возраст человека в годах |
workclass |
Тип занятости/сектор труда: Сотрудник Private → Сотрудник частной компанииSelf-emp-not-inc → Самозанятый (не зарегистрированная компания)Government → Государственный служащийWithout-pay → Неоплачиваемый работник |
fnlwgt |
Окончательный весовой коэффициент выборки, присвоенный Бюро переписи населения. |
education |
Наивысший полученный уровень образования:BachelorsHS-gradMastersDoctorate |
education.num |
Числовое представление уровня образования: Средняя школа → 9 Бакалавры → 13 Мастера → 14 |
marital.status |
Семейное положение человека |
occupation |
Тип работы/профессии |
relationship |
Семейное положение в домохозяйстве:HusbandWifeOwn-childNot-in-family |
race |
Категория гонки |
sex |
Пол |
capital.gain |
Прибыль, полученная от инвестиций/активов |
capital.loss |
Убытки, понесенные от инвестиций/активов |
hours.per.week |
Среднее количество рабочих часов в неделю |
native.country |
Страна происхождения |
income |
Категория дохода (целевая переменная) Обычно: <=50K или >50K |
Теперь давайте отобразим первые 5 строк с указанием всех столбцов. Запустите приведенный ниже код, чтобы получить первые 5 столбцов без усечения:
print(df.head().to_string())


Очистка данных
Теперь, когда мы подготовили общий обзор структуры данных, мы можем перейти к анализу. Но прежде чем это сделать, очень важно, чтобы наши данные были чистыми и пригодными для получения ценных выводов; другими словами, мы не хотим, чтобы наши данные были неточными или содержали пропущенные значения, которые могут исказить показатели анализа. Поэтому мы очистим данные, удалив строки с пропущенными значениями.
Мы воспользуемся функцией `pandas replace() для замены вопросительных знаков на `NA` и удалим из нашего датафрейма строки, содержащие пропущенные значения, с помощью функции ` dropna() . Таким образом, любая строка, содержащая пропущенную информацию о профессии, образовании и т.п., будет удалена из датафрейма. Мы также видим, что ряд строк удаляется из датафрейма с помощью следующего кода:
print("Before cleaning:", len(df)) df = df.replace("?", pd.NA).dropna() print("After cleaning:", len(df))

Как видно, после очистки нашего набора данных осталось всего 30 162 строки из первоначальных 32 561.
Общий анализ доходов
Начнём анализ данных с этого момента! Мы знаем, что критерий дохода хранится в столбце income , и он может быть либо больше 50 000, либо меньше 50 000. Также обратите внимание, что это данные переписи 1994 года, поэтому не удивляйтесь цифрам!
Давайте визуализируем данные о доходах:
#Income Graph sns.countplot(x="income", data=df) plt.show()
Для построения графика распределения доходов мы использовали библиотеку seaborn из Python.

Как видно из приведенного выше графика, большинство людей зарабатывали менее 50 000 долларов, в то время как меньший процент зарабатывал больше 50 000 долларов. График не только подчеркивает несбалансированное распределение доходов, но и дает представление об экономической структуре США в начале 1990-х годов, когда 50 000 долларов считались относительно высокой годовой зарплатой.
Анализ доходов в зависимости от образования
Теперь давайте посмотрим, как уровень образования влияет на доход. Это представляет особый интерес, поскольку обычно наблюдается тенденция к тому, что люди с высшим образованием зарабатывают значительно больше, чем люди с минимальным или низким уровнем образования. Давайте проверим, подтверждают ли это данные:
#Eductaion & Income Relationship result = df.groupby("education")["income"].value_counts() print(result)

#Eductaion & Income Relationship result = df.groupby("education")["income"].value_counts().unstack() # Plot result.plot(kind="bar", figsize=(12,6)) # Labels and title plt.title("Education vs Income") plt.xlabel("Education Level") plt.ylabel("Count") plt.xticks(rotation=45) # Show graph plt.show()

Приведенные выше результаты указывают на то, что высшее образование является фактором, приводящим к более высокому доходу в целом. Хотя это нельзя визуализировать из результатов функции `pandas groupby() , мы использовали график `seaborn count`, чтобы получить представление о том, как разные уровни образования влияют на диапазон доходов отдельных лиц.
Таким образом, видно, что:
- Незначительная часть людей с уровнем образования ниже «неполного высшего», зарабатывающих более 50 тысяч долларов, всё ещё имеет место.
- Высшее образование тесно коррелирует с более высоким доходом: большинство из более чем 50 000 человек имеют степень бакалавра, магистра, диплом колледжа и т.д.
- Среди людей с низким уровнем дохода преобладает среднее образование, что показано самой высокой синей полосой.
- У обладателей профессиональных степеней и докторских степеней оранжевая полоса выше синей, что указывает на более высокий процент людей, зарабатывающих более 50 000 долларов, и это логично, поскольку специалисты в технической области получают высокое вознаграждение.
- Интересно, что среди высокообразованного населения не все зарабатывают больше 50 тысяч, а это значит, что помимо уровня образования на доход влияют и другие важные факторы. Давайте проведем дальнейший анализ, рассмотрев другие столбцы!
Анализ дохода в зависимости от количества отработанных часов в неделю.
Давайте теперь посмотрим, вознаграждается ли усердный труд, то есть, получают ли люди, работающие больше часов, более высокий доход? Следующие несколько строк кода используют диаграмму размаха для анализа наличия определенной зависимости между доходом и количеством рабочих часов в неделю:
# Show graph sns.boxplot(x="income", y="hours.per.week", data=df) plt.show()

Как видно из приведенной выше диаграммы размаха, у населения, зарабатывающего более 50 000 долларов, медиана выше, разброс шире, и больше людей работают сверхурочно. Это соответствует нашему предположению, что да, люди, работающие больше часов в неделю, как правило, имеют более высокий доход, чем другие. Но с другой стороны, у нас есть еще одно интересное наблюдение относительно выбросов в левом прямоугольнике, указывающее на то, что есть люди, которые работают более 70 часов и при этом зарабатывают меньше 50 000 долларов. Это означает, что хотя люди с более высоким доходом обычно работают больше часов в неделю, одних только длительных рабочих часов недостаточно для гарантирования высокой зарплаты. Существуют и другие факторы, помимо уровня образования и количества рабочих часов в неделю, поэтому перейдем к следующему параметру!
Анализ доходов в контексте гендерного равенства
Мы знаем, что много говорилось о гендерном разрыве и дискриминации в оплате труда между мужчинами и женщинами, занимающими одинаковые должности, но было ли это так в 1990-х годах, и если да, то в какой степени?
Давайте представим это с помощью столбчатой диаграммы:
result = df.groupby("sex")["income"].value_counts().unstack() # Plot with custom colors ax = result.plot( kind="bar", figsize=(10,6), color=["skyblue", "blue"] ) # Add labels on bars for container in ax.containers: ax.bar_label(container) # Titles and labels plt.title("Income Distribution by Gender") plt.xlabel("Gender") plt.ylabel("Count") plt.xticks(rotation=0) # Show graph plt.show()

Как видно из приведенного выше графика распределения доходов по полу, мужчин, зарабатывающих более 50 000 долларов, значительно больше, чем женщин. Кроме того, большая часть женской части выборки попадает в категорию с доходом менее 50 000 долларов. Хотя на этом графике не видна явная гендерная дискриминация, можно сделать вывод, что процент мужчин с высоким доходом выше, чем процент женщин.
Доход в зависимости от трудового класса. Анализ.
Теперь давайте посмотрим, как меняется доход в зависимости от класса занятости. Для этого сначала рассмотрим различные классы занятости, а затем построим столбчатую диаграмму для визуального анализа.
print(df["workclass"].unique()) # Select workclasses top_workclasses = df["workclass"].value_counts().head(7).index filtered_df = df[df["workclass"].isin(top_workclasses)] # Create chart plt.figure(figsize=(10,6)) sns.countplot( data=filtered_df, x="workclass", hue="income" ) # Titles and labels plt.title("Income Distribution Across Workclass Categories") plt.xlabel("Workclass") plt.ylabel("Number of Individuals") plt.xticks(rotation=15) plt.show()

Приведенная выше гистограмма показывает, что большинство людей в нашем наборе данных работали в частном секторе, что делает его доминирующей категорией занятости. Почти во всех категориях занятости количество людей, зарабатывающих менее 50 000 фунтов стерлингов, значительно выше, чем тех, кто зарабатывает более 50 000 фунтов стерлингов. Самозанятые работники, зарегистрированные в качестве юридических лиц ( Self-emp-inc ), по-видимому, имеют относительно большую долю высокооплачиваемых работников по сравнению с некоторыми государственными секторами.
Анализ доходов в зависимости от рода занятий
Теперь давайте посмотрим, как профессия влияла на доход, на примере простой печатной выписки.
result = df[df["income"] == ">50K"]["occupation"].value_counts().head(10) print(result)

В приведенном выше коде мы получили доступ к 10 профессиям, где люди зарабатывали более 50 000 долларов. Как видно из результатов, самой высокооплачиваемой профессией была «руководящая должность», затем «специализированная профессиональная деятельность» и т. д. Это означает, что руководящие должности, технические профессии и работа, требующая специальных навыков, имеют более высокий потенциал заработка, чем другие.
Анализ доходов в зависимости от возраста
Далее рассмотрим, как возраст влиял на доход.
# Create figure plt.figure(figsize=(10,6)) # Boxplot sns.boxplot( x="income", y="age", data=df ) # Titles and labels plt.title("Age vs Income Pattern") plt.xlabel("Income Category") plt.ylabel("Age") # Show graph plt.show()

Как видно на изображении выше, мы создали простую диаграмму, на которой показаны два прямоугольника: один определяет категорию дохода менее 50 000 долларов, а другой — более 50 000 долларов. Из графика видно, что в категорию менее 50 000 долларов в основном входят молодые люди, с несколькими исключениями среди пожилых людей. Также видно, что медианный возраст высокооплачиваемых работников заметно выше, что говорит о том, что доход, как правило, увеличивается с возрастом и опытом. Это отражает то, как карьерный рост, опыт и стаж часто приводят к повышению заработной платы с течением времени.
Основные выводы и заключение
В данной статье мы провели тщательный анализ данных переписи населения США 1994 года, чтобы выявить тенденции изменения доходов в зависимости от различных факторов, а именно: возраста, пола, рода занятий, класса занятости, количества рабочих часов в неделю и т. д. Основные выводы заключаются в следующем:
- Большинство населения относится к категории людей с низким уровнем дохода.
- Образование в целом повышало вероятность получения более высокого дохода.
- Количество рабочих часов имеет значение, но лишь незначительно; увеличение количества рабочих часов в неделю не гарантирует более высокого дохода!
- Профессия является одним из наиболее значимых факторов, влияющих на уровень дохода; для повышения дохода достаточно занимаемой должности!
- Доход, как правило, увеличивается с возрастом.
Мы использовали библиотеки pandas, matplotlib и seaborn из Python не только для очистки данных, но и для их анализа с помощью графиков и диаграмм. На практике из этого анализа можно сделать вывод, что доход определяется не одним фактором, а сочетанием образования, профессии, опыта и возможностей!
Махнур Джавед. Посмотреть все публикации Махнур Джавед.
Источник: towardsdatascience.com

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