色彩に関してはこれまで先人の膨大な研究の積み重ねがある.その一端を紹介し,色の物理的性質から生理的反応への橋渡しについて考察する.
今回は太陽光について調べた.データベースは主に 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 にチェックするとブラウザ内で描画される.
ダウンロードしたファイルを開いてみると,測定値にマイナスが多いのに気がつく.おそらくだが,何らかのエラーを示しているのだと思う.Power Query でエラー値を弾いておかないと,後の処理が大変になる.
Power Query での処理
例によって csv ファイルへの接続から.
ファイルパスを指定して「データの変換」へと進む.
マイナスの値が多い.これは何らかのエラーを示していると考えられる.フィルターで除外する必要がある.
DateTime 型には Power Query が規定のディメンションを用意している
日付型から年,月,日を抽出する.時刻型から時,分,秒を抽出する.これらのディメンションには既に規定の手段が用意されている.「列の追加」タブにある.
日付型の列を選んでおいて,「列の追加」タブの「日付」から「年」「年」と進む.同様に月と日も追加する.
時刻型の列を選んでおいて「列の追加」「時刻」「時」「時」と進む.同様に分と秒も追加できるが,ここでは分までである.
列名を変更
列名が冗長なので必要最小限に縮める.
ピボット解除
波長の列が横並びになっており,ピボット解除して第一正規形にする.
列名「属性」を WaveLength に変更し,列名「値」を Value に変更する.
数値フィルターを適用する
マイナスの値はエラー値であり,グラフ作成の邪魔になるので数値フィルターで除外する.ここでは「指定の値以上」でゼロを指定する.
オーバーフロー時にはデータモデルに読み込む
クエリの結果,約 230 万件のデータが読み込まれるが,EXCEL のワークシートには 100 万件以上のデータは入り切らずにオーバーフローする.
この場合,キャンセルをクリックしてクエリウィンドウへ遷移する.クエリにマウスをオーバーすると,下図のように「データモデルへの読み込み」を促されるので,そのままクリックする.
データモデルへの読み込みが完了する.
詳細エディタ
日本語での詳細エディタの内容は下記の通り.
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件の返信