データ分析ライブラリPandas入門 (演習付き)
Pandasは、Pythonでデータを扱うための強力なライブラリです。Excelの表計算のように、データを自由自在に読み込み、確認し、加工できます。このページでは、タイタニックのデータを使いながら、Pandasの基本的な操作を学びましょう。
(前提:前のページの手順に従い、train.csvがColabにアップロードされ、train_dfという変数に読み込まれていること。)
1. データの全体像を掴む
まず、読み込んだデータがどのようなものか、全体像を把握するための便利な命令(メソッド)を使ってみましょう。
# train.csvを読み込む(再掲)
import pandas as pd
train_df = pd.read_csv('train.csv')
# データの最初の5行を表示
print("--- .head() ---")
print(train_df.head())
# データの最後の5行を表示
print("\n--- .tail() ---")
print(train_df.tail())
# データの行数と列数を表示 (行数, 列数)
print("\n--- .shape ---")
print(train_df.shape)
# 各列のデータ型や欠損値の数などを一覧表示
print("\n--- .info() ---")
print(train_df.info())
# 数値データの基本的な統計量を表示(平均、標準偏差、最小値、最大値など)
print("\n--- .describe() ---")
print(train_df.describe())
info() の見方
.info()は非常に重要です。Age, CabinのNon-Null Count(非ヌル値の数)が、全体のRangeIndex: 891 entriesよりも少ないことがわかります。これは、これらの列に**欠損値(データ抜け)**があることを意味しており、後の前処理で対応が必要になります。
2. データを選択する(スライシング)
表の中から特定の列や行を抜き出す方法を学びます。
列の選択
# 'Sex'(性別)の列だけを抜き出す
sex_column = train_df['Sex']
print(sex_column.head())
# 複数の列('Pclass', 'Age', 'Survived')を抜き出す
# [[...]]のように、リストで指定するのがポイント
subset = train_df[['Pclass', 'Age', 'Survived']]
print(subset.head())
行の選択(条件指定)
これがPandasの強力な機能です。特定の条件に合致する行だけをフィルタリングできます。
# 30歳より年上の乗客だけを抜き出す
over_30 = train_df[train_df['Age'] > 30]
print(over_30.head())
# Pclassが1(1等客室)の乗客だけを抜き出す
fclass_1 = train_df[train_df['Pclass'] == 1] # '='が2つなのに注意!
print(fclass_1.head())
# 複数の条件を組み合わせることも可能
# 「30歳以上」かつ「女性」の乗客
# & は「かつ」、| は「または」を意味します
over_30_female = train_df[(train_df['Age'] > 30) & (train_df['Sex'] == 'female')]
print(over_30_female.head())
3. データを集計する
データからインサイトを得るために、簡単な集計を行ってみましょう。
# 生存者(1)と死亡者(0)がそれぞれ何人いるか数える
survived_counts = train_df['Survived'].value_counts()
print(survived_counts)
# -> 0: 549人, 1: 342人
# 男女の数をそれぞれ数える
sex_counts = train_df['Sex'].value_counts()
print(sex_counts)
# -> male: 577人, female: 314人
# 乗客の平均年齢を計算する
average_age = train_df['Age'].mean()
print(f"乗客の平均年齢: {average_age}")
# Pclassごとに生存率の平均を計算する (グループ化)
# groupbyは非常に強力な集計機能です
survival_rate_by_pclass = train_df.groupby('Pclass')['Survived'].mean()
print(survival_rate_by_pclass)
# -> Pclass 1の人は生存率が高い(62%)ことがわかる
演習問題
それでは、学んだことを使って、以下の問いに答えるコードを書いてみましょう!
問1: Fare(運賃)の平均はいくらですか?
問2: Embarked(乗船港)ごとの乗客数はそれぞれ何人ですか? (ヒント: .value_counts())
問3: 生存した乗客(Survivedが1)の中で、最も年齢が高かった乗客の情報を表示してください。 (ヒント: .max())
問4: test.csv を test_df として読み込み、test_df に含まれる乗客の平均年齢を計算してください。
解答例
# 問1
avg_fare = train_df['Fare'].mean()
print(f"問1の答え: {avg_fare}")
# 問2
embarked_counts = train_df['Embarked'].value_counts()
print("\n問2の答え:")
print(embarked_counts)
# 問3
survived_df = train_df[train_df['Survived'] == 1]
max_age_survivor = survived_df['Age'].max()
print(f"\n問3の答え: 生存者の最高年齢は {max_age_survivor} 歳です。")
# 問4
test_df = pd.read_csv('test.csv')
avg_age_test = test_df['Age'].mean()
print(f"\n問4の答え: テストデータの乗客の平均年齢は {avg_age_test} 歳です。")
Pandasの基本は以上です。これらの操作を組み合わせることで、非常に複雑なデータ操作も可能になります。次のステップでは、これらのデータをグラフにして、より直感的に理解する方法を学びます。