序章

Python pandas パッケージは、データの操作と分析に使用され、ラベル付けされたデータまたはリレーショナルデータを直感的に操作できるように設計されています。

The pandas パッケージはスプレッドシート機能を提供しますが、Pythonを使用しているため、従来のグラフィカルなスプレッドシートプログラムよりもはるかに高速で効率的です。

このチュートリアルでは、使用する大規模なデータセットの設定について説明します。 groupby()pivot_table() の機能 pandas、そして最後にデータを視覚化する方法。

に慣れるために pandas パッケージについては、チュートリアル Python3でのpandasパッケージとそのデータ構造の概要を読むことができます。

前提条件

このガイドでは、データを操作する方法について説明します。 pandas ローカルデスクトップまたはリモートサーバーのいずれか。 大規模なデータセットの操作はメモリを大量に消費する可能性があるため、いずれの場合も、このガイドの計算の一部を実行するには、コンピュータに少なくとも2GBのメモリが必要です。

このチュートリアルでは、 JupyterNotebookを使用してデータを操作します。 まだお持ちでない場合は、チュートリアルに従って、Python3用のJupyterNotebookをインストールおよびセットアップする必要があります。

データの設定

このチュートリアルでは、 SocialSecurityWebサイトから8MBのzipファイルとして入手できる赤ちゃんの名前に関する米国の社会保障データを使用します。

ローカルマシンまたはサーバーの正しいディレクトリからPython3プログラミング環境をアクティブ化しましょう。

  1. cd environments
  1. . my_env/bin/activate

次に、プロジェクトの新しいディレクトリを作成しましょう。 私たちはそれを呼ぶことができます names 次に、ディレクトリに移動します。

  1. mkdir names
  2. cd names

このディレクトリ内で、社会保障Webサイトからzipファイルをプルできます。 curl 指図:

  1. curl -O https://www.ssa.gov/oact/babynames/names.zip

ファイルがダウンロードされたら、使用するすべてのパッケージがインストールされていることを確認しましょう。

  • numpy 多次元配列をサポートする
  • matplotlib データを視覚化する
  • pandas 私たちのデータ分析のために
  • seaborn matplotlib統計グラフィックスをより美しくするため

まだインストールされていないパッケージがある場合は、 pip、のように:

  1. pip install pandas
  2. pip install matplotlib
  3. pip install seaborn

The numpy パッケージをまだお持ちでない場合は、パッケージもインストールされます。

これで、JupyterNotebookを起動できます。

  1. jupyter notebook

Jupyter NotebookのWebインターフェイスにアクセスすると、次のように表示されます。 names.zip そこにファイルします。

新しいノートブックファイルを作成するには、右上のプルダウンメニューから New > Python3を選択します。

これにより、ノートブックが開きます。

使用するパッケージをインポートすることから始めましょう。 ノートブックの上部に、次のように書く必要があります。

import numpy as np
import matplotlib.pyplot as pp
import pandas as pd
import seaborn

このコードを実行し、次のように入力して新しいコードブロックに移動できます ALT + ENTER.

また、PythonNotebookにグラフをインラインに保つように指示しましょう。

matplotlib inline

コードを実行して、次のように入力して続行します ALT + ENTER.

ここから、zipアーカイブを解凍し、CSVデータセットをにロードします。 pandas、次に連結します pandas DataFrames

Zipアーカイブを解凍します

zipアーカイブを現在のディレクトリに解凍するには、 zipfile モジュールを呼び出してから、 ZipFile ファイルの名前で関数(この場合は names.zip):

import zipfile
zipfile.ZipFile('names.zip').extractall('.')

コードを実行して、次のように入力して続行できます ALT + ENTER.

今振り返ると names ディレクトリ、あなたは持っているでしょう .txt CSV形式の名前データのファイル。 これらのファイルは、1881年から2015年までのファイルのデータの年数に対応します。 これらの各ファイルは、同様の命名規則に従います。 たとえば、2015年のファイルは yob2015.txt、1927年のファイルが呼び出されている間 yob1927.txt.

これらのファイルの1つの形式を確認するために、Pythonを使用してファイルを開き、上位5行を表示してみましょう。

open('yob2015.txt','r').readlines()[:5]

コードを実行して続行します ALT + ENTER.

Output
['Emma,F,20355\n', 'Olivia,F,19553\n', 'Sophia,F,17327\n', 'Ava,F,16286\n', 'Isabella,F,15504\n']

データのフォーマット方法は、名前が最初です( Emma また Olivia)、次のセックス( F 女性の名前と M 男性の名前の場合)、その年にその名前で生まれた赤ちゃんの数(2015年に生まれたEmmaという名前の赤ちゃんは20,355人でした)。

この情報を使用して、データをにロードできます pandas.

CSVデータをにロードする pandas

カンマ区切りの値のデータをに読み込むには pandas を使用します pd.read_csv() 関数、テキストファイルの名前と私たちが決定した列名を渡します。 これを変数に割り当てます。この場合は names2015 2015年の出生ファイルのデータを使用しているためです。

names2015 = pd.read_csv('yob2015.txt', names = ['Name', 'Sex', 'Babies'])

タイプ ALT + ENTER コードを実行して続行します。

これがうまくいったことを確認するために、テーブルの上部を表示してみましょう。

names2015.head()

コードを実行して続行するとき ALT + ENTER、次のような出力が表示されます。

これで、テーブルには、名前、性別、および各名前で生まれた赤ちゃんの数の情報が列ごとに整理されています。

連結 pandas オブジェクト

連結 pandas オブジェクトを使用すると、内のすべての個別のテキストファイルを操作できます。 names ディレクトリ。

これらを連結するには、最初に、入力されていないリストデータ型に変数を割り当ててリストを初期化する必要があります。

all_years = []

それが済んだら、 for loop を使用して、1880年から2015年までのすべてのファイルを年ごとに反復処理します。 追加します +1 2015年の終わりまで、2015年がループに含まれるようにします。

all_years = []

for year in range(1880, 2015+1):

ループ内で、 string formatter を使用して各テキストファイルの値をリストに追加し、これらの各ファイルの異なる名前を処理します。 それらの値をに渡します year 変数。 ここでも、次の列を指定します Name, Sex、およびの数 Babies:

all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))

さらに、注文を維持するために、年ごとに列を作成します。 これは、のインデックスを使用して、各反復後に実行できます。 -1 ループが進むにつれてそれらを指すようにします。

all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))
    all_years[-1]['Year'] = year

最後に、それをに追加します pandas を使用して連結されたオブジェクト pd.concat() 関数。 変数を使用します all_names この情報を保存します。

all_years = []

for year in range(1880, 2015+1):
    all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                 names = ['Name', 'Sex', 'Babies']))
    all_years[-1]['Year'] = year

all_names = pd.concat(all_years)

これでループを実行できます ALT + ENTER、次に、結果のテーブルの末尾(最下部の行)を呼び出して出力を調べます。

all_names.tail()

これでデータセットが完成し、で追加の作業を行う準備が整いました。 pandas.

データのグループ化

pandas 次の列を使用してデータをグループ化できます .groupby() 関数。 私たちの使用 all_names 完全なデータセットの変数、使用できます groupby() データを異なるバケットに分割します。

データセットを性別と年でグループ化しましょう。 これは次のように設定できます。

group_name = all_names.groupby(['Sex', 'Year'])

コードを実行して続行できます ALT + ENTER.

この時点で、 group_name 変数次の出力を取得します。

Output
<pandas.core.groupby.DataFrameGroupBy object at 0x1187b82e8>

これは、それが DataFrameGroupBy 物体。 このオブジェクトには、データをグループ化する方法についての指示がありますが、値を表示する方法についての指示はありません。

値を表示するには、指示を与える必要があります。 計算できます .size(), .mean()、 と .sum()たとえば、テーブルを返します。

から始めましょう .size():

group_name.size()

コードを実行して続行するとき ALT + ENTER、出力は次のようになります。

Output
Sex Year F 1880 942 1881 938 1882 1028 1883 1054 1884 1172 ...

このデータは見た目は良いですが、もっと読みやすくなる可能性があります。 を追加することで読みやすくすることができます .unstack 関数:

group_name.size().unstack()

コードを実行し、次のように入力して続行します ALT + ENTER、出力は次のようになります。

このデータからわかるのは、毎年女性と男性の名前がいくつあったかということです。 たとえば、1889年には、1,479人の女性の名前と1,111人の男性の名前がありました。 2015年には、18,993人の女性の名前と13,959人の男性の名前がありました。 これは、時間の経過とともに名前に大きな多様性があることを示しています。

生まれた赤ちゃんの総数を取得したい場合は、 .sum() 関数。 それをより小さなデータセット、 names2015 シングルから設定 yob2015.txt 以前に作成したファイル:

names2015.groupby(['Sex']).sum()

入力してみましょう ALT + ENTER コードを実行して続行するには:

これは、2015年に生まれた男性と女性の赤ちゃんの総数を示していますが、その年に少なくとも5回名前が使用された赤ちゃんのみがデータセットにカウントされます。

The pandas .groupby() 関数を使用すると、データを意味のあるグループにセグメント化できます。

ピボットテーブル

ピボットテーブルは、データを要約するのに役立ちます。 1つのテーブルに保存されているデータを自動的に並べ替え、カウント、合計、または平均化できます。 次に、それらのアクションの結果を、その要約されたデータの新しいテーブルに表示できます。

pandaspivot_table() 関数は、ピボットテーブルを作成するために使用されます。

ピボットテーブルを作成するには、最初に操作するDataFrameを呼び出し、次に表示するデータとそれらのグループ化方法を呼び出します。

この例では、 all_names データを表示し、一方のディメンションでは名前、もう一方のディメンションでは年でグループ化された赤ちゃんのデータを表示します。

pd.pivot_table(all_names, 'Babies', 'Name', 'Year')

入力すると ALT + ENTER コードを実行して続行すると、次の出力が表示されます。

これは多くの空の値を示しているため、NameとYearを、一方の場合は行として、もう一方の場合は列としてではなく、列として保持することをお勧めします。 これを行うには、データを角かっこで囲みます。

pd.pivot_table(all_names, 'Babies', ['Name', 'Year'])

入力したら ALT + ENTER コードを実行して続行するために、このテーブルには、各名前の記録にある年のデータのみが表示されます。

Output
Name Year Aaban 2007 5.0 2009 6.0 2010 9.0 2011 11.0 2012 11.0 2013 14.0 2014 16.0 2015 15.0 Aabha 2011 7.0 2012 5.0 2014 9.0 2015 7.0 Aabid 2003 5.0 Aabriella 2008 5.0 2014 5.0 2015 5.0

さらに、次のように、データをグループ化して、名前と性別を1つのディメンションとして、年をもう1つのディメンションとして持つことができます。

pd.pivot_table(all_names, 'Babies', ['Name', 'Sex'], 'Year')

コードを実行して続行するとき ALT + ENTER、次の表が表示されます。

ピボットテーブルを使用すると、既存のテーブルから新しいテーブルを作成して、そのデータをどのようにグループ化するかを決定できます。

データの視覚化

を使用して pandas のような他のパッケージと matplotlib ノートブック内のデータを視覚化できます。

長年にわたる特定の名前の人気に関するデータを視覚化する予定です。 そのためには、インデックスを設定および並べ替えてデータを作り直し、特定の名前の人気の変化を確認できるようにする必要があります。

The pandas パッケージを使用すると、階層的またはマルチレベルのインデックス作成を実行できます。これにより、任意の数のディメンションでデータを保存および操作できます。

性別、名前、年の順にデータのインデックスを作成します。 また、インデックスを並べ替える必要があります。

all_names_index = all_names.set_index(['Sex','Name','Year']).sort_index()

タイプ ALT + ENTER 実行して次の行に進みます。ここで、ノートブックに新しいインデックス付きDataFrameが表示されます。

all_names_index

コードを実行して続行します ALT + ENTER、および出力は次のようになります。

次に、名前の人気を時間の経過とともにプロットする関数を作成します。 関数を呼び出します name_plot 合格します sexname 関数を実行するときに呼び出すパラメーターとして。

def name_plot(sex, name):

次に、という変数を設定します data 作成したテーブルを保持します。 また、 pandas DataFrame loc インデックスの値で行を選択するため。 私たちの場合、 loc MultiIndexのフィールドの組み合わせに基づいて、両方を参照します。 sexname データ。

この構造を関数に記述してみましょう。

def name_plot(sex, name):
    data = all_names_index.loc[sex, name]

最後に、値を次のようにプロットします。 matplotlib.pyplot としてインポートしました pp. 次に、性別と名前のデータの値をインデックスに対してプロットします。これは、私たちの目的では年です。

def name_plot(sex, name):
    data = all_names_index.loc[sex, name]
    
    pp.plot(data.index, data.values)

タイプ ALT + ENTER 実行して次のセルに移動します。 これで、次のように、選択した性別と名前で関数を呼び出すことができます。 F 名の女性の名前 Danica.

name_plot('F', 'Danica')

入力すると ALT + ENTER これで、次の出力が表示されます。

使用しているシステムによっては、フォントの置換に関する警告が表示される場合がありますが、データは正しくプロットされます。

視覚化を見ると、女性の名前であるダニカの人気は1990年頃にわずかに上昇し、2010年の直前にピークに達したことがわかります。

作成した関数を使用して、複数の名前のデータをプロットできるため、さまざまな名前の経時的な傾向を確認できます。

プロットを少し大きくすることから始めましょう。

pp.figure(figsize = (18, 8))

次に、プロットしたいすべての名前のリストを作成しましょう。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

これで、リストを反復処理できます。 for 各名前のデータをループしてプロットします。 まず、これらのジェンダーニュートラルな名前を女性の名前として試します。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('F', name)

このデータを理解しやすくするために、凡例を含めましょう。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('F', name)
    
pp.legend(names)

入力します ALT + ENTER コードを実行して続行すると、次の出力が表示されます。

それぞれの名前が女性の名前として徐々に人気を博している一方で、ジェイミーという名前は1980年頃に女性の名前として圧倒的に人気がありました。

同じ名前をプロットしてみましょうが、今回は男性の名前です。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
    name_plot('M', name)
    
pp.legend(names)

繰り返しますが、 ALT + ENTER コードを実行して続行します。 グラフは次のようになります。

このデータは、名前全体でより人気があり、ジェシーが一般的に最も人気のある選択肢であり、1980年代と1990年代に特に人気があったことを示しています。

ここから、引き続き名前データを操作し、さまざまな名前とその人気についての視覚化を作成し、さまざまなデータを調べて視覚化する他のスクリプトを作成できます。

結論

このチュートリアルでは、データの設定からデータのグループ化まで、大規模なデータセットを操作する方法を紹介しました。 groupby()pivot_table()、MultiIndexを使用してデータにインデックスを付け、視覚化する pandas を使用したデータ matplotlib パッケージ。

多くの組織や機関は、学習を続けるために協力できるデータセットを提供しています pandas およびデータの視覚化。 たとえば、米国政府はdata.govを通じてデータを提供しています。

データの視覚化について詳しくは、 matplotlib matplotlibを使用してPython3でデータをプロットする方法およびPython3でmatplotlibを使用して単語の頻度をグラフ化する方法に関するガイドに従ってください。