色の知覚(1)太陽光

 色彩に関してはこれまで先人の膨大な研究の積み重ねがある.その一端を紹介し,色の物理的性質から生理的反応への橋渡しについて考察する.

 今回は太陽光について調べた.データベースは主に National Renewable Energy Laboratory から取った.日本国内にも太陽光についてのデータベースは気象庁新エネルギー・産業技術総合開発機構がデータを公開している.

太陽光

太陽光の分光強度分布

 地球は太陽の周囲を公転する惑星である.太陽の内部で核融合反応により水素原子がヘリウム原子に変化する際にはガンマ線が放出される.ガンマ線は太陽の内部で様々な原子や電子と衝突してエネルギーを失い,太陽表面に出てくる頃には波長が長くなっている.

太陽光の分光強度分布 (National Renewable Energy Laboratory)
太陽光の分光強度分布(National Renewable Energy Laboratory より筆者作成)

 太陽光の分光強度分布を見ると,可視光線の波長域のエネルギーが最も高い.植物を始めとする地球上の生物は,太陽光の最もエネルギーの高い波長域を利用するように進化してきたと考えられる.

太陽光の波長ごとの放射照度の日内変動

 太陽光の波長の日内変動のデータはあるだろうか.同じ NREL のサイト内にあった.Measurement and Instrumentation Data Center (MIDC) というページである.

 Select the desired time frame: 以下から一つ選ぶ.直近一年分だと 2017 年 12 月 1 日から 2019 年 12 月 31 日までである.IRRADIANS (放射照度)から下図の項目をチェックし,Output Type: から Selected 1-Min Data (ASCII Text) にチェックを入れて Submit をクリックするとファイルがダウンロードされる.1 分ごとだと約 54 万件と,おそらく EXCEL では処理しきれない. 1 時間ごと,約 18,000 件だが,の方が良いかも知れない.Selected Plot にチェックするとブラウザ内で描画される.

NREL Solar Radiation Research Laboratory (BMS) Daily Plots and Raw Data Files
NREL Solar Radiation Research Laboratory (BMS)
Daily Plots and Raw Data Files
NREL Solar Radiation Research Laboratory (BMS) Daily Plots and Raw Data Files
NREL Solar Radiation Research Laboratory (BMS)
Daily Plots and Raw Data Files

 ダウンロードしたファイルを開いてみると,測定値にマイナスが多いのに気がつく.おそらくだが,何らかのエラーを示しているのだと思う.Power Query でエラー値を弾いておかないと,後の処理が大変になる.

Power Query での処理

 例によって csv ファイルへの接続から.

「データの取得」「ファイルから」「テキストまたはCSVから」
「データの取得」「ファイルから」「テキストまたはCSVから」

 ファイルパスを指定して「データの変換」へと進む.

「データの変換」
「データの変換」

 マイナスの値が多い.これは何らかのエラーを示していると考えられる.フィルターで除外する必要がある.

DateTime 型には Power Query が規定のディメンションを用意している

 日付型から年,月,日を抽出する.時刻型から時,分,秒を抽出する.これらのディメンションには既に規定の手段が用意されている.「列の追加」タブにある.

 日付型の列を選んでおいて,「列の追加」タブの「日付」から「年」「年」と進む.同様に月と日も追加する.

日付型の列を選んでおき「列の追加」タブから「年」「年」を選択
日付型の列を選んでおき「列の追加」タブから「日付」「年」「年」を選択
日付型の列を選んでおいて「列の追加」タブの「日付」「月」「月」を選ぶ
日付型の列を選んでおいて「列の追加」タブの「日付」「月」「月」を選ぶ
日付型の列を選んでおき「列の追加」タブの「日付」「日」「日」を選ぶ
日付型の列を選んでおき「列の追加」タブの「日付」「日」「日」を選ぶ

 時刻型の列を選んでおいて「列の追加」「時刻」「時」「時」と進む.同様に分と秒も追加できるが,ここでは分までである.

時刻型の列を選んでおいて「列の追加」タブの「時刻」「時」「時」と選ぶ
時刻型の列を選んでおいて「列の追加」タブの「時刻」「時」「時」と選ぶ
時刻型の列を選んでおいて「列の追加」「分」を選ぶ
時刻型の列を選んでおいて「列の追加」「分」を選ぶ

列名を変更

 列名が冗長なので必要最小限に縮める.

列名を変更
列名を変更

ピボット解除

 波長の列が横並びになっており,ピボット解除して第一正規形にする.

波長の列を複数選択してピボット解除
波長の列を複数選択してピボット解除

 列名「属性」を WaveLength に変更し,列名「値」を Value に変更する.

列名を変更する
列名を変更する

数値フィルターを適用する

 マイナスの値はエラー値であり,グラフ作成の邪魔になるので数値フィルターで除外する.ここでは「指定の値以上」でゼロを指定する.

数値フィルターの「指定の値以上」
数値フィルターの「指定の値以上」
「次の値以上」で 0 とタイプする
「次の値以上」で 0 とタイプする

オーバーフロー時にはデータモデルに読み込む

 クエリの結果,約 230 万件のデータが読み込まれるが,EXCEL のワークシートには 100 万件以上のデータは入り切らずにオーバーフローする.

このクエリによって返されたデータはワークシートに入り切りません.入りきるだけのデータを表示して続ける場合は [OK] をクリックします.クエリを取り消す場合は,[キャンセル] をクリックします.返されるデータを減らすには,データソースへの接続のクエリを変更してください.
このクエリによって返されたデータはワークシートに入り切りません.入りきるだけのデータを表示して続ける場合は [OK] をクリックします.クエリを取り消す場合は,[キャンセル] をクリックします.返されるデータを減らすには,データソースへの接続のクエリを変更してください.

 この場合,キャンセルをクリックしてクエリウィンドウへ遷移する.クエリにマウスをオーバーすると,下図のように「データモデルへの読み込み」を促されるので,そのままクリックする.

このクエリは大きすぎて,ワークシートの指定された場所に読み込めません.ワークシートに読み込めるのは,1,-48,576 行,16,384 列までです.代わりに,データモデルにクエリを読み込んでください.
このクエリは大きすぎて,ワークシートの指定された場所に読み込めません.ワークシートに読み込めるのは,1,048,576 行,16,384 列までです.代わりに,データモデルにクエリを読み込んでください.

 データモデルへの読み込みが完了する.

クエリと接続
クエリと接続

詳細エディタ

 日本語での詳細エディタの内容は下記の通り.

let
    ソース = Csv.Document(File.Contents("C:\Users\UserName\Downloads\20171201.csv"),[Delimiter=",", Columns=9, Encoding=932, QuoteStyle=QuoteStyle.None]),
    昇格されたヘッダー数 = Table.PromoteHeaders(ソース, [PromoteAllScalars=true]),
    変更された型 = Table.TransformColumnTypes(昇格されたヘッダー数,{{"DATE (MM/DD/YYYY)", type date}, {"MST", type time}, {"315nm POM-01 Photometer [nA]", type number}, {"400nm POM-01 Photometer [uA]", type number}, {"500nm POM-01 Photometer [uA]", type number}, {"675nm POM-01 Photometer [uA]", type number}, {"870nm POM-01 Photometer [uA]", type number}, {"940nm POM-01 Photometer [uA]", type number}, {"1020nm POM-01 Photometer [uA]", type number}}),
    挿入された年 = Table.AddColumn(変更された型, "年", each Date.Year([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    挿入された月 = Table.AddColumn(挿入された年, "月", each Date.Month([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    挿入された日 = Table.AddColumn(挿入された月, "日", each Date.Day([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    挿入された時間 = Table.AddColumn(挿入された日, "時", each Time.Hour([MST]), Int64.Type),
    挿入された分 = Table.AddColumn(挿入された時間, "分", each Time.Minute([MST]), Int64.Type),
    並べ替えられた列 = Table.ReorderColumns(挿入された分,{"DATE (MM/DD/YYYY)", "MST", "年", "月", "日", "時", "分", "315nm POM-01 Photometer [nA]", "400nm POM-01 Photometer [uA]", "500nm POM-01 Photometer [uA]", "675nm POM-01 Photometer [uA]", "870nm POM-01 Photometer [uA]", "940nm POM-01 Photometer [uA]", "1020nm POM-01 Photometer [uA]"}),
    #"名前が変更された列 " = Table.RenameColumns(並べ替えられた列,{{"DATE (MM/DD/YYYY)", "DATE"}, {"315nm POM-01 Photometer [nA]", "315nm"}, {"400nm POM-01 Photometer [uA]", "400nm"}, {"500nm POM-01 Photometer [uA]", "500nm"}, {"675nm POM-01 Photometer [uA]", "675nm"}, {"870nm POM-01 Photometer [uA]", "870nm"}, {"940nm POM-01 Photometer [uA]", "940nm"}, {"1020nm POM-01 Photometer [uA]", "1020nm"}}),
    ピボット解除された列 = Table.UnpivotOtherColumns(#"名前が変更された列 ", {"DATE", "MST", "年", "月", "日", "時", "分"}, "属性", "値"),
    #"名前が変更された列 1" = Table.RenameColumns(ピボット解除された列,{{"属性", "WaveLength"}, {"値", "Value"}}),
    フィルターされた行 = Table.SelectRows(#"名前が変更された列 1", each [Value] >= 0)
in
    フィルターされた行

 英語だと下記の通り.

let
    Source = Csv.Document(File.Contents("C:\Users\UserName\Downloads\20171201.csv"),[Delimiter=",", Columns=9, Encoding=932, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"DATE (MM/DD/YYYY)", type date}, {"MST", type time}, {"315nm POM-01 Photometer [nA]", type number}, {"400nm POM-01 Photometer [uA]", type number}, {"500nm POM-01 Photometer [uA]", type number}, {"675nm POM-01 Photometer [uA]", type number}, {"870nm POM-01 Photometer [uA]", type number}, {"940nm POM-01 Photometer [uA]", type number}, {"1020nm POM-01 Photometer [uA]", type number}}),
    #"Inserted Year" = Table.AddColumn(#"Changed Type", "Year", each Date.Year([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    #"Inserted Month" = Table.AddColumn(#"Inserted Year", "Month", each Date.Month([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    #"Inserted Day" = Table.AddColumn(#"Inserted Month", "Day", each Date.Day([#"DATE (MM/DD/YYYY)"]), Int64.Type),
    #"Inserted Hour" = Table.AddColumn(#"Inserted Day", "Hour", each Time.Hour([MST]), Int64.Type),
    #"Inserted Minute" = Table.AddColumn(#"Inserted Hour", "Minute", each Time.Minute([MST]), Int64.Type),
    #"Reordered Columns" = Table.ReorderColumns(#"Inserted Minute",{"DATE (MM/DD/YYYY)", "MST", "Year", "Month", "Day", "Hour", "Minute", "315nm POM-01 Photometer [nA]", "400nm POM-01 Photometer [uA]", "500nm POM-01 Photometer [uA]", "675nm POM-01 Photometer [uA]", "870nm POM-01 Photometer [uA]", "940nm POM-01 Photometer [uA]", "1020nm POM-01 Photometer [uA]"}),
    #"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"DATE (MM/DD/YYYY)", "DATE"}, {"315nm POM-01 Photometer [nA]", "315nm"}, {"400nm POM-01 Photometer [uA]", "400nm"}, {"500nm POM-01 Photometer [uA]", "500nm"}, {"675nm POM-01 Photometer [uA]", "675nm"}, {"870nm POM-01 Photometer [uA]", "870nm"}, {"940nm POM-01 Photometer [uA]", "940nm"}, {"1020nm POM-01 Photometer [uA]", "1020nm"}}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Renamed Columns", {"DATE", "MST", "Year", "Month", "Day", "Hour", "Minute"}, "Attribute", "Value"),
    #"Renamed Columns1" = Table.RenameColumns(#"Unpivoted Columns",{{"Attribute", "WaveLength"}, {"Value", "Irradiance"}}),
    #"Filtered Rows" = Table.SelectRows(#"Renamed Columns1", each [Irradiance] >= 0)
in
    #"Filtered Rows"

ピボットテーブルとピボットグラフの作成

 ここからはピボットテーブル,ピボットグラフの作成にかかる.「挿入」タブの「ピボットグラフ」から「ピボットグラフとピボットテーブル」を選ぶ.

「挿入」タブの「ピボットグラフ」から「ピボットグラフとピボットテーブル」
「挿入」タブの「ピボットグラフ」から「ピボットグラフとピボットテーブル」

ピボットテーブルのフィールド

 初期状態は下図のようである.

ピボットテーブルのフィールド
ピボットテーブルのフィールド

ピボットテーブルのフィールドにディメンションとメジャーを指定し,グラフの種類を指定する

 ここで,グラフで表現したい意図を再確認しよう.「波長ごとの放射照度の日内変動」であった.

 「…ごとの」と来る項目は,凡例になる可能性が高いため,WaveLength は「列」に指定する.

 「日内変動」という語句から,時刻を示すディメンションが横軸になる可能性が高いため,「時」「分」を「行」に指定する.

 縦軸はこの場合 Value であるが,単位はおそらく W/m2 であり,太陽光のエネルギー量はメジャーであるから,「Σ値」に指定する.計算式は初期設定では「合計」だが,「平均」に変更しておく.

 「年」と「月」と「日」は「フィルター」に指定する.

 総合的に考慮して,グラフの種類は「積み上げ縦棒」がふさわしい.

ピボットテーブルのフィールドにそれぞれディメンションとメジャーを指定する
ピボットテーブルのフィールドにそれぞれディメンションとメジャーを指定する

結果

 年間を通じた代表的な日というと,春分の日,夏至,秋分の日,冬至であろう.その近辺の日で「きれいな」グラフを探す.

 意外なことに,夏至の放射照度が最もエネルギーが低い結果となった.最も,日の出から日没までの時間は冬至が最も短い.総エネルギーで比較すればまた違った光景が見えてくるのだろう.

 国内の太陽光のデータベースで最も詳細なものは新エネルギー・産業技術総合開発機構であり,1 nm ごとの放射照度を 10 分毎に公開している.岐阜,長沼,沖永良部,鳥栖,つくばの全国で5地点しか計測していないが,データ量は膨大で,1地点のファイルだけでも zip 圧縮された状態で 200 MB 以上あり,解凍すると 1GB を超える.このデータにはまだ手を付けられない.数日間試行錯誤したが,巨大すぎて手に負えないというのが正直なところである.

春分の日近辺の太陽光の放射照度の日内変動
春分の日近辺の太陽光の放射照度の日内変動
夏至近辺の太陽光の放射照度の日内変動
夏至近辺の太陽光の放射照度の日内変動
秋分の日近辺の太陽光の放射照度の日内変動
秋分の日近辺の太陽光の放射照度の日内変動
冬至近辺の太陽光の放射照度の日内変動
冬至近辺の太陽光の放射照度の日内変動

光子の持つエネルギー

 光には波動としての性質と粒子としての性質がある.光合成や視覚に関しては,光は粒子として扱い,そのエネルギーは波長を分母とする関数 (E = hc/λ) で表現される.h はプランク定数,c は光速である.

 紫外領域の光は多くの化学結合を直接切断できる.紫外線が遺伝子に有害である理由がこれである.赤外領域の光は分子を振動させ,熱を発生させる.可視光は弱い化学結合を切断できるが,炭素間や炭素と水素間の共有結合を切断することはできない.この微妙な性質を利用して植物は光合成を行うことができる.

“色の知覚(1)太陽光” への1件の返信

コメントを残す

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

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