BrainPad株式会社ブレインパッドのデータ活用に関する取り組みや製品・サービス開発の裏側、社員の日常などをご紹介します。今回は、データ分析を行う際のデータの前処理や集計を行う時に非常に役に立つ、PandasというPythonの便利なモジュールを紹介したいと思います。モジュールを紹介する前に、分析作業の流れとPandasがどのあたりに関与してくるかを先に説明しておきます。行き当たりばったりでデータを分析していくのでは、到底価値のある結果を導きだすことはできません。場合、以下の手順に沿って分析を進めていくことになります。仮説形成の段階は、分析の各段階で修正を繰り返すものなので一概には順番を定義することは難しいですが、一般的な流れとしては上記のものになるかと思います。お客さまの課題は、それぞれ異なっているため最終的な課題解決のための分析手法は、それに応じて変化し、その手法も多岐に渡ります。基礎集計については、どんな課題であろうが具体的な分析に入る前に必ず実施することになります。基礎集計という作業自体は、SQLなりExcelなりを用いて行われる比較的地味な作業です。最終的な分析方針に大きな影響を与えることがあるため、このフェーズで手を抜くと後々痛い目にあいます。異常値の発見やデータの分布の確認、欠損値の有無、変数の作成など、基礎集計フェーズではやるべきことがたくさんあり、実際の業務ではこの部分に一番時間がとられることが多いです。具体的な分析手法を適用した際の成果は、この基礎集計段階で大方決まっているといっても大げさではないでしょう。Pandasを用いて基礎集計を実施する前に、今回用いるPandasと基礎集計の対象データであるReceReco(レシレコ)のデータを紹介しておきます。特徴の比較Pandasは、Pythonのモジュールの内の1つなのですが、データ処理や分析に特化した機能を提供しています。具体的には、Rと同様にデータフレームという形式で行列の形をしたデータを柔軟に取り扱うことができ、データの大まかな特徴を掴みたい時などに重宝します。時系列データを分析するための機能も揃っており、金融データのような時系列の情報から将来を予測する課題に取り組む時には、非常に役立ちます。データ処理や集計レベルの分析は、Pandas以外にもSQLやRなどを用いて実施することができます。ここで、それぞれのメリット・デメリットを簡単にまとめておきます。・複雑な処理や特殊な処理が必要な場合には不向き・モデリングなどを行う機能はないため、基礎集計フェーズ以外では使えないPandas・データ分析以外の部分にもPythonで記述することができる・モデリングや検定を実施する際には他のモジュールでの処理が必要こうして見るとPandasのメリットが少ないように見えますが、分析以外の処理部分と言語を揃えることができるのは大きなメリットかと思われます。上記の比較は、厳密な比較というよりも実際の業務を通して感じたものを記載させていただいているので、その点はご了承ください。ReceReco(レシレコ)について今回、Pandasを用いて基礎集計を行う際のデータは、弊社が提供する無料家計簿アプリ「ReceReco(レシレコ)」のデータを一部サンプリングしたものとなります。ReceRecoは、スマートフォンのカメラでレシートを撮影すれば、あっという間に支出管理ができる無料家計簿アプリです。アプリの詳細は、ここでは割愛させていただきますが、ご興味がありましたら下記をご覧いただければ幸いです。ReceReco(レシレコ)ReceRecoのデータのうち、特定の商品を取り上げて販売点数や売上の違いについてPandasを用いて見ていきたいと思います。対象は、2013年2月1日から2013年9月30日までのReceReco登録レシートデータをランダムサンプリングしたものを使用します。(登録されたレシートデータを個人が特定されない範囲で二次利用することは全ユーザーに事前許諾済み。実際の商品の購買の名称や列名は、一部変更させていただいております。サンプリングによってレシート数がかなり減少しているため、集計結果に対する考察は行っておりません。データの読み込みそれでは、具体的にデータの読み込みをPandasを用いて行っていきましょう。今回は、特にレシート履歴の多い商品がいいので、皆さんにも身近なコーラを取り上げてみたいと思います。データの読み込みの方法はいくつかありますが、今回はデータの形式がtsv(タブ区切りのデータ)だと想定して処理を行っていきます。仮に、「recereco_data.tsv」というtsvファイル形式でデータが存在したとして話を進めていきます。データは以下のような項目で構成されています。id:レコードに対してユニークなIDreceipt_id:レシートのIDname:商品名price:価格それでは、具体的なコードを見ていきます。以下のコードはPython2.7、Pandas0.15.1verを想定して記載してあります。pd.read_csv('recereco_data.tsv',sep='\t',header=0)read_csvという関数名ながらセパレータを指定できるため、csvファイル以外のファイルでも読み込めます。read_tableという関数もデフォルトがタブ区切りのファイルを読み込むために存在しますが、どちらでも大きく挙動は変わらないのでどちらかを用いればよいかと思います。ファイルに列名がついている場合には、header=列名が記述されている行数を指定すればそれを列名として読み込んでくれます。具体的な集計に入る前に、簡単にどのようなデータが入っているのかを確認しておきます。df['price'].astype(np.float64)ちなみに、末尾にどのようなデータが入っているかを実際に確認してみると以下のようになっています。850Rでも同様の関数がありますが、Pandasでもデータの先頭行を確認したり、基本的な統計量を確認したりする関数が用意されています。今回は、商品名に「コーラ」が入っているものに対象を限定したいので、name列から「コーラ」が文字に含まれるものを条件抽出していきます。条件の抽出方法はいくつか存在しますので、必要に応じて使い分けていただくのがよいかと思われます。130]コーラを含む商品名を抽出すると、以下のようなものがでてきます。105基本的に条件抽出は、列名を指定して不等号を記述することで取り出すことができます。指定文字列を含むものを取り出したい場合には、上記のように文字列が含まれるかどうかを判定してTrue/Falseを判断する必要があります。データの型が想定していた型と異なる場合には、意図しない抽出が行われることがあります。数値型だと思っていた列が、実は文字型のデータだったといった状況がよくあります。いったことを避けるためにも、条件抽出を行う前にデータの概要をinfo関数やdescribe関数で確実に確認しておきましょう。必要なデータが取り出せたら、次に対象商品がどれくらい存在するのかを確認してみましょう。レシートデータをカメラで読み取っていたり、商品名の手入力ができるため、商品名のゆれなどが想定されますが、いったん、各商品の売上点数と売上額を確認してみましょう。集計の軸となる列をキーに指定し、group関数を適用した後に自分が見たい集計関数を適用させます。df_cola_sale['price'].order(ascending=False)df_cola_sale.head(5)具体的に売上の多い上位5つの商品を見てみると、メーカーの分からないコーラやメッツコーラ、コカコーラといったさまざまな商品があるようです。11,804販売点数については、レシートに記載されていた数をカウントすることで集計します。df_cola_amount['id'].order(ascending=False)df_cola_amount.head(5)こちらも具体的にどのような商品があったかを確認しておきます。65ちなみに、今回用いた要約統計量以外にもPandasにはいろいろとメソッドが用意されているので、必要に応じて使いわけるといいでしょう。先ほど確認した売上の上位5商品のうち「コカ・コーラ」と「メッツコーラ」の2つに絞って店舗別の販売点数を見ていきたいと思います。それぞれの商品のみを抽出したものを先に作成して、再度1つのデータにまとめるという処理を行います。SQLでいうところのUNIONと同じような処理を想定していただけると良いかと思います。Pandasではappendやconcatを用いて行の結合を行います。店舗別に売上を確認するためには、店舗の情報が必要ですが現状の商品データには存在しません。そこで、別のデータから店舗情報を商品データに結合する必要があります。思い浮かべていただけると良いかと思います。具体的には、レシートの発行時刻や店舗名が記載されたレシート情報を読み込んでデータを結合したいと思います。レシートデータが「recereco_data_receipt.tsv」という名称で存在しており、以下の項目で構成されているとします。※店名については、マスキングしてどのような店舗か分からないようにしてあります。紐づけの条件としては、商品のデータではreceipt_id、レシート情報のデータではidをキーに結合を行います。Pandasではmergeを用いて列の結合を行います。right_on='id',how='inner',suffixes=('_x','_y'))df_merge.head()具体的には、このようなデータがマージされます。04:56:00suffixesで文字を指定しておくと、双方のデータに同じカラム名があってもそれぞれを指定文字で別々に認識してくれます。指定しておかなくてもPandasが勝手にリネームしてくれます。商品別・店別の売上額を集計してみます。df_item_shop.order(ascending=False)df_item_shop.head()具体的には、下記のような結果が返ってきます。キーは双方記載するようにしましょう。howオプションで「left」「right」「outer」などの結合方法を指定できます。最後に、データを数字だけ眺めていても全体像は掴みづらいので、集計したデータをグラフ化することで大まかな傾向を掴みたいと思います。今回は、「コカコーラ」と「メッツコーラ」の平均単価と単価の分布を棒グラフを用いて確認します。上記の例ではpandasのデータフレームにhist()やplot()のメソッドを用いて表示しています。plot()のオプションでkindを指定すると、棒グラフ以外にもさまざまなグラフを描画できますので、必要に応じて以下のオプションから必要な種類のグラフを選択するといいでしょう。円グラフグラフの描写には、他にもいろいろなオプションがありますので、ここでは語りきれませんが、折を見てグラフ化に関する記事をご紹介できればと思っています。まとめ簡単な例にはなってしまいましたが、データを読み込んでから簡単な基礎集計をPandasを用いて実施するところまでをなぞることができたかと思います。今回紹介したもの以外にもPandasは多くの機能を備えておりますので、今後ご紹介させていただければ幸いです。ここまで読んでいただきありがとうございました。採用ページスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。