Введение

Джастин Бибер это важная фигура в моей жизни. Я в детстве его очень любила. Эта личность многогранна: да, в первую очередь он музыкант, но из-за того, что он стал популярным в раннем возрасте, за ним следил весь мир. А это уже делает его интересной фигурой в интернете. Собственно из-за этого я и решила анализировать не его музыку, а его твиты. Эти данные показались мне более интересными и познавальными.
Данные были найдены в свободном доступе на kaggle: https://www.kaggle.com/datasets/thedevastator/justin-bieber-twitter-engagement-metrics
Гистограммы, точечные, круговые диаграммы кажутся мне наиболее подходящими для данных, которые я захотела визуализировать.
Также я решила выполнить графики в сдержанной тёмной цветовой палитре, так как синий это цвет Твиттера.
Этапы работы

Первый запрос, который пришёл мне в голову, когда я думала про визуализацию данных это самые популярные твиты, поэтому я провизуализировала 5 самых популярных. Для того, чтобы график выглядел компактнее, текст в твитах я сократила до 50 символов.
top_5_tweets['short_content'] = top_5_tweets['content'].apply(lambda x: x[:50] + '...' if len(x) > 50 else x)
plt.figure(figsize=(10, 6)) sns.barplot(data=top_5_tweets, x='likeCount', y='short_content', palette=billie_muted_palette, edgecolor='white') plt.title('Топ-5 самых популярных твитов', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Количество лайков', fontsize=14, color='#FFFFFF') plt.ylabel('Текст твита', fontsize=14, color='#FFFFFF') plt.xticks(fontsize=12, color='#FFFFFF') plt.yticks(fontsize=10, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()
plt.savefig('top_5_popular_tweets_shortened.png', dpi=300, bbox_inches='tight') plt.show()
Результат меня приятно удивил: самым популярным постом оказался пост-поздравление с днём рождения, что кажется мне очень милым!
Поскольку Джастин давно ведет Твиттер, мне стала интересна динамика его ретвитов по времени. Как оказалось пик его активности в Твиттере выпал на 2014 год, собственно тогда и был его пик известности. В это время каждая уважающая себя девчонка фанатела по нему. Для этих данных подходит линейный график.
daily_retweets = data.groupby(data['date'].dt.date)['retweetCount'].sum()
plt.figure(figsize=(10, 6)) plt.plot(daily_retweets.index, daily_retweets.values, marker='o', color='#4A69BD') plt.fill_between(daily_retweets.index, daily_retweets.values, color='#4A69BD', alpha=0.2) plt.title('Динамика ретвитов во времени', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Дата', fontsize=14, color='#FFFFFF') plt.ylabel('Количество ретвитов', fontsize=14, color='#FFFFFF') plt.xticks(rotation=45, fontsize=12, color='#FFFFFF') plt.yticks(fontsize=12, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()
plt.savefig('retweets_over_time.png', dpi=300, bbox_inches='tight') plt.show()
Джастин не ассоциируется с человеком, который пишет длинные посты, провизуализировав его твиты, я в этом и убедилась. У него гораздо чаще встречаются текстовые посты до 100 символов. Получилась такая гистограмма.
data['tweet_length'] = data['content'].str.len()
plt.figure(figsize=(10, 6)) sns.histplot(data['tweet_length'], bins=20, kde=True, color='#6B8E23') plt.title('Распределение длин твитов', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Длина твита (количество символов)', fontsize=14, color='#FFFFFF') plt.ylabel('Частота', fontsize=14, color='#FFFFFF') plt.xticks(fontsize=12, color='#FFFFFF') plt.yticks(fontsize=12, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()
plt.savefig('tweet_length_distribution.png', dpi=300, bbox_inches='tight') plt.show()
Так как я посмотрела, какие посты у него самые популярные, мне стало еще и интересно посмотреть, какие посты его аудитория встретила холодом. Как итог - односложный твит "oh" оказался наименее востребованным, хотя, как мне кажется, у таких односложных твитов есть шанс стать виральными. Для визуализации я использовала столбчатую диаграмму с обрезанным текстом до 50 символов.
bottom_5_tweets['short_content'] = bottom_5_tweets['content'].apply(lambda x: x[:50] + '...' if len(x) > 50 else x)
plt.figure(figsize=(10, 6)) sns.barplot(data=bottom_5_tweets, x='likeCount', y='short_content', palette=billie_muted_palette, edgecolor='white') plt.title('Топ-5 самых непопулярных твитов', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Количество лайков', fontsize=14, color='#FFFFFF') plt.ylabel('Текст твита', fontsize=14, color='#FFFFFF') plt.xticks(fontsize=12, color='#FFFFFF') plt.yticks(fontsize=10, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()
plt.savefig('bottom_5_unpopular_tweets_shortened.png', dpi=300, bbox_inches='tight') plt.show()
Все хотят узнать секрет успеха и как работают алгоритмы в соцсетях, поэтому мне стало любопытно узнать, в какое время выложенные посты встречаются лайками со стороны его аудитории. Результат меня удивил: почему-то в 12 часов дня самый маленький актив, хотя в 10 часов утра аудитория была на пике активности. Такие данные вряд ли могут помочь в развитии, но их знать как минимум интересно. Получился линейный график.
data['hour'] = data['date'].dt.hour
popularity_by_hour = data.groupby('hour')['likeCount'].mean()
plt.figure(figsize=(10, 6)) plt.plot(popularity_by_hour.index, popularity_by_hour.values, marker='o', color='#34495E') plt.fill_between(popularity_by_hour.index, popularity_by_hour.values, color='#34495E', alpha=0.2) plt.title('Популярность твитов по времени суток', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Час дня', fontsize=14, color='#FFFFFF') plt.ylabel('Среднее количество лайков', fontsize=14, color='#FFFFFF') plt.xticks(range(0, 24, 2), fontsize=12, color='
FFFFFF')
Шаг в 2 часа plt.yticks(fontsize=12, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()plt.savefig('popularity_by_hour.png', dpi=300, bbox_inches='tight') plt.show()
И последний график который я построила - столбчатая диаграмма. количества твитов. Я сгруппировка по дате и подсчитала количество твитов, таким образом самый активный день Джастина Бибера - 19 ноября 2013 года.
tweets_by_date = data['date'].dt.date.value_counts().nlargest(5)
plt.figure(figsize=(10, 6)) sns.barplot(x=tweets_by_date.values, y=tweets_by_date.index.astype(str), palette=['
2C3E50', '
4A69BD', '6B8E23', '
7D6F9B', '#34495E'], edgecolor='white') plt.title('Топ-5 самых активных дней', fontsize=18, fontweight='bold', color='#FFFFFF') plt.xlabel('Количество твитов', fontsize=14, color='#FFFFFF') plt.ylabel('Дата', fontsize=14, color='#FFFFFF') plt.xticks(fontsize=12, color='#FFFFFF') plt.yticks(fontsize=12, color='#FFFFFF') plt.grid(color='#444444', linestyle='--', linewidth=0.5) plt.tight_layout()plt.savefig('top_5_active_days.png', dpi=300, bbox_inches='tight') plt.show()
Вывод
Мне очень понравилось узнавать данные с помощью программирования и визуализации кода. Мне кажется, эти навыки полезны для моей деятельности и теперь программирование для меня не то-то страшное и непонятное, а достаточно функциональный метод анализа. Теперь если я захочу что-то изучить, например, узнать какие слова встречаются в песнях чаще, мне может помочь этот метод.
Описание применения генеративной модели
Искусственный интеллект применялся для создания проекта с целью корректировки кода, модель Qwen2.5-Max. https://chat.qwen.ai/
Блокнот и Дата-сет




