Step 23:データを確認する基本メソッド

🔍 ステップ23: データを確認する基本メソッド

データの中身を素早くチェックする方法をマスターしよう!

ステップ22では、PandasとDataFrameの基本を学びました。今回は、DataFrameの中身を確認するための「基本メソッド」を学びます。データ分析の第一歩は、まず「データを知ること」です!

📖 このステップで学ぶこと

・head()とtail()でデータの最初と最後を確認する方法

・info()でデータの構造を把握する方法

・describe()で統計情報を一覧表示する方法

・shape、columns、indexでデータの形を確認する方法

・dtypesでデータ型を確認する方法

・データ確認の実践フロー(6ステップ)

学習時間の目安: 2〜2.5時間

🎯 1. なぜデータ確認が重要なのか?

データ分析を始める前に、必ず「データの中身を確認する」必要があります。料理で言えば、調理を始める前に材料をチェックするようなものです。

🔰 データを確認せずに進めると…

❌ こんな問題が起きます

問題1:欠損値に気づかない

 ・データに空欄があると、計算結果がおかしくなります

 ・「なぜか平均値が出ない」「合計が合わない」などの原因になります

問題2:データ型の間違い

 ・数字なのに文字列として読み込まれると、計算できません

 ・「100」+「200」=「100200」になってしまいます(文字列の連結)

問題3:想定と違うデータ

 ・列名が違う、行数が想定と違うなど

 ・後から大きな問題に気づき、やり直しになります

✅ データ確認で分かること

今回学ぶメソッドを使うと、以下のことがすぐに分かります。

📌 確認できる5つのポイント

1. データの形:何行×何列あるか?(例:100行×5列)

2. データの中身:どんな値が入っているか?(例:数値、文字列)

3. データの型:整数?小数?文字列?日付?

4. 欠損値:空欄がどれくらいあるか?

5. 統計情報:平均値、最大値、最小値など

👀 2. head()とtail() – データの最初と最後を見る

大きなデータを全部表示すると、画面に収まりません。何千行ものデータを全部見る必要はありません。head()tail()を使えば、データの一部だけを素早く確認できます。

🔰 head() – 最初の数行を表示する

head()は「頭」という意味で、DataFrameの最初の5行を表示します。データが正しく読み込まれたかを確認するのに最適です。

📝 head()の書き方

df.head() → 最初の5行を表示(デフォルト)

df.head(n) → 最初のn行を表示

・dfはDataFrameの変数名です

・nには表示したい行数を数字で指定します

・( )の中を空にすると、自動的に5行表示されます

実際にコードを書いて確認してみましょう。まず、サンプルデータを作成します。

コード:サンプルデータを作成してhead()を使う

# Pandasをインポート
import pandas as pd

# サンプルデータを作成(8日分の売上データ)
data = {
    '日付': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', 
             '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08'],
    '売上': [120, 135, 150, 145, 160, 175, 180, 190],
    '来客数': [45, 52, 58, 55, 62, 68, 72, 75]
}

# DataFrameを作成
df = pd.DataFrame(data)

# 最初の5行を表示(デフォルト)
print("===== 最初の5行(head()) =====")
print(df.head())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== 最初の5行(head()) =====
         日付   売上  来客数
0  2024-01-01  120    45
1  2024-01-02  135    52
2  2024-01-03  150    58
3  2024-01-04  145    55
4  2024-01-05  160    62

💡 コードの解説

import pandas as pd

 ・Pandasライブラリを読み込みます

 ・「pd」という短い名前で使えるようにしています

data = { … }

 ・辞書形式でデータを用意します

 ・キー(’日付’など)が列名、値(リスト)がデータになります

df = pd.DataFrame(data)

 ・辞書からDataFrameを作成します

 ・dfという変数に格納しています

df.head()

 ・dfの最初の5行を表示します

 ・左端の0, 1, 2, 3, 4は「インデックス」(行番号)です

📝 表示する行数を変える

head()の( )の中に数字を入れると、表示する行数を変えられます。

コード:表示する行数を指定する

import pandas as pd

data = {
    '日付': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', 
             '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08'],
    '売上': [120, 135, 150, 145, 160, 175, 180, 190],
    '来客数': [45, 52, 58, 55, 62, 68, 72, 75]
}

df = pd.DataFrame(data)

# 最初の3行だけ表示
print("===== 最初の3行(head(3)) =====")
print(df.head(3))

print()

# 最初の1行だけ表示
print("===== 最初の1行(head(1)) =====")
print(df.head(1))

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== 最初の3行(head(3)) =====
         日付   売上  来客数
0  2024-01-01  120    45
1  2024-01-02  135    52
2  2024-01-03  150    58

===== 最初の1行(head(1)) =====
         日付   売上  来客数
0  2024-01-01  120    45

💡 head()の使いどころ

head(3):3行だけ表示されます

head(1):1行だけ表示されます

head(10):10行表示されます

データが大きくても、少ない行数で素早く確認できます。

📝 tail() – 最後の数行を表示する

tail()は「尻尾」という意味で、DataFrameの最後の5行を表示します。データの終わり部分に問題がないか確認するのに使います。

📝 tail()の書き方

df.tail() → 最後の5行を表示(デフォルト)

df.tail(n) → 最後のn行を表示

・head()と同じように、( )の中に数字を入れると行数を変えられます

コード:tail()でデータの最後を確認

import pandas as pd

data = {
    '日付': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', 
             '2024-01-05', '2024-01-06', '2024-01-07', '2024-01-08'],
    '売上': [120, 135, 150, 145, 160, 175, 180, 190],
    '来客数': [45, 52, 58, 55, 62, 68, 72, 75]
}

df = pd.DataFrame(data)

# 最後の5行を表示(デフォルト)
print("===== 最後の5行(tail()) =====")
print(df.tail())

print()

# 最後の2行だけ表示
print("===== 最後の2行(tail(2)) =====")
print(df.tail(2))

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== 最後の5行(tail()) =====
         日付   売上  来客数
3  2024-01-04  145    55
4  2024-01-05  160    62
5  2024-01-06  175    68
6  2024-01-07  180    72
7  2024-01-08  190    75

===== 最後の2行(tail(2)) =====
         日付   売上  来客数
6  2024-01-07  180    72
7  2024-01-08  190    75

💡 なぜtail()も必要なのか?

データの最後の方には、こんな問題が隠れていることがあります:

 ・途中でデータが切れている(最新データが入っていない)

 ・最後の行に不要なデータがある(合計行など)

 ・最後のデータに誤りがある

head()とtail()をセットで使うのが、データ確認の基本です!

📌 head()とtail()の使い分け

メソッド 表示位置 確認すること
head() 最初の数行 データが正しく読み込まれたか、列名は正しいか
tail() 最後の数行 データの終わり部分に問題がないか、最新データが入っているか

📊 3. info() – データの構造を把握する

info()は、DataFrameの構造全体を一覧表示するメソッドです。行数、列数、データ型、欠損値の有無など、データの全体像が一目で分かります。

🔰 info()の基本的な使い方

📝 info()の書き方

df.info()

・引数(( )の中)は不要です

・結果は自動的に画面に表示されます

・print()で囲まなくてもOKです

コード:info()でデータの構造を確認

import pandas as pd

# 商品データを作成
data = {
    '商品名': ['リンゴ', 'バナナ', 'オレンジ', 'イチゴ', 'ブドウ'],
    '価格': [150, 100, 120, 300, 250],
    '在庫': [50, 80, 60, 30, 40],
    'カテゴリ': ['果物', '果物', '果物', '果物', '果物']
}

df = pd.DataFrame(data)

# まずデータの中身を確認
print("===== DataFrame =====")
print(df)

print()

# info()でデータの構造を確認
print("===== info()の結果 =====")
df.info()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
    商品名   価格  在庫 カテゴリ
0   リンゴ  150   50    果物
1   バナナ  100   80    果物
2  オレンジ  120   60    果物
3   イチゴ  300   30    果物
4   ブドウ  250   40    果物

===== info()の結果 =====
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   商品名     5 non-null      object
 1   価格      5 non-null      int64 
 2   在庫      5 non-null      int64 
 3   カテゴリ    5 non-null      object
dtypes: int64(2), object(2)
memory usage: 288.0+ bytes

💡 info()の結果の読み方

RangeIndex: 5 entries, 0 to 4

 ・データが5行あることを示します

 ・インデックス(行番号)は0から4までです

Data columns (total 4 columns)

 ・列が4つあることを示します

Non-Null Count(欠損値でない数)

 ・「5 non-null」は、5個すべてにデータが入っているという意味です

 ・欠損値(空欄)がある場合は、この数字が減ります

Dtype(データ型)

 ・int64は整数、objectは文字列を表します

memory usage

 ・このDataFrameが使っているメモリ量です

📝 欠損値があるデータでinfo()を使う

info()は欠損値(空欄)を見つけるのに非常に便利です。実際に欠損値があるデータで確認してみましょう。

コード:欠損値を含むデータの確認

import pandas as pd
import numpy as np  # 欠損値を作るために使用

# 欠損値を含むデータを作成
data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, np.nan, 24, 26],        # np.nanは欠損値(空欄)
    '都市': ['東京', '大阪', '名古屋', np.nan, '札幌'],
    '年収': [400, 380, 420, 390, np.nan]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

print("===== info()の結果 =====")
df.info()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   名前    年齢    都市     年収
0  太郎  25.0    東京  400.0
1  花子  23.0    大阪  380.0
2  次郎   NaN   名古屋  420.0
3  美咲  24.0   NaN  390.0
4  健太  26.0    札幌    NaN

===== info()の結果 =====
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   名前      5 non-null      object 
 1   年齢      4 non-null      float64
 2   都市      4 non-null      object 
 3   年収      4 non-null      float64
dtypes: float64(2), object(2)
memory usage: 288.0+ bytes

⚠️ Non-Null Countに注目!

5 entries(5行)なのに4 non-nullということは:

  5 – 4 = 1つの欠損値があるという意味です

この例では:

 ・名前列:5 non-null → 欠損値なし

 ・年齢列:4 non-null → 1つ欠損

 ・都市列:4 non-null → 1つ欠損

 ・年収列:4 non-null → 1つ欠損

💡 NaNとは?

NaNは「Not a Number」の略で、「データがない(欠損値)」ことを意味します。

 ・np.nanでNaNを作成できます(NumPyが必要)

 ・CSVファイルを読み込むとき、空欄は自動的にNaNになります

 ・NaNがある列は、整数(int64)から小数(float64)に変わることがあります

📈 4. describe() – 統計情報を一覧表示

describe()は、数値列の統計情報を自動的に計算して表示するメソッドです。平均値、最大値、最小値などが一目で分かります。

🔰 describe()の基本的な使い方

📝 describe()の書き方

df.describe() → 数値列の統計情報を表示

df.describe(include=’all’) → 全ての列の統計情報を表示

・デフォルトでは数値列(整数、小数)だけが対象です

・include=’all’を指定すると、文字列列も含まれます

コード:describe()で統計情報を確認

import pandas as pd

# 商品データを作成
data = {
    '商品名': ['商品A', '商品B', '商品C', '商品D', '商品E'],
    '価格': [1000, 1500, 2000, 1200, 3000],
    '販売数': [150, 200, 120, 180, 90],
    '在庫': [50, 80, 60, 30, 40]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

print("===== describe()の結果 =====")
print(df.describe())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   商品名    価格  販売数  在庫
0  商品A  1000   150   50
1  商品B  1500   200   80
2  商品C  2000   120   60
3  商品D  1200   180   30
4  商品E  3000    90   40

===== describe()の結果 =====
              価格       販売数         在庫
count     5.000000    5.000000   5.000000
mean   1740.000000  148.000000  52.000000
std     807.700519   43.589988  19.391876
min    1000.000000   90.000000  30.000000
25%    1200.000000  120.000000  40.000000
50%    1500.000000  150.000000  50.000000
75%    2000.000000  180.000000  60.000000
max    3000.000000  200.000000  80.000000

💡 describe()で表示される統計量の意味

count:データ数(欠損値を除いた数)

mean:平均値(全データの合計÷データ数)

std:標準偏差(データのばらつき具合を表す数値)

min:最小値(一番小さい値)

25%:第1四分位数(小さい方から25%の位置の値)

50%:中央値(小さい方から50%の位置の値)

75%:第3四分位数(小さい方から75%の位置の値)

max:最大値(一番大きい値)

📌 統計量の読み方(価格列の場合)

統計量 意味
count 5 5個のデータがある
mean 1740 価格の平均は1,740円
min 1000 最も安い商品は1,000円
max 3000 最も高い商品は3,000円

📝 文字列列も含めて表示する

デフォルトでは数値列だけが表示されますが、include=’all’を使うと文字列列も含めて表示できます。

コード:全ての列の統計情報を表示

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '年齢': [25, 23, 27, 24, 26],
    '都市': ['東京', '大阪', '東京', '東京', '大阪']
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

print("===== 数値列のみ(デフォルト) =====")
print(df.describe())

print()

print("===== 全ての列を含める =====")
print(df.describe(include='all'))

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   名前  年齢  都市
0  太郎  25  東京
1  花子  23  大阪
2  次郎  27  東京
3  美咲  24  東京
4  健太  26  大阪

===== 数値列のみ(デフォルト) =====
            年齢
count   5.000000
mean   25.000000
std     1.581139
min    23.000000
25%    24.000000
50%    25.000000
75%    26.000000
max    27.000000

===== 全ての列を含める =====
        名前          年齢   都市
count    5    5.000000    5
unique   5         NaN    2
top     太郎         NaN   東京
freq     1         NaN    3
mean   NaN   25.000000  NaN
std    NaN    1.581139  NaN
min    NaN   23.000000  NaN
25%    NaN   24.000000  NaN
50%    NaN   25.000000  NaN
75%    NaN   26.000000  NaN
max    NaN   27.000000  NaN

💡 文字列列の統計情報

文字列列には、数値列とは違う統計情報が表示されます:

count:データ数

unique:ユニークな(重複しない)値の数

top:最も頻度の高い値(最頻値)

freq:topの出現回数

例:都市列では「unique: 2」なので、東京と大阪の2種類。「top: 東京」「freq: 3」なので、東京が3回出現しています。

🔢 5. shape, columns, index – データの形を確認

DataFrameの基本情報(行数、列数、列名、インデックス)を個別に取得するための属性を学びます。これらはメソッド(関数)ではなく属性なので、( )を付けません。

🔰 shape – データの形状(行数×列数)

📝 shapeの書き方

df.shape → (行数, 列数) のタプルを返す

df.shape[0] → 行数だけ取得

df.shape[1] → 列数だけ取得

・shapeは属性なので、( )は付けません

・結果は(行数, 列数)のタプル(組み合わせ)で返されます

コード:shapeでデータの形を確認

import pandas as pd

data = {
    '商品名': ['商品A', '商品B', '商品C'],
    '価格': [1000, 1500, 2000],
    '在庫': [50, 80, 60]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

# shapeでデータの形を確認
print("===== shapeの使い方 =====")
print(f"shape: {df.shape}")
print(f"行数: {df.shape[0]}")
print(f"列数: {df.shape[1]}")

# len()でも行数を取得できる
print(f"len(df)で行数取得: {len(df)}行")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   商品名    価格  在庫
0  商品A  1000   50
1  商品B  1500   80
2  商品C  2000   60

===== shapeの使い方 =====
shape: (3, 3)
行数: 3
列数: 3
len(df)で行数取得: 3行

💡 コードの解説

df.shape

 ・(3, 3) というタプル(組み合わせ)が返されます

 ・最初の数字が行数、2番目が列数です

df.shape[0]

 ・タプルの0番目(行数)を取得します

df.shape[1]

 ・タプルの1番目(列数)を取得します

len(df)

 ・行数だけを取得する別の方法です

📝 columns – 列名の一覧

📝 columnsの書き方

df.columns → 列名の一覧を返す

df.columns.tolist() → 列名をリスト形式で取得

len(df.columns) → 列数を取得

コード:columnsで列名を確認

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [25, 23, 27],
    '都市': ['東京', '大阪', '名古屋'],
    '年収': [400, 380, 420]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

# 列名を確認
print("===== columnsの使い方 =====")
print("列名:")
print(df.columns)

print()

print("列名のリスト:")
print(df.columns.tolist())

print()

print(f"列数: {len(df.columns)}")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   名前  年齢    都市  年収
0  太郎  25    東京 400
1  花子  23    大阪 380
2  次郎  27   名古屋 420

===== columnsの使い方 =====
列名:
Index(['名前', '年齢', '都市', '年収'], dtype='object')

列名のリスト:
['名前', '年齢', '都市', '年収']

列数: 4

📘 index – 行インデックスの一覧

📝 indexの書き方

df.index → インデックスの一覧を返す

df.index.tolist() → インデックスをリスト形式で取得

コード:indexで行インデックスを確認

import pandas as pd

# インデックスに名前を設定したDataFrame
data = {
    '数学': [85, 92, 78],
    '英語': [90, 88, 82],
    '国語': [78, 85, 88]
}

# indexパラメータで行インデックスを指定
df = pd.DataFrame(data, index=['太郎', '花子', '次郎'])

print("===== DataFrame =====")
print(df)

print()

# インデックスを確認
print("===== indexの使い方 =====")
print("インデックス:")
print(df.index)

print()

print("インデックスのリスト:")
print(df.index.tolist())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
    数学  英語  国語
太郎  85   90   78
花子  92   88   85
次郎  78   82   88

===== indexの使い方 =====
インデックス:
Index(['太郎', '花子', '次郎'], dtype='object')

インデックスのリスト:
['太郎', '花子', '次郎']

💡 インデックスとは?

インデックスは、各行を識別するための「ラベル」です。

 ・デフォルトでは0, 1, 2, …という数字が自動的に付きます

 ・自分で名前を設定することもできます(上の例のように)

 ・商品IDや日付をインデックスにすることが多いです

🏷️ 6. dtypes – データ型を確認

dtypesは、各列のデータ型を確認する属性です。計算やデータ操作をする前に、データ型を確認することが重要です。

🔰 dtypesの基本的な使い方

📝 dtypesの書き方

df.dtypes → 全ての列のデータ型を表示

df[‘列名’].dtype → 特定の列のデータ型を取得

・dtypesは属性なので、( )は付けません

コード:dtypesでデータ型を確認

import pandas as pd

# 色々なデータ型を含むデータ
data = {
    '商品ID': [101, 102, 103],
    '商品名': ['リンゴ', 'バナナ', 'オレンジ'],
    '価格': [150.5, 100.0, 120.3],
    '在庫': [50, 80, 60],
    '販売中': [True, True, False]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

# 全ての列のデータ型を確認
print("===== 各列のデータ型 =====")
print(df.dtypes)

print()

# 特定の列のデータ型を確認
print("===== 特定の列のデータ型 =====")
print(f"商品名の型: {df['商品名'].dtype}")
print(f"価格の型: {df['価格'].dtype}")
print(f"販売中の型: {df['販売中'].dtype}")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   商品ID   商品名    価格  在庫   販売中
0   101   リンゴ  150.5   50   True
1   102   バナナ  100.0   80   True
2   103  オレンジ  120.3   60  False

===== 各列のデータ型 =====
商品ID        int64
商品名       object
価格        float64
在庫          int64
販売中          bool
dtype: object

===== 特定の列のデータ型 =====
商品名の型: object
価格の型: float64
販売中の型: bool

📌 Pandasの主なデータ型

データ型 説明
int64 整数 1, 100, -50
float64 小数(浮動小数点数) 3.14, 100.5, -0.5
object 文字列 “東京”, “リンゴ”
bool 真偽値 True, False
datetime64 日付・時刻 2024-01-01

💡 データ型を確認する理由

データ型が間違っていると、予期しないエラーが発生します:

 ・文字列型の数字は計算できない(”100″ + “200” = “100200”)

 ・日付が文字列だと、日付計算ができない

 ・整数に欠損値があると、float64に変換される

分析前に必ずデータ型をチェックすることで、エラーを防げます!

📘 データ型ごとに列を選択する

select_dtypes()を使うと、特定のデータ型の列だけを抽出できます。

コード:データ型で列を選択

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [25, 23, 27],
    '身長': [175.5, 162.3, 180.0],
    '会員': [True, True, False]
}

df = pd.DataFrame(data)

print("===== DataFrame =====")
print(df)

print()

# 数値型(int64, float64)の列だけを抽出
print("===== 数値型の列のみ =====")
print(df.select_dtypes(include=['int64', 'float64']))

print()

# 文字列型(object)の列だけを抽出
print("===== object型の列のみ =====")
print(df.select_dtypes(include=['object']))

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

===== DataFrame =====
   名前  年齢    身長    会員
0  太郎  25  175.5   True
1  花子  23  162.3   True
2  次郎  27  180.0  False

===== 数値型の列のみ =====
   年齢    身長
0  25  175.5
1  23  162.3
2  27  180.0

===== object型の列のみ =====
   名前
0  太郎
1  花子
2  次郎

📋 7. 実践:データ確認の6ステップ

ここまで学んだメソッドを組み合わせて、データを読み込んだら最初に行う「確認の流れ」を実践します。この6ステップを習慣にすると、データ分析がスムーズに進みます。

📌 データ確認の6ステップ

Step 1:head() → データの中身を見る

Step 2:shape → 行数・列数を確認

Step 3:info() → 構造と欠損値を確認

Step 4:describe() → 統計情報を見る

Step 5:dtypes → データ型を確認

Step 6:isnull().sum() → 欠損値の数を確認

コード:データ確認の6ステップを実践

import pandas as pd
import numpy as np

# サンプルデータ(欠損値あり)
data = {
    '日付': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
    '店舗': ['新宿店', '渋谷店', '新宿店', '池袋店', '渋谷店'],
    '売上': [120000, 135000, np.nan, 145000, 160000],
    '来客数': [45, 52, 58, np.nan, 62],
    '天気': ['晴れ', '曇り', '雨', '晴れ', '晴れ']
}

df = pd.DataFrame(data)

# ===== Step 1: 最初の数行を確認 =====
print("=" * 50)
print("Step 1: 最初の数行を確認 → head()")
print("=" * 50)
print(df.head())

# ===== Step 2: データの形状を確認 =====
print("\n" + "=" * 50)
print("Step 2: データの形状を確認 → shape")
print("=" * 50)
print(f"行数: {df.shape[0]}, 列数: {df.shape[1]}")

# ===== Step 3: データの基本情報 =====
print("\n" + "=" * 50)
print("Step 3: データの基本情報 → info()")
print("=" * 50)
df.info()

# ===== Step 4: 数値列の統計情報 =====
print("\n" + "=" * 50)
print("Step 4: 数値列の統計情報 → describe()")
print("=" * 50)
print(df.describe())

# ===== Step 5: 各列のデータ型 =====
print("\n" + "=" * 50)
print("Step 5: 各列のデータ型 → dtypes")
print("=" * 50)
print(df.dtypes)

# ===== Step 6: 欠損値の確認 =====
print("\n" + "=" * 50)
print("Step 6: 欠損値の確認 → isnull().sum()")
print("=" * 50)
print(df.isnull().sum())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

==================================================
Step 1: 最初の数行を確認 → head()
==================================================
         日付   店舗        売上  来客数  天気
0  2024-01-01  新宿店  120000.0  45.0  晴れ
1  2024-01-02  渋谷店  135000.0  52.0  曇り
2  2024-01-03  新宿店       NaN  58.0   雨
3  2024-01-04  池袋店  145000.0   NaN  晴れ
4  2024-01-05  渋谷店  160000.0  62.0  晴れ

==================================================
Step 2: データの形状を確認 → shape
==================================================
行数: 5, 列数: 5

==================================================
Step 3: データの基本情報 → info()
==================================================
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   日付      5 non-null      object 
 1   店舗      5 non-null      object 
 2   売上      4 non-null      float64
 3   来客数     4 non-null      float64
 4   天気      5 non-null      object 
dtypes: float64(2), object(3)
memory usage: 328.0+ bytes

==================================================
Step 4: 数値列の統計情報 → describe()
==================================================
               売上       来客数
count      4.000000   4.000000
mean  140000.000000  54.250000
std    16733.200530   7.500000
min   120000.000000  45.000000
25%   131250.000000  50.250000
50%   140000.000000  55.000000
75%   148750.000000  59.000000
max   160000.000000  62.000000

==================================================
Step 5: 各列のデータ型 → dtypes
==================================================
日付       object
店舗       object
売上      float64
来客数     float64
天気       object
dtype: object

==================================================
Step 6: 欠損値の確認 → isnull().sum()
==================================================
日付      0
店舗      0
売上      1
来客数     1
天気      0
dtype: int64

💡 確認結果からわかること

Step 1(head):データの中身を確認。NaNがあることが分かる

Step 2(shape):5行×5列のデータ

Step 3(info):売上と来客数は4 non-null → 各1つ欠損がある

Step 4(describe):売上の平均は140,000円、来客数の平均は54.25人

Step 5(dtypes):日付がobject型(文字列)→ 日付型に変換が必要かも

Step 6(isnull):売上と来客数にそれぞれ1つの欠損値がある

📝 練習問題

ここまで学んだことを、実際に手を動かして確認しましょう。

問題1:head()とtail()の基本(初級)

📋 問題

1月から12月までの月別売上データを作成し、最初の2行と最後の2行を表示してください。

・月:[‘1月’, ‘2月’, …, ’12月’]

・売上:[100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210]

解答例を見る

コード

import pandas as pd

# 月と売上のリストを作成
months = [f'{i}月' for i in range(1, 13)]
sales = [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210]

# DataFrameを作成
df = pd.DataFrame({
    '月': months,
    '売上': sales
})

# 最初の2行を表示
print("最初の2行:")
print(df.head(2))

# 最後の2行を表示
print("\n最後の2行:")
print(df.tail(2))

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

最初の2行:
    月  売上
0  1月  100
1  2月  110

最後の2行:
     月  売上
10  11月  200
11  12月  210

問題2:shape, columns, indexの確認(初級)

📋 問題

生徒の成績データを作成し、行数、列数、列名のリスト、インデックスのリストを表示してください。

・名前:[‘太郎’, ‘花子’, ‘次郎’]

・数学:[85, 92, 78]

・英語:[90, 88, 82]

・国語:[78, 85, 88]

解答例を見る

コード

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎'],
    '数学': [85, 92, 78],
    '英語': [90, 88, 82],
    '国語': [78, 85, 88]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print(f"\n行数: {df.shape[0]}")
print(f"列数: {df.shape[1]}")
print(f"\n列名: {df.columns.tolist()}")
print(f"インデックス: {df.index.tolist()}")

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  数学  英語  国語
0  太郎  85   90   78
1  花子  92   88   85
2  次郎  78   82   88

行数: 3
列数: 4

列名: ['名前', '数学', '英語', '国語']
インデックス: [0, 1, 2]

問題3:info()とdescribe()の活用(中級)

📋 問題

商品データを作成し、info()とdescribe()を使ってデータの特徴を確認してください。

・商品名:[‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’, ‘商品E’]

・価格:[1000, 1500, 2000, 1200, 3000]

・販売数:[150, 200, 120, 180, 90]

解答例を見る

コード

import pandas as pd

data = {
    '商品名': ['商品A', '商品B', '商品C', '商品D', '商品E'],
    '価格': [1000, 1500, 2000, 1200, 3000],
    '販売数': [150, 200, 120, 180, 90]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print("\n=== info() ===")
df.info()

print("\n=== describe() ===")
print(df.describe())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   商品名    価格  販売数
0  商品A  1000   150
1  商品B  1500   200
2  商品C  2000   120
3  商品D  1200   180
4  商品E  3000    90

=== info() ===
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   商品名     5 non-null      object
 1   価格      5 non-null      int64 
 2   販売数     5 non-null      int64 
dtypes: int64(2), object(1)
memory usage: 248.0+ bytes

=== describe() ===
              価格       販売数
count     5.000000    5.000000
mean   1740.000000  148.000000
std     807.700519   43.589988
min    1000.000000   90.000000
25%    1200.000000  120.000000
50%    1500.000000  150.000000
75%    2000.000000  180.000000
max    3000.000000  200.000000

問題4:データ型の確認と選択(中級)

📋 問題

色々なデータ型を含むDataFrameを作成し、各列のデータ型を表示してください。さらに、数値型の列だけを抽出してください。

・名前:[‘太郎’, ‘花子’, ‘次郎’]

・年齢:[25, 23, 27]

・身長:[175.5, 162.3, 180.0]

・都市:[‘東京’, ‘大阪’, ‘名古屋’]

解答例を見る

コード

import pandas as pd

data = {
    '名前': ['太郎', '花子', '次郎'],
    '年齢': [25, 23, 27],
    '身長': [175.5, 162.3, 180.0],
    '都市': ['東京', '大阪', '名古屋']
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print("\n各列のデータ型:")
print(df.dtypes)

print("\n数値型の列のみ:")
numeric_df = df.select_dtypes(include=['int64', 'float64'])
print(numeric_df)

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
   名前  年齢    身長    都市
0  太郎  25  175.5    東京
1  花子  23  162.3    大阪
2  次郎  27  180.0   名古屋

各列のデータ型:
名前       object
年齢        int64
身長      float64
都市       object
dtype: object

数値型の列のみ:
   年齢    身長
0  25  175.5
1  23  162.3
2  27  180.0

問題5:欠損値を含むデータの確認(上級)

📋 問題

欠損値を含むDataFrameを作成し、以下を確認してください:

・各列の欠損値の数

・各列の欠損値の割合(%)

・各列の有効データ数

データ:

・日付:[‘2024-01’, ‘2024-02’, ‘2024-03’, ‘2024-04’]

・売上:[100, None, 120, 130]

・来客数:[50, 60, None, 70]

・天気:[‘晴れ’, ‘雨’, ‘晴れ’, None]

解答例を見る

コード

import pandas as pd
import numpy as np

data = {
    '日付': ['2024-01', '2024-02', '2024-03', '2024-04'],
    '売上': [100, np.nan, 120, 130],
    '来客数': [50, 60, np.nan, 70],
    '天気': ['晴れ', '雨', '晴れ', np.nan]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)

print("\n=== 欠損値の確認 ===")

print("\n各列の欠損値の数:")
print(df.isnull().sum())

print("\n各列の欠損値の割合(%):")
print((df.isnull().sum() / len(df) * 100).round(2))

print("\n各列の有効データ数:")
print(df.count())

print("\n=== info()で確認 ===")
df.info()

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

DataFrame:
      日付     売上  来客数   天気
0  2024-01  100.0  50.0   晴れ
1  2024-02    NaN  60.0    雨
2  2024-03  120.0   NaN   晴れ
3  2024-04  130.0  70.0  NaN

=== 欠損値の確認 ===

各列の欠損値の数:
日付      0
売上      1
来客数     1
天気      1
dtype: int64

各列の欠損値の割合(%):
日付       0.0
売上      25.0
来客数     25.0
天気      25.0
dtype: float64

各列の有効データ数:
日付      4
売上      3
来客数     3
天気      3
dtype: int64

=== info()で確認 ===
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   日付      4 non-null      object 
 1   売上      3 non-null      float64
 2   来客数     3 non-null      float64
 3   天気      3 non-null      object 
dtypes: float64(2), object(2)
memory usage: 256.0+ bytes

問題6:データ確認の6ステップを実践(上級)

📋 問題

生徒5人分の成績データを作成し、データ確認の6ステップを実践してください。

・名前:[‘太郎’, ‘花子’, ‘次郎’, ‘美咲’, ‘健太’]

・国語:[85, 92, 78, None, 90]

・数学:[90, 88, 82, 87, 85]

・英語:[78, 85, 88, 91, None]

・理科:[92, 87, 85, 89, 91]

・社会:[80, 95, 82, 88, 86]

解答例を見る

コード

import pandas as pd
import numpy as np

# テストデータを作成
data = {
    '名前': ['太郎', '花子', '次郎', '美咲', '健太'],
    '国語': [85, 92, 78, np.nan, 90],
    '数学': [90, 88, 82, 87, 85],
    '英語': [78, 85, 88, 91, np.nan],
    '理科': [92, 87, 85, 89, 91],
    '社会': [80, 95, 82, 88, 86]
}

df = pd.DataFrame(data)

print("=" * 50)
print("Step 1: 最初の数行を確認")
print("=" * 50)
print(df.head())

print("\n" + "=" * 50)
print("Step 2: データの形状を確認")
print("=" * 50)
print(f"生徒数: {df.shape[0]}人")
print(f"科目数: {df.shape[1]-1}科目(名前列を除く)")

print("\n" + "=" * 50)
print("Step 3: データの基本情報")
print("=" * 50)
df.info()

print("\n" + "=" * 50)
print("Step 4: 数値列の統計情報")
print("=" * 50)
print(df.describe())

print("\n" + "=" * 50)
print("Step 5: 各列のデータ型")
print("=" * 50)
print(df.dtypes)

print("\n" + "=" * 50)
print("Step 6: 欠損値の確認")
print("=" * 50)
print("欠損値の数:")
print(df.isnull().sum())

※ 画面が小さい場合は、コードブロックを横にスクロールできます

実行結果

==================================================
Step 1: 最初の数行を確認
==================================================
   名前    国語  数学    英語  理科  社会
0  太郎  85.0   90  78.0   92   80
1  花子  92.0   88  85.0   87   95
2  次郎  78.0   82  88.0   85   82
3  美咲   NaN   87  91.0   89   88
4  健太  90.0   85   NaN   91   86

==================================================
Step 2: データの形状を確認
==================================================
生徒数: 5人
科目数: 5科目(名前列を除く)

==================================================
Step 3: データの基本情報
==================================================
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   名前      5 non-null      object 
 1   国語      4 non-null      float64
 2   数学      5 non-null      int64  
 3   英語      4 non-null      float64
 4   理科      5 non-null      int64  
 5   社会      5 non-null      int64  
dtypes: float64(2), int64(3), object(1)
memory usage: 368.0+ bytes

==================================================
Step 4: 数値列の統計情報
==================================================
             国語        数学        英語        理科        社会
count   4.000000   5.000000   4.000000   5.000000   5.000000
mean   86.250000  86.400000  85.500000  88.800000  86.200000
std     6.130525   3.361547   5.507571   3.033150   5.718331
min    78.000000  82.000000  78.000000  85.000000  80.000000
25%    83.250000  85.000000  83.250000  87.000000  82.000000
50%    87.500000  87.000000  86.500000  89.000000  86.000000
75%    90.750000  88.500000  88.750000  91.000000  88.000000
max    92.000000  90.000000  91.000000  92.000000  95.000000

==================================================
Step 5: 各列のデータ型
==================================================
名前       object
国語      float64
数学        int64
英語      float64
理科        int64
社会        int64
dtype: object

==================================================
Step 6: 欠損値の確認
==================================================
欠損値の数:
名前    0
国語    1
数学    0
英語    1
理科    0
社会    0
dtype: int64

🎯 このステップのまとめ

✅ 学んだこと

head()tail()でデータの最初と最後を確認する方法

info()でデータの構造と欠損値を確認する方法

describe()で統計情報を一覧表示する方法

shapeで行数・列数を取得する方法

columnsで列名一覧を取得する方法

indexでインデックス一覧を取得する方法

dtypesで各列のデータ型を確認する方法

データ確認の6ステップを実践する方法

💡 次のステップに進む前に確認

以下のことができるようになったか確認しましょう:

□ head()とtail()でデータの一部を表示できる

□ info()でデータの構造を把握できる

□ describe()で統計情報を確認できる

□ shape, columns, indexを使いこなせる

□ dtypesでデータ型を確認できる

□ データ確認の6ステップを実践できる

これらができたら、次のステップに進みましょう!

❓ よくある質問

Q1: head()とtail()はなぜデフォルトが5行なのですか?

A: 5行は、データの全体像を把握するのに適切な量だからです。多すぎず少なすぎず、画面に収まりやすい行数です。もちろんhead(10)のように自由に変更できます。

Q2: info()とdescribe()の使い分けは?

A: 目的が違います。

info():データの構造を確認(型、欠損値など)

describe():数値の統計情報を確認(平均、標準偏差など)

両方使うことで、データの全体像が分かります。

Q3: Non-Null Countとcountの違いは?

A: どちらも欠損値でないデータの数を表します。info()では「Non-Null Count」、describe()では「count」と表示されますが、意味は同じです。

Q4: objectとstringの違いは?

A: Pandasでは文字列は通常object型として扱われます。最近のPandasではstring型もありますが、通常はobjectで十分です。objectは文字列だけでなく、異なる型が混在する列にも使われます。

Q5: describe()で文字列列が表示されません

A: デフォルトでは数値列のみ表示されます。文字列列も含めたい場合はdf.describe(include='all')を使ってください。

📝

学習メモ

Pythonデータ分析入門 - Step 23

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE