Pythonでのデータ分析基礎:Pandas・NumPy・Matplotlibで始めるデータサイエンス入門
Pythonでのデータ分析基礎:Pandas・NumPy・Matplotlibで始めるデータサイエンス入門
ねえねえ、キミ!!「データ分析やってみたい!!」って思ってるのに、「どのライブラリから手をつけたらいいんだヨ……😭」って迷ってたりしナイ?僕さ、最初にその沼にハマってサ、何日か溶かしちゃったんだヨネ(笑)。でも大丈夫!!今日はそのへんをぜんぶ、丁寧に、説明しちゃいますヨ✨
はじめに:なぜPythonデータ分析にこの3つのライブラリがセットなのか
Pythonデータ分析の世界には、いわゆる「三種の神器」って呼ばれる組み合わせがあってサ💡
- NumPy(ナンパイ):数値計算の土台。配列計算が超速いヤツ
- Pandas(パンダス):表形式データを自在に操るヤツ
- Matplotlib(マットプロットリブ):グラフをキレイに描くヤツ
処理の流れはこんな感じネ!!
NumPy(数値基盤) → Pandas(データ加工・集計) → Matplotlib(可視化)
コレだけで、一般的なデータ分析タスクの**約80%**はカバーできちゃうんですヨ😆 スゴくナイ!? まあ最近はPolarsとかDuckDBとか新しいヤツも出てきてるケド、まずはこの3つを押さえておけばOK!!入門の王道は変わってないデスネ🎵
Python データ分析の環境構築:Anaconda と pip で NumPy・Pandas・Matplotlib をセットアップする
まずはちゃんと動く環境を作りましょうネ♪ 2026年現在、Python 3.11以上を使うのがオススメですヨ!!
初心者にはAnacondaがラクちんデス。 pipでもいいケド、ライブラリの競合でハマると泣けるのでサ😅 Anacondaなら最初からほとんど入ってるし、Jupyter Notebookもついてくるんだヨ!!
インストールが済んだら、コレで3つまとめて入れちゃおう!!
pip install numpy pandas matplotlib jupyterlab動作確認はコレで行けるヨ!!コピペしてそのまま走らせてみてネ✨
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
print(f"NumPy: {np.__version__}")
print(f"Pandas: {pd.__version__}")
print(f"Matplotlib: {matplotlib.__version__}")
# 期待される出力例:
# NumPy: 1.26.4
# Pandas: 2.2.1
# Matplotlib: 3.8.3バージョンが表示されたら準備OK!!🎉 ちなみにサ、僕最初に環境変数まわりでハマって「ナンで動かないの!?」って30分悩んだんだヨネ……やらかしちゃいましたヨ……😭
NumPy とは?Python データ分析における数値計算の基盤を理解する
ndarray を使ってみよう:NumPy の配列操作基礎
コレ見てよ!!NumPyの配列、こんなに簡単に作れちゃうんですヨ✨ スゴくナイ!?
import numpy as np
# 1次元配列を作成
arr1d = np.array([1, 2, 3, 4, 5])
# 2次元配列(行列)を作成
arr2d = np.array([[1, 2, 3],
[4, 5, 6]])
# 配列の形状・次元数・データ型を確認
print(arr2d.shape) # → (2, 3) ← 2行3列
print(arr2d.ndim) # → 2 ← 2次元
print(arr2d.dtype) # → int64 ← 整数型shape、ndim、dtype。この3つは絶対覚えておいてネ!!💡
ベクトル化演算で Python データ分析が高速化する仕組み
「なんでNumPyって速いの?」ってキミ、いい質問ですネ!!😆
普通のPythonのリストでループ回すと、1個ずつPythonが解釈して処理するんだヨ。でもNumPyはC言語レベルでまとめて処理するから、100倍とか速いんですヨ!!コレ見てみて!!
import numpy as np
import time
n = 1_000_000
# 普通のPythonリスト(遅い)
lst = list(range(n))
start = time.time()
result = [x * 2 for x in lst]
print(f"Pythonリスト: {time.time() - start:.4f}秒")
# → Pythonリスト: 0.0823秒(環境によって変わるヨ)
# NumPy(爆速)
arr = np.arange(n)
start = time.time()
result = arr * 2
print(f"NumPy: {time.time() - start:.4f}秒")
# → NumPy: 0.0029秒僕の環境だと20〜30倍の差が出たヨ!!スゴくナイ!?🔥 コレ、マジでオススメ!!
あとブロードキャストっていう機能もあってサ、サイズが違う配列同士でも自動でいい感じに計算してくれるんだヨ。コレも見てネ!!✨
arr = np.array([1, 2, 3, 4, 5])
print(arr + 10) # → [11 12 13 14 15] 全要素に10を足す!!
print(arr * 2) # → [ 2 4 6 8 10] 全要素を2倍!!ムダにループ書くクセがあったんだヨネ僕(笑)。NumPyに出会ってから「ループ書かない」を意識するようになりましたヨ!!💡
Pandas とは?Python で表形式データを自在に操るデータ分析ライブラリ入門
DataFrame と Series の基本:Pandas の核心を理解する
Pandasの核心はDataFrame(表)とSeries(列)デスネ💡 コレ見てよ!!こんなに直感的に書けるんですヨ✨
import pandas as pd
# DataFrameの作成
df = pd.DataFrame({
'名前': ['田中', '鈴木', '佐藤', '高橋'],
'売上': [150000, 230000, 180000, 95000],
'地域': ['東京', '大阪', '東京', '名古屋']
})
print(df)
# → 名前 売上 地域
# → 0 田中 150000 東京
# → 1 鈴木 230000 大阪
# → 2 佐藤 180000 東京
# → 3 高橋 95000 名古屋
print(df['売上']) # これがSeries(1次元)
# → 0 150000
# → 1 230000
# → 2 180000
# → 3 95000
# → Name: 売上, dtype: int64CSV ファイルの読み込みと基本確認:Pandas データ分析の第一歩
実際の現場ではCSVやExcelを読み込むのが基本デスネ!!コレ見てよ!!✨
# CSV読み込み
df = pd.read_csv('sales_data.csv', encoding='utf-8')
# まず「どんなデータか」を確認しよう!!
print(df.head()) # 最初の5行を表示
print(df.tail()) # 最後の5行を表示
print(df.info()) # データ型・欠損値の確認
print(df.describe()) # 平均・標準偏差・最小最大などの基本統計量
print(df.isnull().sum()) # 欠損値の列ごとの合計件数info()とdescribe()はデータをもらったらまず最初に打つ呪文ですヨ✨ キミもこれだけ覚えておけばとりあえずOK!!
loc と iloc の使い分け:Pandas でのデータ抽出を完全理解
コレ、最初みんなハマるんだヨネ😅 僕も3回ぐらい間違えたケド(笑)!!コレ見てよ!!
# loc:ラベルで指定(行名・列名)
print(df.loc[0, '名前']) # → '田中' 行ラベル0、列名'名前'
print(df.loc[0:2, '名前':'地域']) # スライスも可能(両端を含む!!)
# iloc:整数インデックスで指定(0始まり)
print(df.iloc[0, 0]) # → '田中' 0行目の0列目
print(df.iloc[0:3, 0:2]) # スライス(終端は含まない!!)シンプルに言うとサ「名前で指定したいならloc、番号で指定したいならiloc」って覚えちゃおう!!💡
Pandas のデータクリーニング:欠損値・重複・型変換をまとめて処理
ちなみにサ、ちょっと聞いてネ。先週、仕事でもらったCSVが列名に全角スペース入りまくってて、気づかずに3時間溶かしたんだヨ……。データの汚さとは、戦い続けですヨ僕……😂
コレ見てよ!!現実のデータはホントに汚いんだケド、こうすれば対処できるんですヨ!!✨
# 欠損値の処理
df['売上'].fillna(df['売上'].mean(), inplace=True) # 平均値で埋める
df.dropna(subset=['名前'], inplace=True) # 名前がNaNの行は削除
# 重複削除
df.drop_duplicates(inplace=True)
# データ型変換
df['売上'] = df['売上'].astype(int)
print(df.isnull().sum()) # → 全列 0 になってればOK!!groupby で集計:Pandas データ集計を一行でこなす方法
コレ見てヨ!!グループ集計が一行でできちゃうんだヨ!!🔥 スゴくナイ!?
# 地域ごとの売上合計
region_sales = df.groupby('地域')['売上'].sum().reset_index()
print(region_sales)
# → 地域 売上
# → 0 大阪 230000
# → 1 名古屋 95000
# → 2 東京 330000
# 複数の集計を一度に
summary = df.groupby('地域').agg(
売上合計=('売上', 'sum'),
売上平均=('売上', 'mean'),
件数=('売上', 'count')
).reset_index().sort_values('売上合計', ascending=False)
print(summary)動いた時サ、思わず「おおっ!!」って声出ちゃいましたヨ😆 妻に怒られたケド!!(笑)
【2026年注目】Pandas 3.0 の変更点:Copy-on-Write とは?
ちょっと聞いてヨ!!Pandas 3.0から**Copy-on-Write(CoW)**がデフォルトになったんだヨネ💡 コレ何がスゴいかって言うとサ、こういうコードの挙動が変わったんですヨ!!
# Pandas 3.0以前:元のdfも変わることがあった(バグの温床!!)
# Pandas 3.0以降:スライスは独立したコピーとして扱われる
subset = df[df['地域'] == '東京'].copy() # .copy()を明示するのが安全
subset['売上'] = subset['売上'] * 1.1 # subsetだけ変わる。dfは変わらない!!さらにPyArrowバックエンドを使うと、文字列処理が5〜10倍速くなって、メモリも最大50%削減できるんですネ🎵 コレは大規模データで効いてくるヤツですヨ!!
Matplotlib とは?Python でデータを可視化するグラフ描画ライブラリ入門
Figure と Axes の基本構造:Matplotlib の描画の仕組みを理解する
Matplotlibはちょっとクセがあってサ、Figure(全体の枠)とAxes(グラフの描画エリア)の2層構造になってるんだヨ!!コレ見てよ!!✨
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
# データ
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales = [150, 180, 220, 195, 260, 310]
# 折れ線グラフ
ax.plot(months, sales, marker='o', linewidth=2, color='steelblue', label='売上')
ax.set_title('月次売上推移', fontsize=16)
ax.set_xlabel('月', fontsize=12)
ax.set_ylabel('売上(万円)', fontsize=12)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# → 折れ線グラフが表示される!!右肩上がりのトレンドが一目瞭然デスネ✨よく使うグラフの種類:棒グラフ・散布図・ヒストグラム・円グラフを一気に作る
コレ見てよ!!4種類のグラフが一気に作れちゃうんですヨ!!スゴくナイ!?🔥
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 棒グラフ:地域別売上の比較
axes[0, 0].bar(['東京', '大阪', '名古屋'], [350, 280, 190],
color=['coral', 'steelblue', 'green'])
axes[0, 0].set_title('地域別売上')
axes[0, 0].set_ylabel('売上(万円)')
# 散布図:2変数の相関を確認する
x = np.random.randn(100)
y = x * 2 + np.random.randn(100)
axes[0, 1].scatter(x, y, alpha=0.6, color='purple')
axes[0, 1].set_title('相関散布図')
# ヒストグラム:データの分布を把握する
data = np.random.normal(50, 15, 1000)
axes[1, 0].hist(data, bins=30, color='orange', edgecolor='black', alpha=0.7)
axes[1, 0].set_title('売上分布')
# 円グラフ:構成比を視覚的に表現する
sizes = [40, 30, 20, 10]
labels = ['東京', '大阪', '名古屋', 'その他']
axes[1, 1].pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
axes[1, 1].set_title('地域シェア')
plt.tight_layout()
plt.show()
# → 4つのグラフが2×2のレイアウトで表示される!!Matplotlib 日本語文字化け対策:□□□□にならないための設定
ちょっと聞いてヨ……コレ知らないと日本語が□□□□になっちゃうんだヨネ😭 僕も盛大にやらかしちゃいましたヨ……😭 コレで解決デスヨ!!✨
import matplotlib.pyplot as plt
import matplotlib
# 日本語フォント設定(環境によって変える)
matplotlib.rcParams['font.family'] = 'IPAexGothic' # Linux/Mac
# matplotlib.rcParams['font.family'] = 'MS Gothic' # Windows
# もしくはjapanize-matplotlibを使う方法が一番ラク!!
# pip install japanize-matplotlib
import japanize_matplotlib # コレを import するだけでOK!!japanize-matplotlibはホントに便利だヨ!!コレ、マジでオススメ!!🎉
実践ハンズオン:NumPy・Pandas・Matplotlib を使った売上データ分析を一気通貫で体験
さあ、学んだことを全部使ってみよう!!ここが一番楽しいとこデスヨ😆
ステップ①:サンプルデータの作成
コレ見てよ!!まずはデータを用意しますヨ!!✨
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
# 再現性のため乱数シードを固定
np.random.seed(42)
# サンプルデータ作成(実際はCSVを読み込む場面)
dates = pd.date_range('2025-01-01', periods=365, freq='D')
df = pd.DataFrame({
'日付': dates,
'カテゴリ': np.random.choice(['電子機器', 'アパレル', '食品', '雑貨'], size=365),
'売上': np.random.randint(50000, 500000, size=365),
'個数': np.random.randint(1, 100, size=365),
'地域': np.random.choice(['東京', '大阪', '名古屋', '福岡'], size=365)
})
# 欠損値を意図的にランダムに混入(現実的にするため)
df.loc[np.random.choice(df.index, 20), '売上'] = np.nan
print(df.head())
print(df.info())
# → 365行 × 6列、売上列に20件のNaNがある状態!!ステップ②:クリーニングと前処理
# 欠損値を各カテゴリの中央値で補完
df['売上'] = df.groupby('カテゴリ')['売上'].transform(
lambda x: x.fillna(x.median())
)
# 日付から月・曜日を抽出
df['月'] = df['日付'].dt.month
df['曜日'] = df['日付'].dt.day_name()
# 売上が0以下の異常値を除去
df = df[df['売上'] > 0]
print(f"クリーニング後のデータ件数: {len(df)}") # → 365(異常値なし)
print(df.isnull().sum()) # → 全列 0 !!ステップ③:探索的データ分析(EDA)
# 月別売上集計
monthly = df.groupby('月')['売上'].sum().reset_index()
# カテゴリ別集計
category = df.groupby('カテゴリ').agg(
売上合計=('売上', 'sum'),
平均売上=('売上', 'mean'),
件数=('売上', 'count')
).reset_index().sort_values('売上合計', ascending=False)
print(category)
# → カテゴリ 売上合計 平均売上 件数
# → 0 電子機器 xxxxxxxx xxxxxxxxx xx
# → ...(カテゴリ別の集計結果が売上順に並ぶ)
# 相関分析(売上と個数の関係を数値で把握)
corr = df[['売上', '個数']].corr()
print(corr)
# → 売上と個数の相関係数が表示される!!ステップ④:可視化 ― グラフで分析結果を一目瞭然にする
コレが一番テンション上がるとこデスヨ!!🔥 スゴくナイ!?✨
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
# 月次売上トレンド(折れ線グラフ)
axes[0].plot(monthly['月'], monthly['売上'] / 1e6,
marker='o', linewidth=2, color='steelblue')
axes[0].set_title('月次売上トレンド', fontsize=14)
axes[0].set_xlabel('月')
axes[0].set_ylabel('売上(百万円)')
axes[0].grid(True, alpha=0.3)
# カテゴリ別売上(棒グラフ)
axes[1].bar(category['カテゴリ'], category['売上合計'] / 1e6,
color=['coral', 'steelblue', 'green', 'orange'])
axes[1].set_title('カテゴリ別売上合計', fontsize=14)
axes[1].set_xlabel('カテゴリ')
axes[1].set_ylabel('売上(百万円)')
axes[1].tick_params(axis='x', rotation=15)
# 売上分布(ヒストグラム)
axes[2].hist(df['売上'] / 1e4, bins=30,
color='purple', edgecolor='black', alpha=0.7)
axes[2].set_title('売上分布', fontsize=14)
axes[2].set_xlabel('売上(万円)')
axes[2].set_ylabel('件数')
plt.tight_layout()
plt.show()
# → 3つのグラフが横並びで表示される!!データの全体像が一気につかめるヨ!!動いたヨ!!グラフになった瞬間、一気にデータが語りかけてくる感じ、たまらないデスネ😆 コレがデータ分析の醍醐味ですヨ、キミ!!✨
まとめ:Python データ分析の基礎、NumPy・Pandas・Matplotlib をマスターしよう
お疲れさまデシタ、キミ!!🎉 今日やってきたことをまとめると、こんな感じデスネ💡
| ライブラリ | 主な役割 | キーポイント |
|---|---|---|
| NumPy | 数値計算の基盤 | ndarray・ベクトル化演算・ブロードキャスト |
| Pandas | 表形式データの加工・集計 | DataFrame・loc/iloc・groupby・クリーニング |
| Matplotlib | データの可視化 | Figure/Axes・各種グラフ・日本語対応 |
この3つをセットで使いこなせるようになれば、日々のデータ分析タスクの大半はこなせちゃうんですヨ!!💪
次のステップとしてはサ、こんな感じで広げていけばいいデスヨ!!
- 統計的検定:SciPyを使った仮説検定・t検定など
- 機械学習:scikit-learnでの予測モデル構築
- インタラクティブ可視化:PlotlyやBokehでもっとリッチなグラフを描く
- 大規模データ処理:Polarsで爆速データ処理を体験する
最初は「難しそう……」って思うかもしれないケド、コードをコピペして動かして、少しずつ改造していくのが一番の近道デスヨ!!キミなら絶対できるから、まずは今日のコードを一個動かしてみてネ✨ 一緒に楽しいデータ分析ライフを送りましょうヨ!!😆🎵
関連記事
Pandas入門:データ分析の基本操作完全ガイド【2026年最新版】
Pythonのデータ分析ライブラリPandasの使い方を初心者向けに解説。Series・DataFrameの基本操作、CSVの読み込み、NumPyとの違い、PolarsやDuckDBとの比較まで2026年最新情報をわかりやすく紹介します。