【Pandas入門】データ分析のサンプル集

この記事では、Pythonとデータ分析ライブラリPandas」を行う方法についてサンプルコード付きで入門者向けに使い方を解説します。

【はじめに】Pandasとは

Pandasは、Python向けデータ分析用ライブラリです。
Pythonには様々なデータ分析ライブラリがありますが、このライブラリの大きな特徴は「R言語のデータフレームのような型」を持たせることができる点です。
つまり、R言語に似た使い方ができます。

データフレーム

気温 湿度 天候
2019-01-01 10.1 52.3
2019-01-02 8.2 41.8
2019-01-03 9.1 54.2

行ラベル(インデックスラベル:indexs)・・・2019-01-01、2019-01-02、2019-01-03
列ラベル(columns)・・・気温、湿度、天候

PythonとPandasの環境構築はこちら
1 Windows環境・・・Python環境を構築する方法
2 Pandasのインストール方法(WinPythonの場合は不要)

【配列作成】Series(1次元)、DataFrame(2次元)

Seriesとは、ラベルが付いた1次元配列です。
リストをSeriesに変換することで統計解析がやりやすくなります。
Pandasでは、Seriesメソッドを用いることで、リストからSeriesを生成できます。

Series

# -*- coding: utf-8 -*-
import pandas as pd

# リスト作成
data1 = [158, 157, 157]

# インデックスラベル
index_data = ['miho','saori','yukari']

# リストをSeriesに変換
data2 = pd.Series(data1, index=index_data)
print(data2)

"""
miho      158
saori     157
yukari    157
dtype: int64
"""
おすすめ記事
1 【Pandas】ラベル付き配列を生成 (Series)

DataFrame

DataFrameとは各行・列に対してラベルが付いた2次元配列です。
各行・列のラベルにより、データの操作が可能である点が普通の配列と異なる点です。
そのため、データをデータフレームに変換することで統計解析がやりやすくなります。

Pandasでは、DataFrameメソッドを用いることで、データフレームを生成できます。

書式 pandas.DataFrame(data)
返り値 データフレーム
# -*- coding: utf-8 -*-
import pandas as pd

# 辞書の作成
data = {
        'miho'  : [158, 82, 56, 84],
        'yukari': [157, 78, 58, 83],
        'saori' : [157, 85, 60, 86]
}

# データフレームの作成
df = pd.DataFrame(data)
print(df)
"""
    miho  saori  yukari
0   158    157     157
1    82     85      78
2    56     60      58
3    84     86      83
"""

miho,saori,yukariは各列のラベルです。
今回は各行のラベルは設定しなかったため、「0, 1, 2, 3」という行ラベルが自動で付加されています。

詳細記事
1 【Pandas】データフレームの作成

Pandasでは、DataFrameメソッドを用いることで、インデックスやラベルを付けたデータフレームを生成できます。

書式 pandas.DataFrame(data, index=インデックス)
返り値 データフレーム
# -*- coding: utf-8 -*-
import pandas as pd

# -*- coding: utf-8 -*-
import pandas as pd

# 辞書の作成
data = {
    'miho'  : [158, 82, 56, 84],
    'yukari': [157, 78, 58, 83],
    'saori' : [157, 85, 60, 86]
}

# インデックスラベル
index_data = ['身長', 'バスト', '体重', 'ヒップ']

# データフレームの初期化
df = pd.DataFrame(data, index = index_data)

# 表示
print(df)

"""
     miho  yukari  saori
身長    158     157    157
バスト    82      78     85
体重     56      58     60
ヒップ    84      83     86
"""

「車長、装填手、通信手」が各行のラベルです。

詳細記事
1 【Pandas】データフレームのインデックス設定

Pandasでは、date_rangeメソッドを用いることで、日付インデックス・ラベルを生成できます。

【書式】

pd.date_range(開始日付, 終了日付, オプション) 
オプション 機能
freq 周期(1日おきの日次データが欲しい場合は”D”を指定)
periods 取得したい要素の数(21日間欲しい場合は21、終了日付を指定してる場合は不要)

返り値:開始~終了日付のインデックス
2017年2月1日から21日分のラベル・インデックスを生成しました。

# -*- coding: utf-8 -*-
import pandas as pd

# 日時のインデックス作成
date = pd.date_range("20170201", periods=21)

# 表示
print(date)

"""
class 'pandas.tseries.index.DatetimeIndex'
[2017-02-01 00:00:00, ..., 2017-02-21 00:00:00]
Length: 21, Freq: D, Timezone: None
"""

date_rangeメソッドを用いることで、日付インデックス・ラベルを生成できます。
今回はこれを用いて、データフレームに生成した日付インデックスを追加してみました。

【書式】

pd.date_range(開始日付, 終了日付, オプション) 
オプション 機能
freq 周期(1日おきの日次データが欲しい場合は”D”を指定)
periods 取得したい要素の数(21日間欲しい場合は21、終了日付を指定してる場合は不要)

返り値:開始~終了日付のインデックス

# -*- coding: utf-8 -*-
import pandas as pd

data = {
    'miho'  : [158, 82, 56, 84],
    'yukari': [157, 78, 58, 83],
    'saori' : [157, 85, 60, 86]
}

# 日時のインデックス作成
date = pd.date_range("20170201", periods=4)
df = pd.DataFrame(data,index = date)

# 表示
print(df)

"""
            miho  saori  yukari
2017-02-01   158    157     157
2017-02-02    82     85      78
2017-02-03    56     60      58
2017-02-04    84     86      83
"""
詳細記事
1 【Pandas】日付インデックス・ラベルの作成
2 【Pandas】データフレームに日付インデックスを付加

【ファイル処理】CSV、Excelファイルの読み書き

Excelファイル、CSVファイルの読み書きを行います。

CSV読込

# -*- coding: utf-8 -*-
import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv("anko.csv", index_col=0)

# 表示
print(df)

Excel読込

# -*- coding: utf-8 -*-
import pandas as pd

# Excelファイルの読み込んでデータフレームに格納
df = pd.read_excel("test.xls")

# データフレームを表示
print(df)

CSV書込

# -*- coding: utf-8 -*-
import pandas as pd

# データフレームの初期化
df = pd.DataFrame({
    '名前' : ['西住みほ', '秋山優花里', '武部沙織', '五十鈴華', '冷泉麻子'],
    '身長' : [158, 157, 157, 163, 145]},
    index = ['車長', '装填手', '通信手', '砲手', '操縦手']
)

# ファイル出力
df.to_csv("anko.csv")

Excel書込

# -*- coding: utf-8 -*-
import pandas as pd

# データフレームの初期化
df = pd.DataFrame({
    '名前' : ['西住みほ', '秋山優花里', '武部沙織'],
    '身長' : [158, 157, 157]},
    index = ['車長', '装填手', '通信手']
)

# データフレームをExcelファイルに書き込む
df.to_excel("test.xlsx")
詳細記事
1 【Pandas】データフレームの読み込み(CSVファイル形式)
2 【Pandas】データフレームの読み込み(Excelファイル形式)
3 【Pandas】データフレームの保存(CSVファイル形式)
4 【Pandas】Excelファイルの書き込み(出力)

【DataFrame操作】行列の入替、昇順・降順ソート

行列の入替や昇順・降順ソートを行います。

# -*- coding: utf-8 -*-
import pandas as pd

# データ(辞書型)
data = {
    '名前' : ['西住みほ', '秋山優花里', '武部沙織'],
    '身長' : [158, 157, 157]}

# インデックスラベル
index_data = ['車長', '装填手', '通信手']

# データフレームの初期化
df = pd.DataFrame(data, index = index_data)
print(df)
"""
        名前   身長
車長    西住みほ  158
装填手  秋山優花里  157
通信手   武部沙織  157
"""


# 行列入れ替えて表示
print(df.T)
"""
      車長    装填手   通信手
名前  西住みほ  秋山優花里  武部沙織
身長   158    157   157
"""

# 行の並べ替え(指定したインデックスラベルの順に)
df2 = df.reindex(['装填手','通信手','車長'])
print(df2)

"""
        名前   身長
装填手  秋山優花里  157
通信手   武部沙織  157
車長    西住みほ  158
"""

# ラベル(身長)でソート(False:降順、true:昇順)
df3 = df.sort_values('身長', ascending=True)
print(df3)

"""
        名前   身長
装填手  秋山優花里  157
通信手   武部沙織  157
車長    西住みほ  158
"""

# インデックスラベルでソート
df4 = df.sort_index(axis=1, ascending=False)
print(df4)
"""
      身長     名前
車長   158   西住みほ
装填手  157  秋山優花里
通信手  157   武部沙織
"""
DataFrameの操作
基本 転置(行・列の入替)行を並替
ソート ラベル順インデックス順

【DataFrame操作】データの取り出し、基本統計量の計算

# -*- coding: utf-8 -*-
import pandas as pd

# データ(辞書型)
data = {
    '名前' : ['西住みほ', '秋山優花里', '武部沙織'],
    '身長' : [158, 157, 157]}

# インデックスラベル
index_data = ['車長', '装填手', '通信手']

# データフレームの初期化
df = pd.DataFrame(data, index = index_data)
print(df)
"""
        名前   身長
車長    西住みほ  158
装填手  秋山優花里  157
通信手   武部沙織  157
"""


# インデックスの参照
print(df.index) # Index([車長, 装填手, 通信手], dtype=object)


# ラベルの参照
print(df.columns) # Index([名前, 身長], dtype=object) 


# データ型の参照
print(df.dtypes)
"""
名前 object
役割 object
身長 int64
dtype: object 
"""


# ラベル「身長」データの基本統計量
print(df['身長'].describe())
"""
count 3.000000
mean 157.333333
std 0.577350
min 157.000000
25% 157.000000
50% 157.000000
75% 157.500000
max 158.000000 
"""


# 値の取得
print(df.values)
"""
[[西住みほ' 158L]
 ['秋山優花里' 157L]
 ['武部沙織' 157L]]
"""


# ラベル「名前」の値を参照
print(df['名前'].values) # ['西住みほ' '秋山優花里' '武部沙織']
"""
['西住みほ' '秋山優花里' '武部沙織']
"""


# ラベル・インデックスを指定して値を参照
print(df.loc[['車長', '装填手'], ['名前', '身長']])
"""
        名前   身長
車長    西住みほ  158
装填手  秋山優花里  157
"""


# ラベル・インデックスの範囲を指定して値を参照
print(df.loc['車長':'装填手', '名前':'身長'])
"""
        名前   身長
車長    西住みほ  158
装填手  秋山優花里  157
"""


# 行列を番号で参照(0~1行目、0列)
print(df.iloc[[0, 1], [0]])
"""
        名前
車長    西住みほ
装填手  秋山優花里
"""

# ラベル(列)を参照
print(df['名前'])
"""
車長      西住みほ
装填手    秋山優花里
通信手     武部沙織
Name: 名前, dtype: object
"""
DataFrameの操作
情報取得 インデックスラベルデータ型基本統計量
値取得 全てラベル指定インデックス・ラベル指定列指定行・列指定行・列指定(番号)

【統計処理】基本統計量、多変量解析

DataFrameから基本統計量の計算、多変量解析を行います。

# -*- coding: utf-8 -*-
import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv("artoria.csv", index_col=0)

# 合計
sum = df['ATK'].sum()
print("sum:", sum) # sum:93566

# 平均
mean = df['ATK'].mean()
print("mean:", mean) # mean:10396.2222222

# 中央値
median = df['ATK'].median()
print("median:", median) # median: 10995.0

# 最大値
dfmax = df['ATK'].max()
print("max:", dfmax) # max: 11761

# 最小値
dfmin = df['ATK'].min()
print("min:", dfmin) # min: 7726

# データ数
N = df['ATK'].count()
print("N:", N) # N: 9

# 標準偏差
std = df['ATK'].std()
print("std:", std) # std: 1265.9073601351895

# 分散
var = df['ATK'].var()
print("var:", var) # var: 1602521.4444444445

artoria.csv

鯖名,クラス,ATK,HP,レアリティ
アルトリア,剣,11221,15150,5
アルトリア(オルタ),剣,10248,11589,4
アルトリア(リリイ),剣,7726,10623,4
アルトリア(槍),槍,10995,15606,5
アルトリア(槍オルタ),槍,9968,11761,4
アルトリア(水着),弓,11276,14553,5
アルトリア(サンタオルタ),騎,9258,11286,4
謎のヒロインX,殺,11761,12696,5
謎のヒロインX(オルタ),狂,11113,14175,5
詳細記事
1 【Pandas】列の合計、平均、中央、分散、標準偏差、最大、最小、他を計算

多変量解析などを行うには、機械学習ライブラリ「Scikit-learn」を使います。

【応用例】Excel処理、株価

Pandasの応用例
Excel Excelのグラフ化
株価 Pandas-datareaderで日経平均株価の取得
投資 株価分析
参考 e-stat総務省統計局:データサイエンススクールto-kei.net
関連記事