2026年9月15日火曜日

Google Cloud

Google Cloud(GCP)は、個人でも完全無料~実質無料で試すことができる。

  1. 無料試用枠(初回アカウント登録特典)

    • 特典内容: 90日間有効な$300分の無料クレジットがもらえる。
    • 条件: 初めてGoogle Cloudのアカウントを開設する場合。
    • ポイント: 登録時にクレジットカードの入力が必要だけど、勝手に有料プランへ自動移行されて課金されることはない。有料アカウントへ手動でアップグレードしない限り、無料枠を使い切ったら停止する仕組み。
  2. 常時無料枠(Always Free) 無料試用期間が終わった後も、規定の範囲内ならずーっと無料で使い続けられるリソースがたくさんある。

サービス名 常時無料の範囲(毎月) 主な使い道
Compute Engine (VM) e2-micro インスタンス 1台 (米国リージョン) 小さなWebサーバーやBotの稼働
Cloud Run 200万リクエスト/月 Dockerコンテナを使ったAPIやWebアプリ
Cloud Functions 200万回の呼び出し/月 イベント駆動型の軽いプログラム実行
Cloud Storage (GCS) 5GBの標準ストレージ 画像やデータの保存
BigQuery 1TB分のクエリ処理、10GBのストレージ SQLを使ったデータ分析の練習

Cloud Storage(データレイク役割)

  • CSV、JSON、画像、ログファイルなど、あらゆる生のデータを「とりあえずそのまま貯めておく」場所。
  • 料金がすごく安くて容量を気にせず置けるのが強み。

BigQuery(データウェアハウス役割)

  • Cloud Storage にあるCSVやParquetファイルを読み込んでテーブル化したり、直接取り込んで(ロードして)標準的なSQLで爆速分析・抽出する場所。
  • テラバイト級の巨大データでも数秒で抽出できるのが強み。


(GCSへの)データの読み込み方法

CSVからの読み込み

特に自社の業務システムから出力した顧客データや、外部のサービスからダウンロードした売上データなどはCSV形式が多いから、GCSにCSVをアップロードして分析するケースは一般的。

ただ、実務で膨大なデータ(何千万行・何億行)を扱う場合は、CSVよりも圧縮率が高くて高速に読み込めるParquet(パルケ)やJSONという形式に変換してGCSに置くことも多い。

Google Analytics(GA4)や AdSense との連携

GA4やAdSenseのデータをBigQueryに送ってSQLで分析するのは、マーケティング分析やWebメディア運営の現場で超定番の使われ方。

  1. Google Analytics (GA4) の場合
    • GCSを挟まずに「GA4 ➔ BigQuery」へ直接連携(エクスポート)する標準機能が用意されている。
    • ボタンひとつで設定できて、毎日自動でWebサイトの閲覧ログ(生のイベントデータ)がBigQueryに転送される。しかも標準の枠内なら転送自体は無料。
  2. AdSense や Google 広告 の場合
    • 「BigQuery Data Transfer Service」というGoogle Cloud内の定期転送機能を使ったり、APIを経由してBigQueryやGCSにデータを送る。
    • 広告のインプレッション数や収益データを自動で取得して、BigQuery上でGA4のアクセスデータと「JOIN(結合)」させることで、「どのページ・どの検索ワードから来たユーザーが一番収益を生んでいるか」をSQLで一発分析できるようになる。
データ元 連携ルート よく使われる形式
業務データ / CSV等 CSVデータ ➔ GCS ➔ BigQuery CSV / Parquet
Google Analytics (GA4) GA4 ➔ 直接 BigQuery 自動テーブル化
AdSense / Google Ads API / 転送機能 ➔ BigQuery (またはGCS) JSON / 自動テーブル化


お試しでやってみた内容

  1. まずは無料登録: $300分のクレジットをもらってアカウントを作る。
  2. 予算アラートを設定する: 万が一の請求を防ぐために、「10,000円を超えたら通知する」みたいな予算アラート(Budget Alert)を最初に設定しておく。
  3. AdSenseのレポートをcsv形式でダウンロードしてくる。
  4. Cloud Storage (GCS) にアップロードする。
  5. BigQueryからGCS上の外部テーブルを参照して、BigQuery Console上でSQLを叩いて集計
  6. Google Colabからの認証、BigQuery接続、Pythonでの集計とグラフ可視化

GCSの準備

  1. Cloud Storage(GCS)にバケットを作ってCSVをアップロード
    1. Google Cloud コンソールの左上メニュー(☰)から 「Cloud Storage」➔「バケット」 を選択。
    2. 上部にある 「+作成」 をクリック。
    3. バケット名 を入力(世界で一意の任意名、例: my-first-bucket-hoge-1234)。
    4. ロケーションタイプは 「Region」、ロケーションは 「asia-northeast1 (東京)」 を選択して、下部にある 「作成」 を押す。
    5. 作成されたバケット画面が開くので、「ファイルをアップロード」 を押して用意したCSVファイルをアップロード。
    6. アップロード完了後、CSVのファイル名をクリックして 「GCS URI」(gs://バケット名/ファイル名.csv のような文字列)をコピーしておく。
  2. BigQueryにデータセットを作成
    1. 左上メニューから 「BigQuery」 を選択。
    2. エクスプローラ欄にある自分のプロジェクト名(project-id)の右横にある 「︙(3つの点)」 をクリック ➔ 「データセットを作成」 を選択。
    3. データセット ID を入力(例: sample_dataset)。
    4. ロケーションタイプを 「asia-northeast1 (東京)」 に合わせたら、一番下の 「データセットを作成」 を押す。
  3. GCSのCSVからBigQueryテーブルを作成
    1. 今作成したデータセット名(sample_dataset)の右横にある 「︙」 をクリック ➔ 「テーブルを作成」 を選択。
    2. 以下の通りに設定入力:
      • ソース: 「ソース」で Google Cloud Storage を選択。
      • GCS バケットからファイルを選択: 先ほどコピーした GCS URI(gs://...)を貼り付け。
      • ファイル形式: CSV を選択。
      • テーブル: 作成するテーブル名を入力(例: test_table)。
      • スキーマ: 「自動検出(Auto detect)」 にチェックを入れる(列名やデータ型を自動で判断してくれる)。
      • だがAdSenseレポートの場合は、半角スペースやカッコがあってデフォルトの自動検出のままだとうまくいかないので、
        1. 下の方にある 「詳細オプション(Advanced options)」 をクリックして展開する。
        2. 「文字マップ(Character map)」 という項目を探して、初期値から 「V2」 に変更する。
        3. V2にすると、BigQueryが自動的に使える記号に置換してくれる。
        4. csvの側で列名を変更するならv2にせずともよい。
    3. 画面下部の 「テーブルを作成」 をクリックすれば完了!

バケット(Bucket)とは?

データをしまっておくための、最上位のフォルダのようなもの。Cloud Storage(GCS)では、ファイル(CSVや画像など)を直接クラウド上にぽんと置くことはできなくて、「必ずバケットという箱の中に保存する」というルールがある。

バケット名の特徴と決め方

  • 世界中でたったひとつ(ユニーク)の名前にする必要がある
    • Google Cloudを使っている世界中の誰とも被らない名前にする必要がある。
    • 例えば my-bucket や test みたいな名前はすでに誰かが使っているからエラーになっちゃう。
  • おすすめの命名パターン
    • 自分の名前や日付、ランダムな数字を組み合わせると被りにくくて作りやすい。
    • 例:hoge-data-202609 や my-sample-bucket-hoge-99

パソコンで例えると、

  • GCS全体 ➔ パソコンのハードディスク
  • バケット ➔ Cドライブ直下のメインフォルダ
  • ファイル ➔ その中に入れるCSVデータや画像

バケット名さえ決まれば、その中にCSVファイルをどんどん放り込めるようになる。


データセットIDとは?

BigQueryのなかで「複数のテーブルをまとめておくためのグループ名(フォルダ名)」のこと。「バケット」がCloud Storage側の道具箱だとしたら、「データセット」はBigQuery側の道具箱(データベース)みたいなイメージ。

  • プロジェクト ID: クラウド全体の契約単位
  • データセット ID: 関連するテーブルを束ねるフォルダ(スキーマ)
  • テーブル名: 実際のCSVデータが入った表

データセットIDの決め方ルール

  • バケット名とは違って世界中で被らないようにする必要はなくて、自分のプロジェクトの中で被らなければよい。
  • 使える文字: 半角の英数字とアンダースコア(_)
  • おすすめの名前: sample_dataset や test_db など、分かりやすい小文字の英数字で作れば大丈夫。
  • SQLを書くときも、プロジェクトID.データセットID.テーブル名 という形で指定してデータを呼び出すことになる。

BigQueryでSQLを使ってデータ抽出・集計

  1. SQLの実行手順
    • 作成したテーブル名(test_table)をクリック。
    • 画面上部にある 「クエリ」➔「新しいタブ」 をクリック。
    • エディタ領域(黒い画面)にSQLが入力できるようになる。
  2. まずは試してほしい基本のSQL
    • まずは全件取得して中身を確認するSQL(プロジェクトID.データセットID.テーブル名の部分は適宜書き換える)
SELECT * 
FROM `プロジェクトID.sample_dataset.test_table` 
LIMIT 10;

-- DATE型(日付型)のdate(yyyymmdd)カラムをyyyymmにする 
FORMAT_DATE('%Y%m', date) AS yyyymm,  -- 例: 202609
-- もしハイフンを入れたいなら FORMAT_DATE('%Y-%m', date)

縦持ちを横持ちにするならPIVOT

-- Max(CASE WHEN..としなくてもいい)
SELECT *
FROM (
  -- ① 元となる集計データを用意(前処理)
  SELECT 
    site,
    FORMAT_DATE('%Y%m', date) AS yyyymm,
    `Estimated earnings _JPY_` AS revenue
  FROM `プロジェクトID.sample_dataset.test_table`
)
-- ② PIVOTで yyyymm の値を横軸の列に展開する
PIVOT(
  SUM(revenue) FOR yyyymm IN ('202607', '202608', '202609')
)
ORDER BY site;

「毎月新しい年月が増えるたびに IN ('202601', '202602'...) のコードすら書き換えたくない」っていう場合は、BigQueryの動的SQL(Dynamic SQL)を使う

ただし、BigQueryでDECLAREやSETを使った手続き型スクリプト(複数行の処理)を実行すると、ステップごとの処理結果が別々のタブ(ステートメント)として出力される仕様になっている。なのでこれの実行結果を見るときは、一番最後のステートメントを選択する必要がある。

-- 存在する yyyymm をカンマ区切りの文字列として動的に生成して変数に入れる
DECLARE dynamic_months STRING;

SET dynamic_months = (
  SELECT STRING_AGG(DISTINCT CONCAT("'", FORMAT_DATE('%Y%m', date), "'"), ',' ORDER BY CONCAT("'", FORMAT_DATE('%Y%m', date), "'"))
  FROM `プロジェクトID.sample_dataset.test_table`
);

-- 動的にPIVOTクエリを作成して実行
EXECUTE IMMEDIATE FORMAT("""
  SELECT *
  FROM (
    SELECT site, FORMAT_DATE('%%Y%%m', date) AS yyyymm, `Estimated earnings _JPY_` AS revenue
    FROM `プロジェクトID.sample_dataset.test_table`
  )
  PIVOT(
    SUM(revenue) FOR yyyymm IN (%s)
  )
  ORDER BY site;
""", dynamic_months);


Google Colabからの認証、BigQuery接続

from google.colab import auth
from google.cloud import bigquery
import pandas as pd

# 1. Googleアカウントの認証(ポップアップが出るので許可するだけ)
auth.authenticate_user()

# 2. BigQueryクライアントの作成
project_id = '適宜指定'
client = bigquery.Client(project=project_id)

# 3. SQLの実行とPandas DataFrameへの格納
sql = """
SELECT site, SUM(`Estimated earnings _JPY_`) AS total_revenue
FROM `プロジェクトID.sample_dataset.test_table`
GROUP BY site
"""

# 結果を直接PandasのDataFrameとして取得
df = client.query(sql).to_dataframe()

# データ表示
print(df.head())


実務の運用で難しくなる3つのポイント

  1. データパイプラインの自動化(ETL / ELT)
    • 個人でお試し: 手動でCSVをGCSにアップロードしてBigQuery画面から取り込み。
    • 実務での運用: 毎日・毎時間にバッチ処理やストリーミングで自動転送させる(Cloud Composer/AirflowやCloud Pub/Subなどのツールを活用)。
  2. データクレンジングと例外処理
    • 個人でお試し: キレイなCSVを1回読み込ませる。
    • 実務での運用: 「途中でデータ型が変わった」「日付形式が崩れている」「欠損値がある」「二重送信された」といったエラーへの自動検知とリカバリ設計が必要。
  3. 大規模データでのコスト・パフォーマンス管理
    • 個人でお試し: 数千〜数万行のデータ(クエリ実行も数MB〜数GBでほぼ無料)。
    • 実務での運用: 数十億行(数TB〜数PB)のデータ。適当に SELECT * を叩くと1回のクエリで数千円〜数万円吹っ飛ぶリスクがあるため、パーティショニングやクラスタリングの設計が必須になる。

BigQueryとBigtable

  • BigQuery(データウェアハウス): 大量の過去データをまとめて集計・分析する(SQLでOLAP処理)。
  • Bigtable(NoSQLデータベース): ミリ秒単位の超高速な読み書きが必要なリアルタイム処理(IoTのセンサーデータ受信やソーシャルメディアのログなど)。

2026年5月13日水曜日

Python環境構築

よく忘れる

# どんな仮想環境あったっけ
conda env list
conda info -e  # どっちでもいい

# 仮想環境を有効化
conda activate pm5

conda deactivate

# 何を入れてたっけ
conda list

# 不要になった古い環境を削除
conda remove --name base_backup  --all
# condaのキャッシュ削除
conda clean --all

# 今ある環境をのうち1つをcopyしてbackupとしたい
conda create --name base_yyyymmdd --clone base


# 設定ファイル(YAML)を書き出しておくと、
conda env export > environment_20250505.yml

# もしもグダグダな環境になってしまったなどの場合は以下で全く同じ環境を再構築できる
conda env create -f environment_20250505.yml 
# 別の名前で新しい仮想環境を作りたい場合は
conda env create -f environment_20250505.yml  -n new_project_name


# condaの復元機能: インストールするたびに、変更前の状態を記録してくれるrevisionという機能がある
conda list --revisions
# これを見ると、何時何分に何を入れたかが履歴として出てくる。
# もし新しいライブラリを入れて壊れたら、番号を指定してサクッと戻せる。
conda install --revision 5  # 5番の状態に戻す



homebrewを削除して一度きれいにするまでのなんやかんや(クリックで展開)

まっさらにしていく

# brewで入ってるもの確認
brew list --formula
brew list --cask

# homebrew含め全部削除する
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"
Homebrew uninstalled!
The following possible Homebrew files were not deleted:
/opt/homebrew/bin/
/opt/homebrew/etc/
/opt/homebrew/lib/
/opt/homebrew/share/
/opt/homebrew/var/
You may wish to remove them yourself.

と言われるので、

sudo rm -rf /opt/homebrew/bin
sudo rm -rf /opt/homebrew/etc
sudo rm -rf /opt/homebrew/lib
sudo rm -rf /opt/homebrew/share
sudo rm -rf /opt/homebrew/var

ディレクトリが消えているか確認する

# ターミナルで:
ls /opt/homebrew
# 何も表示されなければ削除成功
#まだ残っていたら、ディレクトリ名が表示される

# brew コマンドが使えないか確認
brew --version
# command not found と出れば Homebrew はもう存在しない
# もしバージョンが出たら、どこかに残ってる

# PATH に残っていないか確認
echo $PATH
# /opt/homebrew/bin が PATH に残っていなければ OK
# .zshrc や .bash_profile に残っている場合は、手動で削除

vim ~/.zshrc
# 編集したら保存して

# シェルを再読み込み
source ~/.zshrc

# シェルを完全に再起動
# すでに開いているターミナルは古い環境を保持している場合がある
# 新しいターミナルを開いて確認

改めてHomebrewを新規インストール

# https://brew.sh/ja/
# macOSをお使いの場合は新しい.pkgインストーラーをお試し下さい とのことなので.pkgを落としてきて実行
# https://github.com/Homebrew/brew/releases/tag/4.6.6

vim ~/.zshrc
# export PATH='hoge'の下に eval "$(/opt/homebrew/bin/brew shellenv)" を追記

# ちゃんとbrewがインストールできたかの確認
brew help
# 大丈夫っぽい

# 現在の PATH を確認
echo $PATH
# PATH のどこかに /opt/homebrew/bin が含まれていればOK

which brew 
# 出力が /opt/homebrew/bin/brew になっていれば、正しく PATH が設定されている

miniforgeインストール

brew install miniforge

# condaのバージョン確認
conda --version
# conda 25.3.1 versionを返してくれればcondaの準備はOKです

pymc5用

一応動作はしてるが、condaとpipを混ぜてるのであまりいい状態ではないかも
conda create --name pm5 python=3.11

conda init zsh
# として、ターミナル再度立ち上げ直す

conda activate pm5

# pymc5をインストール https://www.pymc.io/projects/docs/en/latest/installation.html
conda install -c conda-forge "pymc>=5"
# arviz, graphviz, numpy, pandas, scipyなども一緒に入る

conda install -c conda-forge seaborn matplotlib ipykernel ipywidgets
# statsmodelsも入る

# conda install -c conda-forge prophet  # ないって言われる
python -m pip install prophet
# https://facebook.github.io/prophet/docs/installation.html#python

python -m pip install tfcausalimpact
# https://github.com/WillianFuks/tfcausalimpact

# 以下がないとprophetというかパラメーターの最適化だっけ、後半のところができないみたい
conda install -c conda-forge dask
conda install -c conda-forge plotly

imagemagickインストール

brew install imagemagick
# python 3.13がインストールされちゃったのを削除する
brew uninstall --ignore-dependencies python

brewの要らなくなったのを削除

brew cleanup  # 古いキャッシュや不要ファイルを削除(推奨)
brew cleanup --prune=0  # すべて のキャッシュと不要ファイルを削除
brew autoremove  # 依存関係がなくなったパッケージを削除
rm -rf $(brew --cache)  # キャッシュ全削除
conda clean --all  # すべてのキャッシュ・不要ファイルを削除(推奨)



pycaret用

  • condaでやるとpycaret動作させるまでに手こずる
  • colabだとpythonバージョンが新しすぎてpycaret動作しない
  • よって、pythonとpycaretのバージョンはほどほどにしつつ、pycaretを確実に動作させるために、基本pipで入れていく
conda create -name pyc3 python=3.10
conda activate pyc3
pip install pycaret==3.0.4
# このときmatplotlib numba numpy pandas plotly scikit-learn scipyもpip(pypi)で入ってる

pip install "pycaret[analysis]==3.0.4"

pip install jpholiday
python -m pip install jpholiday

で、VS codeで、

from pycaret.classification import * しようとすると、

ImportError: cannot import name 'interp' from 'scipy' (/opt/homebrew/Caskroom/miniforge/base/envs/pyc3/lib/python3.10/site-packages/scipy/init.py) と言われた

pip install "scipy<1.13.0" 状況変わらず

pip install scipy==1.11.4

ImportError: cannot import name '_format_load_msg' from 'joblib.memory' (/opt/homebrew/Caskroom/miniforge/base/envs/pyc3/lib/python3.10/site-packages/joblib/memory.py)

conda list joblib のバージョンは、1.5.3だったので

pip install joblib==1.3.2

import pycaretしないままだったので、ひょっとしたら

pip install scipy==1.11.4 pip install joblib==1.3.2 はやらなくてもよかったのかもしれないが、

from pycaret.classification import *は通った。

でも、reg1 = setup(df1, target="is_purchased", session_id=1)でNameError: name 'pkg_resources' is not defined と言われる。

pip install "setuptools<70.0.0"

Successfully installed setuptools-69.5.1

無事にpycaretは実行できるようになった。

pip freeze > before_seaborn.txt
# conda list --export > conda_env_before_seaborn.txt # 上と同じなのでやらなくていい

conda list > conda_list_before_seaborn.txt

とか思ってたが見落としてただけでseaborn入ってたー

なのでこれでひとまずOKとして終了




streamlit

import streamlit as st
# に続けてだいたいいつもの感じでpythonコード書いておいて

hoge.pyで保存しておいて、ターミナルで

streamlit run hoge.py

とすることで、ブラウザ起動して実行できる