まよいのちはれ

まよいのちはれ

迷えるあなたに癒しと解決案を…。

YouTube APIを使って、Pythonで棒グラフにしてみた

推しをもっと応援したい!!

 

どうも、乃木坂46の”中村麗乃”さんを応援させてもらってます。

NaaaO(ナオ)です。

 

皆様、新たな推しを発見したときにする行動は何でしょうか?

 

そう!!

 

Youtubeで動画を探す」ではないでしょうか!(圧)

 

ということで、

今回はPythonさんを使って、Youtubeにおいて”中村麗乃”というキーワードが入っている動画の中で、何が一番見られているのかを調べました。

 

まぁ、Pythonさん使っている方にとっては簡単な内容になるかと思われます。。

 

 

 

作成イメージ

 

こんなものを作ります。

(2020/7/26時点、中村麗乃さんで見られている動画TOP10です)

 

f:id:NaaaO-nogi:20200727010632p:plain

(文字小さくてすみません。。)

 

 

1位はこちらです。(少しの間動画紹介にお付き合いください。)

www.youtube.com

 

なんですけど。。

こちらはれのちゃんだけの動画ではないので、れのちゃんで見られている動画の実質的な1位は

ちょこれ~の!

になりますね。

 

こちらです。

www.youtube.com

 

かわいい!!

 

ちなみに10位に自分が昔投稿したまとめ動画がのってました。。

興味あればどうぞ。。

 

www.youtube.com

 

 

コード・環境

環境は以下の通りです。

開発言語:Python3

IDE(統合開発環境):PyScripter

 

絵画に必要なpandasやNumpy等はpipでインストール済みです。

YouTubeのデータ集めに必要なAPIキーについても

以下のサイト様を参考に取得しております。

https://blog.codecamp.jp/programming-api-youtube

 

肝心のコードは以下になります。

from apiclient.discovery import build

YOUTUBE_API_KEY = '自分のAPIキー'

youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
import pandas as pd
import matplotlib.pyplot as plt

def get_video_info(part, q, order, type, num):
    dic_list = []
    search_response = youtube.search().list(part=part,q=q,order=order,type=type)
    output = youtube.search().list(part=part,q=q,order=order,type=type).execute()

    for i in range(num):
        dic_list = dic_list + output['items']
        search_response = youtube.search().list_next(search_response, output)
        output = search_response.execute()

    df = pd.DataFrame(dic_list)
    df1 = pd.DataFrame(list(df['id']))['videoId']
    df2 = pd.DataFrame(list(df['snippet']))[['channelTitle','publishedAt','channelId','title','description']]
    ddf = pd.concat([df1,df2], axis = 1)

    return ddf

df = get_video_info(part='snippet',q='中村麗乃',order='viewCount',type='video',num = 2)

def get_statistics(id):
    statistics = youtube.videos().list(part = 'statistics', id = id).execute()['items'][0]['statistics']
    return statistics

static = pd.DataFrame(list(df['videoId'].apply(lambda x : get_statistics(x))))

output = pd.concat([df,static], axis = 1)

output
output=output.astype({'viewCount': 'float32'})

ax = output.groupby('title').sum().sort_values(by = 'viewCount', ascending = False).plot( kind='bar', y = 'viewCount', figsize = (25,10), fontsize = 20)

fig = ax.get_figure()
plt.title("れのちゃんYoutube再生回数上位10件", fontname="MS Gothic")
plt.xticks(fontsize=10)
plt.xlabel("X軸", fontname="MS Gothic")
fig.savefig("Riria.png", bbox_inches="tight")

 

 

ほぼほぼこちらのサイト様のものをパクりました参考にさせていただきました。

https://qiita.com/g-k/items/7c98efe21257afac70e9 

 

おおまかな流れは、

①ようつべさんの動画情報を引っ張ってきてデータフレームを作る関数を用意する

②引数を渡して関数を使う(ここでは"中村麗乃”をキーワードに再生回数の多い順)

③追加で再生回数等の情報を引っ張ってくる関数を用意する

④引数を渡して関数を使う

⑤再生回数を型変換する

⑥プロット(グラフをつくる)する

⑦形を整え、画像で保存する

 

的な感じです。

 

注意点

いくつかひっかかったところがありましたので、備忘としても残しておきます。。

 

①型変換

②グラフの文字化け

 

①型変換

"output=output.astype({'viewCount': 'float32'})"の部分ですね。

再生回数が文字列型で返ってきてたので、floatで少数でも扱える数値型に変えております。

 

②文字化け

グラフにおこしたときに以下のようになってました。。

f:id:NaaaO-nogi:20200727014706p:plain

 

これは見えねぇ。(このときはチャンネル名でまとめてました。)

 

ということで以下のサイト様を参考に文字化け修正いたしやした。

https://code-graffiti.com/how-to-japaneseize-matplotlib/#toc2

 

まとめ

てな感じで、YouTubeの情報をもとにデータを引っ張ってきて、棒グラフを作ってみました!

 

ほかのメンバーにも活用できそうですね~。

僕のフォロワーさんはりりあさん推しも多いので一応はっときます。

f:id:NaaaO-nogi:20200727020036p:plain

 

 

いつか本格的な統計ができたらなとは思いますねぇ。

 

ではでは。