Skip to main content

データ分析ライブラリ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, CabinNon-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.csvtest_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の基本は以上です。これらの操作を組み合わせることで、非常に複雑なデータ操作も可能になります。次のステップでは、これらのデータをグラフにして、より直感的に理解する方法を学びます。