Содержание:

1.1 Общая информация

1.2 Генеральная совокупность и выборка

1.3 Типы переменных. Количественные и номинативные переменные

1.4 Меры центральной тенденции

1.1 Общая информация

Будем работать в Jupyter notebook. используем библиотеки numpy, pandas, matplotlib, scipy

Импортируем библиотеки

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy
%matplotlib inline

Используем данные из kaggle, базу данных Титаника:

https://www.kaggle.com/competitions/titanic

train = pd.read_csv('/kaggle/input/titanic/train.csv')
age = train['Age']
train.head()

1.2 Генеральная совокупность и выборка

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

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

А вот это уже считается выборкой, так как мы сделали срез данных от 15-го индекса до 25-го:

1.3 Типы переменных. Количественные и номинативные переменные

1) Номинативная (качественная) переменная. Переменная, каждое значение которой указывает на принадлежность объекта к группе (категории). Номинативная переменная разделяет все объекты на непересекающиеся по определенному признаку (пол, класс и т. д.)

2) Ранговые переменные - это переменные, которые могут быть упорядочены, но не имеют фиксированного интервала между значениями. Другими словами, вы можете сказать, что один объект выше или ниже другого, но вы не можете сказать, насколько он выше или ниже.

3) Метрические (количественные переменные) - это переменные, которые имеют количественное значение, которое можно измерить. Они могут быть дискретными или непрерывными. Они могут принимать любые значения на некотором промежутке, например, рост человека может принимать значения от 160 до 190 см. Количественные переменные делятся на два подтипа:

  • Непрерывные переменные могут принимать любые значения на некотором промежутке, например, рост человека, вес человека, температура воздуха (рост человека; вес человека; температура воздуха).

  • Дискретные переменные могут принимать только определенные значения, например, количество детей в семье, количество комнат в квартире, количество баллов, набранных на экзамене (количество детей в семье; количество баллов, набранных на экзамене; количество единиц товара, проданных за день).

Рассмотрим типы данных

1) Номинативной переменной будет пол человека

Sex = train['Sex']
fig, ax = plt.subplots()
plt.hist(Sex, bins=50)
ax.set_ylabel("")
ax.set_xlabel("")
print(Sex.value_counts())

2) Ранговые переменные

У нас это Pclass (номер класса)

Pclass = train['Pclass']
fig, ax = plt.subplots()
plt.hist(Pclass)
ax.set_ylabel("")
ax.set_xlabel("")
print(Pclass.value_counts())
подскажите, как сделать красивее
подскажите, как сделать красивее

3) Метрические (количественные переменные):

  • Непрерывной переменной в нашем случае будет age (рост человека)

fig, ax = plt.subplots()
plt.hist(age, bins=50)
ax.set_ylabel("")
ax.set_xlabel("")
Нормально)
Нормально)
  • Дискретной переменной будет SibSp (Количество братьев и сестер/супругов на борту Титаника)

SibSp = train['SibSp']
fig, ax = plt.subplots()
plt.hist(SibSp)
ax.set_ylabel("")
ax.set_xlabel("")
print(SibSp.value_counts())

1.4 Меры центральной тенденции

1) Мода (Mode) - это наиболее часто встречающееся значение в наборе данных.

2) Медиана - это значение, которое находится в середине набора данных, упорядоченного по возрастанию. При нечетном количестве данных медиана является одним из значений набора. Например, если у нас есть набор данных {1, 2, 3, 4, 5}, то медиана равна 3.

При четном количестве данных медиана является средним арифметическим двух значений, расположенных в середине набора. Например, если у нас есть набор данных {1, 2, 3, 4, 5, 6}, то медиана равна (3 + 4) / 2 = 3,5.

четко и понятно
четко и понятно

3) Среднее значение - это мера центральной тенденции, которая рассчитывается как сумма всех значений в наборе данных, деленная на количество значений.

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

  • а для выборки:

Есть и такие обозначения:

мама я художник
мама я художник

Может показаться, что все эти меры центральной тенденции не имеют смысла, ведь можно использовать лишь одну - среднее значение. Однако это не всегда это правильно, как может показаться. На следующем примере показано, что эти меры отличаются

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

https://www.ted.com/talks/hans_rosling_the_best_stats_you_ve_ever_seen

Рассмотрим на Python меры центральной тенденции

1) Мода (Mode)

Рассмотрим на примере возраста. Для начала превратим наш список в массив numpy, а потом удалим все nan. Там было 177 пустых значений (nan). Если бы мы попытались определить моду с таким количеством nan, то модой было бы именно это пустое значение (nan).

age_without_nan = age.to_numpy()
age_without_nan = age[~np.isnan(age_without_nan)]

А следующим кодом находим моду:

mode = scipy.stats.mode(age_without_nan)
print('Мода =', mode)

2) Медиана

Рассмотрим теперь медиану. Пример на том же возрасте (age)

median = scipy.ndimage.median(age_without_nan)
print('Медиана =', median)

3) Среднее значение

mean = scipy.mean(age_without_nan)
print('Среднее значение =', mean)

Свойства среднего

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

a = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10]

average_a = sum(a) / len(a)
print('Среднее значение =', average_a)

new_list = [x+10 for x in a]

average_new_list = sum(new_list) / len(new_list)
print('Среднее значение, при X(i)+10 =', average_new_list)
print('Разница =', average_new_list - average_a)

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

a = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10]

average_a = sum(a) / len(a)
print('Среднее значение =', average_a)

new_list = [x*10 for x in a]

average_new_list = sum(new_list) / len(new_list)
print('Среднее значение, при X(i)*10 =', average_new_list)
print('Разница в', average_new_list / average_a, 'раз')

Третья формула говорит нам о том, что если мы отнимем от каждого значения среднее значение и все эти ответы просуммируем, то у нас получится ноль.

Сейчас мы отнимем от каждого значения среднее и просуммируем результаты:
(1 - 5,5) + (2 - 5,5) + (3 - 5,5) + (4 - 5,5) + (5 - 5,5) + (6 - 5,5) + (7 - 5,5) + (8 - 5,5) + (9 - 5,5) + (10 - 5,5) = 0

sum_ = 0
for i in a:
    w = i - average
    sum_ = w + sum_
    
print('sum( X(i) - average ) =', sum_)

Всего наилучшего!

Комментарии (6)


  1. Shamil3310 Автор
    16.01.2024 11:15
    +2

    Как же я рад, что эта статья прошла проверку !!! ????????


  1. Adgh
    16.01.2024 11:15
    +1

    Стоит всё же добавить, что в пакете Numpy уже есть собственные реализации функций median() и mean(), а также аналогичные — изначально игнорирующие значения NaN: nanmedian() и nanmean().


  1. adeshere
    16.01.2024 11:15
    +1

    Мода (Mode) - это наиболее часто встречающееся значение в наборе данных. Мод может быть несколько.

    Уточню малость. Распределение принято называть бимодальным (мультимодальным), если функция распределения имеет два или несколько максимумов. Однако высота у этих максимумов совершенно не обязана совпадать. Поэтому сплошь и рядом "наиболее часто встречающееся значение" - всего одно, а распределение тем не менее бимодальное. Хотя вполне может быть и несколько мод одинаковой амплитуды.

    Я бы в такой ситуации говорил о "локальных" модах - то есть значениях, которые встречаются чаще соседних.

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

    смешивается несколько "обычных" распределений
    Пример 4-модального распределения.
    Пример 4-модального распределения.

    На картинке пример 4-модального распределения. Причем значения -8.75 и 0 встречаются одинаково часто (две моды примерно одинаковой амплитуды), а значения 9.5 и 17 - тоже одинаково часто, но гораздо реже, чем первые два

    P.S. Серая кривая внизу - это аппроксимация получившегося изуверского распределения гауссианом. Видно, что качество аппроксимации катастрофически ужасающее не совсем идеальное ;-) Это я к тому, что если функция (аналитик) ожидает одномодальное распределение, а оно на самом деле совсем другое, то можно интересные результаты на выходе получить.

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

    P.P.S. Ниже - оффтопик:

    Это не реальные данные, я просто взял с потолка 4 гауссиана и сложил

    А впрочем, изучил сейчас повнимательнее потолок над компом... и уже не уверен: точно ли эти гауссианы оттуда, или же они все-таки

    высосаны из пальца

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

    Да и вообще

    как-то не очень приятно осознавать, что малейшее шевеление - и вот ты уже уперся в свой потолок :-(


    1. Shamil3310 Автор
      16.01.2024 11:15

      хорошо, спасибо большое за подробное разъяснение)


  1. Adgh
    16.01.2024 11:15
    +1

    А на кодкамп - нашлось и элегантное решение для вычисления мод:

    #create NumPy array of values with multiple modes

    x = np.array([2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 7])

    #find unique values in array along with their counts

    vals, counts = np.unique (x, return_counts= True )

    #find mode

    mode_value = np.argwhere (counts == np.max (counts))

    #print list of modes

    print(vals[mode_value]. flatten().tolist ())

    [2, 4, 5]


    1. Shamil3310 Автор
      16.01.2024 11:15

      Вау ???? классно