Pythonの強みの1つは大量のデータを扱って統計・分析できるツールが多いことです。
これまで以下の記事で「NumPy」「Pandas」「DataFrame」の基礎を紹介してきました。
・【NumPy入門】機械学習はここから始める|計算方法、配列の作り方、配列の変形
・【Pandas入門】機械学習の基礎知識 -効率的な学習法-|調べて実践できる
この記事では実際にこれらを利用してデータ統計する方法を紹介します。
以下に当てはまる項目がある方は是非読んでみてください。
・データ統計をやってみたい
・Pythonで分析ってどうやるの?
・機械学習を基礎から学びたい
・データ統計のサンプルコードを見てみたい
具体的にはデータ統計の基礎となる計算方法などを紹介します。
どういった計算ができるのか、どういった書き方になるのかにフォーカスして参考にしてください。
それでは始めていきましょう!
データ統計の基礎となる計算方法

ここでは簡単なデータを使って、データの作成から統計量の算出までのやり方を説明します。
実際に上から順番に実行して自分の環境でも試してみてください。
まずは以下を準備して必要なモジュールを読み込みましょう。
import numpy as np
from pandas import Series, DataFrame
import pandas as pd
最後のimport pandas as pd
は毎回pandas
と入力するのが面倒なだけなので、削除しても以下pd
をpandas
と変えても実行可能です。
それではサンプルデータを作成してきます。
sample_arr = np.array([[1,2,np.nan],[np.nan,3,4]])
sample_arr
ーーーーーーーーーーーーーーー
【結果】
[[ 1. 2. nan]
[nan 3. 4.]]
ここでは2行3列の行列を作成しました。np.nan
は「NumPy」が提供しているNAN値(nullみたいなもの)です。
この行列をもとに「DataFrame」を作成します。
df1 = DataFrame(sample_arr, index=['I1','I2'], columns=['C1','C2','C3'])
df1
ーーーーーーーーーーーーーーー
【結果】
C1 C2 C3
I1 1.0 2.0 NaN
I2 NaN 3.0 4.0
index(行名)とcolumns(列名)をつけて、表データを作成しました。
このデータをもとにさまざまな計算を行っていきます。
データの合計
”sum関数”を使用して合計してきます。
df1.sum()
ーーーーーーーーーーーーーーー
【結果】
C1 1.0
C2 5.0
C3 4.0
dtype: float64
このように列ごとの合計値が取得できます。
みてわかる通り、NAN値は除外されて計算されています。
”sum関数”ではデフォルトで以下の設定が行われています。
・axis=0 ・skipna=True
それぞれの意味を解説しきいきます。axis
は合計する基準を列にするか、行にするか決めるものになります。
上記では「デフォルトの0」が設定されていたので、列の合計でしたが、「1」を設定すると行が合計されます。skipna
はNAN値を除外するかどうかを設定できます。
NAN値を除外しない場合は以下のようになります。
df1.sum(skipna=False)
ーーーーーーーーーーーーーーー
【結果】
C1 NaN
C2 5.0
C3 NaN
dtype: float64
このように、NAN値が1つでも含まれていると合計値がNANになります。
他にも設定できることがあるので、実行したいことがあればこちらを参照してください。
最小値・最大値の取得
今度は最小値を取得していきます。
【計算元データ】
C1 C2 C3
I1 1.0 2.0 NaN
I2 NaN 3.0 4.0
最小値は”min関数”を使用します。
最大値の場合は”max関数”を使用します。
この記事では”min関数”のみ紹介しますが、”max関数”に変更しても実行できるので、試してみてください。
df1.min()
ーーーーーーーーーーーーーーー
【結果】
C1 1.0
C2 2.0
C3 4.0
dtype: float64
列ごとの最小値を取得することができました。
次は行ごとの最小値を取得してみます。
df1.min(axis=1)
ーーーーーーーーーーーーーーー
【結果】
I1 1.0
I2 3.0
dtype: float64
先ほどの”sum関数”と同じですね。
うっすら法則がみえてきたのではないでしょうか。
これまでは最小値の数値を取得してきましたが、項目を取得することもできます。
df1.idxmin()
ーーーーーーーーーーーーーーー
【結果】
C1 I1
C2 I1
C3 I2
dtype: object
もう行の最小項目を取得する方法もわかるのではないでしょうか。
試してみてできなかったらお問い合わせください。
また”sum関数”と同じようにskipna
を指定してNAN値の有無で変えることができます。
数値の累加
累加とは全てを順番に足していくことです。
「ん?イメージできない」と思った方もいるかと思います。
実際のデータを見てみてください。
【計算元データ:df1】
C1 C2 C3
I1 1.0 2.0 NaN
I2 NaN 3.0 4.0
ーーーーーーーーーーーーーーー
df1.cumsum()
ーーーーーーーーーーーーーーー
【結果】
C1 C2 C3
I1 1.0 2.0 NaN
I2 NaN 5.0 4.0
ここでもデフォルトではNAN値は除外されます。
C2列を見てていただけたら、わかるかと思いますが、下にいくにつれて足されていくものです。
列を基準に累加されていますが、行を基準にするにはどうすればよいのでしょうか?
クドいですね。。。
引数にaxis=1
をいれてあげたらよいのです。
累加では”cumsum関数”を使用しましたが、累積(順番に掛け算する)では”cumprod関数”を使用します。
統計量の算出
それでは統計量を出していきましょう。
「DataFrame」には一瞬にして統計量を算出してくれる便利な”descrive関数”があります!
さっそく算出してみます。
計算元データ:df1】
C1 C2 C3
I1 1.0 2.0 NaN
I2 NaN 3.0 4.0
ーーーーーーーーーーーーーーー
df1.describe()
ーーーーーーーーーーーーーーー
【結果】
C1 C2 C3
count 1.0 2.000000 1.0
mean 1.0 2.500000 4.0
std NaN 0.707107 NaN
min 1.0 2.000000 4.0
25% 1.0 2.250000 4.0
50% 1.0 2.500000 4.0
75% 1.0 2.750000 4.0
max 1.0 3.000000 4.0
「なんだこの結果は?」と思ったかたもいると思います。
列ごとに各統計データを算出しています。
それぞれのデータは以下になります。
・count:要素の個数 ・mean:平均 ・std :標準偏差 ・min :最小値 ・25%:1/4分位数 ・50%:中央値 ・75%:3/4分位数 ・max :最大値
平均、標準偏差については『【悪用厳禁】数字にダマされないデータ分析の基礎|平均、中央値、分散、標準偏差』にまとめているので参照ください。
分位数についてはこの記事がわかりやすかったので参照ください。
行ごとの統計を取得したい場合はどうすればよいのでしょうか?
これではaxis
を利用しましたが、”descrive関数”では使用できないです。。。
そういった場合は行と列を入れ替えれる”T属性”もしくは”transpose関数”問題ありません。
df1.T.describe()
ーーーーーーーーーーーーーーー
【結果】
I1 I2
count 2.000000 2.000000
mean 1.500000 3.500000
std 0.707107 0.707107
min 1.000000 3.000000
25% 1.250000 3.250000
50% 1.500000 3.500000
75% 1.750000 3.750000
max 2.000000 4.000000
いろいろなデータを作成して試してみてください。
”describe関数”の詳細についてはこちらを参照ください。

最後に
データ統計はとても面白いものです。
情報が溢れかえっている現代において、それらを利用して統計をとってみると、いろいろなデータがみられます。
Pythonを利用したデータ統計はムズカしく思えるかもしれませんが、ちゃんとした手順で進めていけば必ずできるようになります。
紹介したコードや統計方法を実際に動かして、学んでみてください。
なにか不明点等ありましたら、Twitterやお問い合わせフォームにてご連絡ください。
最後まで読んでくださり、ありがとうございました!!!
コメント