公衆衛生ビッグデータ分析:
演習リソース集

シラバスの各回で活用できる実践的リソースとツール

(c)kimuakilab 使用したい場合 思い込みください

このページでは、公衆衛生ビッグデータ分析の授業で活用できる実践的なリソースやデータソース、ツールをまとめています。各回の演習に役立つサイトやチュートリアルへのリンク、サンプルコード、データセットなどを提供し、実際にデータを操作しながら学習できるよう構成しています。

公衆衛生データソース

WHO データポータル

国際機関

世界保健機関(WHO)が提供する国際的な保健データコレクション。世界各国の健康指標や疾病統計、保健システム情報などを収集・管理しています。

疫学 国際比較 健康指標

CDC データポータル

国際機関

米国疾病予防管理センター(CDC)が提供する豊富な公衆衛生データリポジトリ。感染症、慢性疾患、環境健康、行動リスク要因など多岐にわたるデータセットを利用できます。

疾病監視 行動リスク オープンデータ

OECD Health Statistics

国際機関

経済協力開発機構(OECD)が提供する加盟国の健康統計データベース。医療制度、医療費、医療資源、健康状態など、国際比較に適した標準化されたデータを提供しています。

医療制度 国際比較 社会経済指標

厚生労働省オープンデータ

国内データ

日本の厚生労働省が提供する各種統計調査やオープンデータ。人口動態、国民生活基礎調査、患者調査、医療施設調査など、日本の公衆衛生に関する基本統計を入手できます。

人口動態 医療資源 健康調査

Public Health Data Hub

オープンデータ

公衆衛生データを共有するための総合プラットフォーム。研究者や政策立案者が使用できる標準化されたデータセットやツールを提供し、データドリブンな公衆衛生実践を支援します。

データポータル 標準化 可視化

地理情報システム(GIS)リソース

空間データ

公衆衛生分析のための地理空間データと地図作成ツール。疾病マッピング、健康格差の地理的分析、医療資源の地理的分布などの分析に活用できます。

空間分析 疾病マッピング 地域格差

データ分析ツールとチュートリアル

R/RStudio for 公衆衛生分析

統計ソフト

公衆衛生データ分析のための無料の統計解析環境。疫学研究、データ可視化、統計モデリングに広く活用されています。公衆衛生向けの専用パッケージも充実しています。

統計分析 可視化 オープンソース

Python for 公衆衛生分析

プログラミング

公衆衛生データサイエンスのための汎用プログラミング言語。Pandas、NumPy、Matplotlib、Scikit-learnなどのライブラリを活用したデータ処理、可視化、機械学習などが可能です。

データ処理 機械学習 可視化

Tableau Public

データ可視化

無料で使えるインタラクティブなデータ可視化ツール。ドラッグアンドドロップで操作でき、公衆衛生データのダッシュボード作成や視覚的なストーリーテリングが可能です。

インタラクティブ ダッシュボード 無料

SQL for 公衆衛生データベース

データベース

データベースからデータを抽出・操作するための標準言語SQLの入門リソース。公衆衛生データベースからの効率的なデータ取得・操作の基礎を学べます。

クエリ言語 データ抽出 集計分析

公衆衛生データサイエンスコース

オンライン学習

公衆衛生データ分析スキルを習得するためのオンラインコースと学習リソース。基礎から応用まで、自分のペースで学べるコンテンツを提供しています。

無料コース 実践演習 証明書

Git/GitHub for データ分析プロジェクト

バージョン管理

データ分析プロジェクトのバージョン管理と共同作業のためのツール。コードの変更履歴管理、チーム協働、成果物の共有などに活用できます。

バージョン管理 共同作業 コード共有

実践チュートリアル例

第3回:R/Pythonでのデータクリーニング演習

基本グラフの作成 - R

クリーニングしたデータを使って、基本的なグラフを作成します:

# 棒グラフ作成 - 死因別の死亡数(最新年) latest_year_data <- clean_data %>% filter(year == max(year)) ggplot(latest_year_data, aes(x = reorder(cause_name, -deaths), y = deaths)) + geom_bar(stat = "identity", fill = "steelblue") + theme_minimal() + labs(title = paste("主要死因別死亡数(", max(latest_year_data$year), "年)"), x = "死因", y = "死亡数") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 時系列グラフ作成 - 特定の死因の推移 heart_disease_trend <- clean_data %>% filter(cause_name == "Heart disease") ggplot(heart_disease_trend, aes(x = year, y = deaths)) + geom_line(color = "red", size = 1) + geom_point(color = "red", size = 2) + theme_minimal() + labs(title = "心臓病による死亡数の推移", x = "年", y = "死亡数") # 複数の死因比較グラフ top_causes <- clean_data %>% filter(cause_name %in% c("Heart disease", "Cancer", "Stroke", "Alzheimer's disease")) %>% group_by(year, cause_name) %>% summarize(deaths = sum(deaths, na.rm = TRUE)) ggplot(top_causes, aes(x = year, y = deaths, color = cause_name, group = cause_name)) + geom_line(size = 1) + geom_point(size = 2) + theme_minimal() + scale_color_brewer(palette = "Set1") + labs(title = "主要死因の死亡数推移", x = "年", y = "死亡数", color = "死因")

基本グラフの作成 - Python

# 棒グラフ作成 - 死因別の死亡数(最新年)
latest_year = clean_data['year'].max()
latest_year_data = clean_data[clean_data['year'] == latest_year]

plt.figure(figsize=(12, 6))
plt.bar(latest_year_data['cause_name'], latest_year_data['deaths'])
plt.xticks(rotation=45, ha='right')
plt.title(f'主要死因別死亡数({latest_year}年)')
plt.xlabel('死因')
plt.ylabel('死亡数')
plt.tight_layout()
plt.show()

# 時系列グラフ作成 - 特定の死因の推移
heart_disease_trend = clean_data[clean_data['cause_name'] == 'Heart disease']

plt.figure(figsize=(10, 5))
plt.plot(heart_disease_trend['year'], heart_disease_trend['deaths'], 'ro-', linewidth=2)
plt.title('心臓病による死亡数の推移')
plt.xlabel('年')
plt.ylabel('死亡数')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

# 複数の死因比較グラフ
top_causes = clean_data[clean_data['cause_name'].isin(['Heart disease', 'Cancer', 'Stroke', "Alzheimer's disease"])]

plt.figure(figsize=(12, 6))
for cause in ['Heart disease', 'Cancer', 'Stroke', "Alzheimer's disease"]:
    cause_data = top_causes[top_causes['cause_name'] == cause]
    plt.plot(cause_data['year'], cause_data['deaths'], 'o-', linewidth=2, label=cause)

plt.title('主要死因の死亡数推移')
plt.xlabel('年')
plt.ylabel('死亡数')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

# サブプロットを使った複数グラフの表示
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle('公衆衛生データの多角的分析', fontsize=16)

# 左上: 棒グラフ
axes[0, 0].bar(latest_year_data['cause_name'], latest_year_data['deaths'])
axes[0, 0].set_title('死因別死亡数')
axes[0, 0].set_xticklabels(latest_year_data['cause_name'], rotation=45, ha='right')

# 右上: 円グラフ
axes[0, 1].pie(latest_year_data['deaths'], labels=latest_year_data['cause_name'], autopct='%1.1f%%')
axes[0, 1].set_title('死因別死亡数の割合')

# 左下: 時系列
heart_disease_trend = clean_data[clean_data['cause_name'] == 'Heart disease']
axes[1, 0].plot(heart_disease_trend['year'], heart_disease_trend['deaths'], 'r-')
axes[1, 0].set_title('心臓病による死亡数の推移')
axes[1, 0].set_xlabel('年')
axes[1, 0].set_ylabel('死亡数')
axes[1, 0].grid(True)

# 右下: 箱ひげ図
axes[1, 1].boxplot([clean_data[clean_data['cause_name'] == cause]['deaths'] 
                    for cause in ['Heart disease', 'Cancer', 'Stroke']])
axes[1, 1].set_xticklabels(['Heart disease', 'Cancer', 'Stroke'])
axes[1, 1].set_title('死因別死亡数の分布')
axes[1, 1].set_ylabel('死亡数')

plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()

Tableau Publicでのデータ可視化

Tableau Publicを使った可視化手順:

  1. クリーニング済みCSVデータをTableau Publicにインポート
  2. ワークシートを作成し、死因をディメンション、死亡数をメジャーとして設定
  3. 棒グラフ、折れ線グラフ、ヒートマップなど様々な表現方法で可視化
  4. インタラクティブなダッシュボードの作成
  5. Webで共有可能な形式で公開

Tableau Publicギャラリー

第8回:疫学データ分析演習

リスク比とオッズ比の計算

# Rでのリスク比とオッズ比計算の例 # 2x2表データの作成 library(epitools) # 例: 喫煙と肺がんの関連(仮想データ) smoking_data <- matrix(c(40, 60, 10, 90), nrow = 2, dimnames = list(c("Lung Cancer", "No Lung Cancer"), c("Smoker", "Non-Smoker"))) print(smoking_data) # リスク比の計算 riskratio(smoking_data) # オッズ比の計算 oddsratio(smoking_data) # 95%信頼区間の確認 oddsratio.wald(smoking_data) # フィッシャーの正確検定 fisher.test(smoking_data)

地理情報システム(GIS)を用いた疾病マッピング

QGISを使った基本的な疾病マッピング手順:

  1. QGISのインストールと基本設定
  2. 地理データ(シェープファイル)の入手と読み込み
  3. 疾病データ(CSV等)と地理データの結合
  4. 色分け(コロプレス)マップの作成
  5. レイヤー操作と属性テーブルの編集
  6. マップの装飾と出力

QGISケーススタディ

交絡因子の調整

# Rでの交絡因子の調整例 # 必要なパッケージ library(dplyr) library(ggplot2) library(epitools) # 仮想データの作成: 年齢・喫煙・心臓病のデータ set.seed(123) n <- 1000 age_group <- sample(c("若年", "中年", "高齢"), n, replace = TRUE, prob = c(0.3, 0.4, 0.3)) smoking <- ifelse(age_group == "若年", sample(c(TRUE, FALSE), sum(age_group == "若年"), replace = TRUE, prob = c(0.2, 0.8)), ifelse(age_group == "中年", sample(c(TRUE, FALSE), sum(age_group == "中年"), replace = TRUE, prob = c(0.4, 0.6)), sample(c(TRUE, FALSE), sum(age_group == "高齢"), replace = TRUE, prob = c(0.3, 0.7)))) # 心臓病発症確率は年齢と喫煙状態に依存 prob_heart_disease <- case_when( age_group == "若年" & smoking == TRUE ~ 0.05, age_group == "若年" & smoking == FALSE ~ 0.01, age_group == "中年" & smoking == TRUE ~ 0.15, age_group == "中年" & smoking == FALSE ~ 0.05, age_group == "高齢" & smoking == TRUE ~ 0.30, age_group == "高齢" & smoking == FALSE ~ 0.15 ) heart_disease <- rbinom(n, 1, prob_heart_disease) # データフレームの作成 health_data <- data.frame( age_group = age_group, smoking = smoking, heart_disease = heart_disease ) # 喫煙と心臓病の関連(層別化なし) table_overall <- table(health_data$smoking, health_data$heart_disease) print("全体の関連:") print(table_overall) print(oddsratio.wald(table_overall)) # 年齢層別の層別解析 for (age in c("若年", "中年", "高齢")) { subset_data <- filter(health_data, age_group == age) table_strata <- table(subset_data$smoking, subset_data$heart_disease) print(paste("年齢層:", age)) print(table_strata) print(oddsratio.wald(table_strata)) } # ロジスティック回帰による交絡調整 model1 <- glm(heart_disease ~ smoking, family = binomial, data = health_data) model2 <- glm(heart_disease ~ smoking + age_group, family = binomial, data = health_data) # 調整なしと調整ありのオッズ比比較 print("調整なしのモデル:") summary(model1) exp(cbind(OR = coef(model1), confint(model1))) print("年齢調整済みのモデル:") summary(model2) exp(cbind(OR = coef(model2), confint(model2)))

最終プロジェクト関連リソース

第15回:総合プロジェクト参考資料

プロジェクト構成例

  1. 背景と課題設定
    • 公衆衛生課題の明確化
    • 研究質問の設定
    • 対象集団と地域の特定
  2. データ収集と前処理
    • データソースの選定と入手
    • データクリーニングとバリデーション
    • 変数の定義と操作化
  3. 探索的データ分析
    • 記述統計と分布の確認
    • 時間的・空間的パターンの探索
    • 関連性の初期検討
  4. 高度な分析
    • 統計モデリング(回帰分析など)
    • 機械学習アプローチ(適切な場合)
    • 地理空間分析(GIS)
  5. 結果の解釈
    • エビデンスの批判的評価
    • 限界点の認識
    • 公衆衛生的意義の考察
  6. 政策提言と介入計画
    • 実行可能な政策オプションの提示
    • 介入プログラムの概略設計
    • モニタリング・評価計画
  7. 効果的なプレゼンテーション
    • データストーリーテリング
    • インタラクティブな可視化
    • 異なる対象者向けのコミュニケーション戦略

サンプルデータのダウンロード

以下のリンクから演習用の公衆衛生サンプルデータセットをダウンロードします:

CDC死因データセット (CSV形式)

R/RStudioでのデータ読み込みと基本操作

# パッケージのインストールと読み込み install.packages("tidyverse") # 初回のみ library(tidyverse) # CSVファイルの読み込み mortality_data <- read_csv("path/to/NCHS_Leading_Causes_of_Death_United_States.csv") # データの概要確認 head(mortality_data) summary(mortality_data) str(mortality_data) # 欠損値の確認 colSums(is.na(mortality_data)) # データクリーニング基本操作 clean_data <- mortality_data %>% # 列名を小文字に統一 rename_with(tolower) %>% # 数値データの変換(カンマ除去など) mutate(deaths = as.numeric(gsub(",", "", deaths))) %>% # 欠損値の処理 filter(!is.na(deaths)) %>% # 特定の年のデータのみ抽出 filter(year >= 2010) # クリーニング後のデータ確認 glimpse(clean_data)

Pythonでのデータ読み込みと基本操作

# 必要なライブラリのインポート import pandas as pd import numpy as np import matplotlib.pyplot as plt # CSVファイルの読み込み file_path = "path/to/NCHS_Leading_Causes_of_Death_United_States.csv" mortality_data = pd.read_csv(file_path) # データの概要確認 mortality_data.head() mortality_data.info() mortality_data.describe() # 欠損値の確認 mortality_data.isnull().sum() # データクリーニング基本操作 # 列名を小文字に統一 mortality_data.columns = mortality_data.columns.str.lower() # 数値データの変換(カンマ除去など) mortality_data['deaths'] = mortality_data['deaths'].str.replace(',', '').astype(float) # 欠損値の処理 clean_data = mortality_data.dropna(subset=['deaths']) # 特定の年のデータのみ抽出 clean_data = clean_data[clean_data['year'] >= 2010] # クリーニング後のデータ確認 clean_data.info()

第4回:基本的なデータ可視化演習