Python

Python✕データサイエンス100本ノックに挑戦してみよう!

Pythonデータサイエンス
記事内に商品プロモーションを含む場合があります
ウマたん
ウマたん
当サイト【スタビジ】の本記事では、Python✕データサイエンス100本ノックに挑戦していただきます!ぜひ自分の力試し・復習として利用してください!

こんにちは!データサイエンティストのウマたん(@statistics1012)です。

この記事ではPythonによるデータサイエンス関連の加工・集計・可視化処理100本に挑戦していただきます!

データサイエンティストとして様々なプロジェクトを経験してきた僕が、頻出する処理についてまとめて問題にしましたのでぜひ挑戦してみてください!

40本目までは解答付きですが、41本目以降&各問題の詳しい解説は以下のUdemy講座で解説していますので、ぜひ興味のある方はチェックしてみてください!

【実践】Python✕データサイエンス加工・集計・可視化処理100本ノック!実務でよく使う100個の問題にチャレンジ!

Udemy100
【時間】4.5時間
【レベル】初級〜中級

Python✕データサイエンス関連の100問に挑戦して腕試し!

\30日以内なら返金無料/このコースを見てみる

以下のリンクから94%OFFになる講師クーポンを獲得できますので購入する際はこちらをご利用ください。

\94%OFFクーポンをチェックする/Udemyのクーポンはこちら

それではいってみましょう!

Python✕データサイエンス100本ノック:1本目〜10本目

まず以下から今回使うデータセットをダウンロードしてください!

1. データの読み込み
– 各種CSVデータを読み込んでください
– 各種データフレーム名はsales_df、member_dfとしてください

解答

import pandas as pd

sales_df = pd.read_csv("Sales_Data.csv")
member_df = pd.read_csv("Member_Data.csv")

2. 取引データの上部5行を表示してください

解答

sales_df.head()

3. 会員データの下部5行を表示してください

解答

member_df.tail()

4. 取引データの各カラムの件数や型を確認してください

解答

sales_df.info()

5. 取引データの各種IDのカラムを質的変数に型変換してください。会員データに関しても同様に各種IDを質的変数に型変換してください

解答

sales_df["Transaction_ID"] = sales_df["Transaction_ID"].astype("string")
sales_df["Member_ID"] = sales_df["Member_ID"].astype("string")
sales_df["Product_ID"] = sales_df["Product_ID"].astype("string")
sales_df["Store_ID"] = sales_df["Store_ID"].astype("string")

member_df["Member_ID"] = member_df["Member_ID"].astype("string")

6. 日付データをdatetime型に変換してください

解答

sales_df["Transaction_Date"] = pd.to_datetime(sales_df["Transaction_Date"])

7. 取引データの各列の基本的な統計情報(平均、標準偏差など)を表示してください

解答

sales_df.describe()

8. カラム名の変更
– データフレームのAmountのカラム名をSalse_Amountに変更してください
– データフレームは上書きしないでください

解答

sales_df.rename(columns={"Amount": "Sales_Amount"})

9. Amountを100円単位に四捨五入して表示してください

解答

sales_df["Amount"].round(-2)

10. 取引データからAmountが5000円を超える取引を抽出してください

解答

sales_df.query("Amount > 5000")

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック11本目以降いってみましょう!

Python✕データサイエンス100本ノック:11本目〜20本目

11. 会員データから30歳から50歳の会員を抽出してください

解答

member_df.query("30 <= Age <= 50")

12. 取引データから”2024-08-01″以降に行われた取引を抽出してください

解答

sales_df.query("Transaction_Date >= '2024-08-01'")

13. Store_ID が「1」または「3」で、かつ Amount が5000円以上の取引を抽出してください

解答

sales_df.query("(Store_ID == '1' or Store_ID == '3') and Amount >= 5000")

14. Product_ID が「10」、「20」、「30」のいずれかに一致する取引を抽出してください

解答

sales_df.query("Product_ID in ['10', '20', '30']")

15. Product_ID が「10」、「20」、「30」ではない取引を抽出してください

解答

sales_df.query("Product_ID not in ['10', '20', '30']")

16. Quantity が最頻値で、かつ Store_ID が「3」の取引を抽出してください

解答

mode_quantity = sales_df["Quantity"].mode()[0]
sales_df.query("Quantity == @mode_quantity and Store_ID =='3'")

17. Amount が第1四分位から第3四分位の範囲に属する取引を抽出してください

解答

q1 = sales_df["Amount"].quantile(0.25)
q3 = sales_df["Amount"].quantile(0.75)
print(q1)
print(q3)
sales_df.query("@q1 <= Amount <= @q3")

18. Product_IDとStore_IDは何種類あるか確認してください

解答

print(sales_df["Product_ID"].nunique())
print(sales_df["Store_ID"].nunique())

19. 取引データのProduct_ID ごとに Amount の合計を計算してください

解答

sales_df.groupby("Product_ID")["Amount"].sum()

20. Product_ID ごとにQuantityの中央値を計算してください

解答

sales_df.groupby("Product_ID")["Quantity"].median()

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック21本目以降いってみましょう!

Python✕データサイエンス100本ノック:21本目〜30本目

21. Store_ID ごとに平均Amountを集計してください

解答

sales_df.groupby("Store_ID")["Amount"].mean()

22. 会員データの性別 (Gender) ごとに平均年齢を計算してください

解答

member_df.groupby("Gender")["Age"].mean()

23. 会員ごとに平均 Amount を計算してください

解答

sales_df.groupby("Member_ID")["Amount"].mean()

24. Transaction_Dateから日付だけ取り出して日付ごとに Amount の合計を集計してください

解答

sales_df["Transaction_Date_yyyyMMdd"] = sales_df["Transaction_Date"].dt.date
sales_df.groupby("Transaction_Date_yyyyMMdd")["Amount"].sum()

25. 日付ごとの合計Amountを集計し、合計Amountが小さい順にソートしてください

解答

sales_df.groupby("Transaction_Date_yyyyMMdd")["Amount"].sum().reset_index().sort_values(by="Amount", ascending=True)

26. 月ごとに Amount を集計してください

解答

sales_df["Month"] = sales_df["Transaction_Date"].dt.to_period("M")
sales_df.groupby("Month")["Amount"].sum()

27. 月ごとのAmountの増減の絶対値を前月と比較して計算してください

解答

monthly_sales = sales_df.groupby("Month")["Amount"].sum().reset_index()
monthly_sales["Amount"].diff()

28. 曜日ごとの合計Amountを集計してください

解答

sales_df["Day_of_Week"] = sales_df["Transaction_Date"].dt.day_name()
sales_df.groupby("Day_of_Week")["Amount"].sum()

29. 1週間ごとに合計Amountを集計してください

解答

sales_df["Week"] = sales_df["Transaction_Date"].dt.to_period("W")
sales_df.groupby("Week")["Amount"].sum()

30. 1週間ごとのAmountの増減を計算し、増加率をパーセンテージで表示してください

解答

weekly_sales = sales_df.groupby("Week")["Amount"].sum().reset_index()
weekly_sales["Amount"].pct_change()*100

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック31本目以降いってみましょう!

Python✕データサイエンス100本ノック:31本目〜40本目

31. 新しく作成したカラムを削除してください

解答

sales_df.drop(["Transaction_Date_yyyyMMdd", "Month", "Day_of_Week", "Week"], axis=1, inplace=True)
sales_df

32. Amount が1000円を超える取引を抽出し、Store_ID と Product_ID ごとに Amount の合計を計算してください

解答

filtered_sales = sales_df.query("Amount > 1000")
filtered_sales.groupby(["Store_ID", "Product_ID"])["Amount"].sum()

33. Store_ID ごとの合計Amountを集計し300000円以上の店舗を抽出してください

解答

store_sales = sales_df.groupby("Store_ID")["Amount"].sum().reset_index()
store_sales.query("Amount > 300000")

34. 会員ごとに取引回数をカウントしてください

解答

sales_df.groupby("Member_ID")["Transaction_ID"].count()

35. 会員ごとに取引回数をカウントし、2回以上の取引がある会員を抽出してください

解答

member_transaction_count = sales_df.groupby("Member_ID")["Transaction_ID"].count().reset_index()
member_transaction_count.query("Transaction_ID >= 2")

36. 年齢グループ(-30歳、31-50歳、51-65歳、66歳-)を作成し、各グループの会員数を集計してください。

解答

age_bins = [min(member_df["Age"])-1, 30, 50, 65, max(member_df["Age"])]
age_labels = ["-30", "31-50", "51-65", "66-"]
member_df["Age_Group"] = pd.cut(member_df["Age"], bins=age_bins, labels=age_labels)
member_df.groupby("Age_Group")["Member_ID"].count()

37. 会員になってからの日数(Days_Since_Registration)のグループ(〜1年、1年〜2年, 2年〜)を作成し、各グループの会員数を集計してください

解答

years_bins = [min(member_df["Days_Since_Registration"])-1, 365, 710, max(member_df["Days_Since_Registration"])]
years_labels = ["-1年", "1年-2年", "2年-"]
member_df["Year_Group"] = pd.cut(member_df["Days_Since_Registration"], bins=years_bins, labels=years_labels)
member_df.groupby("Year_Group")["Member_ID"].count()

38. 売上データと会員データを結合しmerged_dfとして定義してください

解答

merged_df = sales_df.merge(member_df, on="Member_ID")
merged_df

39. 性別ごとに平均Amountを計算してください

解答

merged_df.groupby("Gender")["Amount"].mean()

40. 性別ごとの平均Quantityを集計してください

解答

merged_df.groupby("Gender")["Quantity"].mean()

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック41本目以降いってみましょう!

ここまでは解答付きですが、これ以降&各問題の詳しい解説は以下のUdemy講座で解説しています!

【実践】Python✕データサイエンス加工・集計・可視化処理100本ノック!実務でよく使う100個の問題にチャレンジ!

Udemy100
【時間】4.5時間
【レベル】初級〜中級

Python✕データサイエンス関連の100問に挑戦して腕試し!

\30日以内なら返金無料/このコースを見てみる

以下のリンクから94%OFFになる講師クーポンを獲得できますので購入する際はこちらをご利用ください。

\94%OFFクーポンをチェックする/Udemyのクーポンはこちら

Python✕データサイエンス100本ノック:41本目〜50本目

41. 性別と店舗IDごとに取引数を集計してください

42. Store_ID が [1, 5, 9] の取引を抽出し、Store_ID ごとに Quantity の合計を計算してください

43. データセットの最後の10日間の取引を抽出し、Transaction_Date ごとにAmountを集計してください

44. 合計Amountが最も高い会員トップ5を特定してください

45. 会員ごとに最も新しい取引を集計してください

46. 会員ごとに最も古い取引を集計してください

47. 会員ごとに取引日時の最も古いデータと最も新しいデータを集計し、それぞれが違うレコードを抽出してください

48. Member_ID に「2」が含まれる会員の取引を抽出してください。

49. Product_ID が「1」で始まる取引を抽出してください。

50. Store_ID が「5」で終わる取引を抽出してください

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック51本目以降いってみましょう!

Python✕データサイエンス100本ノック:51本目〜60本目

51. Transaction_ID が奇数の取引を抽出してください

52. Member_ID が3桁の会員の取引を抽出してください

53. Member_ID に「1」と「3」が連続して含まれる取引を抽出してください

54. Member_ID が「1」で始まり、任意の数字が続く会員の取引を抽出してください

55. Product_IDごとの Quantityの最頻値を集計し、最頻値が3以上の商品を抽出してください

56. Product_IDごとのQuantityの最頻値を計算し、最頻値が最大の商品を抽出してください

57. Store_ID ごとにAmountの分散を計算し、分散が大きい順にソートしてください

58. Member_ID ごとにAmountの標準偏差を計算し、標準偏差が4000以上の会員を抽出してください

59. 会員データにおいて年齢ごとに会員数を集計し、会員数が多い順にソートしてください

60. 会員データの年齢の中央値を計算し、それより上の会員を抽出してください

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック61本目以降いってみましょう!

Python✕データサイエンス100本ノック:61本目〜70本目

61. Amountの大きいものから順番にランクを付与した上で昇順で並び替えてください。また同じAmountの場合は先に出現したものに高いランクを付与してください。

62. Member_ID ごとの合計Amountに対して、パーセンタイル値を計算して低い順に並び替えてください

63. 年代を縦(行)、性別を横(列)に持つテーブルで、各セグメントごとの平均取引金額を集計してください

64. 前の課題のテーブルを、年代と性別が縦に並ぶように変換してください

65. 年代✕性別のごとの取引回数を集計し表示してください

66. Amount が2000円以上なら 1、それ未満なら 0 を割り振ったフラグを新しいカラムに追加してください

67. Quantity の平均値以上の取引に 1、それ未満に 0 のフラグを追加してください

68. 顧客ごとの合計Amountに基づいて、〜25%点、〜50%点、〜75%点、〜100%点ごとに4つのカテゴリに分け、そのカテゴリを新しいカラムとして追加してください

69. Quantityが小さい順に等しく3つのカテゴリに分け、そのカテゴリを新しいカラムに追加してください

70. Gender カラムをダミー変数化してください

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック71本目以降いってみましょう!

Python✕データサイエンス100本ノック:71本目〜80本目

71. Amount カラムを標準化して新しいカラムを追加してください

72. 取引データ全体のうち10%をランダムにサンプリングしてください

73. 会員データの20%をランダムにサンプリングしてください

74. Amount が5000円以上の取引からランダムに5件をサンプリングしてください

75. Gender を層化基準にして取引データから20%抽出してください

76. Amount の平均から1σ以上離れた取引を外れ値として抽出してください(本来は3σ)

77. 現在のmember_dfをCSVファイルとして出力をしてください

78. seaborn を使って、merged_dfの数値カラム間の相関行列をヒートマップで可視化してください

79. plotlyを使って、merged_dfの数値カラム間の相関行列をヒートマップで可視化してください

80. matplotlib を使って、月ごとの合計Amountを棒グラフで表示してください

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック81本目以降いってみましょう!

Python✕データサイエンス100本ノック:81本目〜90本目

81. seaborn を使って、Store_ID ごとの取引数をカウントプロットで可視化してください

82. seaborn を使って、Store_ID ごとの合計Amountを棒グラフで表示してください

83. Plotlyを使って会員ごとの取引数を可視化してください

84. matplotlib を使って、日ごとの売上金額を折れ線グラフで表示してください

85. seaborn を使って、Amount の分布を箱ひげ図で表示してください

86. Days_Since_Registration に基づく顧客の分布を plotly の箱ひげ図で可視化してください

87. matplotlib を使って、Amount と Days_Since_Registration の関係を散布図で表示してください

88. plotly を使って、Days_Since_Registration と Amount の関係を散布図で表示してください。Store_IDごとに色を変えてください

89. seaborn の pairplot を使って、merged_dataの数値カラムの相関をペアプロットで可視化してください

90. plotly を使って、Product_ID ごとの売上と販売数量をバブルチャートで表示してください。Product_IDがX軸でAmountがY軸、そしてQuantityがバブルの大きさになるようにしてください

どこまで出来たでしょうか?

それでは続いてPython✕データサイエンス100本ノック91本目以降いってみましょう!

Python✕データサイエンス100本ノック:91本目〜100本目

91. Amount カラムの分布をカーネル密度推定プロットで可視化してください

92. seaborn の regplot を使って、Amount と Days_Since_Registration の散布図に回帰直線を追加して可視化してください

93. seaborn の jointplot を使って、Amount と Days_Since_Registration の相関をヒストグラムと散布図を組み合わせた形で可視化してください

94. seaborn の violinplot を使って、Store_IDが1,3,5 の Quantity の分布を Violinプロットで可視化してください

95. matplotlib を使って、店舗ごとの売上合計をエリアチャートで可視化してください

96. matplotlib を使って、Store_ID ごとの売上を円グラフ(パイチャート)で可視化してください

97. Store_ID ごとの売上合計を plotly の円グラフ(パイチャート)で可視化してください

98. 取引日 ごとの売上累積を plotly のエリアチャートで可視化してください

99. Amount の分布を plotly のヒストグラムで可視化してください

100. Age と Days_Since_Registration の関係を散布図で可視化し、色分けを性別(Gender)に基づいて行ってください

Python✕データサイエンス100本ノック まとめ

いかがだったでしょうか?

何問正解できたでしょうか?

何度も繰り返し挑戦してぜひ自分のものにしてくださいね!

繰り返しになりますが、本記事で取り上げているノックの41本目以降&各問題の詳しい解説は以下のUdemy講座で解説していますので、ぜひ興味のある方はチェックしてみてください!

【実践】Python✕データサイエンス加工・集計・可視化処理100本ノック!実務でよく使う100個の問題にチャレンジ!

Udemy100
【時間】4.5時間
【レベル】初級〜中級

Python✕データサイエンス関連の100問に挑戦して腕試し!

\30日以内なら返金無料/このコースを見てみる

以下のリンクから94%OFFになる講師クーポンを獲得できますので購入する際はこちらをご利用ください。

\94%OFFクーポンをチェックする/Udemyのクーポンはこちら

また、さらに詳しくAIやデータサイエンスの勉強がしたい!という方は当サイト「スタビジ」が提供するスタビジアカデミーというサービスで体系的に学ぶことが可能ですので是非参考にしてみてください!

AIデータサイエンス特化スクール「スタアカ」

スタアカトップ
【価格】ライトプラン:1280円/月
プレミアムプラン:149,800円
【オススメ度】
【サポート体制】
【受講形式】オンライン形式
【学習範囲】データサイエンスを網羅的に学ぶ
実践的なビジネスフレームワークを学ぶ
SQLとPythonを組み合わせて実データを使った様々なワークを行う
マーケティングの実行プラン策定
マーケティングとデータ分析の掛け合わせで集客マネタイズ

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「スタアカ」!!

当メディアが運営するスクールです。

24時間以内の質問対応と現役データサイエンティストによる複数回のメンタリングを実施します!

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください!

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコースになっています!

Pythonが初めての人でも学べるようなカリキュラムしておりますので是非チェックしてみてください!

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったり・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践してもらったりする盛りだくさんの内容になってます!

・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析
・世界最大手小売企業のウォルマートの実データを用いた需要予測
・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定
・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践して稼ぐ

スタビジアカデミーでデータサイエンスをさらに深く学ぼう!

スタアカサービスバナースタビジのコンテンツをさらに深堀りしたコンテンツが動画と一緒に学べるスクールです。

プレミアムプランでは私がマンツーマンで伴走させていただきます!ご受講お待ちしております!

スタビジアカデミーはこちら