🔍 ステップ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