Исходный размер 832x1248

Сравнительный анализ распределений роста и веса у мужчин и женщин

PROTECT STATUS: not protected

Описание проекта

В данном проекте рассматривается датасет Weight–Height, содержащий данные о росте, весе и поле людей. Цель анализа — изучить взаимосвязь между ростом и весом, а также выявить различия в распределениях этих показателей у мужчин и женщин. Для исследования были использованы методы описательной статистики и визуализации данных, позволяющие наглядно представить структуру распределений и характер зависимости между переменными. В работе использован датасет Weight–Height — набор данных, содержащий информацию о поле, росте и весе людей. Датасет был найден на платформе Kaggle и представляет собой чистую таблицу с количественными переменными, удобную для анализа и визуализации. Переменные датасета:

  • Gender — пол (мужчины / женщины),
  • Height — рост,
  • Weight — вес.

Этот датасет показался мне интересным по нескольким причинам:

  1. Он интуитивно понятен и связан с реальными физическими характеристиками человека.
  2. В нём есть как непрерывные количественные переменные, так и категориальная переменная (пол), что позволяет сравнивать группы.
  3. Данные хорошо подходят для демонстрации базовых приёмов анализа данных: распределений, зависимостей, групповых сравнений и проверки статистических гипотез.
  4. Несмотря на простоту, датасет позволяет показать разницу между визуальным и статистическим анализом. Для анализа были выбраны разные типы визуализаций, каждая из которых решает свою задачу:
  • Scatter plot (точечные диаграммы) Используются для анализа зависимости веса от роста и выявления общей тенденции.
  • Линейные тренды (линии регрессии) Добавлены для наглядного отображения направления и силы связи между ростом и весом.
  • Гистограммы распределений Позволяют сравнить форму распределения роста и веса у мужчин и женщин.
  • Гистограммы с наложением (мужчины и женщины на одном графике) Используются для прямого визуального сравнения групп.
  • Агрегированный график по интервалам роста Показывает, как меняется средний вес при фиксированном росте, что делает сравнение более корректным.

Этапы работы

Этап 1. Загрузка и первичный просмотр данных

import pandas as pd

df = pd.read_csv («weight-height.csv») df.head () df.info ()

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

Этап 2. Очистка и подготовка данных

Основные шаги обработки:

  • удаление пропусков,
  • приведение роста и веса к числовому типу,
  • стандартизация значений пола.

df.columns = df.columns.str.strip () df[«Height»] = pd.to_numeric (df[«Height»], errors="coerce») df[«Weight»] = pd.to_numeric (df[«Weight»], errors="coerce») df = df.dropna (subset=[«Gender», «Height», «Weight»])

df[«gender_norm»] = df[«Gender»].str.lower ().apply ( lambda x: «Male» if x.startswith («m») else «Female» )

В данном проекте нейросети не использовались. Все этапы анализа и визуализации были выполнены с помощью стандартных библиотек Python: pandas, numpy, matplotlib.

Стилизация графиков

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

  • бордовый — мужчины,
  • золотой — женщины,
  • тёплый светлый фон,
  • единые сетка, шрифты и подписи.

Это позволило создать визуально цельную инфографику и повысить читаемость графиков.

Изучающий и объясняющий формат визуализации

Графики были построены так, чтобы не просто показывать данные, но и объяснять их:

  • добавлены линии среднего значения и стандартного отклонения;
  • использованы подписи и легенды;
  • показаны тренды и агрегированные значения;
  • визуализации выстроены от общего обзора к более детальному сравнению групп.

Используемые статистические методы

В работе применялись следующие методы:

  1. Описательная статистика Среднее значение, стандартное отклонение, форма распределения.

  2. Корреляционный анализ Оценка связи между ростом и весом.

  3. Линейная регрессия (polyfit) Для построения трендов зависимости веса от роста.

  4. Групповая агрегация данных Средние и стандартные отклонения по полу и по интервалам роста.

Палитра

Исходный размер 850x530

График 1

График 1. Зависимость веса от роста

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

Исходный размер 985x587

--- scatter: вес от роста по полу + тренды ---

fig, ax = plt.subplots (figsize=(10, 6)) ax.scatter (m[h], m[w], s=14, alpha=0.35, color=C_M, label="Мужчины») ax.scatter (f[h], f[w], s=14, alpha=0.35, color=C_G, label="Женщины»)

for data, col in [(m, C_M), (f, C_F)]: k, b = np.polyfit (data[h], data[w], 1) xx = np.linspace (df[h].min (), df[h].max (), 200) ax.plot (xx, k*xx + b, color=col, linewidth=2.5)

ax.set_title («Зависимость веса от роста по полу») ax.set_xlabel («Рост»); ax.set_ylabel («Вес») ax.legend (frameon=True, facecolor=»#FFFDF8», edgecolor=GRID) plt.tight_layout (); plt.show ()

График 2

График 2. Зависимость веса от роста по полу

Позволяет сравнить мужчин и женщин и увидеть различия в средних значениях при одинаковом росте.

Исходный размер 985x587

fig, ax = plt.subplots (figsize=(10, 6))

данные

data_m = m[h] data_f = f[h] COL_EDGE = «

1E434C»

тёмный контур / оси

гистограммы (нормированные, чтобы корректно сравнивать)

ax.hist ( data_m, bins=30, density=True, color=C_M, alpha=0.6, label="Мужчины» )

ax.hist ( data_f, bins=30, density=True, color=C_G, alpha=0.6, label="Женщины» )

статистика

mean_m, std_m = data_m.mean (), data_m.std () mean_f, std_f = data_f.mean (), data_f.std ()

линии среднего и std

ax.axvline (mean_m, color=C_M, linewidth=2) ax.axvline (mean_m — std_m, color=C_M, linestyle="--», linewidth=1) ax.axvline (mean_m + std_m, color=C_M, linestyle="--», linewidth=1)

ax.axvline (mean_f, color=C_G, linewidth=2) ax.axvline (mean_f — std_f, color=C_G, linestyle="--», linewidth=1) ax.axvline (mean_f + std_f, color=C_G, linestyle="--», linewidth=1)

подписи

ax.set_title («Распределение роста по полу») ax.set_xlabel («Рост») ax.set_ylabel («Плотность»)

ax.legend ( frameon=True, facecolor=»#FFFDF8», edgecolor=»#DDD3C7» )

текстовый блок со статистикой

ax.text ( 0.02, 0.95, f"Мужчины: μ = {mean_m:.2f}, σ = {std_m:.2f}\n» f"Женщины: μ = {mean_f:.2f}, σ = {std_f:.2f}», transform=ax.transAxes, ha="left», va="top», fontsize=10, bbox=dict ( boxstyle="round, pad=0.35», facecolor=»#FFFDF8», edgecolor=»#DDD3C7» ) )

plt.tight_layout () plt.show ()

График 3

График 3. Распределения роста и веса по полу

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

Исходный размер 987x587

fig, ax = plt.subplots (figsize=(10, 6))

данные

data_m = m[w] data_f = f[w] COL_EDGE = «

1E434C»

тёмный контур / оси

гистограммы (нормированные)

ax.hist ( data_m, bins=30, density=True, color=C_M, alpha=0.6, label="Мужчины» )

ax.hist ( data_f, bins=30, density=True, color=C_G, alpha=0.6, label="Женщины» )

статистика

mean_m, std_m = data_m.mean (), data_m.std () mean_f, std_f = data_f.mean (), data_f.std ()

линии среднего и стандартного отклонения

ax.axvline (mean_m, color=C_M, linewidth=2) ax.axvline (mean_m — std_m, color=C_M, linestyle="--», linewidth=1) ax.axvline (mean_m + std_m, color=C_M, linestyle="--», linewidth=1)

ax.axvline (mean_f, color=C_G, linewidth=2) ax.axvline (mean_f — std_f, color=C_G, linestyle="--», linewidth=1) ax.axvline (mean_f + std_f, color=C_G, linestyle="--», linewidth=1)

подписи

ax.set_title («Распределение веса по полу») ax.set_xlabel («Вес») ax.set_ylabel («Плотность»)

ax.legend ( frameon=True, facecolor=»#FFFDF8», edgecolor=»#DDD3C7» )

текст со статистикой

ax.text ( 0.02, 0.95, f"Мужчины: μ = {mean_m:.2f}, σ = {std_m:.2f}\n» f"Женщины: μ = {mean_f:.2f}, σ = {std_f:.2f}», transform=ax.transAxes, ha="left», va="top», fontsize=10, bbox=dict ( boxstyle="round, pad=0.35», facecolor=»#FFFDF8», edgecolor=»#DDD3C7» ) )

plt.tight_layout () plt.show ()

График 4

График 4. Средний вес по интервалам роста

Позволяет сравнить средний вес мужчин и женщин при сопоставимом росте и наглядно показать различия между группами.

Исходный размер 987x587

4-й график: средний вес по интервалам роста (по полу) + std

bins = 12 df2 = df.copy () df2[«height_bin»] = pd.cut (df2[h], bins=bins)

stats = (df2.groupby ([«height_bin», «gender_norm»])[w] .agg (mean="mean», std="std», n="count») .reset_index ())

центры бинов для оси X

stats[«x»] = stats[«height_bin»].apply (lambda x: (x.left + x.right) / 2)

m_stat = stats[stats[«gender_norm»] == «Male»] f_stat = stats[stats[«gender_norm»] == «Female»]

fig, ax = plt.subplots (figsize=(10, 6))

ax.errorbar ( m_stat[«x»], m_stat[«mean»], yerr=m_stat[«std»], fmt="o-», color=C_M, ecolor=C_M, elinewidth=1, capsize=3, label="Мужчины» )

ax.errorbar ( f_stat[«x»], f_stat[«mean»], yerr=f_stat[«std»], fmt="o-», color=C_G, ecolor=C_G, elinewidth=1, capsize=3, label="Женщины» )

ax.set_title («Средний вес по интервалам роста (с разбросом σ)») ax.set_xlabel («Рост (центр интервала)») ax.set_ylabel («Вес (среднее ± σ)») ax.legend (frameon=True, facecolor="

FFFDF8», edgecolor=»

DDD3C7»)

ax.text ( 0.02, 0.95, «Идея: сравниваем средний вес при схожем росте.\n» «Вертикальные линии показывают разброс (σ) внутри интервала.», transform=ax.transAxes, ha="left», va="top», fontsize=10, bbox=dict (boxstyle="round, pad=0.35», facecolor="

FFFDF8», edgecolor=»

DDD3C7») )

plt.tight_layout () plt.show ()

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

Jupyter Notebook с кодом анализа:

Итог

В результате анализа:

  • была выявлена устойчивая зависимость веса от роста,
  • обнаружены различия между мужчинами и женщинами как в распределениях, так и в средних значениях,
  • показано, как визуальный и статистический анализ дополняют друг друга.
Сравнительный анализ распределений роста и веса у мужчин и женщин
Проект создан 17.01.2026
Мы используем файлы cookies для улучшения работы сайта НИУ ВШЭ и большего удобства его использования. Более подробную...
Показать больше