Pythonでpandas入門3(データの統計量の計算)

Pythonのデータ分析で用いられるpandasの入門編です。データ(DataFrame)の最大値や平均などの統計量の計算について解説します。

目次

  1. データの要約統計量
  2. 各種統計量を計算する
  3. 列を指定して統計量を計算する
  4. 最頻値を計算する
  5. 関数を指定して集計する
  6. データをグループ化して統計量を計算する
  7. データのグループ毎のデータ数をカウントする

データの要約統計量

describe()メソッドで、DataFrameの各列の統計量(平均や最大値など)を要約して出力できます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
stat = df.describe()
print(df)
print(stat)

最初にDataFrameの中身を表示して、その後にDataFrameの要約統計量を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

           World      Japan
count   4.000000   4.000000
mean   24.025000  21.092500
std    35.025469  30.765486
min     1.970000   0.510000
25%     2.060000   1.132500
50%     9.285000   8.990000
75%    31.250000  28.950000
max    75.560000  65.880000

各列まとめて計算してくれるのは便利ですね。

各種統計量を計算する

各列の統計量を計算するメソッドは、それぞれ下記のようになっています。

統計量

メソッド

最小値

min()

最大値

max()

平均値

mean()

中央値

median()

合計値

sum()

標準偏差

std()

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
mi = df.min()
ma = df.max()
me = df.mean()
md = df.median()
su = df.sum()
st = df.std()
print(df)
print('最小値\r\n' + str(mi))
print('最大値\r\n' + str(ma))
print('平均値\r\n' + str(me))
print('中央値\r\n ' + str(md))
print('合計値\r\n ' + str(su))
print('標準偏差\r\n ' + str(st))

最初にDataFrameの中身を表示して、その後に各統計量を表示します。

Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

最小値
Name     Chrome OS
World         1.97
Japan         0.51
dtype: object

最大値
Name     Windows
World      75.56
Japan      65.88
dtype: object

平均値
World    24.0250
Japan    21.0925
dtype: float64

中央値
 World    9.285
Japan    8.990
dtype: float64

合計値
 Name     WindowsOS XChrome OSLinux
World                         96.1
Japan                        84.37
dtype: object

標準偏差
 World    35.025469
Japan    30.765486
dtype: float64

合計は「Name」列の文字列が足されてますね。

列を指定して統計量を計算する

特定の列を指定して統計量を計算することもできます。

例として「World」列の合計値を計算します。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
su = df['World'].sum()
print(df)
print('合計値\r\n ' + str(su))

最初にDataFrameの中身を表示して、その後に合計値を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

合計値
 96.10000000000001

最頻値を計算する

mode()メソッドでDataFrameの最頻値を計算できます。

import pandas as pd

df1 = pd.DataFrame([[0,0,0],[0,1,1],[1,1,2],[2,2,4]], columns=['c1','c2','sum'])
mo = df1.mode()
mo2 = df1['c2'].mode()
print(df1)
print(mo)
print(mo2)

最初にDataFrameの中身を表示して、その後に各列の最頻値を表示し、その後に「c2」列の最頻値を表示します。

   c1  c2  sum
0   0   0    0
1   0   1    1
2   1   1    2
3   2   2    4

    c1   c2  sum
0  0.0  1.0    0
1  NaN  NaN    1
2  NaN  NaN    2
3  NaN  NaN    4

0    1
dtype: int64

「sum」列は0, 1, 2, 4の各数字が同じ頻度で出現しますので、結果が4つ表示されます。「c1」列と「c2」列は最頻値が1つだけなので、それ以外がNaNになっています。

関数を指定して集計する

agg()メソッドを使うと、関数を指定して集計ができます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
stat = df.agg({'World':['min','max'], 'Japan':['min','max','sum']})
print(df)
print(stat)

最初にDataFrameの中身を表示して、その後に「World」列の最大値と最小値および「Japan」列の最大値と最小値と合計を表示します。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

     World  Japan
min   1.97   0.51
max  75.56  65.88
sum    NaN  84.37

「World」列の方に指定しなかった関数の結果には、NaNが表示されていますね。

データをグループ化して統計量を計算する

groupby()メソッドで、データをグループ化できます。グループ化すると、それぞれのグループについて統計量の計算ができます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
df['platform'] = ['x64/arm', 'x64', 'x64/arm', 'x64/arm']
stat = df[['World','Japan','platform']].groupby('platform').min()
print(df)
print(stat)

最初にDataFrameの中身を表示して、「platform」列でグループ化した状態で各列の最小値を計算します。

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm
3      Linux   1.97   1.34  x64/arm

          World  Japan
platform
x64       16.48  16.64
x64/arm    1.97   0.51

MacのM1プロセッサがArmだってのは知ってます。この調査の時にはまだ出てなかったんです。

データのグループ毎のデータ数をカウントする

各グループ毎のデータ数をカウントします。

value_counts()メソッドでグループ分けしたい列を指定してカウントする方法と、groupby()メソッドでグループ化してからcount()メソッドでカウントする方法があります。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
df['platform'] = ['x64/arm', 'x64', 'x64/arm', 'x64/arm']
cn1 = df['platform'].value_counts()
cn2 = df.groupby('platform')['platform'].count()
print(df)
print(cn1)
print(cn2)

最初にDataFrameの中身を表示して、その後にvalue_counts()メソッドでの結果を、さらにcount()メソッドでの結果を表示します。

        Name  World  Japan platform
0    Windows  75.56  65.88  x64/arm
1       OS X  16.48  16.64      x64
2  Chrome OS   2.09   0.51  x64/arm
3      Linux   1.97   1.34  x64/arm

x64/arm    3
x64        1
Name: platform, dtype: int64

platform
x64        1
x64/arm    3
Name: platform, dtype: int64

value_counts()メソッドの方が便利ですね。

公開日

広告