データ分析に適したデータ形式に変換する方法と、表データを読み込む方法やさしいデータ分析

データ分析の初歩から学んでいく連載の第16回(最終回)。分析に適した形にデータを入力/変換する方法を、Excelを使って手を動かしながら学んでいきましょう。スタック形式のレコードをアンスタック形式に変換する方法、CVSファイルやWebページからデータを読み込む方法などについて解説します。

» 2024年03月28日 05時00分 公開
[羽山博]
「やさしいデータ分析」のインデックス

連載目次

連載:

『社会人1年生から学ぶ、やさしいデータ分析』

社会人1年生から学ぶ、やさしいデータ分析

 この連載では、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学びます。
 データの収集方法、データの取り扱い、分析の手法などについての考え方を具体例で説明するとともに、身近に使える表計算ソフト(ExcelやGoogleスプレッドシート)を利用した作成例を紹介します。
 必要に応じて、Pythonのプログラムや統計ソフトRなどでの作成例にも触れることにします。
 数学などの前提知識は特に問いません。肩の力を抜いてぜひとも気楽に読み進めてください。

羽山博 羽山博

筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。書道、絵画を経て、ピアノとバイオリンを独学で始めるも学習曲線は常に平坦。趣味の献血は、最近脈拍が多く99回で一旦中断。さらにリターンライダーを目指し、大型二輪免許を取得。1年かけてコツコツと貯金し、ようやくバイクを購入(またもや金欠)。


 前回は重回帰分析により、複数の説明変数を基に目的変数の値を予測する方法を学びました。その中で、データの形式を整えることの重要性について気付いたかと思います。データの取り扱いについては、本来であれば分析に先立って考えておくべきことです。しかし、さまざまな手法を体験することを優先したので、あえて連載の最後にまとめることとしました。

 今回は、実際にレコードをどのように構成するか、データをどのように並べるか(スタック形式/アンスタック形式)といったデータの表現に関する問題について見た後、ファイルに保存されているデータの形式(CSV)と文字コード(UTF-8、BOM)にまつわる問題について、幾つかの「困った」事例を取り上げ、トラブルシューティング的に見ていくこととします(図1〜3)。なお、当初の予定ではデータの取り扱いを数回に分けて解説する予定でしたが、第2回で、必要最低限のお話(構造化データと非構造化データ、レコードとフィールドなど)については済ませてあるので、これで一通りのお話が終わりとなり、全16回にわたる連載は今回が最終回となります。

データ分析の困った 図1 データの入力でありがちな困った例
項目が単純に並んでいるデータであればレコードにどのようなフィールドを配置すればいいのか簡単に分かるが、伝票形式のデータのように、明細に繰り返しがあるデータをどのようにレコードとして表せばいいのか悩む場合も多い。レコードやフィールドについては、単に言葉の意味だけでなく、実践的な理解が必要。

データ分析の困った 図2 データの可視化や分析の前にありがちな困った例
オープンデータは図の左上に示したようなスタック形式で提供されているものも多い。うまく可視化できない場合は、アンスタック形式に変換したり、さらにグラフで取り扱うのに適した形式に変換する必要がある。まずは、スタック形式とアンスタック形式の違いを理解しよう。なお、このデータはIMFのオープンデータを加工したもの。

データ分析の困った 図3 ファイルや文字コードに関してありがちな困った例
オープンデータはCSVファイルとして提供されていることもあるが、Excelでは、文字コードがUTF-8(BOMなし)だと日本語文字が文字化けする場合がある。ファイルの形式や文字コードについても理解が必要。なお、CSVComma Separeated Values(カンマ区切りの値)の略。

 今回はデータを取り扱う上での問題点が端的に分かるように、単純な例を使って見ていくこととします。


 この記事は、データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第16回です。これまではケーススタディを通して、分析の手法や可視化の方法を詳しく見てきました。今回は、分析の前段階で必要となるデータの取り扱うについて見ていきます。トップページから全体の目次が参照できます。

この記事で学べること

 今回は以下のようなポイントについて、分析の方法や目の付けどころを見ていきます。

  • 実際のデータをレコードとして表す方法
  • スタック形式とアンスタック形式の変換
  • CSVファイルからの読み込みと文字コードの取り扱い

 では、伝票形式のデータをレコードとして表すところからスタートします。サンプルファイルの利用についての説明の後、本編に進みましょう。

サンプルファイルの利用について

 本稿では、表計算ソフトを使って手を動かしながら学んでいきます。表計算ソフト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 売上伝票の入力例
伝票の明細1行が1レコードになる。A〜D列には各レコードに共通な内容(伝票の頭書きの部分)をそのまま入力する。E〜I列に明細のデータを入力する。顧客名、商品名、単価についてはVLOOKUP関数やXLOOKUP関数で一覧表を検索して表示すればいいので入力の必要はない。また、金額も計算で求められるので入力しなくてもよい。下にある合計(伝票の脚書きの部分)も計算して求めればよい。

 経理ソフトなどでは伝票形式の画面でデータが入力できるようになっていますが、実際には図4のようなレコードとしてデータベースに記録されています。ただし、もっと洗練された形式になっているのが普通です(以下のフキダシの内容を参照)。手作業での入力ではなく、POS(Point Of Sales)端末などから収集されたデータでも同様です。


AI博士

 データベース(リレーショナルデータベース)では、より効率良く、かつ柔軟にデータを取り扱うために正規化と呼ばれる操作を行い、複数の表に分けてデータを記録します。

 データベースの設計時には、まず、伝票の中の明細(繰り返し部分)を分離して図4のように表現することから始めます。このようにして繰り返しをなくした表現を第1正規形と呼びます。

 さらに、顧客コードと商品コードだけ入力しておけば、必要に応じて顧客一覧と商品一覧から顧客名や商品名、単価を引いてくれば元のデータが再現できます。この場合の顧客コードや商品コードのように元のレコードを一意に決めるのに必要なキーを主キーと呼び、主キーとそれに従属する顧客名や商品名、単価の表を分離した形の表現を第2正規形と呼びます。

 データベースの設計では第6正規形まで定義されていますが、Excelでのデータの取り扱いからは話が外れるのでこれ以上は触れません。詳細については、こちらの記事などをご参照ください。


 データ分析の出発点として、処理しやすい形式でデータを記録することはとても重要です。図4のような形式で記録しておけば、特定の日付のレコードを取り出したり、顧客や商品ごとに売上金額を集計したりすることが簡単にできるというわけです。折れ線グラフを用いて売り上げの推移を可視化したり、パレート図を用いて商品の売上金額についてABC分析を行ったりすることも簡単にできます。

入力を容易にし、かつ、エラーデータが入らないようにする仕組み

 図4を見ればレコードの構成が分かると思いますが、実用に際しては、入力を容易にするとともに、エラーデータが紛れ込まないようにする工夫が必要になります。そのためには入力規則の機能が便利です。顧客コードや商品コードをリストから選択できるようにしておけば、いちいちキーボードからコードを入力しなくても済みますし、あらかじめ登録された値以外を受け付けないようにできます。

 操作の手順は図5の後に箇条書きにしてあります。サンプルファイルをこちらからダウンロードし、[売上データ]ワークシートを開いて試してみてください。Googleスプレッドシートのサンプルはこちらから開くことができます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。以下の操作については、動画も用意してあります。入力規則の設定とデータの入力方法を丁寧に追いかけたい方はぜひご視聴ください。

動画1 Excelで入力規則を設定してデータを入力するには


入力を容易にする 図5 入力規則を利用し、入力を容易にするとともにエラーデータの混入を防ぐ
顧客コードや商品コードを全て記憶していて、間違いなく入力するのはきわめて難しい。そこで、入力規則を設定し、あらかじめ決められたコードの一覧から選択できるようにしておけば、効率も良くなるし、入力ミスも少なくなる。なお、標準の数値であれば先頭の0は表示されないが、ここでは先頭の0が表示されるように表示形式を変更してある。

 入力規則を設定するための手順は以下の通りです。

入力規則の設定(Excelでの操作手順)

  • セルC2C5を選択する
  • [データ]タブの[データの入力規則]ボタンをクリックする
  • [データの入力規則]ダイアログボックスの[設定]タブで[入力値の種類]から[リスト]を選択する
  • [元の値]ボックスをクリックし、[顧客一覧]ワークシートのセルA4A7を選択する(=顧客一覧!$A$4:$A$7
  • [OK]ボタンをクリックする

入力規則の設定(Googleスプレッドシートでの操作手順)

  • セルC2C5を選択する
  • メニューバーから[データ]−[データの入力規則]を選択する
  • [データの入力規則]作業ウインドウで[ルールを追加]ボタンをクリックする
  • [条件]のリストから[プルダウン(範囲内)]を選択する(これで散布図が作成される)
  • その下の[データ範囲を選択]ボタン(田の形のボタン)をクリックする
  • [データ範囲の選択]ダイアログボックスが表示されたら、[顧客一覧]ワークシートのセルA4A7を選択する
  • [OK]ボタンをクリックする
  • [データの入力規則]作業ウインドウで[完了]ボタンをクリックする

 セルE2E5についても同様に操作し、[商品一覧]ワークシートのセルA4A9の値が選択できるようにしておきましょう。顧客名、商品名、単価については、以下のようにXLOOKUP関数を入力して値が自動的に表示されるようにしてあります。

  • セルC2に「=XLOOKUP(C2:C5,顧客一覧!A4:A7,顧客一覧!B4:B7,"",0,1)
  • セルE2に「=XLOOKUP(E2:E5,商品一覧!A4:A9,商品一覧!B4:B9,"",0,1)
  • セルF2に「=XLOOKUP(E2:E5,商品一覧!A4:A9,商品一覧!C4:C9,"",0,1)

 試しにセルC2に「00010」と入力してみてください。セルD2に「株式会社ローグ・クリーン」と表示されます。

スタック形式とアンスタック形式の相互変換

 グラフによる可視化を行う場合や分析のためのツールを利用する場合には、決められた形式のデータを用意しておく必要があります。そのためスタック形式とアンスタック形式の変換が必要になることもよくあります。

 スタック形式のデータとは、1つの観測データを1レコード(1行)に入力したものです。一方のアンスタック形式のデータでは、1レコードが複数の観測データからなっています。「スタック」とは「積み重ねる」といった意味です。

 最初に見た1人当たりGDPの例はデータ量が多く、ちょっと見づらいので、簡単な例で見てみましょう(図6)。スタック形式の場合、「受験番号1の人が英語の試験を受けたら98点だった」という1つの観測データが1レコードになっています。英語の試験と数学の試験は同時には行われないので、「受験番号1の人が数学の試験を受けたら88点だった」というのは別のレコードになっています。一方、アンスタック形式の例では、「受験番号1の人が英語の試験を受けたら98点で、数学の試験を受けたら88点だった」というように、複数の観測データが1レコードになっています(つまり、繰り返しがあるということですね)。


AI博士

 スタック形式のことをロングフォーマット、アンスタック形式のことをワイドフォーマットと呼ぶこともあります。


スタック形式とアンスタック形式 図6 スタック形式とアンスタック形式の違い
スタック形式では1つの観測データが1レコードとして記録される。アンスタック形式では複数の観測データが1レコードとして記録される。可視化や分析のためのツールでは、どちらの形式でデータを準備しておくかが決められているので、相互に変換する方法を知っておく必要がある。

スタック形式からアンスタック形式に変換する

 スタック形式のデータをアンスタック形式に変換する方法としては、WRAPCOLS関数を利用する方法とピボットテーブルを使う方法が簡単です。ここでは関数を使ってやってみましょう。ただし、WRAPCOLS関数はExcel 2019以前では使えません。ピボットテーブルを利用する方法については、後のコラムにまとめておきます。

 WRAPCOLS関数は指定した個数で折り返して列を作る関数です。例えば、10個のデータを5個ごとに折り返し、5行2列にすることができます。15個のデータを5個ごとに折り返せば5行3列になります。図6に示したスタック形式のデータであれば、8個ごとに折り返せば、アンスタック形式になりますね。

 では、サンプルファイルをこちらからダウンロードし、[成績(スタック形式)]ワークシートを開いて試してみてください。Googleスプレッドシートのサンプルはこちらから開くことができます。メニューから[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください。以降の関数を使ったスタック形式/アンスタック形式相互の変換方法については、動画も用意してあります。手順を一つ一つ丁寧に追いかけたい方はぜひご視聴ください。

動画2 Excelで関数を使ってスタック形式/アンスタック形式を相互に変換するには


スタック形式からアンスタック形式に変換する 図7 WRAPCOLS関数を利用してスタック形式をアンスタック形式に変換する
WRAPCOLS関数の引数には、1列または1行に並んだデータの範囲としてC4:C19を指定し、折り返しの個数として、セルE4E12の数値の数(=8)を指定する。16個のデータが8行2列の形に変換されて返される。

 図7に示した操作の手順は以下の通りです。

  • セルF4=WRAPCOLS(C4:C19,COUNT(E4:E11))と入力する

 番号や見出しは手作業で入力しても構いませんが、関数を使って表示することもできます。サンプルファイルには以下のような関数が入力されているので確認してみてください。

  • セルF3=TRANSPOSE(UNIQUE(B4:B19))
  • セルE4=UNIQUE(A4:A19)

 最初に見た1人当たりGDPの例も全く同じ方法でできます。1つの国/地域のデータが10件あるので、10個ずつで折り返せばアンスタック形式にできます。後は折れ線グラフを作成するだけです。サンプルファイルに含まれる[1人当たりGDP(USドル作成例)]ワークシートをご参照ください。


AI博士

 実は、出典のIMFのデータは最初からアンスタック形式になっています。ここでは、わざわざスタック形式に変換したものを掲載しました。


コラム ピボットテーブルを使ってアンスタック形式に変換する

 ピボットテーブルを使ってスタック形式のデータをアンスタック形式に変換する場合は、図8のように操作します。Excelでの手順は図の中に示した通りです。Googleスプレッドシートでの手順は図の後に箇条書きで記しておきます。[成績(スタック形式ピボットテーブル用)]ワークシートを開いて、試してみてください(上で見たものと同じデータです)。

スタック形式からアンスタック形式に変換する 図8 ピボットテーブルを利用してスタック形式をアンスタック形式に変換する
ここでは、元のデータと結果を同時に表示するためにピボットテーブルを既存のワークシートに作成している。各フィールドは、受験者の番号を[行]に、科目(繰り返しのある項目)を[列]に、成績を[Σ値]に指定する。結果には総計が表示されているが、不要であれば「総計」の部分を右クリックして[総計の削除]を選択すればよい。セルE4の「行ラベル」を「番号」に書きかえれば、図6のアンスタック形式のデータと同じ形になる。

 Googleスプレッドシートでの手順は以下の通りです。

Googleスプレッドシートでの操作手順

  • セルA3C19のいずれかのセルをクリックしておく
  • メニューバーから[挿入]−[ピボットテーブル]を選択する
  • [ピボットテーブルの作成]ダイアログボックスの[データ範囲]が「成績(スタック形式)!A3:C19」になっていることを確認する
  • [挿入先]の下の[既存のワークシート]をクリックしてオンにする
  • [データ範囲を選択]ボタン(田のマークのボタン)をクリックして、セルE3をクリックし、[OK]をクリックする
  • [作成]ボタンをクリックする

 これで、空のピボットテーブルが作成されます。画面の右側にピボットテーブルエディタが表示されるので、以下のように操作しましょう。

  • 右側に表示されている項目一覧の[番号]を、左側の[行]の下にドラッグする
  • 右側に表示されている項目一覧の[科目]を、左側の[列]の下にドラッグする
  • 右側に表示されている項目一覧の[成績]を、左側の[値]の下にドラッグする

 結果をピボットテーブルとしてではなく、単なるデータとして利用したい場合には、他の場所にコピーしておくといいでしょう。図8の例であれば、セルE4G12をコピーし、他の場所に貼り付けておきます。


アンスタック形式からスタック形式に変換する

 続いて、アンスタック形式のデータをスタック形式に変換する方法を見ておきましょう。こちらは、ピボットテーブルではできません。TOCOL関数を使って配列を1列のデータに変換します。TOCOL関数もExcel 2019以前では使えません。[成績(アンスタック形式)]ワークシートを開いて試してみてください。

アンスタック形式からスタック形式に変換する 図9 TOCOL関数を利用してスタック形式をアンスタック形式に変換する
TOCOLS関数の引数には、配列としてB4:C11を指定する。第2引数には無視する値を指定する。0を指定すると全ての値を対象とする(指定できる値については最後に掲載した関数の形式を参照)。最後の引数は配列から縦方向にデータを取り出して列にするか、横方向にデータを取り出して列にするかを指定する。TRUEを指定すると縦方向にデータを取り出すので、この例であれば、セルB4B11の値を取り出し、次にセルC4C11の値をつないで1列とする。一方、FALSEを指定すると横方向にデータを取り出すので、セルB4C4の値を取り出し、次にセルB5C5の値を、その次にセルB6C6の値を……という順でセルB11C11の値までをつないでいき、1列とする。

 図9に示した操作の手順は以下の通りです。

  • セルG4=TOCOL(B4:C11,0,TRUE)と入力する

 E列とF列については手作業で入力しても構いませんが、以下のように関数を使って入力するのが効率的です。サンプルファイルには以下のような関数が入力されているので確認してみてください。

Excelの場合

  • セルE4=A4:A11
  • セルE12=A4:A11
  • セルF4: あらかじめセルF4F11を選択しておき=B3と入力し、入力終了時に[Ctrl]+[Shift]+[Enter]キーを押す
  • セルF12: あらかじめセルF12F19を選択しておき=B4と入力し、入力終了時に[Ctrl]+[Shift]+[Enter]キーを押す

 セルE4とセルE12には、数式を配列数式として入力します。そうすれば、あらかじめ選択した範囲に同じ値を表示することができます。同じ値を繰り返して表示するにはEXPAND関数などを使う方法もありますが、配列数式として入力した方が手間がかからないかと思います。

Googleスプレッドシートの場合

  • セルE4=ARRAYFORMULA(A4:A11)
  • セルE12=ARRAYFORMULA(A4:A11)

F列については、ARRAYFORMULA関数ではうまくいかないので、以下の方法を使います。Excelでも同じ方法が使えます。

GoogleスプレッドシートとExcelで利用可能な(やや高度な)方法

  • セルF4=MAKEARRAY(16,1,LAMBDA(row,col,IF(row<9,B3,C3)))

 MAKEARRAY関数はLAMBDA関数での計算により、指定した行数、列数に配列を作成するための関数です。最初の「16,1」は16行1列の配列を作るという意味です。LAMBDA関数に指定したrowcolは行位置と列位置を表す変数で、自分で好きな変数名を付けることができます。その後に指定した数式がrowcolを使った計算です。例えば、rowの値が9未満のときは「IF(row<9,B3,C3)」はB3の値(「英語」)を返し、rowの値が9以上のときにはC3の値(「数学」)を返すというわけです。

コラム 項目の繰り返しレベルが増えた場合の取り扱い

 これまで、繰り返しのレベルが1つの例を見てきました。さらにレベルが多くなる場合もあります。具体的には図10のような例です。英語と数学の試験が2回行われていて、第1回の成績と第2回の成績が記録されている場合ですね。このような場合でも考え方は全く同じです。

繰り返しが複数のレベルになっている場合 図10 アンスタック形式に変換する(繰り返しが複数のレベルの場合)
試験の回数が繰り返しになっており、さらに科目が繰り返しになっている。WRAPCOLS関数には成績の範囲であるD4:D35と、折り返し数を指定する。折り返し数はCOUNT関数で求めているが、目視で「8」と指定してもよい。

 サンプルファイルの[成績(2回)]ワークシートに図10の例と、ピボットテーブルを使って変換した例、さらに=TOCOL(G5:J12,0,TRUE)と入力してアンスタック形式からスタック形式に変換した例も含めてあります。[成績(2回)]ワークシートは作成例の最後(ワークシートの右端のタブ)にあります。なお、見出しについては全て関数を使って作成していますが、この程度なら手作業で入力/コピーして作成しても構いません。


CSVファイルの文字化けに対処する

 Excelでは、.xlsや.xlsxなどのExcel独自のファイルだけでなく、CSVファイルなども読み込めます。オープンデータにはCSVファイルの形式で提供されているものも数多くあります。CSVファイルは項目がカンマで区切られた単なるテキストファイルですが、文字コードによってはうまく読み込めない(文字化けする)場合があります。以下に、よく使われる文字コードと、Excelで読み込んだ場合の状態を記しておきます。

  • シフトJIS: 文字化けしない。Windows 10 バージョン1903以前のメモ帳での標準的な形式(ANSIと表記されている)
  • UTF-8(BOMなし): ファイルの先頭に日本語文字が含まれていると文字化けする。Windowsのメモ帳での標準的な形式
  • UTF-8(BOM付き): 正しく読み込める

 現在では、インターネットで標準的に使われているUTF-8の形式でCSVファイルに記録されていることが多いようですが、BOM(バイトオーダーマーク)と呼ばれるコードがファイルの先頭に付いているかいないかによって結果が異なります。Excelでは、BOM付きであるという前提でデータが読み込まれるので、BOMがないと図3のように文字化けします(図11に再掲)。

データ分析の困った 図11 ファイルや文字コードに関してありがちな困った例(図3を再掲)
原稿執筆時点では、文字コードがUTF-8(BOMなし)だと、ファイルの先頭に日本語文字があるCSVファイルをExcelで読み込んだ場合に文字化けしてしまう。あらかじめBOM付きに変換しておく必要がある。

 Excelでは、上に掲載した文字コード以外のファイルを読み込むと、ほとんどの場合文字化けします。一方、Googleスプレッドシートでは、上に掲載したものを含めて、ほとんどの場合、正しく読み込めます。


AI博士

 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なし)のファイルを正しく開けるので、サンプルファイルは用意していません。

 以下の操作と、次の項の区切り位置の変更の操作については、動画も用意してあります。手順を一つ一つ丁寧に追いかけたい方はぜひご視聴ください。

動画3 ExcelでCSVファイル(カンマ/タブ/スペース区切りを含む)を読み込むには


UTF-8(BOM付き)で保存する 図12 メモ帳を使ってファイルをUTF-8(BOM付き)で保存する
サンプルファイルを開くには、メモ帳を起動して、エクスプローラーからメモ帳のウインドウにファイルをドラッグするのが手っ取り早い。ファイルが読み込めたら、メニューバーから[ファイル]-[名前を付けて保存]を選択し、[名前を付けて保存]ダイアログボックスの[エンコード]リストから[UTF-8(BOM付き)]を選択して保存する。保存したファイルをExcelで開けば正しく表示される。

 macOSではmiやSublime Textなどのテキストエディタを使って保存し直すこともできますが、いずれも標準のアプリケーションではないので、それらのアプリケーションがない場合は、ターミナルから図13のようにコマンドを入力するのが手っ取り早い方法です。

UTF-8(BOM付き)で保存する 図13 ターミナルのコマンド使ってファイルをUTF-8(BOM付き)で保存する
「%」より左はプロンプト(入力する位置などを示す文字列)なので「%」の右からコマンドを入力する。まず、cdコマンドで、UTF-8(BOMなし)のファイルがある場所を作業フォルダーとする。次に、echoコマンドを使って、BOMだけが記録されたファイル(bom.txt)を作成する。echoコマンドは文字列をそのまま表示するコマンド。-nは、最後に改行文字を付加しないという指定。\xは16進数で文字コードを指定するという意味(\は、macOSでは[option]+[¥]で入力する)。「>」は出力結果をファイルに保存するための指定。最後に、catコマンドを使ってファイルを連結する。bom.txtとBOMなしの元のファイル(ここでは16c_utf8.csv)を指定し、連結した結果を「>」を使ってファイル(16c_utf8_bom.csv)に保存する。BOMが付加された16c_utf8_bom.csvをExcelで開けば正しく表示される。

項目がうまく区切られない場合の対処法

 CSVファイルは文字通り項目がカンマで区切られたファイルですが、場合によってはスペースやタブで区切られたテキストファイルになっていることもあります。そのような場合、行全体が1つのセルに読み込まれることがあります。正しく読み込むには、[データ]タブの[区切り位置]ボタンを使って、フィールド(項目)の区切りを指定します(図14)。

 サンプルファイルをこちらからダウンロードして試してみてください。Googleスプレッドシートを使いたい場合は、サンプルファイルをGoogleドライブにアップロードしてから、後述の手順に従って開いてください。

フィールドの区切りを変更する 図14 フィールドの区切りを変更する
スペースやタブでフィールドが区切られているテキストファイルを開くと、行全体が1つのセルに読み込まれる。[データ]タブの[区切り位置]ボタン(Microsoft 365オンライン版では該当セルを選択した状態で[テキストを列に分割する]ボタン)をクリックして、区切り文字を指定すれば、複数の列に分けることができる。[スペースによって右または左に揃えられた固定長フィールドのデータ]は、各フィールドが同じ桁数になるように調整されているデータの場合に、桁位置を指定してフィールドを区切るのに使う。

 Excelでの手順は図14に示した通りです。Googleスプレッドシートの場合は以下のように操作します。

Googleスプレッドシードの場合

  • Googleドライブに保存されたCSVファイルを右クリックして、[アプリで開く]-[Googleスプレッドシード]を選択する
  • セルA1A2を選択する
  • メニューバーから[データ]-[テキストを列に分割]をクリックする
  • 選択範囲の右下に[区切り文字]というポップアップ表示が現れるので、[自動的に検出]と表示されているリストから[スペース]を選択する

コラム Webページの表を読み込む

 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 気象庁のページで提供されている毎日の気象データ
全国の気象データを一覧にしたページ(2024年3月15日12時現在のデータ)。各地点の気象を記録した表が5つと、凡例などの表が4つ含まれている(見た目は表になっていないが、表として定義されているものもある)。そのうちの最初の表(札幌〜石巻)をExcelに読み込んでみよう。

 操作は簡単です。図15のように[データ]タブを開き、[Webから]ボタンをクリックします。URLを入力すれば、Webページに含まれる表が一覧表示されるので、その中から目的の表を選択するだけです。

全国の気象データを読み込む 図16 毎日の気象データをWebページからExcelに読み込む
[ナビゲーター]ウインドウでプレビューを見ながら読み込みたい表が選択できる。右側の画面で[Webビュー]タブを開くと、Webページでの表示が確認できる。[読み込み]ボタンをクリックすれば、そのままExcelのワークシートにデータが読み込まれる。また[データの変換]ボタンをクリックすれば、Power Queryと呼ばれるウインドウが表示され、読み込む前にデータの加工ができる。

 図16の方法は、Webページの表だけでなく、インターネット経由でJSONファイルやXMLファイルを読み込むのにも使えます。ただし、JSONファイルやXMLファイルのデータは階層的な構造になっているので、Power Queryの画面で階層をたどってデータを選択する必要があります。Power Queryによるこれらのデータの利用については、連載のテーマから話が逸(そ)れてしまうので、こちらの公式記事などをご参照ください。



 今回は、データ分析以前に考慮すべきデータの形式やファイルの形式について、幾つかの例をトラブルシューティング的に紹介しました。

 実際のデータ分析に当たっては、行や列の取捨選択、並べ替えなども必要になりますが、いずれもExcelの基本的な機能で対応できます。元のデータがイレギュラーな形式であった場合に形式を整えるには、手作業での対応も必要になるかもしれませんが、Excelの機能や関数を利用すればある程度の自動化もできるかと思います。データを適切な形式にできれば、この連載で見てきた分析のための機能やツールをスムーズに適用できるようになります。

 というわけで、データ分析の記述統計編は今回が最終回です。続いて、確率分布編と推測統計編を準備していますので、どうぞお楽しみに!

関数リファレンス: この記事で取り上げた関数の形式

 関数の利用例については、この記事の中で紹介している通りです。ここでは、今回取り上げた関数の基本的な機能と引数の指定方法だけを示しておきます。

配列を操作するための関数

WRAPCOLS関数: 行または列のデータを指定した個数で折り返し、複数の列として返す

形式

WRAPCOLS(ベクトル, 個数, [埋め込む値])

引数

  • ベクトル: 1行または1列のデータの並び。
  • 個数: 何個ごとに折り返すかを指定する。
  • 埋め込む値: 元の値が存在しないときに埋め込む値を指定する。既定値は#N/A

備考

 折り返す個数を3とし、埋め込む値を既定値とした場合、以下のようになる。

WRAPCOLS関数の働き WRAPCOLS関数の働き

 なお、この関数と似た機能を持つWRAPROWS関数では、行または列のデータを指定した個数で折り返して複数の行として返す。

 WRAPROWS関数は、Excel 2019以前では使えない。


TOCOL関数: 配列を1列にする

形式

TOCOL(配列, [無視する値], [方向])

引数

  • 配列: 1列にしたい配列。
  • 無視する値: 以下の値を指定する。
    • 0または省略 …… 全ての値を保持する
    • 1 …… 空白を無視する
    • 2 …… エラーを無視する
    • 3 …… 空白とエラーを無視する
  • 方向: 横方向にデータを取得するか縦方向にデータを取得するかを以下の値で指定する。
    • TRUE …… 縦方向にデータを取得する
    • FALSEまたは省略 …… 横方向にデータを取得する

備考

 方向の指定により、以下のような結果になる。なお、[無視する値]に1を指定すると、7行目の「0」は表示されない。

TOCOL関数の働き TOCOL関数の働き

 なお、この関数と似た機能を持つTOROW関数では、配列を1行にする。

 TOCOL関数は、Excel 2019以前では使えない。


MAKEARRAY関数: LAMBDA関数の計算により配列を作成する

形式

MAKEARRAY(行数, 列数, LAMBDA(行を表す変数, 列を表す変数, 式)

引数

  • 行数: 作成したい配列の行数。
  • 列数: 作成したい配列の列数。
  • 行を表す変数: 配列内の行位置を表す変数名(任意の名前)を指定する。
  • 列を表す変数: 配列内の列位置を表す変数名(任意の名前)を指定する。
  • 式: 行を表す変数と列を表す変数を使って計算するための式を指定する。

備考

 LAMBDA関数は、変数とその計算の方法を定義するための関数(後述)。例えば、「=LAMBDA(x, y, x+y)(1, 2)」とすると、x1y2が代入され、x+yの値が返される。MAKEARRAY関数の中に指定した場合には、配列内の行位置と列位置がLAMBDA関数の行を表す変数と列を表す変数に渡される。


LAMBDA関数: 自作の関数を作るための関数

形式

LAMBDA(引数1, 引数2, ..., 式)

引数

  • 引数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の値つまりA1A2の和が返される。さらに、名前機能を利用して「=LAMBDA(x, y, x+y)」にmyaddといった名前を付けておれば、「=myadd(A1, A2)」でセルA1とセルA2の和が求められる。このようにして関数を自作できる。


「やさしいデータ分析」のインデックス

やさしいデータ分析

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。