Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pandasで学ぶPythonデータ分析と可視化の基本

Pandas(パンダス)は、データサイエンスやデータ分析の分野で最も人気のあるPythonライブラリの一つです。データの操作・分析・クレンジング(前処理)を得意としており、C言語で実装された低レベルライブラリ「NumPy」の上位に位置する高レベルな抽象化として機能します。本記事では、アナリストやデータサイエンティストとして必ず押さえておきたい重要ポイントを順を追って解説します。

ライブラリのインストール

必要なライブラリはpipコマンドで簡単にインストールできます。ターミナル(コマンドプロンプト)で以下のコマンドを実行してください。

pip install pandas

DataFrame と Series ―― Pandasの二大データ構造

Pandasを使いこなすためには、「Series」と「DataFrame」という2つの基本データ構造をしっかり理解することが欠かせません。

Seriesとは

SeriesはPythonの組み込み型であるリスト(list)によく似たオブジェクトですが、各要素にラベル(インデックス)が対応付けられている点が大きな違いです。

>>> import pandas as pd
>>> my_series = pd.Series([12, 24, 36, 48, 60, 72, 84])
>>> my_series
0    12
1    24
2    36
3    48
4    60
5    72
6    84
dtype: int64

出力結果を見ると、左側に「index(インデックス)」、右側に「value(値)」が表示されています。また、各Seriesオブジェクトにはデータ型(dtype)が存在し、この例では int64 となっています。

インデックス番号を指定すれば、要素を簡単に取り出せます。

>>> my_series[6]
84

インデックス(ラベル)を明示的に指定したい場合は、次のように記述します。

>>> my_series = pd.Series([12, 24, 36, 48, 60, 72, 84], index=['ind0', 'ind1', 'ind2', 'ind3', 'ind4', 'ind5', 'ind6'])
>>> my_series
ind0    12
ind1    24
ind2    36
ind3    48
ind4    60
ind5    72
ind6    84
dtype: int64

複数の要素をインデックスでまとめて取得したり、一括で値を代入したりするのも非常に簡単です。

>>> my_series[['ind0', 'ind3', 'ind6']]
ind0    12
ind3    48
ind6    84
dtype: int64
>>> my_series[['ind0', 'ind3', 'ind6']] = 36
>>> my_series
ind0    36
ind1    24
ind2    36
ind3    36
ind4    60
ind5    72
ind6    36
dtype: int64

条件によるフィルタリングや算術演算も直感的に行えます。

>>> my_series[my_series > 24]
ind0    36
ind2    36
ind3    36
ind4    60
ind5    72
ind6    36
dtype: int64
>>> my_series[my_series < 24] * 2
Series([], dtype: int64)
>>> my_series
ind0    36
ind1    24
ind2    36
ind3    36
ind4    60
ind5    72
ind6    36
dtype: int64

その他にも、Seriesでよく使われる便利な操作があります。

>>> # 辞書のように扱える
>>> my_series1 = pd.Series({'a':9, 'b':18, 'c':27, 'd': 36})
>>> my_series1
a     9
b    18
c    27
d    36
dtype: int64
>>> # ラベル属性の設定
>>> my_series1.name = 'Numbers'
>>> my_series1.index.name = 'letters'
>>> my_series1
letters
a     9
b    18
c    27
d    36
Name: Numbers, dtype: int64
>>> # インデックスの変更
>>> my_series1.index = ['w', 'x', 'y', 'z']
>>> my_series1
w     9
x    18
y    27
z    36
Name: Numbers, dtype: int64

DataFrameとは

DataFrameは行と列を持つ、いわゆる「表(テーブル)」のようなデータ構造です。DataFrameの各列は1つのSeriesオブジェクトであり、行はそのSeries内の要素によって構成されています。

Pythonの組み込み辞書(dict)を使えば、DataFrameを簡単に作成できます。

>>> df = pd.DataFrame({
    'Country': ['China', 'India', 'Indonesia', 'Pakistan'],
    'Population': [1420062022, 1368737513, 269536482, 204596442],
    'Area' : [9388211, 2973190, 1811570, 770880]
})
>>> df
      Area    Country   Population
0  9388211      China   1420062022
1  2973190       India   1368737513
2  1811570   Indonesia    269536482
3   770880    Pakistan    204596442
>>> df['Country']
0        China
1        India
2    Indonesia
3     Pakistan
Name: Country, dtype: object
>>> df.columns
Index(['Area', 'Country', 'Population'], dtype='object')
>>> df.index
RangeIndex(start=0, stop=4, step=1)

要素へのアクセス方法

行インデックスを明示的に指定してデータへアクセスする方法は複数あります。

  • .loc を使い、インデックスラベルでアクセスする
  • .iloc を使い、インデックス番号(位置)でアクセスする
>>> df = pd.DataFrame({
    'Country': ['China', 'India', 'Indonesia', 'Pakistan'],
    'Population': [1420062022, 1368737513, 269536482, 204596442],
    'Landarea' : [9388211, 2973190, 1811570, 770880]
}, index = ['CHA', 'IND', 'IDO', 'PAK'])
>>> df
           Country  Landarea  Population
CHA          China   9388211  1420062022
IND          India   2973190  1368737513
IDO      Indonesia   1811570   269536482
PAK        Pakistan    770880   204596442
>>> df.index = ['CHI', 'IND', 'IDO', 'PAK']
>>> df.index.name = 'Country Code'
>>> df
                 Country  Landarea  Population
Country Code                                 
CHI                China   9388211  1420062022
IND                India   2973190  1368737513
IDO            Indonesia   1811570   269536482
PAK             Pakistan    770880   204596442
>>> df['Country']
Country Code
CHI              China
IND              India
IDO          Indonesia
PAK           Pakistan
Name: Country, dtype: object

行へのアクセスは、主に以下の2つの方法で行えます。

>>> # .loc:インデックスラベルを指定
>>> df.loc['IND']
Country            India
Landarea         2973190
Population    1368737513
Name: IND, dtype: object
>>> # .iloc:インデックス番号を指定
>>> df.iloc[1]
Country            India
Landarea         2973190
Population    1368737513
Name: IND, dtype: object
>>>
>>> # 複数行・特定列への同時アクセスも可能
>>> df.loc[['CHI', 'IND'], 'Population']
Country Code
CHI    1420062022
IND    1368737513
Name: Population, dtype: int64

ファイルの読み書き

PandasはCSV、XML、HTML、Excel、SQL、JSONなど、多くの一般的なファイル形式に対応しています。その中でも最も頻繁に使われるのがCSV形式です。

CSVファイルを読み込むには、次のように記述します。

>>> df = pd.read_csv('GDP.csv', sep = ',')

キーワード引数 sep は、GDP.csv 内で使用されている区切り文字(セパレータ)を指定しています。

集計とグループ化

Pandasでデータをグループ化するには、.groupby メソッドを使用します。ここではタイタニック号の乗客データセットを使って、集計とグループ化の実践的な使い方を紹介します。データセットは以下のリンクから入手できます。

https://yadi.sk/d/TfhJdE2k3EyALt

>>> titanic_df = pd.read_csv('titanic.csv')
>>> print(titanic_df.head())
PassengerID                                               Name   PClass   Age \
0            1                     Allen, Miss Elisabeth Walton   1st   29.00
1            2                      Allison, Miss Helen Loraine   1st    2.00
2            3                  Allison, Mr Hudson Joshua Creighton   1st   30.00
3            4  Allison, Mrs Hudson JC (Bessie Waldo Daniels)   1st   25.00
4            5                    Allison, Master Hudson Trevor   1st    0.92

     Sex   Survived   SexCode
0  female          1          1
1  female          0          1
2    male          0          0
3  female          0          1
4    male          1          0

それでは、男女別に何人の乗客が生存し、何人が亡くなったのかを .groupby を使って計算してみましょう。

>>> print(titanic_df.groupby(['Sex', 'Survived'])['PassengerID'].count())
Sex     Survived
female  0           154
        1           308
male    0           709
        1           142
Name: PassengerID, dtype: int64

続いて、同じデータを客室クラス別に見てみます。

>>> print(titanic_df.groupby(['PClass', 'Survived'])['PassengerID'].count())
PClass  Survived
*       0              1
1st     0            129
        1            193
2nd     0            160
        1            119
3rd     0            573
        1            138
Name: PassengerID, dtype: int64

Pandasによる時系列分析

実はPandasは、時系列データの分析を目的として開発されたライブラリです。ここではAmazonの5年分の株価データを使って説明します。データは以下のリンクからダウンロードできます。

https://finance.yahoo.com/quote/AMZN/history?period1=1397413800&period2=1555180200&interval=1mo&filter=history&frequency=1mo

>>> import pandas as pd
>>> amzn_df = pd.read_csv('AMZN.csv', index_col='Date', parse_dates=True)
>>> amzn_df = amzn_df.sort_index()
>>> print(amzn_df.info())
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 62 entries, 2014-04-01 to 2019-04-12
Data columns (total 6 columns):
Open         62 non-null object
High         62 non-null object
Low          62 non-null object
Close        62 non-null object
Adj Close    62 non-null object
Volume       62 non-null object
dtypes: object(6)
memory usage: 1.9+ KB
None

上記のコードでは、Date列をDatetimeIndexとして持つDataFrameを作成し、日付順にソートしました。

そして、2015年4月における終値の平均値は以下の通りです。

>>> amzn_df.loc['2015-04', 'Close'].mean()
421.779999

可視化(Visualization)

Pandasのデータは、matplotlibライブラリを使うことで簡単に視覚化できます。Amazonの株価履歴データをもとに、特定期間の価格推移をグラフで確認してみましょう。

>>> import matplotlib.pyplot as plt
>>> df = pd.read_csv('AMZN.csv', index_col = 'Date' , parse_dates = True)
>>> new_df = df.loc['2014-06':'2018-08', ['Close']]
>>> new_df = new_df.astype(float)
>>> new_df.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x0B9B8930>
>>> plt.show()

Pandasで学ぶPythonデータ分析と可視化の基本

  1. Pythonによるデータ分析と可視化入門|pandasの基本を徹底解説

    Pythonによるデータ分析と可視化の概要 Pythonには、データ分析と可視化のための強力なライブラリが数多く用意されています。代表的なものとしては、NumPy、pandas、matplotlib、seabornなどが挙げられます。本記事では、その中でも中心的な役割を果たすpandasについて詳しく解説します。pandasはNumPyをベースに構築されたオープンソースライブラリで、高速なデータ分析やデータのクリーニング・前処理を効率的に行えます。さらに、pandas自体にも便利な可視化機能が組み込まれています。 pandasのインストール方法 pandasをインストールするには、ターミナル

  2. Pythonで学ぶ探索的データ分析(EDA)の基本と実践

    データ分析において、探索的データ分析(Exploratory Data Analysis:EDA)は必ず最初に行うべきステップです。EDAを実施することで、以下のようなことが可能になります。データセットへの深い洞察を得るデータの背後にある構造を理解する重要なパラメータや、それらの間の関係性を抽出する前提となる仮説を検証するサンプルデータセットを使ったEDAの理解PythonでEDAを理解するために、サンプルデータはWebサイトから直接取得するか、ローカルディスクから読み込むことができます。ここでは、公開されているUCI Machine Learning Repositoryから「赤ワインの品質