こんにちは。前回は、Pythonで機械学習を始めるための準備として、Anacondaのインストールと、Jupyter Notebook/LabまたはGoogle Colaboratoryの使い方について学びましたね。これで、いよいよPythonコードを書いて動かす準備が整いました。
さて、機械学習やデータ分析を行う上で、避けて通れないのが「データ」との対話です。多くの場合、データはExcelのような表形式で与えられます。これをPythonで扱う際に、強力な味方となるのが「Pandas(パンダス)」というライブラリです。
今回の記事では、このPandasを使って、初めて手にした表形式データを「まず観察する」ための基本的な操作を学びます。具体的には、以下のことができるようになります。
- PandasライブラリをPythonで使えるようにする「
import
」というおまじないの意味と使い方を理解する。 - Pandasの基本的なデータの形である「DataFrame(データフレーム)」を作成する簡単な方法を知る。
- 作成したDataFrameについて、以下の情報を取得・確認できるようになる。
- データの先頭部分 (
head()
) と末尾部分 (tail()
) を見て、どんなデータが入っているか雰囲気をつかむ。 - データが何行・何列あるのか、その「形」 (
shape
) を知る。 - データの全体的な情報(列ごとのデータ型、欠損していないデータの数、メモリ使用量など)を一覧で確認する (
info()
)。 - 各列がどのような種類のデータ(数値、文字など)を持っているか (
dtypes
) を確認する。
- データの先頭部分 (
これらの操作は、データ分析や機械学習モデルを作る前の「健康診断」のようなものです。データがどんな状態なのかを把握せずに分析を進めるのは、地図を持たずに知らない土地を歩くようなもの。まずはこの基本操作をしっかり身につけ、データと「仲良く」なる第一歩を踏み出しましょう。
Pandasとは? なぜデータ分析に必要なの?
Pandasは、Pythonでデータを効率的に操作・分析するために開発された、非常に人気のあるライブラリです。特に、Excelのような表形式のデータ(行と列で構成されるデータ)を扱うのが得意です。
皆さんもExcelは使ったことがあるかもしれません。データの入力、簡単な集計、並べ替えなどができますよね。Pandasは、それらの操作をPythonプログラムで行えるようにするだけでなく、Excelでは難しいような大量のデータ(数百万行以上!)の高速な処理や、複雑なデータの抽出・結合・変形などを、比較的簡単なコードで実現できるように設計されています。
機械学習では、多くの場合、まず元となるデータをPandasを使って読み込み、整理・加工(これを「前処理」と言います)してから、学習アルゴリズムに入力します。そのため、Pandasを使いこなすことは、機械学習を学ぶ上で非常に重要なスキルとなります。
ライブラリを使うための第一歩:import を理解しよう
さて、Pandasのような便利なライブラリを使うためには、まずPythonのプログラムに「これからPandasライブラリを使いますよ!」と宣言する必要があります。そのための命令が import
です。
import
は、料理に例えるなら、キッチンの棚(Pythonが元々持っている機能)だけでなく、特別な道具箱(ライブラリ)から、使いたい道具(機能)を取り出してくるようなイメージです。
Pandasライブラリを使う場合は、通常、ノートブック(JupyterやColab)の最初のセルで以下のように記述します。
import pandas as pd
これを分解して見てみましょう。
import pandas
: 「Pandasという名前のライブラリを使います」という意味です。これで、Pandasが提供する様々な機能が利用可能になります。as pd
: 「今インポートしたpandas
ライブラリを、これ以降はpd
という短い名前で呼びます」という意味です。
なぜ as pd
とつけるのでしょうか? Pandasライブラリの機能を使うとき、本来なら pandas.なんとか()
のように書く必要があるのですが、毎回 pandas
と書くのは少し長いですよね。そこで、pd
という短い別名(エイリアスと言います)をつけて、pd.なんとか()
のように書けるようにするのが慣習となっています。これは、世界中の多くのPythonプログラマーが使っている書き方なので、皆さんもこれに倣うのが良いでしょう。(pd
以外の名前にすることも可能ですが、特別な理由がない限り pd
を使うのが一般的です)
この import pandas as pd
は、Pandasを使うノートブックでは、ほぼ必ず最初に書くお決まりのコードだと覚えておいてください。
サンプルデータの準備:DataFrameを作ってみよう
それでは、実際にPandasを使ってデータを扱ってみましょう。まずは、練習用の簡単な表データが必要です。ここでは、Pythonの「辞書(dictionary)」というデータ形式を使って、手動でデータを作成し、それをPandasの「DataFrame(データフレーム)」という形式に変換してみます。
DataFrameとは、Pandasにおける中心的なデータ構造で、まさしくExcelのシートのような二次元の表形式データを表します。
以下のコードをJupyterやColabの新しいセルに入力して実行してください。
import pandas as pd # サンプルデータをPythonの辞書で作る data = { '社員ID': ['S001', 'S002', 'S003', 'S004', 'S005', 'S006', 'S007'], '氏名': ['佐藤 一郎', '鈴木 花子', '高橋 健太', '田中 優子', '伊藤 次郎', '渡辺 直美', '山本 翔太'], '部署': ['営業部', '開発部', '営業部', '人事部', '開発部', '営業部', '開発部'], '年齢': [35, 28, 41, 31, 25, 38, 29], '経験年数': [10, 5, 15, 8, 2, 12, 6], '評価スコア': [4.5, 4.8, 4.2, 4.0, 4.9, 3.8, 4.6] } # 辞書データからDataFrameを作成 df = pd.DataFrame(data) # 作成したDataFrameを表示 print(df)
このコードを実行すると、以下のような表が表示されるはずです。(print(df)
の代わりに、セルの最後に df
とだけ書いて実行しても、Jupyter/Colab環境では通常きれいに表示されます。)
社員ID 氏名 部署 年齢 経験年数 評価スコア
0 S001 佐藤 一郎 営業部 35 10 4.5
1 S002 鈴木 花子 開発部 28 5 4.8
2 S003 高橋 健太 営業部 41 15 4.2
3 S004 田中 優子 人事部 31 8 4.0
4 S005 伊藤 次郎 開発部 25 2 4.9
5 S006 渡辺 直美 営業部 38 12 3.8
6 S007 山本 翔太 開発部 29 6 4.6
何が起こったのか見ていきましょう。
import pandas as pd
: まずPandasライブラリを使えるようにしました。data = { ... }
: Pythonの辞書を使って、社員情報を格納しました。辞書では{}
の中にキー: 値
のペアをカンマ,
で区切って記述します。今回は、列名('社員ID'
,'氏名'
など)をキーとし、その列に対応するデータのリスト(['S001', 'S002', ...]
など)を値としています。df = pd.DataFrame(data)
: ここがPandasの機能を使っている部分です。pd.DataFrame()
という関数(機能)を呼び出し、引数として先ほど作成した辞書data
を渡しています。これにより、Pandasは辞書データを解釈し、表形式のデータ構造であるDataFrameに変換してくれます。そして、その結果をdf
という名前の変数に格納しました。(DataFrameの変数はdf
という名前で呼ばれることが多いです)print(df)
: 作成されたDataFramedf
の中身を表示しています。
表示された表を見てみましょう。
- 列 (Column): 一番上の行
'社員ID'
,'氏名'
,'部署'
などが列名(カラム名)です。これは元の辞書のキーに対応しています。 - 行 (Row): 各社員の情報が一行に対応しています。
- インデックス (Index): 一番左に表示されている
0, 1, 2, ...
という太字の数字が行の番号(ラベル)で、これをインデックスと呼びます。特に指定しない場合、Pandasは自動的に0から始まる連番をインデックスとして割り当てます。
これで、Pandasで扱う基本的なデータの形、DataFrameを用意できました。ここからは、この df
を使って、データの中身を調べる様々な操作を見ていきましょう。
データの中身を覗き見る: head() と tail()
実際のデータ分析では、何千、何万行もある巨大なデータを扱うことがよくあります。そんなときに、データ全体を一度に表示しようとすると、画面が埋め尽くされてしまい、かえって分かりにくくなります。
そこで役立つのが、データの先頭部分や末尾部分だけをサッと確認する機能です。
head() : データの先頭部分を表示
head()
メソッドは、DataFrameの最初の数行を表示します。デフォルトでは最初の5行が表示されます。
使い方:
DataFrame変数(ここでは df
)の後ろに .head()
とつけて実行します。メソッド(動作や機能を表すもの)なので、最後に ()
を忘れずにつけましょう。
# DataFrameの先頭5行を表示 df.head()
実行結果:
社員ID 氏名 部署 年齢 経験年数 評価スコア
0 S001 佐藤 一郎 営業部 35 10 4.5
1 S002 鈴木 花子 開発部 28 5 4.8
2 S003 高橋 健太 営業部 41 15 4.2
3 S004 田中 優子 人事部 31 8 4.0
4 S005 伊藤 次郎 開発部 25 2 4.9
このように、df
の先頭から5行が表示されました。
表示する行数を変えたい場合は、()
の中に数字を指定します。例えば、先頭3行だけ表示したい場合は、次のように書きます。
# DataFrameの先頭3行を表示 df.head(3)
実行結果:
社員ID 氏名 部署 年齢 経験年数 評価スコア
0 S001 佐藤 一郎 営業部 35 10 4.5
1 S002 鈴木 花子 開発部 28 5 4.8
2 S003 高橋 健太 営業部 41 15 4.2
head()
を使うことで、「このデータにはどんな列があって、具体的にどんな値が入っているのかな?」という最初の当たりをつけることができます。
tail() : データの末尾部分を表示
tail()
メソッドは head()
の逆で、DataFrameの最後の数行を表示します。こちらもデフォルトでは最後の5行が表示されます。
使い方:
DataFrame変数の後ろに .tail()
とつけて実行します。
# DataFrameの末尾5行を表示 df.tail()
実行結果:
社員ID 氏名 部署 年齢 経験年数 評価スコア
2 S003 高橋 健太 営業部 41 15 4.2
3 S004 田中 優子 人事部 31 8 4.0
4 S005 伊藤 次郎 開発部 25 2 4.9
5 S006 渡辺 直美 営業部 38 12 3.8
6 S007 山本 翔太 開発部 29 6 4.6
今回のサンプルデータは7行しかないので、head()
の結果と一部重複していますが、データが大量にある場合は、まったく異なる行が表示されます。
tail()
も head()
と同様に、()
の中に表示したい行数を指定できます。
# DataFrameの末尾2行を表示 df.tail(2)
実行結果:
社員ID 氏名 部署 年齢 経験年数 評価スコア
5 S006 渡辺 直美 営業部 38 12 3.8
6 S007 山本 翔太 開発部 29 6 4.6
head()
と tail()
を使うことで、データの全体像を掴む手がかりが得られます。例えば、データの並び順(古い順、新しい順など)を確認したり、データの末尾に集計行のような特殊な行が含まれていないかなどをチェックしたりするのに役立ちます。
データの大きさを知る: shape
データがどのくらいの規模なのか、つまり何行あって、何列あるのかを知ることは、分析を進める上で基本的な情報です。これを確認するには shape
という属性を使います。
使い方:
DataFrame変数の後ろに .shape
とつけます。head()
や tail()
と違って、これはメソッド(動作)ではなく属性(性質や特徴を表すもの)なので、後ろに ()
はつけません。
# DataFrameの形状(行数、列数)を表示 df.shape
実行結果:
(7, 6)
結果は (7, 6)
という形で表示されました。これは「タプル」と呼ばれるデータ形式で、(行数, 列数)
を意味します。つまり、このDataFrame df
は 7行、6列 のデータであることが分かりました。
データ分析を始める前に shape
を確認することで、「このデータは思ったより大きい(小さい)な」「列の数はこれくらいか」といった、データ量の全体感を把握できます。
データの詳細情報を一覧する: info()
head()
, tail()
, shape
でデータの見た目や大きさを確認しましたが、さらに詳しく、各列がどのような種類のデータを持っているのか、データに抜け(欠損値)はないか、といった内部的な情報をまとめて知りたい場合があります。そのための強力なツールが info()
メソッドです。
使い方:
DataFrame変数の後ろに .info()
とつけて実行します。これはメソッドなので、()
が必要です。
# DataFrameの概要情報を表示 df.info()
実行結果:
RangeIndex: 7 entries, 0 to 6
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 社員ID 7 non-null object
1 氏名 7 non-null object
2 部署 7 non-null object
3 年齢 7 non-null int64
4 経験年数 7 non-null int64
5 評価スコア 7 non-null float64
dtypes: float64(1), int64(2), object(3)
memory usage: 464.0+ bytes
この出力は少し情報量が多いですが、一つずつ見ていけば非常に役立つ情報が詰まっています。
: このデータdf
がPandasのDataFrameオブジェクトであることを示しています。まず型を確認する意味で重要です。RangeIndex: 7 entries, 0 to 6
: インデックス(行番号)に関する情報です。7 entries
: 全部で7行あることを示しています (shape
の行数と一致しますね)。0 to 6
: インデックスの範囲が0から6までであることを示しています。
Data columns (total 6 columns):
: 列に関する情報です。全部で6列あることを示しています (shape
の列数と一致します)。- その下の表形式の部分: ここが各列の詳細情報です。
#
: 列の番号(0から始まります)。Column
: 列名(社員ID
,氏名
など)。Non-Null Count
: ここが非常に重要です! この列に含まれる、「Nullではない」値の数を表します。「Null」とは、データが存在しない、欠けている状態(欠損値)を意味します。つまり、Non-Null Count
は、ちゃんと値が入っているデータの数を示しています。- 今回の例では、全ての列で
7 non-null
となっています。これは、全7行すべてにおいて、どの列にも値がちゃんと入っており、欠損値がないことを意味します。 - もし、ある列の
Non-Null Count
が全体の行数(ここでは7)よりも少なかったら、その差の分だけ欠損値が存在する、ということになります。例えば、もし評価スコア
が6 non-null
と表示されていたら、「評価スコア列には、1つデータが欠けている箇所があるな」と推測できます。欠損値の有無を素早くチェックできるのがinfo()
の大きな利点です。
- 今回の例では、全ての列で
Dtype
: その列のデータ型 (Data type) を示します。データが数値なのか、文字列なのか、などを表します。これについては次のセクションで詳しく見ます。
dtypes: float64(1), int64(2), object(3)
: DataFrame全体に含まれるデータ型の種類と、それぞれのデータ型を持つ列の数を示しています。float64
(浮動小数点数) の列が1つ (評価スコア
)int64
(整数) の列が2つ (年齢
,経験年数
)object
(主に文字列) の列が3つ (社員ID
,氏名
,部署
)
あることが分かります。
memory usage: 464.0+ bytes
: このDataFrameがコンピュータのメモリをどのくらい使用しているかの概算値です。データが非常に大きい場合に、メモリ効率を考える上で参考になります。
info()
メソッドは、このようにDataFrameの全体像、特に各列のデータ型と欠損値の有無を一目で把握できるため、データ分析の初期段階で必ず実行すべき非常に重要なコマンドです。
各列のデータ型を確認する: .dtypes
info()
でも各列のデータ型 (Dtype
) を確認できましたが、「データ型だけ」をシンプルに一覧表示したい場合には、.dtypes
属性が便利です。
使い方:
DataFrame変数の後ろに .dtypes
とつけます。これも属性なので、後ろに ()
はつけません。
# 各列のデータ型を表示 df.dtypes
実行結果:
社員ID object
氏名 object
部署 object
年齢 int64
経験年数 int64
評価スコア float64
dtype: object
このように、各列名とそのデータ型がペアで表示されます。info()
の出力からデータ型部分だけを抜き出したような形ですね。
ここで、info()
や dtypes
で表示される主なデータ型について、もう少し補足しておきましょう。
object
: Pandasでは、主に文字列 (string) を格納する列がこの型になります。数字と文字が混在している場合などもobject
型になることがあります。私たちのサンプルデータでは、社員ID
,氏名
,部署
がこれに該当します。int64
: 整数 (integer) を格納する列です。64
は情報を表現するために使うビット数を表しており、通常はこのint64
が使われます。年齢
,経験年数
がこれに該当します。float64
: 浮動小数点数 (floating-point number)、つまり小数を含む数値を格納する列です。こちらも64
ビットで表現されます。評価スコア
がこれに該当します。bool
: 真偽値 (boolean) を格納する列で、True
(真) またはFalse
(偽) のどちらかの値をとります。今回のサンプルデータには含まれていません。datetime64
: 日付や時刻 を格納する列です。例えば'2023-10-27'
のようなデータを扱う場合に使われます。今回のサンプルデータには含まれていません。
なぜデータ型を知ることが重要なのでしょうか? それは、データ型によってできる操作が異なるからです。例えば、数値型 (int64
, float64
) の列であれば、足し算や平均値の計算などができますが、文字列型 (object
) の列で同じことをしようとしても意味がありません(あるいはエラーになります)。データ型を正しく把握することで、その後のデータ加工や分析を適切に行うための基礎となります。info()
や dtypes
で意図しないデータ型になっている列を見つけたら、後々修正する必要があるかもしれません。
まとめ
今回は、Pythonの強力なデータ分析ライブラリであるPandasの第一歩として、DataFrameの全体像を把握するための基本的な操作を学びました。
- Pandasライブラリの準備:
import pandas as pd
という決まり文句で、Pandasを使える状態にすることを学びました。 - DataFrameの作成: Pythonの辞書から、Pandasの基本的な表形式データであるDataFrameを作成しました。
- データの観察(基本操作):
df.head()
: データの先頭(デフォルト5行)を表示し、中身の雰囲気をつかみました。df.tail()
: データの末尾(デフォルト5行)を表示しました。df.shape
: データの形状、つまり(行数, 列数)
を確認しました。df.info()
: DataFrameの詳細情報を一覧表示しました。特に、各列のデータ型 (Dtype
) と 欠損していないデータの数 (Non-Null Count
) を確認することが重要だと学びました。これにより、データ型が適切か、欠損値がどのくらいあるかを素早く把握できます。df.dtypes
: 各列のデータ型だけをシンプルに確認しました。主なデータ型 (object
,int64
,float64
) についても触れました。
これらの head()
, tail()
, shape
, info()
, dtypes
は、新しいデータセットを手に入れたときに、まず最初に実行すべき「お作法」のようなものです。これを行うことで、データがどんな構造で、どんな情報を持っていて、注意すべき点(欠損値など)はどこにあるのか、といった基本的な特性を理解することができます。
特に info()
は情報量が多いですが、慣れてくると非常に多くのことを読み取れるようになります。ぜひ、手元でコードを動かしながら、出力結果とデータの見方を繰り返し確認してみてください。
次回予告
今回はDataFrame全体の情報を把握する方法を学びましたが、実際の分析では、もっと具体的に「この列のデータだけ見たい」「特定の条件に合う行だけを取り出したい」といった操作が必要になります。
次回は、DataFrameから特定の「列」や「行」を選択して取り出す(スライシングする)方法について、具体的なコードとともに詳しく解説していきます。データの必要な部分だけを自在に扱えるようになると、データ分析の幅がぐっと広がりますよ。お楽しみに!