Анализ блога Ильи Бирмана с помощью Python

Это вторая заметка из серии «Тренируем Python на блоге Ильи Бирмана».

  1. Сбор данных
  2. Анализ данных
  3. Визуализация результатов (coming soon)

В предыдущих сериях

Этап сбора данных закончился тем, что все данные собрали в одну большую табличку — dataframe. Чтобы данные не потерялись, выгрузил их в файл .csv

Подготовка данных

Чтобы начать работу, загружаем данные.

birman = pd.read_csv("birman.csv", sep = ";", engine = "python")

На всякий случай проверяем количество строк и столбцов.

birman.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4487 entries, 0 to 4486
Data columns (total 8 columns):
title       4487 non-null object
datetime    4487 non-null object
views       4487 non-null int64
comments    4487 non-null int64
length      4487 non-null int64
images      4487 non-null int64
tags        4392 non-null object
link        4487 non-null object
dtypes: int64(4), object(4)
memory usage: 280.5+ KB

Оу! Куда-то потерялись 95 тэгов. Надо проверить. Смотрим у каких строк тэги null.

birman[birman["tags"].isnull()][["title","link"]].head(3)
title link
Вильнюс https://ilyabirman.ru/meanwhile/all/vilnius/
Продам чехол «Люкса-2» для 11-дюймового Эйра https://ilyabirman.ru/meanwhile/all/avito-luxa2-11/
Продам сумку Инкейс для 11-дюймового Эйра https://ilyabirman.ru/meanwhile/all/avito-incase-11/

Переходим по ссылкам и видим, что действительно у некоторых заметок нет тэгов. Но у нескольких тэги почему-то потерялись.
Делаем ещё один проход по таким ссылкам и проверяем тэги. Добавляем у кого есть, у кого нет — ставим тэг «без тэга».

branch = birman

for item in branch[branch.tags.isnull()].itertuples():
    #print(item.link)
    
    blog_page = requests.get(item.link)
    blog_page_soup = BeautifulSoup(blog_page.content, "html.parser")

    string_with_tags = ""
                   
    for tag in blog_page_soup.select(".e2-tag"):
        string_with_tags += tag.get_text() + ", "

    if len(string_with_tags) > 0:
        birman.loc[item.Index, "tags"] = string_with_tags[0:-2]
    else:
        birman.loc[item.Index, "tags"] = "без тэгов"

Проверяем

birman.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4487 entries, 0 to 4486
Data columns (total 8 columns):
title       4487 non-null object
datetime    4487 non-null datetime64[ns]
views       4487 non-null int64
comments    4487 non-null int64
length      4487 non-null int64
images      4487 non-null int64
tags        4487 non-null object
link        4487 non-null object
dtypes: datetime64[ns](1), int64(4), object(3)
memory usage: 280.5+ KB

Всё на месте — все null заменены на нормальные данные. Можно работать.

Анализ данных — первое приближение, birdview

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

by_years = df.groupby(df.datetime.dt.strftime("%Y")).sum()

Добавляем количество заметок за год

by_years["count"] = df.groupby(df.datetime.dt.strftime("%Y")).views.count()

Результат:

year posts views comments length images
2002 11 36 0 2511 7
2003 365 597 398 23826 3
2004 505 3398 1125 39507 0
2005 375 1672 995 40191 3
2006 236 102054 1351 38190 7
2007 266 2766 2355 33408 4
2008 210 6003 2676 30365 7
2009 225 17182 4617 34210 22
2010 145 10541 2849 26297 15
2011 142 9294 3193 26091 96
2012 246 20573 10 43734 122
2013 280 48444 38 49875 342
2014 287 31730 535 63677 322
2015 199 23430 96 44668 288
2016 268 18869 286 54088 372
2017 339 19484 395 63107 986
2018 295 280784 723 70380 1210
2019 93 84838 228 34654 378

Посмотрим на каждый показатель отдельно:

  • Количество. Первые 11 заметок в блог Илья написал ещё в 2002 году. Далее с небольшими отклонениям было примерно по 300 заметок каждый год. Удивительное постоянство для такого большого периода.
  • Комментарии. До 2011 было в среднем 2000 комментариев в год с пиком в 4617 комментариев в 2009 году. Но в 2012 комментариев было только 10 штук. И все к первой заметке в году, дальше — ноль. Надо бы спросить у Ильи что случилось.
  • Длина . Средняя длина заметок росла: с 78 слов на одну заметку в 2004 году до 239 в 2018.
  • Картинки. Видно, что до 2010 картинок в заметках почти не было. В 2011-2012 годах уже примерно 100 картинок за год. Дальше — больше: в 2013-2016 уже по ~300 в год. С 2018 в среднем по тысяче.
  • Просмотры. С самого начала Эгея не показывала просмотры. До марта 2018 года у заметок в основном единицы просмотров. Были исключения, но, если я правильно понял механизм, эти просмотры Эгея посчитала уже после марта 2018.

Ориентироваться на просмотры можно за 2018 и половину 2019 года:

year posts views views_mean views_median
2018 295 280784 951 807
2019 93 84838 912 841

В 2018 году в среднем одну заметку посмотрели 951 раз, в 2019 — 912 раз. Значение медианы близко к среднему, значит — данные без сильного перекоса.

Самые-самые заметки за всё время

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

Самые просматриваемые

title date views tags
О запятой после «С уважением» 2006 87974 русский язык
Переплата по кредиту 2013 39296 жизнь, общество, экономика
Числа π и e 2012 14387 математика
Война 2015 13601 красная таблетка, общество
Почему люди платят налоги 2014 9310 красная таблетка, общество, философия, экономика

Получился хороший список для общеобразовательного чтения. Русский язык, математика и философия. Если дочитали заметку до сюда, рекомендую прочитать и заметки Ильи (и приведённые, и все остальные).

Самые комментируемые

title date comments tags
Ремонетизация 2009 200 реклама, этот сайт
Бананотехнология 2009 199 еда, жизнь
Почему люди платят налоги 2014 193 красная таблетка, общество, философия, экономика
Опенсос 2010 174 идиоты, опенсорс, софт
Кто на чём 2007 150 браузеры

Выборка постов получилась неслучайной. Во всех есть приглашение к комментированию. Особенно примечательна заметка из 2014: в том году комментарии были разрешены только к 12 заметкам (из них половина — рубрика «Дискуссии по понедельникам»).

Самые длинные

Здесь четыре рецензии на книги с большими выдержками и один «полный гид».

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

title date length tags
Полный гид по клубу Бергхайн 2018 3493 Бергхайн
SynSUN — Phoenix 2006 1714 музыка, обзоры
Кофейные места 2017 1657 кофе
Голосовые объявления в лондонском метро 2013 1619 …навигация в общественных местах…
Как выучить иврит — 2 2018 1568 иврит

Самые… заметки, где больше всего картинок

title date images tags
Процесс создания логотипа Драйвинг-тестов. Часть 1 2018 36 портфолио, процесс
Телеграм за неделю 5—11 февраля 2018 2018 32 телеграм-канал
Телеграм за неделю 12—18 февраля 2018 2018 30 телеграм-канал
Санкт-Петербург: Гранд-макет 2018 29 мир, музеи и выставки, Санкт-Петербург
Тель-Авив: прогулка по Флорентину 2018 28 мир, Тель-Авив

Воспользуюсь правом, данным мне библиотекой pandas, и уберу заметки с тэгом «телеграм-канал». Получилось интереснее, как мне кажется.

title date images tags
Процесс создания логотипа Драйвинг-тестов. Часть 1 2018 36 портфолио, процесс
Санкт-Петербург: Гранд-макет 2018 29 мир, музеи и выставки, Санкт-Петербург
Тель-Авив: прогулка по Флорентину 2018 28 мир, Тель-Авив
Музей БМВ в Мюнхене 2016 26 автомобиль, Германия, музеи и выставки, фото
Регистрация на рейс «Аэрофлота» 2017 24 полёты, пользовательский интерфейс, студентам

Получилась уже длинна заметка. На этом пока всё. Далее по плану анализ тэгов:

  • общее количество,
  • самые долгоживущие,
  • самые популярные и т.д.

И, конечно, хочется все эти данные и выводы красиво визуализировать. К тому же, у Python есть классные библиотеки типа Seaborn и Bokeh. Но это уже в следующих сериях.

Share
Send
Pin
 24   4 mon   Python   Накодил   Сделал
Popular