データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第7回。グラフを利用して規模や効果の差、つまり大きさの差を可視化する方法や、考え方などについて説明します。具体的には棒グラフを使いますが、慣れ親しんだ棒グラフでも、作成時の準備や意外な落とし穴など、改めて考慮すべき点がたくさんあります。
データ分析の初歩から応用まで少しずつステップアップしながら学んでいく連載の第7回です。前回の特別予告編では、可視化の目的と利用するグラフ、その効用などについて整理しました。幾つかの事例を取り上げ、ケーススタディーを通して、分析の流れと考え方を追いかけるということでしたが、今回はその第1弾です。
まずは、規模や効果を可視化するために、棒グラフの活用について考えていくことにします。これまで何気なく使っていたグラフかもしれませんが、作成する際の前処理や誤った使い方など、考慮すべき点が幾つもあります。なお、Excelのあまり知られていないテクニックや関数についても併せて紹介します。
この連載では、データをさまざまな角度から分析し、その背後にある有益な情報を取り出す方法を学びます。
データの収集方法、データの取り扱い、分析の手法などについての考え方を具体例で説明するとともに、身近に使える表計算ソフト(ExcelやGoogleスプレッドシート)を利用した作成例を紹介します。
必要に応じて、Pythonのプログラムや統計ソフトRなどでの作成例にも触れることにします。
数学などの前提知識は特に問いません。肩の力を抜いてぜひとも気楽に読み進めてください。
筆者紹介: IT系ライターの傍ら、非常勤講師として東大で情報・プログラミング関連の授業を、一橋大でAI関連の授業を担当。書道、絵画を経て、ピアノとバイオリンを独学で始めるも学習曲線は常に平坦。趣味の献血は、最近脈拍が多く99回で一旦中断。さらにリターンライダーを目指し、大型二輪免許を取得。1年かけてコツコツと貯金し、ようやくバイクを購入(またもや金欠)。
本稿では、表計算ソフトを使って手を動かしながら学んでいきます。表計算ソフトMicrosoft Excel用の.xlsxファイルをダウンロードできるようにしています。デスクトップ版のExcelが手元にない場合は、Microsoftアカウントがあれば使える無料のMicrosoft 365オンライン、もしくはGoogleアカウントがあれば使える無料のGoogleスプレッドシート(Google Sheets)をお使いください。Microsoft 365オンラインの場合は、.xlsxファイルをOneDriveにアップロードしてから開いてください。Googleスプレッドシートの場合は、.xlsxファイルをGoogleドライブにアップロードしてから開いた上で[ファイル]メニューの[Google スプレッドシートとして保存]を実行してください(Googleスプレッドシート独自の機能を使っている場合は、ファイルを共有して参照できるようにします。その場合は、該当する箇所で使い方を記します)。
データの特徴を可視化するための方法として、おそらく誰もが最も慣れ親しんでいるのが棒グラフでしょう。数値の大きさに合わせて棒の長さを変えるだけなので、考え方に難しいところはなさそうです。実際、棒グラフなら小学生の頃から何度も作成したことがあると思います。2017年告示、2020年全面実施の学習指導要領(PDFファイル)でも小学3年生で学ぶことになっています。しかし、収集されたデータを棒グラフとして表すには、手描きにしても、ソフトウェアを使うにしても、幾つかのステップを踏む必要があります。また、分析を行う上でも、意外に奥の深いところがあります。
では、始めましょう。図1をご覧ください。これは、ユーザーがWebサイトの広告を最初にクリックした日のクリック数とその広告から得られた売り上げの一覧です(架空のデータです)。同じユーザーが複数回同じ広告をクリックすることもあるかもしれませんが、ここでは最初にクリックした日を基準に回数をカウントしています(2回目以降は数えないものとします)。このデータを基に、サイトAに広告を出した場合とサイトBに広告を出した場合の売り上げを比較できるグラフを作成し、どちらのサイトの広告が有効なのか分析してみましょう。
Webサイトの利用とその効果を分析するためには、Google Analyticsなどのツールが利用できます。さまざまなデータの収集や可視化、予測などを行うことができるので、実務ではそういったツールを活用するのが一般的です。ここでは、ツールの利用方法ではなく、データ分析の「ツボ」に触れることが目的なので、Excelなどの身近なツールを利用し、簡単な事例を分析するプロセスを追いかけます(事例はきわめて単純化したものなので、データの値は現実離れしたものになっているかもしれませんが、ご容赦のほど)。
なお、Google Analyticsについて知りたい方は公式ページや公式の無料オンライン講座、『Googleアナリティクス4のやさしい教科書。』(山野勉著、MdN)、『Googleアナリティクス4 設定・分析のすべてがわかる本』(小川卓著、ソーテック社)などの書籍をご参照ください。
サンプルファイルをこちらからダウンロードし、[売上一覧]ワークシートを開いて取り組んでみてください。Googleスプレッドシートの場合はこちらのサンプルファイルを開いてメニューバーの[ファイル]−[コピーを作成]を選択し、Googleドライブにコピーしてお使いください(曜日の表示形式をGoogleスプレッドシートに合わせた形式にしてあるだけで、内容は同じです)。
さて、皆さんはどのようなグラフを作成したでしょうか。最初に考えるべきことは、どのデータをグラフにするかということですね。取りあえず売上金額をそのまま棒グラフにした方は、図2のようなグラフになったのではないかと思います。グラフを見ると曜日ごとの売り上げの傾向が分かっていいかも……と思われるかもしれませんが、ここでの目的はあくまでもどちらのサイトの広告が有効なのかを知りたいということです。もちろん、曜日ごとの傾向を見ることも重要ですし、これはこれで興味深いのですが、図2のグラフだとサイトの優劣が分かりにくいですね。
目的に合ったグラフを作る前に、図2のグラフをどのようにして作成したかを説明しておきます(ここでの目的からは外れますが、作成手順を知ることはグラフ作成のスキルを上げる上で役に立つので)。なお、以下の手順と、以降の図7までのグラフ作成方法や考え方については、動画でも解説しています。Excelでの手順を丁寧に追いかけたい方はぜひご視聴ください。
棒グラフを作成するときには、横(項目)軸のラベルと、系列の見出しとデータを範囲指定する必要があります。この例では横(項目)軸のラベル(セルA4〜A11)と系列の見出しとデータ(セルE4〜F11)が離れた位置にあることに注意が必要です。離れた複数の範囲を選択するには[Ctrl]キーを押しながら、それぞれの範囲をドラッグします(意外に知られていない操作ですね)。
Excelでは、セルE4〜F11をドラッグして棒グラフを作成するだけでも同様のグラフが表示できます。しかし、横(項目)軸に対する値が設定されないので、横軸に日付ではなく1、2、……といった連番が表示されます。
Googleスプレッドシートでは、セルE4〜F11をドラッグして棒グラフを作成すると、E列がX軸の値と見なされてしまい、F列だけのグラフになってしまいます(Googleスプレッドシートでは、Excelの「横(項目)軸」は「X軸」と呼ばれます)。その場合は[列Eをラベルとして使用]チェックボックスをオフにすれば、E列もグラフ化する系列として扱われ、E列とF列のグラフが表示されます。
試行錯誤的にいろいろなグラフを作っているうちに、思いも寄らなかった発見があることもまれではありません。しかし、目的に合った可視化の方法を選べば、効率よく分析が進められるのも事実です。目的を意識していれば、見通しがつくようになります。ムダに試行錯誤しなくても、さまざまな角度から分析ができるようになるはずです。……というわけで、回りくどくなってしまいましたが、次に、売り上げ全体を比較できるようなグラフを作ってみることにします。
グラフの種類を選択するにあたっては、横軸がどのような項目であるかを意識しておく必要があります。横軸が日付を表す値であり、時系列での変化を見たいのであれば、折れ線グラフの方が適しています。また、横軸も縦軸も変数であり、それらの関係を見たい場合には、散布図が適しています(横軸がX、縦軸がYになります)。サイトAとサイトBの値を比較したい場合(後述)のように、横軸がカテゴリを表す場合は棒グラフが適しています。
サイトAとサイトBの売り上げを比較するなら、あらかじめ売上金額を集計しておく必要があります。分析の目的に合った可視化を行うためには、集計が必要になる場合があるということです。集計の方法には、SUM関数を使う方法、集計機能を使う方法、ピボットテーブルを使う方法がありますが、ここではSUM関数を使って合計を求めておきましょう。SUM関数については説明するまでもないと思いますが、この連載では一応初出なので、最後に関数の形式をまとめてあります。
図3を作成する手順は以下の通りです。
この表は、上でダウンロードしたファイルの[売上集計]ワークシートに含まれているので、それを基に売り上げが比較できるグラフを作成してみましょう(図4)。手順は図4の後に箇条書きで示しています。
Googleスプレッドシートの場合は、以下のような操作で同様のグラフが作成できます。
セルE4〜F12を選択して棒グラフを作成し、5行目〜11行目を非表示にするという方法でも同様のグラフが作成できます(ただし、Googleスプレッドシートでは、[行と列を切り替える]チェックボックスをオンにし、[列Eを見出しとして使用]チェックボックスをオフにしておく必要があります)。
実際のところ、金額を集計した段階でサイトAに広告を出した方が、売り上げが大きいことは分かりますが、可視化するとそのことが顕著に分かります。が、しかし、です。この可視化には落とし穴があります。皆さんはどう思われるでしょうか。すでに答えが分かっている方もおられるかとは思いますが、サイトAの広告クリック数の方が多いので、サイトAからの売り上げが大きいのは当然といえば当然です。確かに集客に関してはサイトAが勝っていますが、広告の効果を見るなら、1クリック当たりの売上金額を見ておく必要があります。
同様の例は枚挙にいとまがありません。例えば、GDP(国内総生産)ではなく1人当たりGDPを見る、人口ではなく人口密度(人口/km2)を見る、都道府県別感染者数ではなく、都道府県の人口1000人当たりの感染者数を見る……などです。他にもどんな例があるか考えてみるといいですね。
では、1クリック当たりの売上金額を求めて、グラフを作成してみましょう。グラフ化に必要な値は図5のセルG12とセルH12の値だけですが、セルG5〜H11に毎日の値も併せて求めてあります。[売上集計(1回あたり)]ワークシートを基にグラフを作成してみてください。念のため、図5の作成方法も図の後に箇条書きで示しておきます。
上記のコピー操作を行うと、表の下の方にあらかじめ設定されている書式が崩れてしまいます。そのような場合には、コピーした後に表示される[貼り付けオプション]ボタンをクリックして[書式なしコピー]を選択すると、元の書式に戻ります。
図5のように集計した段階で、1クリック当たりの売り上げではサイトBが勝っているように思われます。続いてグラフを作成してみましょう(図6)。手順は、図4で売上金額をグラフ化した例とほぼ同じです。
Googleスプレッドシートの場合は、以下のような操作になります。
売上金額はサイトAの方が大きいですが、図6のグラフを見ると、1クリック当たりの売り上げはサイトBの方が大きいので、「サイトBの広告の方がユーザーに届いている」と確信を持って言えそうです。しかし、ここにも大きな落とし穴があります。次に、そのことについて見ていきましょう。
Excelで特に何も指定せずにグラフを作成すると、縦(数値)軸の目盛りが自動的に設定されます。そのため、ごく小さな差が強調されすぎて、あたかも大きな差があるように見えることがあります。逆に、目盛りの設定を変えれば、大きな差があっても、あまり差がないように見せることもできてしまいます(いずれにしても悪用禁止ですね)。これがグラフによる可視化の大きな落とし穴の一つです。
この例では、1週間しかデータを取っていないので、「差がある」と言うにはかなり無理があります。しかし、図6のグラフだけを見せられると「サイトBの方が優れている」という印象が与えられてしまいます。では、誤ったイメージを伝えないためにはどうすればいいでしょうか。縦(数値)軸の目盛りを適切に設定すればいいですね。そこで、縦(数値)軸の目盛りの最小値を0、最大値を2に設定してグラフを描いてみましょう。手順は図7の後に箇条書きで示してあります。ちなみに、Googleスプレッドシートでグラフを作成した場合には、特に何も指定しなくても、最小値が0、最大値が2のグラフ(図7と同様のグラフ)になります。利用するソフトウェアによって、可視化した際の印象が異なることもあるので、目盛りなどの設定はソフトウェア任せにせず、自分で変更できるようにしておきたいものです。
人は得てして自分の信念に合うようにモノの見方を変えてしまうものです。差があることを主張したいからといって、意識するとしないとに関わらず、図6のようなグラフを作成するのはご法度です。この例はあまりにもあからさまなので、まんまとだまされてしまう人はいないかもしれません。しかし、世の中には印象操作のために巧妙に加工したようなグラフも数多くはびこっています。
T.TEST関数を使って、いずれかのセルに「=T.TEST(G5:G11,H5:H11,1,3)」と入力すると、0.17というt検定の結果が得られます。この値が0.05以下あるいは0.01以下であれば「サイトBの方が大きい」と言えますが、そうでないので「サイトBの方が大きいとは言えない」ことになります(ただし、差がないとも言い切れません)。なお、一般に、データ数が多くなればT.TEST関数の値は小さくなるので、わずかな差であっても「差がある」という結果が得られてしまいます。また、その差は対象となる問題によっても重要度が変わってきます。生命に関わるような領域であれば、ごくわずかな差でも無視できないかもしれません。適切に判断するためには、効果量、検出力、サンプル数の検討が必要になりますが、統計的検定のお話は、今回のテーマから大きく外れるので、ここでは割愛します。興味のある方は『事例で学ぶExcel統計』(羽山博著、日経BP)の第5章などをご参照ください。
可視化のメリットは数値だけでは分からない特徴が明確になることですが、逆に、それほど大きくない差異を実態よりも大きく見せてしまうことがあるというデメリットも理解しておきましょう。
仮にサイトBの方が広告の効果が高いということが分かったとしても、サイトBにのみ広告を出せばいいかというとそういうわけでもありません。現実問題として、費用対効果(コストパフォーマンス)を考える必要があります。例えば、サイトBの広告料が高いのであれば、費用対効果は小さくなってしまいます。
例えば、広告の予算が10,000円で、ユーザーが広告にアクセスしたときの広告料が表1のようになっている場合、いずれかのサイトに全て広告予算をつぎ込めば売り上げが最大化されます(ここでは、同じユーザーが何回広告をクリックしても広告料は変わらないものとします)。
ケース | 広告料(A) | 広告料(B) | クリック数(A) | クリック数(B) | 売上(A) | 売上(B) |
---|---|---|---|---|---|---|
ケース1 | 1.0 | 1.1 | 10,000 | 9,091 | 15,600 | 16,000 |
ケース2 | 1.0 | 1.2 | 10,000 | 8,333 | 15,600 | 14,667 |
この例はあまりにも単純で、制約となるのが広告予算だけなので、どちらか一方に広告を集中させればいいというつまらない結果になってしまいますが、複数の制約がある場合には線形計画法により最適な配分を求めることができます。ちなみに、上の表の値は以下のPythonプログラムで求められます(シンプレックス法と呼ばれる方法が使われます)。広告料が表1のケース1のようになっている場合の例です。
from scipy.optimize import linprog
c = [-1.56, -1.76] # 目的関数:-1.56x0-1.76x1(最小値が求められるので、符号を変えておく)
A = [[1.0, 1.1]] # 制約関数(広告料):1.0x0+1.1x1
b = [10000] # 制約量:1.0x0+1.1x1≦10000
x0_bounds = (0, None) # x0の下限と上限
x1_bounds = (0, None) # x1の下限と上限
res = linprog(c, A_ub=A, b_ub=b, bounds=(x0_bounds, x1_bounds))
print(res.fun) # 最小値のみを出力
# 出力例(符号を変えれば最大値となる)
-15999.999999999998 # 小数点以下は誤差。最大値は16000となる
コードの意味について興味のある方は、科学技術計算のためのパッケージであるSciPyのドキュメントをご参照ください。
実際には、上のコラムでも触れた費用対効果はもちろんのこと、それぞれのサイトの性質や利用者の違いなどについても考慮しながら、どのように広告を出せばよいかを検討することになると思います。最後に、蛇足ですが、やや先走った話もしておきます。
今回の目的はサイトAとサイトBの売り上げの比較なので、時系列による分析は行っていません。しかし、時間的な要因を分析すれば、より豊かな情報が得られる可能性があります。考えられることの一つとしてタイムラグがあります。例えば、収入が増えたからといって、すぐに住宅や自動車などの大きな支出が増えるわけではありません。ある程度の期間が経過してから支出が増えることが考えられますね。
今回のデータにも実はタイムラグがあります。クリック数については、サイトAもサイトBも同じようなパターンですが、売り上げについてはサイトBが1日ずれたパターンになっています。そのことを確かめてみましょう。まず、列を作るためのTOCOL関数を使って、月曜日のクリック数が入力されている行(5行目)に対して、火曜日の売り上げを表示する、といったように、クリック数に対して翌日の売り上げが表示されるようにしてみましょう(図8)。便宜的に、日曜日のクリック数に対して、前の週の月曜日の売り上げが対応するようにしてあります。以降の操作については、動画でも解説しているので、手順を追いかけたい方はぜひご参照ください。
TOCOL関数のかっこが2重になっているのは、F6:F11,F5をひとまとめにして第1引数に指定するためです。内側のかっこがないと、第1引数としてF6:F11が指定され、第2引数としてF5が指定されたものと見なされるので、正しい結果が得られません(エラーになってしまいます)。なお、Googleスプレッドシートでは{}で囲み、セミコロンで区切ることにより列(縦)方向の配列を作ることができます(カンマで区切ると行(横)方向の配列になります)。従って「={F6:F11;F5}」または「=TOCOL({F6:F11;F5})」と入力すれば同じ結果になります。
続いて、サイトAの売り上げ(E列)とサイトBの1日後の売り上げ(G列)をグラフ化しましょう(図9)。作成手順は図8の後に箇条書きで示しておきます。
グラフ作成の方法は図2と同様です。ここでは棒グラフをそのまま使っていますが、変化のパターンを見るなら折れ線グラフの方が見やすいと思います(が、今回は棒グラフだけを取り扱うことにします)。
図9を見ると、サイトAでは広告が最初にクリックされたその日に購買行動が起こり、サイトBでは広告が最初にクリックされた翌日に購買行動が起こっているのではないかという仮説が立てられそうです。そこで、クリック数とその日の売り上げとの相関係数、クリック数と翌日の売り上げの相関係数をそれぞれ求めてみましょう。
では、[売上一覧(日付をずらした相関)]ワークシートを開いてみてください。相関係数については回を改めて詳しく解説するので、ここでは、セルE14〜F15に入力されている関数とその結果を確認していただくだけでけっこうです(図10)。相関係数を求めるにはCORREL関数を使います。
各セルに入力されている関数と作成手順は以下の通りです。
一方の変数の値が増えると他方の変数の値も増える場合、相関係数の値は1に近くなります(正の相関)。逆に、一方の変数の値が増えると他方の変数の値が減る場合、相関係数の値は-1に近くなります(負の相関)。変数同士に関係がないと考えられる場合には、相関係数は0に近くなります(無相関)。
結果を見ると、サイトAではクリック数と当日の売り上げに強い正の相関があり、サイトBではクリック数と翌日の売り上げに強い正の相関があることが分かります。やはり、サイトBでは最初に広告がクリックされた翌日に購買活動が起こっているように思われます。つまり、サイトの性質に何らかの違いがあり、サイトを利用するユーザー層やユーザーに与える広告の影響が異なっているのではないか、ということが示唆されます。
実際のところ、最初に広告をクリックした日と商品を購入した日の記録や、ユーザーのプロフィールを詳細に追いかければ、このような傾向は読み取れます。しかし、洞察力を働かせれば、限られたデータからでもさらなる分析につながるヒントが得られることが分かると思います。逆に、高度なツールを利用していても、単に結果の数値を鵜呑み(うのみ)にしているだけでは本質に迫ることができないということも言えそうですね。
時系列データでは、日数や月数など、期間をずらしながら、自分自身との相関係数(自己相関)を求めていくと、周期的なパターン(季節性変動)が見いだされることがあります。そのような季節性変動による分析や予測も行われますが、それについてはいずれ機会を改めて、ということにしましょう。
今回は、規模や効果の可視化を行うために棒グラフを作成しました。単に操作を行うだけでなく、目的に合った分析のために、前処理を行ったり、作成されたグラフをどのように読み解くかについて考えたりしました。次回は、時間的な変化の可視化をテーマとしたケーススタディーを通して、折れ線グラフの作成や利用、読み解き方の留意点などを見ていきます。次回も、落とし穴や意外に知られていない機能なども紹介します。どうぞお楽しみに!
関数の使いこなし方については、この記事の中で紹介している通りです。ここでは、今回取り上げた関数の基本的な機能と引数の指定方法だけを示しておきます。
SUM(数値1, 数値2, ... , 数値255)
T.TEST(配列1, 配列2, 検定の指定, 検定の種類)
TOCOL(配列, 無視する値, 方向)
CORREL(配列1, 配列2)
Copyright© Digital Advantage Corp. All Rights Reserved.