熱中症の搬送人員と最高気温との相関関係を可視化し閾値をχ二乗検定する

 最高気温と熱中症の搬送人数との間に相関関係はあるだろうか.熱中症で救急搬送された人数は総務省の消防庁のサイトにある.これと気象庁のデータを結合してみた.

日別最高気温のデータをダウンロードする

 気象庁の過去の気温をダウンロードするには過去の気象データ・ダウンロードがよいだろう.複数の地点のデータをまとめてダウンロードできる.

地点を選ぶ

 後で出てくるが,消防庁の熱中症搬送人員は都道府県別であるため,地点は都道府県庁所在地にした.気温を代表する観測所というよりも,人口が最も多いのが都道府県庁所在地だろうという推測からである.

地点を選ぶ
地点を選ぶ

項目を選ぶ

 日最高気温にチェックを入れる.

項目を選ぶでは日最高気温にチェック
項目を選ぶでは日最高気温にチェック

期間を選ぶ

 消防庁の熱中症の統計は年々期間が拡大される傾向にあるが,最近では5月から9月までが一般的である.1年ずつずらして選択するとファイル容量をオーバーフローすることはない.

期間を選ぶ
期間を選ぶ

表示オプションを選ぶ

 ここは少し注意が必要である.不要なデータ列をダウンロードしないために,下記に注意されたい.

利用上注意が必要なデータの扱い

 「値を表示(格納)しない」にチェックし直す.

観測環境などの変化の前後で,値が不均一となったデータの扱い

 「観測環境などの変化前の値を表示(格納)しない」にチェックし直す.

その他

 「都道府県名を格納(CSVファイルダウンロード実行時)」をチェックする.

「表示オプションを選ぶ」
「表示オプションを選ぶ」

熱中症の搬送人員をダウンロードする

 総務省消防庁の熱中症情報のうち救急搬送状況のページにEXCELのファイルがある.これらをダウンロードして一つのフォルダーにまとめておく.ダウンロードしたてのファイル名は data.csv, data(1).csv … となっているはずだが,2008.csv, 2009.csv … などと変更しておいたほうが良い.

総務省消防庁の熱中症情報の救急搬送状況
総務省消防庁の熱中症情報の救急搬送状況

データクレンジング

日最高気温をPower Query で読み込む

 csvファイルをメモ帳で開く.

csvファイルをメモ帳で開く
csvファイルをメモ帳で開く

 最初の2行を削除する.

最初の2行を削除する
最初の2行を削除する

  「データの取得」「ファイルから」「フォルダーから」と進む.

 
「データの取得」「ファイルから」「フォルダーから」
「データの取得」「ファイルから」「フォルダーから」

 ダイアログに該当ディレクトリを指定し「データの変換」をクリックする.

「データの変換」をクリック
「データの変換」をクリック

 「列の追加」「カスタム列」へと進む.

「列の追加」「カスタム列」
「列の追加」「カスタム列」

 「カスタム列の式」にCsv.Documentとタイプする.

「カスタム列の式」にCsv.Documentとタイプ
「カスタム列の式」にCsv.Documentとタイプ

 引数に[Content], [Encoding=932]を指定する.

引数に[Content], [Encoding=932]を指定
引数に[Content], [Encoding=932]を指定

 「列の削除」「他の列の削除」で Table 以外の列を削除する.

「列の削除」「他の列の削除」
「列の削除」「他の列の削除」

 カスタム列のTableを展開する.「元の列名をプレフィックスとして使用します」のチェックは外しておく.

カスタム列のTableを展開
カスタム列のTableを展開

 展開した結果である.

展開した結果
展開した結果

 1行目をヘッダーに昇格させる.

1行目をヘッダーに昇格させる
1行目をヘッダーに昇格させる

 テキストフィルターで他のファイルのヘッダー行を除く.

テキストフィルターで他のファイルのヘッダー行を除く
テキストフィルターで他のファイルのヘッダー行を除く

 行のフィルターで「指定の値と等しくない」に「年月日」とタイプする.

行のフィルター
行のフィルター

 「空の削除」でデータのない行を除く.

「空の削除」でデータのない行を除く
「空の削除」でデータのない行を除く

 「その他の列のピボット解除」で年月日以外の列をピボット解除する.

「その他の列のピボット解除」で年月日以外の列をピボット解除する
「その他の列のピボット解除」で年月日以外の列をピボット解除する

 「値の置換」で「石狩」を「北海道」に置換する.

「値の置換」で「石狩」を「北海道」に置換する
「値の置換」で「石狩」を「北海道」に置換する

結果

 都道府県の日最高気温が読み込まれる.ここでは手順を省略しているが,クエリのマージで都道府県コードを追加している.

都道府県の日最高気温が読み込まれる
都道府県の日最高気温が読み込まれる

熱中症による救急搬送人員に関するデータをPower Queryで読み込む

 一方,総務省消防庁の「熱中症による救急搬送人員に関するデータ」は第一正規形を満たしているものの,ファイル内にワークシートが複数あり,これらを UNION する必要がある.

 下図はEXCELのファイルをフォルダーから読み込んだ後の状態であり,ワークシートと印刷領域が見えている.これはデータとしては重複した状態であり,いずれかを除く必要がある.

ワークシートと印刷領域が見えている
ワークシートと印刷領域が見えている

 ここでは「テキストフィルター」でワークシート以外を除く方針とする.

「テキストフィルター」でワークシート以外を除く
「テキストフィルター」でワークシート以外を除く

 「指定の値で始まる」に20とタイプする.

「指定の値で始まる」に20とタイプする
「指定の値で始まる」に20とタイプする

 Data列を選び「他の列の削除」を選ぶ.

Data列を選び「他の列の削除」
Data列を選び「他の列の削除」

 Data 列が残り,ここからTableを展開する.

ここからTableを展開する
ここからTableを展開する

結果

 熱中症による救急搬送人員に関するデータが読み込まれる.

熱中症による救急搬送人員に関するデータが読み込まれる
熱中症による救急搬送人員に関するデータが読み込まれる

SQL Server で結合する

 この後,クエリのマージで気温テーブルと熱中症テーブルを結合するには年月日と都道府県コードをつないだキー列を作成する必要があるのだが,下図のエラーが発生してなぜか作成できなかった.

[DataFormat.Error]指定された入力を Date 列に解析できませんでした.
[DataFormat.Error]指定された入力を Date 列に解析できませんでした.

 仕方なく,気温テーブルと熱中症テーブルをテキストファイルにエクスポートして SQL Server にインポートする方針に変更した.この辺りの詳細については テキストファイルからSQLServerに気象データをインポートするを参考にしてほしい.

クエリ

USE EMERGENCYDB;
GO
SELECT T.年月日
, T.都道府県
, T.都道府県コード
, T.日別最高気温
, E.[搬送人員(計)]
, E.軽症
, E.中等症
, E.重症
, E.死亡
FROM dbo.Temperature AS T
INNER JOIN dbo.Emergency as E
ON E.日付 = T.年月日
AND E.都道府県コード = T.都道府県コード
WHERE T.日別最高気温 IS NOT NULL

SQL Server でデータクレンジング

救急搬送人員

 上記コードから分かるように,救急搬送人員にもデータ欠損があり,NULL として格納されているレコードがある.幸いにも搬送人員(計)のみであり,目視で確認した限り,0 で置換して良さそうである.

SELECT *
FROM dbo.Emergency
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (388 行処理されました)

 NULL を 0 で置換する.

UPDATE dbo.Emergency
SET dbo.Emergency.[搬送人員(計)] = 0
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (388 行処理されました)

 NULL の格納されたレコードが存在しないことを確認する.

SELECT *
FROM dbo.Emergency
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (0 行処理されました)

気象庁の気温データ

 気象庁の気温データ欠損はいかんともしがたく,クエリで削除する他ない.

SELECT *
FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (105 行処理されました)

 日別最高気温が欠損しているレコードを削除する.

DELETE FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (105 行処理されました)

 日別最高気温が欠損しているレコードがないことを確認する.

SELECT *
FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (0 行処理されました)

EXCEL の散布図で可視化する

 クエリで得られた結果をEXCELにコピペして散布図を描く.分布を見る限り,日最高気温と搬送人員との間には指数関数的増加傾向があるように見える.

日最高気温と搬送人員
日最高気温と搬送人員

 縦軸を対数にしてみると更にその傾向が強まる.

日最高気温(線形)と搬送人員(対数)
日最高気温(線形)と搬送人員(対数)

 愛は測定できるか?でも述べたが,片対数グラフで直線が見られた場合は何らかの自己組織化が起きている.この場合,熱中症が人体の体温調節機構の破綻であるという病態と密接に関連しており,人体はある一定以上の外気温には耐えられないという生物学的特性を示している.

閾値を求める

 最高気温を表側に,搬送人員を表頭にして四分表を書く.周辺度数は一定であり,検査値の閾値,ここでは最高気温の閾値を変化させて四分表の中身がどう変化するかでROC曲線を描き,閾値を求めることができる.このときの四分表の変化を超幾何分布といい,1 つが決まれば残り 3 つも決まるので自由度は 1 である.サンプルサイズが大きいのでχ二乗検定を行うとよい.

   
検査陽性 a b a+b
検査陰性 c d c+d
  a+c b+d N

四分表を作成する

 検査値と真の値が分かっている場合,四分表を作成して検定にかけるのが一般的である.この場合は観測所の日最高気温を検査値として表側に配置し,救急搬送の有無を真の値として表頭に配置する.上図から 15 ℃から 40 ℃の範囲にあるため,1 ℃ずつ変化させてROC曲線を描く.1 – 特異度を横軸,感度を縦軸に取る.

最高気温と救急搬送人員のROC曲線
最高気温と救急搬送人員のROC曲線

 最高気温 28 ℃あたりが閾値として適切なようである.このときの感度は 0.74, 特異度は 0.78 であった.冷房の推奨設定温度となぜか一致しているが,これは救急搬送人員の閾値であることを忘れないほうがよい.人体にとって安全な温度はおそらくもう少し低いところにあるはずだ.

 ちなみに,最低気温でも同様に ROC 曲線を描いてみたが,閾値 21 ℃での感度 0.67, 特異度 0.77 であった.平均気温だと閾値 24 ℃での感度 0.70, 特異度 0.81 であった.

 参考までに,最高気温でのデータを記しておく.感度 (Sensitivity) は a/(a+c), 特異度 (Specificity) は d/(b+d) で求まる.

閾値 a b c d a+c b+d a+b c+d N Sensitivity Specificity 1-Specificity
15 58672 18697 18 92 58690 18789 77369 110 77479 1.000 0.005 0.995
16 58660 18621 30 168 58690 18789 77281 198 77479 0.999 0.009 0.991
17 58634 18521 56 268 58690 18789 77155 324 77479 0.999 0.014 0.986
18 58586 18316 104 473 58690 18789 76902 577 77479 0.998 0.025 0.975
19 58529 18011 161 778 58690 18789 76540 939 77479 0.997 0.041 0.959
20 58415 17484 275 1305 58690 18789 75899 1580 77479 0.995 0.069 0.931
21 58194 16758 496 2031 58690 18789 74952 2527 77479 0.992 0.108 0.892
22 57743 15738 947 3051 58690 18789 73481 3998 77479 0.984 0.162 0.838
23 56980 14317 1710 4472 58690 18789 71297 6182 77479 0.971 0.238 0.762
24 55750 12548 2940 6241 58690 18789 68298 9181 77479 0.950 0.332 0.668
25 53920 10497 4770 8292 58690 18789 64417 13062 77479 0.919 0.441 0.559
26 51395 8325 7295 10464 58690 18789 59720 17759 77479 0.876 0.557 0.443
27 47930 6111 10760 12678 58690 18789 54041 23438 77479 0.817 0.675 0.325
28 43400 4090 15290 14699 58690 18789 47490 29989 77479 0.739 0.782 0.218
29 38397 2555 20293 16234 58690 18789 40952 36527 77479 0.654 0.864 0.136
30 33018 1376 25672 17413 58690 18789 34394 43085 77479 0.563 0.927 0.073
31 27439 664 31251 18125 58690 18789 28103 49376 77479 0.468 0.965 0.035
32 21436 254 37254 18535 58690 18789 21690 55789 77479 0.365 0.986 0.014
33 15452 70 43238 18719 58690 18789 15522 61957 77479 0.263 0.996 0.004
34 9965 20 48725 18769 58690 18789 9985 67494 77479 0.170 0.999 0.001
35 5457 4 53233 18785 58690 18789 5461 72018 77479 0.093 1.000 0.000
36 2517 0 56173 18789 58690 18789 2517 74962 77479 0.043 1.000 0.000
37 883 0 57807 18789 58690 18789 883 76596 77479 0.015 1.000 0.000
38 217 0 58473 18789 58690 18789 217 77262 77479 0.004 1.000 0.000
39 35 0 58655 18789 58690 18789 35 77444 77479 0.001 1.000 0.000
40 4 0 58686 18789 58690 18789 4 77475 77479 0.000 1.000 0.000

ストアドプロシージャ

 SQL Server で上記データを算出するためにストアドプロシージャを作成した.プロシージャ内で宣言した変数 @Temperature に 15 から 40 まで 1 ずつ変化させて代入する.

CREATE PROCEDURE [dbo].[QuarterTable] 
	@Temperature int
AS
BEGIN
SELECT	@Temperature										AS '閾値'
,	SUM(CASE WHEN E.[搬送人員(計)] > 0 AND T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END)	AS a
,	SUM(CASE WHEN E.[搬送人員(計)] = 0 AND T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END)	AS b
,	SUM(CASE WHEN E.[搬送人員(計)] > 0 AND T.日別最高気温 <  @Temperature THEN 1 ELSE 0 END)	AS c
,	SUM(CASE WHEN E.[搬送人員(計)] = 0 AND T.日別最高気温 <  @Temperature THEN 1 ELSE 0 END)	AS d
,	SUM(CASE WHEN E.[搬送人員(計)] > 0 THEN 1 ELSE 0 END)					AS 'a+c'
,	SUM(CASE WHEN E.[搬送人員(計)] = 0 THEN 1 ELSE 0 END)					AS 'b+d'
,	SUM(CASE WHEN T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END)				AS 'a+b'
,	SUM(CASE WHEN T.日別最高気温 <  @Temperature THEN 1 ELSE 0 END)				AS 'c+d'
,	COUNT(*)										AS N
FROM	dbo.Emergency	AS E
INNER JOIN	dbo.Temperature	AS T
ON	E.日付 = T.年月日
AND	E.都道府県コード = T.都道府県コード
END

χ二乗検定を行う

 上の表を元にχ二乗検定を行う.閾値が 28 ℃のレコードを四分表に直した観測値 (O) が下表である.

観測値 搬送人員あり日数 搬送人員なし日数  
最高気温が閾値以上の日数 43400 4090 47490
最高気温が閾値未満の日数 15290 14699 29989
  58690 18789 77479

 帰無仮説は「閾値以上の日と閾値未満の日で熱中症による救急搬送人員に差がない」であり,期待値 (E) を計算すると下表のようになる.

期待値 搬送人員あり日数 搬送人員なし日数  
最高気温が閾値以上の日数 35973 11517 47490
最高気温が閾値未満の日数 22717 7272 29989
  58690 18789 77479

 χ2=Σ{(O-E)2/E} であり,計算すると 16334 となる.

χ二乗値 搬送人員あり 搬送人員なし
最高気温が閾値以上 1533.17 4789.064
最高気温が閾値未満 2427.898 7583.869

 EXCEL の CHISQ.DIST.RT 関数で p 値を求めると p = 0.000 と統計的有意であり帰無仮説は棄却され,対立仮説の「日最高気温が 28 ℃以上と未満とでは,熱中症による救急搬送人員に有意差がある」が採択される.

 実際には熱中症以外でも救急搬送は発生していて,それと比較して熱中症による搬送の増加があるかどうかを検定しないと意味がないのだが,これは全出動回数のデータがないので今回は省略する.

まとめ

 気象庁のサイトから最高気温をダウンロードし,総務省消防庁のサイトから熱中症救急搬送人員をダウンロードし,両者を結合して散布図に示した.

 最高気温の上昇に従い,救急搬送人員は指数関数的増加を示す傾向が認められた.

 最高気温を閾値として ROC 曲線を描くと 28 ℃で感度 (0.74) と特異度 (0.78) のバランスが取れ,最高気温が 28 ℃以上では救急搬送人員が有意に増加したが,28 ℃が人体にとって安全な温度であるか否かは別の議論が必要である.

 重症度別に検討した結果は日最高気温と熱中症の重症度別の搬送人員数を検討するに詳しい.

参考文献

熱中症に関する研究・報告について(日本救急医学会)

“熱中症の搬送人員と最高気温との相関関係を可視化し閾値をχ二乗検定する” への5件の返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください