【完全版】pandasの基本を1日で身につける!データ分析入門ガイド

データ分析に欠かせないPythonライブラリ「pandas」。
多次元のデータ処理を直感的に行えるパワフルなツールですが、初心者にとってはハードルが高く感じられるかもしれません。
しかし、pandasの基本的な使い方をマスターすれば、データ分析の生産性を飛躍的に高めることができます。
本記事では、pandasの基礎から実践的なデータ分析の例まで、わかりやすく解説していきます。
データ分析のスキルを身につけたい方は、ぜひ本記事を参考にしてください。

この記事を読んだらわかること
  • pandasの基本的なデータ構造であるSeriesとDataFrameの使い方
  • CSVやExcelファイルからデータを読み込む方法
  • データの抽出、集計、変形、結合などの基本的な処理方法
  • 欠損値や重複データへの対処方法
  • groupbyとpivot_tableを使った高度なデータ集計方法
  • pandasを使ったデータの可視化方法
  • 実践的なデータ分析の例とそのコードサンプル

目次

pandasとは?データ分析に欠かせないライブラリの概要

pandasは、Pythonでデータ分析を行うために欠かせないライブラリで、非常に柔軟で高速なデータ操作を可能にします。
特に、pandasのDataFrameと呼ばれる2次元のデータ構造は、Excelのようなテーブル形式のデータを直感的に扱えるため、データ分析の生産性を大幅に向上させてくれます。

pandasを使うメリット – データハンドリングの時間を大幅に短縮

pandasを使えば、大量のセンサーデータを効率的に処理したり、アンケート結果などのデータを簡単に集計・可視化したりできます。
また、複数のデータソースを結合して、総合的な分析を行うこともできます。

例えば、こんなことが簡単にできてしまいます。

  • 1秒間に1000件以上のデータが発生するようなセンサーデータから、必要な情報だけを抽出する
  • 数万件のアンケート結果を、年齢や性別などのグループごとに集計して比較する
  • 会員情報、購買履歴、ウェブの閲覧履歴など、異なるデータベースのデータを結合して、マーケティング施策を立案する

しかも、pandasを使えば、こうしたデータ処理をExcelよりはるかに高速に、SQLよりもずっと手軽に行えてしまうのです。

pandasのインストール方法 – pip一発で環境構築完了

pandasは、以下のワンラインのコマンドを実行するだけで、簡単にインストールできます。

pip install pandas

あとは、以下のようにインポートして使い始めるだけ。

import pandas as pd

これだけで、pandasの膨大な機能を使ってデータ分析を始められます。
例えばCSVファイルは、以下のコードで読み込むことができます。

df = pd.read_csv('data.csv')

そして、データの中身は、

print(df.head())

と書くだけで、先頭5行を簡単に確認できてしまいます。

このように、pandasを使えば、少ないコード量で直感的にデータ分析を進められるのです。
それでは、次はpandasのDataFrameなど、キーとなるデータ構造について詳しく見ていきましょう。

pandasの基本オブジェクト – Series と DataFrame を理解する

pandasを使ったデータ分析を始める前に、まず押さえておくべきなのが、SeriesとDataFrameという2つの基本オブジェクトです。
SeriesとDataFrameは、pandasでデータを扱う上で欠かせない構成要素ですが、初心者にとってはその違いがわかりにくいポイントでもあります。
そこで、この章ではSeriesとDataFrameの特徴を一つずつ見ていきましょう。

Series – 1次元のデータ構造

Seriesは、pandasにおける1次元のデータ構造です。
ズバリ、Excelで言うところの「列」だと思ってください。
例えば、以下のような1列のデータをSeriesで表現できます。

  • ある商品の日別の売上個数
  • ある地点で計測された1時間ごとの気温
  • ある生徒の各教科のテストの点数

Seriesは、このような1次元の数値データを、ラベル付きで保持するのに便利なオブジェクトなのです。
Seriesを作るには、以下のように書きます。

import pandas as pd

sales = pd.Series([10, 20, 15, 30, 25])
print(sales)

出力結果:

0    10
1    20
2    15
3    30
4    25
dtype: int64

こうして、pd.Series()に1次元のリストやndarrayを渡すだけで、Seriesが生成されます。
先頭の0, 1, 2…というのが、各データのラベル(インデックス)です。

DataFrame – 2次元のデータ構造

一方、DataFrameは、pandasの2次元のデータ構造です。
Excelでいうところの「表」だと思ってください。
以下のような、複数の変数(列)からなる表形式のデータを表現するのに最適です。

  • ある店舗の、日別・商品別の売上データ
  • ある地域の、年別・月別の平均気温と降水量
  • ある学校の、生徒ごとの各教科の試験の点数

DataFrameは、このような2次元の表形式データを扱う上で欠かせない存在です。
そして、各列がSeriesに対応しています。
DataFrameは、複数のSeriesを組み合わせたものと考えることもできるわけです。

DataFrameは、以下のように辞書形式で生成できます。

import pandas as pd

data = {
    "商品A": [10, 20, 15, 30, 25], 
    "商品B": [5, 10, 8, 12, 15],
    "商品C": [8, 12, 10, 15, 20]
}

df = pd.DataFrame(data)
print(df)

出力結果:

   商品A  商品B  商品C
0    10     5     8
1    20    10    12
2    15     8    10
3    30    12    15
4    25    15    20

このように、各列にラベル(列名)を持ったデータをDataFrameで表現できます。
そして、DataFrameの各列は、Seriesとして取り出すことができます。

print(df["商品A"])

出力結果:

0    10
1    20
2    15
3    30
4    25
Name: 商品A, dtype: int64

以上のように、SeriesとDataFrameはpandasによるデータ分析の基礎となるオブジェクトです。
そして、実際のデータ分析では、SeriesとDataFrameに対するさまざまな操作を組み合わせることで、目的の結果を導き出していきます。
次の章では、そうしたDataFrameの実践的な使い方を見ていくことにしましょう。

DataFrameの基本操作マスター – データ分析の土台を築こう

pandasでデータ分析を行う上で、DataFrameの操作をマスターすることは非常に重要です。
データの読み込みから加工、集計、可視化に至るまで、あらゆる場面でDataFrameに対する操作が登場するからです。
ここでは、DataFrameの基本的な操作方法を一つずつ見ていきましょう。
これらの操作を身につけることが、pandasを使ったデータ分析の土台となります。

DataFrameの生成 – いろいろなデータから表を作る

DataFrameを生成する方法は、主に3つあります。

1つ目は、Pythonのリストや辞書からDataFrameを作る方法です。
前の章で紹介したように、以下のようなコードでDataFrameを生成できます。

import pandas as pd

data = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data)

2つ目は、NumPyのndarrayからDataFrameを作る方法です。
ndarrayを渡す際は、列名を別途指定する必要があります。

import numpy as np

data = np.array([[1, 2], [3, 4]])
df = pd.DataFrame(data, columns=['col1', 'col2'])

3つ目は、CSVファイルやExcelファイルからDataFrameを作る方法です。
データ分析の現場では、この方法を使うことが最も多いでしょう。
read_csv()関数やread_excel()関数を使うだけで、ファイルからDataFrameを生成できます。

df = pd.read_csv('data.csv')

このように、DataFrameの生成方法は複数ありますが、目的に応じて適切な方法を選べばOKです。
次は、生成したDataFrameからデータを取り出す方法を見ていきましょう。

DataFrameの参照 – 行や列を自在に取り出す

DataFrameからデータを取り出すには、行や列を指定して参照する方法と、条件を指定して抽出する方法の2種類があります。

1つ目の方法は、以下のようにカラム名やインデックス(ラベル)を使って行や列を指定する方法です。

print(df['col1'])  # col1の列を取得
print(df.loc[0])   # インデックスが0の行を取得

ここで、locはインデックスラベルを使った参照、ilocは整数位置を使った参照をする際に使います。

2つ目の方法は、条件を指定してデータを抽出する方法です。
例えば、col1の値が1より大きいデータだけを抽出したい場合は、以下のように書きます。

print(df[df['col1'] > 1])  # col1が1より大きい行を抽出

このように、[ ]内に条件式を書くことで、条件を満たすデータだけを抽出できます。
複数の条件を指定する場合は、&や|を使って条件式を組み合わせます。

print(df[(df['col1'] > 1) & (df['col2'] < 4)])  # col1が1より大きく、かつcol2が4より小さい行を抽出

以上のように、DataFrameからデータを取り出す方法を使い分けることで、分析に必要なデータを自在に取り出せるようになります。

DataFrameの編集 – 新しい列の追加や値の更新

DataFrameは、新しい列を追加したり、既存の値を更新したりすることができます。

新しい列を追加するには、以下のように新しいカラム名を[ ]で指定し、値を代入します。

df['new_col'] = df['col1'] + df['col2']  # col1とcol2の和を新しい列として追加

このように、既存の列を使った計算結果を新しい列として追加することもできますし、定数値を代入することもできます。

df['constant_col'] = 1  # 全ての行に1を代入した列を追加

既存の値を更新するには、locやilocを使って更新したい場所を指定し、新しい値を代入します。

df.loc[0, 'col1'] = 10  # インデックスが0の行のcol1の値を10に更新

以上のようにDataFrameを編集することで、分析に必要な新しい指標を追加したり、データを修正したりすることができます。

最後に、DataFrameの集計方法とデータの並び替え方法を簡単に紹介しておきます。

各列の合計値や平均値などを求めるには、sum()やmean()などの関数を使います。

print(df.sum())   # 各列の合計値を算出
print(df.mean())  # 各列の平均値を算出

データを並び替えるには、sort_values()関数を使います。

print(df.sort_values('col1'))  # col1の値で昇順に並び替え

以上で、DataFrameの基本操作については一通り紹介しました。
ここで紹介した操作を組み合わせるだけで、多くの分析タスクをこなすことができます。
pandasの使い方を身につけるためには、実際のデータを使って分析をする中で、これらの操作を試してみることが大切です。
次の章では、実際のデータ分析の例を見ていくことにしましょう。

ファイルの読み書き – CSVやエクセルとのデータのやり取り

データ分析の現場では、CSVやエクセルなどの形式でデータをやり取りすることが非常に多くあります。
分析のインプットとなるデータが、CSVやエクセルで提供されていたり、分析の結果をCSVやエクセルで出力して他の人と共有したりするケースが多いためです。
そのため、pandasでCSVやエクセルファイルを読み書きする方法を知っておくことは、データ分析を効率的に進める上で欠かせません。
ここでは、pandasを使ったCSVとエクセルの読み書きの基本的な方法を見ていきましょう。

CSVファイルの読み込み・書き出し

CSVは、Comma-Separated Values(カンマ区切り値)の略で、文字通りカンマ(,)で区切られたテキストファイルのことです。
pandasでは、read_csv()関数を使ってCSVファイルを読み込み、to_csv()関数を使ってCSVファイルに書き出すことができます。

例えば、以下のようなCSVファイル(data.csv)があるとします。

id,name,age,city
1,Alice,24,Tokyo
2,Bob,30,Osaka
3,Charlie,20,Nagoya

このCSVファイルをpandasで読み込むには、以下のようにread_csv()関数を使います

import pandas as pd

df = pd.read_csv('data.csv')
print(df)

出力結果:

   id     name  age    city
0   1    Alice   24   Tokyo
1   2      Bob   30   Osaka
2   3  Charlie   20  Nagoya

見ての通り、CSVファイルがDataFrameとして読み込まれました。
列名は、CSVの1行目がヘッダーとして使われています。

逆に、DataFrameをCSVファイルに書き出すには、to_csv()関数を使います

df.to_csv('output.csv', index=False)

これで、DataFrameがCSVファイル(output.csv)に書き出されました。
index=Falseを指定しているのは、行番号(インデックス)を出力しないためです。

read_csv()とto_csv()には、他にも区切り文字やエンコーディングなどを指定するオプションがあるので、データの特性に合わせて適切に設定することが大切です。

エクセルファイルの読み込み・書き出し

エクセルファイル(.xlsx)も、データ分析ではよく使われるファイル形式です。
pandasでは、read_excel()関数を使ってエクセルファイルを読み込み、to_excel()関数を使ってエクセルファイルに書き出すことができます。

例えば、以下のようなエクセルファイル(data.xlsx)があるとします。

idnameagecity
1Alice24Tokyo
2Bob30Osaka
3Charlie20Nagoya
data.xlsx

このエクセルファイルをpandasで読み込むには、以下のようにread_excel()関数を使います。

import pandas as pd

df = pd.read_excel('data.xlsx')
print(df)

出力結果:

   id     name  age    city
0   1    Alice   24   Tokyo
1   2      Bob   30   Osaka
2   3  Charlie   20  Nagoya

CSVの場合と同様に、エクセルファイルがDataFrameとして読み込まれました。

逆に、DataFrameをエクセルファイルに書き出すには、to_excel()関数を使います。

df.to_excel('output.xlsx', index=False)

これで、DataFrameがエクセルファイル(output.xlsx)に書き出されました。

read_excel()とto_excel()には、読み込むシートや範囲を指定するオプションもあるので、必要に応じて活用しましょう。

以上のように、pandasを使えば、CSVやエクセルファイルの読み書きを手軽に行うことができます。
ただし、CSVとエクセルにはそれぞれ長所と短所があります。

  • CSVは、シンプルで軽量、多くのソフトウェアで扱える。ただし、データ型の情報は持たない。
  • エクセルは、見た目を整えられる、複数シートを持てる。ただし、ファイルサイズが大きくなりがち。

データの特性や用途に応じて、適切なファイル形式を選ぶことが重要です。
また、ファイルの読み書きの際は、文字エンコーディングや区切り文字など、データの特性に合わせた設定が必要なので注意が必要です。

pandasのファイル入出力機能を使いこなせば、データ分析の作業効率を大きく高めることができるでしょう。
次の章では、読み込んだデータを分析に適した形に整えるための、データの前処理テクニックを見ていくことにしましょう。

データの前処理テクニック – 欠損値や重複への対処法

データ分析を行う上で、データの前処理は欠かせないプロセスです。
特に、欠損値や重複データは、そのままでは分析の質を大きく損ねる恐れがあります。
欠損値があると、統計量の計算が歪んだり、機械学習モデルの性能が低下したりします。
重複データがあると、集計結果が不正確になったり、分析の前提が崩れたりします。
このような問題を避けるために、欠損値や重複データを適切に処理することが重要なのです。

ここでは、pandasを使った欠損値と重複データの処理方法を見ていきましょう。

欠損値の確認と除去・補完

欠損値とは、データの中で値が空白やNaNになっている部分のことです。
欠損値は、データの収集や入力の際のミスによって生じることが多いですが、時には意図的に設定されている場合もあります。

pandasでは、欠損値を表すためにNaN(Not a Number)という特殊な値が使われます。
欠損値を処理する前に、まずはデータの中にどの程度の欠損値が含まれているかを確認しましょう。
isnull()メソッドを使うと、各要素が欠損値かどうかを真偽値で返してくれます。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [1, 2, np.nan, 4],
                   'B': [5, np.nan, np.nan, 8],
                   'C': [9, 10, 11, 12]})

print(df.isnull())

出力結果:

       A      B      C
0  False  False  False
1  False   True  False
2   True   True  False
3  False  False  False

このように、各要素が欠損値かどうかを確認できます。
欠損値の割合が高い列や、欠損値を含む行が多い場合は、何らかの処理が必要になります。

欠損値の処理方法は、大きく分けて除去と補完の2つがあります。
除去は、欠損値を含む行や列をデータから取り除く方法です。
dropna()メソッドを使うと、欠損値を含む行や列を削除できます。

print(df.dropna())

出力結果:

     A    B   C
0  1.0  5.0   9
3  4.0  8.0  12

このように、欠損値を含む行が削除されました。
ただし、欠損値の割合が高い場合、除去によってデータ量が大きく減ってしまうことがあるので注意が必要です。

補完は、欠損値を何らかの値で埋める方法です。
fillna()メソッドを使うと、欠損値を特定の値や統計量で補完できます。

print(df.fillna(0))

出力結果:

     A    B     C
0  1.0  5.0   9.0
1  2.0  0.0  10.0
2  0.0  0.0  11.0
3  4.0  8.0  12.0

このように、欠損値が0で補完されました。
他にも、前後の値から補完する方法や、平均値や中央値で補完する方法などがあります。
補完に使う値は、データの性質や分析の目的に応じて適切に選ぶ必要があります。

重複データの確認と削除

重複データとは、同じ内容のデータが複数存在している状態のことです。
重複データは、データの重複登録や、複数のデータソースを結合する際に生じることが多いです。

pandasでは、duplicated()メソッドを使って、重複行を特定できます。

import pandas as pd

df = pd.DataFrame({'A': [1, 1, 2, 3],
                   'B': [4, 4, 5, 6],
                   'C': [7, 7, 9, 10]})

print(df.duplicated())

出力結果:

0    False
1     True
2    False
3    False
dtype: bool

このように、重複行にTrueが表示されました。
重複データを削除するには、drop_duplicates()メソッドを使います。

print(df.drop_duplicates())

出力結果:

   A  B   C
0  1  4   7
2  2  5   9
3  3  6  10

このように、重複行が削除されました。
ただし、重複データの削除は、データの性質や分析の目的を踏まえて慎重に行う必要があります。
単純に重複を削除すると、重要な情報を失ってしまう恐れがあるためです。

以上のように、pandasを使えば、欠損値や重複データを簡単に処理できます。
ただし、これらの処理は、分析の結果に大きな影響を与える可能性があります。
そのため、欠損値や重複データの処理は、データの性質や分析の目的を十分に考慮した上で、慎重に行うことが大切です。

欠損値については、削除するか補完するかを、欠損の理由や割合、分析の目的に応じて判断しましょう。
重複データについては、重複を許容するか削除するかを、データの性質や分析の目的に応じて判断しましょう。

データの前処理は、分析の質を左右する重要なプロセスです。
欠損値や重複データへの適切な対処は、そのための第一歩です。
pandasの機能を活用して、データを分析に適した形に整えていきましょう。

次の章では、整然となったデータを使って、データの変形と集約を行う方法を見ていくことにしましょう。

データの変形と集約 – groupbyとpivot_tableを使いこなす

データ分析では、データを要約して傾向を掴んだり、集計表を作成してレポートを作成したりする場面が多くあります。
このようなデータの変形と集約を行う上で、pandasのgroupbyとpivot_tableは非常に強力なツールとなります。
groupbyは、データをグループ化して各グループの統計量を算出するのに使います。
pivot_tableは、複数の変数を組み合わせてクロス集計表を作成するのに使います。
これらを使いこなすことで、データからより多くの知見を引き出せるようになるでしょう。

ここでは、groupbyとpivot_tableの使い方を具体的に見ていきます。

groupbyによるデータの集約

groupbyは、指定したカラムの値に基づいてデータをグループ化し、各グループに対して集計関数を適用するメソッドです。
以下のようなデータフレームがあるとします。

import pandas as pd

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': [1, 2, 3, 4, 5, 6],
                   'data2': [10, 20, 30, 40, 50, 60]})
print(df)

出力結果:

  key  data1  data2
0   A      1     10
1   B      2     20
2   C      3     30
3   A      4     40
4   B      5     50
5   C      6     60

このデータフレームに対して、keyカラムでグループ化し、data1data2の合計を求めるには、以下のようにgroupbyを使います。

print(df.groupby('key').sum())

出力結果:

     data1  data2
key             
A        5     50
B        7     70
C        9     90

このように、keyカラムの値ごとにdata1data2の合計が算出されました。
groupbyには、sum()以外にもmean()、count()、max()、min()など、様々な集計関数を適用できます。

また、groupbyの結果は、DataFrameGroupByオブジェクトになります。
このオブジェクトに対して、集計関数を複数回適用することもできます。

grouped = df.groupby('key')
print(grouped.sum())
print(grouped.mean())

出力結果:

     data1  data2
key             
A        5     50
B        7     70
C        9     90
     data1  data2
key             
A      2.5   25.0
B      3.5   35.0
C      4.5   45.0

このように、一度groupbyの結果を変数に格納しておけば、その変数に対して複数の集計関数を適用できます。
これは、同じグループ化の条件で複数の集計を行う場合に便利です。

pivot_tableで○○別の集計表を作る

pivot_tableは、データフレームを再形成して、指定した行と列でクロス集計表を作成する関数です。
以下のようなデータフレームがあるとします。

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
                   'B': ['A', 'B', 'C'] * 4,
                   'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
                   'D': np.random.randn(12),
                   'E': np.random.randn(12)})
print(df)

出力結果:

        A  B    C         D         E
0     one  A  foo  0.474654  0.407514
1     one  B  foo  0.726539  0.151765
2     two  C  foo -0.396534  0.047281
3   three  A  bar  0.083069 -1.151999
4     one  B  bar  1.253229  2.248631
5     one  C  bar -0.658151  0.911478
6     two  A  foo -1.930595  0.096299
7   three  B  foo  1.296026 -0.787606
8     one  C  foo -2.018439  0.849116
9     one  A  bar  0.206940 -2.976317
10    two  B  bar -0.624973  0.120199
11  three  C  bar  1.880416 -0.208522

このデータフレームに対して、ABをインデックスとし、Cを列、Dの平均値を値とするクロス集計表を作成するには、以下のようにpivot_tableを使います。

print(pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C']))

出力結果:

C             bar       foo
A     B                    
one   A  0.526307 -0.351517
      B -0.646131  1.770274
      C  0.029726  0.390142
three A  0.067735       NaN
      B       NaN -1.102544
      C  1.712608       NaN
two   A       NaN  0.284748
      B  2.211319       NaN
      C       NaN -1.566213

このように、ABの組み合わせごとに、Cの値に応じてDの平均値が算出された集計表が作成されました。
NaNは欠損値を表しています。

pivot_tableには、集計関数や欠損値の扱いを指定するオプションもあります。
例えば、欠損値を0で補完し、集計関数をメジアンにするには、以下のようにします。

print(pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc='median', fill_value=0))

出力結果:

C             bar       foo
A     B                    
one   A -0.434998  0.290534
      B -0.817293 -1.483834
      C  0.563883  0.099110
three A -1.562436  0.000000
      B  0.000000 -0.271499
      C -1.236549  0.000000
two   A  0.000000  0.165393
      B  0.514467  0.000000
      C  0.000000 -0.975100

このように、pivot_tableは集計表の作成を柔軟にカスタマイズできる点が特徴です。

以上のように、groupbyとpivot_tableは、データの変形と集約を行う上で非常に強力なツールです。
groupbyは、単一のカラムでグループ化して各グループの統計量を算出するのに適しています。
pivot_tableは、複数のカラムを使ってクロス集計表を作成するのに適しています。

データ分析では、生のデータをそのまま見るだけでは、データの持つ意味を十分に引き出せません。
データを適切に変形し、集約することで、はじめてデータからの知見が得られるのです。
groupbyとpivot_tableを使いこなすことは、データ分析のスキルを高める上で欠かせません。

ぜひ、実際のデータを使ってgroupbyとpivot_tableを試してみてください。
データを色々な角度から集計し、可視化することで、新たな発見があるはずです。
次の章では、pandasを使ってデータを可視化する方法を見ていきます。

pandasで簡単データ可視化 – グラフ作成の基本

データ分析において、データを可視化することは非常に重要です。
グラフを使ってデータを視覚的に表現することで、データの分布や傾向を直感的に理解することができます。
しかし、データ可視化は敷居が高いと思われがちです。
専門的なツールを使ったり、高度なプログラミングが必要だったりと、ハードルが高く感じる人も多いでしょう。

そんな中、pandasを使えば、簡単にデータを可視化することができます。
ここでは、pandasを使ったデータ可視化の基本的な方法を見ていきましょう。

列の値をプロットして分布を見る

データ分析では、まずデータの分布を確認することが重要です。
データがどのような範囲の値を取っているのか、どの値に集中しているのかを把握することが、分析の第一歩となります。

このような分布の確認には、ヒストグラムが適しています。
ヒストグラムは、データの値の範囲を幾つかの区間に分割し、各区間に該当するデータの数をバーの高さで表現したグラフです。

pandasでヒストグラムを作成するには、DataFrame.hist()メソッドを使います。
以下は、正規分布に従う乱数を1000個生成し、そのヒストグラムを作成する例です。

注意

図示のためにmatplotlibライブラリを使っています!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ランダムデータの生成
df = pd.DataFrame({'A': np.random.randn(1000)})

# ヒストグラムの作成と表示
df.hist(bins=20, figsize=(8, 6))
plt.show()

このコードでは、1000個の乱数を生成し、DataFrameの列’A’に格納しています。
そして、df.hist()でヒストグラムを作成しています。
bins=20は、ヒストグラムの区間の数を20に設定しています。

上のコードを実行すると、以下のようなヒストグラムが表示されます。

このように、わずか数行のコードで、データの分布を視覚的に確認することができます。

2つの列の関係を可視化する

次に、2つの変数の関係を調べるために、散布図を作成してみましょう。
散布図は、2つの変数の値を2次元平面上にプロットしたグラフです。
これを見ることで、2つの変数の間に関係があるかどうかを視覚的に判断することができます。

pandasで散布図を作成するには、DataFrame.plot.scatter()メソッドを使います。
以下は、2つの正規分布に従う乱数を1000個ずつ生成し、その散布図を作成する例です。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ランダムデータの生成
df = pd.DataFrame({'A': np.random.randn(1000), 'B': np.random.randn(1000)})

# 散布図の作成と表示
df.plot.scatter(x='A', y='B')
plt.show()

このコードでは、2つの乱数列を生成し、DataFrameの列’A’と’B’に格納しています。
そして、df.plot.scatter(x=’A’, y=’B’)で、’A’を横軸、’B’を縦軸とする散布図を作成しています。

上のコードを実行すると、以下のような散布図が表示されます。

このように、pandasを使えば、2つの変数の関係を手軽に可視化することができます。

以上、pandasでのデータ可視化の基本的な方法を見てきました。
pandasのplot()メソッドを使えば、ヒストグラムや散布図などのグラフを、わずか数行のコードで作成できます。

データ可視化は、データ分析に欠かせないスキルです。
グラフを使ってデータを視覚的に表現することで、データからより多くの知見を引き出すことができます。
pandasのデータ可視化機能を使いこなせば、データ分析の幅が大きく広がるはずです。
まずは、自分のデータをpandasで可視化してみることをおすすめします。

次の章では、これまで学んだpandasの機能を使って、実際のデータ分析にチャレンジしてみましょう。

pandasを使ったデータ分析の実践 – コードサンプル3選

ここまで、pandasの基本的な使い方を学んできました。
データの読み込み、加工、集計、可視化など、一通りの操作方法を身につけたことと思います。
しかし、データ分析のスキルを本当に身につけるためには、実際のデータを使った分析の実践が欠かせません。

そこで、この章では、pandasを使ったデータ分析の実践的なコードサンプルを3つ紹介します。
これらのコードサンプルを通じて、データ分析の一連の流れを体験し、pandasの使い方をより深く理解することを目指します。

売上データから商品別・月別の売上推移を分析

最初のコードサンプルでは、売上データを使って、商品別・月別の売上推移を分析します。
このような分析は、各商品の売上傾向を把握し、需要の変動を確認するのに役立ちます。

使用するデータは、商品ID、売上日付、売上金額を含む売上データです。
以下のようなデータをサンプルとして用意しました。

import pandas as pd

data = {'商品ID': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
        '売上日付': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-02-01', '2023-02-02', '2023-02-03', '2023-03-01', '2023-03-02', '2023-03-03'],
        '売上金額': [100, 200, 300, 400, 500, 600, 700, 800, 900]}

df = pd.DataFrame(data)

このデータに対して、以下の手順で分析を進めていきます。

  1. 日付から月を抽出する
  2. 商品別・月別に売上を集計する
  3. 結果を可視化する

まず、売上日付から月を抽出します。
これには、pd.to_datetime()で日付文字列を日付型に変換し、dt.strftime()で月部分を抽出します。

df['月'] = pd.to_datetime(df['売上日付']).dt.strftime('%Y-%m')

次に、groupbyを使って商品別・月別に売上を集計します。

df_grouped = df.groupby(['商品ID', '月']).sum().reset_index()

最後に、pivotを使って集計結果を商品ID×月の形に変形し、棒グラフで可視化します。

df_pivot = df_grouped.pivot(index='月', columns='商品ID', values='売上金額')
df_pivot.plot.bar()

以上が、売上データから商品別・月別の売上推移を分析するコードサンプルです。
pandasのgroupbyとpivotを使うことで、データの集計と可視化を簡潔に行うことができました。

アンケート結果からユーザーを属性別にセグメント

次のコードサンプルでは、アンケート結果を使って、ユーザーを属性別にセグメンテーションします。
このような分析は、ユーザーの属性によってニーズや嗜好の違いを把握するのに役立ちます。

使用するデータは、年齢、性別、職業、満足度などを含むアンケート結果データです。
以下のようなデータをサンプルとして用意しました。

import pandas as pd

data = {'年齢': ['10代', '20代', '30代', '40代', '50代', '60代', '10代', '20代', '30代'],
        '性別': ['男性', '女性', '男性', '女性', '男性', '女性', '男性', '女性', '男性'], 
        '満足度': [4, 5, 3, 4, 2, 3, 5, 4, 3]}

df = pd.DataFrame(data)

このデータに対して、以下の手順で分析を進めていきます。

  1. 属性の分布を可視化する
  2. 属性の組み合わせごとに満足度を集計する
  3. 結果を可視化する

まず、年齢と性別の分布を棒グラフで可視化します。
これには、pandasのvalue_counts()とplot.bar()を使います。

df['年齢'].value_counts().plot.bar()
df['性別'].value_counts().plot.bar()

次に、年齢と性別の組み合わせごとに満足度の平均を集計します。
これには、groupbyとpivot_tableを使います。

df_pivot = pd.pivot_table(df, values='満足度', index='年齢', columns='性別', aggfunc='mean')

最後に、集計結果をヒートマップで可視化します。
これには、seabornのheatmap()を使います。

import seaborn as sns

sns.heatmap(df_pivot, cmap='YlGnBu', annot=True)

以上が、アンケート結果からユーザーを属性別にセグメンテーションするコードサンプルです。
pandasのgroupbyとpivot_tableを使うことで、属性の組み合わせごとの集計を簡潔に行うことができました。

時系列データから需要予測モデルを構築

最後のコードサンプルでは、時系列データを使って、需要予測モデルを構築します。
このような分析は、過去の販売実績から将来の需要を予測し、適切な在庫管理を行うのに役立ちます。

使用するデータは、日付、商品ID、販売数量を含む販売実績データです。
以下のようなデータをサンプルとして用意しました。

import pandas as pd

data = {'日付': pd.date_range(start='2022-01-01', end='2023-12-31', freq='D'),
        '商品ID': ['A'] * 365 * 2,
        '販売数量': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 73}

df = pd.DataFrame(data)

このデータに対して、以下の手順で分析を進めていきます。

  1. 日付からトレンドと季節性を抽出する
  2. 需要予測モデルを構築する
  3. モデルの精度を評価する

まず、日付からトレンドと季節性を抽出します。
これには、pandasのto_datetime()とdt.dayofyear、statsmodelsのseasonal_decompose()を使います。

import statsmodels.api as sm

df['日付'] = pd.to_datetime(df['日付'])
df['トレンド'] = df.index
df['季節性'] = df['日付'].dt.dayofyear

decomposition = sm.tsa.seasonal_decompose(df['販売数量'], model='additive', period=365)
df['トレンド'] = decomposition.trend
df['季節性'] = decomposition.seasonal

次に、トレンドと季節性を特徴量として、需要予測モデルを構築します。
ここでは、ランダムフォレストを使います。

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

X = df[['トレンド', '季節性']]
y = df['販売数量']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestRegressor(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

最後に、テストデータを使ってモデルの精度を評価します。
これには、sklearn.metrics のmean_absolute_error()を使います。

from sklearn.metrics import mean_absolute_error

y_pred = model.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'MAE: {mae:.2f}')

以上が、時系列データから需要予測モデルを構築するコードサンプルです。
pandasとscikit-learnを使うことで、時系列データの特徴量エンジニアリングと機械学習モデルの構築を行うことができました。

警告

ここではpandasのコード例を示すためにめちゃくちゃな分析を行っています。実際の分析の現場では目的や必要に応じた分析手法を用いてください。

いかがでしたか。
これらのコードサンプルを通じて、pandasを使ったデータ分析の一連の流れを体験していただけたかと思います。
実際のデータ分析では、データの理解、前処理、集計、可視化、モデリングなど、様々なフェーズがあります。
そして、それぞれのフェーズでpandasの機能が活用されています。

データ分析のスキルを身につけるには、このようなコードサンプルを自分で実行してみるのが一番です。
サンプルコードを動かすだけでなく、データを変えてみたり、別の分析を試してみたりと、いろいろ実験してみることをおすすめします。

pandasは、データ分析を行う上で欠かせないツールです。
ぜひ、pandasを使いこなして、データから価値ある知見を引き出せるデータアナリストを目指してください。

公式ドキュメント

関連記事

pandasのlocメソッド徹底解説!基本から応用までの使い方をマスターしよう 【完全版】pandasのdropメソッドを極める!使い方から応用まで7つのテクニック 【図解】pandasのgroupbyを使いこなす!集計・要約のコツから応用テクニックまで完全網羅 【完全版】図解とコード例で学ぶpandas concatの使い方!データ結合を効率化するテクニック5選 【完全解説】pandas read_csvの使い方マスター!10の実践的テクニックでデータ分析を効率化 【pandas徹底解説】merge関数の使い方を7つのユースケースで完全マスター!