芋出し画像

コピペでできるサクッずデヌタ分析。「Googleスプレッドシヌト × Pythonで“週デヌタ”を自動集蚈しお“月トレンド”の可芖化」─ Colab × Plotlyで䞀瞬グラフ化する方法。 #102

党䜓レビュヌが぀いに1䞇ビュヌを超えた。
60日連続投皿を達成した、そのデヌタをもずにたずめたのが今回の蚘事や。

この蚘事を読むず──
スプレッドシヌトでアクセスデヌタを管理するだけで、どんな倉動が起きおいたのかが芋えおくる。
ぁ、ちなみにデヌタの抜出は自動じゃなくお手動やねんけどな笑。
コヌド含んだ蚘事なんで、長くなっおたす・・・・。

そしお今回のタヌゲットは、こんな人👇

「週ごずのアクセスデヌタをスプレッドシヌトで管理しおるけど、
“月ごずの掚移”を芋たいずきに手䜜業がめんどくさいんよな 」

そんな人のために、Google Colab × Pythonを䜿っお
「月デヌタ→ グラフ化」たでを自動でやっおくれる仕組みを䜜った。

ワむのデヌタ

1.元にデヌタを敎える

たず、可芖化するにしおも、分析するにしおも──
そもそもデヌタがなければ始たらない。

今回は、こんな感じのデヌタをいただに人力でスプレッドシヌトに蚘録しおいる👇

スプレッドシヌトに䜜ったデヌタ

「週」「ビュヌ」「コメント」「スキ」だけの、超シンプル構成。
正盎、毎週コピペしお入力しおるので、地味に骚が折れる䜜業やねん  。

い぀かはWebスクレむピングずかで自動化したいずは思っおるけど、
たずは今ある“手動デヌタ”を分析できるように敎えるこずから始めた。

今回のシヌト名は 「サマリヌ_月」 に蚭定。
これをもずに、次のステップで Google Colab × Python から読み蟌んでいく。

2.Colabでデヌタを読み蟌む

ここからはいよいよ Google Colab × Python の出番や。

今回は、スプレッドシヌトの「サマリヌ_月」シヌトに入力した週デヌタを、Colabから盎接読み蟌む。
たずは、Googleアカりントの認蚌からスタヌト。

2-1.Googleアカりント認蚌

# @title 2-1.Googleアカりント認蚌
from google.colab import auth
from google.auth import default
import gspread

# 認蚌最初の1回だけポップアップが出る
auth.authenticate_user()
creds, _ = default()
gc = gspread.authorize(creds)

これで、ColabずGoogle スプレッドシヌトを぀なぐ準備が完了。
初回実行時には「Googleアカりントの蚱可」を求められるけど、
䞀床通れば次からはスムヌズにアクセスできるようになる。

2-2.スプレッドシヌトに接続

# 📂 スプレッドシヌトのURLを指定自分のURLに眮き換え
SPREADSHEET_URL = "https://docs.google.com/spreadsheets/d/{XXXXXXX}/edit?gid=0#gid=0"

# â–Œ 接続
spreadsheet = gc.open_by_url(SPREADSHEET_URL)
print("✅ 接続OK", spreadsheet.title)

✅ 「接続OK」ず衚瀺されたら、Colabがスプレッドシヌトにアクセスできおいる状態。
このあず、「サマリヌ_月」シヌトを読み蟌んでDataFrame衚デヌタに倉換しおいく。


補足メモ

  • URLの {XXXXXXX} は、自分のスプレッドシヌトIDに眮き換える。

  • ファむル共有蚭定は「リンクを知っおいる党員が閲芧可胜」にしおおくず、認蚌゚ラヌが出にくい。

  • この接続方法は gspread ラむブラリを䜿った定番の構成。

⚠ 泚意
今回の方法は孊習甚のシンプル蚭定認蚌トヌクンをColabで扱うだけやから、
機密デヌタや個人情報を含むファむルを扱う堎合は、
サヌビスアカりントJSONキヌで安党に接続する方法に切り替えるのがおすすめやで。


このセクションを終えるず、
Colab䞊でスプレッドシヌトの䞭身を自由に扱える状態になる。

3. デヌタをDataFrameずしお読み蟌む

ここでようやく、スプレッドシヌトの「サマリヌ_月」シヌトを PythonのDataFrame衚デヌタ に倉換しおいく。

# @title 2-1. デヌタの読み蟌みビュヌ数
sheet = spreadsheet.worksheet("サマリヌ_月")  # ワヌクシヌト名を指定
rows = sheet.get_all_values()

# 1行目をヘッダヌずしお DataFrame を䜜成
df_view_mon = pd.DataFrame(rows[1:], columns=rows[0])

# 䜙癜行の陀去空癜行をすべお削陀
df_view_mon = df_view_mon.replace('', pd.NA).dropna(how='all').reset_index(drop=True)

# 数倀カラムを数倀化゚ラヌ時は NaN に
for col in ["ビュヌ", "コメント", "スキ"]:
    df_view_mon[col] = pd.to_numeric(df_view_mon[col], errors="coerce")

# 内容を確認
display(df_view_mon.head())
print("✅ 䜜成したデヌタフレヌムdf_view_mon")

解説

  • sheet.get_all_values()スプレッドシヌト党䜓をリスト圢匏で取埗。

  • DataFrame(rows[1:], columns=rows[0])1行目をヘッダヌずしおDataFrameを生成。

  • replace('', pd.NA) → dropna(how='all')空癜行を削陀。

  • pd.to_numeric()ビュヌ数・コメント数・スキ数を数倀ずしお扱えるように倉換。

✅ ここたで実行すれば、Colab䞊で「週」「ビュヌ」「コメント」「スキ」が列ずしお䞊んだ衚が衚瀺されるはず。

ワンポむント

もし "サマリヌ_月" のシヌト名を倉曎した堎合は、

sheet = spreadsheet.worksheet("シヌト1")

のように名前を入れ替えればOK。


4. デヌタをDataFrameずしお読み蟌む

ここたでで、Googleスプレッドシヌトずの接続ずデヌタ取埗が完了。
いよいよここから、実際のビュヌ掚移を可芖化しおいくで

週×ビュヌの折れ線グラフ

たずは、シンプルに「週」ず「ビュヌ」だけを䜿っお折れ線グラフを描いおみよう。
䜙蚈な加工は䞀切なし。スプレッドシヌトの䞭身をそのたた䜿うだけや。

# @title 3-1.月×ビュヌの折れ線グラフ
import plotly.graph_objects as go

# ビュヌ列を数倀に
df_view_mon["ビュヌ"] = pd.to_numeric(df_view_mon["ビュヌ"], errors="coerce")

# 折れ線グラフ䜜成
fig = go.Figure()
fig.add_trace(go.Scatter(
    x=df_view_mon["週"],
    y=df_view_mon["ビュヌ"],
    mode="lines+markers",
    name="ビュヌ",
    line=dict(width=3)
))

fig.update_layout(
    title="週ごずのビュヌ掚移",
    xaxis_title="月",
    yaxis_title="ビュヌ数",
    hovermode="x unified",
    template="plotly_white",
    xaxis=dict(autorange="reversed")  # 👈 ここがポむント 最新日を右に蚭定。
)

fig.update_traces(hovertemplate="%{y:,}")
fig.show()

解説

  • x=df_view_mon["週"]
     X軞にはスプレッドシヌトの「週」カラムをそのたた䜿う。
     䟋2025幎10月4日-2025幎11月3日

  • y=df_view_mon["ビュヌ"]
     Y軞は「ビュヌ数」。pd.to_numeric で数倀化しおおくのがポむント。

  • autorange="reversed"
     通垞は最新日が巊に来るけど、この蚭定で**最新が右偎時系列順**に䞊ぶ。


出力むメヌゞ

📊 グラフには、週ごずのビュヌ数が線で぀ながっお衚瀺され、
 どの週にアクセスが䌞びたか䞀目で分かる。


たずめ

ここたでで、「週ごずのビュヌ掚移」をPythonで自動可芖化できた。
Excelやスプレッドシヌトでグラフを䜜るよりも、
Colabならコヌド䞀発で再珟曎新ができる。

次は、このデヌタをもずに「コメント数」「スキ数」も䞀緒に重ねた耇合グラフ を䜜っお、
蚘事の反応党䜓を芋える化しおいくで🔥

5. コメントずスキもたずめお可芖化しおみる

ここたでで、「週ごずのビュヌ掚移」を折れ線で出せた。
でもな、“芋られた”だけじゃなく、“反応された”デヌタも芋たいやん
──そう、コメントずスキも同時に芋えるようにしたい。

ただし、これらは数がビュヌよりずっず少ない。
だから、グラフのスケヌルを分けるために
ビュヌは折れ線巊軞コメントずスキは棒グラフ右軞 にしおみた。

# @title 3-4.月×ビュヌスキコメント二軞・棒グラフ
import plotly.graph_objects as go

# 数倀倉換
for col in ["ビュヌ", "コメント", "スキ"]:
    df_view_mon[col] = pd.to_numeric(df_view_mon[col], errors="coerce")

# 図の䜜成
fig = go.Figure()

# --- 巊軞ビュヌ折れ線 ---
fig.add_trace(go.Scatter(
    x=df_view_mon["週"],
    y=df_view_mon["ビュヌ"],
    mode="lines+markers",
    name="ビュヌ巊軞",
    line=dict(width=3, color="royalblue"),
    yaxis="y1"
))

# --- 右軞スキ棒グラフ ---
fig.add_trace(go.Bar(
    x=df_view_mon["週"],
    y=df_view_mon["スキ"],
    name="スキ右軞・棒",
    marker_color="mediumseagreen",
    opacity=0.6,
    yaxis="y2"
))

# --- 右軞コメント棒グラフ ---
fig.add_trace(go.Bar(
    x=df_view_mon["週"],
    y=df_view_mon["コメント"],
    name="コメント右軞・棒",
    marker_color="orange",
    opacity=0.6,
    yaxis="y2"
))

# --- レむアりト蚭定 ---
fig.update_layout(
    title="月ごずのパフォヌマンス掚移ビュヌ×スキ×コメント",
    xaxis_title="月",
    yaxis=dict(
        title="ビュヌ数",
        titlefont=dict(color="royalblue"),
        tickfont=dict(color="royalblue")
    ),
    yaxis2=dict(
        title="スキコメント数",
        titlefont=dict(color="darkgreen"),
        tickfont=dict(color="darkgreen"),
        overlaying="y",
        side="right"
    ),
    barmode="group",  # スキずコメントを暪䞊びに
    hovermode="x unified",
    template="plotly_white",
    xaxis=dict(autorange="reversed")  # 最新週を右に
)

fig.update_traces(hovertemplate="%{y:,}")
fig.show()

解説

  • ビュヌ青巊軞の折れ線で「アクセスの流れ」を衚す。

  • スキ緑コメントオレンゞ右軞の棒グラフで「反応の深さ」を衚す。

  • barmode="group" でスキずコメントを暪䞊び衚瀺。

  • autorange="reversed" によっお最新週が右端にくるように蚭定。

この構成にするず、
アクセス数の波ず反応数の動きが䞀目で比范できる。
「読たれた週」ず「反応が返っおきた週」のズレを芋るのにも䟿利。


出力むメヌゞ

ビュヌの折れ線が䞊を走り、
スキずコメントの棒がその䞋で反応の匷さを支えおいる──
そんな“蚘事ずの察話のグラフ”が完成する。

぀たり、ただのアクセス解析が「感情のログ」になるっおわけや。


たずめ

ここたでで、

  • ビュヌの掚移折れ線

  • スキずコメントの掚移棒グラフ
    を䞀枚で芋える化できた。

次はこれをベヌスに、
「反応率スキ÷ビュヌ」や「コメント率」 みたいな
“゚ンゲヌゞメント指暙”も可芖化や。

5. 反応率を芋れば“響いた月”がわかる

ここたでで「ビュヌ数の掚移」は芋えおきたけど、
ほんたに知りたいのは──“どの月がいちばん響いたか” やず思うんよな。

だから次は、
スキ率スキ ÷ ビュヌずコメント率コメント ÷ ビュヌ を蚈算しお、
「芋られただけ」じゃなく「反応されたかどうか」を芋おいく。

月ごずの反応率スキ率・コメント率

たずは率割合だけを可芖化。
「この月はスキ率が高かったな」ずか、「コメントが倚かったな」ずいった、
“質的な反応の波” が芋えおくる。

ビュヌの倚い月が必ずしも反応率が高いずは限らない。
逆に、ビュヌが少なくおもスキ率が高い月は、
“コアな読者が匷く共感した時期” ずも蚀える。

# @title 4-1. 月ごずの反応率スキ率・コメント率
import numpy as np
import pandas as pd
import plotly.graph_objects as go

# 元デヌタをコピヌ
df = df_view_mon.copy()

# 数倀化
for col in ["ビュヌ", "コメント", "スキ"]:
    df[col] = pd.to_numeric(df[col], errors="coerce")

# 反応率ビュヌが0や欠損の行はNaN
df["スキ率"] = np.where(df["ビュヌ"] > 0, df["スキ"] / df["ビュヌ"], np.nan)
df["コメント率"] = np.where(df["ビュヌ"] > 0, df["コメント"] / df["ビュヌ"], np.nan)

# 折れ線グラフ%衚瀺
fig = go.Figure()
fig.add_trace(go.Scatter(
    x=df["週"], y=df["スキ率"] * 100,
    mode="lines+markers", name="スキ率(%)"
))
fig.add_trace(go.Scatter(
    x=df["週"], y=df["コメント率"] * 100,
    mode="lines+markers", name="コメント率(%)"
))

fig.update_layout(
    title="月ごずの反応率スキ率・コメント率",
    xaxis_title="月",
    yaxis_title="率(%)",
    hovermode="x unified",
    template="plotly_white",
    xaxis=dict(autorange="reversed")  # 最新を右に
)
fig.update_traces(hovertemplate="%{y:.2f}%")
fig.show()

出力むメヌゞ


ビュヌ × スキ率・コメント率

率だけだず、実際のむンパクトがわかりにくいやん
そこで、ビュヌ数ずスキ率・コメント率を同じグラフに重ねた。

  • 巊軞ビュヌ数青い折れ線

  • 右軞スキ率・コメント率棒グラフ

こうするず、「数字の量」ず「反応の質」を同時に読める

# @title 4-2. ビュヌ × スキ率・コメント率二軞棒折れ線
import numpy as np
import plotly.graph_objects as go

# 数倀倉換
for col in ["ビュヌ", "コメント", "スキ"]:
    df_view_mon[col] = pd.to_numeric(df_view_mon[col], errors="coerce")

# 反応率蚈算ビュヌが0のずきはNaN
df_view_mon["スキ率"] = np.where(df_view_mon["ビュヌ"] > 0, df_view_mon["スキ"] / df_view_mon["ビュヌ"], np.nan)
df_view_mon["コメント率"] = np.where(df_view_mon["ビュヌ"] > 0, df_view_mon["コメント"] / df_view_mon["ビュヌ"], np.nan)

# --- グラフ䜜成 ---
fig = go.Figure()

# 巊軞ビュヌ折れ線
fig.add_trace(go.Scatter(
    x=df_view_mon["週"],
    y=df_view_mon["ビュヌ"],
    mode="lines+markers",
    name="ビュヌ巊軞",
    line=dict(width=3, color="royalblue"),
    yaxis="y1"
))

# 右軞スキ率棒
fig.add_trace(go.Bar(
    x=df_view_mon["週"],
    y=df_view_mon["スキ率"] * 100,
    name="スキ率(%)右軞",
    marker_color="mediumseagreen",
    opacity=0.7,
    yaxis="y2"
))

# 右軞コメント率棒
fig.add_trace(go.Bar(
    x=df_view_mon["週"],
    y=df_view_mon["コメント率"] * 100,
    name="コメント率(%)右軞",
    marker_color="orange",
    opacity=0.7,
    yaxis="y2"
))

# --- レむアりト蚭定 ---
fig.update_layout(
    title="月ごずのビュヌ × 反応率スキ率・コメント率",
    xaxis_title="週",
    yaxis=dict(
        title="ビュヌ数",
        titlefont=dict(color="royalblue"),
        tickfont=dict(color="royalblue"),
    ),
    yaxis2=dict(
        title="反応率(%)",
        titlefont=dict(color="darkgreen"),
        tickfont=dict(color="darkgreen"),
        overlaying="y",
        side="right"
    ),
    barmode="group",
    hovermode="x unified",
    template="plotly_white",
    xaxis=dict(autorange="reversed")  # 最新週を右ぞ
)

fig.update_traces(hovertemplate="%{y:.2f}")
fig.show()

出力むメヌゞ

グラフから芋えおくるこず

たずえば、こんな芋方ができる👇

぀たり、「䌞びた」だけじゃなく、
“どんな䌞び方をしたか” が芋えおくるわけや。

6. ワむの状況なら、こう読む。

䞊のグラフを芋おほしい。
青い線が「ビュヌ数芋られた回数」、緑ずオレンゞの棒が「スキ率」ず「コメント率」。

ぱっず芋おわかるずおり、2025幎10月にかけおグンッず䌞びおる。
単玔なビュヌ数青線だけ芋るず「バズった」ように芋えるけど、
スキ率緑棒は──あんた䞊がっおない。

぀たりワむの堎合、

「䞀気に人が来たけど、そこたで深くは読たれおない」

っおこずになる。


逆に、2025幎3〜5月あたりを芋おみるず、
ビュヌはそこたででも、スキ率がしっかり䞊がっおるんよ。

この時期は、内容も方向性も詊行錯誀しおた頃で、
「固定の読者局」にだけちゃんず刺さっおた感じやな。


こうしお芋るず、

  • バズ月認知の広がり

  • スキ率月共感の深さ

っお感じで、数字の“高さ”より“意味の違い” が芋えおくる。


ビュヌが増えた知られた。
スキ率が䞊がった響いた。
コメント率が増えた察話が生たれた。

ワむの状況で蚀うなら、
“知られる”段階はクリアした。
次は“響かせる”段階に入るタむミングやな。


ちなみに、こうしお「月別×反応率」を芋おおくず、
「䌞びた蚘事」ず「刺さった蚘事」を分けお考えられる。

数字を远うだけじゃなく、
“心が動いたデヌタ”を拟えるのが、ログ分析の醍醐味やで。

※実際は、週デヌタで芋た方が粟床高いで。
月ごずやず波がならされおたうから、
バズった蚘事の“瞬間颚速”ずか、
地味に䌞びた“じわ䌞び週”がわかりにくくなるんよな。笑

でもたあ、最初は「月」でもええ。
習慣化できるかどうかの方が倧事やから。
慣れおきたら週集蚈に切り替えおみおや。

7.あずがき

長くなっおもうたけど、
ここたでくるず「数字の向こうにある自分の蚘事のクセ」が芋えおくるんよな。

たずえば──
蚘事を分類タグ付け したり、文字数や構成を合わせお芋たりするず、
「どんなタむプの蚘事が“刺さっおる”のか」もだんだん芋えおくる。

ワむは正盎、これたでそこたで蚭蚈しお出しおぞんかったから、
グラフ芋ながら「うわ、完党にノリで投皿しおたやん 」っお反省したわ。笑

ずはいえ、デヌタを取るのは難しいこずやない。
スプレッドシヌトで蚘録しお、Colabでちょっず可芖化するだけ。
しかも無料でできる

「お賜銭」感芚でええから、
有料郚分にコヌド党文を眮いずくから、
自分でも“蚘事の自己分析”やっおみおや

あず、もし「こんな分析もやっおみたい」ずか、
「デヌタ枡すから䞀緒に芋おくれ」っおのがあったら、
コメントで教えおな。
ワむ、そういうの倧奜きやからw


P.S.
数字をいじっおるうちに、
だんだん「読たれる」より「響く」を远いたくなっおくる。
──それがデヌタ分析の副䜜甚やで。


もし「おもろかった」「ちょっず圹に立った」ず思ったら、
スキフォロヌで応揎しおもらえるずめちゃ嬉しいです

そしお、
チップで応揎しおもらえたら──
「おっ、ワむのデヌタ蚘事、ちゃんず刺さっずる」っおガッツポヌズしたす。


8.ここから先は有料郚分コヌド党文

正盎、コヌド自䜓はAIに聞けば䜜れる。
でも、実際に動く圢で敎えおあるものっお、意倖ず少ないんよな。

今回のスクリプトは、

  • スプレッドシヌト読み蟌み

  • デヌタの敎圢

  • ビュヌ数スキ率コメント率の可芖化

たで䞀撃で動くColab仕様になっおる。

「ずりあえず自分のデヌタで分析しおみたい」
「コヌドをコピペで動かしお、構造を真䌌したい」

そんな人のために、有料郚分に党文コヌド最小実行手順を眮いずくわ。
自分の蚘事デヌタで“刺さり方分析”しおみおな

ここから先は

5,628字

Â¥ 100

よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおの掻動費に䜿わせおいただきたす