Книга: Думай как аналитик. Статистика и данные с примерами на Python. 3-е изд.
Назад: Глава 6. Функция плотности вероятности
Дальше: Глава 8. Оценка

Глава 7. Связь между переменными

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

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

Диаграмма рассеяния

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

Мы будем использовать данные Национального лонгитюдного исследования молодежи США 1997 года (National Longitudinal Survey of Youth, NLSY97), которое «отслеживает жизнь 8984 молодых американцев, родившихся в 1980–84 годах». Общедоступный датасет включает в себя оценки участников по нескольким стандартизированным тестам, включая тесты, наиболее часто используемые в США при поступлении в колледж, — SAT и ACT. Поскольку сдающие тест получают отдельные баллы за математическую и языковую часть, можно воспользоваться этими данными для исследования взаимосвязи между математическими и лингвистическими способностями.

Инструкции по загрузке данных приведены в Jupyter-блокноте для этой главы. Для чтения данных и замены специальных кодов отсутствующих данных (missing_codes) на np.nan можно использовать Pandas-функции read_csv и replace:

missing_codes = [-1, -2, -3, -4, -5]

nlsy = pd.read_csv("nlsy97-extract.csv.gz").replace(missing_codes, np.nan)

nlsy.shape

(8984, 34)

Таблица DataFrame содержит по одной строке для каждого из 8984 участников исследования и по одному столбцу для каждой из 34 выбранных мной переменных. Имена столбцов как таковые не имеют особого смысла, поэтому заменим названия тех, которые мы будем использовать, на более понятные:

nlsy["sat_verbal"] = nlsy["R9793800"]

nlsy["sat_math"] = nlsy["R9793900"]

Оба столбца содержат несколько значений меньше 200, что невозможно, поскольку 200 — это наименьший балл. Поэтому заменим их на np.nan:

columns = ["sat_verbal", "sat_math"]

 

for column in columns:

    invalid = nlsy[column] < 200

    nlsy.loc[invalid, column] = np.nan

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

nlsy_valid = nlsy.dropna(subset=columns).copy()

nlsy_valid.shape

(1398, 36)

Баллы SAT стандартизированы, поэтому среднее значение равно 500, а стандартное отклонение — 100. В выборке NLSY средние значения и стандартные отклонения близки к этим величинам:

sat_verbal = nlsy_valid["sat_verbal"]

sat_verbal.mean(), sat_verbal.std()

(501.80972818311875, 108.36562024213643)

sat_math = nlsy_valid["sat_math"]

sat_math.mean(), sat_math.std()

(503.0829756795422, 109.8329973731453)

Теперь, чтобы узнать, существует ли связь между этими переменными, посмотрим на диаграмму рассеяния (scatter plot):

plt.scatter(sat_verbal, sat_math)

 

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

Однако такое представление диаграммы перенасыщено (overplotted), что означает присутствие множества накладывающихся друг на друга точек, которые могут дать обманчивое впечатление о взаимосвязи. Центр, где плотность точек максимальна, не такой темный, каким должен быть, и наоборот — значения по краям темнее, чем должны быть. Перенасыщение, как правило, придает слишком большой визуальный вес выбросам.

Мы можем улучшить диаграмму, уменьшив размер точек, чтобы они меньше перекрывали друг друга:

plt.scatter(sat_verbal, sat_math, s=5)

 

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

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

def jitter(seq, std=1):

    n = len(seq)

    return np.random.normal(0, std, n) + seq

Если применить джиттеринг со стандартным отклонением 3 к нашим данным, то строки и столбцы пропадут с диаграммы рассеяния:

sat_verbal_jittered = jitter(sat_verbal, 3)

sat_math_jittered = jitter(sat_math, 3)

plt.scatter(sat_verbal_jittered, sat_math_jittered, s=5)

 

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

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

plt.scatter(sat_verbal_jittered, sat_math_jittered, s=5, alpha=0.2)

 

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

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

Децильная диаграмма

Диаграмма рассеяния дает общее представление о связи между переменными, но существуют и другие типы визуализации, позволяющие лучше понять природу связи. Один из них — децильная диаграмма (decile plot).

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

deciles = pd.qcut(nlsy_valid["sat_verbal"], 10, labels=False) + 1

deciles.value_counts().sort_index()

sat_verbal

1     142

2     150

3     139

4     140

5     159

6     130

7     148

8     121

9     138

10    131

Name: count, dtype: int64

Количество респондентов в каждом дециле примерно одинаково.

Теперь для разделения датафрейма на группы по номеру в Pandas-серии deciles можно использовать метод groupby:

df_groupby = nlsy_valid.groupby(deciles)

df_groupby

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f369c918a60>

Результат, представляющий сгруппированные данные, имеет тип DataFrameGroupBy. Выберем в нем столбец sat_math:

series_groupby = df_groupby["sat_math"]

series_groupby

<pandas.core.groupby.generic.SeriesGroupBy object at 0x7f369fdb3760>

Результат является объектом типа SeriesGroupBy и представляет баллы по математике, сгруппированные по децилю. Для вычисления 10-го, 50-го и 90-го процентилей в каждой группе можно вызвать метод quantile:

low = series_groupby.quantile(0.1)

median = series_groupby.quantile(0.5)

high = series_groupby.quantile(0.9)

На децильной диаграмме эти процентили показаны для каждой децильной группы. На следующем рисунке линия обозначает медиану, а затемненная область — диапазон между 10-м и 90-м процентилями:

xs = median.index

plt.fill_between(xs, low, high, alpha=0.2)

plt.plot(xs, median, label="медиана")

 

decorate(xlabel="Дециль языкового SAT", ylabel="SAT математический")

Так же можно вычислить средний балл языкового теста в каждой группе и отложить эти значения по оси x вместо номеров децилей:

xs = df_groupby["sat_verbal"].median()

 

plt.fill_between(xs, low, high, alpha=0.2)

plt.plot(xs, median, color="C0", label="медиана")

 

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

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

Корреляция

Когда участники исследования NLSY учились в девятом классе, многие из них сдавали математическую часть индивидуального теста успеваемости Пибоди (Peabody Individual Achievement Test, PIAT). Дадим столбцу с этими результатами более понятное название:

nlsy["piat_math"] = nlsy["R1318200"]

nlsy["piat_math"].describe()

count    6044.000000

mean       93.903706

std        14.631148

min        55.000000

25%        84.000000

50%        92.000000

75%       103.000000

max       145.000000

Name: piat_math, dtype: float64

Учащиеся, которые в девятом классе хорошо сдали PIAT, скорее всего, в двенадцатом классе получат высокие баллы по математическому разделу SAT. На следующей диаграмме рассеяния для участников исследования NLSY, сдававших оба теста, показана связь между их баллами. Она построена с помощью функции scatter из модуля thinkstats, которая регулирует размер и прозрачность точки, а также при необходимости добавляет джиттеринг:

from thinkstats import scatter

 

scatter(nlsy, "piat_math", "sat_math")

 

decorate(xlabel="PIAT математический", ylabel="SAT математический")

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

scatter(nlsy, "piat_math", "sat_verbal")

 

decorate(xlabel="PIAT математический", ylabel="SAT языковой")

Учащиеся с более высокими баллами PIAT также в среднем имеют более высокие баллы языкового SAT.

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

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

Чтобы стандартизировать переменную, нужно вычесть среднее значение и разделить на стандартное отклонение — именно то, что делает эта функция:

def standardize(xs):

    return (xs - np.mean(xs)) / np.std(xs)

Чтобы показать, как она работает, выберем строки с корректными (valid) значениями piat_math и sat_math:

valid = nlsy.dropna(subset=["piat_math", "sat_math"])

piat_math = valid["piat_math"]

sat_math = valid["sat_math"]

И стандартизуем баллы PIAT по математике:

piat_math_standard = standardize(piat_math)

np.mean(piat_math_standard), np.std(piat_math_standard)

(-2.4321756236287047e-16, 1.0)

Полученные результаты представляют собой стандартную оценку (standard score), также называемую z-оценкой (z-score). Благодаря процедуре расчета стандартной оценки ее среднее значение близко к 0, а стандартное отклонение — к 1.

Стандартизируем также баллы SAT по математике:

sat_math_standard = standardize(sat_math)

np.mean(sat_math_standard), np.std(sat_math_standard)

(-1.737268302591932e-16, 0.9999999999999998)

На этом рисунке показана последовательность стандартных оценок для первых 100 участников:

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

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

np.mean(piat_math_standard * sat_math_standard)

0.639735816517885

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

Если перемножить элементы в обратном порядке, результат не изменится:

np.mean(sat_math_standard * piat_math_standard)

0.639735816517885

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

Корреляция — это широко используемый статистический показатель, поэтому в библиотеке NumPy есть функция для ее вычисления:

np.corrcoef(piat_math, sat_math)

array([[1.       , 0.63973582],

      [0.63973582, 1.        ]])

На выходе получается корреляционная матрица с одной строкой и одним столбцом для каждой переменной. Значение в верхнем левом углу — это корреляция piat_math с самой собой. Значение в правом нижнем углу — это корреляция sat_math с самой собой. Коэффициент корреляции любой переменной с самой собой равен 1, что означает идеальную силу связи.

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

Реализованная в модуле thinkstats функция corrcoef принимает объект DataFrame и имена двух столбцов, выбирает строки, в которых обе переменные имеют действительные значения, и вычисляет их корреляцию:

from thinkstats import corrcoef

 

corrcoef(nlsy, "piat_math", "sat_math")

0.6397358165178849

Воспользуемся этой функцией для вычисления корреляции между piat_math и sat_verbal:

corrcoef(nlsy, "piat_math", "sat_verbal")

0.509413914696731

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

Как и следовало ожидать, результаты PIAT по математике лучше предсказывают результаты SAT по математике, чем по языковому разделу.

Сила корреляционной связи

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

Греческая буква ρ (произносится как «ро») является условным обозначением коэффициента корреляции.

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

Коэффициент корреляции всегда находится в диапазоне от –1 до 1. Если между двумя переменными нет связи, их корреляция равна 0, но если корреляция равна 0, из этого не следует, что связи нет. В частности, при наличии нелинейной зависимости коэффициент корреляции может быть близок к 0. В каждом из приведенных ниже примеров существует четкая взаимосвязь между переменными — в том смысле, что если задано одно из значений, можно довольно точно предсказать другое. Но в каждом из этих случаев коэффициент корреляции близок к 0:

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

Ранговая корреляция

Исследование NLSY является лонгитюдным, это означает, что оно отслеживает одну и ту же группу людей в течение длительного времени. Группа, которую мы изучали, включает людей, родившихся в период с 1980 по 1984 год. Те, кто сдавал SAT, вероятно, сдавали его в конце 1990-х, примерно в 18-летнем возрасте. Поэтому когда в 2021 году их спрашивали об уровне дохода (income), им было под 40 или немного за 40 лет. Присвоим столбцу с данными о доходах более понятное имя:

nlsy["income"] = nlsy["U4949700"]

nlsy["income"].describe()

count      6051.000000

mean     104274.239960

std      108470.571497

min           0.000000

25%       38000.000000

50%       80000.000000

75%      134157.000000

max      599728.000000

Name: income, dtype: float64

В этом столбце представлен валовой доход семьи (gross family income) — совокупный доход респондента и других членов его домохозяйства из всех источников, выраженный в долларах США. Вот как выглядит распределение доходов:

cdf_income = Cdf.from_seq(nlsy["income"])

cdf_income.step()

 

decorate(xlabel="Доход (долл. США)", ylabel="ИФР")

Обратите внимание на ступеньку на графике вблизи отметки $600 000 — для защиты анонимности участников суммы, превышающие этот порог, были ограничены. Вот диаграмма рассеяния баллов SAT по математике респондентов и их доходов на более позднем этапе жизни:

scatter(nlsy, "piat_math", "income")

 

decorate(xlabel="PIAT математический", ylabel="Валовой доход семьи (долл. США)")

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

corrcoef(nlsy, "piat_math", "income")

0.30338587288641233

Корреляция составляет около 0.3. Это означает, что если в возрасте 15 лет кто-то получает балл PIAT по математике на одно стандартное отклонение выше среднего, то можно ожидать, что в возрасте 40 лет его доход будет приблизительно на 0.3 стандартного отклонения выше среднего. Связь не такая сильная, как корреляция между баллами PIAT и SAT, но, учитывая количество факторов, влияющих на доход, не стоит ею пренебрегать.

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

Более робастным показателем является ранговая корреляция, при расчете которой вместо стандартизованных оценок используются ранги оценок. Для вычисления ранга каждого балла и каждого уровня дохода можно применить Pandas-метод rank:

valid = nlsy.dropna(subset=["piat_math", "income"])

 

piat_math_rank = valid["piat_math"].rank(method="first")

income_rank = valid["income"].rank(method="first")

Если указан аргумент method="first", метод rank присваивает ранги от 1 до длины последовательности, составляющей в данном случае 4101:

income_rank.min(), income_rank.max()

(1.0, 4101.0)

Вот точечная диаграмма зависимости ранга уровня дохода от ранга балла по математике:

plt.scatter(piat_math_rank, income_rank, s=5, alpha=0.2)

 

decorate(xlabel="Ранг математического PIAT", ylabel="Ранг уровня дохода")

А вот коэффициент корреляции рангов:

np.corrcoef(piat_math_rank, income_rank)[0, 1]

0.38148396696764847

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

Функция rankcorr из модуля thinkplot содержит код из этого раздела:

from thinkstats import rankcorr

 

rankcorr(nlsy, "piat_math", "income")

0.38474681505344815

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

Корреляция и причинно-следственная связь

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

Если корреляция действительная, этому существует три возможных объяснения: A вызывает B, B вызывает A или какой-то другой набор факторов вызывает как A, так и B. Такие объяснения называют причинно-следственными связями.

Одно лишь наличие корреляции не позволяет установить, какое из этих объяснений в данном случае справедливо. Этот принцип часто резюмируют одной фразой: «Корреляция не подразумевает причинно-следственной связи» (Correlation does not imply causation). Она настолько лаконична и точна, что ей посвящена отдельная страница в английской википедии.

Как же в таком случае доказать наличие причинно-следственной связи?

Используйте фактор времени.

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

Используйте рандомизацию.

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

Эти два принципа лежат в основе рандомизированных контролируемых исследований (randomized controlled trial). В них испытуемые случайным образом распределяются на две (или более) группы — экспериментальную (treatment group), получающую какое-либо вмешательство (например, новое лекарство), и контрольную, не получающую никакого вмешательства или подвергающуюся экспериментальному воздействию, эффекты которого известны. Рандомизированное контролируемое исследование — это самый надежный способ доказать причинно-следственную связь и основа доказательной медицины.

К сожалению, контролируемые исследования порой невозможны или неэтичны. Альтернативой им является проведение естественного эксперимента (natural experiment). В нем за похожими группами наблюдают в различных условиях, обстоятельства которых не зависят от экспериментатора.

Выявление и измерение причинно-следственных связей — это предмет раздела статистики, называемого причинно-следственным анализом (causal inference).

Глоссарий

Диаграмма рассеяния (scatter plot)

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

Перенасыщенный (overplotted)

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

Джиттеринг (jittering)

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

Децильная диаграмма (decile plot)

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

Дециль (decile)

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

Коэффициент корреляции Пирсона (Pearson correlation coefficient)

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

Стандартная оценка (standard score)

Величина, которая, пройдя процедуру стандартизации, выражается в единицах стандартного отклонения от среднего значения.

Корреляционная матрица (correlation matrix)

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

Ранговая корреляция (rank correlation)

Робастный способ количественной оценки силы связи при помощи рангов значений вместо самих значений.

Рандомизированное контролируемое исследование (randomized controlled trial)

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

Экспериментальная группа (treatment group)

Группа, которая в ходе эксперимента получает исследуемое вмешательство.

Контрольная группа (control group)

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

Естественный эксперимент (natural experiment)

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

Причинно-следственный анализ (causal inference)

Методы выявления и количественной оценки причинно-следственных связей.

Упражнения

Упражнение 7.1

Функция decile_plot из модуля thinkstats включает в себя приведенный выше в этой главе код. Вот как с ее помощью можно визуализировать взаимосвязь между баллами по языковому и математическому разделам SAT:

from thinkstats import decile_plot

 

decile_plot(nlsy, "sat_verbal", "sat_math")

decorate(xlabel="SAT языковой", ylabel="SAT математический")

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

Упражнение 7.2

Постройте диаграмму рассеяния зависимости дохода от оценок по математике SAT. Вычислите корреляцию Пирсона и ранговую корреляцию. Существенно ли они различаются?

Постройте точечную диаграмму зависимости дохода от баллов языкового SAT и вычислите обе корреляции. Какой из баллов лучше предсказывает будущий доход — математический или языковой?

Упражнение 7.3

Посмотрим, как средний балл (grade point average, GPA) ученика средней школы США соотносится с его баллами SAT. Вот переменная в датасете NLSY, содержащая балл GPA:

missing_codes = [-6, -7, -8, -9]

nlsy["gpa"] = nlsy["R9871900"].replace(missing_codes, np.nan) / 100

nlsy["gpa"].describe()

count    6004.000000

mean        2.818408

std         0.616357

min         0.100000

25%         2.430000

50%         2.860000

75%         3.260000

max         4.170000

Name: gpa, dtype: float64

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

Упражнение 7.4

Исследуем связь между уровнем образования и доходом. В датасете NLSY есть столбец, хранящий наивысший уровень (degree) образования для каждого рес­пондента. Значения закодированы целыми числами:

nlsy["degree"] = nlsy["Z9083900"]

nlsy["degree"].value_counts().sort_index()

degree

0.0     877

1.0    1167

2.0    3531

3.0     766

4.0    1713

5.0     704

6.0      64

7.0     130

Name: count, dtype: int64

Для их расшифровки можно воспользоваться следующими списками:

positions = [0, 1, 2, 3, 4, 5, 6, 7]

labels = [

    "None (Нет)",

    "GED (Неполное среднее образование)",

    "High school diploma (Полное среднее образование)",

    "Associate's degree (Среднее профессиональное образование)",

    "Bachelor's degree (Бакалавр)",

    "Master's degree (Магистр)",

    "PhD (Кандидат наук)",

    "Professional degree (Послевузовское профессиональное образование)",

]

Постройте диаграмму рассеяния зависимости уровня дохода (income) от уровня образования (degree). Чтобы избежать перенасыщения, примените джиттеринг к переменной degree, а также подберите размер точек и их прозрачность.

При помощи метода groupby сгруппируйте респондентов по значениям переменной degree. У объекта класса DataFrameGroupBy выберите столбец income; затем, пользуясь методом quantile, для каждой группы рассчитайте медиану, 10-й и 90-й процентили. Используйте Matplotlib-функцию fill_between для заполнения области между 10-м и 90-м процентилями и функцию plot для построения графика медианы.

Что можно сказать о прибавке дохода, связанной с каждой последующей ступенью образования?

Упражнение 7.5

В датасете Системы наблюдения за поведенческими факторами риска США (Behavioral Risk Factor Surveillance System, BRFSS) содержатся данные о росте и весе, записанные со слов около 400 000 респондентов. Инструкции по загрузке данных приведены в Jupyter-блокноте к этой главе.

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

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


Соответствие российским уровням образования не вполне точное (в частности, Associate’s degree — степень, присваиваемая после двух лет обучения в колледже; PhD — это постдипломное образование, но не совсем «кандидат наук»), но в данном случае это не имеет значения для понимания задачи. — Примеч. ред.

Назад: Глава 6. Функция плотности вероятности
Дальше: Глава 8. Оценка