You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/ja/2-Working-With-Data/07-python/README.md

26 KiB

データの操作: PythonとPandasライブラリ

 スケッチノート by (@sketchthedocs)
Pythonの操作 - スケッチノート by @nitya

イントロビデオ

データベースはデータを効率的に保存し、クエリ言語を使って検索する方法を提供しますが、データ処理を最も柔軟に行う方法は、自分でプログラムを書いてデータを操作することです。多くの場合、データベースクエリを使用する方が効果的ですが、複雑なデータ処理が必要な場合、SQLだけでは簡単に実現できないことがあります。
データ処理はどのプログラミング言語でもプログラムできますが、データ操作に特化した高レベルな言語も存在します。データサイエンティストは通常、以下の言語のいずれかを好みます:

  • Python: 汎用プログラミング言語で、そのシンプルさから初心者に最適とされています。Pythonには、ZIPアーカイブからデータを抽出したり、画像をグレースケールに変換したりするなど、多くの実用的な問題を解決するための追加ライブラリが豊富にあります。データサイエンスだけでなく、Web開発にもよく使用されます。
  • R: 統計データ処理を目的に開発された伝統的なツールボックスです。大規模なライブラリリポジトリCRANを持ち、データ処理に適しています。ただし、Rは汎用プログラミング言語ではなく、データサイエンス以外の分野で使用されることは稀です。
  • Julia: データサイエンス専用に開発された言語で、Pythonよりも高いパフォーマンスを提供することを目的としています。科学的な実験に最適なツールです。

このレッスンでは、Pythonを使用したシンプルなデータ処理に焦点を当てます。Pythonの基本的な知識があることを前提としています。Pythonをより深く学びたい場合は、以下のリソースを参照してください

データはさまざまな形式で存在します。このレッスンでは、表形式データテキスト画像の3つの形式を考えます。

関連するすべてのライブラリの完全な概要を提供するのではなく、いくつかのデータ処理の例に焦点を当てます。これにより、何が可能かの主なアイデアを得ることができ、必要に応じて問題の解決策を見つける方法を理解できるようになります。

最も役立つアドバイス: データに対して特定の操作を行う必要があるが、その方法がわからない場合は、インターネットで検索してみてください。Stackoverflowには、多くの典型的なタスクに対するPythonの有用なコードサンプルが多数掲載されています。

講義前クイズ

表形式データとデータフレーム

リレーショナルデータベースについて話したときに、表形式データにすでに触れました。大量のデータがあり、それが多くの異なるリンクされたテーブルに含まれている場合、SQLを使用して操作するのが理にかなっています。しかし、データの分布や値間の相関など、このデータについての理解や洞察を得る必要がある場合、または元のデータを変換して可視化する必要がある場合、Pythonを使用すると簡単に実現できます。

Pythonには、表形式データを扱うのに役立つ2つの非常に便利なライブラリがあります

  • Pandas: データフレームと呼ばれる構造を操作するためのライブラリで、リレーショナルテーブルに類似しています。名前付きの列を持つことができ、行、列、データフレーム全体に対してさまざまな操作を行うことができます。
  • Numpy: テンソル、つまり多次元配列を操作するためのライブラリです。配列は同じ型の値を持ち、データフレームよりもシンプルですが、より多くの数学的操作を提供し、オーバーヘッドが少なくなります。

また、知っておくべき他のライブラリもいくつかあります:

  • Matplotlib: データの可視化やグラフのプロットに使用されるライブラリ
  • SciPy: 追加の科学的関数を含むライブラリ。確率と統計について話したときにすでにこのライブラリに触れました

以下は、Pythonプログラムの冒頭でこれらのライブラリをインポートするために通常使用されるコードの一例です

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # you need to specify exact sub-packages that you need

Pandasは、いくつかの基本的な概念を中心に構築されています。

Seriesシリーズ

シリーズは、リストやnumpy配列に似た値のシーケンスです。主な違いは、シリーズにはインデックスがあり、シリーズを操作する際(例:加算する際)にインデックスが考慮される点です。インデックスは、単純な整数の行番号(リストや配列からシリーズを作成する際のデフォルトのインデックス)である場合もあれば、日付間隔のような複雑な構造を持つ場合もあります。

Note: 付属のノートブックnotebook.ipynbには、Pandasの入門的なコードが含まれています。ここではいくつかの例を簡単に説明しますが、ぜひ完全なートブックをチェックしてみてください。

例を考えてみましょう:アイスクリームショップの売上を分析したいとします。一定期間の売上数(各日ごとに販売されたアイテム数)のシリーズを生成します:

start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()

タイムシリーズプロット

次に、毎週友人のためにパーティーを開催し、パーティー用に追加で10パックのアイスクリームを取るとします。これを示すために、週ごとのインデックスを持つ別のシリーズを作成できます

additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))

2つのシリーズを加算すると、合計数が得られます

total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()

タイムシリーズプロット

Note: 単純な構文total_items+additional_itemsを使用していない点に注意してください。この構文を使用すると、結果のシリーズに多くのNaNNot a Number)値が含まれることになります。これは、additional_itemsシリーズの一部のインデックスポイントに値が欠けているためであり、NaNに何かを加算するとNaNになります。そのため、加算時にfill_valueパラメータを指定する必要があります。

タイムシリーズを使用すると、異なる時間間隔でシリーズを再サンプリングすることもできます。たとえば、月ごとの平均販売量を計算したい場合、以下のコードを使用できます:

monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')

月次タイムシリーズ平均

DataFrameデータフレーム

データフレームは、同じインデックスを持つシリーズのコレクションです。複数のシリーズを組み合わせてデータフレームを作成できます:

a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])

これにより、次のような横向きのテーブルが作成されます:

0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9
1 I like to use Python and Pandas very much

また、シリーズを列として使用し、辞書を使用して列名を指定することもできます:

df = pd.DataFrame({ 'A' : a, 'B' : b })

これにより、次のようなテーブルが得られます:

A B
0 1 I
1 2 like
2 3 to
3 4 use
4 5 Python
5 6 and
6 7 Pandas
7 8 very
8 9 much

Note: また、前のテーブルを転置することでこのレイアウトを得ることもできます。例えば、以下のように書くことで:

df = pd.DataFrame([a,b]).T..rename(columns={ 0 : 'A', 1 : 'B' })

ここで.Tはデータフレームを転置する操作(行と列を入れ替える操作)を意味し、rename操作を使用して列名を前の例に一致させることができます。

データフレームで実行できる最も重要な操作をいくつか紹介します:

列の選択。個々の列を選択するには、df['A']と書きます。この操作はシリーズを返します。また、列のサブセットを別のデータフレームに選択するには、df[['B','A']]と書きます。これにより別のデータフレームが返されます。

特定の条件に基づく行のフィルタリング。例えば、列Aが5より大きい行だけを残すには、df[df['A']>5]と書きます。

Note: フィルタリングの仕組みは次の通りです。式df['A']<5はブールシリーズを返し、元のシリーズdf['A']の各要素に対して式がTrueまたはFalseであるかを示します。ブールシリーズがインデックスとして使用されると、データフレーム内の行のサブセットが返されます。そのため、任意のPythonブール式を使用することはできません。例えば、df[df['A']>5 and df['A']<7]と書くのは間違いです。代わりに、ブールシリーズに対して特別な&演算子を使用し、df[(df['A']>5) & (df['A']<7)]と書く必要があります(括弧は重要です)。

新しい計算可能な列の作成。直感的な式を使用して、データフレームに新しい計算可能な列を簡単に作成できます:

df['DivA'] = df['A']-df['A'].mean() 

この例では、列Aの平均値からの偏差を計算しています。ここで実際に行われているのは、シリーズを計算し、それを左辺に割り当てて新しい列を作成することです。そのため、シリーズと互換性のない操作は使用できません。例えば、以下のコードは間違っています

# Wrong code -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Wrong result

後者の例は文法的には正しいですが、意図した結果を得ることはできません。このコードは、シリーズBの長さを列のすべての値に割り当ててしまい、個々の要素の長さではありません。

このような複雑な式を計算する必要がある場合は、apply関数を使用できます。最後の例は次のように書き直すことができます:

df['LenB'] = df['B'].apply(lambda x : len(x))
# or 
df['LenB'] = df['B'].apply(len)

上記の操作の後、次のデータフレームが得られます:

A B DivA LenB
0 1 I -4.0 1
1 2 like -3.0 4
2 3 to -2.0 2
3 4 use -1.0 3
4 5 Python 0.0 6
5 6 and 1.0 3
6 7 Pandas 2.0 6
7 8 very 3.0 4
8 9 much 4.0 4

行番号に基づく行の選択は、iloc構文を使用して行うことができます。例えば、データフレームの最初の5行を選択するには

df.iloc[:5]

グループ化は、Excelのピボットテーブルに似た結果を得るためによく使用されます。例えば、列Aの平均値をLenBごとに計算したい場合、データフレームをLenBでグループ化し、meanを呼び出します:

df.groupby(by='LenB').mean()

グループ内の平均値と要素数を計算する必要がある場合は、より複雑なaggregate関数を使用できます:

df.groupby(by='LenB') \
 .aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
 .rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})

これにより、次のテーブルが得られます:

LenB Count Mean
1 1 1.000000
2 1 3.000000
3 2 5.000000
4 3 6.333333
6 2 6.000000

データの取得

PythonオブジェクトからSeriesやDataFrameを構築するのがいかに簡単かを見てきました。しかし、データは通常、テキストファイルやExcelテーブルの形式で提供されます。幸いなことに、Pandasはディスクからデータを読み込むための簡単な方法を提供しています。例えば、CSVファイルを読み込むのは以下のように簡単です

df = pd.read_csv('file.csv')

「チャレンジ」セクションでは、外部ウェブサイトからデータを取得する例を含め、さらに多くのデータ読み込みの例を見ていきます。

データの表示とプロット

データサイエンティストはデータを探索する必要があるため、データを視覚化することが重要です。DataFrameが大きい場合、最初の数行を表示して、すべてが正しく動作していることを確認したいことがよくあります。これにはdf.head()を呼び出すことで対応できます。Jupyter Notebookで実行している場合、DataFrameがきれいな表形式で表示されます。

また、いくつかの列を視覚化するためにplot関数を使用する方法も見てきました。plotは多くのタスクに非常に便利で、kind=パラメータを使用してさまざまなグラフタイプをサポートしていますが、より複雑なものをプロットしたい場合は、matplotlibライブラリを直接使用することもできます。データの視覚化については、別のコースレッスンで詳しく説明します。

この概要ではPandasの最も重要な概念をカバーしていますが、このライブラリは非常に豊富で、できることに限界はありませんでは、この知識を使って具体的な問題を解決してみましょう。

🚀 チャレンジ1: COVIDの拡散を分析する

最初に取り組む問題は、COVID-19の流行拡散のモデル化です。そのために、ジョンズ・ホプキンス大学システム科学工学センター (CSSE)が提供する、各国の感染者数に関するデータを使用します。このデータセットはこのGitHubリポジトリで利用可能です。

データの扱い方を示すために、notebook-covidspread.ipynbを開き、上から下まで読んでみてください。セルを実行したり、最後に残しておいたチャレンジに取り組むこともできます。

COVID Spread

Jupyter Notebookでコードを実行する方法がわからない場合は、この記事を参照してください。

非構造化データの扱い

データは非常に頻繁に表形式で提供されますが、場合によっては、テキストや画像など、あまり構造化されていないデータを扱う必要があります。この場合、上記で見たデータ処理技術を適用するために、何らかの方法で構造化データを抽出する必要があります。以下はその例です:

  • テキストからキーワードを抽出し、それらのキーワードがどのくらい頻繁に出現するかを確認する
  • ニューラルネットワークを使用して画像内のオブジェクトに関する情報を抽出する
  • ビデオカメラの映像から人々の感情に関する情報を取得する

🚀 チャレンジ2: COVID関連論文の分析

このチャレンジでは、COVIDパンデミックのテーマを続け、関連する科学論文の処理に焦点を当てます。CORD-19 Datasetには、COVIDに関する7000以上執筆時点の論文が、メタデータや要約とともに提供されていますそのうち約半分には全文も含まれています

このデータセットを使用したText Analytics for Health認知サービスを使った分析の完全な例はこのブログ記事で説明されています。ここでは、この分析の簡略版を議論します。

NOTE: このリポジトリにはデータセットのコピーは含まれていません。まず、このKaggleデータセットからmetadata.csvファイルをダウンロードする必要があります。Kaggleへの登録が必要になる場合があります。また、登録なしでこちらからデータセットをダウンロードすることもできますが、メタデータファイルに加えて全文も含まれます。

notebook-papers.ipynbを開き、上から下まで読んでみてください。セルを実行したり、最後に残しておいたチャレンジに取り組むこともできます。

Covid Medical Treatment

画像データの処理

最近、画像を理解するための非常に強力なAIモデルが開発されています。事前学習済みのニューラルネットワークやクラウドサービスを使用して解決できるタスクが多数あります。以下はその例です

  • 画像分類:画像を事前定義されたクラスのいずれかに分類することができます。Custom Visionなどのサービスを使用して独自の画像分類器を簡単にトレーニングできます。
  • オブジェクト検出:画像内のさまざまなオブジェクトを検出します。Computer Visionなどのサービスは多くの一般的なオブジェクトを検出でき、Custom Visionモデルをトレーニングして特定の関心オブジェクトを検出することもできます。
  • 顔検出:年齢、性別、感情の検出を含みます。Face APIを使用して実現できます。

これらのクラウドサービスはPython SDKsを使用して呼び出すことができるため、データ探索ワークフローに簡単に組み込むことができます。

以下は画像データソースを探索する例です:

  • How to Learn Data Science without Codingというブログ記事では、Instagramの写真を探索し、人々が写真に多くの「いいね」を付ける理由を理解しようとしています。まず、Computer Visionを使用して写真から可能な限り多くの情報を抽出し、その後Azure Machine Learning AutoMLを使用して解釈可能なモデルを構築します。
  • Facial Studies Workshopでは、Face APIを使用してイベントの写真に写っている人々の感情を抽出し、人々を幸せにする要因を理解しようとしています。

結論

構造化データでも非構造化データでも、Pythonを使用すればデータ処理と理解に関連するすべてのステップを実行できます。Pythonはおそらく最も柔軟なデータ処理方法であり、そのため多くのデータサイエンティストがPythonを主要なツールとして使用しています。データサイエンスの旅を本格的に進めたい場合は、Pythonを深く学ぶことをお勧めします

講義後のクイズ

復習と自己学習

書籍

オンラインリソース

Python学習

課題

上記のチャレンジに対してより詳細なデータ研究を行う

クレジット

このレッスンはDmitry Soshnikovによって♥️を込めて作成されました。


免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解釈について、当社は責任を負いません。