4.2. 頻度分布・偏差・分散#

全体の様子、ばらつきの広がり具合など全体をながめわたすための考え方です。

ここからはつぎのcellでつくる df_new を使って、頻度分布、四方位範囲、分散、標準偏差についてPythonで確認します。

import random
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
df_new = pd.DataFrame({'cc':[random.normalvariate(100,25) for x in range(200)],
                      'item':[['water','wine','oil','juice','milk'][random.randrange(5)] for x in range(200)]})
df_new.sample(3)
cc item
124 56.600754 oil
2 108.788755 oil
120 114.958614 juice
df_new.dtypes
cc      float64
item     object
dtype: object
df_new.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   cc      200 non-null    float64
 1   item    200 non-null    object 
dtypes: float64(1), object(1)
memory usage: 3.3+ KB

4.2.1. 頻度分布(histogram)#

それぞれの値の起こる頻度(回数)を数えたものです。

plt.hist()を使って頻度分布(Histogram)を描写します。ドキュメント

plt.hist(df_new['cc'], bins=30, color = 'purple', alpha = 0.5)
plt.title('Histogram of cc')
plt.xlabel('cc')
plt.ylabel('Frequency')
plt.show()
../../_images/27b2cbbe9424da10ea03b068a486b7dea9a596726e4dfff444c2bfa7f5b5107f.png

4.2.2. 四分位範囲#

データの散らばり方を直感的、視覚的に表そうとするもの。データ全体を大きさの順に並べて四等分してみせます。
大きさの順で小さい方から1/4のところの値を第一四分位数、2/4のところの値を第二四分位数、3/4のところを第三四分位数と呼びます。第二四分位数はちょうど中央値に一致します。
箱ひげ図を用いて描くことが多いです。

matplotlibのboxplotを用いて df_newcc 列について箱ひげ図を描きます。

plt.figure(figsize=(5,5))
plt.boxplot(df_new['cc'],showmeans=True)
plt.title('BoxPlot of cc')
plt.grid() # グリッド線を描きます
plt.ylabel('cc')
plt.show()
../../_images/3d9c336a478d1978a53619509a4b3a4e515fef268e7bc5618771cf976a3a3d5c.png

小さい方から、箱の下辺が第一四分位数、オレンジの水平線が第二四分位数、箱の上辺が第三四分位数を示しています。
ここでは、逆T字とT字の水平線はそれぞれウィンカの終わりの位置を示しています。

ウィンカの上限はとはここでは、

\[Q3 + whis*IQR\]
\[IQR = 第三四分位数(Q3) - 第一四分位数(Q1)\]
\[whis = 1.5(default値で変更可能)\]

下限は、\(Q1 - whis*IQR\)となります。 このウィンカを超えると外れ値としてプロットされます。


続いて、df_newitem 別の箱ひげ図を描いてみましょう。

plt.figure(figsize=(13,7))

data = [df_new.loc[df_new['item'].isin([x]),'cc'] for x in df_new['item'].unique()]

plt.boxplot(data, 
            labels = list(df_new['item'].unique()),
            showmeans=True)
plt.title('BoxPlot of cc', size=18)
plt.grid() 
plt.ylabel('cc',size=15)
plt.xlabel('item',size=15)
plt.yticks(size=10)
plt.xticks(size=10)
plt.show()
../../_images/3366b5aa42ae75b9ca563dc9030dbdacaf6664401a2b29bc9c9742729c83fe77.png

4.2.3. 参考 Stripplot#

上の例のように箱ひげ図はデータの散らばり方を直感的に捉え上で有用です。
しかし、それぞれのデータがどのような値を持っているかを把握することができないのが難点です。
seabornのstripplotを使って簡単に確認する方法があるので、紹介します。

palette = [plt.get_cmap('plasma')(i*0.3) for i in range(len(df_new['item'].unique()))]

plt.figure(figsize=(13,7))
sns.boxplot(x='item', y='cc', data=df_new, 
            palette = palette)
sns.stripplot(x='item', y='cc', data=df_new, jitter=True, color = 'black', alpha = 0.8)
plt.xlabel('item',fontsize=15)
plt.ylabel('cc',fontsize=15)
plt.yticks(fontsize=10)
plt.xticks(fontsize=10)
plt.title('BoxPlot of items in df_new', fontsize=15)
plt.grid()
plt.show()
/opt/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.
  with pd.option_context('mode.use_inf_as_na', True):
/opt/anaconda3/lib/python3.11/site-packages/seaborn/_oldcore.py:1119: FutureWarning: use_inf_as_na option is deprecated and will be removed in a future version. Convert inf values to NaN before operating instead.
  with pd.option_context('mode.use_inf_as_na', True):
../../_images/d5579fa503fa55878dc575d49a07de09ecec8b33c64345206eed96a846b8a1a3.png

4.2.4. 分散・標準偏差#

4.2.4.1. 分散(variance)#

データの散らばり具合を示す指標の1つ。1つ1つのデータ\(x_i\)と平均\(\bar{X}\) の差をの二乗の和をデータの個数で割った値です。 個々のデータが平均値からどれだけ離れているのかの距離\((x_i-\bar{X})^2\)を二乗して合計し、データの個数で割ることで標準化した値です。

\[ s^2 = \frac{\sum_i(x_i-\bar{X})^2}{n} \]

4.2.4.2. 標準偏差 (standard deviation)#

分散の平方根です

\[ \sigma = \sqrt{\frac{\sum_i(x_i-\bar{X})^2}{n}} \]



分散および標準偏差をnではなく n-1 で割って求める不偏分散(標本から母集団の分散の推定) などもあります。詳しくは統計関連の文献をご確認ください。


ここからdef_newを用いて分散と標準偏差を求めましょう。

df_newcc列の分散と標準偏差を求めます。

df_new['cc'].var()
669.3767987668348

このvarn-1で割った不偏分散を求めています。nで割った分散を求めるには、var(ddof=0)とします。

var()公式ドキュメントも参照してください。

df_new['cc'].var(ddof=0)
666.0299147730007

df_newcc列の標準偏差を求めます。pandasstdではdefault でn-1で割ったものとなっています。

df_new['cc'].std()
25.872317228397513

nで割った分散を求めるには、std(ddof=0)とします。

df_new['cc'].std(ddof=0)
25.807555381573835

4.2.5. まとめ#

ここでは、与えられたデータがどのようなものであるのかを概観するためのいくつかの方法について紹介しました。
pandasではdescribe()を使って基本的な統計量を一変に得ることができます。
なお、学術論文においては、標本数(n)、平均(mean)、標準偏差(std)、最小値(min)、最大値(max)を最低限の記述統計量として掲載することが基本となっています。

df_new.groupby(['item']).describe()
cc
count mean std min 25% 50% 75% max
item
juice 36.0 103.142108 25.193278 53.407594 89.183679 106.310948 115.660429 147.606883
milk 38.0 106.913916 22.995076 57.509136 91.034288 111.567496 123.449446 156.797161
oil 45.0 102.668624 27.621935 54.117180 80.076561 104.849168 121.725022 170.118605
water 41.0 102.229236 26.329350 46.709703 83.440044 104.144391 125.352220 146.433488
wine 40.0 91.409933 25.204811 35.377376 79.036313 91.225177 107.796838 140.749237
df_new.describe()
cc
count 200.000000
mean 101.218644
std 25.872317
min 35.377376
25% 83.390460
50% 104.190563
75% 119.978569
max 170.118605