Следующая тема: ИАД. Валидация результатов
Вернуться в раздел: Исследовательский анализ данных
Вернуться в оглавление: Я.Практикум
Введение
Когда у вас два набора данных, будьте готовы к тому, что связь придётся искать не для двух, а для четырёх, шести, восьми наборов — параметров может быть много. Для таких поисков вам понадобится совместное распределение множества величин.
Чему вы научитесь:
- Строить диаграмму рассеяния;
- Считать коэффициент корреляции Пирсона;
- Находить совместное распределение для множества величин
Вам предстоит:
Построить две матрицы диаграмм рассеяния: для исходных и отфильтрованных данных.
Сколько времени это займет:
4 урока по 15 минут
Постановка задачи:
Убедитесь в том, что избавление от аномалий не повлияло на природу распределения исходных данных.
Диаграмма рассеяния
Часто нужно понимать, как разные значения зависят друг от друга. Возьмём, к примеру, данные о росте height
(пер. «рост») и весе weight
(пер. «вес») людей.
height weight
0 167.089607 51.253398
1 181.648633 61.910639
2 176.272800 69.413002
3 173.270164 64.563337
4 172.181037 65.453165
Изучим числовые характеристики:
hw.describe()
height weight
count 7634.000000 7634.000000
mean 172.640603 57.688374
std 4.875440 5.274638
min 153.956131 37.687478
25% 169.297852 54.155792
50% 172.641400 57.746296
75% 175.939310 61.205201
max 190.888112 76.604422
...и гистограммы:
Гистограммы похожи на графики нормального распределения. Отдельно отметим, что имеем дело с данными о взрослых людях: из числовых характеристик видно, что людей ниже 150 см в выборке нет.
Чтобы проследить за изменениями цен на бензин во времени, нужно изучить график, где по одной оси идёт стоимость за литр, а по другой — месяцы. Чтобы найти связь между ростом и весом, их тоже нужно отметить на одном графике, а не на отдельных гистограммах. Зададим рост и вес на осях X и Y соответственно:
hw.plot(x='height', y='weight')
Мохнатое нечто. Совсем не то, что вы ожидали увидеть. Исходные данные не были отсортированы. Да и рост каждого следующего человека никак не связан с ростом предыдущего. Избавимся от мешанины прыгающих значений, соединённых линиями. Отсортируем данные:
hw.sort_values('height').plot(x='height', y='weight')
Мохнатое нечто стремится. Линии по-прежнему путают. График, где значения соединяются линиями, хорош, если иллюстрирует непрерывную связь. Например, на графике почасового изменения температуры уместно соединить точки замеров в 8 часов утра и в 9. А вот люди в наблюдениях никак не связаны друг с другом. Гораздо лучше обозначить отдельные сочетания роста и веса точками. Это возможно на особом типе графиков — scatter (пер. «разброс, рассеивание»). Передадим значение scatter
параметру kind
метода plot()
:
hw.plot(x='height', y='weight', kind='scatter')
Такой график уже лучше отражает действительность. Есть основная масса точек с наиболее частыми сочетаниями веса и роста. При этом с увеличением роста увеличивается и вес. Но это лишь в среднем. Можно найти уникальные примеры людей с большим весом и малым ростом. Однако есть и совсем пустые зоны: например, люди ростом более 180 см не весят меньше 50 кг.
На графике можно увидеть взаимосвязь между двумя величинами. А также понять, какие данные типичны, а какие — аномальны.
Так, если нам скажут, что есть человек с ростом 190 см и весом 50 кг, мы ответим, что либо неправильно измеряли, либо это очень редкий человек. А про индивида ростом 170 см и весом более 70 кг известно, что его вес превышает типичное для его роста значение.
Задача
Постройте график по данным из station_stat_full
, где для каждой АЗС будет отдельная точка: по горизонтальной оси — число заездов на АЗС, по вертикальной — медианное время заправки. Добавьте линии сетки.
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
# фильтруем слишком быстрые и медленные заезды и АЗС
data['too_fast'] = data['time_spent'] < 60
data['too_slow'] = data['time_spent'] > 1000
too_fast_stat = data.pivot_table(index='id', values='too_fast')
good_ids = too_fast_stat.query('too_fast < 0.5')
good_data = data.query('id in @good_ids.index')
good_data = good_data.query('60 <= time_spent <= 1000')
# считаем данные по отдельным АЗС и по сетям
station_stat = data.pivot_table(index='id', values='time_spent', aggfunc='median')
good_stations_stat = good_data.pivot_table(index='id', values='time_spent', aggfunc='median')
stat = data.pivot_table(index='name', values='time_spent')
good_stat = good_data.pivot_table(index='name', values='time_spent', aggfunc='median')
stat['good_time_spent'] = good_stat['time_spent']
id_name = good_data.pivot_table(index='id', values='name', aggfunc=['first', 'count'])
id_name.columns = ['name', 'count']
station_stat_full = id_name.join(good_stations_stat)
station_stat_full.plot(kind='scatter', x='count', y='time_spent', grid=True)
Результат
АЗС с малым числом заездов имеют значительный разброс медианного времени заправки (от 120 до 500). Остальные обычно укладываются в границы 200–350 секунд. Это наводит на две идеи: АЗС с большим числом заездов — крупные, процессы на них отлажены, вот и время одинаковое. Где мало заездов, там искажения данных более вероятны.
Корреляция
Очевидный недостаток этого графика в том, что посередине — огромное количество точек, слившихся в единую массу. В облаке значений не разглядеть области более высокой плотности. Есть два способа сделать график нагляднее.
Способ 1
Сделаем точки полупрозрачными, задав параметр alpha
. Попробуем подобрать его оптимальное значение:
hw.plot(x='height', y='weight', kind='scatter', alpha=0.3)
С таким значением alpha
стало несильно лучше. Уменьшим alpha
в 10 раз:
hw.plot(x='height', y='weight', kind='scatter', alpha=0.03)
Достаточно наглядно. Что, если поиграть с прозрачностью ещё?
hw.plot(x='height', y='weight', kind='scatter', alpha=0.003)
Способ 2
Когда точек много и каждая в отдельности не интересна, данные отображают особым способом. График делят на ячейки; пересчитывают точки в каждой ячейке. Затем ячейки заливают цветом: чем больше точек — тем цвет гуще.
Такой тип графика задают через параметр kind
, ему присваивают значение hexbin
(от англ. hexagonal binning plot — «график, поделённый на шестиугольные области»).
Число ячеек по горизонтальной оси задают параметром gridsize
(от англ. size of a grid — «размер сетки»), аналогом bins
для hist()
.
Языки программирования придуманы людьми, поэтому неидеальны. Бывает, при столкновении с багами приходится ставить «костыли». Здесь это параметр sharex=False
. Если значение True
, то пропадёт подпись оси Х, а без sharex график выйдет неказистым — это «костыльный» обход бага библиотеки pandas.
hw.plot(x='height', y='weight', kind='hexbin', gridsize=20, figsize=(8, 6), sharex=False, grid=True)
Какие красивые соты получились! Отчётливо видно, что в центре графика не однородное пятно, а определённая структура данных. В самой «густой» зоне люди с ростом от 170 до 175 см и весом от 55 до 60 кг.
Смысл этого графика, как и у гистограммы, — отображение частотности. Но на гистограмме показана только одна величина, а здесь две: нельзя сделать гистограмму одновременно и по росту, и по весу. Повышенная частота определённых сочетаний указывает на закономерность. Часто цель анализа данных в том и состоит, чтобы показать связь двух величин.
Например, как цена квартиры зависит от её площади? Влияет ли на стоимость жилья его удалённость от центра? А тихие соседи? Или цена квартиры связана с годом строительства дома?
Скорее всего, каждый из этих факторов по-своему влияет на конечную стоимость квартиры. Узнать, как именно и насколько сильно, — это аналитическая задача. Её решают, изучая совместное распределение величин.
Взаимосвязь двух или нескольких величин называется «корреляция». График (да и жизненный опыт) позволяет утверждать, что рост и вес взаимосвязаны, или коррелируют. Очевидно не только наличие связи, но и прямая зависимость: чем больше рост, тем больше вес. В таком случае говорят, что корреляция положительная. А для Наполеона с его небольшим ростом высокие амбиции — пример отрицательной корреляции, так как уменьшение одной величины связано с увеличением другой.
То, что корреляция есть, понятно. Но как оценить численно, насколько тесна взаимосвязь? Для этого находят коэффициент корреляции Пирсона. Он помогает определить наличие линейной связи между величинами и принимает значения от -1 до 1.
Если с ростом первой величины растёт вторая, то коэффициент корреляции Пирсона — положительный. Если при изменении одной величины другая остаётся прежней, то коэффициент равен 0.
Если рост одной величины связан с уменьшением другой, коэффициент отрицательный.
Чем ближе коэффициент корреляции Пирсона к крайним значениям 1 или -1, тем теснее линейная взаимосвязь. Если значение близко к нулю, значит, линейная связь слабая либо отсутствует вовсе. Бывает, что коэффициент нулевой не потому, что связи между значениями нет, а из-за того, что у неё более сложный, не линейный характер. Потому-то коэффициент корреляции такую связь не берёт.
0.5196907833692264
0.5196907833692264
Корреляция в 0.52 говорит о наличии связи, однако не слишком сильной. Выходит, увеличение роста сопровождается прибавкой в весе, но так бывает не всегда.
Справедливо ли обратное: увеличивается ли рост при наборе веса? Насколько нам известно из жизненного опыта, нет. Хотя корреляция иллюстрирует зависимость между величинами, она не доказывает наличие причинно-следственной связи. Нельзя сказать, что, прибавляя в весе, мы становимся выше.
Итак, наличием корреляции причинно-следственную связь не доказать, но и не опровергнуть. А что, если надо анализировать не столь прозрачные данные?
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
# фильтруем слишком быстрые и медленные заезды и АЗС
data['too_fast'] = data['time_spent'] < 60
data['too_slow'] = data['time_spent'] > 1000
too_fast_stat = data.pivot_table(index='id', values='too_fast')
good_ids = too_fast_stat.query('too_fast < 0.5')
good_data = data.query('id in @good_ids.index')
good_data = good_data.query('60 <= time_spent <= 1000')
# считаем данные по отдельным АЗС и по сетям
station_stat = data.pivot_table(index='id', values='time_spent', aggfunc='median')
good_stations_stat = good_data.pivot_table(index='id', values='time_spent', aggfunc='median')
stat = data.pivot_table(index='name', values='time_spent')
good_stat = good_data.pivot_table(index='name', values='time_spent', aggfunc='median')
stat['good_time_spent'] = good_stat['time_spent']
id_name = good_data.pivot_table(index='id', values='name', aggfunc=['first', 'count'])
id_name.columns = ['name', 'count']
station_stat_full = id_name.join(good_stations_stat)
print(station_stat_full['count'].corr(station_stat_full['time_spent']))
Результат
0.12242632473597156
Штирлиц ещё никогда не был так близок к верному пониманию данных, а корреляция — так близка к нулю. Скорее всего, особой связи между числом заездов на АЗС и продолжительностью заправки нет. Либо она есть, но всё сложнее, чем кажется.
💡 Ещё одна мера зависимости двух переменных — это ковариация. Как её применяют и в чём сходство и различие с корреляцией, можно узнать на курсе «Математика для анализа данных».
Матрица диаграмм рассеяния
В прошлом уроке вы нашли корреляцию двух величин. Однако жизненные явления гораздо сложнее и могут зависеть от множества факторов. Например, интересно изучить не только рост и вес, но и то, как на них влияют возраст и пол.
К сожалению, нарисовать понятный график сразу для четырёх параметров нельзя. Однако можно построить диаграммы раcсеяния попарно для роста и веса, роста и возраста, веса и пола, веса и возраста — всего 16 вариантов. В pandas такую задачу решают не df.plot()
, а специальным методом: pd.plotting.scatter_matrix(df)
(от англ. scatter matrix — «матрица рассеяния»).
В наборе данных для каждого человека известен рост height
, вес weight
и возраст age
. В столбце male
(пер. «мужской») значением 1 обозначен мужской пол, 0 — женский. Построим матрицу рассеяния:
Красиво! Сетка 4х4. Каждая ячейка показывает взаимосвязь пары параметров. Изучим их подробнее:
- В верхней левой ячейке связь роста с ростом. Это не диаграмма рассеяния, а обычная гистограмма распределения по росту. Видно, что больше всего людей ростом 150–170 см.
- В ячейке ниже: связь роста и веса. Можно выделить две зоны: узкую полоску до 150 см и широкую — после. Выходит, до 150 см рост и вес увеличиваются равномерно, а после — идут вразнобой.
- Рост и возраст: до 150 см и 20 лет тесно связаны, затем зависимость перестаёт быть устойчивой. Дело в том, что в детстве и подростковом периоде мы растём примерно одинаково, а вот в 20 лет можем оказаться ростом и 150, и 180 см. Аналогично устроена связь «вес — возраст».
- Из диаграммы разброса в нижней левой ячейке можно сделать вывод, что рослых мужчин в среднем больше, чем рослых женщин. Так же обстоит и с весом (соседняя ячейка male-weight).
- Гистограмма пола male свидетельствует, что в выборке чуть больше женщин.
- Гистограмма возраста age сообщает, что больше всего информации собрано о детях младше 5 лет и совсем мало данных о людях старше 75.
- Гистограмма веса weight имеет два пика: правый характерен для веса взрослых, а левый иллюстрирует всплеск значений около 15–20 кг. Видимо, типичный вес дошкольника. Однако на гистограмме роста такого пика нет. Это может объясняться тем, что в возрасте пяти лет дети активно прибавляют в росте, но не в весе. Вот и получилась большая группа детей разного роста с весом около 20 кг: отсюда пик на гистограмме веса, без выдающихся соответствующих значений на гистограмме роста.
- По другую сторону диагонали зеркально расположились те же данные, только оси поменялись местами. Часто проще воспринимать графики, по которым взгляд скользит слева направо. Так, на графике height-age в верхней строке (более наглядно, чем на графике age-height) видно, что люди старше 60 ниже ростом. Обратите внимание, из этой корреляции не следует факт, что после 60 рост уменьшается. Мы не наблюдали одних и тех же людей год за годом, так что можем лишь отметить, что в выборке пенсионеры ростом меньше остальных взрослых.
Для всех пар столбцов, кроме пола, можно найти коэффициент корреляции. Достаточно вызвать метод corr() без параметров.
print(hwa.corr())
height weight age male
height 1.000000 0.940822 0.683689 0.139229
weight 0.940822 1.000000 0.678335 0.155443
age 0.683689 0.678335 1.000000 0.005887
male 0.139229 0.155443 0.005887 1.000000
Такая таблица — матрица корреляции. Коэффициенты по диагонали всегда равны единице, ведь любая величина коррелирует сама с собой. Любопытно, что рост и вес во второй выборке имеют коэффициент корреляции 0.94, хотя в первом наборе данных корреляция была всего 0.52. Это очень большая разница, чем она обусловлена?
Вы изучили данные и знаете, что дело в возрасте: он влияет как на рост, так и на вес в начале жизни, потому-то они и связаны достаточно сильно. В таком случае говорят, что высокая корреляция объясняется третьим фактором. Проигнорируете влияние третьего фактора — неверно интерпретируете высокую корреляцию.
Напомним, что на значения последнего столбца смотреть бессмысленно, ведь биологический пол выражен категориальными значениями 1 и 0.
Пора вернуться к данным про АЗС: найдите в них все взаимосвязи. Возьмите нефильтрованную таблицу data
и для каждой АЗС взгляните на взаимосвязь среднего продолжительности заезда, среднего числа слишком быстрых заездов и слишком долгих заездов.
Задача
Создайте переменную station_stat_multi
, где для каждой АЗС будет 3 числа:
- среднее (не медиана) продолжительности заезда на АЗС;
- средняя доля быстрых заездов;
- средняя доля медленных заездов.
Распечатайте матрицу корреляции между этими величинами. Постройте диаграмму рассеяния попарно для всех величин методом scatter_matrix()
. Задайте размер 9х9 дюймов.
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
# фильтруем слишком быстрые и медленные заезды и АЗС
data['too_fast'] = data['time_spent'] < 60
data['too_slow'] = data['time_spent'] > 1000
too_fast_stat = data.pivot_table(index='id', values='too_fast')
good_ids = too_fast_stat.query('too_fast < 0.5')
good_data = data.query('id in @good_ids.index')
good_data = good_data.query('60 <= time_spent <= 1000')
# считаем данные по отдельным АЗС и по сетям
station_stat = data.pivot_table(index='id', values='time_spent', aggfunc='median')
good_stations_stat = good_data.pivot_table(index='id', values='time_spent', aggfunc='median')
stat = data.pivot_table(index='name', values='time_spent')
good_stat = good_data.pivot_table(index='name', values='time_spent', aggfunc='median')
stat['good_time_spent'] = good_stat['time_spent']
id_name = good_data.pivot_table(index='id', values='name', aggfunc=['first', 'count'])
id_name.columns = ['name', 'count']
station_stat_full = id_name.join(good_stations_stat)
station_stat_multi = data.pivot_table(index='id', values=['time_spent', 'too_fast', 'too_slow'], aggfunc=['mean'])
station_stat_multi.columns=['time_spent', 'too_fast', 'too_slow']
print(station_stat_multi.corr())
pd.plotting.scatter_matrix(station_stat_multi, figsize=(9, 9))
Результат
\ |time_spent |too_fast |too_slow
time_spent |1.000000 |-0.640658 |0.802247
too_fast |-0.640658 |1.000000 |-0.255876
too_slow |0.802247 |-0.255876 |1.000000
Если долго стоять, то можно простоять слишком долго. А если быстро сбежать, то не больно-то и задержишься. Как ни смешно, это окончательное подтверждение того, что вы отрезали ненужное там, где надо. Если бы не получались результаты «капитана очевидности», пришлось бы вернуться и пришивать отрезанное на место.
Как выжать максимум из очевидности
Такие множественные графики и есть сама очевидность. В буквальном смысле. Дальше визуализировать некуда.
Самый большой коэффициент корреляции — 0,8 — между аномально долгими заправками (too_slow
) и средней продолжительностью заправки (time_spent
). Это заметно и на соответствующей диаграмме рассеяния. Зная одно значение, можно предсказать другое. Если бы слишком долгие заезды не были отрезаны, они бы сказались на среднем времени. Поэтому так важно было их отбросить и вместо среднего значения взять медиану.
Зависимость между аномально быстрыми заправками (too_fast
) и средней продолжительностью заправки интереснее. На диаграмме рассеяния видно, что при too_fast > 0.6
(т. е. более 60% заездов на АЗС продолжались меньше минуты) среднее время заправки почти полностью определяется как раз долей этих быстрых заездов. Если бы мы их не отфильтровали, типичное время заправки напоминало бы пит-стоп на «Формуле-1».
Графики подтверждают, что двигаетесь вы верным путём. Скоро вы возьмётесь за статистику, которая может открыть что-то новое. Но если в этот момент зайдут коллеги и спросят, чем вы занимаетесь, надо показать им отрубленные хвосты. Пусть они оценят вашу небольшую победу над хаосом.
Продемонстрируйте им два изображения: матрицу диаграмм рассеяния по исходным данным — и по отфильтрованным.
Задача
Добавьте в таблицу station_stat_multi
столбец good_time_spent
из данных good_stations_stat
. Распечатайте матрицу корреляции для station_stat_multi
.
Постройте диаграммы рассеяния попарно для всех величин методом scatter_matrix
. Задайте размер 9х9 дюймов.
import pandas as pd
data = pd.read_csv('/datasets/visits.csv', sep='\t')
# фильтруем слишком быстрые и медленные заезды и АЗС
data['too_fast'] = data['time_spent'] < 60
data['too_slow'] = data['time_spent'] > 1000
too_fast_stat = data.pivot_table(index='id', values='too_fast')
good_ids = too_fast_stat.query('too_fast < 0.5')
good_data = data.query('id in @good_ids.index')
good_data = good_data.query('60 <= time_spent <= 1000')
# считаем данные по отдельным АЗС и по сетям
station_stat = data.pivot_table(index='id', values='time_spent', aggfunc='median')
good_stations_stat = good_data.pivot_table(index='id', values='time_spent', aggfunc='median')
stat = data.pivot_table(index='name', values='time_spent')
good_stat = good_data.pivot_table(index='name', values='time_spent', aggfunc='median')
stat['good_time_spent'] = good_stat['time_spent']
id_name = good_data.pivot_table(index='id', values='name', aggfunc=['first', 'count'])
id_name.columns = ['name', 'count']
station_stat_full = id_name.join(good_stations_stat)
station_stat_multi = data.pivot_table(index='id', values=['time_spent', 'too_fast', 'too_slow'])
station_stat_multi['good_time_spent'] = good_stations_stat['time_spent']
print(station_stat_multi.corr())
pd.plotting.scatter_matrix(station_stat_multi, figsize=(9, 9))
Результат
\ | time_spent | too_fast | too_slow | good_time_spent |
---|---|---|---|---|
time_spent | 1.000000 | -0.640658 | 0.802247 | 0.702429 |
too_fast | -0.640658 | 1.000000 | -0.255876 | -0.315120 |
too_slow | 0.802247 | -0.255876 | 1.000000 | 0.445926 |
good_time_spent | 0.702429 | -0.315120 | 0.445926 | 1.000000 |
В ячейке too_fast — time_spent видна почти прямая зависимость между too_fast и time_spent в зоне too_fast > 0.6. То есть время на АЗС там практически однозначно определяет доля быстрых заездов. Зависимость медианной длительности заезда good_time_spent от аномально быстрых заездов в соответствующем поле too_fast уже значительно меньше. Данные в этой ячейке видятся наиболее очищенными от влияния слишком быстрых заездов. Зона 0.35 < too_fast < 0.5 уже спорная. И всё же данные из неё гораздо меньше загрязнены, чем данные с too_fast > 0.5. Это видно по тому, что в такой зоне нет прямой зависимости между too_fast и good_time_spent.
Заключение
В этой теме вы узнали, как находить взаимосвязи между разными значениями, строить графики разброса (scatter) и матрицы корреляции. А вернувшись к АЗС, выявили взаимосвязи средней продолжительности заезда, среднего числа слишком быстрых и долгих заездов и посчитали коэффициент корреляции Пирсона между числом заездов на АЗС и временем заправки.
Хорошие новости: вы снизили влияние подозрительных данных на итоговый результат. Так, коэффициент корреляции между аномально быстрыми заправками too_fast
и медианной продолжительностью заправки good_time_spent
составляет -0.32. Хотя в сырых данных, без фильтрации, коэффициент между аномально быстрыми заправками и средней продолжительностью заправки time_spent
был -0.64. Ещё почти вдвое уменьшили корреляцию в области медленных заправок — от 0.8 между too_slow
и time_spent
до 0.45 в паре too_slow
— good_time_spent
.
Так себе новости: убрали не очень много долгих заправок. Возможно, не ошибка в данных, а на АЗС действительно не торопятся заправлять. Интересно, копуши работают во всех сетях равномерно или где-то плавность движений прописана в регламентах и поощряется премиями? Выясните в следующих уроках — вам поможет группировка.
Заберите с собой
Чтобы ничего не забыть, скачайте шпаргалку и конспект темы.
Где ещё почитать про совместное распределение
Диаграммы рассеяния (и другие графики).
Визуализация данных.
Построение графиков в Python при помощи matplotlib.
Примеры корреляции из реальной жизни (на английском языке).
Проверочные задания. Взаимосвязь данных
Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10.
Время на прохождение: 20 минут
Задание 1 из 10
Данные о пользователях интернет-магазина собрали в датафрейм из четырёх колонок. Для каких значений можно посчитать коэффициент корреляции Пирсона? Выберите несколько вариантов.
import pandas as pd
users_df = pd.DataFrame({
"age": [23, 45, 38, 47, 25, 27, 34],
"time_on_website": [15, 47, 18, 32, 55, 125, 9],
"made_a_purchase": [1, 0, 1, 1, 1, 1, 0],
"money_spent": [11.1, 0, 20.9, 31.4, 5.5, 9.7, 0]
})
print(users_df)
Правильный ответ
age, time_on_website
Правильный ответ
age, money_spent
time_on_website, made_a_purchase
Правильный ответ
time_on_website, money_spent
Коэффициент Пирсона считают только для количественных значений. Коэффициент корреляции поможет проверить, зависит ли сумма покупки от времени, проведённого на сайте. Возраст — тоже количественное значение, значит, можно оценить связь между возрастом и суммой трат на онлайн-покупки. В колонке made_a_purchase находятся категориальные значения. В этом случае посчитать коэффициент Пирсона не получится.
Задание 2 из 10
Выберите метод, который построит матрицу корреляции.
Правильный ответ
corr()
hist()
pivot_table()
variance()
Матрица корреляции выглядит как таблица с коэффициентами для каждой пары столбцов. Методом corr() не только строят матрицу корреляции, но и считают корреляцию между двумя столбцами.
Задание 3 из 10
В данных интернет-магазина обнаружилась корреляция между количеством промоакций и увеличением выручки. Сложно сказать, что промоакции напрямую вызывают рост продаж. Выберите главную причину, почему нельзя сделать однозначный вывод.
Промоакции могут отрицательно влиять на выручку.
Правильный ответ
На объём выручки могут влиять и другие причины, например затраты на рекламу.
Нужно учесть, что данные могут быть неточными или неполными.
Нельзя постоянно использовать промоакции, чтобы увеличивать продажи.
Важно помнить, что корреляция не доказывает причинно-следственную связь. Иначе можно ошибиться в выводах. Агрессивный маркетинг действительно часто приносит больше вреда, чем пользы. Но это не значит, что рост или падение продаж не спровоцировал третий фактор.
Задание 4 из 10
Данные о корреляции между величинами собрали в матрицу. Выберите правильное утверждение о характере связи между величинами.
a b c d
a 1.00 -0.89 0.11 -0.39
b -0.89 1.00 -0.11 0.39
c 0.11 -0.11 1.00 0.02
d -0.39 0.39 0.02 1.00
Между величинами a и b практически нет взаимосвязи.
При возрастании b будет увеличиваться и c.
Правильный ответ
Если a возрастает, b уменьшается.
У c сильная связь с остальными величинами.
Чем ближе значение корреляции к крайним значениям 1 или -1, тем сильнее связь между величинами. Отрицательное значение корреляции не говорит о том, что связи нет. Зависимость будет обратной: при возрастании одной величины другая будет уменьшаться. Небольшие значения коэффициентов, как в случае с величиной c, говорят о том, что связь слабая.
Задание 5 из 10
Данные в матрице обновились. Выберите правильное утверждение о характере связи между величинами.
a b c d
a 1.00 0.19 0.71 -0.49
b 0.19 1.00 -0.43 -0.02
c 0.71 -0.43 1.00 0.92
d -0.49 -0.02 0.92 1.00
Правильный ответ
Между величинами a и b практически нет взаимосвязи.
При возрастании b увеличивается и c.
Если a возрастает, b уменьшается.
У d слабая связь с остальными величинами.
Невысокое значение корреляции не означает, что рост одной величины уменьшает другую. Если знак положительный — зависимость значений прямая. Но в таких случаях чаще говорят о том, что связи нет или её характер слишком сложный.
Задание 6 из 10
Выберите графики, на которых отображены значения с сильной корреляцией.
image
Правильный ответ
image
Правильный ответ
image
Если на графике точки расположены хаотично, сложно сделать вывод о характере связи. Но если на графике видно, что с увеличением одной величины возрастает или уменьшается другая, такие величины точно связаны.
Задание 7 из 10
Соотнесите график с характером корреляции.
image
Близкая к нулю
image
Положительная
image
Близкая к нулю
image
Отрицательная
Если одна величина не влияет на другую, точки могут выстроиться в линию. На основе такого графика нельзя сделать однозначный вывод о характере связи.
Задание 8 из 10
Соотнесите каждый график с его типом.
image
Диаграмма рассеяния
image
Гистограмма
image
График ‘hexbin’
image
Матрица диаграмм рассеяния
Все три графика, кроме гистограммы, отобразят связь между величинами. Матрицу диаграмм рассеяния стоит использовать, если величин много — больше двух. Гистограмма покажет распределение значений только для одной величины. Для нескольких величин потребуется больше гистограмм, но сравнивать такие графики не очень удобно.
Задание 9 из 10
Перед вами диаграмма рассеяния с коэффициентом прозрачности 1. Какой код выведет этот же график с прозрачностью, увеличенной вдвое?
image
Правильный ответ
df.plot.scatter(x='a', y='e', alpha=0.5)
df.plot.scatter(x='a', y='e', alpha=-2)
df.plot.scatter(x='a', y='e', alpha=2)
df.plot.histogram(x='a', y='e', alpha=-0.5)
Параметр alpha принимает значения от 0 до 1, где 1 — непрозрачный график, а 0 — полностью прозрачный. Коэффициент 0.5 даст нужный результат.
Задание 10 из 10
Какой метод визуализирует все взаимосвязи для датафрейма из пяти числовых колонок?
hist()
scatter()
corr()
Правильный ответ
scatter_matrix()
Сложно нарисовать один понятный график для пяти колонок. Можно построить отдельную диаграмму рассеяния для каждой пары. Эту задачу решит метод scatter_matrix(). Он построит диаграммы рассеяния и гистограммы с распределением каждого столбца. Такой график называется матрицей диаграмм рассеяния.
Следующая тема: ИАД. Валидация результатов
Вернуться в раздел: Исследовательский анализ данных
Вернуться в оглавление: Я.Практикум