はじめに
AIや機械学習の分野で注目を集めているPython言語。注目される理由の一つに「AIや機械学習に必要なライブラリが豊富にそろっている」ことが挙げられます。
今回は、そんな豊富なライブラリの中から、AIや機械学習の肝であるデータ解析・データ分析のライブラリで有名な pandas をご紹介します。
本記事では pandas を利用したデータを読み込み、集計や分析の基礎を実際のコードを紹介しながら「pandasの基礎」を説明していきます。
語句説明
Pandas とは?
Wikipedia では、以下のように記載されています。
pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。
pandas の主要なコードの一部はC言語で書かれており、Python だけでデータ分析を行うより非常に高速に処理を行うことができるようになっています。
データ分析(データサイエンス)は、機械学習の精度に影響する前処理(データの読み込み、クリーニング、欠損値の補完、正規化など)で、最も重要だと言われています。pandas を使うことで前処理が効率的に行えるようになるため、Pythonで AI や機械学習を行うには必須のライブラリとなっています。
準備:開発環境と解析用データ
開発環境
今回はWindows上で、VS Code を使った実行環境を使っています。ターミナル(プロンプト)から Python を実行できる環境がある方は、それでも問題ありません。
OS | Windows10 Pro [20H2] |
エディター・ターミナル | Visual Studio Code v1.52.1 |
Python | 3.7.4 |
numpy | 1.19.4 |
pandas | 1.2.0 |
Windows10 20xx で出る numpy のエラー対処
Windows10 20xx のバージョンでは、Runtime エラーが発生します。
エラーとなる機能は、本ページでは使用しませんので以下のように対処します。
エラーメッセージ
(略) fails to pass a sanity check due to a bug in the windows runtime. See this issue ... (略)
コード修正箇所 (Workaround)
1 2 3 4 5 6 7 |
# c:\Users\xxxx\AppData\Local\Programs\Python\Python37\Lib\site-packages\numpy\__init__.py # Line.304 らへん if sys.platform == "win32" and sys.maxsize > 2**32: pass # 追加 # _win_os_check() # コメントアウト |
解析用データ
「国税調査結果 - 男女別人口」からデータをダウンロードして加工しています。
必要な方は、加工後のデータを以下からダウンロードください。
- 文字コードを UTF-8 に変換
- 近畿地方(大阪、兵庫、京都、奈良、和歌山、滋賀、三重)のみのデータを抜粋
- 合計人数の列を削除し、男性・女性の人数のみにする
- 1900年代(c01.csv)と2000年代(c02.csv)のデータに分割
本記事では、解析用データと実行するPythonスクリプトを以下のような配置で説明しています。
必要に応じて、適宜読み替えてください。
ファイルの配置
(任意のディレクトリ)/
|- c01.csv
|- c02.csv
|- prefectures_id.csv
|- (実行するPythonスクリプト)
基礎①:データの読み込み
まずは、CSV形式のデータを読み込んでみましょう。
データを読み込んでPythonプログラム上で扱えないと、分析や解析ができません。
スクリプト
以下のようなPythonスクリプトを準備し、データを読み込んでみましょう。
1 2 3 4 |
import pandas as pd c01 = pd.read_csv('c01.csv') print(c01.head()) |
Pythonスクリプトの解説
1行目は、Pythonライブラリの pandas を読み込んでいます。スクリプト内部では、
pd を使ってアクセスできるようにしています。
2行目は、pandas の read_csv() を使用し、CSV 形式のファイルを pandas のデータフレーム型として
変数 c01 へ格納しています。
3行目は、読み込んだ c01 の先頭5行を取得する pandas の head() を使用し、print() で出力しています。
スクリプト実行結果
1 2 3 4 5 6 7 |
prefectures_id prefectures_name year man woman 0 24 三重県 1920 525957 543313 1 25 滋賀県 1920 313737 337313 2 26 京都府 1920 650780 636367 3 27 大阪府 1920 1344846 1243001 4 28 兵庫県 1920 1175426 1126373 |
pandas メソッドの仕様
- read_csv()
CSVファイルへのパスを引数で指定し、読み込むことができます - head()
引数がない場合、先頭5行を取得できます
引数で行数を指定することが可能です
基礎②:データの結合(ユニオン/ジョイン)
縦・行方向に結合(ユニオン)
以下のようなPythonスクリプトを用意し、データを縦方向(行方向)に結合してみましょう。
1 2 3 4 5 6 7 |
import pandas as pd c01 = pd.read_csv('c01.csv') c02 = pd.read_csv('c02.csv') tables = pd.concat([c01, c02], ignore_index=True) print(tables.head()) print(tables.tail()) |
Pythonスクリプトの解説
1~3行目は、先の「データの読み込み」と同じですので省略します。
4行目、pandas の concat() を使ってユニオンを行っています。
5~6行目、head() は先頭の5行を、tail() は末尾の5行を出力します。
スクリプト実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
prefectures_id prefectures_name year man woman 0 24 三重県 1920 525957 543313 1 25 滋賀県 1920 313737 337313 2 26 京都府 1920 650780 636367 3 27 大阪府 1920 1344846 1243001 4 28 兵庫県 1920 1175426 1126373 prefectures_id prefectures_name year man woman 135 26 京都府 2015 1248972 1361381 136 27 大阪府 2015 4256049 4583420 137 28 兵庫県 2015 2641561 2893239 138 29 奈良県 2015 643946 720370 139 30 和歌山県 2015 453216 510363 |
pandas メソッドの仕様
- concat()
pandas の データフレーム型で定義された変数を指定することで、それらのデータをユニオン(結合)します - tail()
引数がない場合、末尾5行を取得できます
head() と同様に、引数で行数を指定することが可能です
横・列方向に結合(ジョイン)
以下のようなPythonスクリプトを用意し、データを横方向(列方向)に結合してみましょう。
1 2 3 4 5 6 7 |
import pandas as pd id = pd.read_csv('prefectures_id.csv') c02 = pd.read_csv('c02.csv') join_data = pd.merge(id, c02[['prefectures_id', 'year', 'man', 'woman']], on='prefectures_id', how='left') print(id.head()) print(join_data.head()) |
Pythonスクリプトの解説
1~3行目は、先のと同じですので省略します。
4行目、pandas の merge() を使ってジョインを行っています。
5~6行目、新たに読み込んだ prefectures_id.csv の中身と、結合(ジョイン)したデータを表示します。
スクリプト実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
prefectures_id prefectures_name 0 24 三重県 1 25 滋賀県 2 26 京都府 3 27 大阪府 4 28 兵庫県 prefectures_id prefectures_name year man woman 0 24 三重県 2000 901380 955959 1 24 三重県 2005 907214 959749 2 24 三重県 2010 903398 951326 3 24 三重県 2015 883516 932349 4 25 滋賀県 2000 663432 679400 |
prefectures_id.csv は、ID と 都道府県名(近畿圏のみ)が含まれています。
prefectures_id をキーとして結合するように merge() の引数で on='prefectures_id' を指定しました。
c02.csv 内に、prefectures_id が一致するデータが複数あるため、複数行にわたって結合されていますが、
右側に year, man, woman の列が結合されたのが分かると思います。
pandas メソッドの仕様
- merge()
pandas の データフレーム型で定義された変数を指定することで、それらのデータをジョイン(結合)します
スポンサーリンク
基礎③:必要なデータ列の作成
CSVファイル内にあるデータを用いて、必要な列を新たに追加してみましょう。
スクリプト
以下のようなPythonスクリプトを準備し、データ列の追加をしてみましょう。
1 2 3 4 5 |
import pandas as pd c01 = pd.read_csv('c01.csv') c01['total'] = c01['man'] + c01['woman'] print(c01.head()) |
Pythonスクリプトの解説
1~2行目、4行目は、省略します。
3行目は、データフレーム型の変数をハッシュテーブルとして扱い、列を追加しています。
男性(man)と女性(woman)の合計も、各行の加算を行っていないことがポイントです。
スクリプト実行結果
1 2 3 4 5 6 7 |
prefectures_id prefectures_name year man woman total 0 24 三重県 1920 525957 543313 1069270 1 25 滋賀県 1920 313737 337313 651050 2 26 京都府 1920 650780 636367 1287147 3 27 大阪府 1920 1344846 1243001 2587847 4 28 兵庫県 1920 1175426 1126373 2301799 |
スポンサーリンク
基礎④:データの検算
先ほどの基礎③で、男女の合計を算出しました。正しく計算できていれば男性合計と女性合計が、算出した合計と合致するはずですよね。
スクリプト
以下のようなPythonスクリプトを準備し、データの検算を行ってみましょう。
1 2 3 4 5 6 7 |
import pandas as pd c01 = pd.read_csv('c01.csv') c01['total'] = c01['man'] + c01['woman'] print('man :', c01['man'].sum()) print('woman:', c01['woman'].sum()) print('total:', c01['total'].sum()) |
Pythonスクリプトの解説
1~3行目は、省略します。
4~6行目は、pandas の sum() を使って列の合計を算出しています。
スクリプト実行結果
1 2 3 4 |
man : 125344554 woman: 128853466 total: 254198020 |
最初に男性の人口、次に女性の人口を出力しています。
最後は、追加した total 列の合計です。
スポンサーリンク
基礎⑤:データの集計
今回のデータのような年ごとに入力したデータだと、集計をして推移をみることに意味があります。
スクリプト
以下のようなPythonスクリプトを準備し、データの集計を行ってみましょう。
1 2 3 4 5 6 |
import pandas as pd c02 = pd.read_csv('c02.csv') c02['total'] = c02['man'] + c02['woman'] data = pd.pivot_table(c02, index='prefectures_name', columns='year', values = 'total', aggfunc='sum') print(data.head()) |
Pythonスクリプトの解説
1~3行目、5行目は、省略します。
4行目は、pandas の pivot_table() を使って集計を行っています。
引数の index で行を指定し、columns で列を指定します。
使用する値を values で指定し、aggfunc で重複データが存在した場合の集計方法を指定します。
スクリプト実行結果
1 2 3 4 5 6 7 8 |
year 2000 2005 2010 2015 prefectures_name 三重県 1857339 1866963 1854724 1815865 京都府 2644391 2647660 2636092 2610353 兵庫県 5550574 5590601 5588133 5534800 和歌山県 1069912 1035969 1002198 963579 大阪府 8805081 8817166 8865245 8839469 |
スポンサーリンク
まとめ
いかがでしたでしょうか。
基礎の部分だけ見ても、pandas がいかに強力なライブラリであるかが分かったと思います。
Excel や CSV、JSON などのデータをデータベースのように扱うことができるようになるライブラリ。これから Python を使ったサービスがAIや機械学習の分野で多く使われるため、このライブラリを自由に扱えれば重宝される人材になるでしょう。
以上、「【データ分析基礎5選】PythonのPandasで解析してみる」でした。