Парадокс дней рождений на данных ВКонтакте

Привет!

Я решил проверить парадокс дней рождений на данных, которые доступны из ВК.

Что такое парадокс дней рождений?


Попробуйте ответить на вопрос: Какое количество людей в комнате необходимо, чтобы у двух людей были одинаковые дни рождения с вероятностью 0.5? (дата и месяц). Парадокс дней рождений отвечает на этот вопрос.

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

  1. В модели не будет 29 февраля => в модели 365 дней в году
  2. Каждый из 365 дней равновероятен.

Конечно, это не совсем реалистично, что дни рождения равновероятны — есть сезонные эффекты, влияющие на даты рождения детей, думаю вы сами можете догадаться какие…

Большинство людей интуитивно отвечают на вопрос задачи: 180. Выглядит логично, 180 человек необходимо для того, чтобы иметь вероятность 0.5 одинаковых дней рождений(всего же 365 дней). Примерна такая интуиция у всех, кто никогда не слышал про парадокс дней рождений. Правильный ответ на самом деле сильно меньше 180, и даже 150, и даже 100: 23.

Необходим как минимум 1 совпадающий день рождения — поэтому я могу найти вероятность, отсутствия совпадающих дней рождений:

$$display$$P("различные \space ДР") = \frac {365 * 364 * 363 * ... * (365 - k + 1)} {365 ^ k} = \frac {365!} {365^k * (365 - k)!}$$display$$

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

Решая уравнение, получается, что необходимо 23 человека и вероятность совпадающих дней рождений будет 0.5073, при 100 людях, вероятность равна 0.9999.

Посмотрим парадокс на данных ВК?


В теории у нас при 23 людях вероятность совпадающих дней рождений 0.5073, при 50 людях 0.97, а при 100 0.99. Проверим это через VK API.

1. Выбираю большое сообщество в ВК. Я решил взять группу MDK во Вконтакте…

В начале я создаю csv файл с колонками, которые мне необходимы.

with open('vk_data.csv', 'w') as new_file:
                # csv
                fieldnames = ['id', 'bdate', 'bmonth', 'byear', 'dandm']

                csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter=',')

                csv_writer.writeheader()

                newDict = dict()

Логинюсь в ВК через API и задаю необходимый мне паблик
vk_session = vk_api.VkApi('username', 'password')
                vk_session.auth()

                vk = vk_session.get_api()
                
                vk_group = vk.groups.getMembers(group_id = 'mudakoff', fields = 'bdate')
                

Начинаем парсить ВКонтакте, их API позволяет запарсить только 1000 юзеров, поэтому создаю цикл.

for i in range(0, 20):
                    vk_group = vk.groups.getMembers(group_id = 'mudakoff', offset = 1000 * i,  fields = 'bdate')
                    for k in range(0, 1000):
                        try:
                            new_file.write(str(vk_group['items'][k]["id"]) + ',' + str(vk_group['items'][k]["bdate"]).replace('.', ','))
                            new_file.write('\n')
                        except:
                            pass

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

image

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

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

fifty = df["dandm"].sample(n = 50)
for i in range(0, 1000):
    fifty = df["dandm"].sample(n = 50)
    for j in fifty.duplicated():
        if j == True:
            counter = counter + 1
            break
print('Вероятность:', counter / 1000)

Вероятность получается в районе 0.97, что совпадает с теоретическими данными.

Вывод


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

Ресурсы


  1. Harvard University. Birthday Problem, Properties of Probability | Statistics 110. URL: www.youtube.com/watch?v=LZ5Wergp_PA&t=150s. Accessed: 08.07.2020
  2. Birthday Problem. URL: en.wikipedia.org/wiki/Birthday_problem. Accessed: 08.07.2020>

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 27

    +5
    Лично на мне парадокс дней рождения отметился аж два раза (из тех случаев, что мне известны). В 7-9 классе (более 30 человек) у одного мальчика совпадал день/месяц/год рождения с моим, а когда был студентом, одна девушка в группе (более 20 человек) была ровно на год младше меня.

    Парадокс дней рождения достаточно общеизвестен, интересно а какова вероятность, что для одного человека он сработает более раза? Насколько вообще часто встречаются люди, для которых сработал (хотя бы раз) этот парадокс?



    Или я бы вот так сформулировал свою задачу, с более точными данными: в скольких группах по 23 человека (в ней вероятность того, что у двух участников совпадёт ДР, почти равна 0,5) нужно поучаствовать человеку, чтобы вероятность того что именно на этом человеке сработает парадокс дней рождения, была близка к 0,5? Была близка к 1?



    Вопрос чисто практический. Мы почти все в течении жизни так или иначе многократно попадаем в группы по 20-30 человек (ясли, школа, ВУЗ, работа) и вполне может оказаться, что почти каждый человек хотя бы раз в одной из групп соответствовал парадоксу.
      +1
      Я лично за свои 35 лет встречал только одного человека, у кого был ДР в один день с моим, год был другии. Имеется в виду только друзья из каких-либо компаний, а не просто рандомные люди.
        +1

        Я знаю четверых людей у которых со мной ДР в один день, а на одной из них(у нее еще и год со мной совпадает) даже был женат… Но это еще не самая жесть. Один мой близкий знакомый на не очень крупном(2000 человек примерно), но международном, мероприятии умудрился на стойке регистрации познакомиться со своим полным тезкой который был младше его ровно на год, при том, что у них фамилия и отчество достаточно редкие.

        0
        Если не ошибаюсь, по необходимому количеству групп будет работать равномерное распределение, тогда для вероятности 0.5 нужно поучаствовать в 11.5 группах (23/2, т.к. каждое совпадение — это сразу два «счастливчика». С более крупными группами — аналогично.
        За 45 лет и много разных коллективов не встречал человека, у которого ДР совпадает с моим. Но однажды внезапно узнал, что родился в один день с Анджелиной Джоли.
          0
          Предположу, что нужны те же 23 группы, чтобы вероятность наличия «двойника» была не не меньше 50%.
          На самом деле, это вопрос не про количество групп, а про общее количество людей в этих группах, ведь то, как они разбросаны по группам, не влияет на наличия человека с тем же днём рождения, так что, кажется, нужны примерно 182 с половиной человека или 365/46 групп

          P.S. моё предположение, таким образом, неверно (я не стал его убирать): нужны 8 групп по 23 человека (напомню, чтобы вероятность была не менее 50%)
            0
            А почему 182 человека? Если подойти к задаче с точки зрения общего количества людей, вероятность встретить человека с ДР в заданный день 1/365, не встретить (1-1/365) = 0,9972. Тогда чтобы не встретить совпадение с вероятностью 0,5 нужно LOG(0,5)0,9972 = 252,65 человека.
            Это размер группы, в которой вероятность встретить человека, у которого ДР совпадает с Вашим равна 50%. Если разбить большую группу на маленькие по 23 человека, вероятность не изменится. Значит, нужно 253/23 = 11 групп, в принципе близко к моей прошлой оценке 11,5.
          0
          Дни рождения по месяцам не являются равновероятнотными событиями
          Потому, что это не случайное событие. Родители (при запланированной беременности, естественно) могут выбирать месяц или хотя бы время года для рождения ребенка.
            0

            А выбор времени года (точнее, предпочтения родителей по этому поводу) не является случайным событием?

              0
              Провал в ноябре может быть связан с нежеланием родителей иметь ребёнка, рождённого под знаком скорпиона. Это связано с астрологическими представлениями о влиянии этого на характер человека, а также с поверьем, что рождение ребёнка под знаком скорпиона может вызвать смерть кого-то из его бабушек и дедушек.
                0
                Когда я учился в институте с ноябрем было связано одно наблюдение из серии совпадений дат рождений — наибольшее количество дней рождения знакомых (тех кто точно позовёт на день рождения) было 37 человек, при этом в ноябре было 8 дней в которые ни у кого не было дня рождения и были дни когда ДР отмечали более трех человек. К слову сказать я тоже ноябрьский и в день моего рождения одни друзья расписались, у других родилась первая дочь. :-) видать нежелание заводить ребёнка в ноябре не всегда имело место :-)
                  0
                  Да при чем тут астрология? Те, кто планирует беременность, не хотят с новорожденным по грязи и морозу бегать в больницу на осмотры и прочее в том же духе. Гулять с грудничком зимой тоже всяко сложнее чем летом. Статистика же взята из вконтакте, Россия и СНГ.
                  А провал не такой большой, потому что не все планируют беременность, а некоторые руководствуются суевериями типа «рожденный зимой меньше болеет» и прочей астрологией.
              –1
              А вот еще один локальный «парадокс» дней рождения: если у вашего знакомого ДР 23 ноября, то с высокой вероятностью его родители имели отношение к армии.
                +2

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

                  0
                  День рождения 1 января — лучшая первоапрельская шутка! :)
                  +1
                  Маловато что-то для сентября родившихся.
                    0

                    Я за всю жизнь знал только одного человека у которого день рождения совпадал с моим. И то знал я его не лично — это был президент :)
                    А в реале, ни в одном коллективе мой день рождения не совпадал ни с чьим.
                    По месяцам же я среди знакомых наблюдаю заметный перекос в сторону ноября и марта: много людей родились в эти месяцы.

                      0
                      ну так в том то и прикол, — парадокс не про то, что совпадет у конретного человека, а про то, что совпадет у хотя бы одной пары в группе
                        0
                        Если это 1 февраля, то вы как минимум знаете уже двоих
                          0
                          Ну-у… да. 1 февраля.
                            0
                            Ну держите ещё пачку нелично знакомых людей :)
                              0
                              Ну-у — так-то каждый может!
                              (с) анекдот.
                        0

                        «Почему-то июль наиболее популярный месяц для дня рождения подписчиков МДК.»


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

                          0
                          Спасибо! Учту в следующих работах
                            0

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


                            В противном случае даже при абсолютно равномерном распределении на гистограмме у вас будут скачки в 3-10%.

                          0
                          В источники я бы добавил классику:
                          Мартин Гарднер, «Математические головоломки и развлечения», 1971
                          Помню зачитывался ею в детстве, что впоследствии принесло свои плоды с совершенно неожиданной стороны — на протяжении нескольких лет многие олимпиадные задачи по математике были родом оттуда )))
                            0
                            Построю гистограмму дней рождений.

                            Из-за локальных всплесков на длинных месяцах (май и октябрь) распределение выглядит более хаотичным, чем есть на самом деле.
                              0
                              Не по теме немного вопрос, почему vk_session.get_api() использует snake_case, а vk.groups.getMembers() camelСase? До сих пор определиться не могут? В PHP тоже такая тема, но там функции строго snake_case, а методы — camelCase, так уж исторически завелось, ибо не переписывать же все, а тут-то сторонняя либа вообще.

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

                              Самое читаемое