Original size 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. Групповая агрегация данных Средние и стандартные отклонения по полу и по интервалам роста.

Палитра

Original size 850x530

График 1

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

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

Original size 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. Зависимость веса от роста по полу

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

Original size 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. Распределения роста и веса по полу

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

Original size 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. Средний вес по интервалам роста

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

Original size 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 с кодом анализа:

Итог

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

  • была выявлена устойчивая зависимость веса от роста,
  • обнаружены различия между мужчинами и женщинами как в распределениях, так и в средних значениях,
  • показано, как визуальный и статистический анализ дополняют друг друга.
Сравнительный анализ распределений роста и веса у мужчин и женщин
Project created at 17.01.2026
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more