データ分析の初歩から学んでいく連載の第16回(最終回)。分析に適した形にデータを入力/変換する方法を、Excelを使って手を動かしながら学んでいきましょう。スタック形式のレコードをアンスタック形式に変換する方法、CVSファイルやWebページからデータを読み込む方法などについて解説します。
この連載では、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学びます。
データの収集方法、データの取り扱い、分析の手法などについての考え方を具体例で説明するとともに、身近に使える表計算ソフト(ExcelやGoogleスプレッドシート)を利用した作成例を紹介します。
必要に応じて、Pythonのプログラムや統計ソフトRなどでの作成例にも触れることにします。
数学などの前提知識は特に問いません。肩の力を抜いてぜひとも気楽に読み進めてください。
筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。書道、絵画を経て、ピアノとバイオリンを独学で始めるも学習曲線は常に平坦。趣味の献血は、最近脈拍が多く99回で一旦中断。さらにリターンライダーを目指し、大型二輪免許を取得。1年かけてコツコツと貯金し、ようやくバイクを購入(またもや金欠)。
前回は重回帰分析により、複数の説明変数を基に目的変数の値を予測する方法を学びました。その中で、データの形式を整えることの重要性について気付いたかと思います。データの取り扱いについては、本来であれば分析に先立って考えておくべきことです。しかし、さまざまな手法を体験することを優先したので、あえて連載の最後にまとめることとしました。
今回は、実際にレコードをどのように構成するか、データをどのように並べるか(スタック形式/アンスタック形式)といったデータの表現に関する問題について見た後、ファイルに保存されているデータの形式(CSV)と文字コード(UTF-8、BOM)にまつわる問題について、幾つかの「困った」事例を取り上げ、トラブルシューティング的に見ていくこととします(図1〜3)。なお、当初の予定ではデータの取り扱いを数回に分けて解説する予定でしたが、第2回で、必要最低限のお話(構造化データと非構造化データ、レコードとフィールドなど)については済ませてあるので、これで一通りのお話が終わりとなり、全16回にわたる連載は今回が最終回となります。
今回はデータを取り扱う上での問題点が端的に分かるように、単純な例を使って見ていくこととします。
この記事は、データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第16回です。これまではケーススタディを通して、分析の手法や可視化の方法を詳しく見てきました。今回は、分析の前段階で必要となるデータの取り扱うについて見ていきます。トップページから全体の目次が参照できます。
今回は以下のようなポイントについて、分析の方法や目の付けどころを見ていきます。
では、伝票形式のデータをレコードとして表すところからスタートします。サンプルファイルの利用についての説明の後、本編に進みましょう。
本稿では、表計算ソフトを使って手を動かしながら学んでいきます。表計算ソフトMicrosoft Excel用の.xlsxファイルをダウンロードできるようにしています。デスクトップ版のExcelが手元にない場合は、Microsoftアカウントで使える無料のMicrosoft 365オンライン、もしくはGoogleアカウントで使える無料のGoogleスプレッドシート(Google Sheets)をお使いください。Microsoft 365オンラインの場合は、.xlsxファイルをOneDriveにアップロードしてから開いてください。Googleスプレッドシートの場合は、ファイルを共有して参照できるようにします。リンクを開き、メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。
図1で見たような売上伝票のデータをそのままのイメージで入力する人はさすがにいないと思います。では、レコードとしてどのように表せばいいのでしょうか。
レコードが1件分のデータであるということは、この連載の第2回で述べた通りですが、単純に1枚の伝票が1件分のデータであると考えるとうまくいきません。実は、売上伝票には1枚の用紙に複数件の取引データが記録されています。従って、その件数分、レコードを入力します。一方、日付や顧客コードなどの頭書き(かしらがき)の部分は、それぞれのレコードに共通した内容です。そこで、共通部分は各レコードの先頭に配置します(図4)。
経理ソフトなどでは伝票形式の画面でデータが入力できるようになっていますが、実際には図4のようなレコードとしてデータベースに記録されています。ただし、もっと洗練された形式になっているのが普通です(以下のフキダシの内容を参照)。手作業での入力ではなく、POS(Point Of Sales)端末などから収集されたデータでも同様です。
データベース(リレーショナルデータベース)では、より効率良く、かつ柔軟にデータを取り扱うために正規化と呼ばれる操作を行い、複数の表に分けてデータを記録します。
データベースの設計時には、まず、伝票の中の明細(繰り返し部分)を分離して図4のように表現することから始めます。このようにして繰り返しをなくした表現を第1正規形と呼びます。
さらに、顧客コードと商品コードだけ入力しておけば、必要に応じて顧客一覧と商品一覧から顧客名や商品名、単価を引いてくれば元のデータが再現できます。この場合の顧客コードや商品コードのように元のレコードを一意に決めるのに必要なキーを主キーと呼び、主キーとそれに従属する顧客名や商品名、単価の表を分離した形の表現を第2正規形と呼びます。
データベースの設計では第6正規形まで定義されていますが、Excelでのデータの取り扱いからは話が外れるのでこれ以上は触れません。詳細については、こちらの記事などをご参照ください。
データ分析の出発点として、処理しやすい形式でデータを記録することはとても重要です。図4のような形式で記録しておけば、特定の日付のレコードを取り出したり、顧客や商品ごとに売上金額を集計したりすることが簡単にできるというわけです。折れ線グラフを用いて売り上げの推移を可視化したり、パレート図を用いて商品の売上金額についてABC分析を行ったりすることも簡単にできます。
図4を見ればレコードの構成が分かると思いますが、実用に際しては、入力を容易にするとともに、エラーデータが紛れ込まないようにする工夫が必要になります。そのためには入力規則の機能が便利です。顧客コードや商品コードをリストから選択できるようにしておけば、いちいちキーボードからコードを入力しなくても済みますし、あらかじめ登録された値以外を受け付けないようにできます。
操作の手順は図5の後に箇条書きにしてあります。サンプルファイルをこちらからダウンロードし、[売上データ]ワークシートを開いて試してみてください。Googleスプレッドシートのサンプルはこちらから開くことができます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。以下の操作については、動画も用意してあります。入力規則の設定とデータの入力方法を丁寧に追いかけたい方はぜひご視聴ください。
入力規則を設定するための手順は以下の通りです。
セルE2〜E5についても同様に操作し、[商品一覧]ワークシートのセルA4〜A9の値が選択できるようにしておきましょう。顧客名、商品名、単価については、以下のようにXLOOKUP関数を入力して値が自動的に表示されるようにしてあります。
試しにセルC2に「00010」と入力してみてください。セルD2に「株式会社ローグ・クリーン」と表示されます。
グラフによる可視化を行う場合や分析のためのツールを利用する場合には、決められた形式のデータを用意しておく必要があります。そのためスタック形式とアンスタック形式の変換が必要になることもよくあります。
スタック形式のデータとは、1つの観測データを1レコード(1行)に入力したものです。一方のアンスタック形式のデータでは、1レコードが複数の観測データからなっています。「スタック」とは「積み重ねる」といった意味です。
最初に見た1人当たりGDPの例はデータ量が多く、ちょっと見づらいので、簡単な例で見てみましょう(図6)。スタック形式の場合、「受験番号1の人が英語の試験を受けたら98点だった」という1つの観測データが1レコードになっています。英語の試験と数学の試験は同時には行われないので、「受験番号1の人が数学の試験を受けたら88点だった」というのは別のレコードになっています。一方、アンスタック形式の例では、「受験番号1の人が英語の試験を受けたら98点で、数学の試験を受けたら88点だった」というように、複数の観測データが1レコードになっています(つまり、繰り返しがあるということですね)。
スタック形式のことをロングフォーマット、アンスタック形式のことをワイドフォーマットと呼ぶこともあります。
スタック形式のデータをアンスタック形式に変換する方法としては、WRAPCOLS関数を利用する方法とピボットテーブルを使う方法が簡単です。ここでは関数を使ってやってみましょう。ただし、WRAPCOLS関数はExcel 2019以前では使えません。ピボットテーブルを利用する方法については、後のコラムにまとめておきます。
WRAPCOLS関数は指定した個数で折り返して列を作る関数です。例えば、10個のデータを5個ごとに折り返し、5行2列にすることができます。15個のデータを5個ごとに折り返せば5行3列になります。図6に示したスタック形式のデータであれば、8個ごとに折り返せば、アンスタック形式になりますね。
では、サンプルファイルをこちらからダウンロードし、[成績(スタック形式)]ワークシートを開いて試してみてください。Googleスプレッドシートのサンプルはこちらから開くことができます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。以降の関数を使ったスタック形式/アンスタック形式相互の変換方法については、動画も用意してあります。手順を一つ一つ丁寧に追いかけたい方はぜひご視聴ください。
図7に示した操作の手順は以下の通りです。
番号や見出しは手作業で入力しても構いませんが、関数を使って表示することもできます。サンプルファイルには以下のような関数が入力されているので確認してみてください。
最初に見た1人当たりGDPの例も全く同じ方法でできます。1つの国/地域のデータが10件あるので、10個ずつで折り返せばアンスタック形式にできます。後は折れ線グラフを作成するだけです。サンプルファイルに含まれる[1人当たりGDP(USドル作成例)]ワークシートをご参照ください。
実は、出典のIMFのデータは最初からアンスタック形式になっています。ここでは、わざわざスタック形式に変換したものを掲載しました。
ピボットテーブルを使ってスタック形式のデータをアンスタック形式に変換する場合は、図8のように操作します。Excelでの手順は図の中に示した通りです。Googleスプレッドシートでの手順は図の後に箇条書きで記しておきます。[成績(スタック形式ピボットテーブル用)]ワークシートを開いて、試してみてください(上で見たものと同じデータです)。
Googleスプレッドシートでの手順は以下の通りです。
Googleスプレッドシートでの操作手順
これで、空のピボットテーブルが作成されます。画面の右側にピボットテーブルエディタが表示されるので、以下のように操作しましょう。
結果をピボットテーブルとしてではなく、単なるデータとして利用したい場合には、他の場所にコピーしておくといいでしょう。図8の例であれば、セルE4〜G12をコピーし、他の場所に貼り付けておきます。
続いて、アンスタック形式のデータをスタック形式に変換する方法を見ておきましょう。こちらは、ピボットテーブルではできません。TOCOL関数を使って配列を1列のデータに変換します。TOCOL関数もExcel 2019以前では使えません。[成績(アンスタック形式)]ワークシートを開いて試してみてください。
図9に示した操作の手順は以下の通りです。
E列とF列については手作業で入力しても構いませんが、以下のように関数を使って入力するのが効率的です。サンプルファイルには以下のような関数が入力されているので確認してみてください。
Excelの場合
セルE4とセルE12には、数式を配列数式として入力します。そうすれば、あらかじめ選択した範囲に同じ値を表示することができます。同じ値を繰り返して表示するにはEXPAND関数などを使う方法もありますが、配列数式として入力した方が手間がかからないかと思います。
Googleスプレッドシートの場合
F列については、ARRAYFORMULA関数ではうまくいかないので、以下の方法を使います。Excelでも同じ方法が使えます。
GoogleスプレッドシートとExcelで利用可能な(やや高度な)方法
MAKEARRAY関数はLAMBDA関数での計算により、指定した行数、列数に配列を作成するための関数です。最初の「16,1」は16行1列の配列を作るという意味です。LAMBDA関数に指定したrowとcolは行位置と列位置を表す変数で、自分で好きな変数名を付けることができます。その後に指定した数式がrowやcolを使った計算です。例えば、rowの値が9未満のときは「IF(row<9,B3,C3)」はB3の値(「英語」)を返し、rowの値が9以上のときにはC3の値(「数学」)を返すというわけです。
これまで、繰り返しのレベルが1つの例を見てきました。さらにレベルが多くなる場合もあります。具体的には図10のような例です。英語と数学の試験が2回行われていて、第1回の成績と第2回の成績が記録されている場合ですね。このような場合でも考え方は全く同じです。
サンプルファイルの[成績(2回)]ワークシートに図10の例と、ピボットテーブルを使って変換した例、さらに=TOCOL(G5:J12,0,TRUE)と入力してアンスタック形式からスタック形式に変換した例も含めてあります。[成績(2回)]ワークシートは作成例の最後(ワークシートの右端のタブ)にあります。なお、見出しについては全て関数を使って作成していますが、この程度なら手作業で入力/コピーして作成しても構いません。
Excelでは、.xlsや.xlsxなどのExcel独自のファイルだけでなく、CSVファイルなども読み込めます。オープンデータにはCSVファイルの形式で提供されているものも数多くあります。CSVファイルは項目がカンマで区切られた単なるテキストファイルですが、文字コードによってはうまく読み込めない(文字化けする)場合があります。以下に、よく使われる文字コードと、Excelで読み込んだ場合の状態を記しておきます。
現在では、インターネットで標準的に使われているUTF-8の形式でCSVファイルに記録されていることが多いようですが、BOM(バイトオーダーマーク)と呼ばれるコードがファイルの先頭に付いているかいないかによって結果が異なります。Excelでは、BOM付きであるという前提でデータが読み込まれるので、BOMがないと図3のように文字化けします(図11に再掲)。
Excelでは、上に掲載した文字コード以外のファイルを読み込むと、ほとんどの場合文字化けします。一方、Googleスプレッドシートでは、上に掲載したものを含めて、ほとんどの場合、正しく読み込めます。
BOMは、Unicodeと呼ばれる文字コードで、多バイト文字の下位バイトを上位アドレスに配置する(ビッグエンディアン)か、下位バイトを下位アドレスに配置する(リトルエンディアン)かを区別するなどの役割を持つコードです。UTF-8はUnicodeの一種ですが、特にBOMは必要とされていません。しかし、アプリケーションの仕様などによって、BOMが付けられる場合もあります。UTF-8の場合、BOMは16進数のEF BB BFとなっています。
UTF-8(BOMなし)のファイルをUTF-8(BOM付き)に変換するには、Windowsの場合はメモ帳で保存し直す方法が簡単です(図12)。UTF-8(BOMなし)のサンプルファイルをこちらからダウンロードして試してみてください。GoogleスプレッドシートではUTF-8(BOMなし)のファイルを正しく開けるので、サンプルファイルは用意していません。
以下の操作と、次の項の区切り位置の変更の操作については、動画も用意してあります。手順を一つ一つ丁寧に追いかけたい方はぜひご視聴ください。
macOSではmiやSublime Textなどのテキストエディタを使って保存し直すこともできますが、いずれも標準のアプリケーションではないので、それらのアプリケーションがない場合は、ターミナルから図13のようにコマンドを入力するのが手っ取り早い方法です。
CSVファイルは文字通り項目がカンマで区切られたファイルですが、場合によってはスペースやタブで区切られたテキストファイルになっていることもあります。そのような場合、行全体が1つのセルに読み込まれることがあります。正しく読み込むには、[データ]タブの[区切り位置]ボタンを使って、フィールド(項目)の区切りを指定します(図14)。
サンプルファイルをこちらからダウンロードして試してみてください。Googleスプレッドシートを使いたい場合は、サンプルファイルをGoogleドライブにアップロードしてから、後述の手順に従って開いてください。
Excelでの手順は図14に示した通りです。Googleスプレッドシートの場合は以下のように操作します。
Webページなどで公開されているデータのうち、ExcelのファイルやCSVファイルとしてダウンロードできるものは、ダウンロードしたものをそのまま開くことができます。しかし、Webページ上に表示されている表をExcelに取り込みたい場合もあると思います。もちろん、いずれの場合も利用に関してはそれぞれのWebサイトでの利用規約を守る必要があります。
Webブラウザーに表示された表を選択してコピーし、Excelのワークシートに貼り付けるという方法は、あまりスマートとは言えませんね(表が崩れたりすることもよくあります)。Excelデスクトップ版の[データ]タブにはさまざまなデータを読み込むためのボタンがあるので、それを利用しましょう。なお、GoogleスプレッドシートやMicrosofot 365オンライン版には全く同じ機能はありません(ただし、GoogleスプレッドシートではIMPORTHTML関数でWebページのデータを読み込むことができます。詳細についてはGoogleスプレッドシートのヘルプをご参照ください)。
図15は気象庁で提供されている毎日の気象データ(URL:https://www.data.jma.go.jp/stats/data/mdrr/synopday/data1s.html)ですが、これをExcelに取り込んでみます。
操作は簡単です。図15のように[データ]タブを開き、[Webから]ボタンをクリックします。URLを入力すれば、Webページに含まれる表が一覧表示されるので、その中から目的の表を選択するだけです。
図16の方法は、Webページの表だけでなく、インターネット経由でJSONファイルやXMLファイルを読み込むのにも使えます。ただし、JSONファイルやXMLファイルのデータは階層的な構造になっているので、Power Queryの画面で階層をたどってデータを選択する必要があります。Power Queryによるこれらのデータの利用については、連載のテーマから話が逸(そ)れてしまうので、こちらの公式記事などをご参照ください。
今回は、データ分析以前に考慮すべきデータの形式やファイルの形式について、幾つかの例をトラブルシューティング的に紹介しました。
実際のデータ分析に当たっては、行や列の取捨選択、並べ替えなども必要になりますが、いずれもExcelの基本的な機能で対応できます。元のデータがイレギュラーな形式であった場合に形式を整えるには、手作業での対応も必要になるかもしれませんが、Excelの機能や関数を利用すればある程度の自動化もできるかと思います。データを適切な形式にできれば、この連載で見てきた分析のための機能やツールをスムーズに適用できるようになります。
というわけで、データ分析の記述統計編は今回が最終回です。続いて、確率分布編と推測統計編を準備していますので、どうぞお楽しみに!
関数の利用例については、この記事の中で紹介している通りです。ここでは、今回取り上げた関数の基本的な機能と引数の指定方法だけを示しておきます。
WRAPCOLS(ベクトル, 個数, [埋め込む値])
折り返す個数を3とし、埋め込む値を既定値とした場合、以下のようになる。
なお、この関数と似た機能を持つWRAPROWS関数では、行または列のデータを指定した個数で折り返して複数の行として返す。
WRAPROWS関数は、Excel 2019以前では使えない。
TOCOL(配列, [無視する値], [方向])
方向の指定により、以下のような結果になる。なお、[無視する値]に1を指定すると、7行目の「0」は表示されない。
なお、この関数と似た機能を持つTOROW関数では、配列を1行にする。
TOCOL関数は、Excel 2019以前では使えない。
MAKEARRAY(行数, 列数, LAMBDA(行を表す変数, 列を表す変数, 式)
LAMBDA関数は、変数とその計算の方法を定義するための関数(後述)。例えば、「=LAMBDA(x, y, x+y)(1, 2)」とすると、xに1、yに2が代入され、x+yの値が返される。MAKEARRAY関数の中に指定した場合には、配列内の行位置と列位置がLAMBDA関数の行を表す変数と列を表す変数に渡される。
LAMBDA(引数1, 引数2, ..., 式)
例えば、「=LAMBDA(x, y, x+y)」であれば、最初のxに第1引数の値が渡され、yに第2引数の値が渡される。最後のx+yの値が答えとして返される。従って、セルに「=LAMBDA(x, y, x+y)(A1,A2)」と入力すると、セルA1の値がxに渡され、セルA2の値がyに渡され、x+yの値つまりA1とA2の和が返される。さらに、名前機能を利用して「=LAMBDA(x, y, x+y)」にmyaddといった名前を付けておれば、「=myadd(A1, A2)」でセルA1とセルA2の和が求められる。このようにして関数を自作できる。
Copyright© Digital Advantage Corp. All Rights Reserved.