最近よく聞く「データをもとに…。」「データ分析によると…。」「データサイエンス」などなど、データっていう言葉をよく聞きませんか?
でもデータってなんとなくわかっているようで、深く考えてみるとよくわかっていない言葉ですよね。
そんなわけで、この記事ではデータはとは何かについて解説してみましょう。
データって何?情報との違いは?
データってなんとなく数字の塊だと思っていたのですが、実際はそれだけでないんですね。
データとは、行動を決定または、結論付けるための「事実」または「資料」です。
そしてデータは、数字の羅列や文章、そしてその両方など様々な形態があり、一目見ただけでは意思決定の役に立たないものも数多くあります。
データと似ているものには情報があります。
情報は加工されたデータで、そこから意思決定に必要な情報を抽出できる「事実」または「資料」になります。
つまりデータと情報の違いは、事実や資料から意思決定ができるかどうかにあります。
巷でよく言われる「データを活用して意思決定に反映」の意味は「データを加工し情報を抜き出して意思決定に反映させる」という意味なんです。
そして、データを加工し情報を抜き出すために使われる技術が「統計」と言われるものになります。
ちなみに、「データ(data)」は英語では複数形であり、その単数形は「datum」。
ラテン語起源の言葉ですね。
データを整理する前に
統計的にデータを整理する前にまず、いくつかの統計用語を知っておく必要があります。
統計を使ってデータや情報についての話をする際の、共通の言語になるので普段使わない言葉ですが、覚えておいてください。
母集団
母集団とは、自分が知りたい情報を持っていると推測される集団です。
簡単な例でいうと「男」「女」などです。
そしてこの母集団「男」の例で、どの年齢層に分類されるのか、どんな職業に分類されるのかを調べたい場合がありますよね。
その場合「年齢層」や「職業」を変量といい、それがどのように分布しているか、例えば20代が100人で30代が200人など、を母集団分布といいます。
この各変量の母集団分布は、母集団一人一人を調査すればできますが、母集団が100人ぐらいならともかく、1億人のような大量の数ではとても調査することができません。
そこで、行われるのが母集団から無作為に標本を一定数抽出し、その標本から母集団の特色を推測する、つまり「統計的推測を行う」ことが必要になります。
度数分布表
この統計的推測を行うために必要なのが、度数分布表ですが「質的変数」と「量的変数」の違いを分かって作らないと、情報として成り立たなくなってしまいます。
質的変量と量的変量の違い
質的変量とは何かというと、数字で表すことができないもの、例えば「好きな食べ物」「名前」「血液型」など。
好きな食べ物に対する答えは「ラーメン」や「寿司」など、数字では表すことができない答えになります。
反対に、量的変量は答えが数字で表すことができるもの。
例えば「身長や体重」「金額」「速度」「面積」など数字で表すことができるもの全てが、量的変量になりますね。
ではPythonを使って、実装してみましょう。
質的変量の度数分布表
例題で学ぶ統計入門で使われている、血液型の例を使って度数分布表を作成してみましょう。
標本数は50人で血液型が変量です。
当然血液型は数値ではありませんので、質的変量になりますね。
python に直接書き込んでもよかったんですが、CSVファイルで作成したものをPythonに読み込んでいます。
import pandas as pd # DataFrameを扱うライブラリをインポート
qualitative_data = pd.read_csv("qualitative_variables.csv", encoding='shift-jis') # CSVファイルの読み込み
display(qualitative_data) # 読み込んだCSVファイルの表示
出力したDataFrameがこちら。
このデータをもとにヒストグラムを作ってみましょう。
まず、ヒストグラムを作りやすいように、DataFrameを少し加工します。
qualitative_data = pd.read_csv("qualitative_variables.csv", encoding='shift-jis', index_col=0) #index_col=0を加えることで、血液型をインデックスにする。
qualitative_data2 = qualitative_data.drop("計") #計の行を削除
display(qualitative_data)
この処理を行うことで、以下のように血液型をインデックスにすることができます。
これで、ヒストグラムを描いてみましょう。
import matplotlib.pyplot as plt # グラフ描写ライブラリのインポート
from matplotlib import rcParams # 辞書オブジェクトrcParamsをインポート
plt.rcParams["font.family"] = "MS Gothic" # rcParamsで日本語フォントMS Gothicを設定
plt.figure(figsize=(10, 5)) # ヒストグラムを出力、およびグラフのサイズを定義
x=qualitative_data2.index # x軸をqualitative_data2のインデックスで定義
y=qualitative_data2['度数'].values # y 軸をqualitative_data2['度数'].value で定義
plt.xlabel('血液型', fontsize=18)
plt.ylabel('度数', fontsize=18)
plt.title('血液型の割合', fontsize=18)
plt.bar(x,y)
plt.grid()
plt.show()
できました。
量的変量の度数分布表
同じように、量的変量の度数分布表を見てみます。
こちらはサンプル数50人の身長をもとに作っています。
quantitative_data = pd.read_csv("quantitative_variables.csv", encoding='shift-jis') # CSVファイルの読み込み
display(quantitative_data) # 読み込んだCSVファイルの表示
これでDataFrameを出力すると以下になります。
このデータでも、ヒストグラムを書いてみましょう。
まずはDataFrameの整理。
quantitative_data = pd.read_csv("quantitative_variables.csv", encoding='shift-jis', index_col=0) #index_col=0を加えることで、階級をインデックスにする。
quantitative_data2 = quantitative_data.drop("階級値", axis = 1) # 階級値を削除
display(quantitative_data2)
この処理を行うことで、以下のように階級をインデックスにします。
このDataFrameをもとに、ヒストグラムを作成すると、
import matplotlib.pyplot as plt # グラフ描写ライブラリのインポート
from matplotlib import rcParams # 辞書オブジェクトrcParamsをインポート
plt.rcParams["font.family"] = "MS Gothic" # rcParamsで日本語フォントMS Gothicを設定
plt.figure(figsize=(10, 5)) # ヒストグラムを出力、およびグラフのサイズを定義
x=quantitative_data2.index
y=quantitative_data2['度数'].values
plt.xlabel('階級', fontsize=18)
plt.ylabel('度数', fontsize=18)
plt.title('身長の分布', fontsize=18)
plt.bar(x,y)
plt.grid()
plt.show()
では次にエクセルデータの読み込みから、度数分布表作成とヒストグラムの描画を行ってみます。
Excel データの読み込みと整形
度数分布表のためのデータは、例題で学ぶ統計入門での演習問題で使われている、過去40日間の救急車出動回数模擬データを、excel ファイルにまとめたものを使っています。
まずはデータを「pd.read_excel()」関数を使って読み込みます。
import pandas as pd
import numpy as np
ambulance_Dep = pd.read_excel("ambulance.xlsx")
ambulance_Dep
DataFrameをよく見ると、出動回数の前にインデックス番号「0」がついていますね。
このままでは後々処理がしにくいので、「出動回数」そのものを「.set_index()」関数を使って、インデックスにしてしまいます。
ambulance_Dep.set_index("Unnamed: 0", inplace=True)
ambulance_Dep
次に、DataFrameをSeriesに変換します。
ambulance_Dep_s = ambulance_Dep.loc['出動回数',:] ambulance_Dep_s
次にdescraibe関数を使って、データの全体像を把握してみましょう。
ambulance_Dep_s.describe()
度数分布表を作る
度数分布表を作るために必要なのが、階級の数をどうするかですが、それはスタージェスの公式で求められます。
これを実装してみると、以下の通り。
# 度数分布表を作る
# スタージェスの公式から階級の数を求める
from math import log
class_size = 1 + log(len(ambulance_Dep_s), 2)
print(class_size)
6.321928094887363
階級の数は6に設定することにしました。
次に階級の幅を求める必要がありますので、実装してみましょう。
# 階級の幅を求める
class_width = (max(ambulance_Dep_s) - min(ambulance_Dep_s))/6
print(class_width)
0.8333333333333334
ということで階級値を1に設定します。
階級の数、階級値が定まったらデータを各階級に振り分けていきます。
# 階級に振り分ける
# 各観測値を階級値にする
def frequency_distribution(ambulance_Dep_s, class_with):
cut_data = []
for colmun in ambulance_Dep_s:
cut = colmun // class_with
cut_data.append(cut)
return cut_data
#頻度を数える
frequency_data = pd.Series(frequency_distribution(ambulance_Dep_s, 1)).value_counts()
print(frequency_data)
度数分布表の並び順がバラバラなので、順番を整えてみます。
# インデックスでソートする
F_data = frequency_data.sort_index()
F_data
コードを書くにあたっては、こちらとこちらのサイトを参考にさせていただきました。
ヒストグラムで表示する
このデータをヒストグラムに落とし込んでみようと思いますが、その前にデータを反転させます。
もっと別なやり方があるかもしれませんが、まだ発見できてないのです。
「.T」を使ってDataFrameを反転させます。
ambulance_Dep_t = ambulance_Dep.T ambulance_Dep_t
ヒストグラムを表示してみましょう。
import matplotlib.pyplot as plt
ambulance_Dep_t['出動回数'].hist(bins=6)
plt.show()
いい感じのヒストグラムができましたね。
結果から読み取れることは、過去40日間で一日2回出動した日が14日あり、一回も出動していない4日間を除いてすべて出動があったということになります。
関連記事↓↓↓


コメント