Анализ блога Ильи Бирмана с помощью Python
Это вторая заметка из серии «Тренируем Python на блоге Ильи Бирмана».
- Сбор данных
- Анализ данных
- Визуализация результатов
В предыдущих сериях
Этап сбора данных закончился тем, что все данные собрали в одну большую табличку — 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 |
Книга Николая Никулина «Воспоминания о войне» | 2019 | 6026 | книги |
Книга Россера Ривза «Реальность в рекламе» | 2019 | 3750 | книги, реклама |
Книга Чарльза Тарта «Практика внимательности в повседневной жизни». Часть 2 | 2019 | 3563 | книги, медитация |
Полный гид по клубу Бергхайн | 2018 | 3493 | Бергхайн |
Книга Чарльза Тарта «Практика внимательности в повседневной жизни». Часть 1 | 2019 | 3198 | книги, медитация |
Здесь четыре рецензии на книги с большими выдержками и один «полный гид».
Если не засчитывать вставки из книг и пересчитать рейтинг без заметок с тэгом «книги», получится тоже интересная подборка:
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. Но это уже в следующих сериях.