# Scikit-learnを使った回帰モデルの構築:データの準備と可視化 ![データ可視化のインフォグラフィック](../../../../2-Regression/2-Data/images/data-visualization.png) インフォグラフィック作成者:[Dasani Madipalli](https://twitter.com/dasani_decoded) ## [講義前クイズ](https://ff-quizzes.netlify.app/en/ml/) > ### [このレッスンはRでも利用可能です!](../../../../2-Regression/2-Data/solution/R/lesson_2.html) ## はじめに Scikit-learnを使った機械学習モデル構築に必要なツールが整った今、データに対して質問を投げかける準備ができました。データを扱い、MLソリューションを適用する際には、データセットの可能性を最大限に引き出すために、適切な質問をする方法を理解することが非常に重要です。 このレッスンでは以下を学びます: - モデル構築のためのデータ準備方法 - Matplotlibを使ったデータ可視化の方法 ## データに対して適切な質問をする 解決したい質問によって、使用するMLアルゴリズムの種類が決まります。そして、得られる回答の質は、データの性質に大きく依存します。 このレッスンで使用する[データ](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)を見てみましょう。この.csvファイルをVS Codeで開くことができます。ざっと目を通すと、空白や文字列と数値データの混在が見られます。また、「Package」という奇妙な列があり、データが「sacks」や「bins」などの値で混在しています。実際、このデータは少し厄介です。 [![初心者向けML - データセットの分析とクリーニング方法](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "初心者向けML - データセットの分析とクリーニング方法") > 🎥 上の画像をクリックすると、このレッスンのデータ準備を進める短い動画が視聴できます。 実際、MLモデルをすぐに使える形で完全に整ったデータセットを手に入れることはあまりありません。このレッスンでは、標準的なPythonライブラリを使用して生データセットを準備する方法を学びます。また、データを可視化するさまざまな手法についても学びます。 ## ケーススタディ:「かぼちゃ市場」 このフォルダには、ルートの`data`フォルダ内に[US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv)という.csvファイルが含まれています。このファイルには、アメリカのかぼちゃ市場に関する1757行のデータが含まれており、都市ごとにグループ分けされています。このデータは、アメリカ農務省が配布している[Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice)から抽出された生データです。 ### データの準備 このデータはパブリックドメインに属しています。USDAのウェブサイトから都市ごとに個別のファイルとしてダウンロードできますが、ファイルが多すぎるのを避けるため、すべての都市データを1つのスプレッドシートに結合しました。このようにして、すでにデータを少し「準備」しています。次に、このデータを詳しく見てみましょう。 ### かぼちゃデータ - 初期の結論 このデータについて何に気づきますか?すでに文字列、数値、空白、奇妙な値が混在していることがわかりました。 回帰手法を使ってこのデータにどのような質問をすることができますか?例えば、「特定の月に販売されるかぼちゃの価格を予測する」という質問はどうでしょうか。このデータを再度確認すると、このタスクに必要なデータ構造を作成するためにいくつかの変更が必要であることがわかります。 ## 演習 - かぼちゃデータの分析 [Python Data Analysis](https://pandas.pydata.org/)を意味するPandasを使用して、このかぼちゃデータを分析・準備しましょう。Pandasはデータの整形に非常に便利なツールです。 ### まず、欠損している日付を確認する 最初に、欠損している日付を確認する手順を実行します: 1. 日付を月形式に変換します(これらは米国の日付形式なので、`MM/DD/YYYY`です)。 2. 月を新しい列に抽出します。 Visual Studio Codeで_notebook.ipynb_ファイルを開き、スプレッドシートを新しいPandasデータフレームにインポートします。 1. `head()`関数を使用して最初の5行を表示します。 ```python import pandas as pd pumpkins = pd.read_csv('../data/US-pumpkins.csv') pumpkins.head() ``` ✅ 最後の5行を表示するにはどの関数を使用しますか? 1. 現在のデータフレームに欠損データがあるか確認します: ```python pumpkins.isnull().sum() ``` 欠損データがありますが、今回のタスクには影響がないかもしれません。 1. データフレームを扱いやすくするために、必要な列だけを選択します。`loc`関数を使用して、元のデータフレームから行(最初のパラメータ)と列(2番目のパラメータ)のグループを抽出します。以下の例では、`:`は「すべての行」を意味します。 ```python columns_to_select = ['Package', 'Low Price', 'High Price', 'Date'] pumpkins = pumpkins.loc[:, columns_to_select] ``` ### 次に、かぼちゃの平均価格を算出する 特定の月におけるかぼちゃの平均価格を算出する方法を考えてみましょう。このタスクにはどの列を選択しますか?ヒント:3つの列が必要です。 解決策:`Low Price`列と`High Price`列の平均を取り、新しい`Price`列を作成します。また、`Date`列を月だけを表示する形式に変換します。上記の確認によると、日付や価格に欠損データはありません。 1. 平均を計算するには、以下のコードを追加します: ```python price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2 month = pd.DatetimeIndex(pumpkins['Date']).month ``` ✅ 必要に応じて、`print(month)`を使用してデータを確認してください。 2. 変換したデータを新しいPandasデータフレームにコピーします: ```python new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price}) ``` データフレームを出力すると、きれいで整ったデータセットが表示され、これを基に新しい回帰モデルを構築できます。 ### しかし、ここで奇妙な点があります `Package`列を見ると、かぼちゃはさまざまな形態で販売されていることがわかります。一部は「1 1/9 bushel」単位で、一部は「1/2 bushel」単位で、一部はかぼちゃ1個単位、またはポンド単位、さらには幅の異なる大きな箱単位で販売されています。 > かぼちゃを一貫して計量するのは非常に難しいようです 元のデータを掘り下げると、`Unit of Sale`が「EACH」または「PER BIN」の場合、`Package`タイプもインチ単位、ビン単位、または「each」となっています。かぼちゃを一貫して計量するのは非常に難しいようです。そのため、`Package`列に「bushel」という文字列が含まれるかぼちゃだけを選択してフィルタリングしましょう。 1. ファイルの冒頭、最初の.csvインポートの下にフィルタを追加します: ```python pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)] ``` データを出力すると、「bushel」を含む約415行のデータだけが取得されていることがわかります。 ### しかし、もう1つやるべきことがあります 行ごとにバスケットの量が異なることに気づきましたか?価格をバスケット単位で標準化する必要があります。そのため、価格を標準化するための計算を行います。 1. 新しい`new_pumpkins`データフレームを作成するブロックの後に以下の行を追加します: ```python new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9) new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2) ``` ✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308)によると、バスケットの重さは作物の種類によって異なります。バスケットは体積の測定単位であるためです。「例えば、トマトのバスケットは56ポンドとされています... 葉物野菜はスペースを多く取り、重さが少ないため、ほうれん草のバスケットはわずか20ポンドです。」これは非常に複雑です!バスケットからポンドへの変換は行わず、バスケット単位で価格を計算することにしましょう。しかし、このかぼちゃのバスケットに関する研究は、データの性質を理解することがいかに重要であるかを示しています! これで、バスケットの測定単位に基づいて価格を分析できます。データをもう一度出力すると、標準化されたことがわかります。 ✅ 半バスケット単位で販売されるかぼちゃが非常に高価であることに気づきましたか?その理由を考えてみてください。ヒント:小さなかぼちゃは大きなかぼちゃよりもはるかに高価です。おそらく、大きな空洞のあるパイ用かぼちゃ1個に比べて、バスケットあたりの小さなかぼちゃの数が非常に多いためです。 ## 可視化の戦略 データサイエンティストの役割の一部は、扱っているデータの質や性質を示すことです。そのために、興味深い可視化、つまりプロット、グラフ、チャートを作成して、データのさまざまな側面を示します。この方法で、視覚的に関係性やギャップを示すことができ、そうでなければ見つけにくいものを明らかにします。 [![初心者向けML - Matplotlibを使ったデータの可視化方法](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "初心者向けML - Matplotlibを使ったデータの可視化方法") > 🎥 上の画像をクリックすると、このレッスンのデータ可視化を進める短い動画が視聴できます。 可視化は、データに最も適した機械学習手法を決定するのにも役立ちます。例えば、散布図が直線に沿っているように見える場合、そのデータは線形回帰の演習に適していることを示しています。 Jupyterノートブックでよく使われるデータ可視化ライブラリの1つが[Matplotlib](https://matplotlib.org/)です(前のレッスンでも登場しました)。 > データ可視化の経験をさらに積むには、[これらのチュートリアル](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott)を参照してください。 ## 演習 - Matplotlibを使って実験する 作成した新しいデータフレームを表示するために、いくつかの基本的なプロットを作成してみましょう。基本的な折れ線グラフはどのように見えるでしょうか? 1. ファイルの冒頭、Pandasのインポートの下にMatplotlibをインポートします: ```python import matplotlib.pyplot as plt ``` 1. ノートブック全体を再実行して更新します。 1. ノートブックの最後にセルを追加して、データをボックスプロットとしてプロットします: ```python price = new_pumpkins.Price month = new_pumpkins.Month plt.scatter(price, month) plt.show() ``` ![月ごとの価格関係を示す散布図](../../../../2-Regression/2-Data/images/scatterplot.png) このプロットは役に立ちますか?何か驚くことはありますか? 特に役に立つわけではありません。単にデータを月ごとの点の広がりとして表示しているだけです。 ### 有用なプロットにする 有用なチャートを表示するには、通常、データを何らかの形でグループ化する必要があります。y軸に月を表示し、データが分布を示すプロットを作成してみましょう。 1. グループ化された棒グラフを作成するセルを追加します: ```python new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar') plt.ylabel("Pumpkin Price") ``` ![月ごとの価格関係を示す棒グラフ](../../../../2-Regression/2-Data/images/barchart.png) これはより有用なデータ可視化です!9月と10月にかぼちゃの最高価格が見られるようです。これは予想通りですか?なぜそう思いますか? --- ## 🚀チャレンジ Matplotlibが提供するさまざまな可視化タイプを探求してみましょう。回帰問題に最も適したタイプはどれですか? ## [講義後クイズ](https://ff-quizzes.netlify.app/en/ml/) ## 復習と自己学習 データを可視化するさまざまな方法を調べてみましょう。利用可能なライブラリのリストを作成し、2D可視化と3D可視化など、特定のタスクに最適なライブラリをメモしてください。何を発見しましたか? ## 課題 [可視化の探求](assignment.md) --- **免責事項**: この文書は、AI翻訳サービス [Co-op Translator](https://github.com/Azure/co-op-translator) を使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な表現が含まれる可能性があります。元の言語で記載された原文を公式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の利用に起因する誤解や誤認について、当社は一切の責任を負いません。