データとは:Python で度数分布表からヒストグラムの作成をやってみた

データ分析

最近よく聞く「データをもとに…。」「データ分析によると…。」「データサイエンス」などなど、データっていう言葉をよく聞きませんか?

でもデータってなんとなくわかっているようで、深く考えてみるとよくわかっていない言葉ですよね。

そんなわけで、この記事ではデータはとは何かについて解説してみましょう。

プログラミングを勉強したい!! データ分析に興味がある!!
そんなあなたへのおすすめ記事
無料体験あり、キャッシュバック有りプログラミングスクールおすすめはこちら

 

データって何?情報との違いは?

データってなんとなく数字の塊だと思っていたのですが、実際はそれだけでないんですね。

データとは、行動を決定または、結論付けるための「事実」または「資料」です。

そしてデータは、数字の羅列や文章、そしてその両方など様々な形態があり、一目見ただけでは意思決定の役に立たないものも数多くあります。

データと似ているものには情報があります。

情報は加工されたデータで、そこから意思決定に必要な情報を抽出できる「事実」または「資料」になります。

つまりデータと情報の違いは、事実や資料から意思決定ができるかどうかにあります。

巷でよく言われる「データを活用して意思決定に反映」の意味は「データを加工し情報を抜き出して意思決定に反映させる」という意味なんです。

そして、データを加工し情報を抜き出すために使われる技術が「統計」と言われるものになります。

ちなみに、「データ(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日間を除いてすべて出動があったということになります。

プログラミングを勉強したい!! データ分析に興味がある!!
そんなあなたへのおすすめ記事
無料体験あり、キャッシュバック有りプログラミングスクールおすすめはこちら

 

関連記事↓↓↓

Pyhtonで分散、標準偏差の公式と説明そして実装。
分散はデータが平均値とどれだけ離れているか、データの散らばり具合を示す値です。 文で説明してもわかりにくいので、とりあえず例を見てみましょう。 二つのヒストグラムがありますが、青いヒストグラムはすべてのデータがより平均値...
Python :平均値の求めかた、数式の意味も解説してみた。
標本を度数分布表に落とし込み、グラフにすることでその大まかな傾向が見えてきたと思います。 ではさらに、分析を行うために度数分布表の特色を数値で見ることにしましょう。 そこで、一般的に用いられるのが「平均」「分散」「標準偏差」です...

コメント

タイトルとURLをコピーしました