以下に、IoT・センサー技術および外部データ取得(気象データAPI等)に関する6ヶ月(24週)の週ごとの授業スケジュール案と、それに対応した実習教材(ノートブック形式・プロジェクトテーマ)案をまとめました。
期間 | 単元 | 内容概要 |
第1~4週 | IoTとスマート農業の基礎 | 概論、事例紹介、IoTの基本構造、センサーの種類と役割 |
第5~8週 | センサー実装とデータ収集 | 温湿度、土壌、照度など各種センサーの使用とRaspberry Pi/Arduinoでの収集 |
第9~12週 | 通信とデータ送信 | MQTT、HTTP、LoRaなどの通信プロトコル実践、クラウド連携 |
第13~16週 | 外部データ活用 | 気象APIの利用(OpenWeatherMap等)、衛星・農業オープンデータ取得 |
第17~20週 | データ蓄積・可視化 | 時系列DB、可視化ツール(Grafana等)、Jupyterノートブックでの分析 |
第21~24週 | 応用プロジェクト | 小規模スマート農業システム構築(IoT+外部データ+可視化) |
週 | 授業テーマ | 実習内容 | ノートブック例 |
1 | スマート農業とは? | スマート農業事例分析 | SmartAgri_Overview.ipynb:国内外の成功事例の調査 |
2 | IoTの基礎構造 | IoTシステムの構成図を描く | IoT_Architecture_Intro.ipynb:IoTの構成(センサー→通信→クラウド) |
3 | センサーの種類と役割 | 農業で使われるセンサーの比較 | Sensor_Types_Comparison.ipynb |
4 | センサー選定ワークショップ | 作物に応じたセンサー設計 | グループで作物ごとのセンサープランを作成 |
週 | 授業テーマ | 実習内容 | ノートブック例 |
5 | 温湿度センサーの実装 | DHT11で温湿度測定 | Sensor_DHT11_Read.ipynb(Raspberry Pi) |
6 | 土壌水分センサーの実装 | Capacitive soil sensor使用 | SoilMoisture_Logging.ipynb |
7 | 複数センサーの同時取得 | I2C, GPIOの扱い | MultiSensor_Collection.ipynb |
8 | CSV保存+グラフ描画 | 取得データの可視化 | SensorData_Plotting.ipynb(Matplotlib/Pandas) |
週 | 授業テーマ | 実習内容 | ノートブック例 |
13 | 気象APIの概要 | OpenWeatherMap APIの使い方 | WeatherAPI_Basics.ipynb(APIキー取得と使い方) |
14 | APIデータの解析 | 気象データの加工と分析 | WeatherAPI_Analysis.ipynb(気温の推移グラフ) |
15 | オープン農業データ取得 | 農研機構・気象庁データセットの活用 | OpenAgriData_Usage.ipynb |
16 | 自作API統合 | センサーデータ+APIの統合分析 | Sensor_Weather_Integration.ipynb |
週 | 授業テーマ | 実習内容 | ノートブック例 |
21 | 企画立案 | チームで課題設定・システム設計 | 水やり支援、霜予測、日射最適化など |
22 | センサー構築 | センサー組み立て+データ送信 | MQTT→クラウド or ローカル |
23 | データ統合・可視化 | 可視化・アラート設計 | Grafana/Plotlyでの時系列分析 |
24 | 成果発表 | チームプレゼン | 最終プレゼン・振り返りノートブック提出 |
・ハードウェア:Raspberry Pi / Arduino Uno, DHT11, 土壌水分センサー, 照度センサー
・ソフトウェア:Python, Jupyter Notebook, Grafana, InfluxDB, SQLite
・通信:MQTT, HTTP, Webhook
・外部API:OpenWeatherMap, 気象庁, 農研機構API/CSV
・可視化:Matplotlib, Plotly, Grafana
・実習用ノートブックテンプレートの配布(GitHub等で一括管理)
・IoTデバイスの貸出・管理案の整備
・各週での「理解度チェック」やミニテスト付き教材の導入
以下は、SmartAgri_Overview.ipynb の内容例です。
このノートブックは、スマート農業の概要や事例を学ぶことを目的としたイントロダクション教材です。
📘 SmartAgri_Overview.ipynb
目的: スマート農業の概要を理解し、国内外の事例から技術の活用方法を学ぶ
# スマート農業とは? - Smart Agriculture Overview
## 🔍 1. スマート農業の定義
スマート農業とは、IoT、AI、ロボティクス、クラウドなどの先端技術を活用して、農作業の効率化・自動化・最適化を図る新しい農業の形です。
- 労働力不足の解消
- 品質の安定と向上
- 環境負荷の低減
---
## 🌍 2. 世界のスマート農業事例
| 国 | 事例 | 技術活用ポイント |
|----|------|-----------------|
| オランダ | 精密農業と温室制御 | センサー+AIによる環境制御 |
| アメリカ | ドローンによる作物観察 | NDVI解析による病害虫検出 |
| 日本 | 水田の遠隔水管理(WATARAS) | 水位センサー+LTE通信 |
---
## 🧑🌾 3. 日本国内の事例ピックアップ
```python
import pandas as pd
# 国内事例のサンプルデータ
data = {
"地域": ["北海道", "茨城県", "長崎県"],
"作物": ["小麦", "メロン", "トマト"],
"技術": ["トラクター自動走行", "ハウス内環境センサー", "画像解析による熟度判定"]
}
df = pd.DataFrame(data)
df
from IPython.display import Image
Image("https://example.com/smart_agri_architecture.png") # ※ 実際の画像は差し替え必要
・センサー(温湿度、土壌、水位など)
・通信(Wi-Fi, LoRa, 5G, LTE)
・データ分析(クラウド, AI, BIツール)
・自動化(アクチュエータ、ドローン)
あなたの地元や興味のある地域で、どのようなスマート農業の技術が活用できそうか?
グループで意見を出し合い、1つのアイデアにまとめよう。
from IPython.display import display
import ipywidgets as widgets
q1 = widgets.RadioButtons(
options=['労働力削減', '害虫の増加', '収穫時期の不安定化'],
description='スマート農業の効果は?'
)
display(q1)
・農林水産省「スマート農業の推進について」
・FAO: Smart Agriculture
・オランダWageningen大学のスマート農業研究
---
このノートブックは主に「イントロ+理解+議論+軽い可視化」の構成になっています。
必要に応じて、以下のような拡張も可能です:
- 地域の気候や作物データをAPIで取得して事例と関連付ける
- 自分の地域をGoogleマップAPI等で表示
- 日本地図にスマート農業事例をマッピング
---
以下は、IoT_Architecture_Intro.ipynb の内容例です。
このノートブックは、IoTシステムの構成とそのデータの流れを理解するための導入教材として設計されています。
目的: IoTシステムの全体像(センサー → 通信 → クラウド → 可視化)を把握する
# IoTアーキテクチャ入門 - Introduction to IoT Architecture
## 🎯 学習目標
- IoTの基本構造(センサー・通信・クラウド・可視化)を理解する
- 各構成要素の役割を明確に説明できるようになる
from IPython.display import Image
Image("https://example.com/iot_architecture_diagram.png") # 実際には適切な図に置き換えてください
・センサー:環境や作物のデータ(温度・湿度・土壌など)を取得
・通信:データを送信(例:Wi-Fi, LoRa, LTE)
・クラウド/エッジ:受け取ったデータを保存・分析(AWS, Firebase, Raspberry Pi等)
・可視化・制御:グラフやダッシュボードで表示/機器の制御(Grafana, Webアプリ等)
プロトコル | 用途 | 特徴 |
HTTP | データ送信(REST API) | 簡単だがやや重い |
MQTT | 軽量なデータ配信 | IoT向き、低消費電力 |
LoRa | 長距離通信 | 低速だが広範囲カバー可 |
BLE | 近距離通信 | スマホ連携など |
import random
import time
# 仮のセンサーデータを生成
def get_temperature():
return round(random.uniform(20.0, 30.0), 2)
def get_humidity():
return round(random.uniform(40.0, 70.0), 2)
data_packet = {
"temperature": get_temperature(),
"humidity": get_humidity(),
"timestamp": time.strftime('%Y-%m-%d %H:%M:%S')
}
print("📦 送信データ:", data_packet)
import requests
url = "https://example-iot-endpoint.com/data"
# 実際の送信はコメントアウト
# response = requests.post(url, json=data_packet)
print("送信先URL:", url)
※ 本物のAPIキーやURLを使用する場合は、セキュリティに注意!
import matplotlib.pyplot as plt
temps = [get_temperature() for _ in range(10)]
plt.plot(temps, marker='o')
plt.title("📈 Temperature Over Time (Simulated)")
plt.xlabel("Time (unit)")
plt.ylabel("Temperature (°C)")
plt.grid(True)
plt.show()
あなたが作りたいIoTシステムでは、どの構成要素が特に重要になりそうですか? センサーの種類、通信方法、保存方法を考えてみましょう。
import ipywidgets as widgets
from IPython.display import display
q = widgets.RadioButtons(
options=['MQTT', 'FTP', 'SMTP'],
description='IoT向け通信プロトコルは?'
)
display(q)
このノートブックを基にして、次は「実際のセンサー(DHT11など)との接続」「クラウドへのデータ送信」など、具体的な実装ステップに進みます。
以下は、Sensor_Types_Comparison.ipynb の内容です。このノートブックでは、農業用途でよく使われるセンサーの種類を理解し、比較検討することを目的としています。
目的: 農業用センサーの種類・用途・特徴を理解し、目的に合ったセンサーを選定できるようになる。
# センサーの種類と比較 - Sensor Types for Smart Agriculture
## 🎯 学習目標
- 農業に利用される主要なセンサーの種類を理解する
- それぞれの特徴・用途・メリット・注意点を把握する
import pandas as pd
data = {
"センサー名": ["DHT11", "土壌水分センサー", "照度センサー(BH1750)", "CO2センサー", "NDVIセンサー"],
"測定項目": ["温度・湿度", "土壌水分", "日射・照度", "二酸化炭素濃度", "植生指数(NDVI)"],
"特徴": [
"安価・精度は低め",
"静電容量式は信頼性が高い",
"I2C接続、高感度",
"温室内の換気管理に有効",
"ドローンや衛星搭載に使用"
],
"用途例": [
"ハウス内環境モニタリング",
"灌水のタイミング判断",
"光合成効率の推定",
"ビニールハウスのCO2制御",
"生育状況・病害検出"
]
}
df = pd.DataFrame(data)
df
import matplotlib.pyplot as plt
sensors = ["DHT11", "Soil", "Light", "CO2", "NDVI"]
cost = [3, 5, 4, 20, 100] # 単位: USD(概算)
difficulty = [1, 2, 2, 3, 4] # 1(易)〜5(難)
fig, ax = plt.subplots()
ax.bar(sensors, cost, label="価格")
ax.plot(sensors, difficulty, label="難易度", color='red', marker='o')
ax.set_ylabel("価格(USD)/難易度(1~5)")
ax.set_title("センサーの価格と使用難易度比較")
ax.legend()
plt.grid(True)
plt.show()
### ケースA:露地栽培での灌水判断
- 使用センサー:土壌水分センサー
- 利点:過不足のない水やりを実現
- 注意点:屋外設置には防水加工が必要
### ケースB:ビニールハウスの環境モニタリング
- 使用センサー:DHT11, 照度センサー, CO2センサー
- 利点:統合的な環境制御が可能
- 注意点:温度上昇時の精度低下に注意(DHT11)
### ケースC:大規模圃場での生育状況把握
- 使用センサー:NDVIセンサー(もしくは衛星画像)
- 利点:異常地帯の特定、病害予兆の検出
あなたの興味のある作物・栽培方法において、どのセンサーが最も重要ですか? 理由とともに、想定する活用方法をまとめましょう。
import ipywidgets as widgets
from IPython.display import display
q1 = widgets.Dropdown(
options=[
'DHT11(温湿度)',
'NDVIセンサー(植生指数)',
'土壌水分センサー',
'照度センサー'
],
description='日射量を測るには?'
)
display(q1)
このノートブックは、次週の**実際のセンサー取得(DHT11など)**へつなぐ準備として利用します。
以下は、Sensor_DHT11_Read.ipynb の内容例です。このノートブックでは、DHT11センサー(温湿度)をRaspberry Piに接続し、Pythonを使ってデータを取得する基本的な実装を学びます。
目的: DHT11センサーを用いて温度・湿度データをRaspberry Piから読み取る
# DHT11センサーの読み取り実践 - Read Temperature and Humidity using DHT11
## 🎯 学習目標
- DHT11の構造と動作原理を理解する
- Raspberry Piに接続してPythonで温湿度データを取得する
・センサー:DHT11(3ピン or 4ピン)
・接続先:Raspberry Pi GPIO(例:GPIO4)
・抵抗:10kΩ プルアップ(4ピンタイプのみ)
### 配線図
- VCC → Raspberry Pi 3.3V(Pin1)
- GND → GND(Pin6)
- DATA → GPIO4(Pin7)
※ 4ピンタイプの場合:VCC–DATA間に10kΩのプルアップ抵抗を入れる
sudo apt update
sudo apt install python3-pip
pip3 install Adafruit_DHT
ライブラリ名:Adafruit_DHT(Adafruit社製のDHTセンサードライバ)
import Adafruit_DHT
import time
# 使用センサーとGPIOピン設定
sensor = Adafruit_DHT.DHT11
pin = 4 # GPIO4
# データ取得ループ
for i in range(5):
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f"🌡 温度: {temperature:.1f}°C 💧 湿度: {humidity:.1f}%")
else:
print("⚠️ センサーの読み取りに失敗しました")
time.sleep(2)
import matplotlib.pyplot as plt
temps = [22.1, 22.4, 22.2, 22.5, 22.3]
hums = [55.1, 54.8, 55.3, 55.0, 54.9]
plt.plot(temps, label='温度(°C)', marker='o')
plt.plot(hums, label='湿度(%)', marker='x')
plt.title("DHT11 測定データ (例)")
plt.xlabel("時刻(回数)")
plt.ylabel("値")
plt.legend()
plt.grid(True)
plt.show()
センサーのデータを記録・蓄積して活用するにはどんな仕組みが必要?
(例:CSV保存/クラウド送信/グラフ表示)
10秒ごとにデータを取得してCSVに保存してみよう
一定以上の温度になったらアラートを出すロジックを追加してみよう
import ipywidgets as widgets
widgets.RadioButtons(
options=['GPIOピン', 'USBポート', 'HDMI端子'],
description='DHT11のデータ出力先は?'
)
・Adafruit DHT Python Library GitHub
・Raspberry Pi GPIO ピン配置
・農業用センサー活用事例(農研機構)
このノートブックの内容を発展させて、次の週ではクラウド連携(FirebaseやMQTT)やデータ蓄積→可視化へ進めます。
以下は、SoilMoisture_Logging.ipynb の内容例です。このノートブックでは、土壌水分センサーを使ってデータを取得し、一定間隔でロギング(記録)する基本的な仕組みを学びます。
目的: 土壌水分センサーからのデータを定期的に取得し、CSVファイルに記録する。
# 土壌水分センサーのデータ取得とロギング
## 🎯 学習目標
- 土壌水分センサーの仕組みを理解する
- Pythonでセンサーデータを読み取り、CSVに記録する
センサー名: 土壌水分センサー(アナログ or デジタルタイプ)
接続例: Raspberry Pi + ADC(例:MCP3008)経由
GPIO: SPIインターフェース使用
### 配線例(MCP3008経由)
- センサーVCC → 3.3V
- センサーGND → GND
- センサー信号 → MCP3008 CH0
- MCP3008 → SPI0 (MISO: GPIO9, MOSI: GPIO10, CLK: GPIO11, CS: GPIO8)
pip3 install gpiozero spidev
from gpiozero import MCP3008
import time
soil = MCP3008(channel=0)
for i in range(5):
value = soil.value # 0.0 (乾燥) 〜 1.0 (湿潤)
print(f"🌱 土壌水分レベル: {value:.2f}")
time.sleep(2)
import csv
from datetime import datetime
filename = "soil_log.csv"
with open(filename, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["timestamp", "soil_moisture"])
for i in range(10):
value = soil.value
timestamp = datetime.now().isoformat()
writer.writerow([timestamp, value])
print(f"✅ 記録: {timestamp} - {value:.2f}")
time.sleep(5)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("soil_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
plt.plot(df["timestamp"], df["soil_moisture"], marker='o')
plt.title("土壌水分の変化")
plt.xlabel("時刻")
plt.ylabel("水分値(0.0〜1.0)")
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
土壌のどの深さにセンサーを埋めるべきか?また、場所によるばらつきへの対応方法は?
複数センサーを使用して圃場マッピングを行う
湿度が一定値を下回ったら警告メールを送る(IFTTT or Gmail API)
gpiozero soil sensor example
MCP3008の使い方
以下は、MultiSensor_Collection.ipynb の内容です。 このノートブックは、複数のセンサー(例:温度・湿度・土壌水分・照度など)を同時にデータ収集してCSVファイルに記録する基本構成を学ぶ教材です。
# 複数センサーのデータ収集とロギング
## 🎯 学習目標
- 複数種類のセンサーを同時に扱う方法を理解する
- 測定データを一括でCSVに記録する
センサー | 測定項目 | 接続方式 |
DHT11 | 温度・湿度 | GPIO(デジタル) |
土壌水分センサー | 水分量 | MCP3008経由(アナログ) |
照度センサー(例:BH1750) | 照度 | I2C |
pip3 install Adafruit_DHT smbus2 gpiozero
import Adafruit_DHT
from gpiozero import MCP3008
import smbus2
import time
# DHT11 設定
dht_sensor = Adafruit_DHT.DHT11
dht_pin = 4
# 土壌水分センサー(アナログ)設定
soil = MCP3008(channel=0)
# 照度センサー(BH1750)設定
bus = smbus2.SMBus(1)
BH1750_ADDR = 0x23
ONE_TIME_HIGH_RES_MODE = 0x20
import csv
from datetime import datetime
filename = "multi_sensor_log.csv"
def read_light():
data = bus.read_i2c_block_data(BH1750_ADDR, ONE_TIME_HIGH_RES_MODE)
return (data[0] << 8 | data[1]) / 1.2 # lx
with open(filename, mode='w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["timestamp", "temperature", "humidity", "soil_moisture", "light_lux"])
for i in range(10):
timestamp = datetime.now().isoformat()
humidity, temperature = Adafruit_DHT.read_retry(dht_sensor, dht_pin)
soil_value = soil.value
light_lux = read_light()
print(f"[{timestamp}] T={temperature}°C, H={humidity}%, Soil={soil_value:.2f}, Light={light_lux:.2f} lx")
writer.writerow([timestamp, temperature, humidity, soil_value, light_lux])
time.sleep(5)
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("multi_sensor_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
plt.figure(figsize=(12,6))
plt.plot(df["timestamp"], df["temperature"], label="温度(°C)")
plt.plot(df["timestamp"], df["humidity"], label="湿度(%)")
plt.plot(df["timestamp"], df["soil_moisture"], label="土壌水分")
plt.plot(df["timestamp"], df["light_lux"], label="照度(lux)")
plt.legend()
plt.xticks(rotation=45)
plt.title("複数センサーの測定値")
plt.tight_layout()
plt.grid(True)
plt.show()
センサーごとに測定精度や反応速度が異なる中で、どのように「意味のあるデータ」を得るべきか?
測定値に対して異常値判定の処理を加える(外れ値除去)
測定インターバルを環境に応じて可変にする(例:気温が高いときは頻繁に測る)
BH1750 sensor
Adafruit DHT Library
gpiozero MCP3008
# センサーデータの可視化
## 🎯 学習目標
- センサーで収集したCSVデータをPandasで読み込む
- 時系列データを可視化することで環境変化を直感的に把握する
multi_sensor_log.csv の形式を想定:
timestamp | temperature | humidity | soil_moisture | light_lux | 23.5 | 50.2 | 0.44 | 300.2 | ...... | ... | ... | ... |
import pandas as pd
df = pd.read_csv("multi_sensor_log.csv")
df["timestamp"] = pd.to_datetime(df["timestamp"])
df.head()
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(df["timestamp"], df["temperature"], label="温度(°C)")
plt.plot(df["timestamp"], df["humidity"], label="湿度(%)")
plt.plot(df["timestamp"], df["soil_moisture"], label="土壌水分")
plt.plot(df["timestamp"], df["light_lux"], label="照度(lux)")
plt.title("センサーデータの時系列プロット")
plt.xlabel("時刻")
plt.ylabel("値")
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
fig, axs = plt.subplots(4, 1, figsize=(12, 10), sharex=True)
axs[0].plot(df["timestamp"], df["temperature"], color="red")
axs[0].set_ylabel("温度(°C)")
axs[1].plot(df["timestamp"], df["humidity"], color="blue")
axs[1].set_ylabel("湿度(%)")
axs[2].plot(df["timestamp"], df["soil_moisture"], color="green")
axs[2].set_ylabel("土壌水分")
axs[3].plot(df["timestamp"], df["light_lux"], color="orange")
axs[3].set_ylabel("照度(lux)")
axs[3].set_xlabel("時刻")
plt.suptitle("センサーデータの詳細可視化", fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
・一定期間をズームして表示する機能を追加
・異常値を検出してハイライトする
・外部天候データと比較することで相関分析
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# センサーデータの可視化\n",
"\n",
"## 🎯 学習目標\n",
"\n",
"- センサーで収集したCSVデータをPandasで読み込む\n",
"- 時系列データを可視化することで環境変化を直感的に把握する"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🗂 1. 対象とするデータ形式\n",
"\n",
"`multi_sensor_log.csv` の形式を想定:\n",
"\n",
"| timestamp | temperature | humidity | soil_moisture | light_lux |\n",
"|---------------------|-------------|----------|----------------|-----------|\n",
"| 2025-04-20T14:00:00 | 23.5 | 50.2 | 0.44 | 300.2 |"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 📖 2. CSVの読み込み"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"multi_sensor_log.csv\")\n",
"df[\"timestamp\"] = pd.to_datetime(df[\"timestamp\"])\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 📈 3. 各センサーデータの折れ線グラフ"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"plt.plot(df[\"timestamp\"], df[\"temperature\"], label=\"温度(°C)\")\n",
"plt.plot(df[\"timestamp\"], df[\"humidity\"], label=\"湿度(%)\")\n",
"plt.plot(df[\"timestamp\"], df[\"soil_moisture\"], label=\"土壌水分\")\n",
"plt.plot(df[\"timestamp\"], df[\"light_lux\"], label=\"照度(lux)\")\n",
"\n",
"plt.title(\"センサーデータの時系列プロット\")\n",
"plt.xlabel(\"時刻\")\n",
"plt.ylabel(\"値\")\n",
"plt.legend()\n",
"plt.grid(True)\n",
"plt.xticks(rotation=45)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🎨 4. サブプロットで個別表示"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fig, axs = plt.subplots(4, 1, figsize=(12, 10), sharex=True)\n",
"\n",
"axs[0].plot(df[\"timestamp\"], df[\"temperature\"], color=\"red\")\n",
"axs[0].set_ylabel(\"温度(°C)\")\n",
"\n",
"axs[1].plot(df[\"timestamp\"], df[\"humidity\"], color=\"blue\")\n",
"axs[1].set_ylabel(\"湿度(%)\")\n",
"\n",
"axs[2].plot(df[\"timestamp\"], df[\"soil_moisture\"], color=\"green\")\n",
"axs[2].set_ylabel(\"土壌水分\")\n",
"\n",
"axs[3].plot(df[\"timestamp\"], df[\"light_lux\"], color=\"orange\")\n",
"axs[3].set_ylabel(\"照度(lux)\")\n",
"axs[3].set_xlabel(\"時刻\")\n",
"\n",
"plt.suptitle(\"センサーデータの詳細可視化\", fontsize=16)\n",
"plt.xticks(rotation=45)\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 📝 発展課題\n",
"\n",
"- 一定期間をズームして表示する機能を追加\n",
"- 異常値を検出してハイライトする\n",
"- 外部天候データと比較することで相関分析"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": ""
}
},
"nbformat": 4,
"nbformat_minor": 2
}
👉 WeatherAPI_Basics.ipynb
このノートブックでは、Open-Meteo API を使った天気データの取得・可視化を学ぶ内容になっています。必要に応じて、都市やパラメータを変更してカスタマイズも可能です!
👉 WeatherAPI_Analysis.ipynb
このノートブックでは、天気APIから得られたデータをもとに、気温の時間帯別分析や相関分析、移動平均による傾向把握を行います。CSVデータは事前に保存しておく必要があります(例: tokyo_weather_data.csv)。
・Pythonで requests を使ったAPIリクエスト
・JSON形式のレスポンスを解析し、必要な気温・湿度情報を抽出
・PandasとMatplotlibによる時系列の可視化
・他の都市(札幌・大阪など)との気温・湿度の比較
・風速や降水量など他のパラメータの追加取得と分析
・日の出・日の入り時間の可視化
・APIデータから得た情報の統計分析と傾向を理解する
・相関分析や時系列処理を通して、データ解釈の幅を広げる
・気温・湿度データの移動平均や標準偏差の算出
・相関行列の作成とヒートマップによる可視化
・日中と夜間の気温差の統計的比較
・異常気象を検出するための温度変化分析
・週ごとの変動比較(曜日ごとの特徴)
・他の都市と比較して「都市ヒートアイランド現象」を分析
・公開されている農業統計データの探し方・読み解き方を学ぶ
・地域や作物別の収穫量データを活用し、可視化・分析を行う
・農業データ(例:作物ごとの収穫量)をPandasで読み込み
・年別、地域別の作物傾向をグラフで可視化
・天気データとの簡単な相関を試みる
・作物収穫量と気温・降水量との相関を可視化
・地域ごとの成長傾向や作物構成の違い分析
・経年で収穫量が減っている作物の要因分析(仮説立案)
・自分で取得したセンサーデータと天気APIのデータを組み合わせる
・両者を比較することで、センサー補完や妥当性検証の方法を学ぶ
・同時刻のセンサーデータとAPIデータを時系列で統合
・気温・湿度の差を可視化し、傾向を分析
・相関係数の算出とその意味の考察
・雨天や高温時のセンサー誤差傾向の抽出
・センサーデータの補正ロジック(フィルタやバイアス補正)の設計
・センサーが欠損した場合のAPI代替モデル構築の検討
# 第13週:天気APIの基礎と取得方法
## 🎯 学習目標
- 天気データAPI(例:Open-Meteo)の仕組みを理解
- APIを使って天気情報を取得し可視化
import requests
import pandas as pd
import matplotlib.pyplot as plt
# 天気API(Open-Meteo)のリクエスト
params = {
'latitude': 35.6895,
'longitude': 139.6917,
'hourly': 'temperature_2m',
'timezone': 'Asia/Tokyo'
}
response = requests.get('https://api.open-meteo.com/v1/forecast', params=params)
data = response.json()
# データフレームに変換
hourly = pd.DataFrame({
'time': data['hourly']['time'],
'temp': data['hourly']['temperature_2m']
})
hourly['time'] = pd.to_datetime(hourly['time'])
hourly.set_index('time', inplace=True)
# グラフ描画
hourly.plot(figsize=(10, 4), title='東京の気温(Open-Meteo)')
plt.ylabel("気温 (°C)")
plt.show()
# 第14週:天気データの分析と傾向把握
## 📈 学習目標
- APIデータの統計的傾向分析
- 相関分析と可視化
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
weather = pd.read_csv('tokyo_weather.csv', parse_dates=['time'])
weather.set_index('time', inplace=True)
# 移動平均
weather['temp_ma'] = weather['temperature'].rolling(window=6).mean()
weather[['temperature', 'temp_ma']].plot(figsize=(10,4), title="気温と移動平均")
plt.ylabel("気温 (°C)")
plt.show()
# 相関マトリクス
sns.heatmap(weather.corr(), annot=True)
plt.title("相関行列")
plt.show()
# 第15週:公開農業データの活用
## 🌾 学習目標
- 農水省等のデータをPandasで分析・可視化
- 地域・作物ごとの傾向をつかむ
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
crop = pd.read_csv('crop_yield_sample.csv')
# 作物ごとの収穫量比較
plt.figure(figsize=(10,5))
sns.barplot(data=crop, x='地域', y='収穫量(kg)', hue='作物')
plt.title('地域別作物収穫量')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 第16週:センサー+外部データの統合分析
## 🔄 学習目標
- センサーデータと天気APIデータを統合し傾向を比較分析
import pandas as pd
import matplotlib.pyplot as plt
# 読み込み
sensor = pd.read_csv('sensor_data.csv', parse_dates=['time'])
weather = pd.read_csv('weather_data.csv', parse_dates=['time'])
sensor.set_index('time', inplace=True)
weather.set_index('time', inplace=True)
# 結合
merged = pd.merge(sensor, weather, left_index=True, right_index=True)
# 気温比較可視化
merged[['temperature_sensor', 'temperature_weather']].plot(figsize=(10,4), title="センサーと天気APIの気温比較")
plt.ylabel("気温 (°C)")
plt.show()
# 相関
print("相関係数(気温):", merged['temperature_sensor'].corr(merged['temperature_weather']))
テーマ例:
・「ハウス内の高温状態を検知して自動換気を提案」
・「露地栽培で雨量と湿度を加味した水やり最適化モデル」
・「仮説→必要データ→分析手法」の構成を紙やMiroなどでまとめる
・地域や作物に合わせたオープンデータ活用戦略の検討
・外部気象APIと自センサーの統合データ構造の設計
・必要なセンサーやAPIからデータを継続的に取得する仕組みを実装
・欠損処理・ノイズ除去・スムージングなどの前処理スキルを習得
・複数センサー+天気APIからの時系列収集スクリプト作成(Python)
・CSV or SQLite等に保存し、1日単位のバッチ処理を想定
・データ欠損時の補完方法(前方補完・平均補完等)の比較
・ノイズセンサーデータをフィルタリングするアルゴリズムの実装(移動平均・中央値)
・統合データをグラフ・ヒートマップ・傾向図として表現
・必要に応じて簡易な機械学習(決定木、回帰モデル)を用いた予測分析を試す
・Seaborn / Matplotlib / Plotly を用いた視覚化
・Scikit-learn によるシンプルなモデル化(例:湿度と降水量からの給水判断予測)
・しきい値ベースのアラート判定システムの構築(Slack通知など)
・外れ値検出(Isolation Forestなど)を使った異常気象の早期検知
・プロジェクトで得られた洞察や成果をチームや他者に説明できるようにする
・分析の意義・課題・今後の改善点を文章化
・成果スライドの作成(Googleスライド、Canva、Notionなど)
・分析レポート(Jupyter NotebookまたはMarkdown)をチームでレビュー
・成果物プレゼンテーション(5~10分)
週 | フェーズ | 主な成果物 |
21 | テーマ設定 | 課題・仮説・必要データの整理シート |
22 | 実装準備 | センサ/API収集スクリプト、前処理コード |
23 | 分析実行 | 可視化ノートブック、分析レポート |
24 | 発表準備 | スライド資料、成果発表、レビュー記録 |
# プロジェクト企画書テンプレート
## 🧩 課題設定
- 作物:レタス
- 栽培環境:ビニールハウス
- 想定課題:夏季における高温ストレスと生育不良
## 🔍 仮説
- ハウス内の気温が30°Cを超えると生育に影響 → 換気が必要
## 📊 使用するデータ
- DHT11温湿度センサーデータ
- Open-Meteoの外気温
- 土壌水分(任意)
## ⚙️ 必要センサ/外部データ
- DHT11センサ
- Open-Meteo API(外気温)
import requests
import pandas as pd
import datetime
import random
# ダミー:センサーデータ生成
def generate_sensor_data():
now = datetime.datetime.now()
data = []
for i in range(48): # 2日間分のデータ(30分間隔)
time = now - datetime.timedelta(minutes=i*30)
temp = round(random.uniform(22, 35), 1)
hum = round(random.uniform(40, 80), 1)
data.append({'time': time, 'temperature': temp, 'humidity': hum})
return pd.DataFrame(data)
sensor_df = generate_sensor_data()
sensor_df.to_csv("sensor_data.csv", index=False)
# 天気APIからの取得
params = {
'latitude': 35.6895,
'longitude': 139.6917,
'hourly': 'temperature_2m',
'timezone': 'Asia/Tokyo'
}
response = requests.get("https://api.open-meteo.com/v1/forecast", params=params)
weather_data = response.json()
weather_df = pd.DataFrame({
"time": weather_data["hourly"]["time"],
"temperature_outdoor": weather_data["hourly"]["temperature_2m"]
})
weather_df["time"] = pd.to_datetime(weather_df["time"])
weather_df.to_csv("weather_data.csv", index=False)
import pandas as pd
import matplotlib.pyplot as plt
# データ読み込み
sensor = pd.read_csv("sensor_data.csv", parse_dates=["time"])
weather = pd.read_csv("weather_data.csv", parse_dates=["time"])
# 時刻の丸め(例:1時間ごとに統合)
sensor['time'] = sensor['time'].dt.floor('1H')
sensor = sensor.groupby('time').mean().reset_index()
# 結合
merged = pd.merge(sensor, weather, on="time", how="inner")
# 可視化
plt.figure(figsize=(10,5))
plt.plot(merged["time"], merged["temperature"], label="屋内気温")
plt.plot(merged["time"], merged["temperature_outdoor"], label="屋外気温")
plt.xlabel("時刻")
plt.ylabel("気温 (°C)")
plt.title("屋内と屋外の気温比較")
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 相関分析
correlation = merged["temperature"].corr(merged["temperature_outdoor"])
print(f"屋内と屋外の気温の相関係数: {correlation:.2f}")
# プロジェクトレポート:ビニールハウスの温度最適化
## 🎯 課題と仮説
- 屋内温度が30°Cを超えるとレタスの生育に悪影響
- 外気温と屋内気温に強い相関がある場合、事前予測による対策が可能
## 🧪 実験概要
- DHT11センサで屋内温湿度を30分ごとに取得
- Open-Meteo APIから外気温を1時間ごとに取得
- 2日分のデータで比較・相関を分析
## 📊 結果
- 相関係数:0.85(高相関)
- 気温が上がるタイミングで屋内も上昇する傾向が確認された
## 💡 考察
- API気温上昇時に事前に換気ファンを動作させることで高温リスクを軽減できる可能性
- 次ステップとしてアクチュエータ制御と自動通知を実装