Google Colab + pandasデータ分析入門 〜コピペで動く、はじめてのデータ分析〜

攻略法

Google Colab + pandasデータ分析入門 〜コピペで動く、はじめてのデータ分析〜

DDASH Hacksの運営協力をしているCraftStadiumの山本です。
本記事では、DDASH Hacksに臨むにあたって役立つ情報を共有します。
なお、本内容は教員や審査員による公式な見解、または監修を受けたものではありません。

この記事の3行まとめ

  • Google Colabなら環境構築ゼロ。ブラウザだけでPythonのデータ分析が始められます
  • pandasでデータの読み込み→加工→集計→可視化まで、全手順をコピペで体験できます
  • 最終的に「自分のハッカソンテーマで、オープンデータを分析してグラフにする」ができるようになります

この記事のゴール

この記事を最後まで読んで手を動かすと、こんなことができるようになります。

Before: Pythonは少し触ったことあるけど、データ分析って何するの?

After: オープンデータをダウンロードして、pandasで加工して、グラフにして、「だからこのサービスが必要だ」と言えるようになる

具体的には、以下の7ステップで進めます:

  1. Google Colabの環境を準備する(セクション1)
  2. pandasでオープンデータを読み込む(セクション2)
  3. フィルタリング・集計・結合でデータを加工する(セクション3)
  4. Plotly Expressでインタラクティブなグラフを作る(セクション4)
  5. 気象庁のAPIからリアルタイムデータを取得する(セクション5)
  6. 分析結果から考察を導き、ハッカソンのプレゼンに落とし込む(セクション6)
  7. チームでの共有方法と3日間の時間配分を押さえる(セクション7)

所要時間: 全部通しで約60〜90分。セクションごとに区切れるので、1日30分ずつでもOKです。

1. Google Colabを使えるようにする(5分)

Google Colabとは

Google Colabは、Googleが無料で提供しているPythonの実行環境です。特徴はこの3つ

  1. 環境構築が一切不要。 ブラウザでアクセスするだけでPythonが動きます
  2. pandas、numpyなど主要ライブラリがプリインストール済み。 すぐにデータ分析を始められます
  3. Googleドキュメントのように共同編集できる。 チームで1つのノートブックを同時に編集可能です

始め方

  1. Google Colab (外部リンク) にアクセス
  2. Googleアカウントでログイン
  3. 「ノートブックを新規作成」をクリック

これだけです。画面が開いたら、灰色のセル(入力欄)に以下を入力して Shift + Enter を押してみてください:

print("Hello, DDASH Hacks!")

Hello, DDASH Hacks! と表示されたら準備完了です。

知っておくべき2つのこと

① セルには2種類あります

  • コードセル: Pythonのコードを書いて実行する場所。Shift + Enter で実行
  • テキストセル: メモや説明を書く場所。上部メニューの「+テキスト」で追加

② 放置するとデータが消えます

Google Colabは約90分操作しないとセッションが切断されます。切断されると、読み込んだデータや作った変数がすべてリセットされます。

対策は簡単です。大事なデータはGoogle Driveに保存しましょう。

# Google Driveをマウント(接続)する
from google.colab import drive
drive.mount('/content/drive')

初回実行時にGoogleアカウントの認証画面が出ます。「許可」を押してください。

これでGoogle Drive内のファイルに /content/drive/MyDrive/ というパスでアクセスできるようになります。データの保存方法は後ほど説明します。

2. pandasでデータを読み込む

まず最初のセルでライブラリを読み込む

Google Colabの一番上のセルに、以下を貼り付けて実行してください。この記事全体で使うライブラリをまとめてインポートします:

# ============================================
# DDASH Hacks 2025 - データ分析スターターキット
# このセルを最初に実行してください
# ============================================

データ操作(プリインストール済み)

import pandas as pd
import numpy as np

可視化(プリインストール済み・日本語が設定なしで表示できる)

import plotly.express as px

APIからデータを取得する用(プリインストール済み)

import requests
import json

バージョン確認

print(f"pandas: {pd.version}")
print("✅ 準備完了!")

💡 ポイント: pandasnumpyplotlyrequests はGoogle Colabにプリインストールされているので、追加インストールは不要です。もし ModuleNotFoundError が出た場合は、セルの先頭に !pip install パッケージ名 を追加して実行してください。

💡 ポイント: import pandas as pdas pd は「pandasをpdという省略名で使います」という意味です。毎回 pandas.read_csv() と書く代わりに pd.read_csv() と短く書けるようになります。

サンプルデータで練習する

まずは小さなデータで基本操作を覚えましょう。以下のコードは、都道府県別の人口データを手入力で作成します:

# サンプルデータを作成
data = {
    "都道府県": ["北海道", "東京都", "愛知県", "大阪府", "京都府", "福岡県", "沖縄県"],
    "人口(万人)": [522, 1404, 748, 884, 258, 513, 147],
    "面積(km²)": [83424, 2194, 5173, 1905, 4612, 4987, 2283],
    "地方": ["北海道", "関東", "中部", "近畿", "近畿", "九州", "九州"]
}

df = pd.DataFrame(data)
df

実行すると、きれいな表が表示されるはずです。この dfDataFrame(データフレーム) ——pandasの基本的なデータ構造で、Excelのシートのようなものです。

データの全体像をつかむ4つのコマンド

データを読み込んだら、まずこの4つを実行する癖をつけてください:

# ① 最初の5行を表示(データの雰囲気をつかむ)
df.head()
# ② データの形を確認(何行×何列あるか)
df.shape
# → (7, 4) と表示される = 7行4列
# ③ 各列の型と欠損値を確認
df.info()
# → 各列のデータ型(int64=整数、object=文字列など)が分かる
# ④ 数値列の統計情報を確認
df.describe()
# → 平均、最大、最小、中央値などが一覧で出る

💡 ポイント: この4つは「データを読み込んだら最初に必ずやること」として覚えてください。ハッカソン本番でも、新しいデータを入手したらまずこの4つを実行して全体像を把握します。

実際のオープンデータを読み込む

サンプルデータで感覚がつかめたら、次は実際のオープンデータを読み込んでみましょう。CSVファイルの読み込み方法は主に3つあります:

方法① URLから直接読み込む(最も簡単)

# 例:SSDSE(教育用標準データセット)の都道府県別データを直接読み込む
# ※ SSDSE(統計センター提供)はデータサイエンス教育用の整備済みデータセットです
url = "https://www.nstac.go.jp/sys/files/SSDSE-E-2025.csv"
df_ssdse = pd.read_csv(url, encoding="shift_jis")
df_ssdse.head()

💡 注意: URLから直接読み込めるデータソースは限られています。e-StatやDATA.GO.JPなど、ダウンロードにボタン操作が必要なサイトでは方法②を使ってください。

方法② パソコンからアップロードして読み込む

e-StatやDATA.GO.JPからCSVをダウンロードした場合は、Colabにアップロードします:

# ファイルアップロード用のコード
from google.colab import files
uploaded = files.upload()  # ← 実行するとファイル選択ダイアログが出る

アップロードしたCSVを読み込む

import io
df = pd.read_csv(io.BytesIO(uploaded[list(uploaded.keys())[0]]))
df.head()

方法③ Google Driveから読み込む(チーム共有に便利)

# 事前にGoogle Driveをマウントしておく
from google.colab import drive
drive.mount('/content/drive')

Driveに保存したCSVを読み込む

df = pd.read_csv('/content/drive/MyDrive/data.csv')
df.head()

📌 DDASH Hacksでのおすすめ: チームで作業する場合は方法③がベスト。Google Driveの共有フォルダにCSVを置いておけば、全員が同じデータにアクセスできます。

文字化けしたときの対処法

日本語データを読み込むとき、文字化けすることがあります。その場合は encoding を指定してください。

# Shift-JIS(日本のCSVに多い・特にWindowsで作られたファイル)
df = pd.read_csv('data.csv', encoding='shift_jis')

CP932(Shift-JISの拡張版。Windows版Excelから出力したCSVに多い)

df = pd.read_csv('data.csv', encoding='cp932')

UTF-8 with BOM(Excel「UTF-8」保存や、Macで作られたCSVに多い)

df = pd.read_csv('data.csv', encoding='utf-8-sig')

💡 Tips: 「どのエンコーディングか分からない!」というときは、shift_jiscp932utf-8-sig の順に試してください。たいていどれかで読めます。

📌 Windows / Mac の違い: Google Colabはクラウド環境(Linux)で動くため、OSの違いは基本的に影響しません。ただし、自分のパソコンで作成したCSVをアップロードする場合、Windowsで作ったCSVは shift_jiscp932、Macで作ったCSVは utf-8utf-8-sig の可能性が高いです。e-StatやDATA.GO.JPのデータは多くが utf-8 です。

3. データを加工する

データ分析の本質は「生データをそのまま使う」のではなく、「必要な形に加工してから分析する」ことです。ここでは、最もよく使う加工操作を紹介します。

引き続き、先ほど作ったサンプルデータを使います:

# (前のセクションで作ったdfがない場合はこちらを実行)
data = {
    "都道府県": ["北海道", "東京都", "愛知県", "大阪府", "京都府", "福岡県", "沖縄県"],
    "人口(万人)": [522, 1404, 748, 884, 258, 513, 147],
    "面積(km²)": [83424, 2194, 5173, 1905, 4612, 4987, 2283],
    "地方": ["北海道", "関東", "中部", "近畿", "近畿", "九州", "九州"]
}
df = pd.DataFrame(data)

列を選択する

# 1つの列を取り出す(Seriesという形式で返る)
df["都道府県"]

複数の列を取り出す(DataFrameで返る)

df[["都道府県", "人口(万人)"]]

💡 ポイント: 角括弧が1重 df["列名"] だと1列(Series)、2重 df[["列名"]] だと表形式(DataFrame)で返ります。最初は混乱しますが、「2重括弧 = 表のまま」と覚えてください。

条件でフィルタリングする

# 人口が500万人以上の都道府県だけ抽出
df[df["人口(万人)"] >= 500]
# 地方が「近畿」のデータだけ抽出
df[df["地方"] == "近畿"]
# 複数条件の組み合わせ(&=AND、|=OR)
# 近畿地方で、かつ人口500万人以上
df[(df["地方"] == "近畿") & (df["人口(万人)"] >= 500)]

⚠️ 注意: 複数条件を組み合わせるときは、各条件を () で囲んでください。囲まないとエラーになります。

新しい列を作る

# 人口密度を計算して新しい列を追加
df["人口密度(人/km²)"] = df["人口(万人)"] * 10000 / df["面積(km²)"]
df
# 結果を丸める
df["人口密度(人/km²)"] = df["人口密度(人/km²)"].round(1)
df

欠損値(NaN)を処理する

実際のオープンデータには、値が入っていないセル(欠損値)がよくあります:

# 欠損値がいくつあるか確認
df.isnull().sum()

欠損値がある行を削除

df_clean = df.dropna()

欠損値を特定の値で埋める(例:0で埋める)

df_filled = df.fillna(0)

欠損値を平均値で埋める(数値列のみ)

df_filled = df.fillna(df.mean(numeric_only=True))

💡 ポイント: df.dropna() は元のdfを変更しません。結果を df_clean のように新しい変数に入れるか、df = df.dropna() のように上書きしてください。

グループ化と集計

ここがデータ分析のハイライトです。「地方別の平均人口は?」「カテゴリごとの合計は?」——こうした集計は groupby() で一発です:

# 地方別の人口合計
df.groupby("地方")["人口(万人)"].sum()
# 地方別の平均人口と平均面積
df.groupby("地方")[["人口(万人)", "面積(km²)"]].mean()
# 地方別に複数の集計を同時に行う
df.groupby("地方")["人口(万人)"].agg(["sum", "mean", "count"])

💡 ハッカソンでの活用例:

  • 「市区町村別の犯罪件数を年度別に集計」→ 治安改善サービスの根拠に
  • 「駅別の乗降者数を時間帯別に集計」→ 混雑回避アプリの根拠に
  • 「地域別の高齢化率を集計」→ 福祉支援サービスの根拠に

並び替え

# 人口が多い順に並べる
df.sort_values("人口(万人)", ascending=False)

人口密度が低い順に並べる

df.sort_values("人口密度(人/km²)", ascending=True)

データの保存

加工したデータはCSVに保存しておきましょう:

# Colabのローカルに保存
df.to_csv("processed_data.csv", index=False)

Google Driveに保存(セッション終了後も残る・チームで共有可能)

df.to_csv("/content/drive/MyDrive/processed_data.csv", index=False)

4. データを可視化する

データをグラフにすることで、数字の羅列では見えなかったパターンが見えてきます。ここでは Plotly Express を使います。

なぜPlotly Expressを使うのか

DDASH HacksではPlotly Expressをおすすめします。理由は3つ:

  • 日本語が設定なしでそのまま表示される。 matplotlibだと日本語フォントの設定が必要ですが、Plotlyなら不要です
  • コードが短い。 基本的に1〜2行でグラフが作れます
  • マウスでホバー・ズームできるインタラクティブなグラフが作れる。 プレゼンでのデモ映えにもつながります

📌 「matplotlibを使いたい」という方へ: もちろんmatplotlibでも問題ありません。この記事の最後に「Appendix:matplotlibで同じグラフを作る」を用意しているので、そちらを参照してください。

棒グラフ

「カテゴリ別の比較」に最適。都道府県ごとの人口を比較してみましょう:

fig = px.bar(
    df, 
    x="都道府県", 
    y="人口(万人)",
    color="地方",              # 地方ごとに色分け
    title="都道府県別人口",
    text="人口(万人)"         # 棒の上に数値を表示
)
fig.show()

グラフにマウスを重ねると、詳細な数値がポップアップで表示されます。これがPlotlyの強みです。

折れ線グラフ

「時系列の変化」を見るのに最適。ここでは年度別の仮データで試してみます:

# 年度別データ(例)
yearly_data = pd.DataFrame({
    "年度": [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
    "観光客数(万人)": [5684, 5927, 6188, 6400, 6550, 2800, 3200, 4900, 6200],
    "外国人観光客(万人)": [1974, 2404, 2869, 3119, 3188, 412, 25, 383, 3100]
})

fig = px.line(
yearly_data,
x="年度",
y=["観光客数(万人)", "外国人観光客(万人)"], # 複数系列を同時に表示
markers=True, # データ点を表示
title="日本の観光客数の推移"
)
fig.show()

円グラフ

「全体に占める割合」を見るのに最適:

fig = px.pie(
    df,
    values="人口(万人)",
    names="都道府県",
    title="都道府県別人口の割合"
)
fig.show()

散布図

「2つの数値の関係」を見るのに最適。人口と面積の関係を見てみます:

fig = px.scatter(
    df,
    x="面積(km²)",
    y="人口(万人)",
    size="人口密度(人/km²)",    # バブルの大きさで人口密度を表現
    color="地方",
    hover_name="都道府県",         # ホバー時に都道府県名を表示
    title="面積 vs 人口(バブルサイズ=人口密度)"
)
fig.show()

グラフ選びのガイド

見たいものグラフの種類Plotlyのコード
カテゴリ別の比較棒グラフpx.bar()
時系列の変化折れ線グラフpx.line()
全体に占める割合円グラフpx.pie()
2変数の関係散布図px.scatter()
数値の分布ヒストグラムpx.histogram()
カテゴリ×数値の分布箱ひげ図px.box()
地図上にプロット地図px.scatter_mapbox()

グラフの見た目を整える

プレゼン用にグラフの見た目を調整する方法です。

fig = px.bar(
    df, x="都道府県", y="人口(万人)", color="地方",
    title="都道府県別人口",
    color_discrete_sequence=px.colors.qualitative.Set2  # カラーパレット変更
)

レイアウトをカスタマイズ

fig.update_layout(
font_size=14, # フォントサイズ
title_font_size=20, # タイトルのフォントサイズ
plot_bgcolor="white", # 背景色を白に
width=800, # 横幅
height=500 # 高さ
)

fig.show()

グラフを保存する

作ったグラフはHTMLファイル(インタラクティブ機能つき)または画像として保存できます:

# HTML形式で保存(ブラウザで開くとインタラクティブに操作可能)
fig.write_html("/content/drive/MyDrive/chart.html")

画像として保存(パワポに貼り付ける用)

⚠️ 初回は kaleido のインストールが必要です。次の1行を先に実行してください:

!pip install -q kaleido

fig.write_image("/content/drive/MyDrive/chart.png")

画像保存がうまくいかない場合は、以下をセルの先頭に追加して実行してから再度試してください:

!pip install -q kaleido

💡 パワポに入れるときのTips: 画像(PNG)で貼るのが確実ですが、発表時にリアルタイムで操作して見せたい場合はHTMLファイルをブラウザで開いてデモする方法もあります。

5. 実践:気象庁APIからリアルタイムデータを取得する

ここまではCSVファイルの分析でしたが、APIを使うとインターネット上からリアルタイムのデータを取得できます。

気象庁のAPIは 登録不要・APIキー不要 で使えるので、DDASH Hacksでも手軽に活用できます。
どちらかというと、ハッカソンではこういうリアルタイムデータの方が映えると思います。

📌 注意: 気象庁のこのAPIは正式に公開されたものではなく、サイト内部で使われているデータを利用しています。「政府標準利用規約」に準拠して利用可能ですが、予告なく仕様が変わる可能性があります。

気象庁の天気予報データを取得する

import requests
import json

京都府の天気予報を取得

area_code = "260000" # 京都府
url = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{area_code}.json (外部リンク)"

response = requests.get(url)

エラーチェック

if response.status_code == 200:
forecast = response.json()
print("データ取得成功!")
# データ構造を確認(見やすく整形して表示)
print(json.dumps(forecast[0]["timeSeries"][0], indent=2, ensure_ascii=False))
else:
print(f"エラー: ステータスコード {response.status_code}")

主な地域コード

地域コード
京都府260000
大阪府270000
東京都130000
愛知県230000
北海道(札幌)016000
福岡県400000

全地域コードの一覧は以下で取得できます。

# 全地域コードの取得
areas_response = requests.get("https://www.jma.go.jp/bosai/common/const/area.json")
areas = areas_response.json()

都道府県レベルの一覧を表示

print("=== 都道府県コード一覧 ===")
for code, info in areas.get("offices", {}).items():
print(f"{code}: {info['name']}")

天気データをDataFrameに変換する

APIから取得したJSONデータをpandasのDataFrameに整形してみましょう。まずはシンプルに 3日間の天気予報 を取得します。

import pandas as pd
import requests

京都府の天気予報を取得

area_code = "260000"
url = f"https://www.jma.go.jp/bosai/forecast/data/forecast/{area_code}.json (外部リンク)"
response = requests.get(url)
forecast = response.json()

3日間の天気予報を取り出す(timeSeries[0])

time_series = forecast[0]["timeSeries"][0]
times = time_series["timeDefines"] # 予報日時のリスト
areas_data = time_series["areas"] # 地域ごとのデータ

DataFrameに変換

rows = []
for area in areas_data:
area_name = area["area"]["name"]
weathers = area.get("weathers", []) # 天気の説明文
weather_codes = area.get("weatherCodes", []) # 天気コード

for i, time in enumerate(times):
    if i < len(weathers):
        rows.append({
            "地域": area_name,
            "日時": time,
            "天気": weathers[i],
            "天気コード": weather_codes[i] if i < len(weather_codes) else None
        })

df_weather = pd.DataFrame(rows)
df_weather["日時"] = pd.to_datetime(df_weather["日時"])
print(df_weather)

実行結果の例

      地域                      日時                    天気 天気コード
0  京都府南部 2025-02-06 17:00:00+09:00        晴れ 夜遅く くもり     110
1  京都府南部 2025-02-07 00:00:00+09:00  くもり 昼過ぎ から 晴れ     201
2  京都府南部 2025-02-08 00:00:00+09:00              晴れ     100
...

降水確率を取得する(もう少し詳しく)

降水確率は timeSeries[1] に入っています:

# 降水確率データを取り出す(timeSeries[1])
pop_series = forecast[0]["timeSeries"][1]
pop_times = pop_series["timeDefines"]
pop_areas = pop_series["areas"]

DataFrameに変換

pop_rows = []
for area in pop_areas:
area_name = area["area"]["name"]
pops = area.get("pops", []) # 降水確率(%)

for i, time in enumerate(pop_times):
    if i < len(pops):
        pop_rows.append({
            "地域": area_name,
            "日時": time,
            "降水確率(%)": int(pops[i]) if pops[i] else None
        })

df_pop = pd.DataFrame(pop_rows)
df_pop["日時"] = pd.to_datetime(df_pop["日時"])
print(df_pop)

可視化してみる

取得した降水確率データをPlotlyでグラフにしてみましょう:

import plotly.express as px

京都府南部のデータだけ抽出

df_kyoto = df_pop[df_pop["地域"] == "京都府南部"].copy()

fig = px.bar(
df_kyoto,
x="日時",
y="降水確率(%)",
title="京都府南部の降水確率予報"
)
fig.update_layout(xaxis_tickformat="%m/%d %H時")
fig.show()

💡 ハッカソンでの活用アイデア:

  • 気象データ × 観光客数データ → 天候連動の観光レコメンド
  • 降水確率データ × 交通データ → 雨の日の最適移動ルート
  • 気温データ × 電力消費データ → 省エネ提案アプリ

APIを使ったデータ取得の注意点

  • エラーハンドリングを入れる。 APIはネットワーク状況や相手サーバーの状態で失敗することがあります。if response.status_code == 200: のようなチェックを必ず入れましょう
  • リクエスト頻度に注意。 短時間に大量のリクエストを送るとブロックされる場合があります。ループの中で time.sleep(1) を入れて1秒待つのがマナーです
  • データ構造はAPIごとに異なります。 まず少量のデータを取得して構造を確認(json.dumps(data, indent=2, ensure_ascii=False) で見やすく表示)してから、パース処理を書きましょう
  • APIキーが必要なサービスは事前に取得。 RESAS等は当日だと間に合わない場合があります。「オープンデータの探し方&使い方ガイド」も参照してください

6. 分析から考察を導く — データ活用の2つの方向性

ここまでで「データを加工してグラフにする」ところまでできるようになりました。

しかし、DDASH Hacksの審査で評価されるのは 「グラフを作ったこと」ではなく「データをどう活用して、社会をより良くするサービスにつなげたか」 です。

ここで知っておいてほしいのが、データ活用には大きく 2つの方向性 があるということです。

データ活用の2つの方向性

A. データで「わかる」を作る

データを分析・可視化して、人間が判断するための材料を提供する アプローチです。

  • データ → 仮説 → 「だからこのサービスが必要」と提案する
  • 成果物の例:ダッシュボード、分析レポート、可視化ツール
  • 具体例:地域の高齢化率を可視化して、福祉施策の優先エリアを提示するツール

B. データで「動く」を作る

データが サービスの機能そのものに組み込まれている アプローチです。

  • データがサービスの判断ロジックや出力の一部になっている
  • 成果物の例:Webアプリ、レコメンドシステム、予測ツール
  • 具体例:天気データ × 観光スポットデータで「今日のおすすめ観光ルート」を自動提案するアプリ

身近な例で考えるとわかりやすいです。天気予報は気温・気圧・風向きなどのデータから明日の天気を予測しています。Spotifyの「あなたへのおすすめ」は再生履歴データから好みの曲を見つけ出しています。

コンビニの品揃えは地域の購買データを分析して「この店舗ではおにぎりが売れる」と判断しています。これらはすべて Bのパターン ——データ分析の結果を人間が読むのではなく、分析結果がそのままサービスの判断ロジックになっています。

どちらが有利? AもBも審査基準は同じです。ただし、Bはサービスとしての完成度が伝わりやすく、審査基準の「実用性・価値」をアピールしやすい傾向があります。一方、Aはデータ分析の深さで「課題設定・着眼点」や「解決策の独自性」を狙いやすい。チームの力量や好みに合わせて選びましょう。

パターンA:「分析 → 仮説 → 提案」の3ステップ

ダッシュボードや分析レポートを作るチーム向けの考え方です。

Step 1:グラフから事実を読み取る

グラフを見て、まず客観的な事実を言葉にします。

  • △ 「人口のグラフを作りました」(作っただけ)
  • ◯ 「東京都の人口は1,404万人で、2位の大阪府(884万人)の約1.6倍である」(事実の言語化)

コツ: 「多い」「少ない」ではなく「○○の△倍」「□%を占める」のように数字で表現すると、説得力が格段に上がります。

Step 2:事実から仮説を立てる

読み取った事実から「なぜそうなっているのか」「何が問題なのか」を考えます。

  • 「東京一極集中が続いている。一方で地方の人口密度は低く、公共サービスの維持が難しくなっている可能性がある」

コツ: 「だから何が困るのか?」「誰が影響を受けるのか?」を自問してみてください。ここが審査基準の「課題設定・着眼点」に直結します。

Step 3:仮説からサービスを提案する

仮説に基づいて「だから、こういうサービスがあれば解決できる」と提案します。

  • 「人口密度の低い地域でも効率的に公共サービスを届けるために、○○のデータを活用した□□システムを提案する」

コツ: 「既存の解決策とどう違うのか」を一言添えられると、「解決策の独自性」でも評価されます。

パターンB:「データ → サービスに組み込む」の考え方

Webアプリやレコメンドシステムを作るチーム向けの考え方です。

Bのアプローチでは、分析→仮説→提案という順番ではなく、「ユーザーの課題」と「使えるデータ」を先に決めて、データをサービスの機能に変換する という発想で進めます。

Step 1:課題とデータをセットで考える

  • 誰の、どんな課題? → 「京都を初めて訪れる観光客が、天気に合った観光ルートを探せない」
  • 使えるデータは? → 気象庁API(天気予報)+ 京都市オープンデータ(観光スポット)

Step 2:データをサービスの機能に変換する

データがサービスの中でどう「働く」かを設計します。

データサービス上の役割
気象庁の天気予報データ屋内/屋外スポットの出し分け条件
観光スポットの位置データルート最適化の入力
混雑度データ(あれば)おすすめ度のスコアリング

Step 3:「データがなかったらこのサービスは成り立たない」と言えるか確認する

これがBの最大のチェックポイントです。データを抜いてもサービスが成り立つなら、それは「データ活用」ではなく「データを添えただけ」になってしまいます。

  • ◯ 「天気データがなければ、天候に応じたルート提案ができない」→ データが不可欠
  • △ 「観光スポット一覧を表示するだけで、データは背景情報として載せている」→ データが添え物

パワポへの落とし込み方

AでもBでも、パワポのストーリー構成は共通です。

パワポのスライドパターンAの場合パターンBの場合
課題設定(1〜2枚目)Step 1の事実 + Step 2の仮説Step 1の課題
解決策(3枚目)Step 3のサービス提案サービスの概要とデータの役割
データ活用(4〜5枚目)分析結果のグラフStep 2の「データ→機能」の設計図
デモ・成果物(5〜6枚目)ダッシュボードのスクリーンショットアプリの動作画面・デモ
実用性・価値(7枚目)具体的なユーザーシナリオStep 3の「データがなければ成り立たない」ポイント

詳しくは「審査基準攻略&PowerPoint提出ガイド (外部リンク)」を参照してください。

複数データの組み合わせで差をつける

審査基準の「解決策の独自性」で高得点を狙うなら、2つ以上のデータを組み合わせる のが効果的です。

# 例:人口データと気象データを日付で結合
df_merged = pd.merge(df_population, df_weather, on="日付", how="inner")

例:都道府県コードをキーに2つのデータを結合

df_merged = pd.merge(df_stats, df_tourism, on="都道府県コード", how="left")

pd.merge()how パラメータ:

  • inner:両方に存在するデータだけ残す(安全な選択)
  • left:左のDataFrameを基準に結合(右にないデータはNaNになる)
  • outer:両方のデータをすべて残す

💡 ハッカソンでの組み合わせ例:

  • 気象データ × 観光客数 → 天候と観光の関係を分析
  • 人口データ × 医療施設データ → 医療アクセスの地域格差を可視化
  • 交通データ × 高齢者人口 → 交通弱者の課題を特定

7. ハッカソンでの実践Tips

チームでColabを共有する方法

  1. ノートブック右上の 「共有」 ボタンをクリック
  2. チームメンバーのGoogleアカウントを追加
  3. 「編集者」権限を付与

Googleドキュメントと同じように、複数人が同時に同じノートブックを編集できます。ただし、同じセルを同時に実行すると競合する場合があるので、担当セクションを分けるのがおすすめです。

非Python勢に分析結果を共有する方法

チーム全員がPythonを書ける必要はありません。分析担当が作った結果を、フロントエンド担当やデザイン担当に共有する方法:

  • グラフ → HTMLで書き出して共有: fig.write_html() で保存したHTMLをGoogle Driveで共有。ブラウザで開くだけで見られます
  • 加工済みデータ → CSVで書き出して共有: df.to_csv() で保存。Looker Studioに読み込んでノーコードでダッシュボードを作ることもできます(詳しくは「スプレッドシート+Looker Studioノーコードダッシュボード (外部リンク)」を参照)
  • 分析結果のスクリーンショット → そのままパワポに貼る

3日間の時間配分目安

タイミングやること
Day1 前半テーマ決め + データ探し + Colabの環境準備
Day1 後半データの読み込み + 前処理(欠損値処理、フィルタリング)
Day2 前半データ分析 + 可視化(グラフ作成)
Day2 後半考察まとめ + サービス開発と並行して分析を深める
Day3 前半パワポに分析結果を入れる + 最終確認

詳しくは「3日間タイムマネジメント戦略 (外部リンク)」を参照してください。

Appendix:matplotlibで同じグラフを作る

「授業でmatplotlibを使ったことがある」「matplotlibの方が慣れている」という方のために、本編と同じグラフをmatplotlibで作る方法を載せておきます。

初期設定(日本語フォント)

matplotlibで日本語を表示するには、最初に1回だけ設定が必要です:

!pip install -q japanize-matplotlib

import matplotlib.pyplot as plt
import japanize_matplotlib

棒グラフ

fig, ax = plt.subplots(figsize=(10, 6))
colors = {"北海道": "#636EFA", "関東": "#EF553B", "中部": "#00CC96", "近畿": "#AB63FA", "九州": "#FFA15A"}
bar_colors = [colors[r] for r in df["地方"]]
ax.bar(df["都道府県"], df["人口(万人)"], color=bar_colors)
ax.set_title("都道府県別人口", fontsize=16)
ax.set_ylabel("人口(万人)")

棒の上に数値を表示

for i, v in enumerate(df["人口(万人)"]):
ax.text(i, v + 10, str(v), ha='center', fontsize=10)

plt.tight_layout()
plt.show()

折れ線グラフ

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(yearly_data["年度"], yearly_data["観光客数(万人)"], marker='o', label="観光客数")
ax.plot(yearly_data["年度"], yearly_data["外国人観光客(万人)"], marker='s', label="外国人観光客")
ax.set_title("日本の観光客数の推移", fontsize=16)
ax.set_xlabel("年度")
ax.set_ylabel("万人")
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

円グラフ

fig, ax = plt.subplots(figsize=(8, 8))
ax.pie(df["人口(万人)"], labels=df["都道府県"], autopct='%1.1f%%')
ax.set_title("都道府県別人口の割合", fontsize=16)
plt.show()

散布図

fig, ax = plt.subplots(figsize=(10, 6))
scatter = ax.scatter(
    df["面積(km²)"], df["人口(万人)"],
    s=df["人口密度(人/km²)"] * 5,  # バブルサイズ
    alpha=0.7
)
for i, row in df.iterrows():
    ax.annotate(row["都道府県"], (row["面積(km²)"], row["人口(万人)"]))
ax.set_title("面積 vs 人口", fontsize=16)
ax.set_xlabel("面積(km²)")
ax.set_ylabel("人口(万人)")
plt.tight_layout()
plt.show()

matplotlib vs Plotly Express 早見表

項目matplotlibPlotly Express
日本語表示japanize-matplotlib が必要設定不要
コード量やや多い少ない
グラフの操作静止画のみホバー、ズーム、選択が可能
パワポへの貼り付けplt.savefig() で画像保存fig.write_image() で画像保存
Streamlit連携st.pyplot()st.plotly_chart()(インタラクティブ機能そのまま)
学習コストネット上の情報が多い公式ドキュメントが充実

どちらを使っても審査に影響はありません。自分が使いやすい方を選んでください。

まとめ:この記事で学んだこと

セクション学んだこと使うコマンド
1. Colabの準備環境構築ゼロで始められるdrive.mount()
2. データ読み込みCSV・APIからデータを取得pd.read_csv(), requests.get()
3. データ加工フィルタ・集計・新列追加df[], groupby(), sort_values()
4. 可視化グラフで傾向を見える化px.bar(), px.line(), px.scatter()
5. API活用リアルタイムデータ取得requests.get(), json
6. 考察データ→仮説→サービス提案事実→仮説→提案の3ステップ
7. チーム実践共有とスケジュール管理Colab共有、Drive連携

次に読む記事

Shin Yamamoto

関連する記事 - 攻略法