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: int64DataFrameとは
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: int64Pandasによる時系列分析
実は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()
-
Pythonによるデータ分析と可視化入門|pandasの基本を徹底解説
Pythonによるデータ分析と可視化の概要 Pythonには、データ分析と可視化のための強力なライブラリが数多く用意されています。代表的なものとしては、NumPy、pandas、matplotlib、seabornなどが挙げられます。本記事では、その中でも中心的な役割を果たすpandasについて詳しく解説します。pandasはNumPyをベースに構築されたオープンソースライブラリで、高速なデータ分析やデータのクリーニング・前処理を効率的に行えます。さらに、pandas自体にも便利な可視化機能が組み込まれています。 pandasのインストール方法 pandasをインストールするには、ターミナル
-
Pythonで学ぶ探索的データ分析(EDA)の基本と実践
データ分析において、探索的データ分析(Exploratory Data Analysis:EDA)は必ず最初に行うべきステップです。EDAを実施することで、以下のようなことが可能になります。データセットへの深い洞察を得るデータの背後にある構造を理解する重要なパラメータや、それらの間の関係性を抽出する前提となる仮説を検証するサンプルデータセットを使ったEDAの理解PythonでEDAを理解するために、サンプルデータはWebサイトから直接取得するか、ローカルディスクから読み込むことができます。ここでは、公開されているUCI Machine Learning Repositoryから「赤ワインの品質