kanakanho / しばいぬ

About me

Works

Posts

Contact / Links

YouTubeの視聴履歴を分析する

2024/12/31

はじめに

年末年始ということでこれまでの YouTube の視聴履歴を分析してみました

ちなみに筆者の累積視聴回数は60446回でした 仮に1本10分だとしたら、人生の1年と2ヶ月をYouTubeを見て生きていることになります この分析は誰も幸せにならないかもしれない

image.png (65.5 kB)

YouTube の視聴履歴の取得

取得できるサイト(Google)のURL

https://takeout.google.com/settings/takeout?pli=1

全ての選択を外してyoutubeのみを選ぶ、形式はjsonを選択する

outputはドライブでもメールでもいい 大抵は数分で終わります

Python での分析

ライブラリ

使用したライブラリは以下の通りです

.py
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import json

前処理

google から提供されるデータ形式は json ですが、pandas の dataframe が使いたいのでデータを変換します データを何度も変換すると処理時間が伸びるので、csvとして書き出しておきます

.py
json_file_name = "data.json"
csv_file_name = "data.csv"
with open(json_file_name, "r") as f:
json_data = json.load(f)
df = pd.DataFrame(json_data)
for i in range(len(df)):
df.loc[i, "subtitles_name"], df.loc[i, "subtitles_url"] = subtitles_to_str(df.loc[i, "subtitles"])
df.to_csv(csv_file_name, index=False)

データのプロット

データのプロットの例をいくつか置いておきます。

月別グラフ

プログラム

.py
# データの読み込み
df = pd.read_csv(csv_file_name)
# 年毎の数をプロット
df["time"] = pd.to_datetime(df["time"], format='ISO8601')
df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
df_year = df.groupby("year").size()
df_month = df.groupby(["year", "month"]).size().unstack(fill_value=0)
# 最初の年の最初の月から順番に数を折れ線グラフとしてプロット
df_year_month = df.groupby(["year", "month"]).size()
df_year_month = df_year_month.reset_index()
df_year_month["date"] = pd.to_datetime(df_year_month[["year", "month"]].assign(day=1))
df_year_month = df_year_month.sort_values("date")
fig = plt.figure(figsize=(16, 6))
plt.title("年代別youtube視聴動画数")
plt.bar(df_year_month["date"], df_year_month[0], width=20)
plt.xlabel("年月")
plt.ylabel("視聴動画数")
plt.xticks(df_year_month["date"], rotation=45)
plt.grid(True, axis='y')
plt.tight_layout()
plt.savefig("activity_month_time2.png")
plt.show()

グラフ例

image.png (46.3 kB)

累積グラフ

.py
# データの読み込み
df = pd.read_csv(csv_file_name)
# 年毎の数をプロット
df["time"] = pd.to_datetime(df["time"], format='ISO8601')
df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
df_year = df.groupby("year").size()
df_month = df.groupby(["year", "month"]).size().unstack(fill_value=0)
# 最初の年の最初の月から順番に数を累積折れ線グラフとしてプロット
df_year_month = df.groupby(["year", "month"]).size().cumsum()
df_year_month = df_year_month.reset_index()
df_year_month["date"] = pd.to_datetime(df_year_month[["year", "month"]].assign(day=1))
df_year_month = df_year_month.sort_values("date")
fig = plt.figure(figsize=(12, 6))
plt.title("これまでの累積youtube視聴動画数", fontsize=16)
plt.plot(df_year_month["date"], df_year_month[0], marker='o')
plt.xlabel("年月", fontsize=16)
plt.ylabel("累積視聴動画数", fontsize=16)
plt.xticks(df_year_month["date"], rotation=45)
plt.grid(True)
plt.gca()
plt.tight_layout()
plt.savefig("cumulative_activity_month_time.png")
plt.show()

グラフ例

image.png (65.5 kB)

タイトルごとの視聴回数

プログラム

.py
# タイトルが全く同じものをカウント
df_title = df.groupby("title").size().sort_values(ascending=False)
limit = 32
# タイトルから"を視聴しました"を削除
titles = [title.replace("を視聴しました", "") for title in df_title.index[:limit]]
fig = plt.figure(figsize=(12, 8))
plt.title("タイトルごとの視聴動画数")
plt.barh(titles[::-1], df_title.values[:limit][::-1])
plt.xlabel("視聴動画数")
# plt.ylabel("タイトル")
plt.yticks(rotation=0)
plt.grid(True, axis='x')
plt.tight_layout()
plt.savefig("activity_title_horizontal.png")
plt.show()

グラフ例

チャンネルごとの視聴回数

プログラム

.py
# subtitles_name ごとの視聴動画数
df_title = df.groupby("subtitles_name").size().sort_values(ascending=False)
limit = 30
# タイトルから"を視聴しました"を削除
titles = df_title.index[3:limit]
fig = plt.figure(figsize=(12, 10))
plt.title("チャンネルごとの視聴動画数")
plt.barh(titles[::-1], df_title.values[3:limit][::-1])
plt.xlabel("視聴動画数")
# plt.ylabel("タイトル")
plt.yticks(rotation=0)
plt.grid(True, axis='x')
plt.tight_layout()
plt.savefig("activity_title_horizontal.png")
plt.show()

グラフ例

2024年のタイトルごと、チャンネルごとグラフ

プログラム

.py
# 2024年に視聴した動画のみを抽出
df_2024 = df[df["year"] == 2024]
# タイトルが全く同じものをカウント
df_title = df_2024.groupby("title").size().sort_values(ascending=False)
limit = 32
# タイトルから"を視聴しました"を削除
titles = [title.replace("を視聴しました", "") for title in df_title.index[:limit]]
fig = plt.figure(figsize=(12, 10))
plt.title("2024年のタイトルごとの視聴動画数")
plt.barh(titles[::-1], df_title.values[:limit][::-1])
plt.xlabel("視聴動画数")
# plt.ylabel("タイトル")
plt.yticks(rotation=0)
plt.grid(True, axis='x')
plt.tight_layout()
plt.savefig("activity_title_2024_horizontal.png")
plt.show()
# subtitles_name ごとの視聴動画数
df_title = df_2024.groupby("subtitles_name").size().sort_values(ascending=False)
limit = 30
# タイトルから"を視聴しました"を削除
titles = df_title.index[3:limit]
fig = plt.figure(figsize=(12, 10))
plt.title("2024年のチャンネルごとの視聴動画数")
plt.barh(titles[::-1], df_title.values[3:limit][::-1])
plt.xlabel("視聴動画数")
# plt.ylabel("タイトル")
plt.yticks(rotation=0)
plt.grid(True, axis='x')
plt.tight_layout()
plt.savefig("activity_title_2024_horizontal.png")
plt.show()

グラフ例

曜日ごとの視聴回数

プログラム

.py
# 曜日毎の視聴動画数
df["weekday"] = df["time"].dt.weekday
df_weekday = df.groupby("weekday").size()
fig = plt.figure(figsize=(8, 4))
plt.title("曜日ごとの視聴動画数")
plt.bar(df_weekday.index, df_weekday.values)
plt.xlabel("曜日")
plt.ylabel("視聴動画数")
plt.xticks(df_weekday.index, ["月", "火", "水", "木", "金", "土", "日"])
plt.grid(True)
plt.tight_layout()
plt.savefig("activity_weekday.png")

グラフ例

終わりに

今回は年末ということで一年間でどういうYouTubeを見てきたのかの振り返りも込めて、分析を行いました。普段何気なくしている行動が数字として目の前に示されると心に来るものがありますね…。ですがYouTubeの視聴履歴分析は一番身近にあって自身の行動で蓄積されたデータなので、いろいろ分析してみると面白いと思います。

今回実装したプログラムが入ったレポジトリ

https://github.com/kanakanho/youtube-watch-history-analysis

Postsに戻る