[Pythonのはじめ方] Part29: Pandasによるデータ分析入門

Python

これまでのステップでPythonの基礎をしっかり学んできましたね!Step 7では、いよいよPythonをデータ分析の強力なツールとして活用する方法を学びます。その中心となるのがPandasライブラリです。

Pandasは、Pythonでデータ操作や分析を行うための非常に人気のあるライブラリです。表形式のデータ(Excelのシートやデータベースのテーブルのようなデータ)を効率的に扱うためのデータ構造と機能を提供します。これを使えば、データの読み込み、クリーニング、変換、集計などが簡単に行えるようになります。さあ、Pandasの世界へ飛び込みましょう!🚀

1. Pandasのインストール

まず、Pandasを使うためにはインストールが必要です。Pythonのパッケージ管理ツールであるpipを使って簡単にインストールできます。ターミナル(Windowsの場合はコマンドプロンプト)を開いて、以下のコマンドを実行してください。

pip install pandas

Jupyter Notebookを使っている場合は、ノートブックのセルに!をつけて実行することもできます。

!pip install pandas

💡 ヒント:

Anacondaディストリビューションを利用している場合は、Pandasは通常、最初からインストールされています。もしインストールされていない場合や、特定のバージョンが必要な場合はconda install pandasコマンドでインストールできます。

インストールが完了したら、PythonスクリプトやJupyter Notebookでimport pandas as pdと記述してPandasを読み込むのが一般的です。pdという別名を使うのが慣習となっています。

import pandas as pd

# インストールされたPandasのバージョンを確認
print(pd.__version__)

2. Pandasの主要なデータ構造

Pandasには主に2つのデータ構造があります。これらを理解することがPandasを使いこなす第一歩です。

Seriesは、1次元のラベル付き配列です。イメージとしては、インデックス(ラベル)が付いたリストや、Excelの1列のようなものです。同じデータ型のデータを保持します。

リストからSeriesを作成する例:

import pandas as pd

# リストデータ
data = [10, 20, 30, 40, 50]
# インデックス(ラベル)
labels = ['a', 'b', 'c', 'd', 'e']

# Seriesを作成
s = pd.Series(data, index=labels)
print(s)

出力結果:

a    10
b    20
c    30
d    40
e    50
dtype: int64

インデックスを指定しない場合、0から始まる整数のインデックスが自動的に割り当てられます。

DataFrameは、2次元のラベル付きデータ構造で、異なる型の列を持つことができます。ExcelのシートやSQLのテーブルに最も近い概念です。データ分析で最もよく使われるデータ構造です。

辞書からDataFrameを作成する例:

import pandas as pd

# 辞書データ(キーが列名になる)
data = {
    '名前': ['田中', '佐藤', '鈴木', '高橋'],
    '年齢': [25, 32, 41, 28],
    '部署': ['営業', '開発', '人事', '営業']
}

# DataFrameを作成
df = pd.DataFrame(data)
print(df)

出力結果:

  名前  年齢  部署
0  田中  25  営業
1  佐藤  32  開発
2  鈴木  41  人事
3  高橋  28  営業

DataFrameは、行と列の両方にインデックス(ラベル)を持ちます。上記の例では、行インデックスは自動的に0から割り当てられています。

3. データの読み込み

データ分析では、外部ファイル(CSV、Excelなど)からデータを読み込むことが頻繁にあります。Pandasはこれらの操作を簡単に行うための関数を提供しています。

特にCSV (Comma-Separated Values) ファイルは、データ交換によく使われる形式です。pd.read_csv()関数を使ってCSVファイルをDataFrameに読み込むことができます。

例として、data.csvというファイルがあるとします。

import pandas as pd

# data.csvファイルを読み込む
# ファイルパスは環境に合わせて変更してください
try:
    df_csv = pd.read_csv('data.csv')
    # 読み込んだデータの最初の5行を表示
    print(df_csv.head())
except FileNotFoundError:
    print("エラー: data.csv が見つかりません。")
    # サンプルデータフレームを作成して続行
    data = {'col1': [1, 2, 3], 'col2': ['A', 'B', 'C']}
    df_csv = pd.DataFrame(data)
    print("\nサンプルデータフレーム:")
    print(df_csv)

# Web上のCSVファイルを直接読み込むことも可能
# 例: url = 'https://example.com/data.csv'
# df_web = pd.read_csv(url)
# print(df_web.head())

⚠️ 注意:

read_csv()には多くのオプションがあります。例えば、区切り文字がカンマでない場合(sep='\t'など)、ヘッダーがない場合(header=None)、特定の列だけを読み込む場合(usecols=['列名1', '列名2'])など、状況に応じて指定できます。詳しくは公式ドキュメントを参照してください。

同様に、Excelファイルを読み込むにはpd.read_excel()関数を使用します。(別途openpyxlなどのライブラリが必要になる場合があります: pip install openpyxl

4. 基本的なデータ操作

DataFrameを読み込んだら、次はその中身を確認し、必要な形に加工していきます。Pandasにはそのための豊富な機能があります。

特定の列を選択するには、列名を指定します。

# DataFrame 'df' が存在すると仮定
# サンプルDataFrame
data = {
    '名前': ['田中', '佐藤', '鈴木', '高橋'],
    '年齢': [25, 32, 41, 28],
    '部署': ['営業', '開発', '人事', '営業']
}
df = pd.DataFrame(data)

# '名前'列を選択 (Seriesが返る)
names = df['名前']
print("名前列:")
print(names)

# 複数の列を選択 (DataFrameが返る)
subset = df[['名前', '部署']]
print("\n名前と部署列:")
print(subset)

特定の行を選択するには、loc (ラベルベース) や iloc (整数インデックスベース) を使います。

# loc: ラベル(インデックス名)で選択
# 1行目(インデックスが1)を選択
row_1_loc = df.loc[1]
print("\nloc[1]:")
print(row_1_loc)

# iloc: 整数インデックス(行番号)で選択
# 3行目(0から数えて2番目)を選択
row_2_iloc = df.iloc[2]
print("\niloc[2]:")
print(row_2_iloc)

# 範囲選択も可能
# locは終了ラベルを含む
print("\nloc[0:2]:") # インデックス0, 1, 2を選択
print(df.loc[0:2])

# ilocは終了位置を含まない (Pythonのスライスと同じ)
print("\niloc[0:2]:") # 0行目, 1行目を選択
print(df.iloc[0:2])

# 行と列を同時に選択
# loc[行ラベル, 列ラベル]
print("\nloc[1, '年齢']:")
print(df.loc[1, '年齢']) # 1行目の'年齢'

# iloc[行番号, 列番号]
print("\niloc[2, 0]:")
print(df.iloc[2, 0]) # 2行目の0列目 ('鈴木')

特定の条件を満たす行だけを抽出することも簡単です。

# 年齢が30歳以上の人を抽出
adults = df[df['年齢'] >= 30]
print("\n年齢が30歳以上の人:")
print(adults)

# 部署が'営業'の人を抽出
sales_dept = df[df['部署'] == '営業']
print("\n営業部の人:")
print(sales_dept)

# 複数の条件 (AND: & , OR: | )
# 年齢が30歳以上 かつ 部署が営業
sales_adults = df[(df['年齢'] >= 30) & (df['部署'] == '営業')]
print("\n30歳以上の営業部の人:")
print(sales_adults)

💡 ヒント:

複数の条件を組み合わせる際は、各条件を()で囲むことを忘れないでください。

実際のデータには、値が入っていない「欠損値」(Pandasでは通常 NaN: Not a Number で表現される)が含まれることがよくあります。

import numpy as np # NaNを使うためにNumPyもインポート

# 欠損値を含むサンプルDataFrame
data_missing = {
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, 11, 12]
}
df_missing = pd.DataFrame(data_missing)
print("\n欠損値を含むデータ:")
print(df_missing)

# 欠損値の確認 (Trueが欠損値)
print("\n欠損値の確認 (isnull):")
print(df_missing.isnull())

# 欠損値を含む行を削除
df_dropped_rows = df_missing.dropna()
print("\n欠損値を含む行を削除 (dropna):")
print(df_dropped_rows)

# 欠損値を含む列を削除
df_dropped_cols = df_missing.dropna(axis=1)
print("\n欠損値を含む列を削除 (dropna axis=1):")
print(df_dropped_cols)

# 欠損値を特定の値で埋める (例: 0で埋める)
df_filled_zero = df_missing.fillna(0)
print("\n欠損値を0で埋める (fillna):")
print(df_filled_zero)

# 欠損値を列の平均値で埋める
# まずは列'A'の平均値を計算
mean_A = df_missing['A'].mean()
# 列'A'の欠損値を平均値で埋める
df_missing['A'] = df_missing['A'].fillna(mean_A)
print("\n列Aの欠損値を平均値で埋める:")
print(df_missing)

欠損値をどのように扱うか(削除するか、何らかの値で補完するか)は、データや分析の目的に応じて慎重に判断する必要があります。

Pandasを使えば、データの基本的な統計量を簡単に計算できます。

# DataFrame 'df' を再度使用
print("\n元のデータ:")
print(df)

# 各列の基本統計量 (数値列のみ)
print("\n基本統計量 (describe):")
print(df.describe())

# 特定の列の平均値
mean_age = df['年齢'].mean()
print(f"\n平均年齢: {mean_age}")

# 特定の列の合計値
total_age = df['年齢'].sum()
print(f"年齢合計: {total_age}")

# 特定の列の最大値
max_age = df['年齢'].max()
print(f"最高年齢: {max_age}")

# グループごとの集計 (例: 部署ごとの平均年齢)
mean_age_by_dept = df.groupby('部署')['年齢'].mean()
print("\n部署ごとの平均年齢 (groupby):")
print(mean_age_by_dept)

5. まとめ

今回は、Pandasを使ったデータ分析の入門として、基本的な概念と操作方法を学びました。

  • Pandasのインストール方法
  • 主要なデータ構造: Series と DataFrame
  • CSVファイルなどからのデータ読み込み (read_csv)
  • データの選択 (列選択, loc, iloc)
  • 条件によるフィルタリング
  • 欠損値の扱い (isnull, dropna, fillna)
  • 基本的な集計 (describe, mean, sum, max, groupby)

Pandasには、ここで紹介した以外にも非常に多くの強力な機能があります。データの結合、変形、時系列データの扱いなど、さらに高度な分析が可能です。

次のステップでは、同じくデータ分析でよく使われるMatplotlibライブラリを使って、データを視覚化する方法を学びます。📊 グラフにすることで、データの傾向やパターンがより明確になりますよ!

💪 チャレンジ:
身の回りの簡単なデータ(例えば、毎日の勉強時間や読書記録など)をCSVファイルに記録し、Pandasで読み込んで平均値や合計値を計算してみましょう!

6. 参考情報

より詳しく学びたい方は、以下の公式ドキュメントを参照することをお勧めします。

本ブログ記事で使用しているCSSフレームワーク:

コメント

タイトルとURLをコピーしました