本記事はブラウザ上でPythonを実行できます。
まずはデータを読み込みましょう。今回はタイタニックの乗客データを用います。
packages = ["matplotlib", "numpy", "pandas"]
import io
import csv
from pyodide.http import open_url
import pandas as pd
titanic_data:str = open_url("https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv").read()
# csvの文字列をリストに変換
with io.StringIO() as f:
f.write(titanic_data)
f.seek(0)
csv_reader = csv.reader(f)
read_data = [row for row in csv_reader]
# 一行目をカラム名として渡す
columns = read_data[0]
df = pd.DataFrame(read_data[1:], columns=columns)
df.head()
データがすべてstr
で渡ってしまっているので、必要なものだけ前処理を行います。
# 空文字列をNaNに変換
df = df.where(df != "")
# 数値が入るカラムの型を変換
numeric_columns = ["PassengerId", "Survived", "Pclass", "Age", "Fare"]
df.loc[:, numeric_columns] = df[numeric_columns].astype("float")
df.shape
ではpandasで集計を行っていきます。まず、今回集計で使うAge
(年齢)カラムとFare
(乗船料金)のカラムの要約を見てみます。要約はdescribe
で行えます。
df[["Age", "Fare"]].describe()
全データ数が891なので、おおよそ20%の乗客の年齢が欠損していることが分かります。
まず乗客の年齢の平均値を取ってみます。平均値はmean
メソッドで取得できます。
df["Age"].mean()
全体での平均値は約30歳のようです。では、次にGroupByで男女別の平均値を見てみます。
df[["Sex", "Age"]].groupby("Sex").mean()
男性が約31歳、女性が28歳のようです。女性の方が若いですね。(小学生並みの感想…)
今回はmeanを使いましたが、他の集計関数には以下があります。是非上のreprで試してみてください。
count() | ユニークな要素数を返す |
size() | それぞれのグループのサイズを返す |
sum() | 合計を返す |
mean() | 平均を返す(averageと同じです) |
average() | 平均を返す |
std() | 標準偏差を返す |
var() | 分散を返す |
sem() | 各グループの平均の標準誤差を返す |
describe() | 列の他の統計量(mean, min, max, uniqueなど)を返す |
min() | 最小値を返す |
max() | 最大値を返す |
first() | 最初の値を返す |
last() | 最後の値を返す |
nth() | n番目の値を返す |
コメント