<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pandas基礎入門｜SeriesとDataFrameの基本構造と作り方を徹底解説 | Python Data Lab（Pythonデータラボ）</title>
	<atom:link href="https://pythondatalab.com/category/pandas/basic/feed/" rel="self" type="application/rss+xml" />
	<link>https://pythondatalab.com</link>
	<description>Python初心者向けに、わかりやすいデータ分析の解説を提供します。</description>
	<lastBuildDate>Sun, 13 Sep 2026 00:42:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>

<image>
	<url>https://pythondatalab.com/wp-content/uploads/2025/12/cropped-rogo-32x32.png</url>
	<title>Pandas基礎入門｜SeriesとDataFrameの基本構造と作り方を徹底解説 | Python Data Lab（Pythonデータラボ）</title>
	<link>https://pythondatalab.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>pandas to_csv()の使い方｜indexなし・文字化け対策・保存先を解説</title>
		<link>https://pythondatalab.com/pandas-to-csv/</link>
					<comments>https://pythondatalab.com/pandas-to-csv/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Thu, 10 Sep 2026 15:14:30 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2206</guid>

					<description><![CDATA[<p>pandasのto_csv()でDataFrameをCSVに保存する方法を初心者向けに解説。index=False、文字化けを防ぐencoding、保存先、列指定、上書き・追記、保存後の確認方法までGoogle Colabで学べます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-to-csv/">pandas to_csv()の使い方｜indexなし・文字化け対策・保存先を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre.line-numbers,
  .colab-article pre.colab-output {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding: 1em;
  }
  .colab-article .table-scroll {
    overflow-x: auto;
    margin: 0;
  }
  .colab-article table.wp-block-table {
    width: auto;
    border-collapse: collapse;
  }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    border: 1px solid #cbd5e1;
    white-space: nowrap;
    padding: 0.2em 0.4em;
  }
  .colab-article table.wp-block-table th {
    background-color: #f8fafc;
    font-weight: 700;
  }
  .colab-article table.wp-block-table th:first-child,
  .colab-article table.wp-block-table td:first-child {
    min-width: 3em;
  }
</style>
<div class="colab-article">

<p>pandasで前処理や集計を終えたあと、「DataFrameをCSVに保存したいのに、ファイルがどこにあるか分からない」「開いたら左端に余計な列が増えた」「日本語が文字化けした」と困ることがあります。</p>
<p>DataFrameをCSVへ保存する基本形は、次の1行です。</p>
<pre class="line-numbers language-python"><code class="language-python">df.to_csv("sales.csv", index=False)</code></pre>
<p>ただし、正しく再利用できるCSVにするには、コードを書く前に次の順で決めることが大切です。</p>
<ol>
  <li><strong>どこへ保存するか</strong></li>
  <li><strong>インデックスを残すか</strong></li>
  <li><strong>どのアプリで開くかに応じて文字コードを選ぶ</strong></li>
  <li><strong>どの列を保存するか</strong></li>
  <li><strong>同名ファイルを上書きしてよいか</strong></li>
</ol>
<p>この記事では、Google Colabで再現できる売上データを使い、保存されたCSVをもう一度読み込んで、行数・列名・日本語が正しいところまで確認します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：保存先→index→文字コード→列→上書きの順に決める</a></li><li><a href="#toc3" tabindex="0">売上DataFrameを用意する</a><ol><li><a href="#toc4" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc5" tabindex="0">基本：indexなしでCSVへ保存する</a><ol><li><a href="#toc6" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc7" tabindex="0">index=Trueとindex=Falseの違い</a><ol><li><a href="#toc8" tabindex="0">意味のあるインデックスは消さない</a></li></ol></li><li><a href="#toc9" tabindex="0">日本語の文字化けを防ぐencodingの選び方</a></li><li><a href="#toc10" tabindex="0">必要な列だけcolumnsで保存する</a><ol><li><a href="#toc11" tabindex="0">実行目的</a></li></ol></li><li><a href="#toc12" tabindex="0">headerとsepは出力形式が必要なときだけ変更する</a></li><li><a href="#toc13" tabindex="0">保存後はread_csv()で読み込み直して検算する</a></li><li><a href="#toc14" tabindex="0">よくある失敗を現象から確認・修正する</a><ol><li><a href="#toc15" tabindex="0">存在しない保存先フォルダを直す</a><ol><li><a href="#toc16" tabindex="0">起きる現象</a></li><li><a href="#toc17" tabindex="0">原因と確認方法</a></li><li><a href="#toc18" tabindex="0">修正方法</a></li></ol></li><li><a href="#toc19" tabindex="0">上書きと追記はmodeで区別する</a></li></ol></li><li><a href="#toc20" tabindex="0">Google Colabで保存するときの注意</a></li><li><a href="#toc21" tabindex="0">自分のDataFrameへ置き換える前のチェックリスト</a></li><li><a href="#toc22" tabindex="0">保存したCSVを次の分析へつなげる</a></li><li><a href="#toc23" tabindex="0">まとめ</a></li><li><a href="#toc24" tabindex="0">関連記事</a><ol><li><a href="#toc25" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc26" tabindex="0">to_csv()でindex=Falseを付けるのはなぜですか？</a></li><li><a href="#toc27" tabindex="0">CSVをExcelで開くと文字化けする場合はどうしますか？</a></li><li><a href="#toc28" tabindex="0">to_csv()で保存したファイルはどこにありますか？</a></li><li><a href="#toc29" tabindex="0">CSVへ追記するときにヘッダーが重複するのはなぜですか？</a></li><li><a href="#toc30" tabindex="0">CSVへ保存するとデータ型や日付形式は保持されますか？</a></li><li><a href="#toc31" tabindex="0">Google Colab終了後もCSVを残すにはどうしますか？</a></li><li><a href="#toc32" tabindex="0">保存後に正しく出力できたか確認するにはどうしますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
  <li><code>to_csv()</code>でDataFrameをCSVへ保存する基本形</li>
  <li>保存先、<code>index</code>、<code>encoding</code>、<code>columns</code>の選び方</li>
  <li><code>header</code>と<code>sep</code>で出力形式を変える方法</li>
  <li>余計な<code>Unnamed: 0</code>、文字化け、保存先不明、上書きの確認方法</li>
  <li><code>read_csv()</code>で読み込み直し、保存結果を検算する方法</li>
</ul>
<p><code>to_csv()</code>は、<strong>前処理・抽出・集計した結果を、共有や再利用のためにファイルへ書き出す処理</strong>です。データを整える前工程は、<a href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本</a>で確認できます。</p>
<h2><span id="toc2">先に結論：保存先→index→文字コード→列→上書きの順に決める</span></h2>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>確認すること</th>
        <th>選ぶ基準</th>
        <th>主な指定</th>
        <th>注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>保存先</td>
        <td>Colab終了後も残すか</td>
        <td>一時領域の相対パス／Google Driveの絶対パス</td>
        <td>Colabの一時領域はランタイム終了後に消える</td>
      </tr>
      <tr>
        <td>インデックス</td>
        <td>行ラベルに意味があるか</td>
        <td>通常は<code>index=False</code></td>
        <td>顧客IDなど意味のある値まで消さない</td>
      </tr>
      <tr>
        <td>文字コード</td>
        <td>どのアプリで開くか</td>
        <td>UTF-8／<code>utf-8-sig</code></td>
        <td>受け渡し先の指定があれば従う</td>
      </tr>
      <tr>
        <td>保存列</td>
        <td>全列が必要か</td>
        <td><code>columns=[...]</code></td>
        <td>列名の空白・表記違いに注意する</td>
      </tr>
      <tr>
        <td>書き込み方法</td>
        <td>同名ファイルを上書きしてよいか</td>
        <td>通常保存／<code>mode="x"</code>／<code>mode="a"</code></td>
        <td><code>mode="a"</code>は行の追記であり、値の更新ではない</td>
      </tr>
    </tbody>
  </table>
</div>
<p>最初は、実在する保存先へ<code>index=False</code>で保存し、読み込み直して確認するところから始めるのが安全です。</p>
<h2><span id="toc3">売上DataFrameを用意する</span></h2>
<h3><span id="toc4">実行目的</span></h3>
<p>同じデータを記事全体で使い、設定によってCSVの列や文字コードがどう変わるか比較します。<code>商品ID</code>は通常の列として保持し、DataFrameのインデックスは0から始まる連番です。</p>
<pre class="line-numbers language-python"><code class="language-python">import pandas as pd
from pathlib import Path

# Colabの一時領域または現在の作業フォルダ内に保存用フォルダを作る
output_dir = Path("python_data_lab_output")
output_dir.mkdir(exist_ok=True)

df = pd.DataFrame({
    "商品ID": [101, 102, 103, 104],
    "商品": ["ノート", "ペン", "ファイル", "付箋"],
    "カテゴリ": ["文具", "文具", "収納", "文具"],
    "売上": [1200, 900, 1500, 600],
    "備考": ["重点商品", None, "在庫確認", "新商品"],
})

print(df)
print("行数・列数:", df.shape)</code></pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品ID</th>
        <th>商品</th>
        <th>カテゴリ</th>
        <th>売上</th>
        <th>備考</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>101</td>
        <td>ノート</td>
        <td>文具</td>
        <td>1200</td>
        <td>重点商品</td>
      </tr>
      <tr>
        <td>1</td>
        <td>102</td>
        <td>ペン</td>
        <td>文具</td>
        <td>900</td>
        <td>None</td>
      </tr>
      <tr>
        <td>2</td>
        <td>103</td>
        <td>ファイル</td>
        <td>収納</td>
        <td>1500</td>
        <td>在庫確認</td>
      </tr>
      <tr>
        <td>3</td>
        <td>104</td>
        <td>付箋</td>
        <td>文具</td>
        <td>600</td>
        <td>新商品</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="colab-output">行数・列数: (4, 5)</pre>
<p>出力では4行5列なので、<code>shape</code>は<code>(4, 5)</code>です。<code>備考</code>の2行目にある<code>None</code>は欠損値ですが、今回は意味のある未記入として残します。保存のためだけに0や空文字へ置き換えません。</p>
<p>自分のデータでは、保存前に列名・データ型・欠損値を<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>で確認しておくと、保存後の変化を判断しやすくなります。</p>
<h2><span id="toc5">基本：indexなしでCSVへ保存する</span></h2>
<h3><span id="toc6">実行目的</span></h3>
<p>連番インデックスをCSVへ含めず、DataFrameの5列だけを保存します。ファイル名だけを指定した相対パスは、現在の作業場所を基準に解釈されます。ここでは作成済みの<code>python_data_lab_output</code>フォルダへ保存します。</p>
<pre class="line-numbers language-python"><code class="language-python">basic_path = output_dir / "sales_basic.csv"
df.to_csv(basic_path, index=False)

print("保存先:", basic_path)
print("ファイルの存在:", basic_path.exists())
print("保存フォルダ内:", sorted(p.name for p in output_dir.iterdir()))
print("CSVの先頭3行:")
print("\n".join(basic_path.read_text(encoding="utf-8").splitlines()[:3]))</code></pre>
<pre class="colab-output">保存先: python_data_lab_output/sales_basic.csv
ファイルの存在: True
保存フォルダ内: ['sales_basic.csv']
CSVの先頭3行:
商品ID,商品,カテゴリ,売上,備考
101,ノート,文具,1200,重点商品
102,ペン,文具,900,</pre>
<p>最初に見るのは、次の3点です。</p>
<ul>
  <li><code>ファイルの存在</code>が<code>True</code>になっている</li>
  <li>1行目が<code>商品ID,商品,カテゴリ,売上,備考</code>になっている</li>
  <li>左端に0、1のようなDataFrameの連番インデックスが追加されていない</li>
</ul>
<p><code>to_csv()</code>へ保存先を渡した場合、ファイルが作成されます。戻り値を新しいDataFrameとして使うメソッドではありません。</p>
<h2><span id="toc7">index=Trueとindex=Falseの違い</span></h2>
<p><code>to_csv()</code>では、<code>index</code>の既定値が<code>True</code>です。指定を省略すると、DataFrameのインデックスもCSVへ出力されます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>指定</th>
        <th>CSVの左端</th>
        <th>選ぶ場面</th>
        <th>注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><code>index=True</code>または省略</td>
        <td>インデックスが入る</td>
        <td>行ラベル自体に意味がある</td>
        <td>名前のない連番は再読込時に余計な列になりやすい</td>
      </tr>
      <tr>
        <td><code>index=False</code></td>
        <td>インデックスを入れない</td>
        <td>0始まりの連番が単なる管理番号</td>
        <td>意味のあるIDをインデックスにしている場合は失う</td>
      </tr>
      <tr>
        <td><code>reset_index()</code>後に<code>index=False</code></td>
        <td>意味のあるインデックスを通常列として入れる</td>
        <td>IDを明示的な列名で残したい</td>
        <td>列が重複しないか確認する</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="line-numbers language-python"><code class="language-python">with_index_path = output_dir / "sales_with_index.csv"
without_index_path = output_dir / "sales_without_index.csv"

df.to_csv(with_index_path)  # index=Trueが既定値
df.to_csv(without_index_path, index=False)

with_index = pd.read_csv(with_index_path)
without_index = pd.read_csv(without_index_path)

print("indexを保存したCSVの列:", with_index.columns.tolist())
print("index=FalseのCSVの列:", without_index.columns.tolist())
print(with_index.head(2))</code></pre>
<pre class="colab-output">indexを保存したCSVの列: ['Unnamed: 0', '商品ID', '商品', 'カテゴリ', '売上', '備考']
index=FalseのCSVの列: ['商品ID', '商品', 'カテゴリ', '売上', '備考']</pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>Unnamed: 0</th>
        <th>商品ID</th>
        <th>商品</th>
        <th>カテゴリ</th>
        <th>売上</th>
        <th>備考</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>0</td>
        <td>101</td>
        <td>ノート</td>
        <td>文具</td>
        <td>1200</td>
        <td>重点商品</td>
      </tr>
      <tr>
        <td>1</td>
        <td>1</td>
        <td>102</td>
        <td>ペン</td>
        <td>文具</td>
        <td>900</td>
        <td>NaN</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>index</code>を省略したCSVを読み込むと、列一覧の先頭に<code>Unnamed: 0</code>が現れます。これは元のデータ列ではなく、列名のない連番インデックスが保存されたものです。</p>
<h3><span id="toc8">意味のあるインデックスは消さない</span></h3>
<p><code>商品ID</code>をインデックスにしたあとで<code>index=False</code>にすると、CSVには商品IDが残りません。商品IDを再利用したい場合は、<code>reset_index()</code>で通常列へ戻してから保存します。</p>
<pre class="line-numbers language-python"><code class="language-python">indexed_df = df.set_index("商品ID")

lost_id_path = output_dir / "sales_id_lost.csv"
kept_id_path = output_dir / "sales_id_kept.csv"

indexed_df.to_csv(lost_id_path, index=False)
indexed_df.reset_index().to_csv(kept_id_path, index=False)

print("index=FalseでIDを消した列:", pd.read_csv(lost_id_path).columns.tolist())
print("IDを通常列へ戻した列:", pd.read_csv(kept_id_path).columns.tolist())</code></pre>
<pre class="colab-output">index=FalseでIDを消した列: ['商品', 'カテゴリ', '売上', '備考']
IDを通常列へ戻した列: ['商品ID', '商品', 'カテゴリ', '売上', '備考']</pre>
<p>注目するのは、前者には<code>商品ID</code>がなく、後者には残っている点です。<code>index=False</code>を機械的に付けるのではなく、<strong>現在のインデックスが単なる連番か、意味のある識別子か</strong>を先に確認してください。</p>
<h2><span id="toc9">日本語の文字化けを防ぐencodingの選び方</span></h2>
<p><code>encoding</code>は、CSVを利用する環境に合わせて選びます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>主な利用場面</th>
        <th>候補</th>
        <th>確認方法</th>
        <th>注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>Pythonや多くの現代的なツールで再利用</td>
        <td><code>utf-8</code></td>
        <td>同じencodingで読み込み直す</td>
        <td>アプリや読み込み方法によっては日本語表示を確認する</td>
      </tr>
      <tr>
        <td>日本語をExcelで直接開いて確認</td>
        <td><code>utf-8-sig</code></td>
        <td>実際のExcel環境で開く</td>
        <td>Excelのバージョンや開き方でも挙動が異なる</td>
      </tr>
      <tr>
        <td>受け渡し先から文字コード指定がある</td>
        <td>指定された文字コード</td>
        <td>相手先の手順で確認</td>
        <td>環境を無視して固定しない</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>utf-8-sig</code>はファイル先頭にBOMを付けたUTF-8です。日本語CSVをExcelで直接開く用途では有力な候補ですが、すべての用途で一律に選ぶ必要はありません。</p>
<pre class="line-numbers language-python"><code class="language-python">utf8_path = output_dir / "sales_utf8.csv"
utf8_sig_path = output_dir / "sales_utf8_sig.csv"

df.to_csv(utf8_path, index=False, encoding="utf-8")
df.to_csv(utf8_sig_path, index=False, encoding="utf-8-sig")

print("UTF-8の先頭3バイト:", utf8_path.read_bytes()[:3])
print("UTF-8 with BOMの先頭3バイト:", utf8_sig_path.read_bytes()[:3])

checked_japanese = pd.read_csv(utf8_sig_path, encoding="utf-8-sig")
print("再読み込みした商品:", checked_japanese["商品"].tolist())</code></pre>
<pre class="colab-output">UTF-8の先頭3バイト: b'\xe5\x95\x86'
UTF-8 with BOMの先頭3バイト: b'\xef\xbb\xbf'
再読み込みした商品: ['ノート', 'ペン', 'ファイル', '付箋']</pre>
<p><code>utf-8-sig</code>のファイルでは、先頭3バイトがBOMを表す<code>b'\xef\xbb\xbf'</code>になります。再読み込み後の商品が「ノート」「ペン」「ファイル」「付箋」と表示されれば、指定した文字コードで日本語を読めています。</p>
<p>文字化けが起きたら、保存コードだけを見るのではなく、<strong>CSVをどのアプリで、どの文字コードとして開いたか</strong>も確認します。</p>
<h2><span id="toc10">必要な列だけcolumnsで保存する</span></h2>
<h3><span id="toc11">実行目的</span></h3>
<p>社内共有用として、<code>商品</code>・<code>カテゴリ</code>・<code>売上</code>だけを保存します。個人情報や作業用列を含むデータでは、保存前に共有範囲を確認することも重要です。</p>
<pre class="line-numbers language-python"><code class="language-python">shared_columns = ["商品", "カテゴリ", "売上"]
shared_path = output_dir / "sales_shared.csv"

df.to_csv(
    shared_path,
    index=False,
    encoding="utf-8-sig",
    columns=shared_columns,
)

shared_df = pd.read_csv(shared_path, encoding="utf-8-sig")
print(shared_df)
print("保存した列:", shared_df.columns.tolist())</code></pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品</th>
        <th>カテゴリ</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>1200</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>900</td>
      </tr>
      <tr>
        <td>2</td>
        <td>ファイル</td>
        <td>収納</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>3</td>
        <td>付箋</td>
        <td>文具</td>
        <td>600</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="colab-output">保存した列: ['商品', 'カテゴリ', '売上']</pre>
<p>出力は4行3列です。<code>商品ID</code>と<code>備考</code>が含まれず、列順も<code>columns</code>で指定した順になっていることを確認します。</p>
<p>列名を間違えると<code>KeyError</code>になります。自分のデータへ置き換える前に、<code>df.columns.tolist()</code>で実在する列名と前後の空白を確認してください。データ型を基準に列を選びたい場合は、<a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方</a>へ進めます。</p>
<h2><span id="toc12">headerとsepは出力形式が必要なときだけ変更する</span></h2>
<p><code>header</code>は列名を出力するか、<code>sep</code>は何の文字で列を区切るかを決めます。</p>
<ul>
  <li>通常の単独CSVでは、列名を残す既定の<code>header=True</code>を使う</li>
  <li>列名が不要という明確な仕様がある場合だけ<code>header=False</code>を使う</li>
  <li>CSVは既定のカンマ区切り、TSVが必要な場合は<code>sep="\t"</code>を使う</li>
</ul>
<p>タブ区切りでは、文字列<code>"t"</code>ではなく、タブ文字を表す<code>"\t"</code>を指定します。</p>
<pre class="line-numbers language-python"><code class="language-python">no_header_path = output_dir / "sales_no_header.csv"
tsv_path = output_dir / "sales.tsv"

df[shared_columns].to_csv(no_header_path, index=False, header=False)
df[shared_columns].to_csv(tsv_path, index=False, sep="\t")

print("header=Falseの先頭行:")
print(no_header_path.read_text(encoding="utf-8").splitlines()[0])
print("TSVの先頭行（タブを見える形に変換）:")
print(tsv_path.read_text(encoding="utf-8").splitlines()[0].replace("\t", " [TAB] "))</code></pre>
<pre class="colab-output">header=Falseの先頭行:
ノート,文具,1200
TSVの先頭行（タブを見える形に変換）:
商品 [TAB] カテゴリ [TAB] 売上</pre>
<p><code>header=False</code>の先頭行は列名ではなく、最初の商品データになります。TSVの先頭行では、3つの列名がタブで区切られています。拡張子だけを<code>.tsv</code>へ変えても区切り文字は変わらないため、<code>sep</code>の指定とセットで確認します。</p>
<h2><span id="toc13">保存後はread_csv()で読み込み直して検算する</span></h2>
<p>ファイルが存在するだけでは、必要な内容を正しく保存できたとは限りません。共有用CSVを読み込み直し、保存前後を同じ項目で比べます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>確認項目</th>
        <th>保存前</th>
        <th>再読み込み後</th>
        <th>判断</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>行数</td>
        <td>共有対象の4行</td>
        <td>4行</td>
        <td>一致するか</td>
      </tr>
      <tr>
        <td>列数</td>
        <td>指定した3列</td>
        <td>3列</td>
        <td>余計な列や欠落がないか</td>
      </tr>
      <tr>
        <td>列名</td>
        <td>商品・カテゴリ・売上</td>
        <td>同じ3列</td>
        <td>名前と順序が一致するか</td>
      </tr>
      <tr>
        <td>日本語</td>
        <td>商品名・カテゴリ名</td>
        <td>同じ文字</td>
        <td>文字化けしていないか</td>
      </tr>
      <tr>
        <td>インデックス列</td>
        <td>保存対象外</td>
        <td><code>Unnamed: 0</code>なし</td>
        <td><code>index=False</code>が反映されたか</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="line-numbers language-python"><code class="language-python">source_for_export = df[shared_columns]
loaded = pd.read_csv(shared_path, encoding="utf-8-sig")

check_result = pd.DataFrame({
    "確認項目": ["行数", "列数", "列名", "Unnamed: 0", "商品名"],
    "結果": [
        len(source_for_export) == len(loaded),
        source_for_export.shape[1] == loaded.shape[1],
        source_for_export.columns.tolist() == loaded.columns.tolist(),
        "Unnamed: 0" not in loaded.columns,
        source_for_export["商品"].tolist() == loaded["商品"].tolist(),
    ],
})

print(check_result)
print("再読み込み後の型:")
print(loaded.dtypes)</code></pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>確認項目</th>
        <th>結果</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>行数</td>
        <td>True</td>
      </tr>
      <tr>
        <td>1</td>
        <td>列数</td>
        <td>True</td>
      </tr>
      <tr>
        <td>2</td>
        <td>列名</td>
        <td>True</td>
      </tr>
      <tr>
        <td>3</td>
        <td>Unnamed: 0</td>
        <td>True</td>
      </tr>
      <tr>
        <td>4</td>
        <td>商品名</td>
        <td>True</td>
      </tr>
    </tbody>
  </table>
</div>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>dtype</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>商品</td>
        <td>o</td>
        <td>b</td>
        <td>j</td>
        <td>e</td>
        <td>c</td>
        <td>t</td>
      </tr>
      <tr>
        <td>カテゴリ</td>
        <td>o</td>
        <td>b</td>
        <td>j</td>
        <td>e</td>
        <td>c</td>
        <td>t</td>
      </tr>
      <tr>
        <td>売上</td>
        <td>i</td>
        <td>n</td>
        <td>t</td>
        <td>6</td>
        <td>4</td>
      </tr>
    </tbody>
  </table>
</div>
<p>5項目がすべて<code>True</code>なら、今回の目的に必要な行・列・日本語・インデックス設定は一致しています。</p>
<p>ただし、CSVはDataFrameの型情報を完全に保存する形式ではありません。日付、カテゴリ型、先頭に0を含むコードなどは、再読み込み時に想定と異なる型になることがあります。ファイルを次の分析へ使う前に、<code>dtypes</code>や<code>info()</code>を再確認してください。</p>
<h2><span id="toc14">よくある失敗を現象から確認・修正する</span></h2>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>起きる現象</th>
        <th>主な原因</th>
        <th>確認する箇所</th>
        <th>修正方針</th>
        <th>修正後の確認</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>保存したファイルが見つからない</td>
        <td>相対パスの基準を誤解</td>
        <td>現在の作業場所、<code>resolve()</code>、ファイル一覧</td>
        <td>保存先を明示する</td>
        <td><code>exists()</code>が<code>True</code></td>
      </tr>
      <tr>
        <td>存在しないフォルダへ保存できない</td>
        <td>親フォルダがない</td>
        <td>保存先の親フォルダ</td>
        <td>先にフォルダを作る</td>
        <td>目的のファイルがある</td>
      </tr>
      <tr>
        <td><code>Unnamed: 0</code>が増える</td>
        <td>名前のないindexも保存した</td>
        <td>保存時の<code>index</code>と再読込後の列名</td>
        <td>不要なら<code>index=False</code>で保存し直す</td>
        <td>列一覧から消える</td>
      </tr>
      <tr>
        <td>日本語が文字化けする</td>
        <td>保存時と読み手の文字コードが合わない</td>
        <td><code>encoding</code>と開くアプリ</td>
        <td>用途に合う文字コードで保存し直す</td>
        <td>商品名を正しく読める</td>
      </tr>
      <tr>
        <td>以前のファイルが消える</td>
        <td>同名へ既定モードで上書き</td>
        <td>保存先と同名ファイルの有無</td>
        <td>別名または<code>mode="x"</code></td>
        <td>意図したファイルが両方ある</td>
      </tr>
      <tr>
        <td>追記の途中に列名が入る</td>
        <td><code>mode="a"</code>でheaderも出力</td>
        <td>追記前後の先頭・末尾</td>
        <td>追記時だけ<code>header=False</code></td>
        <td>列名は先頭の1行だけ</td>
      </tr>
      <tr>
        <td>追記後に列がずれる</td>
        <td>列順・列数・区切りが不一致</td>
        <td>既存CSVと追加DataFrameの列</td>
        <td>列をそろえる。難しければ結合後に新規保存</td>
        <td>再読込後の各値が正しい列にある</td>
      </tr>
    </tbody>
  </table>
</div>
<h3><span id="toc15">存在しない保存先フォルダを直す</span></h3>
<h4><span id="toc16">起きる現象</span></h4>
<p>ファイル名は正しいのに、存在しない親フォルダを含むパスへ保存しようとしてエラーになります。</p>
<h4><span id="toc17">原因と確認方法</span></h4>
<p><code>to_csv()</code>は、指定した親フォルダを自動では作りません。<code>parent.exists()</code>で確認します。</p>
<h4><span id="toc18">修正方法</span></h4>
<p>必要なフォルダを作ってから保存します。</p>
<pre class="line-numbers language-python"><code class="language-python">nested_path = output_dir / "reports" / "sales_report.csv"

print("修正前に親フォルダがあるか:", nested_path.parent.exists())
nested_path.parent.mkdir(parents=True, exist_ok=True)
df.to_csv(nested_path, index=False)

print("修正後にファイルがあるか:", nested_path.exists())</code></pre>
<pre class="colab-output">修正前に親フォルダがあるか: False
修正後にファイルがあるか: True</pre>
<p>修正前の親フォルダは<code>False</code>、作成して保存した後のファイルは<code>True</code>になります。自分のデータでは、フォルダ名のスペルやGoogle Driveのマウント先も同時に確認してください。</p>
<h3><span id="toc19">上書きと追記はmodeで区別する</span></h3>
<p>通常の保存は、同名ファイルがあると上書きします。既存ファイルを残すなら<code>mode="x"</code>、既存CSVの末尾へ行を追加するなら<code>mode="a"</code>を使います。<code>mode="a"</code>は値の更新や列の追加ではありません。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>目的</th>
        <th>mode</th>
        <th>注意点</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>通常保存・上書き</td>
        <td>既定の<code>"w"</code></td>
        <td>同名ファイルの内容は置き換わる</td>
      </tr>
      <tr>
        <td>上書きを防いで新規保存</td>
        <td><code>"x"</code></td>
        <td>同名ファイルがあると<code>FileExistsError</code></td>
      </tr>
      <tr>
        <td>既存CSVへ行を追記</td>
        <td><code>"a"</code></td>
        <td>列順をそろえ、通常は<code>header=False</code></td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="line-numbers language-python"><code class="language-python">protected_path = output_dir / "sales_protected.csv"
df.to_csv(protected_path, index=False)

try:
    df.to_csv(protected_path, index=False, mode="x")
except FileExistsError:
    print("同名ファイルがあるため、上書きを停止しました:", protected_path.name)

print("既存ファイルは残っているか:", protected_path.exists())</code></pre>
<pre class="colab-output">同名ファイルがあるため、上書きを停止しました: sales_protected.csv
既存ファイルは残っているか: True</pre>
<p><code>FileExistsError</code>が出たら、別名で保存するか、本当に上書きしてよいか判断します。続いて、列名と順序が同じデータを行方向へ追記する例を確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">append_path = output_dir / "sales_append.csv"
base = df[shared_columns].iloc[:3]
new_row = df[shared_columns].iloc[3:]

base.to_csv(append_path, index=False, encoding="utf-8-sig")
new_row.to_csv(
    append_path,
    index=False,
    encoding="utf-8-sig",
    mode="a",
    header=False,
)

appended = pd.read_csv(append_path, encoding="utf-8-sig")
print(appended)
print("追記後の行数:", len(appended))</code></pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品</th>
        <th>カテゴリ</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>1200</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>900</td>
      </tr>
      <tr>
        <td>2</td>
        <td>ファイル</td>
        <td>収納</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>3</td>
        <td>付箋</td>
        <td>文具</td>
        <td>600</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="colab-output">追記後の行数: 4</pre>
<p>追記後は4行で、列名は先頭の1回だけです。<code>header=False</code>を忘れると途中に列名が入ります。列構成が違う場合は追記せず、DataFrameを結合してから新しいCSVとして保存します。</p>
<h2><span id="toc20">Google Colabで保存するときの注意</span></h2>
<p>この記事の相対パスは、Colabではランタイムの一時領域へ保存されます。ランタイム終了後も残したい場合は、Google Driveをマウントし、実在するDrive内フォルダの絶対パスを指定します。手元のPCへダウンロードする操作と、Driveへ保存する操作は別です。</p>
<p>Driveの接続、パスのコピー、CSVの再読み込みは、<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>で詳しく確認してください。この記事ではto_csv()の設定と保存結果の検算に集中します。</p>
<h2><span id="toc21">自分のDataFrameへ置き換える前のチェックリスト</span></h2>
<ul>
  <li>DataFrame名は正しいか</li>
  <li>保存する列名と順序を<code>df.columns</code>で確認したか</li>
  <li>現在のindexは単なる連番か、意味のあるIDか</li>
  <li>保存前の行数・列数を<code>df.shape</code>で記録したか</li>
  <li>欠損値を空欄として出力してよいか</li>
  <li>親フォルダは実在するか</li>
  <li>同名ファイルを上書きしてよいか</li>
  <li>CSVを開くアプリと文字コードは合っているか</li>
  <li>追記する場合、既存CSVと列名・順序・区切り文字が同じか</li>
  <li>保存後にread_csv()で読み込み直したか</li>
</ul>
<p>Excelから読み込んだデータをCSVへ変換する場合は、先に<a href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方</a>でシート・見出し・必要列が正しいか確認してください。</p>
<h2><span id="toc22">保存したCSVを次の分析へつなげる</span></h2>
<p>CSV保存は分析の終点とは限りません。別のNotebookで読み込み直し、データの状態を確認してから集計へ進めます。</p>
<pre class="line-numbers language-python"><code class="language-python">reused = pd.read_csv(shared_path, encoding="utf-8-sig")

print("再利用するデータ:")
print(reused)
print("カテゴリ別の売上合計:")
print(reused.groupby("カテゴリ", as_index=False)["売上"].sum())</code></pre>
<pre class="colab-output">再利用するデータ:</pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品</th>
        <th>カテゴリ</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>1200</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>900</td>
      </tr>
      <tr>
        <td>2</td>
        <td>ファイル</td>
        <td>収納</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>3</td>
        <td>付箋</td>
        <td>文具</td>
        <td>600</td>
      </tr>
    </tbody>
  </table>
</div>
<pre class="colab-output">カテゴリ別の売上合計:</pre>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>カテゴリ</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>収納</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>1</td>
        <td>文具</td>
        <td>2700</td>
      </tr>
    </tbody>
  </table>
</div>
<p>再読み込みしたデータから、カテゴリ別の売上合計を計算できました。保存後は、まず列・型・欠損を確認し、その後に<a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方</a>で複数列・複数集計へ進めます。</p>
<p>CSVを読み込み直したときに列名や型が想定と違う場合は、集計へ進む前に原因を修正してください。</p>
<h2><span id="toc23">まとめ</span></h2>
<ul>
  <li>DataFrameのCSV保存には<code>to_csv()</code>を使う</li>
  <li>最初に保存先を決め、index・文字コード・保存列・上書きの順で判断する</li>
  <li>連番インデックスが不要なら<code>index=False</code>を使う</li>
  <li>意味のあるIDをインデックスにしている場合は、消す前に通常列へ戻すか判断する</li>
  <li>日本語の文字コードは開く環境で選び、Excelで直接開く用途では<code>utf-8-sig</code>を候補にする</li>
  <li><code>columns</code>で保存範囲を絞り、<code>header</code>と<code>sep</code>は必要な仕様がある場合だけ変更する</li>
  <li>上書きを防ぐなら<code>mode="x"</code>、行を追記する場合だけ<code>mode="a"</code>を使う</li>
  <li>保存後はread_csv()で読み込み直し、行数・列名・日本語・不要列を検算する</li>
</ul>
<p>最小コードを実行して終わりにせず、<strong>保存されたCSVを次の環境で正しく読めるか</strong>まで確認することが、失敗を防ぐポイントです。</p>
<h2><span id="toc24">関連記事</span></h2>
<ul>
  <li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
  <li><a href="https://pythondatalab.com/pandas-preprocessing-basic/">Pandasデータ前処理の基本｜読み込み後に確認する順番と欠損・型・重複の選び方</a></li>
  <li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</a></li>
  <li><a href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方｜Excel読み込み・sheet_name・header・usecolsを初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？作り方・基本操作・Seriesとの違いを初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方｜複数列・複数集計と結果の見方</a></li>
</ul>
 <!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc25"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1789052749746" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">to_csv()でindex=Falseを付けるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>0から始まる連番インデックスがCSVへ追加され、再読み込み時に<code>Unnamed: 0</code>となるのを防ぐためです。ただし、顧客IDなど意味のあるインデックスは、通常列へ戻して残すか判断してください</p>

</div>
</div>
<div id="faq-question-1789052767316" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">CSVをExcelで開くと文字化けする場合はどうしますか？</span></h3>
<div class="rank-math-answer ">

<p>保存時の<code>encoding</code>と、Excelがどの文字コードとして開いているかを確認します。日本語をExcelで直接開く用途では<code>encoding="utf-8-sig"</code>を候補にし、実際の利用環境で表示を確認してください。受け渡し先に指定がある場合は、その指定を優先します。</p>

</div>
</div>
<div id="faq-question-1789052778892" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">to_csv()で保存したファイルはどこにありますか？</span></h3>
<div class="rank-math-answer ">

<p>相対パスなら現在の作業場所を基準に保存されます。<code>Path("ファイル名").resolve()</code>で絶対パスを確認できます。Colabの一時領域はランタイム終了後に消えるため、残したい場合はGoogle Driveなどへ保存します。</p>

</div>
</div>
<div id="faq-question-1789052789192" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">CSVへ追記するときにヘッダーが重複するのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p><code>mode="a"</code>で追記するときも、既定では列名が出力されるためです。既存CSVと列構成を確認し、行を追記するコードでは<code>header=False</code>を指定します。</p>

</div>
</div>
<div id="faq-question-1789052798467" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">CSVへ保存するとデータ型や日付形式は保持されますか？</span></h3>
<div class="rank-math-answer ">

<p>完全には保持されません。CSVは文字で表現されるため、再読み込み時に型が推定されます。先頭の0を持つコード、日付、カテゴリ型、欠損値などは、読み込み後に<code>dtypes</code>や<code>info()</code>で確認してください。</p>

</div>
</div>
<div id="faq-question-1789052813087" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">Google Colab終了後もCSVを残すにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p>Google DriveをマウントしてDrive内の実在パスへ保存するか、ランタイム終了前に端末へダウンロードします。Driveの接続とパス確認は関連記事を参照してください。</p>

</div>
</div>
<div id="faq-question-1789052838417" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">保存後に正しく出力できたか確認するにはどうしますか？</span></h3>
<div class="rank-math-answer ">

<p>read_csv()で読み込み直し、保存前後の<code>shape</code>、列名と順序、日本語、欠損値、<code>Unnamed: 0</code>の有無を比べます。重要なデータでは数行だけでなく、行数や集計値も確認してください。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-to-csv/">pandas to_csv()の使い方｜indexなし・文字化け対策・保存先を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-to-csv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</title>
		<link>https://pythondatalab.com/pandas-info-method/</link>
					<comments>https://pythondatalab.com/pandas-info-method/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 30 Aug 2026 00:56:45 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2156</guid>

					<description><![CDATA[<p>pandasのinfo()で行数・列数・Non-Null Count・データ型を確認する方法を初心者向けに解説。欠損値やobject型を見つけ、型変換・欠損値処理後に再確認する流れ、shape・dtypes・isnull()・describe()との違いも紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
  <style>
    .colab-article pre[class*="language-"],
    .colab-article pre.line-numbers {
      margin: 0 !important;
      padding: 1em;
    }
    .colab-article .colab-output {
      margin: 0;
      padding: 1em;
      overflow-x: auto;
      background: #f6f8fa;
      border: 1px solid #d0d7de;
      color: #24292f;
      white-space: pre;
    }
    .colab-article .table-scroll {
      width: 100%;
      overflow-x: auto;
      -webkit-overflow-scrolling: touch;
    }
    .colab-article table.wp-block-table {
      width: auto;
      border-collapse: collapse;
    }
    .colab-article table.wp-block-table th,
    .colab-article table.wp-block-table td {
      border: 1px solid #d0d7de;
    }
  </style>


  <p>CSVを読み込んだあと、「列のデータ型は合っているのか」「欠損値はあるのか」「分析前に何を確認すればよいのか」と迷うことはありませんか。</p>

  <p>そんなときに使うのが、Pandasの<code>info()</code>です。<code>df.info()</code>を実行すると、DataFrameの行数・列数・列名・欠損していない値の数・データ型・メモリ使用量をまとめて確認できます。</p>

  <p>ただし、表示するだけでは十分ではありません。特に重要なのは、<strong>Non-Null CountとDtypeを対応させて読むこと</strong>です。</p>

  <ul>
  <li>Non-Null Countが全行数より少ない列 → 欠損値がある</li>
  <li>Dtypeが想定と異なる列 → 型変換が必要な可能性がある</li>
  </ul>

  <p>この記事では、<code>info()</code>の出力を上から順に読み、問題を発見し、必要な前処理を選び、修正後にもう一度確認するところまで解説します。</p>
  
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：info()はデータの構造を最初に診断するときに使う</a></li><li><a href="#toc3" tabindex="0">売上データを用意してinfo()を実行する</a></li><li><a href="#toc4" tabindex="0">Non-Null Countから欠損値を見つける</a></li><li><a href="#toc5" tabindex="0">Dtypeからデータ型の問題を見つける</a><ol><li><a href="#toc6" tabindex="0">object型は必ず「普通の文字列」とは限らない</a></li><li><a href="#toc7" tabindex="0">float64は必ず小数を記録した列とは限らない</a></li></ol></li><li><a href="#toc8" tabindex="0">問題を修正してからinfo()で再確認する</a></li><li><a href="#toc9" tabindex="0">print(df.info())でNoneが表示される理由</a></li><li><a href="#toc10" tabindex="0">info()・shape・dtypes・isnull()・describe()の使い分け</a></li><li><a href="#toc11" tabindex="0">コードは動いても結果を誤解しやすい場面</a><ol><li><a href="#toc12" tabindex="0">Non-Null Countを欠損数だと思う</a></li><li><a href="#toc13" tabindex="0">object型をすべて文字列として扱う</a></li><li><a href="#toc14" tabindex="0">float64を「小数を記録した列」と決めつける</a></li><li><a href="#toc15" tabindex="0">memory usageを厳密な全メモリ量だと思う</a></li></ol></li><li><a href="#toc16" tabindex="0">info()でうまく確認できないときの原因と対処</a><ol><li><a href="#toc17" tabindex="0">NameError: name &#8216;df&#8217; is not defined</a></li><li><a href="#toc18" tabindex="0">AttributeErrorが出る</a></li></ol></li><li><a href="#toc19" tabindex="0">自分のデータでinfo()を使うときの確認ポイント</a></li><li><a href="#toc20" tabindex="0">info()の確認結果を次の分析工程へつなげる</a></li><li><a href="#toc21" tabindex="0">まとめ：info()は問題を見つけて次の処理を選ぶために使う</a></li><li><a href="#toc22" tabindex="0">次に読みたい関連記事</a><ol><li><a href="#toc23" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc24" tabindex="0">df.info()では何が分かりますか？</a></li><li><a href="#toc25" tabindex="0">Non-Null Countとは何ですか？</a></li><li><a href="#toc26" tabindex="0">info()で欠損値の場所まで確認できますか？</a></li><li><a href="#toc27" tabindex="0">数字の列がobject型になるのはなぜですか？</a></li><li><a href="#toc28" tabindex="0">欠損値があると整数列がfloat64になるのはなぜですか？</a></li><li><a href="#toc29" tabindex="0">info()とdescribe()の違いは何ですか？</a></li><li><a href="#toc30" tabindex="0">info()とdtypesの違いは何ですか？</a></li><li><a href="#toc31" tabindex="0">print(df.info())でNoneが表示されるのはなぜですか？</a></li><li><a href="#toc32" tabindex="0">info()を実行すると元のDataFrameは変わりますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="この記事でわかること"><span id="toc1">この記事でわかること</span></h2>

  <ul>
  <li><code>df.info()</code>で確認できる内容</li>
  <li>Non-Null CountとDtypeの読み方</li>
  <li>欠損値や想定外のデータ型を見つける方法</li>
  <li><code>info()</code>・<code>shape</code>・<code>dtypes</code>・<code>isnull()</code>・<code>describe()</code>の使い分け</li>
  <li><code>print(df.info())</code>の最後に<code>None</code>が表示される理由</li>
  <li>確認結果から型変換や欠損値処理へ進む方法</li>
  </ul>

  <p>この記事のゴールは、<strong><code>df.info()</code>の結果から問題を発見し、次に必要な前処理を自分で判断できるようになること</strong>です。</p>
  <h2 id="先に結論infoはデータの構造を最初に診断するときに使う"><span id="toc2">先に結論：info()はデータの構造を最初に診断するときに使う</span></h2>

  <p><code>info()</code>は、DataFrameの中身を変更するメソッドではありません。現在の構造をまとめて表示する<strong>確認用のメソッド</strong>です。</p>

  <p>CSVを読み込んだら、次の順番で確認すると迷いにくくなります。</p>

  <ol type="1">
  <li>行数と列数が想定どおりか</li>
  <li>Non-Null Countが全行数より少ない列はないか</li>
  <li>Dtypeが想定どおりか</li>
  <li>問題があれば、専用の確認・修正方法へ進む</li>
  </ol>

  <p>たとえば、Non-Null Countが少なければ<code>isnull().sum()</code>、数値にしたい列がobject型なら<code>to_numeric()</code>、日付列がobject型なら<code>to_datetime()</code>で詳しく確認・修正します。</p>
  <h2 id="売上データを用意してinfoを実行する"><span id="toc3">売上データを用意してinfo()を実行する</span></h2>

  <p>CSVから読み込んだ状態を想定した、5行の売上データを使います。</p>

  <ul>
  <li><code>日付</code>は文字列</li>
  <li><code>売上</code>にはカンマ付きの数字があり、文字列として保存</li>
  <li><code>返品数</code>には欠損値が1つ存在</li>
  </ul>

  <p>まず、実行前のDataFrameを確認しましょう。</p>
  <pre class="line-numbers"><code class="language-python">import pandas as pd
import numpy as np

df = pd.DataFrame({
    &quot;日付&quot;: [&quot;2026-08-01&quot;, &quot;2026-08-02&quot;, &quot;2026-08-03&quot;, &quot;2026-08-04&quot;, &quot;2026-08-05&quot;],
    &quot;商品&quot;: [&quot;ノート&quot;, &quot;ペン&quot;, &quot;ノート&quot;, &quot;ファイル&quot;, &quot;ペン&quot;],
    &quot;売上&quot;: [&quot;1,200&quot;, &quot;900&quot;, &quot;1,500&quot;, &quot;800&quot;, &quot;1,100&quot;],
    &quot;返品数&quot;: [0, np.nan, 1, 0, 2]
})

df</code></pre>
  <div id="df-d1bfa9b0-3501-4e1f-a6d7-22c86f437612" class="colab-df-container">
      <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">返品数</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,500</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ファイル</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0.0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2.0</td>
      </tr>
    </tbody>
  </table>
  </div></div>
      <div class="colab-df-buttons">

    <div class="colab-df-container">
      <button class="colab-df-convert" onclick="convertToInteractive('df-d1bfa9b0-3501-4e1f-a6d7-22c86f437612')" title="Convert this dataframe to an interactive table." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
      <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
    </svg>
      </button>

    <style>
      .colab-df-container {
        display:flex;
        gap: 12px;
      }

      .colab-df-convert {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-convert:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      .colab-df-buttons div {
        margin-bottom: 4px;
      }

      [theme=dark] .colab-df-convert {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-convert:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>

      <script>
        const buttonEl =
          document.querySelector('#df-d1bfa9b0-3501-4e1f-a6d7-22c86f437612 button.colab-df-convert');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        async function convertToInteractive(key) {
          const element = document.querySelector('#df-d1bfa9b0-3501-4e1f-a6d7-22c86f437612');
          const dataTable =
            await google.colab.kernel.invokeFunction('convertToInteractive',
                                                      [key], {});
          if (!dataTable) return;

          const docLinkHtml = 'Like what you see? Visit the ' +
            '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
            + ' to learn more about interactive tables.';
          element.innerHTML = '';
          dataTable['output_type'] = 'display_data';
          await google.colab.output.renderOutput(dataTable, element);
          const docLink = document.createElement('div');
          docLink.innerHTML = docLinkHtml;
          element.appendChild(docLink);
        }
      </script>
    </div>


    <div id="id_ff17c524-add2-414a-a85f-c84db8272f36">
      <style>
        .colab-df-generate {
          background-color: #E8F0FE;
          border: none;
          border-radius: 50%;
          cursor: pointer;
          display: none;
          fill: #1967D2;
          height: 32px;
          padding: 0 0 0 0;
          width: 32px;
        }

        .colab-df-generate:hover {
          background-color: #E2EBFA;
          box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
          fill: #174EA6;
        }

        [theme=dark] .colab-df-generate {
          background-color: #3B4455;
          fill: #D2E3FC;
        }

        [theme=dark] .colab-df-generate:hover {
          background-color: #434B5C;
          box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
          filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
          fill: #FFFFFF;
        }
      </style>
      <button class="colab-df-generate" onclick="generateWithVariable('df')" title="Generate code using this dataframe." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
      <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
    </svg>
      </button>
      <script>
        (() => {
        const buttonEl =
          document.querySelector('#id_ff17c524-add2-414a-a85f-c84db8272f36 button.colab-df-generate');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        buttonEl.onclick = () => {
          google.colab.notebook.generateWithVariable('df');
        }
        })();
      </script>
    </div>

      </div>
    </div>
  <p><code>日付</code>や<code>売上</code>は見た目だけでは型を判断できません。また、<code>返品数</code>の2行目には<code>NaN</code>があります。次に<code>df.info()</code>を実行し、DataFrame全体の構造を確認します。</p>
  <pre class="line-numbers"><code class="language-python">df.info()</code></pre>
  <pre class="colab-output">&lt;class &#x27;pandas.core.frame.DataFrame&#x27;&gt;
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      object 
 2   売上      5 non-null      object 
 3   返品数     4 non-null      float64
dtypes: float64(1), object(3)
memory usage: 292.0+ bytes</pre>
  <p>出力は、次の順で読みます。</p>

  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
  <tr class="header">
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">出力項目</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">確認できること</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">今回の注目点</th>
  </tr>
  </thead>
  <tbody>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>DataFrame</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">対象の種類</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">PandasのDataFrameである</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>RangeIndex</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行数とインデックス範囲</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5行、インデックスは0〜4</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>Data columns</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">合計列数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">4列</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>Column</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">列番号と列名</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">日付・商品・売上・返品数</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>Non-Null Count</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損していない値の数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">返品数だけ4件</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>Dtype</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">Pandasが認識した型</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">日付・商品・売上はobject、返品数はfloat64</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>dtypes</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">型ごとの列数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">float64が1列、objectが3列</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>memory usage</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">DataFrameのおおよそのメモリ使用量</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">データ規模の目安</td>
  </tr>
  </tbody>
  </table>
  </div>
  <p>最初に見るべきなのは、<strong>返品数のNon-Null Countが4であること</strong>と、<strong>日付・売上がobject型であること</strong>です。</p>

  <p><code>info()</code>はデータを表示・診断するだけなので、実行しても元のDataFrameは変わりません。</p>
  <h2 id="non-null-countから欠損値を見つける"><span id="toc4">Non-Null Countから欠損値を見つける</span></h2>

  <p>Non-Null Countは、<strong>欠損していない値の数</strong>です。欠損数ではありません。</p>

  <p>今回のDataFrameは全5行です。<code>返品数</code>は4 non-nullなので、欠損数は次のように求められます。</p>

  <p><strong>欠損数 = 全行数 − Non-Null Count = 5 − 4 = 1</strong></p>

  <p>各列の関係を整理すると、次のようになります。</p>

  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
  <tr class="header">
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">列名</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">全行数</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">Non-Null Count</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">欠損数</th>
  </tr>
  </thead>
  <tbody>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">返品数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
  </tr>
  </tbody>
  </table>
  </div>
  <p><code>info()</code>で欠損値の存在は分かりますが、<strong>どの行が欠損しているかまでは分かりません</strong>。詳しい件数と位置は<code>isnull()</code>で確認します。</p>
  <pre class="line-numbers"><code class="language-python"># 列ごとの欠損数
df.isnull().sum()</code></pre>
  <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">0</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">返品数</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      </tr>
    </tbody>
  </table>
  </div></div>
  <br>
  <label><b>dtype:</b> int64</label>
  <pre class="line-numbers"><code class="language-python"># 欠損値がある行
df[df[&quot;返品数&quot;].isnull()]</code></pre>
  <div id="df-3236b103-63f5-412c-a961-94f76096f6a7" class="colab-df-container">
      <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">返品数</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      </tr>
    </tbody>
  </table>
  </div></div>
      <div class="colab-df-buttons">

    <div class="colab-df-container">
      <button class="colab-df-convert" onclick="convertToInteractive('df-3236b103-63f5-412c-a961-94f76096f6a7')" title="Convert this dataframe to an interactive table." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
      <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
    </svg>
      </button>

    <style>
      .colab-df-container {
        display:flex;
        gap: 12px;
      }

      .colab-df-convert {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-convert:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      .colab-df-buttons div {
        margin-bottom: 4px;
      }

      [theme=dark] .colab-df-convert {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-convert:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>

      <script>
        const buttonEl =
          document.querySelector('#df-3236b103-63f5-412c-a961-94f76096f6a7 button.colab-df-convert');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        async function convertToInteractive(key) {
          const element = document.querySelector('#df-3236b103-63f5-412c-a961-94f76096f6a7');
          const dataTable =
            await google.colab.kernel.invokeFunction('convertToInteractive',
                                                      [key], {});
          if (!dataTable) return;

          const docLinkHtml = 'Like what you see? Visit the ' +
            '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
            + ' to learn more about interactive tables.';
          element.innerHTML = '';
          dataTable['output_type'] = 'display_data';
          await google.colab.output.renderOutput(dataTable, element);
          const docLink = document.createElement('div');
          docLink.innerHTML = docLinkHtml;
          element.appendChild(docLink);
        }
      </script>
    </div>


      </div>
    </div>
  <p><code>返品数</code>の欠損数は1件で、インデックス1の行にあることが分かりました。</p>

  <p>ここで注意したいのは、欠損値を見つけても、すぐに0で埋めたり行を削除したりしないことです。0が「返品なし」を意味するのか、「記録漏れ」を意味するのかで適切な処理は変わります。</p>

  <p>今回は、データの作成ルールとして<strong>空欄は返品なしを意味する</strong>と確認できたものとして、後ほど0で補完します。自分のデータでは、業務上の意味を確認してから<code>fillna()</code>または<code>dropna()</code>を選んでください。</p>
  <h2 id="dtypeからデータ型の問題を見つける"><span id="toc5">Dtypeからデータ型の問題を見つける</span></h2>

  <p><code>Dtype</code>は、各列をPandasがどのデータ型として認識しているかを示します。</p>

  <p>今回の結果では、次の3点に注目します。</p>

  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
  <tr class="header">
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">列名</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">現在のDtype</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">期待する型</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">判断</th>
  </tr>
  </thead>
  <tbody>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">datetime64[ns]</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">日付計算や月別集計の前に変換候補</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">商品名なのでそのままでよい</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">合計や平均を求める前に変換候補</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">返品数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">float64</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値のためfloat64になっている</td>
  </tr>
  </tbody>
  </table>
  </div>
  <h3 id="object型は必ず普通の文字列とは限らない"><span id="toc6">object型は必ず「普通の文字列」とは限らない</span></h3>

  <p>object型には、商品名のような文字列だけでなく、文字列として読み込まれた日付や数字も含まれます。そのため、object型を見つけても、すぐに機械的な型変換をせず、値の中身を確認します。</p>
  <pre class="line-numbers"><code class="language-python"># object型の列と実際の値を確認
print(df.select_dtypes(include=&quot;object&quot;).columns.tolist())
df[[&quot;日付&quot;, &quot;商品&quot;, &quot;売上&quot;]]</code></pre>
  <pre class="colab-output">[&#x27;日付&#x27;, &#x27;商品&#x27;, &#x27;売上&#x27;]</pre>
  <div id="df-b02564b3-888d-406c-9733-670602d53f57" class="colab-df-container">
      <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,200</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,500</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ファイル</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1,100</td>
      </tr>
    </tbody>
  </table>
  </div></div>
      <div class="colab-df-buttons">

    <div class="colab-df-container">
      <button class="colab-df-convert" onclick="convertToInteractive('df-b02564b3-888d-406c-9733-670602d53f57')" title="Convert this dataframe to an interactive table." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
      <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
    </svg>
      </button>

    <style>
      .colab-df-container {
        display:flex;
        gap: 12px;
      }

      .colab-df-convert {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-convert:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      .colab-df-buttons div {
        margin-bottom: 4px;
      }

      [theme=dark] .colab-df-convert {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-convert:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>

      <script>
        const buttonEl =
          document.querySelector('#df-b02564b3-888d-406c-9733-670602d53f57 button.colab-df-convert');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        async function convertToInteractive(key) {
          const element = document.querySelector('#df-b02564b3-888d-406c-9733-670602d53f57');
          const dataTable =
            await google.colab.kernel.invokeFunction('convertToInteractive',
                                                      [key], {});
          if (!dataTable) return;

          const docLinkHtml = 'Like what you see? Visit the ' +
            '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
            + ' to learn more about interactive tables.';
          element.innerHTML = '';
          dataTable['output_type'] = 'display_data';
          await google.colab.output.renderOutput(dataTable, element);
          const docLink = document.createElement('div');
          docLink.innerHTML = docLinkHtml;
          element.appendChild(docLink);
        }
      </script>
    </div>


      </div>
    </div>
  <p><code>日付</code>は日付形式の文字列、<code>売上</code>はカンマを含む数字の文字列です。一方、<code>商品</code>は名称なのでobject型のままで問題ありません。</p>

  <p><code>売上</code>のような列へ単純に<code>astype(int)</code>を使うと、<code>1,200</code>のカンマを整数として解釈できず、変換エラーになります。カンマを除いてから<code>to_numeric()</code>を使うと、数値に変換できない値の確認もしやすくなります。</p>

  <h3 id="float64は必ず小数を記録した列とは限らない"><span id="toc7">float64は必ず小数を記録した列とは限らない</span></h3>

  <p><code>返品数</code>の値は0・1・2という整数ですが、欠損値<code>NaN</code>を含むため、今回の環境ではfloat64として表示されています。Dtypeだけを見て「返品数には小数がある」と判断しないようにしましょう。</p>
  <h2 id="問題を修正してからinfoで再確認する"><span id="toc8">問題を修正してからinfo()で再確認する</span></h2>

  <p>次の方針で修正します。</p>

  <ul>
  <li><code>日付</code>：<code>to_datetime()</code>で日付型へ変換</li>
  <li><code>売上</code>：カンマを取り除き、<code>to_numeric()</code>で数値型へ変換</li>
  <li><code>返品数</code>：空欄は返品なしというルールに基づき0で補完して整数型へ変換</li>
  <li><code>商品</code>：名称なのでobject型のまま維持</li>
  </ul>

  <p>元のDataFrameを残して比較できるように、コピーした<code>df_fixed</code>を修正します。</p>
  <pre class="line-numbers"><code class="language-python">df_fixed = df.copy()

df_fixed[&quot;日付&quot;] = pd.to_datetime(df_fixed[&quot;日付&quot;])
df_fixed[&quot;売上&quot;] = pd.to_numeric(
    df_fixed[&quot;売上&quot;].str.replace(&quot;,&quot;, &quot;&quot;, regex=False)
)
df_fixed[&quot;返品数&quot;] = df_fixed[&quot;返品数&quot;].fillna(0).astype(&quot;int64&quot;)

df_fixed</code></pre>
  <div id="df-7332f704-7e2a-4109-b818-1c26d28dc7cc" class="colab-df-container">
      <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">商品</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">返品数</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1200</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">900</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ノート</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1500</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ファイル</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">800</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">ペン</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">1100</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      </tr>
    </tbody>
  </table>
  </div></div>
      <div class="colab-df-buttons">

    <div class="colab-df-container">
      <button class="colab-df-convert" onclick="convertToInteractive('df-7332f704-7e2a-4109-b818-1c26d28dc7cc')" title="Convert this dataframe to an interactive table." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
      <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
    </svg>
      </button>

    <style>
      .colab-df-container {
        display:flex;
        gap: 12px;
      }

      .colab-df-convert {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-convert:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      .colab-df-buttons div {
        margin-bottom: 4px;
      }

      [theme=dark] .colab-df-convert {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-convert:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>

      <script>
        const buttonEl =
          document.querySelector('#df-7332f704-7e2a-4109-b818-1c26d28dc7cc button.colab-df-convert');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        async function convertToInteractive(key) {
          const element = document.querySelector('#df-7332f704-7e2a-4109-b818-1c26d28dc7cc');
          const dataTable =
            await google.colab.kernel.invokeFunction('convertToInteractive',
                                                      [key], {});
          if (!dataTable) return;

          const docLinkHtml = 'Like what you see? Visit the ' +
            '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
            + ' to learn more about interactive tables.';
          element.innerHTML = '';
          dataTable['output_type'] = 'display_data';
          await google.colab.output.renderOutput(dataTable, element);
          const docLink = document.createElement('div');
          docLink.innerHTML = docLinkHtml;
          element.appendChild(docLink);
        }
      </script>
    </div>


    <div id="id_a628a5d8-fa21-43aa-befa-989e8101c575">
      <style>
        .colab-df-generate {
          background-color: #E8F0FE;
          border: none;
          border-radius: 50%;
          cursor: pointer;
          display: none;
          fill: #1967D2;
          height: 32px;
          padding: 0 0 0 0;
          width: 32px;
        }

        .colab-df-generate:hover {
          background-color: #E2EBFA;
          box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
          fill: #174EA6;
        }

        [theme=dark] .colab-df-generate {
          background-color: #3B4455;
          fill: #D2E3FC;
        }

        [theme=dark] .colab-df-generate:hover {
          background-color: #434B5C;
          box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
          filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
          fill: #FFFFFF;
        }
      </style>
      <button class="colab-df-generate" onclick="generateWithVariable('df_fixed')" title="Generate code using this dataframe." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
      <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
    </svg>
      </button>
      <script>
        (() => {
        const buttonEl =
          document.querySelector('#id_a628a5d8-fa21-43aa-befa-989e8101c575 button.colab-df-generate');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        buttonEl.onclick = () => {
          google.colab.notebook.generateWithVariable('df_fixed');
        }
        })();
      </script>
    </div>

      </div>
    </div>
  <p>表示上は似ていますが、<code>日付</code>・<code>売上</code>・<code>返品数</code>のデータ型が変わっています。修正できたと決めつけず、もう一度<code>info()</code>を実行して検証します。</p>
  <pre class="line-numbers"><code class="language-python">df_fixed.info()</code></pre>
  <pre class="colab-output">&lt;class &#x27;pandas.core.frame.DataFrame&#x27;&gt;
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   日付      5 non-null      datetime64[ns]
 1   商品      5 non-null      object        
 2   売上      5 non-null      int64         
 3   返品数     5 non-null      int64         
dtypes: datetime64[ns](1), int64(2), object(1)
memory usage: 292.0+ bytes</pre>
  <p>再確認では、次の変化に注目します。</p>

  <ul>
  <li><code>日付</code>：object → datetime64[ns]</li>
  <li><code>売上</code>：object → int64</li>
  <li><code>返品数</code>：4 non-null → 5 non-null、float64 → int64</li>
  <li><code>商品</code>：objectのまま</li>
  </ul>

  <p>処理前後を一覧でも確認しましょう。</p>
  <pre class="line-numbers"><code class="language-python">comparison = pd.DataFrame({
    &quot;修正前_Dtype&quot;: df.dtypes.astype(str),
    &quot;修正後_Dtype&quot;: df_fixed.dtypes.astype(str),
    &quot;修正前_Non-Null&quot;: df.notna().sum(),
    &quot;修正後_Non-Null&quot;: df_fixed.notna().sum()
})

comparison</code></pre>
  <div id="df-e61355ca-2479-42a6-979f-9c2337bd28a6" class="colab-df-container">
      <div>
  <style scoped>
      .dataframe tbody tr th:only-of-type {
          vertical-align: middle;
      }

      .dataframe tbody tr th {
          vertical-align: top;
      }

      .dataframe thead th {
          text-align: right;
      }
  </style>
  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
    <thead>
      <tr style="text-align: right;">
        <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">修正前_Dtype</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">修正後_Dtype</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">修正前_Non-Null</th>
        <th style="white-space: nowrap; padding: 0.2em 0.4em;">修正後_Non-Null</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">datetime64[ns]</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">商品</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      </tr>
      <tr>
        <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">返品数</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">float64</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
        <td style="white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      </tr>
    </tbody>
  </table>
  </div></div>
      <div class="colab-df-buttons">

    <div class="colab-df-container">
      <button class="colab-df-convert" onclick="convertToInteractive('df-e61355ca-2479-42a6-979f-9c2337bd28a6')" title="Convert this dataframe to an interactive table." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 -960 960 960">
      <path d="M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z"></path>
    </svg>
      </button>

    <style>
      .colab-df-container {
        display:flex;
        gap: 12px;
      }

      .colab-df-convert {
        background-color: #E8F0FE;
        border: none;
        border-radius: 50%;
        cursor: pointer;
        display: none;
        fill: #1967D2;
        height: 32px;
        padding: 0 0 0 0;
        width: 32px;
      }

      .colab-df-convert:hover {
        background-color: #E2EBFA;
        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
        fill: #174EA6;
      }

      .colab-df-buttons div {
        margin-bottom: 4px;
      }

      [theme=dark] .colab-df-convert {
        background-color: #3B4455;
        fill: #D2E3FC;
      }

      [theme=dark] .colab-df-convert:hover {
        background-color: #434B5C;
        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
        fill: #FFFFFF;
      }
    </style>

      <script>
        const buttonEl =
          document.querySelector('#df-e61355ca-2479-42a6-979f-9c2337bd28a6 button.colab-df-convert');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        async function convertToInteractive(key) {
          const element = document.querySelector('#df-e61355ca-2479-42a6-979f-9c2337bd28a6');
          const dataTable =
            await google.colab.kernel.invokeFunction('convertToInteractive',
                                                      [key], {});
          if (!dataTable) return;

          const docLinkHtml = 'Like what you see? Visit the ' +
            '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
            + ' to learn more about interactive tables.';
          element.innerHTML = '';
          dataTable['output_type'] = 'display_data';
          await google.colab.output.renderOutput(dataTable, element);
          const docLink = document.createElement('div');
          docLink.innerHTML = docLinkHtml;
          element.appendChild(docLink);
        }
      </script>
    </div>


    <div id="id_e323f409-55c6-46c4-96dd-23f6c5ca5153">
      <style>
        .colab-df-generate {
          background-color: #E8F0FE;
          border: none;
          border-radius: 50%;
          cursor: pointer;
          display: none;
          fill: #1967D2;
          height: 32px;
          padding: 0 0 0 0;
          width: 32px;
        }

        .colab-df-generate:hover {
          background-color: #E2EBFA;
          box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
          fill: #174EA6;
        }

        [theme=dark] .colab-df-generate {
          background-color: #3B4455;
          fill: #D2E3FC;
        }

        [theme=dark] .colab-df-generate:hover {
          background-color: #434B5C;
          box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
          filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
          fill: #FFFFFF;
        }
      </style>
      <button class="colab-df-generate" onclick="generateWithVariable('comparison')" title="Generate code using this dataframe." style="display:none;">

    <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewbox="0 0 24 24" width="24px">
      <path d="M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z"></path>
    </svg>
      </button>
      <script>
        (() => {
        const buttonEl =
          document.querySelector('#id_e323f409-55c6-46c4-96dd-23f6c5ca5153 button.colab-df-generate');
        buttonEl.style.display =
          google.colab.kernel.accessAllowed ? 'block' : 'none';

        buttonEl.onclick = () => {
          google.colab.notebook.generateWithVariable('comparison');
        }
        })();
      </script>
    </div>

      </div>
    </div>
  <p>この比較表によって、型変換と欠損値処理が想定どおり反映されたことを確認できます。</p>

  <p>重要なのは、<code>info()</code>が自動的に問題を直したわけではないことです。<code>info()</code>で問題を発見し、別のメソッドで修正し、最後に<code>info()</code>で再確認しています。</p>
  <h2 id="printdfinfoでnoneが表示される理由"><span id="toc9">print(df.info())でNoneが表示される理由</span></h2>

  <p><code>info()</code>は、要約情報を画面へ表示するメソッドです。要約情報をDataFrameや文字列として返すのではなく、戻り値は<code>None</code>です。</p>

  <p>そのため、<code>print(df.info())</code>と書くと、最初にinfo()の情報が表示され、そのあとに戻り値の<code>None</code>が表示されます。</p>
  <pre class="line-numbers"><code class="language-python">print(df_fixed.info())</code></pre>
  <pre class="colab-output">&lt;class &#x27;pandas.core.frame.DataFrame&#x27;&gt;
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   日付      5 non-null      datetime64[ns]
 1   商品      5 non-null      object        
 2   売上      5 non-null      int64         
 3   返品数     5 non-null      int64         
dtypes: datetime64[ns](1), int64(2), object(1)
memory usage: 292.0+ bytes
None</pre>
  <p>最後の<code>None</code>はエラーではありません。通常は、次のように<code>print()</code>を付けずに実行します。</p>

  <pre class="line-numbers"><code class="language-python">df_fixed.info()</code></pre>

  <p>また、次のコードでも<code>result</code>に要約表が保存されるわけではありません。</p>

  <pre class="line-numbers"><code class="language-python">result = df_fixed.info()</code></pre>

  <p>この場合、<code>result</code>の値は<code>None</code>です。</p>
  <h2 id="infoshapedtypesisnulldescribeの使い分け"><span id="toc10">info()・shape・dtypes・isnull()・describe()の使い分け</span></h2>

  <p>似た確認方法は、<strong>何を知りたいか</strong>で選びます。</p>

  <div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
  <tr class="header">
  <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">方法</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">何を求めるか</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
  <th style="white-space: nowrap; padding: 0.2em 0.4em;">分からないこと・注意点</th>
  </tr>
  </thead>
  <tbody>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>info()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">構造・非欠損数・型の全体像</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">データ読込直後の診断</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損位置や値の分布は分からない</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>shape</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">行数と列数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">件数を値として取得したい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">型や欠損値は分からない</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>dtypes</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">列ごとのデータ型</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">型だけを一覧で確認したい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">非欠損数は分からない</td>
  </tr>
  <tr class="even">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>isnull().sum()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">列ごとの欠損数</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値を詳しく確認したい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">型や分布の確認が中心ではない</td>
  </tr>
  <tr class="odd">
  <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>describe()</code></td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">統計量と値の分布</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">平均・中央値・ばらつきを見たい</td>
  <td style="white-space: nowrap; padding: 0.2em 0.4em;">DataFrame全体の構造確認とは目的が違う</td>
  </tr>
  </tbody>
  </table>
  </div>
  <p>迷ったら、最初に<code>info()</code>で全体を診断し、見つかった問題に応じて専用の方法へ進みます。</p>

  <ul>
  <li>件数だけ必要 → <code>shape</code></li>
  <li>型だけ詳しく確認 → <code>dtypes</code></li>
  <li>欠損数や欠損位置を確認 → <code>isnull()</code></li>
  <li>数値の分布を確認 → <code>describe()</code></li>
  </ul>

  <p><code>select_dtypes()</code>は、特定の型の列だけを抽出したいときに使います。全体診断ではなく、info()で型を確認した後の処理です。</p>
  <pre class="line-numbers"><code class="language-python">print(&quot;shape:&quot;, df_fixed.shape)
print(&quot;\ndtypes:&quot;)
print(df_fixed.dtypes)
print(&quot;\n欠損数:&quot;)
print(df_fixed.isnull().sum())</code></pre>
  <pre class="colab-output">shape: (5, 4)

dtypes:
日付     datetime64[ns]
商品             object
売上              int64
返品数             int64
dtype: object

欠損数:
日付     0
商品     0
売上     0
返品数    0
dtype: int64</pre>
  <h2 id="コードは動いても結果を誤解しやすい場面"><span id="toc11">コードは動いても結果を誤解しやすい場面</span></h2>

  <h3 id="non-null-countを欠損数だと思う"><span id="toc12">Non-Null Countを欠損数だと思う</span></h3>

  <p><strong>現象：</strong> <code>返品数 4 non-null</code>を「欠損値が4件ある」と読む。<br>
  <strong>原因：</strong> Non-Nullは「欠損していない」という意味だからです。<br>
  <strong>確認方法：</strong> 全行数からNon-Null Countを引きます。<br>
  <strong>修正方法：</strong> 正確な列別件数は<code>isnull().sum()</code>で確認します。<br>
  <strong>修正後の確認：</strong> 今回は5−4で、欠損値は1件です。</p>

  <h3 id="object型をすべて文字列として扱う"><span id="toc13">object型をすべて文字列として扱う</span></h3>

  <p><strong>現象：</strong> 売上の合計や日付による月別集計ができない、または想定外の結果になる。<br>
  <strong>原因：</strong> 数字や日付が文字列として読み込まれています。<br>
  <strong>確認方法：</strong> <code>head()</code>や対象列を表示し、実際の値と記号の混入を確認します。<br>
  <strong>修正方法：</strong> 数値は<code>to_numeric()</code>、日付は<code>to_datetime()</code>を検討します。一般的な型変換には<code>astype()</code>を使います。<br>
  <strong>修正後の確認：</strong> <code>info()</code>を再実行し、Dtypeが想定した型へ変わったか確認します。</p>

  <h3 id="float64を小数を記録した列と決めつける"><span id="toc14">float64を「小数を記録した列」と決めつける</span></h3>

  <p><strong>現象：</strong> 整数件数の列がfloat64と表示される。<br>
  <strong>原因：</strong> 欠損値を含む整数列が、今回のDataFrameではfloat64として保持されているためです。<br>
  <strong>確認方法：</strong> 実際の値と欠損値の有無を確認します。<br>
  <strong>修正方法：</strong> 欠損値の意味を確認して処理した後、必要なら整数型へ変換します。<br>
  <strong>修正後の確認：</strong> 今回の<code>返品数</code>は、補完後にint64となりました。</p>

  <h3 id="memory-usageを厳密な全メモリ量だと思う"><span id="toc15">memory usageを厳密な全メモリ量だと思う</span></h3>

  <p><code>info()</code>のmemory usageは、データ規模を知るための目安です。object型が参照するオブジェクトのメモリなど、条件によってはすべてを詳細に含む値ではありません。この記事ではメモリ最適化へ深入りせず、「急に大きなデータを読み込んでいないか」を確認する目安として使います。</p>
  <h2 id="infoでうまく確認できないときの原因と対処"><span id="toc16">info()でうまく確認できないときの原因と対処</span></h2>

  <h3 id="nameerror-name-df-is-not-defined"><span id="toc17">NameError: name &#8216;df&#8217; is not defined</span></h3>

  <p><strong>現象：</strong> <code>df.info()</code>を実行するとNameErrorが出る。<br>
  <strong>原因：</strong> <code>df</code>を作成・読み込みするセルをまだ実行していないか、変数名が違います。<br>
  <strong>確認方法：</strong> ColabでDataFrame作成セルが実行済みか、変数名が<code>df</code>か確認します。<br>
  <strong>修正方法：</strong> DataFrameを作成・読み込みするセルから順に実行します。<br>
  <strong>修正後の確認：</strong> <code>type(df)</code>が<code>pandas.core.frame.DataFrame</code>となり、<code>df.info()</code>が表示されることを確認します。</p>

  <h3 id="attributeerrorが出る"><span id="toc18">AttributeErrorが出る</span></h3>

  <p><strong>現象：</strong> 対象によっては「infoという属性がない」というAttributeErrorが出る。<br>
  <strong>原因：</strong> <code>df</code>がDataFrameではなく、リストなど別のオブジェクトになっている可能性があります。<br>
  <strong>確認方法：</strong> <code>type(df)</code>で対象の種類を確認します。<br>
  <strong>修正方法：</strong> 正しいDataFrame変数を指定するか、必要に応じてDataFrameへ変換します。<br>
  <strong>修正後の確認：</strong> <code>type(df)</code>と<code>df.info()</code>の両方を再確認します。</p>
  <h2 id="自分のデータでinfoを使うときの確認ポイント"><span id="toc19">自分のデータでinfo()を使うときの確認ポイント</span></h2>

  <p>サンプルを自分のCSVやExcelデータへ置き換えるときは、次を確認してください。</p>

  <ul>
  <li>想定した行数と列数になっているか</li>
  <li>必要な列名が存在するか</li>
  <li>各列のNon-Null Countが全行数と一致するか</li>
  <li>数値・日付・文字列のDtypeが想定どおりか</li>
  <li>object型の列に、数字・日付・記号などが混在していないか</li>
  <li>郵便番号や商品コードなど、先頭の0を残すべき列を数値にしていないか</li>
  <li>欠損値を0や平均値で埋めても、データの意味が変わらないか</li>
  <li>修正後に再度<code>info()</code>を実行したか</li>
  </ul>

  <p>特に、郵便番号や商品コードは計算する数値ではありません。CSV読込時に数値として解釈されると先頭の0が失われることがあるため、読み込み段階で文字列として扱う方法を検討します。</p>
  <h2 id="infoの確認結果を次の分析工程へつなげる"><span id="toc20">info()の確認結果を次の分析工程へつなげる</span></h2>

  <p><code>info()</code>は、データ分析のゴールではなく入口です。次の順で進めると、問題を見落としにくくなります。</p>

  <ol type="1">
  <li>CSVやExcelからデータを読み込む</li>
  <li><code>head()</code>で実際の値を確認する</li>
  <li><code>info()</code>で構造・非欠損数・型を確認する</li>
  <li><code>isnull()</code>で欠損値を詳しく確認する</li>
  <li><code>to_numeric()</code>・<code>to_datetime()</code>・<code>astype()</code>で型を整える</li>
  <li><code>fillna()</code>または<code>dropna()</code>で欠損値を処理する</li>
  <li><code>describe()</code>で分布や統計量を確認する</li>
  <li>必要な抽出・集計・可視化へ進む</li>
  </ol>

  <p>構造と型を確認するのが<code>info()</code>、値の分布を確認するのが<code>describe()</code>です。この役割を分けると、どちらを使うか迷いにくくなります。</p>
  <h2 id="まとめinfoは問題を見つけて次の処理を選ぶために使う"><span id="toc21">まとめ：info()は問題を見つけて次の処理を選ぶために使う</span></h2>

  <p><code>df.info()</code>は、DataFrameの行数・列数・列名・Non-Null Count・Dtype・メモリ使用量をまとめて確認するメソッドです。</p>

  <p>特に重要なポイントは次のとおりです。</p>

  <ul>
  <li>Non-Null Countは欠損していない値の数</li>
  <li>欠損数は「全行数−Non-Null Count」で考える</li>
  <li>Dtypeが想定と違う場合は、実際の値を確認してから変換方法を選ぶ</li>
  <li>object型には、文字列だけでなく数字や日付の文字列も含まれる</li>
  <li>欠損値を含む整数列がfloat64になる場合がある</li>
  <li><code>info()</code>はデータを修正せず、戻り値は<code>None</code></li>
  <li>修正後はもう一度<code>info()</code>を実行して結果を検証する</li>
  </ul>

  <p>最初に<code>info()</code>で全体を診断し、欠損値なら<code>isnull()</code>、型の問題なら<code>to_numeric()</code>・<code>to_datetime()</code>・<code>astype()</code>、分布の確認なら<code>describe()</code>へ進みましょう。</p>
  <h2 id="次に読みたい関連記事"><span id="toc22">次に読みたい関連記事</span></h2>

  <ul>
  <li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方と基本操作を初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-head/">pandas head()の使い方｜df.head()で先頭5行を表示・tail()との違いも解説</a></li>
  <li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
  <li><a href="https://pythondatalab.com/pandas-isnull/">欠損値を可視化して攻略！Pandas isnullとヒートマップ活用術</a></li>
  <li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を0・平均値・中央値・最頻値で埋める方法を初心者向けに解説</a></li>
  <li><a href="https://pythondatalab.com/pandas-drop/">Pandas dropna()・drop_duplicates()の使い方｜欠損・重複の削除とdrop()基本</a></li>
  <li><a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方｜文字列・整数・小数の型変換とエラー対処</a></li>
  <li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方｜文字列の日付変換とformat・NaT対処</a></li>
  <li><a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味と結果の見方を解説</a></li>
  </ul>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc23"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1788050751258" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">df.info()では何が分かりますか？</span></h3>
<div class="rank-math-answer ">

<p>DataFrameの行数・列数・列名・各列のNon-Null Count・Dtype・型ごとの列数・おおよそのメモリ使用量が分かります。データ読込後の全体診断に向いています。</p>

</div>
</div>
<div id="faq-question-1788050779638" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">Non-Null Countとは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>欠損値ではない値の数です。全5行で4 non-nullなら、欠損値は1件あります。</p>

</div>
</div>
<div id="faq-question-1788050790838" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">info()で欠損値の場所まで確認できますか？</span></h3>
<div class="rank-math-answer ">

<p>できません。info()では列ごとの非欠損数から欠損値の存在を判断できます。欠損数は<code>isnull().sum()</code>、欠損している行は条件抽出で確認します。</p>

</div>
</div>
<div id="faq-question-1788050802361" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">数字の列がobject型になるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>カンマ・通貨記号・空文字・数字以外の文字などが混在している可能性があります。実際の値を確認し、不要な記号を処理してから<code>to_numeric()</code>による変換を検討します。</p>

</div>
</div>
<div id="faq-question-1788050818426" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">欠損値があると整数列がfloat64になるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>今回のように通常のNumPy整数型で作成した列へ<code>NaN</code>が含まれると、欠損値を保持するためfloat64になることがあります。欠損値の意味を確認して処理したあと、必要なら整数型へ変換します。</p>

</div>
</div>
<div id="faq-question-1788050829184" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">info()とdescribe()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>info()はDataFrameの構造・非欠損数・データ型を確認します。describe()は平均・中央値・標準偏差など、値の分布と統計量を確認します。</p>

</div>
</div>
<div id="faq-question-1788050840930" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">info()とdtypesの違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>info()は行数・列数・非欠損数・型などをまとめて表示します。dtypesは列ごとのデータ型だけを一覧で返します。</p>

</div>
</div>
<div id="faq-question-1788050855362" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">print(df.info())でNoneが表示されるのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>info()は要約情報を画面に表示し、戻り値として<code>None</code>を返すためです。エラーではありません。通常は<code>df.info()</code>だけを実行します。</p>

</div>
</div>
<div id="faq-question-1788050864690" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">info()を実行すると元のDataFrameは変わりますか？</span></h3>
<div class="rank-math-answer ">

<p>変わりません。info()は確認用のメソッドです。型変換や欠損値処理を行うには、別のメソッドを使います。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-info-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-corr/</link>
					<comments>https://pythondatalab.com/pandas-corr/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 09 Aug 2026 09:11:45 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=2107</guid>

					<description><![CDATA[<p>pandasのcorr()を使って相関係数・相関行列を求める方法を初心者向けに解説。正負の相関の読み方、Pearson・Spearman・Kendallの違い、欠損値やNaNへの対処、ヒートマップ・散布図で確認する流れまでコード例付きで紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre[class*="language-"] { margin: 0 !important; padding: 1em; }
  .colab-article .table-scroll { overflow-x: auto; margin: 0; }
  .colab-article table.wp-block-table { width: auto; border-collapse: collapse; }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    border: 1px solid #c7c7c7;
    white-space: nowrap;
    padding: 0.5em 0.75em;
    text-align: left;
  }
  .colab-article table.wp-block-table thead th {
    background-color: #f2f2f2;
    font-weight: 700;
  }
  .colab-article table.wp-block-table th:first-child,
  .colab-article table.wp-block-table td:first-child { min-width: 3em; }
</style>
<div class="colab-article">

<p><code>describe()</code>で平均値や標準偏差を確認したあとに、<strong>「売上と広告費には関係があるの？」「どの列とどの列が一緒に動いているの？」</strong>と気になることはありませんか？</p>
<p>そんなときに使えるのが、Pandasの<code>corr()</code>です。<code>corr()</code>を使うと、複数の数値列の関係を<strong>相関係数</strong>としてまとめた「相関行列」を作れます。</p>
<p>ただし、<code>df.corr()</code>を実行して表を出すだけでは十分ではありません。大切なのは、<strong>相関係数の符号と大きさを読み、気になる組み合わせを散布図でも確認すること</strong>です。</p>
<p>この記事では、Google Colabでそのまま試せる小さなDataFrameを使って、<code>corr()</code>の基本から相関行列の読み方、散布図との使い分けまで順番に解説します。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">まず結論：corr()は「列と列の関係」をまとめて確認するときに使う</a></li><li><a href="#toc3" tabindex="0">相関係数とは？-1〜1の値をどう読むか</a></li><li><a href="#toc4" tabindex="0">相関を確認するサンプルDataFrameを作る</a></li><li><a href="#toc5" tabindex="0">pandas corr()の基本的な使い方</a><ol><li><a href="#toc6" tabindex="0">相関行列は「対角線以外」を見る</a></li><li><a href="#toc7" tabindex="0">特定の列との相関だけを確認する</a></li><li><a href="#toc8" tabindex="0">ヒートマップで相関行列を視覚的に捉える</a></li></ol></li><li><a href="#toc9" tabindex="0">正の相関・負の相関・弱い相関を同じデータで読む</a></li><li><a href="#toc10" tabindex="0">Pearson・Spearman・Kendallはどう使い分ける？</a></li><li><a href="#toc11" tabindex="0">corr()でつまずきやすい3つのポイント</a><ol><li><a href="#toc12" tabindex="0">1. 数字に見えても文字列型になっていることがある</a></li><li><a href="#toc13" tabindex="0">2. 欠損値があっても「0」として計算されるわけではない</a></li><li><a href="#toc14" tabindex="0">3. NaNが出たら「計算できる変化があるか」を確認する</a></li></ol></li><li><a href="#toc15" tabindex="0">corr()だけで判断せず、散布図で形を確認する</a></li><li><a href="#toc16" tabindex="0">データ分析では「確認→相関→可視化」の流れで使う</a></li><li><a href="#toc17" tabindex="0">注意：相関が高くても因果関係があるとは限らない</a></li><li><a href="#toc18" tabindex="0">まとめ：corr()で関係を見つけ、散布図で確かめよう</a></li><li><a href="#toc19" tabindex="0">関連記事</a><ol><li><a href="#toc20" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc21" tabindex="0">pandas corr()とは何ですか？</a></li><li><a href="#toc22" tabindex="0">相関係数が1、-1、0に近い場合はどういう意味ですか？</a></li><li><a href="#toc23" tabindex="0">corr()で文字列列がある場合はどうすればよいですか？</a></li><li><a href="#toc24" tabindex="0">corr()でNaNが出るのはなぜですか？</a></li><li><a href="#toc25" tabindex="0">PearsonとSpearmanはどう使い分けますか？</a></li><li><a href="#toc26" tabindex="0">DataFrame.corr()とSeries.corr()の違いは何ですか？</a></li><li><a href="#toc27" tabindex="0">corr()と散布図はどちらを使えばよいですか？</a></li><li><a href="#toc28" tabindex="0">相関係数が高ければ因果関係があると言えますか？</a></li><li><a href="#toc29" tabindex="0">pandasの相関行列はヒートマップにしたほうがよいですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>corr()</code>を何のために使うのか</li>
<li>相関係数の「1・0・-1」の意味</li>
<li>DataFrameから相関行列を作り、どこを見ればよいか</li>
<li>Pearson・Spearman・Kendallの基本的な違い</li>
<li><code>corr()</code>と<code>describe()</code>・散布図の使い分け</li>
<li>文字列型や欠損値があるときの注意点</li>
<li>相関係数だけで判断せず、散布図へ進む分析の流れ</li>
</ul>
<p>この記事のゴールは、<strong><code>corr()</code>で相関行列を作って正しく読み、気になる関係を散布図で確かめられるようになること</strong>です。</p>
<h2><span id="toc2">まず結論：corr()は「列と列の関係」をまとめて確認するときに使う</span></h2>
<p>データを確認するときは、知りたいことによって使う方法を変えると迷いにくくなります。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">知りたいこと</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">主に使う方法</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">見えるもの</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1列の値を要約したい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>describe()</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">平均・標準偏差・四分位数など</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">複数の数値列の関係を一覧で見たい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>corr()</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">相関係数・相関行列</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">2列の関係を目で確かめたい</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">散布図（<code>scatter</code>）</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">点の散らばり・外れ値・曲線的な関係</td>
</tr>
</tbody>
</table></div>
<p>つまり、<code>corr()</code>は<strong>1列ずつを見る<code>describe()</code>と、2列を図で見る散布図の間をつなぐ役割</strong>があります。</p>
<p>基本統計量の確認方法を先に知りたい方は、<a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方</a>も参考にしてください。DataFrameそのものがまだ不慣れな場合は、<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>から確認すると流れをつかみやすくなります。</p>
<h2><span id="toc3">相関係数とは？-1〜1の値をどう読むか</span></h2>
<p>相関係数は、2つの数値がどの程度一緒に動くかを**-1から1の範囲**で表した値です。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">相関係数の状態</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">読み方</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">イメージ</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1に近い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">正の相関が強い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が大きいほど、もう一方も大きい傾向</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0付近</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">直線的な相関が弱い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が変わっても、もう一方の増減がはっきりしない</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-1に近い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">負の相関が強い</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">一方が大きいほど、もう一方は小さい傾向</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1または-1</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">完全な正・負の相関</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">点が完全に一直線に並ぶ関係</td>
</tr>
</tbody>
</table></div>
<p>ここで重要なのは、<strong>符号は関係の向き、絶対値は直線的な関係の強さを見る手がかり</strong>だということです。たとえば<code>-0.9</code>は「マイナスだから弱い」のではなく、強い負の相関を示します。</p>
<p>また、「0.7以上なら必ず強い」のように数値だけで機械的に判断するのはおすすめできません。何を強いとみなすかは、データの種類や分析目的によって変わります。まずは相関係数で候補を見つけ、元データや散布図も確認するのが基本です。</p>
<h2><span id="toc4">相関を確認するサンプルDataFrameを作る</span></h2>
<p>ここからは、ある店舗の12期間分のデータを例にします。<code>広告費</code>、<code>売上</code>、<code>気温</code>、<code>返品件数</code>という4つの数値列を用意します。</p>
<p>今回は相関の違いを確認しやすいように、関係がはっきり表れる練習用データを使用します。</p>
<p>この例で知りたいのは、<strong>どの列同士が一緒に増減しているのか</strong>です。まずは元データを確認しましょう。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd

df = pd.DataFrame({
    "広告費": [10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65],
    "売上": [82, 95, 103, 119, 128, 142, 151, 165, 172, 188, 197, 211],
    "気温": [18, 25, 12, 28, 16, 22, 30, 14, 26, 19, 24, 20],
    "返品件数": [42, 39, 37, 35, 32, 31, 28, 26, 24, 21, 19, 17]
})

df</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">10</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">82</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">18</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">42</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">15</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">95</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">25</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">39</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">2</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">20</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">103</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">12</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">37</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">3</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">25</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">119</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">28</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">35</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">4</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">30</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">128</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">16</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">32</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">5</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">35</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">142</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">22</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">31</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">6</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">40</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">151</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">30</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">28</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">7</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">45</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">165</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">14</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">26</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">8</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">50</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">172</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">26</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">24</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">9</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">55</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">188</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">19</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">21</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">10</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">60</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">197</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">24</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">19</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">11</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">65</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">211</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">20</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">17</td>
</tr>
</tbody>
</table></div>
<p>元のDataFrameは、<strong>1行が1期間の観測データ</strong>です。この12行から、列同士の関係をまとめた表へ変換するのが次の<code>corr()</code>です。</p>
<h2><span id="toc5">pandas corr()の基本的な使い方</span></h2>
<p>DataFrameの相関係数をまとめて求める基本形は、次の1行です。</p>
<pre class="line-numbers"><code class="language-python">corr_matrix = df.corr()
corr_matrix.round(3)</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>実行すると、元の12行×4列のデータから、次のような<strong>4列×4列の相関行列</strong>が得られます。小数第3位に丸めると、おおよそ次の値です。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.121</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>これが「処理前→処理後」の大きな変化です。<code>corr()</code>は各行を個別に表示するのではなく、<strong>列と列の組み合わせごとに1つの相関係数を計算</strong>します。</p>
<h3><span id="toc6">相関行列は「対角線以外」を見る</span></h3>
<p>相関行列を初めて見ると、<code>1.000</code>がたくさん並んでいて戸惑うかもしれません。見るポイントは2つです。</p>
<ol>
<li><strong>対角線はすべて1になる</strong>
<ul>
<li><code>広告費</code>と<code>広告費</code>のように、同じ列を自分自身と比較しているためです。</li>
</ul></li>
<li><strong>上下には同じ組み合わせが重複する</strong>
<ul>
<li><code>広告費×売上</code>と<code>売上×広告費</code>は同じ関係なので、同じ値になります。</li>
</ul></li>
</ol>
<p>そのため、初心者のうちは<strong>対角線ではなく、異なる列同士の値を見る</strong>と考えれば十分です。</p>
<h3><span id="toc7">特定の列との相関だけを確認する</span></h3>
<p>相関行列全体ではなく、たとえば「売上とほかの列の関係だけを見たい」という場合は、列名を指定します。</p>
<pre class="line-numbers"><code class="language-python"># 「売上」とほかの列との相関だけを確認
corr_matrix["売上"].drop("売上")</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999175</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122452</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998055</td>
</tr>
</tbody>
</table></div>
<p><code>corr_matrix["売上"]</code>で売上の列だけを取り出し、<code>drop("売上")</code>で売上自身との相関係数<code>1.0</code>を除いています。特定の指標と関係が強い列を探したいときに便利です。</p>
<h3><span id="toc8">ヒートマップで相関行列を視覚的に捉える</span></h3>
<p>列数が多いDataFrameでは、相関行列を<strong>ヒートマップ</strong>にすると、相関の強さと向きを色で見分けやすくなります。ここでは、先ほど作った<code>corr_matrix</code>をそのまま可視化します。</p>
<p><code>seaborn</code>ライブラリの<code>heatmap</code>関数を使うと、簡単にヒートマップを作成できます。</p>
<pre class="line-numbers"><code class="language-python">!pip install japanize_matplotlib
import seaborn as sns
import matplotlib.pyplot as plt
import japanize_matplotlib # 日本語フォントを有効にする

plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.3f', linewidths=.5)
plt.title('相関行列のヒートマップ')
plt.show()</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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aN++fZHaVeBpSrGxscjMzMTDhw9x6NAhaGtrw8jICGZmZtDQ0EBaWhpKlixZpEYRERERkfIV6RFz1atXh52dHSwsLKChoYFHjx7B3t7+P/90ESIiIipeqvSIue9ZoQNBsViMgIAAjBo1CjExMYiOjkb79u0xbdo0mJqafv0ERERERFSsCh0ICgQCeHl5QUdHBzVr1oSrqyt++uknDB06VJHtIyIiIpIhFguUtqmTIi1lbmlpKXlg8l9//QUzMzNFtYuIiIiIlCxfgWBMTAyioqLk7gsNDcWhQ4dw/fp1dOjQAZaWlujZs6dCG0lERET0KXmP+aaCy1fX8KtXr+Dq6oqEhAQkJSVJjQH89ddf4e/vj1q1amH//v0YNWoUkpKSlNZgIiIiIk4WUYx8BYINGjTA69evMWnSJMyZM0fySJOcnBx07twZXbp0AQDUqVMHHh4emDNnjvJaTEREREQKke8xgiVLlsSECRPQrFkz7NixA3379oWmpqbM4tHTp0/Hmzd8LBIREREpj1jFFpT+XhV4soizszOcnZ3z3F+xYkVUrFixSI0iIiIiIuUr0qxhIiIiouLAySKKUaQnixARERGR6mJGkIiIiFSOus3uVRZmBImIiIjUFDOCREREpHKYEVQMBoJERESkckRq9kxgZWHXMBEREZGaYkaQiIiIVA67hhWDGUEiIiIiNcWMIBEREakcZgQVgxlBIiIiIjXFjCARERGpHD5iTjGYESQiIiJSU8wIEhERkcoRcx1BhWAgSERERCqHk0UUg13DRERERGqKGUEiIiJSOZwsohjMCBIRERGpKWYEiYiISOVwjKBiMCNIREREpKaYESQiIiKVw4ygYjAjSERERKSmmBEkIiIilcNZw4rBQJCIiIhUDruGFYNdw0RERERqihlBIiIiUjkiUXG34L+BGUEiIiIiNcWMIBEREakcjhFUDGYEiYiIiNQUM4JERESkcpgRVAxmBImIiIjUFDOCREREpHK4oLRiMBAkIiIilSNWat+wQInn/r6wa5iIiIhITTEjSERERCqHk0UUgxlBIiIiIjXFjCARERGpHD5iTjGYESQiIiJSskePHsHd3R0VKlSAra0t5s2b98UJL3v27IGenh6sra2ltmvXrknqJCYmYujQoahUqRLKlSuH/v37IykpqUDtYiBIREREKkcsVt6maHFxcXB1dYW7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" alt="広告費・売上・気温・返品件数の相関行列を示すヒートマップ">
  <figcaption>相関行列のヒートマップ</figcaption>
</figure>
<p>この<code>coolwarm</code>配色では、赤系が正の相関、青系が負の相関、白に近い色が0付近を示します。まず色で気になる組み合わせを見つけ、<code>annot=True</code>で表示した数値を確認しましょう。</p>
<h2><span id="toc9">正の相関・負の相関・弱い相関を同じデータで読む</span></h2>
<p>先ほどの相関行列から、特徴の異なる3つの組み合わせを見てみましょう。</p>
<pre class="line-numbers"><code class="language-python">print("広告費と売上      :", round(corr_matrix.loc["広告費", "売上"], 3))
print("広告費と返品件数  :", round(corr_matrix.loc["広告費", "返品件数"], 3))
print("売上と気温        :", round(corr_matrix.loc["売上", "気温"], 3))</code></pre>
<pre class="colab-output"><code>広告費と売上      : 0.999
広告費と返品件数  : -0.999
売上と気温        : 0.122</code></pre>
<p>このサンプルでは、次のように読めます。</p>
<ul>
<li><strong>広告費と売上：0.999</strong> → 強い正の相関がある</li>
<li><strong>広告費と返品件数：-0.999</strong> → 強い負の相関がある</li>
<li><strong>売上と気温：0.122</strong> → 少なくとも強い直線的な相関は見られない</li>
</ul>
<p>ここで、<code>0.122</code>だから「売上と気温には絶対に何の関係もない」とは断定できません。<code>corr()</code>が捉える関係、とくに標準のPearson相関は<strong>直線的な関係</strong>が中心です。曲線的な関係や外れ値の影響は、相関係数だけでは見落とすことがあります。</p>
<p>このため、<code>corr()</code>は<strong>結論を自動的に出す道具ではなく、詳しく見る組み合わせを探す道具</strong>として使うと理解しやすいです。</p>
<h2><span id="toc10">Pearson・Spearman・Kendallはどう使い分ける？</span></h2>
<p><code>DataFrame.corr()</code>は、標準では<strong>Pearson（ピアソン）の相関係数</strong>を計算します。初心者が連続した数値データの直線的な関係を見るなら、まずPearsonから始めればよいでしょう。</p>
<div class="table-scroll"><table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">method</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">ざっくりした考え方</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">初心者が使う場面</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>pearson</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">数値の直線的な関係を見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">まず基本として使う</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>spearman</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">値の順位にもとづいて単調な関係を見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位関係を重視したいとき</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;"><code>kendall</code></td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位の一致・不一致にもとづいて見る</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">順位データなどで候補になる</td>
</tr>
</tbody>
</table></div>
<p>指定するときは<code>method</code>引数を使います。違いが見えやすいよう、ここだけ小さな比較用データを使います。<code>x</code>が増えるにつれて<code>y</code>も必ず増えますが、最後の値だけ大きく離れています。</p>
<pre class="line-numbers"><code class="language-python">method_df = pd.DataFrame({
    "x": [1, 2, 3, 4, 5, 6, 7, 8],
    "y": [1, 2, 3, 4, 5, 6, 7, 100]
})

print("Pearson :", round(method_df.corr(method="pearson").loc["x", "y"], 3))
print("Spearman:", round(method_df.corr(method="spearman").loc["x", "y"], 3))
print("Kendall :", round(method_df.corr(method="kendall").loc["x", "y"], 3))</code></pre>
<pre class="colab-output"><code>Pearson : 0.624
Spearman: 1.0
Kendall : 1.0</code></pre>
<p>この例では順位そのものは完全に同じ方向へ動いているため、SpearmanやKendallでは強い関係として表れます。一方、Pearsonは数値の直線的な関係を見るため、最後の大きな値の影響を受けます。</p>
<p>ここでは**「methodによって見ている関係が違う」**と分かれば十分です。Spearman・Kendallの統計理論や数式には深入りしません。通常の数値データで迷ったら、まずPearsonで確認し、分析目的に応じて別の方法を検討しましょう。</p>
<h2><span id="toc11">corr()でつまずきやすい3つのポイント</span></h2>
<p><code>corr()</code>は短いコードで使えますが、実際のCSVやExcelから読み込んだデータでは、データ型や欠損値に注意が必要です。</p>
<h3><span id="toc12">1. 数字に見えても文字列型になっていることがある</span></h3>
<p>たとえばCSVから読み込んだ<code>広告費</code>が文字列になっていると、そのまま数値列として分析できないことがあります。まず<code>dtypes</code>で型を確認する習慣をつけましょう。</p>
<pre class="line-numbers"><code class="language-python">df_text = df.copy()
df_text["広告費"] = df_text["広告費"].astype(str)

df_text.dtypes</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">0</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">object</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">int64</td>
</tr>
</tbody>
</table></div>
<p>型が混在するDataFrameでは、初心者には<strong>数値列を明示してからcorr()を使う方法</strong>が分かりやすく、安全です。</p>
<pre class="line-numbers"><code class="language-python">numeric_df = df_text.select_dtypes(include="number")
numeric_df.corr().round(3)</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">気温</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">返品件数</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">気温</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.122</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">返品件数</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.998</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">-0.114</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p><code>DataFrame.corr()</code>には<code>numeric_only</code>という引数もあります。数値列だけを対象にする書き方として<code>df.corr(numeric_only=True)</code>もありますが、<strong>なぜ列が対象外になったのかを理解するためにも、先に<code>dtypes</code>で型を確認する</strong>のがおすすめです。</p>
<p>数値列だけを選ぶ方法は<a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方</a>、文字列になった数字を数値型へ直す方法は<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>で詳しく解説しています。</p>
<h3><span id="toc13">2. 欠損値があっても「0」として計算されるわけではない</span></h3>
<p>実データには欠損値が含まれることがあります。<code>corr()</code>では、対象となる2列について利用できる観測値を使って相関を計算します。<strong>欠損値を勝手に0へ置き換えて計算するわけではありません。</strong></p>
<p>たとえば一部の<code>売上</code>を欠損値にして確認します。</p>
<pre class="line-numbers"><code class="language-python">df_missing = df.copy()
df_missing.loc[[2, 7], "売上"] = pd.NA

print(df_missing[["広告費", "売上"]].isna().sum())
df_missing[["広告費", "売上"]].corr().round(3)</code></pre>
<pre class="colab-output"><code>広告費    0
売上     2
dtype: int64</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
</tr>
</tbody>
</table></div>
<p>相関係数の計算に必要な最小データ数を決めたい場合は、<code>min_periods</code>を指定できます。次の例では、広告費と売上の有効な組み合わせが10件しかないのに11件以上を必要とするため、この2列間の相関係数は<code>NaN</code>になります。</p>
<pre class="line-numbers"><code class="language-python"># 計算に必要な有効データ数を11件以上に指定
df_missing[["広告費", "売上"]].corr(min_periods=11)</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.0</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
</tbody>
</table></div>
<p><code>min_periods</code>は、少ないデータだけで相関係数が計算されるのを避けたい場合に便利です。PandasではPearson相関とSpearman相関で利用できます。</p>
<p>欠損が多いほど、組み合わせによって計算に使えるデータ数が変わる可能性があります。相関係数を見る前に「何件のデータが残っているのか」を意識しましょう。欠損値の場所や件数の確認は、<a href="https://pythondatalab.com/pandas-isnull/">Pandas isnull()で欠損値を確認する記事</a>につなげて学べます。</p>
<p>なお、isnull()記事で扱っているmissingnoの「欠損パターン同士の相関」と、ここで扱う<strong>売上・広告費など通常の数値変数同士の相関</strong>は目的が異なります。</p>
<h3><span id="toc14">3. NaNが出たら「計算できる変化があるか」を確認する</span></h3>
<p>相関係数が<code>NaN</code>になる代表例の1つが、<strong>すべて同じ値の列</strong>です。値が変化しない列では、通常の相関係数を計算できません。</p>
<pre class="line-numbers"><code class="language-python">df_constant = df[["広告費", "売上"]].copy()
df_constant["固定値"] = 1

df_constant.corr().round(3)</code></pre>
<div class="table-scroll"><table border="1" class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr style="text-align: right;">
<th style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;"></th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">広告費</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">売上</th>
<th style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left; background-color: #f2f2f2; font-weight: 700;">固定値</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">広告費</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">売上</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">0.999</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">1.000</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
<tr>
<td style="min-width: 3em; border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">固定値</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
<td style="border: 1px solid #c7c7c7; white-space: nowrap; padding: 0.5em 0.75em; text-align: left;">NaN</td>
</tr>
</tbody>
</table></div>
<p><code>corr()</code>で<code>NaN</code>を見つけたら、エラーだと決めつけず、<strong>列の値がすべて同じではないか、欠損値が多すぎないか、計算に使えるデータが十分あるか</strong>を確認してください。</p>
<h2><span id="toc15">corr()だけで判断せず、散布図で形を確認する</span></h2>
<p>相関係数は複数列を一覧で比較するのに便利ですが、<strong>点がどのように散らばっているか</strong>までは分かりません。</p>
<p>たとえば<code>広告費</code>と<code>売上</code>は相関係数が約0.999でした。この関係を散布図でも確認してみましょう。</p>
<pre class="line-numbers"><code class="language-python">import matplotlib.pyplot as plt

plt.scatter(df["広告費"], df["売上"])
plt.xlabel("Ad cost")
plt.ylabel("Sales")
plt.title("Ad cost vs Sales")
plt.grid(alpha=0.3)
plt.show()</code></pre>
<figure class="colab-figure">
  <img decoding="async" src="data:image/png;base64,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/PHH37k3gN0RdIAIU1xcrPPPP18bNmwI+Hn88ce1fv16VVZWqlevXqqvr1dzc3PA73799dfH3L7L5dL27ds7tebgwYPatWuXevfu7R/LysrSiy++qC+//FJZWVmaOHHiMbffnuuvv17/8z//o3379unVV1/V9ddfHzB/vH+nd+/eWr58uXw+n1avXi1Juv/++3XDDTfojDPO0BNPPKH33ntPr7766lG306tXL0mHL3TOzs5u85OSkuJf+/3vf1+lpaX67LPPFBcXp9zcXB04cCDomoFIQNABIsjevXv10ksv6eqrr9a5554b8JOfn6/k5GQtW7ZMF198sXw+n5588smA3//9739/zL8xceJE1dXVtfkH/fXXX/c/UXnChAmqq6vT66+/HrCmuLhYxhhNnDhR0uFn/Xg8HkmH72h64okn1NTUpPLyckn/d4QpmNvMp0yZoqamJv3yl7+Uy+VSbm6uf+5Yf+fbamtrdcstt6ipqSlgfP/+/ZLkv7387bff1tChQ/XEE09o0qRJOuecc7Rv3z7/32zPoEGD1K9fPz366KNttj979mx/TQcOHPDPDxw4UA8//LDcbrc+/fTTY/YCiCghPnUGoAstXrzYREVFma+++qrd+Ztuusn07t3bNDc3mwkTJphTTjnFPPbYY2bjxo1m3rx5ZtCgQSYpKSmou65OO+00/+8uW7bMJCYmmqKiIv+a0aNH++/M2rBhg3nggQdMfHy8ueaaa/zb+uUvf2nOOuss88ILL5h//OMfpqioyMTExJjNmzcbYw5ffBsdHW1mzZpl/vd//9ds2LDhqPt/9dVXG4fD4a8j2L/zbX//+9/NqaeeaoYNG2aeffZZ89FHH5mVK1ea7Oxsk5mZafbt22eMMWb+/PmmW7du5oknnjAbN240ixcvNueee66JiYkx5eXl/u3pWxcjr1q1ykRFRZkRI0aYV155xaxbt87k5+ebxMRE88UXXxhjjJk8ebJ//sMPPzQ33nijSUxMNI2NjUftARBpCDpABBk2bJi5+OKLO5x/7733jCTz/PPPmwMHDpibbrrJ9OrVy3Tv3t3853/+p9mxY4dJT08/atAxxpj9+/ebgoICk5aWZmJjY83gwYPNkiVLAtYcOHDA3HrrrSYjI8PExMSYM88809x///3G6/X61zQ2NprbbrvNZGRkmNjYWDN06NA2d2otWLDAJCQkmAEDBpi//OUvR61r7dq1xul0BtwFFezf+bYtW7aY6667zmRmZppu3bqZzMxM89///d9mx44d/jXNzc1m9uzZJiUlxXTv3t3k5eWZrVu3mhEjRpiHH37Yv+7bQccYY9566y1z0UUXmVNOOcUkJCSYSZMmmaqqKv+82+02N9xwg0lOTjbx8fFm5MiR5u9///tRawYikcOYDq6IAwAAOMlxjQ4AALAtgg4AALAtgg4AALAtgg4AALAtgg4AALAtgg4AALCt6FAXEGo+n0+1tbXq0aOHHA5HqMsBAABBMMaosbFRaWlpR30PX8QHndraWmVmZoa6DAAA0Anbt29XRkZGh/MRH3R69Ogh6XCjEhISLNuuz+dTfX29XC5XUG98RvvoozXoozXoozXoozUivY8NDQ3KzMz0/zvekYgPOkdOVyUkJFgedJqampSQkBCRX0Cr0Edr0Edr0Edr0Edr0MfDjnXZSeR2BgAA2B5BBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2FbEPxkZAABYz+szKq/eI3djk5J7xGlE/yRFObv+5dkEHQAAYKnSyjoVrapSnafJP5aaGKfCvCyNz07t0lo4dQUAACxTWlmn6SsqAkKOJO30NGn6igqVVtZ1aT0EHQAAYAmvz6hoVZVMO3NHxopWVcnra2/FiUHQAQAAliiv3tPmSM43GUl1niaVV+/pspoIOgAAwBLuxo5DTmfWWYGgAwAALJHcI87SdVYg6AAAAEuM6J+k1MQ4dXQTuUOH774a0T+py2oi6AAAAEtEOR0qzMuSpDZh58jnwrysLn2eDkEHAABYZnx2qpZMzVFKYuDpqZTEOC2ZmtPlz9HhgYEAAMBS47NTlZuVwpORAQCAPUU5HRp1Rq9Ql8GpKwAAYF8EHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFsEHQAAYFshDTrLli3TkCFDlJ6ersGDB2vp0qUB883NzZozZ44GDhyotLQ0XXbZZaqtrQ1YU1NTo8mTJ6tfv35KT09XQUGBWlpaunI3AABAmApZ0Hn66ac1b948vfDCC6qpqdFLL72ku+66S88995x/zYwZM7R+/Xpt3LhR27Zt05lnnqkJEybI6/VKklpaWpSbm6u+fftq8+bN2rRpkyoqKlRQUBCq3QIAAGEkZEFn3bp1+u1vf6shQ4ZIkgYPHqwpU6boxRdflCRt27ZNJSUlevDBB5WYmKjo6Gjde++9qqmp0WuvvSZJevHFF+V2u3XvvfcqKipKPXv21MKFC1VcXKxdu3aFatcAAECYCFnQefTRR3XVVVcFjH3yySdKSEiQJK1du1Z9+vRRTk6Of75bt24aN26cXn/9dUlSWVmZxo4dq5iYGP+anJwcJSUlqaysrAv2AgAAhLPoUBcgSYcOHVJBQYHef/99vf/++5IOX3uTlpbWZm1aWpo+//xz/5rs7Ow2a9LT01VTU9Pu32publZzc7P/c0NDgyTJ5/PJ5/Md974c4fP5ZIyxdJuRiD5agz5agz5agz5aI9L7GOx+hzzobNu2TVdeeaUaGhr07rvv+oNLTEyMnM62B5wcDoeMMUGv+bYFCxaoqKiozXh9fb2ampqOZ1cC+Hw+eTweGWParRHBoY/WoI/WoI/WoI/WiPQ+NjY2BrUupEFn48aNmjhxoq6++mrdc889io2N9c9lZGS0ucNKkmpra5Wenh70mm+74447Ai5WbmhoUGZmplwul/+0mRV8Pp8cDodcLldEfgGtQh+tQR+tQR+tQR+tEel9jIuLC2pdyILOtm3bNHHiRD3yyCP6yU9+0mZ+zJgxcrvd+vjjjzVs2DBJUmtrq8rKyrRkyRJJ0rhx4zRt2jS1trYqOvrwrmzatEn19fUaM2ZMu383NjY2IFAd4XQ6Lf+iOByOE7LdSEMfrUEfrUEfrUEfj4/XZ1S+dZ/q3XvkOhCjkQN6KcrpCHVZXSrY707IvmE33nijfv7zn7cbciTJ5XIpPz9fBQUFamhokNfr1a9+9SslJSXpkksukSRNmjRJLpdLc+fOldfrlcfj0cyZM5Wfny+Xy9WVuwMAQJcorazTBfeXaWrxOi19Z4umFq/TBfeXqbSyLtSlhaWQBZ3XX39djz32mDIyMtr8HPHQQw9p6NChysrKUkZGhj777DOVlpb6j95ER0ertLRUVVVVyszM1JAhQzR8+HAtXrw4VLsFAMAJU1pZp+krKlTnCbymdKenSdNXVBB22hGyU1cdXSz8TbGxsVq0aJEWLVrU4ZqMjAytXLnSytIAAAg7Xp9R0aoqtfevp5HkkFS0qkq5WSkRdxrraDg5CgDASaC8ek+bIznfZCTVeZpUXr2n64o6CRB0AAA4Cbgbg3sESrDrIgVBBwCAk0Byj+Bupw52XaQg6AAAcBIY0T9JqYlx6ujqG4ek1MQ4jeif1JVlhT2CDgAAJ4Eop0OFeVmS1CbsHPlcmJfFhcjfQtABAOAkMT47VUum5iglMfD0VEpinJZMzdH47NQQVRa+Qv6uKwAAELzx2anKzUrR+i27Ve/+Sq7kPhH5ZORgEXQAADjJRDkdOn9Aktyntio5OUlOQk6HOHUFAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi5d6AgDwDV6fUXn1Hrkbm5TcI04j+ifxZvCTGEEHAID/r7SyTkWrqlTnafKPpSbGqTAvS+OzU0NYGTqLU1cAAOhwyJm+oiIg5EjSTk+Tpq+oUGllXYgqw/Eg6AAAIp7XZ1S0qkqmnbkjY0WrquT1tbcC4YygAwCIeOXVe9ocyfkmI6nO06Ty6j1dVxQsQdABAEQ8d2PHIacz6xA+CDoAgIiX3CPO0nUIHwQdAEDEG9E/SamJceroJnKHDt99NaJ/UleWBQsQdAAAES/K6VBhXpYktQk7Rz4X5mXxPJ2TEEEHAABJ47NTtWRqjlISA09PpSTGacnUHJ6jc5LigYEAAPx/47NTlZuVwpORbYSgAwDAN0Q5HRp1Rq9QlwGLcOoKAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYFkEHAADYVsiCjs/n07p16zR79mwlJSVp+fLlAfNffPGFrrzySvXt21eZmZm68MIL9cYbbwSsqamp0eTJk9WvXz+lp6eroKBALS0tXbgXAAAgnIUs6JSUlGjWrFmKj49XVFRUwNzXX3+tiy66SAMGDNDmzZu1fft2zZw5U3l5edq4caMkqaWlRbm5uerbt682b96sTZs2qaKiQgUFBaHYHQAAEIZCFnSuu+46lZeXa/78+erevXvA3Mcff6yamhr96le/UkxMjCTpyiuv1L/9279p7dq1kqQXX3xRbrdb9957r6KiotSzZ08tXLhQxcXF2rVrV5fvDwAACD9heY3OWWedpYSEBL300kv+sU8//VRffPGFLrjgAklSWVmZxo4d6w9CkpSTk6OkpCSVlZV1ec0AACD8hOXby0877TT97W9/00033aTnnntOycnJ2rZtm/76179qxIgRkg5fn5Odnd3md9PT01VTU9Phtpubm9Xc3Oz/3NDQIOnwNUM+n8+yffD5fDLGWLrNSEQfrUEfrUEfrUEfrRHpfQx2v8My6EhSdXW1fD6fRo0apd69e6uiokIvv/yyLrzwQnXr1k0xMTFyOtsekHI4HDLGdLjdBQsWqKioqM14fX29mpqaLKvf5/PJ4/HIGNNunQgOfbQGfbQGfbQGfbRGpPexsbExqHVhGXTeffddTZs2TZWVlerbt68k6frrr9cPfvADLViwQIWFhcrIyFBtbW2b362trVV6enqH277jjjsCLlhuaGhQZmamXC6XEhISLNsHn88nh8Mhl8sVkV9Aq9BHa9BHa9BHa9BHa0R6H+Pi4oJaF5ZB57333tOAAQP8IUc6vEOjR4/W+vXrJUnjxo3TtGnT1Nraqujow7uxadMm1dfXa8yYMR1uOzY2VrGxsW3GnU6n5V8Uh8NxQrYbaeijNeijNeijNeijNSK5j8Huc1h2ZvTo0aqqqtLTTz/tPwf37rvvasWKFRo/frwkadKkSXK5XJo7d668Xq88Ho9mzpyp/Px8uVyuUJYPAADCRFgGnZEjR+rll19WSUmJ+vbtq5SUFM2aNUt33323Zs2aJUmKjo5WaWmpqqqqlJmZqSFDhmj48OFavHhxiKsHAADhIixOXW3durXN2Pjx4/1HbzqSkZGhlStXnqCqAADAyS4sj+gAAABYgaADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsi6ADAABsKyxeAQEAiAxen9H6LXtU794t1/5ojRzQS1FOR6jLgo0RdAAAXaK0sk5Fq6r0ledrDT7N6J97q9UnMV6FeVkan50a6vJgU5y6AgCccKWVdZq+okJ1nqaA8Z2eJk1fUaHSyroQVQa7I+gAAE4or8+oaFWVTDtzR8aKVlXJ62tvBXB8CDoAgBOqvHpPmyM532Qk1XmaVF69p+uKQsQg6AAATih3Y8chpzPrgO+CoAMAOKGSe8RZug74Lgg6AIATakT/JKUmxqmjm8gdklIT4zSif1JXloUIQdABAJxQUU6HCvOyJKlN2DnyuTAvi+fp4IQg6AAATrjx2alaMjVHKYmBp6dSEuO0ZGoOz9HBCcMDAwEAXWJ8dqpys1K0fstu1bu/kiu5D09GxglH0AEAdJkop0PnD0iS+9RWJScnyUnIwQnGqSsAAGBbBB0AAGBbBB0AAGBbBB0AAGBbBB0AAGBbBB0AAGBb3F4OADbh9RmVV++Ru7FJyT0Ov1KBZ9Qg0hF0AMAGSivrVLSqSnWe/3sDeGpinArzsnjqMCIap64A4CRXWlmn6SsqAkKOJO30NGn6igqVVtaFqDIg9Ag6AHAS8/qMilZVybQzd2SsaFWVvL72VgD2R9ABgJNYefWeNkdyvslIqvM0qbx6T9cVBYQRgg4AnMTcjR2HnM6sA+yGoAMAJ7HkHnGWrgPshqADACexEf2TlJoYp45uInfo8N1XI/ondWVZQNgg6ADASSzK6VBhXpYktQk7Rz4X5mXxPB1ELIIOAJzkxmenasnUHKUkBp6eSkmM05KpOTxHBxGNBwYCgA2Mz05VblYKT0YGvoWgAwA2EeV0aNQZvUJdBhBWOHUFAABsK2RBx+fzad26dZo9e7aSkpK0fPnyNmvKyso0YsQIZWRkqG/fvpozZ45aWlr88zU1NZo8ebL69eun9PR0FRQUBMwDAIDIFrKgU1JSolmzZik+Pl5RUVFt5tetW6cpU6bo4Ycf1o4dO7Ru3TqtXr1aq1evliS1tLQoNzdXffv21ebNm7Vp0yZVVFSooKCgq3cFAACEqZAFneuuu07l5eWaP3++unfv3mb+l7/8pW699VaNHDlSkpSWlqYNGzZo0qRJkqQXX3xRbrdb9957r6KiotSzZ08tXLhQxcXF2rVrV5fuCwAACE9heY3O3r179c4772jixIkB49888lNWVqaxY8cqJibGP5aTk6OkpCSVlZV1Wa0AACB8heVdV5s3b5YxRgcPHtSECRNUVVWltLQ03XrrrbriiiskHb4+Jzs7u83vpqenq6ampsNtNzc3q7m52f+5oaFB0uFrhnw+n2X74PP5ZIyxdJuRiD5agz5agz5agz5aI9L7GOx+h2XQ8Xq9kqR58+bp0UcfVb9+/fTmm2/q8ssvV7du3ZSXl6eYmBg5nW0PSDkcDhljOtz2ggULVFRU1Ga8vr5eTU3WvfTO5/PJ4/HIGNNunQgOfbQGfbQGfbQGfbRGpPexsbExqHVhGXT69u0rSZo/f74GDBggScrNzdXVV1+tp556Snl5ecrIyFBtbW2b362trVV6enqH277jjjsCLlhuaGhQZmamXC6XEhISLNsHn88nh8Mhl8sVkV9Aq9BHa9BHa9BHa9BHa0R6H+PigntRbVgGnZSUFA0cODDgFNMRsbGxkqRx48Zp2rRpam1tVXT04d3YtGmT6uvrNWbMmA63HRsb69/GNzmdTsu/KA6H44RsN9LQR2vQR2vQR2vQR2tEch+D3eew7IzD4VBhYaFuvPFGffnll5KkNWvW6JlnnlF+fr4kadKkSXK5XJo7d668Xq88Ho9mzpyp/Px8uVyuUJYPAADCRFge0ZGkqVOnqrGxUT/60Y/U2NiolJQULV++XD/60Y8kSdHR0SotLdWMGTOUmZkpp9Opn/zkJ7rvvvtCXDkAAAgXYRF0tm7d2u749OnTNX369A5/LyMjQytXrjxBVQEAgJNdWJ66AgAAsAJBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2BZBBwAA2FZYvNQTAMKd12e0fsse1bt3y7U/WiMH9FKU0xHqsgAcA0EHAI6htLJORauq9JXnaw0+zeife6vVJzFehXlZGp+dGuryAByFJaeuDh06pK+//tqKTQFAWCmtrNP0FRWq8zQFjO/0NGn6igqVVtaFqDIAwehU0Fm+fLn+8Ic/SJLee+89JScnq2fPnnruuecsLQ4AQsnrMypaVSXTztyRsaJVVfL62lsBIBx0KugsWLBAF198sSTplltu0QMPPKDKykrNmzfPytoAIKTKq/e0OZLzTUZSnadJ5dV7uq4oAN9Jp67ROXjwoAYOHKiqqip5PB5df/31kqR9+/ZZWRsAhJS7seOQ05l1ALpep4LOgAEDNG/ePL355pu64YYbJElvv/22MjIyLC0OAEIpuUecpesAdL1OnboqKSnRp59+qhEjRuiWW26RJK1du5ZTVwBsZUT/JKUmxqmjm8gdklIT4zSif1JXlgXgO+j0EZ0//elPAWNz5861pCAACBdRTocK87I0fUVFm7Bz5HNhXhbP0wHCWKdvL9+xY4d+85vfaNq0aZKkZ555Rs3NzZYVBgDhYHx2qpZMzVFKYuDpqZTEOC2ZmsNzdIAw16kjOu+8847y8vI0ZswYrVu3Tn/84x+1adMmffjhh/rd735ndY0AEFLjs1OVm5Wi9Vt2q979lVzJfXgyMnCS6NQRnVtvvVXPPfecXnrpJcXGxkqS7rrrLv31r3+1sjYACBtRTofOH5CkkQN66fwBSYQc4CTRqaCzfft2TZgwQZLkcBz+L3tcXJyamrjFEgAAhI9OBZ3k5GSVlZUFjL3zzjtKS0uzpCgAAAArdOoanbvuukt5eXm6/vrrtX//ft1zzz1avHixSkpKrK4PAACg0zoVdP7zP/9T0dHRevjhh9WrVy+9//77evbZZ/2vhQAAAAgHnQo6knTppZfq0ksvtbIWAAAASwUddN5+++2g1v37v/97p4sBAACwUtBB56KLLjrmGofDIa/Xezz1AAAAWCbooOPz+U5kHQAAAJbr9CsgAAAAwl2nLkb2er1aunSpPvroIx06dEiSdPDgQVVWVqqystLSAgEAADqrU0d0brrpJi1atEjdu3fXX//6VyUnJ6u8vFz33HOP1fUBAAB0WqeCziuvvKL169dr4cKFSkhI0H333aeVK1fqiSeesLo+AACATuv0c3S6d+8uSYqNjdWBAwc0dOhQVVRUWFYYgMjh9RmVV++Ru7FJyT3iNKI/L80EYI1OBZ1x48bppz/9qV544QUNHz5cv/vd75STk6OYmBir6wNgc6WVdSpaVaU6z/+9FDg1MU6FeVkan50awsoA2EGngs7vf/97LVy4UNHR0brtttt08cUXq6WlRU8++aTV9QGwsdLKOk1fUSHzrfGdniZNX1GhJVNzCDsAjst3ukbn4MGDkqRTTz1Vd911lyQpKipKy5Yt07/+9S9deeWV1lcIwJa8PqOiVVVtQo4k/1jRqip5fe2tAIDgBB10NmzYoMGDB+vrr7/2j915550699xzNW3aNA0fPlwbNmw4IUUCsJ/y6j0Bp6u+zUiq8zSpvHpP1xUFwHaCDjp33nmn5s+fr/j4eEnSBx98oAULFuhPf/qTdu/ercWLF+v2228P+g/7fD6tW7dOs2fPVlJSkpYvX97h2ldffVUOh6PNmpqaGk2ePFn9+vVTenq6CgoK1NLSEnQNAELH3dhxyOnMOgBoT9BBp6qqSldffbX/84IFCzRhwgT/6aqpU6dqy5YtQf/hkpISzZo1S/Hx8YqKiupwndvt1syZM3XGGWcEjLe0tCg3N1d9+/bV5s2btWnTJlVUVKigoCDoGgCETnKPOEvXAUB7gg460dHRam1tlSRt3bpVL7/8sm655Rb//KFDh77T0ZTrrrtO5eXlmj9/vv9W9Y7W3XDDDcrIyAgYf/HFF+V2u3XvvfcqKipKPXv21MKFC1VcXKxdu3YFXQeA0BjRP0mpiXHq6CZyhw7ffTWif1JXlgXAZoIOOmPGjNG1116rV199Vddcc43OPvts5ebm+ucfffRR5eTkWFrckiVLtGPHDs2ePbvNXFlZmcaOHRtwS3tOTo6SkpJUVlZmaR0ArBfldKgwL0uS2oSdI58L87J4ng6A4xL07eUPPvigrrvuOl111VUaOnSonn/+ef/crl27dPfdd2v16tWWFfbZZ5/p17/+td5+++12n89TU1Oj7OzsNuPp6emqqanpcLvNzc1qbm72f25oaJB0+JohK9/Q7vP5ZIzhre/HiT5aI1z7ODarjx6bcrbufqVKO79xYXJKYpzmTsrS2Kw+YVVzuPbxZEMfrRHpfQx2v4MOOqeddppeeumldud69+6tzz//XL169Qp2c0d16NAhTZkyRXfeeaeGDBnS7pqYmBg5nW0PSDkcDhnT8e2oCxYsUFFRUZvx+vp6NTVZd9Gjz+eTx+ORMabdOhEc+miNcO7j2S6n/nztEH3+VaM8Xx9SYnyMzurTQ06nQ263O9TlBQjnPp5M6KM1Ir2PjY2NQa3r9Csgvs2qkCNJhYWFSkhI0C9+8YsO12RkZKi2trbNeG1trdLT0zv8vTvuuCPgguWGhgZlZmbK5XIpISHh+Ar/Bp/PJ4fDIZfLFZFfQKvQR2ucDH1MSekT6hKO6WTo48mAPloj0vsYFxfcjQqWBR0rvfbaa/rHP/7R5j+4tWvXKj8/X4cOHdK4ceM0bdo0tba2Kjr68G5s2rRJ9fX1GjNmTIfbjo2NVWxsbJtxp9Np+RfF4XCckO1GGvpoDfpoDfpoDfpojUjuY7D7HJad+eijj2SMCfgZPXq0SkpKZIxRdHS0Jk2aJJfLpblz58rr9crj8WjmzJnKz8+Xy+UK9S4AAIAwEJZBJxjR0dEqLS1VVVWVMjMzNWTIEA0fPlyLFy8OdWkAACBMhMWpq61btx5zzZo1a9qMZWRkaOXKldYXBAAAbOGkPaIDAABwLAQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgWwQdAABgW9GhLgDAieX1Ga3fskf17t1y7Y/WyAG9FOV0hLosAOgSBB3Axkor61S0qkpfeb7W4NOM/rm3Wn0S41WYl6Xx2amhLg8ATjhOXQE2VVpZp+krKlTnaQoY3+lp0vQVFSqtrAtRZQDQdQg6gA15fUZFq6pk2pk7Mla0qkpeX3srAMA+CDqADZVX72lzJOebjKQ6T5PKq/d0XVEAEAIEHcCG3I0dh5zOrAOAkxVBB7Ch5B5xlq4DgJMVQQewoRH9k5SaGKeObiJ3SEpNjNOI/kldWRYAdDmCDmBDUU6HCvOyJKlN2DnyuTAvi+fpALA9gg5gU+OzU7Vkao5SEgNPT6UkxmnJ1ByeowMgIvDAQMDGxmenKjcrReu37Fa9+yu5kvvwZGQAEYWgA9hclNOh8wckyX1qq5KTk+Qk5ACIIJy6AgAAtkXQAQAAtkXQAQAAtkXQAQAAtkXQAQAAtkXQAQAAtkXQAQAAtkXQAQAAtkXQAQAAthWyoOPz+bRu3TrNnj1bSUlJWr58ecB8S0uLbr/9dvXr10/p6ekaNWqU3nnnnYA1NTU1mjx5sn9NQUGBWlpaunAvAABAOAtZ0CkpKdGsWbMUHx+vqKioNvPTp0/XRx99pI0bN6qmpka33nqrJkyYoM2bN0s6HIRyc3PVt29fbd68WZs2bVJFRYUKCgq6elcAAECYClnQue6661ReXq758+ere/fuAXMtLS2qrKxUcXGxevXqJUm64oorNGjQIL366quSpBdffFFut1v33nuvoqKi1LNnTy1cuFDFxcXatWtXl+8PAAAIP2F5jU63bt20fv169e3b1z/W2NiorVu3KiEhQZJUVlamsWPHKiYmxr8mJydHSUlJKisr6/KaEZm8PqP3N+/Wyo9q9P7m3fL6TKhLAgB8w0nx9nK3260f//jHSklJ0eTJkyUdvj4nOzu7zdr09HTV1NR0uK3m5mY1Nzf7Pzc0NEg6fM2Qz+ezrGafzydjjKXbjETh3Me/bdqpu1+p0k5Pk38sJTFOcydladyQlBBW1lY49/FkQh+tQR+tEel9DHa/wz7ovPXWW5oyZYrOPfdc/eUvf1F8fLwkKSYmRk5n2wNSDodDxnT8/1UvWLBARUVFbcbr6+vV1NTUzm90js/nk8fjkTGm3ToRnHDt48Yv92jJms06zSmddtr/jTv0tR59baN8B8/QOacnha7AbwnXPp5s6KM16KM1Ir2PjY2NQa0L66DzxBNP6LbbbtODDz6on/3sZwFzGRkZqq2tbfM7tbW1Sk9P73Cbd9xxR8AFyw0NDcrMzJTL5fKfFrOCz+eTw+GQy+WKyC+gVcKxj16f0T0lldrpcbQ775B0T1mt1t42SFHO9td0tXDs48mIPlqDPloj0vsYFxcX1LqwDTqrVq3S3Llz9c477ygrK6vN/Lhx4zRt2jS1trYqOvrwbmzatEn19fUaM2ZMh9uNjY1VbGxsm3Gn02n5F8XhcJyQ7UaacOvj+urdqvU063CkaV+tp1kffLlPo87o1XWFHUO49fFkRR+tQR+tEcl9DHafw7Iz+/fv1/XXX69nn3223ZAjSZMmTZLL5dLcuXPl9Xrl8Xg0c+ZM5efny+VydXHFiCTuxuBOcQa7DgBw4oRl0Nm4caPq6+s1ZcoUZWRkBPz85Cc/kSRFR0ertLRUVVVVyszM1JAhQzR8+HAtXrw4xNXD7pJ7BHe4NNh1AIATJyxOXW3dujXg8+jRo4O6mjojI0MrV648QVUB7RvRP0mpiXHa6WlSe5e9O3T47qsR/cPnYmQAiFRheUQHCGdRTocK8w6fUv32VTpHPhfmZYXNhcgAEMkIOkAnjM9O1ZKpOUpJDDw9lZIYpyVTczQ+OzVElQEAviksTl0BJ6Px2anKzUpRefUeuRublNzj8OkqjuQAQPgg6ADHIcrpCKtbyAEAgTh1BQAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbIugAwAAbCs61AUAHfH6jNZv2aN692659kdr5IBeinI6Ql0WAOAkQtBBWCqtrFPRqip95flag08z+ufeavVJjFdhXpbGZ6eGujwAwEmCU1cIO6WVdZq+okJ1nqaA8Z2eJk1fUaHSyroQVQYAONkQdBBWvD6jolVVMu3MHRkrWlUlr6+9FQAABCLoIKyUV+9pcyTnm4ykOk+Tyqv3dF1RAICTFkEHYcXd2HHI6cw6AEBkI+ggrCT3iLN0HQAgshF0EFZG9E9SamKcOrqJ3CEpNTFOI/ondWVZAICTVMiCjs/n07p16zR79mwlJSVp+fLlAfPNzc2aM2eOBg4cqLS0NF122WWqra0NWFNTU6PJkyerX79+Sk9PV0FBgVpaWrpwL2C1KKdDhXlZktQm7Bz5XJiXxfN0AABBCVnQKSkp0axZsxQfH6+oqKg28zNmzND69eu1ceNGbdu2TWeeeaYmTJggr9crSWppaVFubq769u2rzZs3a9OmTaqoqFBBQUFX7wosNj47VUum5iglMfD0VEpinJZMzeE5OgCAoDmMMSG/T7dfv36aN2+efvazn0mStm3bpv79+2vDhg3KycmRdDjYpKWlqaSkRHl5eXrmmWd08803q66uTjExMZKkiooKff/739eOHTvUu3fvoP52Q0ODEhMT5fF4lJCQYNk++Xw+ud1uJScny+nkDGFnHH4y8m7Vu7+SK7kPT0Y+DnwfrUEfrUEfrRHpfQz23++w7MzatWvVp08ff8iRpG7dumncuHF6/fXXJUllZWUaO3asP+RIUk5OjpKSklRWVtblNcN6UU6Hzh+QpJEDeun8AUmEHADAdxaWr4CoqalRWlpam/G0tDR9/vnn/jXZ2dlt1qSnp6umpqbDbTc3N6u5udn/uaGhQdLhZOzz+Y63dD+fzydjjKXbjET00Rr00Rr00Rr00RqR3sdg9zssg05MTEy7h+EcDoeOnGkLZk17FixYoKKiojbj9fX1amqy7tksPp9PHo9HxpiIPKRoFfpoDfpoDfpoDfpojUjvY2NjY1DrwjLoZGRktLnDSpJqa2uVnp4e9Jr23HHHHQEXLDc0NCgzM1Mul8vya3QcDodcLldEfgGtQh+tQR+tQR+tQR+tEel9jIsL7nlqYRl0xowZI7fbrY8//ljDhg2TJLW2tqqsrExLliyRJI0bN07Tpk1Ta2uroqMP78amTZtUX1+vMWPGdLjt2NhYxcbGthl3Op2Wf1EcDscJ2W6koY/WoI/WoI/WoI/WiOQ+BrvPYdkZl8ul/Px8FRQUqKGhQV6vV7/61a+UlJSkSy65RJI0adIkuVwuzZ07V16vVx6PRzNnzlR+fr5cLleI9wAAAISDsAw6kvTQQw9p6NChysrKUkZGhj777DOVlpb6j95ER0ertLRUVVVVyszM1JAhQzR8+HAtXrw4xJUDAIBwERanrrZu3dpmLDY2VosWLdKiRYs6/L2MjAytXLnyBFYGAABOZmF7RAcAAOB4EXQAAIBthcWpK3Q9r8+ovHqP3I1NSu5x+G3gPHkYAGA3BJ0IVFpZp6JVVarz/N8DElMT41SYl8ULMwEAtsKpqwhTWlmn6SsqAkKOJO30NGn6igqVVtaFqDIAAKxH0IkgXp9R0aoqtfeCjCNjRauq5PWF/IX2AABYgqATQcqr97Q5kvNNRlKdp0nl1Xu6rigAAE4ggk4EcTcG99LSYNcBABDuCDoRJLlHcC9AC3YdAADhjqATQUb0T1JqYpw6uoncocN3X43on9SVZQEAcMIQdCJIlNOhwrwsSWoTdo58LszL4nk6AADbIOhEmPHZqVoyNUcpiYGnp1IS47Rkag7P0QEA2AoPDIxA47NTlZuVwpORAQC2R9CJUFFOh0ad0SvUZQAAcEJx6goAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANgWQQcAANhWdKgLsCOvz2j9lj2qd++Wa3+0Rg7opSinI9RlAQAQcQg6FiutrFPRqip95flag08z+ufeavVJjFdhXpbGZ6eGujwAACIKp64sVFpZp+krKlTnaQoY3+lp0vQVFSqtrAtRZQAARCaCjkW8PqOiVVUy7cwdGStaVSWvr70VAADgRCDoWKS8ek+bIznfZCTVeZpUXr2n64oCACDChXXQ2b9/v2bPnq3+/fsrIyNDQ4YM0SOPPOKfb25u1pw5czRw4EClpaXpsssuU21tbUhqdTd2HHI6sw4AABy/sL4Y+ZprrtH+/fv1wQcfqFevXvrkk080fvx4+Xw+zZo1SzNmzNDmzZu1ceNGde/eXXPmzNGECRNUUVGhqKioLq01uUecpesAAMDxC+sjOq+//rpuuukm9erVS5I0dOhQXXnllXrjjTe0bds2lZSU6MEHH1RiYqKio6N17733qqamRq+99lqX1zqif5JSE+PU0U3kDkmpiXEa0T+pK8sCACCihXXQOffcc7Vy5Ur5fD5Jh09lvfXWW/r3f/93rV27Vn369FFOTo5/fbdu3TRu3Di9/vrrXV5rlNOhwrwsSWoTdo58LszL4nk6AAB0obA+dfXiiy9qxowZGjZsmC644AJ98MEHuvHGGzVt2jTdf//9SktLa/M7aWlp+vzzzzvcZnNzs5qbm/2fGxoaJEk+n88fqDprbFYfPTblbN39SpXcnq/lkJFTUnJinOZOytLYrD7H/Tcijc/nkzGGvh0n+mgN+mgN+miNSO9jsPsd1kGnrq5OO3fu1A9+8AONHDlSn3/+uVauXKlLL71UMTExcjrbHpByOBwypuNbuBcsWKCioqI24/X19WpqOv4Lhc92OfXna4fos68a1bBvnxJ69tSgPj3kdDrkdruPe/uRxufzyePxyBjT7n/eCA59tAZ9tAZ9tEak97GxsTGodWEbdBoaGpSbm6vi4mL9x3/8hyQpPz9fM2bM0JQpU3TjjTe2e4dVbW2t0tPTO9zuHXfcoYKCgoC/k5mZKZfLpYSEBMvqT052qb6+Xi6XKyK/gFbx+XxyOBz08TjRR2vQR2vQR2tEeh/j4oK7uSdsg86nn36q3bt366KLLgoYHzdunEpKSvTCCy/I7Xbr448/1rBhwyRJra2tKisr05IlSzrcbmxsrGJjY9uMO51Oy78oDofjhGw30tBHa9BHa9BHa9BHa0RyH4Pd57DtTFZWlpKTk3XXXXfp4MGDkqQvv/xSCxYs0Pjx4+VyuZSfn6+CggI1NDTI6/XqV7/6lZKSknTJJZeEuHoAABAOwjbonHrqqXr77bfldrs1aNAgpaWlacyYMRo9erSefvppSdJDDz2koUOHKisrSxkZGfrss89UWlqq6OiwPVAFAAC6UFgngkGDBulPf/pTh/OxsbFatGiRFi1a1IVVAQCAk0XYHtEBAAA4XgQdAABgWwQdAABgWwQdAABgWwQdAABgW2F911VXOPK6iCPvvLKKz+dTY2Oj4uLiIvJBTlahj9agj9agj9agj9aI9D4e+Xf7aK99kgg6/ndlZGZmhrgSAADwXTU2NioxMbHDeYc5VhSyOZ/Pp9raWvXo0UMOh8Oy7R55h9b27dstfYdWpKGP1qCP1qCP1qCP1oj0Phpj1NjYqLS0tKMe0Yr4IzpOp1MZGRknbPsJCQkR+QW0Gn20Bn20Bn20Bn20RiT38WhHco6IvJN6AAAgYhB0AACAbRF0TpDY2FgVFhYqNjY21KWc1OijNeijNeijNeijNehjcCL+YmQAAGBfHNEBAAC2RdABAAC2RdABAAC2RdA5Tj6fT+vWrdPs2bOVlJSk5cuXB8w3Nzdrzpw5GjhwoNLS0nTZZZeptrY2NMWGsWXLlmnIkCFKT0/X4MGDtXTp0oB5+hichoYG/fznP9fpp5+uzMxM5eTk6KWXXvLP08fvbseOHUpKStLPfvYz/xh9DE5FRYViYmKUkZER8POXv/xFEn0MVnV1tS677DKlp6crNTVVkydPVl1dnX+ePh4dQec4lZSUaNasWYqPj1dUVFSb+RkzZmj9+vXauHGjtm3bpjPPPFMTJkyQ1+sNQbXh6emnn9a8efP0wgsvqKamRi+99JLuuusuPffcc/419DE4kydP1sGDB7Vp0yZt375dv/vd73T11VervLxcEn38rowxuvbaa9s8VJQ+BmfHjh3KycnRjh07An4uv/xySfQxGPv27dMPf/hD5eXlaceOHdqyZYtiYmL00EMP+dfQx2MwsMzpp59uSkpK/J+//PJL43Q6zcaNG/1jzc3NplevXubll18OQYXh6ec//7l59tlnA8YKCgrM5Zdfboyhj99FfX29aWpqChgbNmyYWbhwIX3shAceeMCMGzfOFBYWmmuvvdYYw/fxu3jsscfMFVdc0e4cfQzOXXfdZSZNmhQw1tra6v+/6eOxcUTnBFq7dq369OmjnJwc/1i3bt00btw4vf766yGsLLw8+uijuuqqqwLGPvnkE/8jzelj8Hr37u1/pkZTU5P++Mc/6tNPP9WFF15IH7+jf/zjH7rvvvv02GOPBYzTx+Dt2LFDffv2bXeOPgbn5Zdf1sSJEwPGvnn2gD4eG0HnBKqpqVFaWlqb8bS0NNXU1ISgovB36NAhzZw5U++//75uvfVWSfSxMzIzM3XKKafoD3/4g/785z/r3HPPpY/fQVNTk6ZMmaL77rtPAwYMCJijj8GrqanR3r17dfnll2vAgAE677zztGzZMv8cfTy2f/3rX+rZs6f++7//W/3799fQoUM1f/58tba2SqKPwYj4l3qeSDExMe2+UdXhcMjwnMY2tm3bpiuvvFINDQ169913lZ2dLYk+dsb27du1b98+LVy4UE8++aTGjBlDH7+D22+/XWeccYauv/76NnP0MXgOh0Nut1uPPPKI+vXrpw8++ECXXXaZWltb6WOQvF6v5s+fr8cee0xLly7V559/riuuuEJ79+7Vgw8+SB+DwBGdEygjI6PdK99ra2uVnp4egorC18aNG3Xeeefpggsu0Icffqjhw4f75+hj5/Ts2VO/+c1vVFtbq0ceeYQ+Bmn16tV6/vnn9fjjj7c7Tx+DV1JSoldffVX9+/eXw+HQeeedp5tvvlklJSX0MUh9+/bVDTfcoNGjR8vhcGjQoEGaO3eunnrqKUl8H4NB0DmBxowZI7fbrY8//tg/1traqrKyMo0fPz6ElYWXbdu2aeLEiXrkkUf0u9/9rs17W+hjcHw+n1555ZU2471791ZdXR19DNJrr70mt9utPn36yOFwyOFwqKioSE8++aQcDoecTid9DFJ7RxS8Xq8cDgffxyBdeOGFam5ubjN+5H8n6WMQQnghtO18+64rY4y54YYbzI9+9CPj8XhMa2urue2228yQIUPMoUOHQlNkGJowYYKZN2/eUdfQx2PbuXOn6dOnj5k3b57/zqvS0lLTrVs3s3r1amMMfeysb951ZQx9DNYll1xiZs+ebQ4cOGCMMWbDhg0mOTnZLFu2zBhDH4Pxr3/9y6SlpZk1a9YYY4zZunWrycrKMnPnzvWvoY9HR9CxUHtBp6mpydxyyy0mPT3dpKSkmEsvvdRs3749NAWGKUkmOTnZpKent/k5gj4Gp7q62kyePNmkpaWZ1NRU873vfS/g1n362DnfDjr0MTg7duww11xzjcnIyDDJycnmzDPPNI888oh/nj4GZ82aNWbEiBHG5XKZAQMGmN/85jcBIYY+Hh1vLwcAALbFNToAAMC2CDoAAMC2CDoAAMC2CDoAAMC2CDoAAMC2CDoAAMC2CDoAAMC2CDoAwsbq1asVFRWlHTt2HHOtw+HQmjVrTnxRAE5qBB0AYePxxx9XRkaGSkpKQl1Ku/bt26eRI0eGugwA3wFBB0BYcLvdWr16tRYtWqSSkpJ2XwgZavv27VN5eXmoywDwHRB0AISFJ598UhdffLHy8vLU0NCgN9980z+3adMmjRkzRikpKRo6dKj+/Oc/H3VbXq9XCxYs0Jlnnqn09HSNGjVK69at889/8cUXuvTSS5WZmakzzjhDN998sxobG/3zpaWlysrKUkpKikaNGqX33ntPDQ0NGjVqlCQpIyNDw4YNs7gDAE4Egg6AsFBcXKxrrrlGMTExmjp1qoqLiyVJ+/fv18SJEzVq1CjV1tbqvffe01//+tejbmvOnDkqKSnR6tWrVVNTo9tvv11XX321WlpaVFdXp/PPP1+jRo3Sl19+qY8++kjbtm3TJZdc4j+KdO211+qRRx7Rzp079etf/1oHDx5UQkKC3n//fUnSjh079PHHH5/QfgCwBi/1BBByb7/9tn784x+rpqZGMTEx+uSTT3TeeeeptrZWb7zxhmbNmqWamhpFRUVJkhoaGpSYmKi33npLF110UcC2WlpadNppp+mpp57SFVdcETDerVs33XPPPXrhhRf0j3/8wz+3a9cuJScn691339X3v/995eTk6LzzztNvfvMb9enTx79u69at6t+/f1ieVgPQPo7oAAi5xx9/XB6PRy6XSz179tSFF16o1tZWPf3009qyZYtOP/10f8iRpISEhA63VV9fr4MHD2rw4MEB4926dZN0OKwMGjQoYK53797q3bu3tm7dKkn629/+pm7dumnYsGH6j//4D9XU1Fi0pwC6GkEHQEjt3btXf/7zn/Xee+9p3759/p8HH3xQy5YtU2pqqqqrq9Xa2ur/nZ07d3a4PZfLpfj4eH322WcB44cOHZIk9e3bV59//nnA3O7du7Vr1y717dvXv42HH35YX375pXr16qXrr7/eqt0F0MUIOgBCasWKFTr99NN1zjnnBIxfddVVqqqqUr9+/eR0OvXrX/9aXq9X9fX1uuaaa/xHaL6tW7dumjFjhubMmaMvvvhCkvTBBx/orLPOUn19vfLz8/Xll1/qt7/9rYwxOnDggKZNm6YRI0boBz/4gRobG3XzzTerurpacXFxOv/88+XxeCRJp5xyiqTDd4jt3bv3BHYFgFWiQ10AgMhWXFysKVOmtBlPTk7W2LFj9cwzz2jNmjW66aablJaWpt69e+uBBx446sXA9913n3r37q0JEybo66+/VkpKiv74xz/K5XJJkt5//30VFBTooYceUkxMjCZMmKDi4mI5HA51795daWlp+uEPf6iWlhalpaVp6dKl/pr+67/+S0OHDtX555+vlStXnpimALAMFyMDAADb4tQVAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwLYIOAACwrf8HfahAa6G7/B8AAAAASUVORK5CYII=" alt="広告費と売上の関係を示す散布図">
  <figcaption>広告費と売上の散布図</figcaption>
</figure>
<p>点が右上がりに並んでいれば、「広告費が大きい期間ほど売上も大きい」という傾向を目でも確認できます。</p>
<p>散布図には、相関係数だけでは気づきにくい次の情報があります。</p>
<ul>
<li>外れた点がないか</li>
<li>点が直線ではなく曲線のように並んでいないか</li>
<li>一部の点だけが相関係数を大きく動かしていないか</li>
</ul>
<p>したがって、<strong><code>corr()</code>で候補を探す → 散布図で実際の形を見る</strong>という順番が実践的です。散布図の色・サイズ・凡例などは、<a href="https://pythondatalab.com/matplotlib-scatter-colormap-size/">Matplotlib scatter入門</a>で詳しく解説しています。この記事ではcorr()の結果を確かめるための最小限の描画にとどめます。</p>
<h2><span id="toc16">データ分析では「確認→相関→可視化」の流れで使う</span></h2>
<p>実際の分析では、いきなり<code>corr()</code>だけを実行するより、次の順番で進めると迷いにくくなります。</p>
<ol>
<li><code>head()</code>や<code>dtypes</code>でDataFrameの中身と型を確認する</li>
<li><code>describe()</code>で各数値列の分布をざっくり確認する</li>
<li>必要なら文字列の数字や欠損値を整える</li>
<li><code>corr()</code>で列同士の相関を一覧する</li>
<li>気になる組み合わせを散布図で確認する</li>
</ol>
<p>つまり、<code>corr()</code>は前処理そのものではなく、<strong>整えたDataFrameを探索し、次に詳しく見るべき関係を見つける段階</strong>に位置づきます。</p>
<p>この流れを意識すると、<code>df.corr()</code>で表を出して終わるのではなく、分析の次の一手を決められるようになります。</p>
<h2><span id="toc17">注意：相関が高くても因果関係があるとは限らない</span></h2>
<p>相関係数を読むときに、最も大切な注意点の1つです。</p>
<p>たとえば、このサンプルでは<code>広告費</code>と<code>売上</code>に強い正の相関があります。しかし、この結果だけから**「広告費を増やしたことが売上増加の原因である」**とは断定できません。季節、キャンペーン、来店客数など、別の要因が両方に影響している可能性もあります。</p>
<p><code>corr()</code>が示すのは、あくまでデータ上の関係です。<strong>相関関係と因果関係は別物</strong>として扱いましょう。</p>
<h2><span id="toc18">まとめ：corr()で関係を見つけ、散布図で確かめよう</span></h2>
<p>この記事では、Pandasの<code>corr()</code>を使って相関係数・相関行列を確認する方法を解説しました。</p>
<ul>
<li><code>corr()</code>は<strong>列と列の関係を数値でまとめて確認する</strong>メソッド</li>
<li>相関係数は-1〜1で、<strong>符号は向き、絶対値は直線的な関係の強さを見る手がかり</strong></li>
<li>相関行列では、同じ列同士の対角線より<strong>異なる列同士</strong>を見る</li>
<li>標準のPearsonを基本にし、必要に応じてSpearman・Kendallを検討する</li>
<li>文字列型や欠損値がある場合は、計算前にデータを確認する</li>
<li>相関係数だけでは点の散らばりや外れ値が見えないため、<strong>散布図も組み合わせる</strong></li>
<li>強い相関があっても、因果関係があるとは限らない</li>
</ul>
<p>初心者のうちは、<strong><code>describe()</code>で各列を確認 → <code>corr()</code>で列同士の関係を探す → scatterで形を確認</strong>という流れを覚えておくと、データ分析を一段進めやすくなります。</p>
<h2><span id="toc19">関連記事</span></h2>
<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方・基本操作をわかりやすく解説</a></li>
<li><a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味・include=&#8217;all&#8217;・info()との違いを解説</a></li>
<li><a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
<li><a href="https://pythondatalab.com/matplotlib-scatter-colormap-size/">Matplotlib scatter入門：色とサイズで散布図を可視化する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-isnull/">欠損値を可視化して攻略！Pandas isnullとヒートマップ活用術</a></li>
</ul>

</div>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc20"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1786266416385" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">pandas corr()とは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>corr()</code>は、DataFrameやSeriesの数値データについて相関係数を計算するためのメソッドです。DataFrameに使うと、複数の列同士の相関係数をまとめた相関行列を作れます。</p>

</div>
</div>
<div id="faq-question-1786266458063" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">相関係数が1、-1、0に近い場合はどういう意味ですか？</span></h3>
<div class="rank-math-answer ">

<p>1に近いほど強い正の相関、-1に近いほど強い負の相関を示します。0付近なら、少なくとも強い直線的な相関は見られません。ただし、0に近いからといって「あらゆる関係がない」とは断定できません。</p>

</div>
</div>
<div id="faq-question-1786266475868" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">corr()で文字列列がある場合はどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>まず<code>dtypes</code>で型を確認してください。数値に見える文字列は必要に応じて<code>to_numeric()</code>で数値型へ変換します。分析対象を数値列に限定したい場合は、<code>select_dtypes(include="number")</code>で選択してから<code>corr()</code>を使う方法が分かりやすいです。<code>numeric_only=True</code>を指定する方法もあります。</p>

</div>
</div>
<div id="faq-question-1786266491723" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">corr()でNaNが出るのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>すべて同じ値の列など、相関係数を計算できない場合は<code>NaN</code>になることがあります。欠損値が多く、2列の組み合わせで利用できるデータが十分にないケースにも注意してください。</p>

</div>
</div>
<div id="faq-question-1786266505481" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">PearsonとSpearmanはどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>通常の数値について直線的な関係を見るなら、まず標準のPearsonが基本です。値そのものより順位関係・単調な関係を重視したい場合にはSpearmanが候補になります。Kendallも順位にもとづく方法ですが、この記事では統計理論の詳細には深入りしません。</p>

</div>
</div>
<div id="faq-question-1786266521159" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">DataFrame.corr()とSeries.corr()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>DataFrame.corr()</code>は複数列の組み合わせをまとめて相関行列にします。2つのSeriesだけの相関係数が欲しい場合は、たとえば<code>df["広告費"].corr(df["売上"])</code>のように<code>Series.corr()</code>を使えます。複数列を探索するならDataFrame、特定の2列だけならSeriesと考えると分かりやすいです。</p>

</div>
</div>
<div id="faq-question-1786266532063" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">corr()と散布図はどちらを使えばよいですか？</span></h3>
<div class="rank-math-answer ">

<p>どちらか一方ではなく、組み合わせるのがおすすめです。まず<code>corr()</code>で複数列から気になる組み合わせを見つけ、次に散布図で点の散らばり・外れ値・曲線的な関係を確認します。</p>

</div>
</div>
<div id="faq-question-1786266544159" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">相関係数が高ければ因果関係があると言えますか？</span></h3>
<div class="rank-math-answer ">

<p>言えません。強い相関があっても、別の要因が両方に影響している可能性があります。<code>corr()</code>の結果だけから原因と結果を決めないようにしましょう。</p>

</div>
</div>
<div id="faq-question-1786266557379" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">pandasの相関行列はヒートマップにしたほうがよいですか？</span></h3>
<div class="rank-math-answer ">

<p>列数が少なければ、まず<code>corr()</code>の表を読めれば十分です。列数が多い場合はヒートマップで色分けすると全体を見やすくできますが、高度な装飾はこの記事の範囲外です。なお、通常の数値列の相関ヒートマップと、missingnoで見る欠損パターンの相関ヒートマップは目的が異なります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-corr/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</title>
		<link>https://pythondatalab.com/pandas-value-counts/</link>
					<comments>https://pythondatalab.com/pandas-value-counts/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 22 Mar 2026 11:07:30 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=1780</guid>

					<description><![CDATA[<p>pandasのvalue_counts()の使い方を初心者向けに解説。件数集計、割合表示（normalize=True）、欠損値の数え方（dropna=False）、並び替え、表記ゆれの確認、groupby().size()やcount()との違いまで実例付きでわかりやすく紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">

<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<div id="pandas-series-nav" class="pdl-series-nav" style="clear: both; overflow: auto; position: relative; width: 100%; max-width: 100%; box-sizing: border-box; border: 2px solid #4db6ac; background: #eafaf8; padding: 14px 18px; border-radius: 10px; margin: 1.5em 0; box-shadow: 0 3px 6px rgba(0,0,0,0.05); transition: box-shadow .3s ease;">
<p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
<p>このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。データの作成から結合・集計までを体系的に学べます。</p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">こんなことで困っていませんか？</a></li><li><a href="#toc2" tabindex="0">この記事でわかること</a></li><li><a href="#toc3" tabindex="0">value_counts() とは？</a></li><li><a href="#toc4" tabindex="0">サンプルデータの作成</a></li><li><a href="#toc5" tabindex="0">基本の使い方｜件数を数える</a></li><li><a href="#toc6" tabindex="0">割合を表示する方法｜normalize=True</a></li><li><a href="#toc7" tabindex="0">パーセント表示にする方法</a></li><li><a href="#toc8" tabindex="0">欠損値も数える方法｜dropna=False</a></li><li><a href="#toc9" tabindex="0">欠損値を含めた割合を表示する方法</a></li><li><a href="#toc10" tabindex="0">少ない順に並べたいとき｜ascending=True</a></li><li><a href="#toc11" tabindex="0">値順に並べたいとき｜sort_index()</a></li><li><a href="#toc12" tabindex="0">よく使う書き方まとめ【比較表】</a></li><li><a href="#toc13" tabindex="0">value_counts() の結果を表として扱う方法</a></li><li><a href="#toc14" tabindex="0">件数と割合をまとめて表示する方法</a></li><li><a href="#toc15" tabindex="0">value_counts() は表記ゆれの発見にも便利</a></li><li><a href="#toc16" tabindex="0">数値データにも使える</a></li><li><a href="#toc17" tabindex="0">value_counts() の結果はグラフ化にも使える</a></li><li><a href="#toc18" tabindex="0">value_counts() と groupby().size() と count() の違い</a><ol><li><a href="#toc19" tabindex="0">どう使い分ければよいか</a></li><li><a href="#toc20" tabindex="0">初心者向けの覚え方</a></li></ol></li><li><a href="#toc21" tabindex="0">よくある使い方の例</a></li><li><a href="#toc22" tabindex="0">大規模データでの考慮事項</a></li><li><a href="#toc23" tabindex="0">よくある間違い</a><ol><li><a href="#toc24" tabindex="0">NaN が表示されないのはおかしいと思ってしまう</a></li><li><a href="#toc25" tabindex="0">割合が 0〜1 の小数で返ってきて戸惑う</a></li><li><a href="#toc26" tabindex="0">表記ゆれに気づかず、そのまま集計してしまう</a></li></ol></li><li><a href="#toc27" tabindex="0">ワンポイント</a></li><li><a href="#toc28" tabindex="0">まとめ</a><ol><li><a href="#toc29" tabindex="0">関連記事</a></li><li><a href="#toc30" tabindex="0">value_counts() とは何ですか？</a></li><li><a href="#toc31" tabindex="0">割合を表示するにはどうすればよいですか？</a></li><li><a href="#toc32" tabindex="0">欠損値も数えられますか？</a></li><li><a href="#toc33" tabindex="0">groupby().size() との違いは何ですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">こんなことで困っていませんか？</span></h2>
<p>Pandasでデータ分析をしていると、次のような場面によく出会います。</p>
<ul>
<li>列の中に同じ値が何件あるか知りたい</li>
<li>件数だけでなく割合も見たい</li>
<li>欠損値（NaN）が何件あるか確認したい</li>
<li>groupby() と何が違うのかわからない</li>
<li>表記ゆれや入力ミスをすばやく見つけたい</li>
</ul>
<p>そんなときに便利なのが、value_counts() です。</p>
<p>value_counts() は、<strong>1列の中にある値ごとの出現回数を集計するためのメソッド</strong>です。Pandasでデータを読み込んだあとに、まず中身をざっくり把握したいときによく使います。</p>
<p>さらに、normalize=True を使えば割合も確認でき、dropna=False を使えば欠損値も含めて数えられます。そのため、単なる件数集計だけでなく、<strong>カテゴリの偏り確認、欠損値チェック、表記ゆれの発見</strong>にも役立ちます。</p>
<p>この記事では、Pandas初心者向けに value_counts() の基本から、割合表示、欠損値の数え方、表記ゆれの見つけ方、groupby().size() や count() との違いまで、実例つきでわかりやすく解説します。</p>

<p>▶️ value_countsの公式ドキュメントも参考にしてください：<br /><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.Series.value_counts.html" target="_blank">pandas.Series.value_counts Documentation</a></p>

<h2><span id="toc2">この記事でわかること</span></h2>
<ul>
<li>value_counts() の基本的な使い方がわかる</li>
<li>値ごとの<strong>件数</strong>を集計できる</li>
<li>値ごとの<strong>割合</strong>を表示できる</li>
<li><strong>欠損値（NaN）を含めて</strong>数えられる</li>
<li>表記ゆれやカテゴリの偏りを見つけられる</li>
<li>groupby().size() や count() との違いがわかる</li>
</ul>

<h2><span id="toc3">value_counts() とは？</span></h2>
<p>value_counts() は、<strong>Seriesの中にある値ごとの出現回数を数えるメソッド</strong>です。</p>
<p>たとえば、会員ランクの列があるときに value_counts() を使うと、Gold が何件、Silver が何件、Bronze が何件あるかをすぐに集計できます。</p>
<p>基本構文は次のとおりです。</p>
<p>df[&#8220;列名&#8221;].value_counts()
まずは、<strong>「1列の値の出現回数を数える」</strong>と覚えておけば大丈夫です。</p>

<h2><span id="toc4">サンプルデータの作成</span></h2>
<p>今回は、少し実務に近いサンプルデータを使って説明します。</p>

<pre class="language-python"><code class="language-python">import pandas as pd
import numpy as np

df = pd.DataFrame({
    &quot;member_rank&quot;: [&quot;Gold&quot;, &quot;Silver&quot;, &quot;Gold&quot;, &quot;Bronze&quot;, np.nan, &quot;Silver&quot;, &quot;Gold&quot;, &quot;bronze&quot;, &quot; Silver &quot;],
    &quot;city&quot;: [&quot;Tokyo&quot;, &quot;Osaka&quot;, &quot;Tokyo&quot;, &quot;Nagoya&quot;, &quot;Tokyo&quot;, &quot;osaka&quot;, &quot;Tokyo &quot;, &quot;Nagoya&quot;, np.nan],
    &quot;rating&quot;: [5, 4, 5, 3, 4, 4, 5, 3, 4]
})

print(df)</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>city</th><th>rating</th></tr></thead><tbody><tr><td>Gold</td><td>Tokyo</td><td>5</td></tr><tr><td>Silver</td><td>Osaka</td><td>4</td></tr><tr><td>Gold</td><td>Tokyo</td><td>5</td></tr><tr><td>Bronze</td><td>Nagoya</td><td>3</td></tr><tr><td>NaN</td><td>Tokyo</td><td>4</td></tr><tr><td>Silver</td><td>osaka</td><td>4</td></tr><tr><td>Gold</td><td>Tokyo</td><td>5</td></tr><tr><td>bronze</td><td>Nagoya</td><td>3</td></tr><tr><td>Silver</td><td>NaN</td><td>4</td></tr></tbody></table></figure></div>
<p>このデータからわかること</p>
<p>このデータには、member_rank のようなカテゴリ列、city のような文字列列、rating のような数値列が含まれています。さらに、NaN、大文字・小文字の違い、余分な空白も入っているため、value_counts() の基本だけでなく、実務でよくある問題も確認できます。</p>
<p>つまり、この1つのサンプルで、基本の件数集計、割合表示、欠損値の確認、表記ゆれの発見、数値データへの応用まで自然に学べるようになっています。</p>

<h2><span id="toc5">基本の使い方｜件数を数える</span></h2>
<p>まずは、もっとも基本的な使い方です。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts())</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th></tr></thead><tbody><tr><td>Gold</td><td>3</td></tr><tr><td>Silver</td><td>2</td></tr><tr><td>Bronze</td><td>1</td></tr><tr><td>bronze</td><td>1</td></tr><tr><td> Silver</td><td>1</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この結果を見ると、Gold が3件で最も多く、次に Silver が2件あることがわかります。</p>
<p>一方で、Bronze と bronze、Silver と &#8221; Silver &#8221; が別々に集計されています。これは、value_counts() が<strong>見た目ではなく、実際の値をそのまま集計する</strong>ためです。大文字・小文字の違いや前後の空白があると、別の値として数えられます。</p>
<p>また、この結果には NaN が表示されていません。これは、value_counts() がデフォルトでは欠損値を除外するためです。</p>
<p><strong>ポイント</strong></p>
<p>value_counts() は、<strong>件数の多い順</strong>に並びます
デフォルトでは NaN は数えません
空白や大文字・小文字の違いも、<strong>別の値として集計されます</strong></p>

<h2><span id="toc6">割合を表示する方法｜normalize=True</span></h2>
<p>件数だけでなく、全体に対する割合を見たいこともあります。その場合は normalize=True を指定します。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(normalize=True))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>proportion</th></tr></thead><tbody><tr><td>Gold</td><td>0.375</td></tr><tr><td>Silver</td><td>0.250</td></tr><tr><td>Bronze</td><td>0.125</td></tr><tr><td>bronze</td><td>0.125</td></tr><tr><td> Silver</td><td>0.125</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この結果では、Gold が全体の 37.5%、Silver が 25.0% を占めていることがわかります。</p>
<p>件数だけを見ると「Gold は3件」としかわかりませんが、割合を見ることで、<strong>全体の中でどれくらいの比率なのか</strong>を把握できます。</p>
<p>特に、データ件数が増えると、単純な件数だけでは比較しにくくなることがあります。そのため、カテゴリの偏りを確認したいときは、件数と割合の両方を見るのがおすすめです。</p>
<p><strong>ポイント</strong></p>
<p>0〜1 の小数で返ります
0.375 は <strong>37.5% を意味します
件数よりも、</strong>全体に対する比率を比較しやすくなります
見やすくしたい場合は round() を組み合わせます。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(normalize=True).round(3))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>proportion</th></tr></thead><tbody><tr><td>Gold</td><td>0.375</td></tr><tr><td>Silver</td><td>0.250</td></tr><tr><td>Bronze</td><td>0.125</td></tr><tr><td>bronze</td><td>0.125</td></tr><tr><td> Silver</td><td>0.125</td></tr></tbody></table></figure></div>
<h2><span id="toc7">パーセント表示にする方法</span></h2>
<p>割合をパーセントで表示したい場合は、100をかけます。</p>

<pre class="language-python"><code class="language-python">print((df[&quot;member_rank&quot;].value_counts(normalize=True) * 100).round(1))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>proportion</th></tr></thead><tbody><tr><td>Gold</td><td>37.5</td></tr><tr><td>Silver</td><td>25.0</td></tr><tr><td>Bronze</td><td>12.5</td></tr><tr><td>bronze</td><td>12.5</td></tr><tr><td> Silver</td><td>12.5</td></tr></tbody></table></figure></div>
<p>% をつけて表示したい場合は、次のように書けます。</p>

<pre class="language-python"><code class="language-python">rate = (df[&quot;member_rank&quot;].value_counts(normalize=True) * 100).round(1).astype(str) + &quot;%&quot;
print(rate)</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>proportion</th></tr></thead><tbody><tr><td>Gold</td><td>37.5%</td></tr><tr><td>Silver</td><td>25.0%</td></tr><tr><td>Bronze</td><td>12.5%</td></tr><tr><td>bronze</td><td>12.5%</td></tr><tr><td> Silver</td><td>12.5%</td></tr></tbody></table></figure></div>
<p>この結果からわかること</p>
<p>割合をパーセントで表示すると、結果がかなり直感的になります。特に、レポートやブログ記事など、人に見せる前提の場面では 0.375 より 37.5% のほうが伝わりやすいです。</p>
<p>分析途中では小数のままでも問題ありませんが、<strong>説明用の資料ではパーセント表示のほうが親切</strong>です。</p>

<h2><span id="toc8">欠損値も数える方法｜dropna=False</span></h2>
<p>value_counts() は、デフォルトでは <strong>NaN を集計しません</strong>。</p>
<p>NaN も含めて数えたい場合は、dropna=False を指定します。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(dropna=False))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th></tr></thead><tbody><tr><td>Gold</td><td>3</td></tr><tr><td>Silver</td><td>2</td></tr><tr><td>Bronze</td><td>1</td></tr><tr><td>NaN</td><td>1</td></tr><tr><td>bronze</td><td>1</td></tr><tr><td> Silver</td><td>1</td></tr></tbody></table></figure></div>
<p>この結果からわかること</p>
<p>今度は NaN が1件あることが表示されました。つまり、この member_rank 列には欠損値が1つ含まれていると確認できます。</p>
<p>基本の value_counts() だけを見ると、欠損値が存在しないように見えることがあります。ですが、dropna=False を使えば、<strong>欠損値も含めた本当の分布</strong>を見ることができます。</p>
<p><strong>ポイント</strong></p>
<ul>
<li>dropna=False をつけると、欠損値も件数に含まれます</li>
<li>データ品質の確認に便利です</li>
<li>前処理の前に、欠損値の有無をざっくり把握できます</li>
</ul>

<h2><span id="toc9">欠損値を含めた割合を表示する方法</span></h2>
<p>NaN も含めて割合を出したい場合は、normalize=True と dropna=False を組み合わせます。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(normalize=True, dropna=False).round(3))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>proportion</th></tr></thead><tbody><tr><td>Gold</td><td>0.333</td></tr><tr><td>Silver</td><td>0.222</td></tr><tr><td>Bronze</td><td>0.111</td></tr><tr><td>NaN</td><td>0.111</td></tr><tr><td>bronze</td><td>0.111</td></tr><tr><td> Silver</td><td>0.111</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この結果では、NaN が全体の約11.1%を占めていることがわかります。件数だけでなく割合でも確認できるため、<strong>欠損値の影響がどれくらい大きいか</strong>を判断しやすくなります。</p>
<p>たとえば、欠損値が1件だけなら大きな問題でないこともありますが、全体の3割、4割を占めるようなら、分析結果への影響は無視できません。割合で見ると、その重要度をより判断しやすくなります。</p>

<h2><span id="toc10">少ない順に並べたいとき｜ascending=True</span></h2>
<p>value_counts() はデフォルトで件数の多い順に並びます。少ない順にしたい場合は ascending=True を使います。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(dropna=False, ascending=True))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th></tr></thead><tbody><tr><td>NaN</td><td>1</td></tr><tr><td>Bronze</td><td>1</td></tr><tr><td> Silver</td><td>1</td></tr><tr><td>bronze</td><td>1</td></tr><tr><td>Silver</td><td>2</td></tr><tr><td>Gold</td><td>3</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>少ない順に並べると、件数の少ないカテゴリから確認できます。この例では、NaN、Bronze、bronze、&#8221; Silver &#8221; がいずれも1件ずつであることがすぐにわかります。</p>
<p>多数派だけでなく、<strong>少数派や例外的な値を見つけたいとき</strong>に便利です。入力ミスや珍しいカテゴリを探したいときは、降順より昇順のほうが見やすい場合があります。</p>

<h2><span id="toc11">値順に並べたいとき｜sort_index()</span></h2>
<p>value_counts() は件数順に並びます。値そのものの順番で見たいときは、sort_index() を組み合わせます。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;member_rank&quot;].value_counts(dropna=False).sort_index())</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th></tr></thead><tbody><tr><td> Silver</td><td>1</td></tr><tr><td>Bronze</td><td>1</td></tr><tr><td>Gold</td><td>3</td></tr><tr><td>Silver</td><td>2</td></tr><tr><td>bronze</td><td>1</td></tr><tr><td>NaN</td><td>1</td></tr></tbody></table></figure></div>
<p>この結果からわかること</p>
<p>件数順ではなく、値そのものの順番で並べたいときに便利です。ただし、空白つきの &#8221; Silver &#8221; が先頭に来ていることからもわかるように、<strong>余分な空白があると並び順にも影響する</strong>ことがあります。</p>
<p>ここでも、表記ゆれや前処理の重要性が見えてきます。</p>

<h2><span id="toc12">よく使う書き方まとめ【比較表】</span></h2>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>やりたいこと</th><th>書き方</th></tr></thead><tbody><tr><td>件数を数える</td><td>df[&#8220;列名&#8221;].value_counts()</td></tr><tr><td>割合を出す</td><td>df[&#8220;列名&#8221;].value_counts(normalize=True)</td></tr><tr><td>欠損値も含める</td><td>df[&#8220;列名&#8221;].value_counts(dropna=False)</td></tr><tr><td>欠損値込みで割合を出す</td><td>df[&#8220;列名&#8221;].value_counts(normalize=True, dropna=False)</td></tr><tr><td>少ない順に並べる</td><td>df[&#8220;列名&#8221;].value_counts(ascending=True)</td></tr><tr><td>値順に並べる</td><td>df[&#8220;列名&#8221;].value_counts().sort_index()</td></tr><tr><td>件数でソートしない</td><td>df[&#8220;列名&#8221;].value_counts(sort=False)</td></tr></tbody></table></figure></div>
この表の見方

<p>まずは次の3つを押さえておくと十分です。</p>
<ul>
<li>件数を数える</li>
<li>割合を出す</li>
<li>欠損値も含める</li>
</ul>
<p>そのうえで、並び順を変えたいときに ascending=True や sort_index() を使う、と覚えると整理しやすいです。
また、デフォルトの件数ソートが不要な場合は <code>sort=False</code> を使うこともできます。</p>

<h2><span id="toc13">value_counts() の結果を表として扱う方法</span></h2>
<p>value_counts() の結果は Series です。そのため、そのままでも使えますが、表として扱いやすくしたい場合は reset_index() を使います。</p>

<pre class="language-python"><code class="language-python">result = df[&quot;member_rank&quot;].value_counts(dropna=False).reset_index()
result.columns = [&quot;member_rank&quot;, &quot;count&quot;]
print(result)</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th></tr></thead><tbody><tr><td>Gold</td><td>3</td></tr><tr><td>Silver</td><td>2</td></tr><tr><td>Bronze</td><td>1</td></tr><tr><td>NaN</td><td>1</td></tr><tr><td>bronze</td><td>1</td></tr><tr><td>Silver</td><td>1</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>value_counts() の結果が、2列のDataFrameとして扱いやすい形になりました。これにより、あとで別の表と結合したり、CSVで保存したり、グラフ用データとして使ったりしやすくなります。</p>
<p>分析の途中ではSeriesのままでも十分ですが、<strong>あとで加工したいときはDataFrameにしておくと便利</strong>です。</p>

<h2><span id="toc14">件数と割合をまとめて表示する方法</span></h2>
<p>件数と割合を一緒に見たい場合は、次のように書けます。</p>

<pre class="language-python"><code class="language-python">counts = df[&quot;member_rank&quot;].value_counts(dropna=False)
rates = df[&quot;member_rank&quot;].value_counts(normalize=True, dropna=False) * 100

summary = pd.DataFrame({
    &quot;count&quot;: counts,
    &quot;rate(%)&quot;: rates.round(1)
})

print(summary)</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>member_rank</th><th>count</th><th>rate(%)</th></tr></thead><tbody><tr><td>Gold</td><td>3</td><td>33.3</td></tr><tr><td>Silver</td><td>2</td><td>22.2</td></tr><tr><td>Bronze</td><td>1</td><td>11.1</td></tr><tr><td>NaN</td><td>1</td><td>11.1</td></tr><tr><td>bronze</td><td>1</td><td>11.1</td></tr><tr><td>Silver</td><td>1</td><td>11.1</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この表では、各カテゴリについて「何件あるか」と「全体の何%か」を同時に確認できます。たとえば、Gold は3件で 33.3%、Silver は2件で 22.2%、NaN は 11.1% です。</p>
<p>このように件数と割合をまとめて見ると、<strong>分布の全体像を一目で把握しやすくなります</strong>。ブログや資料に載せるときにも、この形式は非常に使いやすいです。</p>

<h2><span id="toc15">value_counts() は表記ゆれの発見にも便利</span></h2>
<p>value_counts() は、データクリーニングの入口としても便利です。</p>
<p>たとえば city 列を見てみます。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;city&quot;].value_counts(dropna=False))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>city</th><th>count</th></tr></thead><tbody><tr><td>Tokyo</td><td>3</td></tr><tr><td>Nagoya</td><td>2</td></tr><tr><td>Osaka</td><td>1</td></tr><tr><td>osaka</td><td>1</td></tr><tr><td>Tokyo</td><td>1</td></tr><tr><td>NaN</td><td>1</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この結果では、Tokyo が3件、Nagoya が2件となっていますが、同時に Osaka と osaka、Tokyo と Tokyo が別々に存在していることもわかります。</p>
<p>つまり、<strong>同じ意味の値が表記の違いによって分かれてしまっている</strong>状態です。このまま集計を進めると、本来まとめるべきカテゴリが分散し、正しい分布を把握しにくくなります。</p>
<p>このようなときは、文字列をそろえてから再集計します。</p>

<pre class="language-python"><code class="language-python">df[&quot;city_cleaned&quot;] = df[&quot;city&quot;].str.strip().str.lower()
print(df[&quot;city_cleaned&quot;].value_counts(dropna=False))</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>city_cleaned</th><th>count</th></tr></thead><tbody><tr><td>tokyo</td><td>4</td></tr><tr><td>osaka</td><td>2</td></tr><tr><td>nagoya</td><td>2</td></tr><tr><td>NaN</td><td>1</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>クリーニング後は、Tokyo と Tokyo が tokyo に統一され、Osaka と osaka も osaka にまとまりました。その結果、都市ごとの実際の件数がかなりわかりやすくなっています。</p>
<p>このように、value_counts() は単なる件数集計だけでなく、<strong>前処理の前後でデータが整ったかを確認する道具</strong>としても使えます。</p>
<p><strong>ポイント</strong></p>
<ul>
<li>表記ゆれや入力ミスの発見に向いています</li>
<li>前処理の前後で比較すると、クリーニングの効果を確認しやすいです</li>
</ul>

<h2><span id="toc16">数値データにも使える</span></h2>
<p>value_counts() は文字列だけでなく、数値データにも使えます。</p>
<p>たとえば rating 列の件数を見てみます。</p>

<pre class="language-python"><code class="language-python">print(df[&quot;rating&quot;].value_counts())</code></pre>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>rating</th><th>count</th></tr></thead><tbody><tr><td>4</td><td>4</td></tr><tr><td>5</td><td>3</td></tr><tr><td>3</td><td>2</td></tr></tbody></table></figure></div>
<p><strong>この結果からわかること</strong></p>
<p>この結果では、評価4が4件で最も多く、次に評価5が3件、評価3が2件あるとわかります。つまり、このデータでは極端に偏った分布ではなく、中間的な評価がやや多い傾向が見えます。</p>
<p>アンケートの回答、テストの点数、レビュー評価などでも同じように使えます。</p>

<h2><span id="toc17">value_counts() の結果はグラフ化にも使える</span></h2>
<p>value_counts() の結果はSeriesなので、そのまま棒グラフに使えます。</p>

<pre class="language-python"><code class="language-python">import matplotlib.pyplot as plt

!pip install japanize-matplotlib &gt; /dev/null # Google Colab の機能を使って日本語フォントをインストール・インポート
import japanize_matplotlib

df[&quot;member_rank&quot;].value_counts(dropna=False).plot(kind=&quot;bar&quot;)
plt.xlabel(&quot;member_rank&quot;)
plt.ylabel(&quot;count&quot;)
plt.title(&quot;member_rank の件数集計&quot;)
plt.show()</code></pre>
<figure class="image-block"><img decoding="async" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjUAAAHlCAYAAAANww0qAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQr9JREFUeJzt3Xt8z/X///H7ezNzPo+2vXdA5rSaFJUQK6eMdJCERuozIoRPDkV0UurjUDqoyGHyyRKVs5qiJEqSQykZe29sfGIj9p5tr98fft7f3m3D5m2vvV/drpfL63LZ6/l6vl7vx/uV7O71ej5fL5thGIYAAAC8nI/ZBQAAAHgCoQYAAFgCoQYAAFgCoQYAAFgCoQYAAFgCoQYAAFgCoQYAAFgCoQYASkhSUpJOnz5tdhmAZRFqAMDDbr/9dq1evTpfe+vWrZWYmFjofikpKdqzZ48kyWaz6ciRI/rqq6/0ww8/SJLWrFmjmJiYS6rhX//6lz744APX+vvvv69BgwZddD/DMHTq1Cm35c8//8zXr127dvrss88uqRagpBBqAItLSkqSzWbTF198YXYpJeKLL76QzWZTUlKSR46XmZmp1NRUZWVlXVJ/h8Ohzz//XCEhIZKkgQMHatOmTZe077vvvqu+ffu6tY0YMUIbN26UJO3cuVNnzpy56HH279+v+fPn68Ybb3S1zZw5Uw0bNrzovmlpaapcubLbUqdOnXz9kpKSdOrUqYseDyhJhBoA+Jvdu3crNjZWtWvXVtWqVWW321WpUiXddNNNio+P14XeLrNq1SqFh4crMjJSZ8+eVXx8vCpXrnxJn/vYY4/p559/1i+//CJJ2rFjh44dO6Z//etfkqRdu3YpIiJCWVlZbsvf6xk3bpxyc3PVqFEjlStXTuXKldPWrVs1btw41/r55frrr3ftl5eXp3Llyun48eNui8Ph0IkTJy74vYHSgFADAH/x8ssvq1mzZipXrpyWL1+uW2+9VaNHj1ZSUpLuv/9+DRs2TPfee2+hV24WLFigXr16SZI2b94sX19fBQQE6MiRI8rLy9OJEyd05MgRHTlyRMeOHXPt980332jq1Knq37+/3nvvPUnSypUrdeedd2ry5MlKS0vT5s2b9dZbb6l8+fJuy/fff+86zvLly5WQkKDRo0e7BR/p3NWVvweiv+576NAhVa9evdAlIyPD4+cb8CRCDQD8f6+88oqef/55JSYmavbs2WrVqpUOHTqk8PBw2e12jRgxQj/88IM2b96sUaNG5dv/l19+0ddff63bb79dkvTpp5/qzJkzstvtCgwM1OHDh9WvXz8FBgYqMDBQN910k2vfChUq6KqrrlJERIRWrFghSSpfvrzq1q2rq666Smlpadq/f7++++47HT16VPHx8WrQoIGOHj2qZs2aSTp3e2rgwIFq0KCB3nzzTYWHh7sWSWrRooVbW9OmTd3qDw8Pl2EYhS7VqlXz/EkHPIhQA3jIpEmTZLfb9eWXX6pp06aqUKGCYmJidOLECa1fv15NmjRRuXLl1KlTJ6Wmprrte+rUKQ0bNkyBgYGqXLmybr75Zq1Zs8atT//+/dW6dWt9+OGHqlu3ripVqqTY2FhlZ2fr/fffV926dVWhQgX16tVLJ0+ezFef0+nUE088odq1a6tSpUrq0aNHgeNOXnvtNUVERKh8+fJq0qSJZs6cqdzcXNf2efPmyWazKS8vT0OGDFGVKlUuefxKu3bt1L9/f/3666+66aabXL/8pXMB4IYbblCFChUUERGhWbNmue17/nPT09M1YMAAVa9eXbVr19bgwYMvOM7E6XTq5ptvVoMGDZSenl5ovz179mjcuHFasmSJ2rRpI+ncf5eDBw+qcePGrn5hYWGaPn263nrrLTkcDrdjTJkyRZJUpkwZnT17VgsXLlRCQoIrFAQHB+vTTz91rf/222+ufaOiojRixAidOXNG9erVkyQtXrxYhw8f1kMPPaQvv/xS/v7+uu6661SrVi1lZGQoJCREtWrVUpkyZSSdu301YsQItW3bVoMHD1ZSUpJrkaRt27a5te3evTvfeUhPT1e1atXcFrvdLofDob59+7qWY8eOacaMGa71N998s9BzC5QYA4BHPP3000bVqlWNiIgIY+nSpcYnn3xiVK1a1ejWrZsRFhZmLF261Fi9erVx1VVXGd27d3ftd/bsWaNNmzZGs2bNjI8//tjYtm2b8eSTTxo+Pj7GkiVLXP1iY2ONoKAgo1GjRsa6deuMBQsWGGXKlDF69uxpREREGOvWrTOWLFliVKxY0Rg2bJhrvwMHDhiSjIYNGxp33nmn8eWXXxpLly41wsLCjJCQEOPYsWOuvuPGjTMCAgKMt99+2/j++++Nd955x6hevboxZMgQV5/33nvPkGS89NJLxtChQ41t27Zd8jm69dZbjX79+hm33HKL8f777xsHDx40DMMwli1bZthsNmPEiBHGd999Z0ydOtWw2WxGQkJCvs9t1qyZMXbsWGPr1q3Gq6++athsNuP555939duwYYMhyThw4IBhGIbRt29fIygoyLVemAEDBhhdunRxa/vyyy8Nm81mnDhxwq09KyvL8PHxMebOnetq++WXXww/Pz/DZrMZGzZsMGbPnm0EBQUZ2dnZrj7BwcHGp59+WuDnHzx40Ojevbtx/fXXGydPnjQkGXv37jX69Olj9OvXz2jRooUhydi6dathGIbx2GOPGYMGDXI7xvn/lgMHDjQqV65sBAcHuxZJRmBgoFtbRETEBc/JX504ccJYuHCha6lVq5YxYsQI1/rXX399yccCrhRCDeAhTz/9tCHJWL58uavtoYceMiQZn3zyiVs/Hx8f1y+7hQsXGpUrVzb++OMPt+MNHjzYaNy4sWs9NjbWkGT88MMPrrbo6GhDkvHjjz+69bPb7a7186EmJibG7fi7d+82fHx8jAkTJhiGYRhJSUmGr6+vsX79erd+H3zwgeHj42OkpqYahvF/4eKBBx4o0vkxjHOhpnbt2kZ8fLxb+9atW42nnnrKra1Lly5un3H+cwcPHuzWr3Xr1kbr1q1d638NNS+88IJRvXp146effrpobXa73Xj77bfd2saNG2c0b968wP4BAQHGCy+84Fpv37698dBDDxn+/v7Ghg0bjIEDBxrvvPOO2z4XCjWLFy82+vXrZ/z555/Gjh07jGrVqrlCyoYNGwwfHx+jW7duxnPPPef63rNnzy7wWAMHDjTGjBnj1ibJOHz48AXOwDmHDx82JLktFStWzNcvLCzMWLZs2UWPB5SkMiV7XQiwvi5durh+Dg4OliTdcccdrrbQ0FDl5eUpLS1Ndrtda9as0cmTJxUQEOB2HMMwlJeXJ6fTKX9/f0lSYGCga/zE+ePb7XZde+21bsc/fPhwvroGDx7stt6kSRPddNNN+uyzz/TMM89o/fr1ys3NVefOnfPtm5eXp507dyowMNDVdn4wbFHl5eXp/vvvd2tr0aKFWrRoka++vw5iPW/IkCFu63Xr1tXmzZvz9Vu+fLmeeuopbdiwQZGRkRet6/DhwwoNDXVr++ijjwr8nrm5ucrMzHTNajp58qTS0tK0dOlSLVq0SJL03HPPyel0ut2iys3N1f/+9z+3tgoVKqhGjRq6//77Xedl/PjxmjRpkmrWrClJatu2rd599101aNBADz30kIYNG6atW7dq3rx5BX4XPz8/zZgxQzNmzJAk16yl82Nr/m779u1q0qSJJKlOnTo6fvy423abzVbgfkBpQ6gBPKxs2bKun318zg1b8/X1zdeWk5Mj6dxzQRo1aqSEhIQCj+fn51fgsc8f66/HPt/21zEw51WoUCFfm91udz3YLS0tTZL01VdfqVKlSvn6hoWFua3/fZDppWrUqFG+mtPS0jRlyhStX79eycnJOnPmjHJzc9W2bdt8+1esWNFt3cfHx3Uu/+rpp59WtWrVlJiYWOBxCjru0aNHXeuJiYnat2+fYmNj8/X98ssv5XQ61bx5c0lS5cqV9e2337qdt7Fjx2r+/Pn59u3fv7/b+j333KMPP/xQU6dO1fjx411hdu3atRo1apRyc3Pl6+uruXPnqlWrVvL19VVsbKwaNGig+vXrF/hd3nzzTbcxLklJSapbt66OHTtW4H/bvyuoj2EYhBuUegwUBkxWs2ZNHTlyRI0bN1ZkZGS+5XwIulwFBR2Hw6EaNWq46pDOhaiC6vj7s1b+Hkwu1d/3y8vLU/v27RUfH68BAwZoxYoV+v777xUXF1es45+3YMECvfrqq3r++ee1devWi/Zv3bq11q9fL+ncL/BJkybpzjvvdA3aPS8rK0tjxoxR48aNdfPNN7va/x4E5s2bl2/20N8HChuGoQ8//FCS9MQTTygnJ0e9evXSuHHjlJOTo9WrV6thw4bKycnRgw8+KB8fHz3zzDNatmyZHnnkkXzfISYmRjabLd9St25dSefCV0Hb27Vr5zrGzJkz5efnl29Zu3btpZ14wESEGsBknTp10okTJzRnzhy39j179mjw4MEee+DZJ5984ra+b98+fffdd7rtttskSR06dJCPj4/+85//uPU7c+aMa7bLlXDs2DHt3btX48eP1+jRo9W2bVtde+21OnjwYIFB7FJFRUWpT58+6tSpk/r27XvRdy6NHDlSixYt0uLFizVmzBh99913evHFF9367Nu3T7fffrt27dqluXPnevzKxebNm7V48WKFhIQoOztb7777ru677z63PgcPHpQkrVixQk6n023bihUr3AJTTk6ORo8erWuuuUbSudtYsbGxOnbsmFu/vz9tumvXrm7bC7siBJQ2hBrAZH379tUtt9yioUOH6vnnn9e2bdu0ePFidezYUb6+vh77xbl8+XLFxcVpy5YtWrFihXr06KHatWvr8ccflyTVr19fo0eP1uLFixUbG6uNGzdq/fr1uv3227Vnzx5VqVLFI3X8Xe3atdWgQQMtWrRIGzdu1KZNmxQbG6ukpCT98ccfl338t956S2lpaQU+V+avbrvtNj377LPq06eP3njjDcXHx6thw4ZKSkrS9OnT1blzZzVp0kRpaWlKTEx0e8aMp9xwww16//33tWjRIgUHB2vp0qVut7/WrFmjCRMmKCEhQUlJSerVq1ehYS0xMVHXX3+90tLSXLc2P/nkE9WvX1+NGzfW2LFj9fvvv3v8OwBmItQAJjt/aX/EiBGaPXu2WrdurYkTJ2rEiBF67bXXPPIZPj4++vbbbyWd+1f4/fffr4iICG3atEm1atVy9XvppZf01ltvafv27erQoYMefPBBXXvttdqwYUO+8Tye9Mknn6hGjRq644471Lt3b9WtW1dLlizRvn378g1aLSq73a6pU6fqrbfe0qpVqy7Yd9y4cUpLS9Phw4d19913Szo3FunNN99U2bJlNX/+fO3evdvttpMnlS1bVtHR0YqMjJSvr69uueUWNW/eXB9//LGmTZumO++8UzNnztS9996rNWvWaOvWrWrRooXrJZgHDx7Ua6+9puuuu06PPfaYnnnmGS1YsMA10NzX11cTJkzQ1q1bdeLECV1zzTW6+eabNX36dLc6Vq5c6XZ7av/+/Vfk+wIeV5JTrQDA6s5P6S7IhaZ0Hzt2zLj55puN8uXLG3379jXS09MNwzCMJUuWGPHx8Ub58uWNRYsWue1z4MABIyoqyjVlfdiwYUavXr2MTz/91MjLy3PrJ8k4efKk2/4nTpww5s6da3z++eeutunTpxtdunQxzpw541rq1atnrF692m1fpnSjNLIZBm8oA3B5Bg4cWOBMn/PuvPNOLV26tAQr8k6JiYm67rrrVL169XzbDh06lG/KuXRuoLWnBpNL5wZCZ2dnX/R24/Hjx1WxYsUregUPKCpCDYDLlpKScsHbRFWqVCnwFzIAeBKhBgAAWAIDhQEAgCUQagAAgCUQagAAgCX8o979lJeXp9TUVNejwgEAQOlnGIZOnjypoKCgC872+0eFmtTUVIWEhJhdBgAAKIbk5GTZ7fZCt/+jQs35F/IlJydfsUe+AwAAz8rMzFRISEi+F+v+3T8q1Jy/5VSlShVCDQAAXuZiQ0cYKAwAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACyBUAMAACzBtFCTmZmpRx99VGFhYQoJCVHz5s310UcfFdo/JSVFvXr1Unh4uIKDgzVy5EhlZ2eXYMUAAKA0My3U9OrVS6dPn9bu3buVnJysV155Rf369dPWrVvz9c3OzlaHDh0UGhqq/fv3a/fu3dq+fbtGjhxpQuUAAKA0shmGYZjxwceOHVPlypXl7+/vaouKilL//v31+OOPu/VdtGiRhg8frsOHD8vPz0+StH37drVq1UoOh0O1atW6pM/MzMxU1apVlZGRwQstAQDwEpf6+9u0KzW1atVyBZqsrCzNnj1bP//8s9q0aZOvb2Jiojp27OgKNJLUvHlz1ahRQ4mJiSVWMwAAKL3KmF1ASEiIUlJSFBUVpQ8//FA33HBDvj4pKSmKjIzM1x4cHKyUlJRCj+10OuV0Ol3rmZmZnikaAACUOqaHmuTkZJ04cULTpk3T/PnzFR0drYoVK7r18fPzk49P/otKNptNF7p7NmXKFE2ePNnjNf9V+NiVV/T4npL0YlezSwAA4IoqFVO6q1WrpmeeeUapqamaNWtWvu12u12pqan52lNTUxUcHFzocceNG6eMjAzXkpyc7NG6AQBA6WFKqMnLy9OKFSvytdeqVUuHDx/O196pUyetX79eOTk5rrbdu3fr6NGjio6OLvRz/P39VaVKFbcFAABYkymh5ujRo3r44Yc1efJk15iXtWvXau3ateraNf9tkpiYGAUEBGjChAnKzc1VRkaGHnvsMQ0YMEABAQElXT4AACiFTAk1derU0ZYtW7R3717Vq1dPQUFBGjt2rObNm6cOHTrI4XDIbrcrISFBklSmTBmtWbNGe/bsUUhIiJo2baqoqCjNnDnTjPIBAEApZNpzasxwJZ5Tw0BhAACurFL/nBoAAABPItQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLINQAAABLMDXUzJkzR02bNlVwcLAaN26st99++4L9u3fvrpo1a8put7uWNm3alFC1AACgNCtj1gcvXLhQkyZN0po1a9S0aVPt3btX7du3V+XKldW7d+8C93E4HIqPj1eXLl1KuFoAAFDamXalZsuWLZo6daqaNm0qSWrcuLH69OmjhISEQvdJSUlRSEhISZUIAAC8iGlXal5//fV8bT/99JOCgoIK7J+dna2jR48qNDT0SpcGAAC8UKkYKHz27Fk99thj+uabbzR69OgC+6SmpqpcuXKaPXu2rrvuOtWrV099+vTRoUOHCj2u0+lUZmam2wIAAKzJ9FBz6NAhtWnTRp9//rm++uorRUZGFtgvIyNDAQEBCgwM1ObNm/XTTz+pVq1aio6O1p9//lngPlOmTFHVqlVdC7euAACwLpthGIZZH/7999/rjjvuUL9+/fT888/L39+/SPvn5uaqatWq+vDDD9W5c+d8251Op5xOp2s9MzNTISEhysjIUJUqVS67fkkKH7vSI8e50pJe7Gp2CQAAFEtmZqaqVq160d/fpo2pOXTokO644w7NmjVLPXv2vKR98vLy5OPzfxeXDMNQXl6ebDZbgf39/f2LHJQAAIB3Mu3206BBg/Too49ecqDZvHmzGjZsqG3btkmSsrKyNHz4cNntdrVr1+4KVgoAALyBaaFm9erVeuONN9wepHd+kc49k8Zut7umeLdq1UpPPfWU4uLiXP1SU1O1bt06rsYAAADzbj9dbCiP3W6Xw+Fwa4uNjVVsbOyVLAsAAHgp02c/AQAAeAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWAKhBgAAWIKpoWbOnDlq2rSpgoOD1bhxY7399tsX7J+SkqJevXopPDxcwcHBGjlypLKzs0uoWgAAUJqZFmoWLlyoSZMmacmSJUpJSdFHH32kiRMnavHixQX2z87OVocOHRQaGqr9+/dr9+7d2r59u0aOHFnClQMAgNLItFCzZcsWTZ06VU2bNpUkNW7cWH369FFCQkKB/RMSEpSenq4XXnhBvr6+qlatmqZNm6Z3331Xx44dK8nSAQBAKVTGrA9+/fXX87X99NNPCgoKKrB/YmKiOnbsKD8/P1db8+bNVaNGDSUmJuq+++7Lt4/T6ZTT6XStZ2ZmeqByAABQGpkWav7q7NmzGjlypL755ht98803BfZJSUlRZGRkvvbg4GClpKQUuM+UKVM0efJkj9aKKyd87EqzS7iopBe7ml0CAKAQps9+OnTokNq0aaPPP/9cX331VYHBRZL8/Pzk45O/XJvNJsMwCtxn3LhxysjIcC3JyckerR0AAJQepoaa77//Xi1atFDr1q31ww8/KCoqqtC+drtdqamp+dpTU1MVHBxc4D7+/v6qUqWK2wIAAKzJtFBz6NAh3XHHHZo1a5ZeeeUV+fv7X7B/p06dtH79euXk5Ljadu/eraNHjyo6OvpKlwsAAEo500LNoEGD9Oijj6pnz56X1D8mJkYBAQGaMGGCcnNzlZGRoccee0wDBgxQQEDAFa4WAACUdqaFmtWrV+uNN96Q3W7Pt0iSw+GQ3W53TfEuU6aM1qxZoz179igkJERNmzZVVFSUZs6cadZXAAAApYhps58KG9x7nt1ul8PhyNf28ccfX8myAACAlzJ99hMAAIAnEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlEGoAAIAlFCvUZGVlFdienZ19WcUAAAAUV7FCTURERL62EydO6LbbbrvsggAAAIqjTFE6JycnyzAM5eTkuH4+Ly0tTb/88ovHCwQAALgURQo1Dz/8sNavXy+bzaawsDC3bRUqVNCwYcM8WhwAAMClKlKoWbt2rSQpMjJSu3btuiIFAQAAFEexxtQQaAAAQGlTpCs1f7Vq1Srt2rUr30yoiRMnXnZRAAAARVWsUPPoo49q4cKFuvbaa1W2bFlXu81mI9QAAABTFCvULF26VHv27FFISIin6wEAACiWYo2pqVq1KoEGAACUKsUKNbGxsXr22Wc9XQsAAECxFev2065du/TJJ59o0aJFCgoKctuWmJjokcIAAACKolihplGjRmrUqJGnawEAACi2YoWap59+2tN1AAAAXJZijakBAAAobYp1pcbHx0c2m63Abbm5uZdVEAAAQHEUK9Rs2LDBbT0pKUlTpkzR1KlTPVIUAABAURUr1Nx666351lu1aqXBgwere/fuHikMAACgKDw2pqZBgwbau3evpw4HAABQJMW6UrNx40a39bNnz2rVqlW66qqrPFIUAABAURUr1LRr185t3d/fX82aNdPcuXM9URMAAECRFev2U15entty5swZffPNN4qKiirSMbZs2aJRo0apRo0amjdv3gX7d+/eXTVr1pTdbnctbdq0KU75AADAgop1pea83NxcHT16VLVq1VKZMkU71HvvvafZs2erY8eO8vX1vWh/h8Oh+Ph4denSpbjlAgAACyvWlRrDMDRx4kRVq1ZNwcHBqlatmsaNGyfDMC75GAMHDtTWrVv13HPPqWLFihftn5KSwpvBAQBAoYoVat544w198MEHWrBggXbt2qUFCxZo+fLlevXVVz1dnyQpOztbR48eVWho6BU5PgAA8H7FCjVvvvmm1q5dq7vuukuNGzfW3XffrdWrV+vtt9/2dH2SpNTUVJUrV06zZ8/Wddddp3r16qlPnz46dOjQBfdzOp3KzMx0WwAAgDUVK9RkZmYqPDzcrS08PFwnT570RE35ZGRkKCAgQIGBgdq8ebN++ukn1apVS9HR0frzzz8L3W/KlCmqWrWqa+H2FQAA1lWsUBMUFKQvvvjCre3LL79UnTp1PFFTPlFRUTp48KD69u2r8uXLq2LFipo2bZqOHDmiTZs2FbrfuHHjlJGR4VqSk5OvSH0AAMB8xZr99Oyzz6pr16565JFH1KhRI+3bt0/vvPOOEhISPF2fS15ennx8/i+DGYahvLy8Ql+sKZ17fo6/v/8VqwkAAJQexbpS06FDBy1btkx79uzRtGnTtHPnTn3wwQfq3Lmzp+uTJG3evFkNGzbUtm3bJElZWVkaPny47HZ7vgcBAgCAf6ZihZq0tDTFx8drzZo12rdvn1avXq0XX3xRBw8e9EhRDodDdrvddeWnVatWeuqppxQXF+d68F5qaqrWrVvHlRgAACCpmLefhg4dqvr167tu/fj5+al///4aOnSoPv300yIfLykpyW3dbrfL4XC4tcXGxio2NrY45QIAgH+AYl2p2bJli1544QW38SwPPfSQfvzxR48VBgAAUBTFCjU+Pj5yOp1ubVdqOjcAAMClKFaouf3229W3b1/98ccfkqTjx4+rf//+V2ygMAAAwMUUK9S88sorcjgcql27tq666ioFBAQoJSVFU6dO9XR9AAAAl6RYA4WrV6+ub7/9Vl999ZUOHTqksLAw3XLLLZ6uDQAA4JIVK9Sc17p1a0/VAQAAcFmKdfsJAACgtCHUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASyDUAAAASzAt1OTl5WnLli0aNWqUatSooXnz5l2wf0pKinr16qXw8HAFBwdr5MiRys7OLpliAQBAqWdaqHnvvfc0bNgwlS9fXr6+vhfsm52drQ4dOig0NFT79+/X7t27tX37do0cObKEqgUAAKWdaaFm4MCB2rp1q5577jlVrFjxgn0TEhKUnp6uF154Qb6+vqpWrZqmTZumd999V8eOHSuhigEAQGnmFWNqEhMT1bFjR/n5+bnamjdvrho1aigxMdHEygAAQGlRxuwCLkVKSooiIyPztQcHByslJaXQ/ZxOp5xO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XTt169Yt322oW2+91aSqvFNoaKhmzJihbt26yc/Pz+xyvFadOnX03XffKSQkxOxSLOHMmTNatmyZ4uPjtXfvXj388MN68sknzS7rshBqSom1a9fqP//5jw4ePKjQ0FCNGDGCacjFUL16dfXv31+PPvqoGjRoYHY5Xu2vT2fG5eFWsmdERERo3759ZpdhKdu3b9eCBQv03//+V9ddd51Wr15tdkmXhX++migjI8P1F12nTp3UoEEDtWrVikf6X4bU1FRNnz6dQOMBjRo1UlJSktllWEL79u21bt06s8vwerGxsXr22WfNLsPrHT9+XK+99pqaNWumDh06yNfXV1999ZXXBxqJMTWmOXr0qG688UbFxsa6nnb70UcfafDgwTIMQ88995wiIyN1yy23mFxp6ffMM89cUr+JEyde4UqsZdiwYYqJidFTTz2loKAgt20Mbi2apk2b6v7771fPnj3zTePmz+Wl27Vrlz755BMtWrQo359J3nZ+6QIDA9WkSRMNHTpUffr0KfAdb96K208mGTRokHx9ffX666+72s6/VVqS1q1b5xpXgwtr3779RfvYbDb+0iuiwsYhMbi16Ar7M8qfy6KZPHlyodt4Fcql27x5s1q1amV2GVcEocYk9erV048//qjKlSu72h5++GG9++67ks49+KxBgwb67bffzCoRAGARGzduvKR+3n4VllBjkpCQECUnJ192HwD4J3E6nVq2bJmSkpIUFhamHj16WOr2yZVyKTNArXAVljE1JilXrpxSUlIKfUz677//bomXi5WEXr166YMPPpAkPfTQQ4X2mzt3bkmVZBlz587V1KlTlZSUpNDQUI0aNUpxcXFml4V/qPT0dLVu3VrHjx9XvXr19Pvvv+upp57SV199pcDAQLPLK9Xy8vLMLqFEMPvJJOdfHnbmzJl825xOpwYPHqxevXqZUJn3sdvtrp8Nwyh0QdEsWbJEY8eOVVxcnJYtW6ZBgwZp4sSJev/9980uDf9QY8aMUYcOHZSamqpvv/1WqampuuOOO/Tvf//b7NJQSnD7ySRnzpxRu3bt5HA4NGTIEDVu3Fi+vr7avXu33nzzTdWuXVsbN27kas0lOn36dL5ztX37djkcDrVq1Uq1atUyqTLv1bx5c7333nuKiopyte3cuVMPPvigduzYYV5h+MeqV6+e9u3bpzJl/u8mw9mzZxUREeGaZIGCzZgxQyNGjJAkLViwoNB+Dz74YAlVdGUQakx05swZTZ48WfPmzVN6erokqUaNGurXr5+effZZVapUyeQKvcO2bdt077336ueff3bdW3/yySf14osvqlq1apLOPRa8RYsWJlbpfXgnGUqb8PBw7d+/X76+vq62nJwc1a9fXwcPHjSxstKvVatW2rx5s6RzM20LYrPZ9Pvvv5dkWR5HqCkljh07JsMwVKtWLdlsNrPL8SodO3ZUv3791K9fP0nSd999p5YtW2rx4sXq1auX4uPjNWfOHG3YsMHkSr1LVFSU4uPjdc0117jafvrpJ/Xp00c7d+40sTL8U/Xr10/Vq1fX9OnT5evrq9zcXI0aNUppaWlavHix2eWhFCDUwOv9/QnM99xzj7KysrRy5UpXW1hYGP+SK6LFixdrxIgRGj9+vBo2bKh9+/ZpypQpmjp1qitAAiXp/EDhEydOqF69ejpw4IAqVarEQOHLkJubqz///FNVqlQxuxSPYPYTvF6ZMmWUk5OjMmXKKCkpSZ988olWrVrl2n727Nl8b0fGxfXu3VunTp3Syy+/7Jr9NGHCBAINTFO7dm3t3LlTS5cudb0n7+6772bs4SU4cuSI4uLitGTJEvn7+0uSPv30U/Xv318nTpxQq1at9OGHH6pOnTomV3p5uFIDr/fQQw/J6XTqgQce0EsvvaSsrCxt3brVtX3GjBlav36925UbXFxaWprX/wUHaxkzZoxeeukls8vwSgMGDFCVKlU0c+ZMSVJKSooiIiI0YMAAxcXF6c0339SJEye8fnYjoQZe7/jx4xo4cKA+++wzXXPNNYqPj3cNhDt27JgaNmyodevW6frrrze5Uu8SHh7OCy1RqrRu3VoJCQncaiqG0NBQ7du3T+XKlZMkDR8+XF988YV27Nghm82m7OxsRUREeP3/84QaWN7//vc/1axZ0+wyvM706dOVm5ur0aNHm10KIEnav3+/pk6dqujoaLVs2dJtFlRoaKiJlZV+f31C/cmTJ2W32zVjxgwNGDDA1ScoKEipqalmlegRjKmB5RFoiic9PV3ffvut5syZk+8XCE9nhhkaNGggSXrnnXfc2q3weP8rrVGjRnr99dfVv39/jRkzRpUqVVKfPn1c29euXauQkBATK/QMQg2AAh05ckRhYWEKCwuTJJ7KDNPxgL3imzFjhjp16qRhw4apUqVKWrp0qcqWLSvp3G36vn376rXXXjO5ysvH7ScAF5WSkqK0tDRFRUW5XbEBStrKlSv11ltvKSkpSeHh4Ro0aJC6du1qdlleISsrS3v27FHdunVVvXp1t22ff/65brvtNpMq8xze/QTA5Y8//lCHDh1UqVIltW/fXmlpaXr99dcVHh6uFi1aqHHjxrw5HqZ5++231bt3b1199dWu18v06dNHc+bMMbs0r1CuXDk1b948X6CRZIlAI3GlBsBfDB48WN99953Gjh0rp9OpQ4cOacqUKerbt69eeuklzZgxQ7/88osWLlxodqn4B7r66qu1aNEi3Xjjja62nTt36t5779W+fftMrAylBaEGgEvdunX1xRdfuMbR7NixQ82bN9fvv/+u8PBwZWdnq379+lytgSkKm53z15k9+Gfj9hMAl6ysLFegkaRmzZqpYsWKrrayZcsyYBim6dSpk5YvX+7WtmnTJrVs2dKcglDqMPsJgIufn1++toCAALeXrPr48G8hlJxnnnnG9XNAQIBiY2PVp08fXXXVVTpx4oQWLFigF154wcQKUZpw+wmAS6VKlXTfffe5tSUkJKhnz55u6ydPnizp0vAP1b59+4v2sdlsSkxMLIFqUNoRagC4/PXpohfy3nvvXeFKAKDoCDUAAMASuDkOAAAsgVADAAAsgVADAAAsgVADAAAsgVADoFSaN2+ewsPDzS7jss2bN0/t2rUzuwzgH4FQAwAALIFQAwAALIFQA6BQ7dq108SJE9WuXTsFBASoXbt2cjgceuCBBxQYGKjrrrtOO3bskCTl5OToueeeU/369RUcHKzu3bvr4MGDrmP1799fQ4YMUY8ePVSnTh01b95cv/76q4YPH67g4GBFRETos88+y1fD/PnzFRERoTp16qhfv346fvy4a9uxY8c0YMAAhYSEKCwsTMOHD9fp06dd28PDw/Xpp5+qT58+atOmzUW/b//+/TV27FhNmzZNoaGhOnz4sAzD0NSpU1WvXj0FBgaqc+fObi9PbNeunV566SU9+OCDCgkJkd1u17vvvlvg8Z1Op2699VY98MADys3NvWg9AIqGUAPggt5++23NmjVLhw8fVk5Ojpo3b65u3brp8OHDat++vQYNGiRJGjNmjObPn6/PPvtMDodDkZGR6tGjh9sv7wULFmjEiBFKS0tTRESEbrnlFl111VVKSUnR0KFD1a9fP7cXZqampurzzz/Xjh079Ntvvyk1NVUPP/ywJCkvL09dunTRH3/8oZ9//lm7du3S3r17NWbMGLf6X3/9dcXFxWnTpk2X9H2//fZb5eTk6ODBgwoMDFRiYqLmzJmjjRs3yuFwqHLlyho5cqTbPlOmTFHv3r2VnJysmTNnasiQIfrf//7n1icvL099+/ZVYGCgFi5cKF9f30v/jwDg0hgAUIhbb73VePzxx13r48ePNyIjI13ra9euNfz9/Q2n02lUqFDB+PDDD13bcnNzjZo1axobNmwwDMMwYmNjjbvuusu1/e233zZq1KhhZGdnG4ZhGL/88oshyTh8+LBhGIbx3nvvGVWqVDGcTqdrnx9++MGQZKSnpxubNm0yfHx8jLS0NNf2HTt2GH5+fq5jhoWFGY888sglf9/Y2FgjIiLCyMvLc2s/fzzDMIzly5cbV199tds5evjhh13rTqfTkGR88803ru9x6623GsOGDTPuuece4+zZs5dcD4Ci4S3dAC6oSpUqrp/9/PxUs2ZN13rZsmXldDr1xx9/6PTp0xo+fLhGjRrltn9SUlKhx6pcubLrzeBly5aVJGVlZbn6VK9e3dUuSQ0bNnQd0+FwyGazqWXLlm6fV6FCBR08eFBXX321JOnGG28s0vdt2bKl21vJ09LSNGnSJG3cuFGnTp2S0+lUuXLl3PYJDg52/VzQ99iyZYtSUlJUv359rtAAVxChBsBlq1OnjipVqqTFixdf0tiVS5WZmSnDMFwh4/fff5ck11RvPz8/7du3zy34/F1RQ8Tf+8fGxsrX11fr1q1TcHCwVq9ercGDBxfpmI0aNdK3336rVq1aacqUKRo/fnyR9gdwaRhTA+Cy2Ww211WaAwcOSDp3haNnz57au3dvsY+bkZGhMWPG6OzZszp9+rSeeOIJ3XXXXQoICNANN9ygFi1aaNCgQTp58qQk6YcfflBMTIycTqdHvpcknTp1ShEREQoODtbRo0f16quvug1GvhTVqlWTv7+/4uPjNWXKFG3cuNFj9QH4P4QaAB4xadIk3XvvvercubPsdruio6MVHR2txo0bF/uY3bp1U82aNdW4cWPVr19fNWvW1Jw5cySdC1LLli2Tn5+fIiMjFRISoiFDhmj06NHy9/f31NfSrFmztGnTJgUGBqpLly4aP368srKydOTIkSIfq3HjxnrhhRfUu3dvHT161GM1AjjHZhh/mWoAAADgpRhTA+Af4+abb3Z7xsxf7dmzx20gMwDvw5UaAABgCYypAQAAlkCoAQAAlkCoAQAAlkCoAQAAlkCoAQAAlkCoAQAAlkCoAQAAlkCoAQAAlkCoAQAAlvD/APULnGlrV2bCAAAAAElFTkSuQmCC
" alt="Colab notebook output image" /></figure>
<p><strong>この結果からわかること</strong></p>
<p>棒グラフにすると、どのカテゴリが多いかを視覚的に確認しやすくなります。表だけでも十分ですが、カテゴリ数が多いときや他人に説明するときは、グラフのほうが伝わりやすいことがあります。</p>
<p>ただし、今回の記事の主役はあくまで value_counts() なので、可視化は「こういう使い方もできる」と押さえておく程度で十分です。</p>

<h2><span id="toc18">value_counts() と groupby().size() と count() の違い</span></h2>
<div class="table-scroll"><figure class="wp-block-table"><table class="wp-block-table"><thead><tr><th>書き方</th><th>主な用途</th><th>特徴</th></tr></thead><tbody><tr><td>value_counts()</td><td>1列の値の出現回数を数える</td><td>最も手軽でわかりやすい</td></tr><tr><td>groupby().size()</td><td>グループごとの件数を数える</td><td>複数列の組み合わせ集計にも向く</td></tr><tr><td>count()</td><td>欠損値を除いた件数を数える</td><td>列ごとの非欠損件数を見るときに使う</td></tr></tbody></table></figure></div>

<h3><span id="toc19">どう使い分ければよいか</span></h3>
<p>まず、1列だけの分布確認なら value_counts() が最も簡単です。</p>
<p>たとえば「会員ランクごとの人数を知りたい」なら、value_counts() が最短です。</p>
<p>一方、複数列の組み合わせで件数を見たいときは groupby().size() が向いています。たとえば「都市ごと・会員ランクごとの件数を見たい」といった場面です。</p>
<p>また、count() は「値の種類ごとの件数」を数えるというより、<strong>欠損でないデータが何件あるか</strong>を見るときに使います。そのため、value_counts() と同じ用途だと思うと混乱しやすいです。</p>

<h3><span id="toc20">初心者向けの覚え方</span></h3>
<ul>
<li>1列の分布を見る → value_counts()</li>
<li>複数条件で件数を出す → groupby().size()</li>
<li>欠損を除いた件数を知る → count()</li>
</ul>

<h2><span id="toc21">よくある使い方の例</span></h2>
<ul>
<li>会員ランクの分布確認</li>
<li>アンケート回答の件数確認</li>
<li>都道府県別・カテゴリ別の件数確認</li>
<li>欠損値を含めたデータ品質チェック</li>
<li>表記ゆれや入力ミスの発見</li>
</ul>
<p>つまり、value_counts() は分析の最初にデータの中身をざっくり把握するための定番メソッドと言えます。</p>

<h2><span id="toc22">大規模データでの考慮事項</span></h2>
<p>value_counts() は便利ですが、<strong>ユニークな値が非常に多い列</strong>に使うと、結果が長くなりやすいです。</p>
<p>たとえば、ID列や自由入力の文字列列では、ほとんど同じ値が出てこないことがあります。その場合、集計しても見づらくなることがあります。</p>
<p>そんなときは、上位だけ確認する方法が便利です。</p>
<p>print(df[&#8220;member_rank&#8221;].value_counts(dropna=False).head())</p>
<p><strong>この考え方のポイント</strong></p>
<p>value_counts() はカテゴリ列にはとても向いていますが、ほぼすべて違う値が入っている列では、結果が長すぎて役立ちにくいことがあります。そのような場合は head() で上位だけを見る、あるいは別の列を集計対象にする、といった工夫が必要です。</p>

<h2><span id="toc23">よくある間違い</span></h2>

<h3><span id="toc24">NaN が表示されないのはおかしいと思ってしまう</span></h3>
<p>これはバグではありません。value_counts() はデフォルトで NaN を除外します。df[&#8220;member_rank&#8221;].value_counts(dropna=False)と書けば、NaN も数えられます。</p>

<h3><span id="toc25">割合が 0〜1 の小数で返ってきて戸惑う</span></h3>
<p>normalize=True は割合を返しますが、50% ではなく 0.5 のように返ってきます。(df[&#8220;member_rank&#8221;].value_counts(normalize=True) * 100).round(1)のように書くと、見やすくなります。</p>

<h3><span id="toc26">表記ゆれに気づかず、そのまま集計してしまう</span></h3>
<p>Silver と &#8221; Silver &#8220;、Bronze と bronze のように、見た目は近くても別の値として集計されます。そのため、件数を見るときは、<strong>本当に同じカテゴリとして扱ってよいか</strong>を意識することが大切です。</p>

<h2><span id="toc27">ワンポイント</span></h2>
<p>value_counts() は、head()、info()、describe() と並んで、<strong>データを読み込んだ直後に確認したい基本操作</strong>の1つです。</p>
<p>head() で先頭行を見る
info() で型と欠損を見る
value_counts() でカテゴリの分布を見る
という流れで確認すると、データの全体像をかなりつかみやすくなります。</p>
<p>つまり、value_counts() は「あとで使う関数」ではなく、<strong>最初に使う確認用メソッド</strong>として覚えておくと実務でも役立ちます。</p>

<h2><span id="toc28">まとめ</span></h2>
<p>value_counts() は、<strong>列の値ごとの出現回数をすばやく集計できる便利なメソッド</strong>です。</p>
<p>基本の形はとてもシンプルです。</p>
<p>df[&#8220;列名&#8221;].value_counts()
さらに、</p>
<ul>
<li>割合を出したい → normalize=True</li>
<li>欠損値も含めたい → dropna=False</li>
<li>少ない順に並べたい → ascending=True
を組み合わせることで、より実用的に使えます。</li>
</ul>
<p>また、単なる件数集計だけでなく、</p>
<ul>
<li>カテゴリの偏り確認</li>
<li>欠損値の確認</li>
<li>表記ゆれの発見</li>
<li>可視化前の下準備</li>
</ul>
<p>にも役立ちます。</p>
<p>Pandasでデータを読み込んだら、head() や info() とあわせて、ぜひ value_counts() も使ってみてください。</p>

<style>
.colab-article { color:#222; line-height:1.8; font-size:16px; }
.colab-article h1, .colab-article h2, .colab-article h3, .colab-article h4, .colab-article h5, .colab-article h6 { line-height:1.4; margin:1.6em 0 0.7em; }
.colab-article p { margin:0 0 1.1em; }
.colab-article ul, .colab-article ol { margin:0 0 1.1em 1.4em; }
.colab-article li { margin:0.3em 0; }
.colab-article code:not(pre code) { background:#f5f5f5; padding:0.15em 0.4em; border-radius:4px; font-size:0.95em; }
.colab-article pre[class*="language-"] { margin:1.2em 0; border-radius:8px; overflow:auto; }
.colab-article .output-block { background:#fafafa; border:1px solid #e5e7eb; padding:14px 16px; border-radius:8px; overflow:auto; white-space:pre; line-height:1.6; }
.colab-article .table-scroll { overflow-x:auto; -webkit-overflow-scrolling:touch; margin:1.2em 0; }
.colab-article figure.wp-block-table { margin:0; }
.colab-article table.wp-block-table { border-collapse:collapse; width:auto; max-width:none; table-layout:auto; }
.colab-article table.wp-block-table th, .colab-article table.wp-block-table td { border:1px solid #d1d5db; padding:8px 12px; white-space:nowrap; text-align:left; vertical-align:top; }
.colab-article table.wp-block-table th { background:#f3f4f6; }
.colab-article .image-block { margin:1.2em 0; }
.colab-article .image-block img { max-width:100%; height:auto; display:block; }
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>


<!-- ▼▼▼ 関連記事ボックス 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc29">関連記事</span></h3> <ul> 
<ul>
  <li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
  <li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </div>
<!-- ▼▼▼ 関連記事ボックス 共通スタイル（カテゴリ）終了▼▼▼ -->

<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>

</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1774176973991" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">value_counts() とは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>Seriesに含まれる値ごとの出現回数を数えるメソッドです。1列のカテゴリ分布を確認するときによく使います。</p>

</div>
</div>
<div id="faq-question-1774176997535" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">割合を表示するにはどうすればよいですか？</span></h3>
<div class="rank-math-answer ">

<p><code>normalize=True</code> を指定します。<br />df[&#8220;member_rank&#8221;].value_counts(normalize=True)</p>

</div>
</div>
<div id="faq-question-1774177030143" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">欠損値も数えられますか？</span></h3>
<div class="rank-math-answer ">

<p>はい。<code>dropna=False</code> を指定すると、NaN も件数に含められます。<br />df[&#8220;member_rank&#8221;].value_counts(dropna=False)</p>

</div>
</div>
<div id="faq-question-1774177055790" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">groupby().size() との違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>value_counts()</code> は1列の出現回数を手軽に数えるのに向いています。<br />一方、<code>groupby().size()</code> は複数列の組み合わせ集計など、より柔軟な集計に向いています。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-value-counts/">pandas value_counts()の使い方｜件数集計・割合表示・欠損値の数え方を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-value-counts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas describe()の使い方｜統計量の意味と結果の見方を解説</title>
		<link>https://pythondatalab.com/pandas-info-describe/</link>
					<comments>https://pythondatalab.com/pandas-info-describe/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 13 Apr 2025 14:06:00 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false"></guid>

					<description><![CDATA[<p>pandasのdescribe()の使い方を初心者向けに解説。count・mean・std・25%・50%などの意味、結果を読む順序、include='all'、info()との違い、欠損値や極端な値の見つけ方を実例で学べます。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味と結果の見方を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<div class="colab-article">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article {
    width: 100%;
    max-width: 100%;
    min-width: 0;
  }
  .colab-article .colab-table-wrap {
    display: block;
    width: 100%;
    max-width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  .colab-article .colab-table-wrap table {
    max-width: none;
  }
  .colab-article pre[class*="language-"] {
    margin: 0 !important;
    padding: 1em;
    overflow-x: auto;
  }
  .colab-article pre.line-numbers {
    margin: 0 !important;
    padding: 1em;
    overflow-x: auto;
  }
  .colab-article .code-toolbar {
    margin: 0 !important;
  }
  .colab-article .code-toolbar > pre[class*="language-"] {
    margin: 0 !important;
  }
  .colab-article .wp-block-table th,
  .colab-article .wp-block-table td {
    border: 1px solid #d6d6d6;
  }
</style>


<p><code>df.describe()</code>を実行できても、<code>count</code>、<code>mean</code>、<code>std</code>、<code>25%</code>、<code>50%</code>を<strong>どう読めばよいのか</strong>迷うことはありませんか。</p>

<p><code>describe()</code>は、DataFrameの各列について、データの中心・ばらつき・範囲をまとめて確認するメソッドです。結果は、まず <code>count</code>、次に <code>mean</code> と <code>50%</code>、その後に <code>std</code>、<code>min</code>・<code>25%</code>・<code>75%</code>・<code>max</code> の順で読むと理解しやすくなります。</p>

<p>この記事では、売上データを使って、<code>pandas describe()</code>の基本と結果の読み方を解説します。読み終えると、欠損、値の偏り、ばらつき、極端な値の候補に気づき、次の処理を選べるようになります。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-5" checked><label class="toc-title" for="toc-checkbox-5">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：describe()は値の分布をまとめて確認するときに使う</a></li><li><a href="#toc3" tabindex="0">売上データを用意する</a></li><li><a href="#toc4" tabindex="0">df.describe()の基本的な使い方</a></li><li><a href="#toc5" tabindex="0">describe()の結果は4段階で読む</a><ol><li><a href="#toc6" tabindex="0">count：欠損値を除いた件数</a></li><li><a href="#toc7" tabindex="0">meanと50%：平均値と中央値を比べる</a></li><li><a href="#toc8" tabindex="0">std：値のばらつきを確認する</a></li><li><a href="#toc9" tabindex="0">min・25%・50%・75%・max：値の範囲と中央部分を見る</a></li></ol></li><li><a href="#toc10" tabindex="0">大きな値が平均値に与える影響を比較する</a></li><li><a href="#toc11" tabindex="0">数値列以外をdescribe()で確認する</a><ol><li><a href="#toc12" tabindex="0">文字列列ではunique・top・freqが表示される</a></li><li><a href="#toc13" tabindex="0">include=&#8217;all&#8217;ですべての列を確認する</a></li><li><a href="#toc14" tabindex="0">includeで確認するデータ型を選ぶ</a></li></ol></li><li><a href="#toc15" tabindex="0">percentilesで表示する分位点を変更する</a></li><li><a href="#toc16" tabindex="0">Series.describe()とDataFrame.describe()の違い</a></li><li><a href="#toc17" tabindex="0">describe()と個別メソッドの使い分け</a></li><li><a href="#toc18" tabindex="0">コードは動くが結果を誤解しやすい5つの場面</a></li><li><a href="#toc19" tabindex="0">データ分析では「実データ→構造→分布→次の処理」の順で使う</a></li><li><a href="#toc20" tabindex="0">まとめ：describe()は結果を読んで次の処理を決めるために使う</a></li><li><a href="#toc21" tabindex="0">関連記事</a><ol><li><a href="#toc22" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc23" tabindex="0">pandasのdescribe()は何をするメソッドですか？</a></li><li><a href="#toc24" tabindex="0">countはDataFrameの行数と同じですか？</a></li><li><a href="#toc25" tabindex="0">50%は平均値ですか？</a></li><li><a href="#toc26" tabindex="0">数値列しか表示されないのはなぜですか？</a></li><li><a href="#toc27" tabindex="0">include=&#8217;all&#8217;でNaNが表示されるのは異常ですか？</a></li><li><a href="#toc28" tabindex="0">describe()とinfo()の違いは何ですか？</a></li><li><a href="#toc29" tabindex="0">標準偏差が大きいとはどういう意味ですか？</a></li><li><a href="#toc30" tabindex="0">describe()だけで外れ値を判断できますか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>

<ul>
<li>
<code>df.describe()</code>の基本的な使い方</li>
<li>各統計量の意味と読む順序</li>
<li>describe()の結果を読む順序</li>
<li>数値列・文字列列・日付列で出力が変わる理由</li>
<li>
<code>include='all'</code>と<code>percentiles</code>の基本</li>
<li>describe()・head()・info()の使い分け</li>
<li>結果を欠損処理、型変換、可視化へつなげる方法</li>
</ul>

<p>この記事は、データを読み込んだ後に内容を確認する段階の記事です。DataFrameの基本は<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>、データの取り込みは<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>で確認できます。</p>
<h2><span id="toc2">先に結論：describe()は値の分布をまとめて確認するときに使う</span></h2>

<p><code>describe()</code>を使う目的は、単に統計量を表示することではありません。<strong>列ごとの件数、中心、ばらつき、範囲を短い表で確認し、次の作業を決めること</strong>です。</p>

<p>データを読み込んだ直後は、次のように使い分けます。</p>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">機能名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">何を確認するか</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">注意点</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>head()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">先頭の実データ</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">列名や値の入り方を目で見る</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">先頭だけで全体を判断しない</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>info()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">行数、列名、データ型、非欠損数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">DataFrameの構造を確認する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">値の分布は分からない</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>dtypes</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">各列のデータ型</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">型だけをすばやく確認する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損数や値の分布は分からない</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>describe()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">件数、中心、ばらつき、範囲</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">数値の分布をまとめて確認する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">初期設定では通常、数値列が対象</td>
</tr>
</tbody>
</table>
</div>
<p>迷ったら、<strong>head()で実データ → info()で構造 → describe()で分布</strong>の順に確認します。head()については、<a href="https://pythondatalab.com/pandas-head/">pandas head()の使い方</a>で詳しく解説しています。</p>
<h2><span id="toc3">売上データを用意する</span></h2>

<p>日付・店舗・売上・客数を含むDataFrameを作ります。売上には、欠損値1つと、ほかの日より大きい500という値を入れています。</p>
<pre class="line-numbers"><code class="language-python">import pandas as pd
import numpy as np

df = pd.DataFrame({
    "日付": pd.to_datetime([
        "2026-08-01", "2026-08-02", "2026-08-03", "2026-08-04",
        "2026-08-05", "2026-08-06", "2026-08-07", "2026-08-08"
    ]),
    "店舗": ["東京", "大阪", "東京", "大阪", "東京", "大阪", "東京", "大阪"],
    "売上": [100, 120, 110, np.nan, 130, 125, 500, 115],
    "客数": [10, 12, 11, 13, 13, 12, 14, 11]
})

df</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">客数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-03</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">110</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">13</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-05</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">130</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">13</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">125</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">6</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-07</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">14</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">大阪</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">115</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11</td>
    </tr>
  </tbody>
</table>
</div>
<p>表示された元データは8行です。<code>売上</code>列の4行目には <code>NaN</code> があり、7行目の売上は500です。ここでは <code>NaN</code> を0円という意味にはせず、<strong>売上の値が記録されていない状態</strong>として扱います。</p>

<p>数字に見える列でも、文字列型なら標準のdescribe()では数値列として集計されません。自分のデータでは、列名、行数、欠損値、データ型を先に確認しましょう。</p>
<h2><span id="toc4">df.describe()の基本的な使い方</span></h2>

<p>DataFrameに <code>.describe()</code> を付けると、初期設定では数値列の要約統計量が返されます。describe()は元のDataFrameを書き換えません。</p>
<pre class="line-numbers"><code class="language-python">summary = df.describe()
summary</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">客数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04 12:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">min</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01 00:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">25%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02 18:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">112.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04 12:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">75%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06 06:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">127.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">13</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">max</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08 00:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">14</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">std</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">145.221506</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.309307</td>
    </tr>
  </tbody>
</table>
</div>
<p>この結果では、数値列である<code>売上</code>と<code>客数</code>が表示されます。注目したい点は次のとおりです。</p>

<ul>
<li>元データは8行ですが、<code>売上</code>の<code>count</code>は7です。欠損値1件が計算から除かれています。</li>
<li>
<code>客数</code>には欠損値がないため、<code>count</code>は8です。</li>
<li>
<code>売上</code>の<code>mean</code>は<code>50%</code>よりかなり大きくなります。売上500の影響を受けている可能性があります。</li>
<li>
<code>日付</code>と<code>店舗</code>は、初期設定の結果には表示されません。</li>
</ul>

<p>このように、最初の出力だけでも欠損と大きな値の候補に気づけます。describe()の結果はDataFrameとして変数に保存できます。</p>
<h2><span id="toc5">describe()の結果は4段階で読む</span></h2>

<p>数値列の出力は、次の順序で読むと判断につなげやすくなります。</p>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th align="right" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">読む順序</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">項目</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">意味</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">確認すること</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>count</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値を除いた件数</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">元の行数より少なくないか</td>
</tr>
<tr>
<td align="right" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">
<code>mean</code>・<code>50%</code>
</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">平均値・中央値</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">2つが大きく離れていないか</td>
</tr>
<tr>
<td align="right" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">3</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;"><code>std</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">標準偏差</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">値のばらつきが大きそうか</td>
</tr>
<tr>
<td align="right" style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">4</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">
<code>min</code>・<code>25%</code>・<code>75%</code>・<code>max</code>
</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">最小値・四分位数・最大値</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">値の範囲や極端な値の候補がないか</td>
</tr>
</tbody>
</table>
</div>
<p>この順番なら、欠損の見落としを防ぎ、平均値だけに頼らず、分布全体を確認できます。</p>
<h3><span id="toc6">count：欠損値を除いた件数</span></h3>

<p><code>count</code>は、各列の<strong>欠損していない値の数</strong>です。DataFrame全体の行数とは限りません。</p>

<p>元の行数とcountを並べると、何が違うかを追いやすくなります。</p>
<pre class="line-numbers"><code class="language-python">count_comparison = pd.DataFrame({
    "確認対象": ["DataFrame全体", "売上", "客数"],
    "件数": [len(df), df["売上"].count(), df["客数"].count()],
    "何を数えたか": ["すべての行", "売上の非欠損値", "客数の非欠損値"]
})

count_comparison</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">確認対象</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">件数</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">何を数えたか</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">0</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">DataFrame全体</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">すべての行</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">1</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">売上の非欠損値</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">客数</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">客数の非欠損値</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>DataFrame全体</code>は8行ですが、<code>売上</code>は7件です。この差から、売上に欠損値が1件あると気づけます。欠損箇所を詳しく調べる場合は、<a href="https://pythondatalab.com/pandas-isnull/">Pandas isnull()で欠損値を確認する方法</a>へ進みます。</p>

<p>欠損値を埋めるかどうかはデータの意味によって決めます。機械的に0や平均値で埋めるのではなく、<a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a>を参考に、欠損した理由を確認してください。</p>
<h3><span id="toc7">meanと50%：平均値と中央値を比べる</span></h3>

<p><code>mean</code>は平均値、<code>50%</code>は中央値です。中央値は、値を小さい順に並べたときの中央を表します。</p>

<p>平均値と中央値が離れているときは、一部の大きな値や小さな値に平均が引っ張られていないか確認します。売上列から2つの値を取り出して比べてみましょう。</p>
<pre class="line-numbers"><code class="language-python">df["売上"].describe().loc[["mean", "50%"]]</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
    </tr>
  </tbody>
</table>
</div>
<p>このデータでは平均値が中央値より大きくなります。原因の候補は売上500です。ただし、500が入力ミスとは限りません。キャンペーンなどで実際に売上が増えた可能性もあるため、describe()だけで削除を決めず、元データや業務上の理由を確認します。</p>
<h3><span id="toc8">std：値のばらつきを確認する</span></h3>

<p><code>std</code>は標準偏差で、値が平均の周りにどの程度ばらついているかを表す指標です。同じ単位のデータなら、一般にstdが大きいほど値の散らばりも大きいと考えられます。</p>

<p>ただし、stdの大きさだけを見て「異常」とは判断できません。売上と客数のように単位や値の規模が違う列同士では、数値をそのまま比較しないようにします。標準偏差の数式や推測統計にはここでは深入りせず、分布を確認する目安として使います。</p>
<h3><span id="toc9">min・25%・50%・75%・max：値の範囲と中央部分を見る</span></h3>

<p><code>min</code>と<code>max</code>は最小値と最大値です。<code>25%</code>、<code>50%</code>、<code>75%</code>は分位点で、初期設定では第1四分位数、中央値、第3四分位数が表示されます。</p>

<p><code>25%</code>は「値を25%にする処理」ではありません。データを小さい順に見たとき、下位25%の境目となる値です。<code>25%</code>から<code>75%</code>を見ると、データ中央の50%がどの範囲にあるか分かります。</p>

<p>今回の売上では、中央部分の値に対して<code>max</code>が離れています。この差は詳しく確認するきっかけになりますが、describe()だけで外れ値と断定はできません。分布の形を確かめる場合は、<a href="https://pythondatalab.com/matplotlib-hist-boxplot/">Matplotlibのヒストグラム・箱ひげ図</a>につなげます。</p>
<h2><span id="toc10">大きな値が平均値に与える影響を比較する</span></h2>

<p>「平均値と中央値が離れる」とはどういうことかを、条件をそろえた2つの売上データで確認します。通常範囲の7個の値と、その最後の値だけを500へ変えたデータを比較します。</p>
<pre class="line-numbers"><code class="language-python">sales_typical = pd.Series([100, 120, 110, 125, 130, 115, 105], name="通常範囲")
sales_with_large_value = pd.Series([100, 120, 110, 125, 130, 115, 500], name="大きな値を含む")

comparison = pd.concat(
    [sales_typical.describe(), sales_with_large_value.describe()],
    axis=1
).loc[["count", "mean", "std", "min", "25%", "50%", "75%", "max"]]

comparison</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">通常範囲</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">大きな値を含む</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">115</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">std</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10.801234</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">145.221506</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">min</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">25%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">107.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">112.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">115</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">75%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">122.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">127.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">max</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">130</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
    </tr>
  </tbody>
</table>
</div>
<p>両方ともcountは7ですが、大きな値を含むデータではmeanとstdが大きくなります。一方、50%は中央の順位で決まるため、平均値ほど大きな影響を受けません。</p>

<p>この比較から、次のように判断できます。</p>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">データの状態</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">meanと50%</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">std</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">次に確認すること</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">値が比較的まとまっている</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">近くなりやすい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">比較的小さい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">通常の分布として妥当か</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">大きな値を含む</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">meanが50%より大きくなりやすい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">大きくなりやすい</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">入力ミスか、意味のある実績か</td>
</tr>
</tbody>
</table>
</div>
<p>これは「コードは正しく動いているのに、平均値だけを代表値だと思うと結果を誤解しやすい」例です。meanだけでなく50%、std、maxを組み合わせて読みます。</p>
<h2><span id="toc11">数値列以外をdescribe()で確認する</span></h2>

<h3><span id="toc12">文字列列ではunique・top・freqが表示される</span></h3>

<p>初期設定の<code>df.describe()</code>は、数値列を含むDataFrameでは通常、数値列を対象にします。店舗のような文字列列を確認したい場合は、対象列を選んでdescribe()を使います。</p>
<pre class="line-numbers"><code class="language-python">df["店舗"].describe()</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">unique</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">top</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">freq</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
    </tr>
  </tbody>
</table>
</div>
<p>文字列列では、数値列とは異なる項目が表示されます。</p>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">項目</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">文字列列での意味</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>count</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値を除いた件数</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>unique</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">異なる値の種類数</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>top</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">最も多く現れる値の1つ</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>freq</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">topが現れた回数</td>
</tr>
</tbody>
</table>
</div>
<p>今回の店舗は東京と大阪の2種類です。出現回数が同数のように、最頻値が複数ある場合、<code>top</code>だけを見て特定の値が必ず選ばれると考えないでください。公式仕様では、同数の候補から任意の1つが表示されます。</p>
<h3><span id="toc13">include=&#8217;all&#8217;ですべての列を確認する</span></h3>

<p>数値列、文字列列、日付列をまとめて対象にするには、<code>include='all'</code>を指定します。</p>
<pre class="line-numbers"><code class="language-python">df.describe(include="all")</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">日付</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">客数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">unique</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">top</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">freq</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04 12:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">min</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-01 00:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">25%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-02 18:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">112.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-04 12:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">75%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-06 06:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">127.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">13</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">max</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2026-08-08 00:00:00</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">14</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">std</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">NaN</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">145.221506</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.309307</td>
    </tr>
  </tbody>
</table>
</div>
<p>列の種類によって計算できる統計量が違うため、表には多数の<code>NaN</code>が表示される場合があります。</p>

<p>この<code>NaN</code>は、必ずしも元データの欠損ではありません。たとえば文字列列では平均値を計算できないため、その欄が<code>NaN</code>になります。</p>

<p>日付列はpandasのバージョンや列のデータ型を確認しながら結果を読みます。今回のようなdatetime型では、件数や日付範囲などの要約が表示されます。日付が文字列のままだと期待した結果にならないため、必要なら<a href="https://pythondatalab.com/pandas-to-datetime/">pandas to_datetime()の使い方</a>で変換します。</p>
<h3><span id="toc14">includeで確認するデータ型を選ぶ</span></h3>

<p>特定の型だけを確認したい場合は、<code>include</code>に対象を指定します。数値列だけなら<code>number</code>、文字列として格納された列なら<code>object</code>などを使えます。</p>
<pre class="line-numbers"><code class="language-python"># pandasのバージョンや読み込み方法によって、
# 文字列列はobject型またはstring型になることがあります
df.dtypes</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;"></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">日付</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">datetime64[ns]</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">店舗</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">object</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">売上</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">float64</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">客数</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">int64</td>
    </tr>
  </tbody>
</table>
</div>
<p>文字列列は、pandasのバージョンや読み込み方法によって<code>object</code>型または<code>string</code>型になります。<code>object</code>と決めつけず、先に実際の型を確認します。</p>
<pre class="line-numbers"><code class="language-python">numeric_summary = df.describe(include="number")

string_columns = df.select_dtypes(include=["object", "string"]).columns
string_summary = df[string_columns].describe()

numeric_summary, string_summary</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">客数</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">std</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">145.221506</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">1.309307</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">min</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">10</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">25%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">112.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">11</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">12</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">75%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">127.5</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">13</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">max</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">14</td>
    </tr>
  </tbody>
</table>
</div>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">店舗</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">8</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">unique</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">2</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">top</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">東京</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">freq</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">4</td>
    </tr>
  </tbody>
</table>
</div>
<p><code>numeric_summary</code>には売上と客数、<code>string_summary</code>には店舗が表示されます。<code>object</code>と<code>string</code>の両方を候補にして、環境による文字列型の違いへ対応しています。</p>

<p>対象列が選ばれないときは<code>df.dtypes</code>を確認してください。型による列抽出は<a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方</a>、数字の文字列を変換する方法は<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>で解説しています。</p>
<h2><span id="toc15">percentilesで表示する分位点を変更する</span></h2>

<p><code>percentiles</code>を指定すると、初期設定の25%・50%・75%以外の分位点を表示できます。値は0から1の範囲で指定します。ここでは10%と90%を追加して確認します。</p>
<pre class="line-numbers"><code class="language-python">df["売上"].describe(percentiles=[0.1, 0.25, 0.5, 0.75, 0.9])</code></pre>
<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
  <thead>
    <tr style="text-align: left;">
      <th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"></th>
      <th style="white-space: nowrap; padding: 0.2em 0.4em;">売上</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">count</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">7</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">mean</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">171.428571</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">std</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">145.221506</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">min</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">100</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">10%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">106</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">25%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">112.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">50%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">120</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">75%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">127.5</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">90%</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">278</td>
    </tr>
    <tr>
      <td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">max</td>
      <td style="white-space: nowrap; padding: 0.2em 0.4em;">500</td>
    </tr>
  </tbody>
</table>
</div>
<p>10%や90%を追加すると、分布の端に近い部分をもう少し細かく確認できます。ただし、データが7件しかない今回の例では、細かな分位点を過度に解釈しないことが重要です。まずは初期設定の25%・50%・75%を読めれば十分です。</p>
<h2><span id="toc16">Series.describe()とDataFrame.describe()の違い</span></h2>

<p>1列を選んでdescribe()を使うとSeriesが返り、複数列を含むDataFrameへ使うとDataFrameが返ります。</p>
<pre class="line-numbers"><code class="language-python">series_result = df["売上"].describe()
dataframe_result = df[["売上", "客数"]].describe()

print(type(series_result))
print(type(dataframe_result))</code></pre>
<pre class="colab-output" style="overflow-x: auto; margin: 0; padding: 1em;">&lt;class 'pandas.core.series.Series'&gt;
&lt;class 'pandas.core.frame.DataFrame'&gt;</pre>
<p>1列だけ詳しく読みたいならSeries、複数の数値列を同じ表で比べたいならDataFrameが便利です。なお、DataFrame用の<code>include</code>と<code>exclude</code>はSeriesでは無視されます。</p>
<h2><span id="toc17">describe()と個別メソッドの使い分け</span></h2>

<p>describe()は複数の統計量をまとめて確認する入口です。特定の値だけが必要なら個別メソッドを使います。</p>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">機能名</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">何を求めるか</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">選ぶ場面</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">注意点</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>describe()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">複数の要約統計量</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">最初に分布の全体像を確認する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">初期設定では通常、数値列が対象</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>mean()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">平均値</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">平均だけを計算に使う</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">大きな値・小さな値の影響を受ける</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>std()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">標準偏差</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">ばらつきだけを確認する</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">単位や値の規模も考慮する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;"><code>quantile()</code></td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">指定した分位点</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">任意の分位点を個別に求める</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">0から1の位置を指定する</td>
</tr>
</tbody>
</table>
</div>
<p>最初はdescribe()で全体を見て、必要な統計量が決まった後に個別メソッドを選ぶと、確認漏れを減らせます。</p>
<h2><span id="toc18">コードは動くが結果を誤解しやすい5つの場面</span></h2>

<div class="colab-table-wrap" style="width: 100%; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 1em 0;">
<table class="wp-block-table" style="width: auto; border-collapse: collapse;">
<thead>
<tr>
<th style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">症状</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">主な原因</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">確認方法</th>
<th style="white-space: nowrap; padding: 0.2em 0.4em;">修正・判断方法</th>
</tr>
</thead>
<tbody>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">countが行数より少ない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値がある</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">
<code>len(df)</code>と<code>count</code>を比較</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損箇所と理由を確認する</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">数字の列が表示されない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">数字が文字列型になっている</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">
<code>df.dtypes</code>を確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">必要ならto_numeric()などで変換</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">文字列列が表示されない</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">初期設定では数値列が優先される</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">列の型と対象列を確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">列を選ぶか<code>include</code>を指定</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">
<code>include='all'</code>でNaNが多い</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">その型に適用できない統計量がある</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">元データと出力表を分けて確認</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">欠損値と「計算対象外」を区別</td>
</tr>
<tr>
<td style="min-width: 3em; white-space: nowrap; padding: 0.2em 0.4em;">meanが代表値として不自然</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">一部の極端な値に引っ張られた</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">meanと50%・maxを比較</td>
<td style="white-space: nowrap; padding: 0.2em 0.4em;">元データと分布を確認する</td>
</tr>
</tbody>
</table>
</div>
<p>describe()はエラーを出さずに結果を返すことが多いため、<strong>動いたことと、正しく解釈できたことは別</strong>です。</p>
<h2><span id="toc19">データ分析では「実データ→構造→分布→次の処理」の順で使う</span></h2>

<p>describe()は、データ分析の「確認」段階で使います。次の順序にすると、結果を表示するだけで終わりません。</p>

<ol>
<li>
<code>head()</code>で列名と実際の値を見る</li>
<li>
<code>info()</code>や<code>dtypes</code>で型と非欠損数を確認する</li>
<li>
<code>describe()</code>で件数、中心、ばらつき、範囲を読む</li>
<li>問題に応じて欠損処理や型変換を行う</li>
<li>ヒストグラムや箱ひげ図で分布を可視化する</li>
<li>必要に応じて列同士の関係を確認する</li>
</ol>

<p>列同士の関係を調べる段階では、<a href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方</a>へ進めます。ただし、describe()は各列の分布、corr()は列と列の関係を見るメソッドであり、役割が異なります。</p>

<p>自分のデータへ置き換えるときは、次の点を確認してください。</p>

<ul>
<li>countは元の行数と一致しているか</li>
<li>集計したい列は数値型になっているか</li>
<li>meanと50%が大きく離れていないか</li>
<li>min・maxは現実的な値か</li>
<li>単位の違う列のstdを単純比較していないか</li>
<li>
<code>include='all'</code>のNaNを元データの欠損と混同していないか</li>
</ul>
<h2><span id="toc20">まとめ：describe()は結果を読んで次の処理を決めるために使う</span></h2>

<ul>
<li>
<code>describe()</code>は、列の件数・中心・ばらつき・範囲をまとめて確認する</li>
<li>結果は<code>count</code>→<code>mean</code>と<code>50%</code>→<code>std</code>→四分位数と<code>min</code>・<code>max</code>の順で読む</li>
<li>
<code>count</code>は欠損値を除いた件数で、DataFrameの行数とは限らない</li>
<li>
<code>50%</code>は平均値ではなく中央値</li>
<li>meanと50%の差は、値の偏りや極端な値へ気づく手がかりになる</li>
<li>
<code>std</code>はばらつきの目安だが、単位や値の規模も踏まえて判断する</li>
<li>文字列列では<code>unique</code>・<code>top</code>・<code>freq</code>などが表示される</li>
<li>
<code>include='all'</code>のNaNは、元データの欠損ではなく、その型に統計量を適用できない場合もある</li>
<li>実データはhead()、構造はinfo()、分布はdescribe()で確認する</li>
<li>describe()の結果に応じて、欠損処理、型変換、可視化へ進む</li>
</ul>

<p>describe()の表を表示できたら、平均値だけを見るのではなく、複数の項目を組み合わせて読むことが大切です。</p>
<h2><span id="toc21">関連記事</span></h2>

<ul>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門｜作り方と基本操作を初心者向けに解説</a></li>
<li><a href="https://pythondatalab.com/pandas-head/">pandas head()の使い方｜df.head()で先頭5行を表示・tail()との違いも解説</a></li>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
<li><a href="https://pythondatalab.com/pandas-select-dtypes/">pandas select_dtypes()の使い方｜データ型で列を選ぶ方法</a></li>
<li><a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方｜文字列の数字を数値に変換する方法</a></li>
<li><a href="https://pythondatalab.com/pandas-astype/">pandas astype()の使い方｜文字列・整数・小数の型変換とエラー対処</a></li>
<li><a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方｜欠損値を埋める方法</a></li>
<li><a href="https://pythondatalab.com/pandas-isnull/">欠損値を可視化して攻略！Pandas isnullとヒートマップ活用術</a></li>
<li><a href="https://pythondatalab.com/matplotlib-hist-boxplot/">Matplotlib ヒストグラム＆箱ひげ図 入門</a></li>
<li><a href="https://pythondatalab.com/pandas-corr/">pandas corr()の使い方｜相関係数・相関行列を初心者向けに解説</a></li>
<li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html" target="_blank">pandas.DataFrame.describe公式ドキュメント</a></li>
</ul>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc22"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p></div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1787613607632" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">pandasのdescribe()は何をするメソッドですか？</span></h3>
<div class="rank-math-answer ">

<p>DataFrameやSeriesの記述統計量をまとめて返すメソッドです。数値列では件数、平均値、標準偏差、最小値、四分位数、最大値などを確認できます。</p>

</div>
</div>
<div id="faq-question-1787613629247" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">countはDataFrameの行数と同じですか？</span></h3>
<div class="rank-math-answer ">

<p>必ずしも同じではありません。describe()のcountは、その列の欠損していない値を数えます。元データが8行でも欠損値が1件あれば、その列のcountは7です。</p>

</div>
</div>
<div id="faq-question-1787613643069" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc25">50%は平均値ですか？</span></h3>
<div class="rank-math-answer ">

<p>いいえ。50%は中央値です。平均値はmeanに表示されます。meanと50%が大きく離れている場合は、一部の大きな値や小さな値の影響を確認します。</p>

</div>
</div>
<div id="faq-question-1787613661321" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">数値列しか表示されないのはなぜですか？</span></h3>
<div class="rank-math-answer ">

<p>数値列を含むDataFrameに引数なしでdescribe()を使うと、初期設定では数値列が対象になるためです。文字列列は列を個別に選ぶか、<code>include='object'</code>や<code>include='all'</code>などを目的に応じて指定します。</p>

</div>
</div>
<div id="faq-question-1787613668410" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">include=&#8217;all&#8217;でNaNが表示されるのは異常ですか？</span></h3>
<div class="rank-math-answer ">

<p>異常とは限りません。数値列のuniqueや文字列列のmeanのように、そのデータ型には適用されない統計量がNaNになる場合があります。元データの欠損値とは分けて考えます。</p>

</div>
</div>
<div id="faq-question-1787613692751" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">describe()とinfo()の違いは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>describe()は値の分布を要約し、info()は行数、列名、データ型、非欠損数などDataFrameの構造を表示します。データを読み込んだ直後は両方を使うと役割を補い合えます。</p>

</div>
</div>
<div id="faq-question-1787613702909" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">標準偏差が大きいとはどういう意味ですか？</span></h3>
<div class="rank-math-answer ">

<p>一般には、値が平均の周りに広く散らばっていることを示します。ただし、大きさはデータの単位や規模にも左右されるため、単位の異なる列同士を数値だけで比較しないでください。</p>

</div>
</div>
<div id="faq-question-1787613719053" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">describe()だけで外れ値を判断できますか？</span></h3>
<div class="rank-math-answer ">

<p>describe()は、maxと四分位数が大きく離れているなど、極端な値の候補に気づく入口です。入力ミスか意味のある値かは、元データ、業務上の理由、ヒストグラムや箱ひげ図も確認して判断します。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味と結果の見方を解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-info-describe/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pandas head()の使い方｜f.head()で先頭5行を表示・行数を指定する方法</title>
		<link>https://pythondatalab.com/pandas-head/</link>
					<comments>https://pythondatalab.com/pandas-head/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sat, 12 Apr 2025 11:41:00 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false"></guid>

					<description><![CDATA[<p>pandasのhead()でDataFrameの先頭行を表示する方法を初心者向けに解説。df.head()で最初の5行が表示される仕組み、head(10)などの行数指定、tail()・sample()との違い、CSV読み込み後の確認方法まで出力例つきで紹介します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-head/">pandas head()の使い方｜f.head()で先頭5行を表示・行数を指定する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<style>
.pdl-article,.pdl-article *{box-sizing:border-box}
.pdl-article{max-width:100%;line-height:1.85;overflow-wrap:anywhere}
.pdl-article h2{margin-top:2.2em}
.pdl-article h3{margin-top:1.6em}
.pdl-article a{word-break:break-word}
.pdl-article code{font-family:Consolas,Monaco,"Courier New",monospace}
.pdl-article :not(pre)>code{padding:.12em .35em;border-radius:4px;background:#f3f4f6}
.pdl-code-scroll{width:100%;max-width:100%;margin:1.2em 0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.pdl-code-scroll pre{width:max-content;min-width:100%;max-width:none;margin:0;padding:1em;overflow:visible;white-space:pre;border-radius:6px;background:#1f2937;color:#f9fafb}
.pdl-code-scroll pre code{padding:0;background:transparent;color:inherit;white-space:inherit}
.pdl-table-scroll{width:100%;max-width:100%;margin:1.2em 0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.pdl-table-scroll table{width:100%;min-width:620px;border-collapse:collapse;border-spacing:0;background:#fff}
.pdl-table-scroll th,.pdl-table-scroll td{padding:.7em .8em;border:1px solid #9ca3af;text-align:left;vertical-align:top;word-break:normal;overflow-wrap:break-word}
.pdl-table-scroll th{background:#f3f4f6;font-weight:700}
.pdl-article blockquote{margin:1.2em 0;padding:.8em 1em;border-left:4px solid #2563eb;background:#eff6ff}
.pdl-article blockquote p{margin:0}
@media(max-width:600px){.pdl-article{font-size:16px}.pdl-code-scroll pre{font-size:13px}.pdl-table-scroll th,.pdl-table-scroll td{padding:.6em;font-size:14px}}
</style>
<div class="pdl-article">
<p>CSVやExcelを読み込んだあと、「データが正しく入っているか、まず数行だけ確認したい」と思うことはありませんか。</p>
<p>pandasの<code>head()</code>は、DataFrameやSeriesの<strong>先頭行を表示するメソッド</strong>です。引数を省略して<code>df.head()</code>と書くと先頭5行、<code>df.head(3)</code>なら先頭3行を表示します。</p>
<p>この記事では、Google Colabでそのまま動かせるコードを使い、<code>head()</code>の基本、<code>tail()</code>・<code>sample()</code>との違い、CSVを読み込んだあとの確認手順まで解説します。コードの結果を見ながら進められるため、pandasを使い始めたばかりでも再現できます。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：df.head()でDataFrameの先頭5行を表示する</a></li><li><a href="#toc3" tabindex="0">サンプルDataFrameを用意する</a></li><li><a href="#toc4" tabindex="0">df.head()の基本的な使い方</a><ol><li><a href="#toc5" tabindex="0">引数なしのdf.head()は先頭5行を表示する</a></li><li><a href="#toc6" tabindex="0">df.head(3)で表示行数を指定する</a></li><li><a href="#toc7" tabindex="0">df.head(10)で元データより多い行数を指定した場合</a></li></ol></li><li><a href="#toc8" tabindex="0">head()・tail()・sample()の違い</a></li><li><a href="#toc9" tabindex="0">CSVを読み込んだあとにhead()で確認する流れ</a></li><li><a href="#toc10" tabindex="0">Google Colabではprint(df.head())が必要？</a></li><li><a href="#toc11" tabindex="0">head()の補足的な使い方</a><ol><li><a href="#toc12" tabindex="0">head(0)で列名だけ確認する</a></li><li><a href="#toc13" tabindex="0">Seriesでもhead()を使える</a></li><li><a href="#toc14" tabindex="0">先頭1行の「表」と「値」を区別する</a></li></ol></li><li><a href="#toc15" tabindex="0">よくあるミスと初心者向け注意点</a><ol><li><a href="#toc16" tabindex="0">1. head()で全データを表示したと思ってしまう</a></li><li><a href="#toc17" tabindex="0">2. head(10)なら必ず10行表示されると思ってしまう</a></li><li><a href="#toc18" tabindex="0">3. head()が元データを変更すると思ってしまう</a></li><li><a href="#toc19" tabindex="0">4. head()だけでデータ全体を判断する</a></li><li><a href="#toc20" tabindex="0">5. head(1)で取得した値をそのまま計算に使おうとする</a></li></ol></li><li><a href="#toc21" tabindex="0">実務の確認順：head()→info()→describe()</a></li><li><a href="#toc22" tabindex="0">まとめ</a></li><li><a href="#toc23" tabindex="0">関連記事</a></li><li><a href="#toc24" tabindex="0">公式ドキュメント</a><ol><li><a href="#toc25" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc26" tabindex="0">pandasのhead()は何をするメソッドですか？</a></li><li><a href="#toc27" tabindex="0">df.head()は何行表示しますか？</a></li><li><a href="#toc28" tabindex="0">df.head(10)とは何ですか？</a></li><li><a href="#toc29" tabindex="0">head()とtail()・sample()はどう使い分けますか？</a></li><li><a href="#toc30" tabindex="0">Google Colabではprint(df.head())が必要ですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2 id="この記事でわかること"><span id="toc1">この記事でわかること</span></h2>
<ul>
<li><code>df.head()</code>で先頭5行を表示する方法</li>
<li><code>df.head(3)</code>や<code>df.head(10)</code>で行数を指定する方法</li>
<li><code>head()</code>・<code>tail()</code>・<code>sample()</code>の違い</li>
<li>Google Colabで<code>print(df.head())</code>が必要になる場面</li>
<li>CSVを読み込んだあとにデータを確認する順番</li>
<li><code>head()</code>だけでは確認できないこと</li>
</ul>
<h2 id="先に結論dfheadでdataframeの先頭5行を表示する"><span id="toc2">先に結論：df.head()でDataFrameの先頭5行を表示する</span></h2>
<p>基本構文は次のとおりです。</p>
<div class="pdl-code-scroll"><div class="sourceCode" id="cb1"><pre class="sourceCode python"><code class="language-python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>df.head()     <span class="co"># 先頭5行</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>df.head(<span class="dv">3</span>)    <span class="co"># 先頭3行</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>df.head(<span class="dv">10</span>)   <span class="co"># 先頭10行</span></span></code></pre></div></div>
<p><code>head()</code>の丸括弧内には、表示したい行数を整数で指定します。何も指定しない場合の標準値は5です。</p>
<p><code>head()</code>は元のDataFrameを書き換えません。データを削除する処理ではなく、先頭部分を確認するための処理です。</p>
<h2 id="サンプルdataframeを用意する"><span id="toc3">サンプルDataFrameを用意する</span></h2>
<p>まず、6件の売上データをNotebook内で作ります。外部ファイルは必要ありません。</p><div class="pdl-code-scroll"><pre><code class="language-python">import pandas as pd

try:
    from IPython.display import display
except ImportError:
    # 通常のPython環境で実行した場合の表示用
    def display(obj):
        print(obj)

df = pd.DataFrame({
    "商品": ["A", "B", "C", "D", "E", "F"],
    "売上": [1200, 980, 1500, 1100, 1350, 1600]
})

df</code></pre></div><p>このDataFrameには、<code>商品</code>列と<code>売上</code>列があり、全部で6行あります。以降は同じ<code>df</code>を使うため、コードと出力の違いを比較しやすくなります。</p>
<h2 id="dfheadの基本的な使い方"><span id="toc4">df.head()の基本的な使い方</span></h2>
<h3 id="引数なしのdfheadは先頭5行を表示する"><span id="toc5">引数なしのdf.head()は先頭5行を表示する</span></h3>
<p>目的は、DataFrameの先頭部分を素早く確認することです。</p><div class="pdl-code-scroll"><pre><code class="language-python">df.head()</code></pre></div><p>出力にはA〜Eの5行が表示されます。元のDataFrameは6行ありますが、引数を省略した<code>head()</code>は標準で先頭5行だけを返します。</p>
<p>列名、値の入り方、文字列や数値が想定どおり並んでいるかを最初に確認するときに便利です。</p>
<h3 id="dfhead3で表示行数を指定する"><span id="toc6">df.head(3)で表示行数を指定する</span></h3>
<p>3行だけ確認したい場合は、丸括弧内に<code>3</code>を指定します。</p><div class="pdl-code-scroll"><pre><code class="language-python">df.head(3)</code></pre></div><p>A〜Cの3行が表示されます。指定した数が「先頭から表示する行数」です。行番号3までという意味ではありません。</p>
<h3 id="dfhead10で元データより多い行数を指定した場合"><span id="toc7">df.head(10)で元データより多い行数を指定した場合</span></h3>
<p>元のDataFrameは6行です。ここで10行を指定して、結果を確認します。</p><div class="pdl-code-scroll"><pre><code class="language-python">df.head(10)</code></pre></div><p>エラーにはならず、存在する6行がすべて表示されます。<code>head(10)</code>を実行しても、DataFrameに10行未満しかなければ、存在しない行が追加されることはありません。</p>
<h2 id="headtailsampleの違い"><span id="toc8">head()・tail()・sample()の違い</span></h2>
<p>どの位置を見たいかによって、使うメソッドが変わります。</p>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>メソッド</th>
<th>確認する位置</th>
<th>基本構文</th>
<th>主な用途</th>
<th>表示順・再現性</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>head()</code></td>
<td>先頭</td>
<td><code>df.head(3)</code></td>
<td>読み込み直後の列名や値を確認</td>
<td>元の先頭順</td>
</tr>
<tr class="even">
<td><code>tail()</code></td>
<td>末尾</td>
<td><code>df.tail(3)</code></td>
<td>最終行や直近データを確認</td>
<td>元の末尾順</td>
</tr>
<tr class="odd">
<td><code>sample()</code></td>
<td>ランダム</td>
<td><code>df.sample(3)</code></td>
<td>先頭に偏らず複数箇所を見る</td>
<td>通常は実行ごとに変わる</td>
</tr>
</tbody>
</table></div>
<p>同じDataFrameから3行ずつ表示して比べます。</p><div class="pdl-code-scroll"><pre><code class="language-python">print("head(3)：先頭3行")
display(df.head(3))

print("tail(3)：末尾3行")
display(df.tail(3))

print("sample(3)：ランダムな3行")
display(df.sample(3, random_state=0))</code></pre></div><p><code>head(3)</code>はA〜C、<code>tail(3)</code>はD〜Fを表示します。<code>sample(3)</code>はデータ全体から3行を選ぶため、先頭や末尾だけに偏りません。</p>
<p>記事と同じ結果を再現できるよう、<code>sample()</code>には<code>random_state=0</code>を指定しています。実務でランダムな行を毎回選び直したい場合は、この指定を省略できます。</p>
<blockquote>
<p><strong>ポイント</strong>：読み込み直後はまず<code>head()</code>、末尾も確認したいなら<code>tail()</code>、全体から偏りなく見たいなら<code>sample()</code>と使い分けます。</p>
</blockquote>
<h2 id="csvを読み込んだあとにheadで確認する流れ"><span id="toc9">CSVを読み込んだあとにhead()で確認する流れ</span></h2>
<p>実務では、CSVファイルを<code>read_csv()</code>で読み込んだ直後に<code>head()</code>を使うことがよくあります。</p>
<p>ここではColabだけで再現できるよう、先ほどのDataFrameからサンプルCSVを作成してから読み込みます。</p><div class="pdl-code-scroll"><pre><code class="language-python"># Colabの作業フォルダにサンプルCSVを作成
df.to_csv("sales.csv", index=False, encoding="utf-8")

# CSVをDataFrameとして読み込む
sales_df = pd.read_csv("sales.csv")

# 読み込み結果の先頭を確認
sales_df.head()</code></pre></div><p>先頭5行が正しく表示されれば、列名と値を読み込めていることを最初に確認できます。</p>
<p>ただし、<code>head()</code>だけではデータ型や欠損数までは十分に分かりません。CSVのアップロードやGoogle Driveからの読み込みを詳しく知りたい場合は、<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>を参照してください。</p>
<h2 id="google-colabではprintdfheadが必要"><span id="toc10">Google Colabではprint(df.head())が必要？</span></h2>
<p>セルの最後に<code>df.head()</code>を書く場合、Google Colabは結果を表形式で表示するため、通常は<code>print()</code>を付けなくても構いません。</p><div class="pdl-code-scroll"><pre><code class="language-python"># セルの最後なら表形式で表示される
df.head()</code></pre></div><p>一方、1つのセルで複数の結果を確実に表示したい場合は、<code>display()</code>が分かりやすい方法です。</p><div class="pdl-code-scroll"><pre><code class="language-python">display(df.head(2))
display(df.tail(2))</code></pre></div><p><code>print(df.head())</code>でも内容は確認できますが、Colabではテキスト形式になります。表として見たい場合は、セル末尾に式を書くか<code>display()</code>を使うと読みやすくなります。</p>
<h2 id="headの補足的な使い方"><span id="toc11">head()の補足的な使い方</span></h2>
<h3 id="head0で列名だけ確認する"><span id="toc12">head(0)で列名だけ確認する</span></h3>
<p><code>head(0)</code>は、データ行を表示せず、列の構造だけを返します。</p><div class="pdl-code-scroll"><pre><code class="language-python">df.head(0)</code></pre></div><p>0行でも<code>商品</code>と<code>売上</code>の列名は残ります。ただし、列名だけを一覧で取得する目的なら<code>df.columns</code>も使えます。</p>
<h3 id="seriesでもheadを使える"><span id="toc13">Seriesでもhead()を使える</span></h3>
<p>DataFrameの1列を選ぶとSeriesになります。Seriesでも<code>head()</code>の基本は同じです。</p><div class="pdl-code-scroll"><pre><code class="language-python">sales_series = df["売上"]
sales_series.head(3)</code></pre></div><p>売上列の先頭3件、1200・980・1500が表示されます。DataFrameだけでなく、1列のSeriesを確認するときにも使えます。</p>
<h3 id="先頭1行の表と値を区別する"><span id="toc14">先頭1行の「表」と「値」を区別する</span></h3>
<p><code>df.head(1)</code>は1行のDataFrameを返します。一方、<code>df.iloc[0]</code>は先頭行をSeriesとして取り出します。</p><div class="pdl-code-scroll"><pre><code class="language-python">print("head(1)の型:", type(df.head(1)).__name__)
print("iloc[0]の型:", type(df.iloc[0]).__name__)

display(df.head(1))
display(df.iloc[0])</code></pre></div><p>見た目が似ていても戻り値の型が異なります。先頭行を表の形で確認するなら<code>head(1)</code>、位置を指定して行や値を取り出すなら<code>iloc</code>を使います。詳しい使い分けは、<a href="https://pythondatalab.com/pandas-loc-iloc/">pandasのlocとilocの違い</a>で確認できます。</p>
<h2 id="よくあるミスと初心者向け注意点"><span id="toc15">よくあるミスと初心者向け注意点</span></h2>
<h3 id="1-headで全データを表示したと思ってしまう"><span id="toc16">1. head()で全データを表示したと思ってしまう</span></h3>
<p><code>df.head()</code>が表示するのは標準で先頭5行だけです。DataFrame全体が5行とは限りません。全行数は<code>df.shape[0]</code>で確認できます。</p>
<h3 id="2-head10なら必ず10行表示されると思ってしまう"><span id="toc17">2. head(10)なら必ず10行表示されると思ってしまう</span></h3>
<p>元データが10行未満なら、存在する行だけが返ります。エラーにはなりません。</p>
<h3 id="3-headが元データを変更すると思ってしまう"><span id="toc18">3. head()が元データを変更すると思ってしまう</span></h3>
<p><code>head()</code>は表示対象となる先頭部分を返すだけで、元のDataFrameを削除・並べ替え・上書きしません。</p>
<h3 id="4-headだけでデータ全体を判断する"><span id="toc19">4. head()だけでデータ全体を判断する</span></h3>
<p>先頭行に欠損値がなくても、後半に欠損値があるかもしれません。先頭数行を見ただけでは、データ型、欠損数、分布、外れ値は判断できません。</p>
<h3 id="5-head1で取得した値をそのまま計算に使おうとする"><span id="toc20">5. head(1)で取得した値をそのまま計算に使おうとする</span></h3>
<p><code>head(1)</code>の戻り値はDataFrameです。1つの値が必要なら、目的に応じて<code>iloc</code>や<code>at</code>などを使います。</p>
<h2 id="実務の確認順headinfodescribe"><span id="toc21">実務の確認順：head()→info()→describe()</span></h2>
<p>CSVを読み込んだあとは、次の順番で確認すると迷いにくくなります。</p>
<div class="pdl-table-scroll"><table>
<thead>
<tr class="header">
<th>確認したいこと</th>
<th>メソッド</th>
<th>分かること</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>列名や値の入り方</td>
<td><code>head()</code></td>
<td>先頭数行、表記、読込結果の見た目</td>
</tr>
<tr class="even">
<td>行数・列数・型・欠損の概要</td>
<td><code>info()</code></td>
<td>Non-Null Count、dtype、メモリ使用量</td>
</tr>
<tr class="odd">
<td>数値の中心・ばらつき・範囲</td>
<td><code>describe()</code></td>
<td>count、mean、std、最小値、四分位数、最大値</td>
</tr>
</tbody>
</table></div>
<p>目的は、読み込んだデータを段階的に確認することです。</p><div class="pdl-code-scroll"><pre><code class="language-python">print("1. 先頭行を確認")
display(sales_df.head())

print("2. 構造・データ型・欠損の概要を確認")
sales_df.info()

print("3. 数値列の統計量を確認")
display(sales_df.describe())</code></pre></div><p>この例では、<code>head()</code>で値の入り方、<code>info()</code>で2列の型と非欠損数、<code>describe()</code>で売上の平均値や範囲を確認できます。</p>
<p>DataFrameそのものの基本は<a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？</a>、構造確認は<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>、統計量の読み方は<a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方</a>で詳しく解説しています。</p>

<h2 id="まとめ"><span id="toc22">まとめ</span></h2>
<ul>
<li><code>df.head()</code>はDataFrameの先頭5行を表示する</li>
<li><code>df.head(n)</code>で表示する行数を指定できる</li>
<li>元データより大きなnを指定しても、存在する行だけが返る</li>
<li>先頭は<code>head()</code>、末尾は<code>tail()</code>、ランダムな行は<code>sample()</code></li>
<li><code>head()</code>は元のDataFrameを変更しない</li>
<li>CSV読込後は<code>head()</code>→<code>info()</code>→<code>describe()</code>の順に確認すると分かりやすい</li>
<li><code>head()</code>だけでは、データ全体の欠損・型・分布までは判断できない</li>
</ul>
<p>まず<code>df.head()</code>で読み込み結果を確認し、必要に応じて<code>info()</code>や<code>describe()</code>へ進みましょう。</p>
<h2 id="関連記事"><span id="toc23">関連記事</span></h2>
<ul>
<li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a></li>
<li><a href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？作り方・基本操作・Seriesとの違い</a></li>
<li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方｜Non-Null Count・データ型・欠損値の見方</a></li>
<li><a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方｜統計量の意味と結果の見方</a></li>
<li><a href="https://pythondatalab.com/pandas-loc-iloc/">Pandas locとilocの違い｜行・列の抽出・スライス・条件指定</a></li>
</ul>
<h2 id="公式ドキュメント"><span id="toc24">公式ドキュメント</span></h2>
<ul>
<li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.head.html" target="_blank">pandas.DataFrame.head — pandas documentation</a></li>
<li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.tail.html" target="_blank">pandas.DataFrame.tail — pandas documentation</a></li>
<li><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sample.html" target="_blank">pandas.DataFrame.sample — pandas documentation</a></li>
</ul>

<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc25"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
 <p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>

</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1781109657476" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc26">pandasのhead()は何をするメソッドですか？</span></h3>
<div class="rank-math-answer ">

<p>DataFrameまたはSeriesの先頭から指定した行数を返すメソッドです。元のデータは変更しません。</p>

</div>
</div>
<div id="faq-question-1781109677336" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc27">df.head()は何行表示しますか？</span></h3>
<div class="rank-math-answer ">

<p>引数を省略すると、先頭5行を表示します。</p>

</div>
</div>
<div id="faq-question-1781109692027" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">df.head(10)とは何ですか？</span></h3>
<div class="rank-math-answer ">

<p>DataFrameの先頭から10行を表示する指定です。元データが10行未満なら、存在する行だけを表示します。</p>

</div>
</div>
<div id="faq-question-1781109708784" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">head()とtail()・sample()はどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>先頭を見るなら<code>head()</code>、末尾を見るなら<code>tail()</code>、データ全体からランダムに確認するなら<code>sample()</code>を使います。</p>

</div>
</div>
<div id="faq-question-1781109725040" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">Google Colabではprint(df.head())が必要ですか？</span></h3>
<div class="rank-math-answer ">

<p><code>head()</code> は先頭行を表示し、<code>sample()</code> はランダムに行を表示します。データの先頭セルの最後に<code>df.head()</code>を書く場合は通常不要です。1つのセルで複数の表を表示するときは<code>display()</code>が便利です。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-head/">pandas head()の使い方｜f.head()で先頭5行を表示・行数を指定する方法</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-head/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pandas DataFrameとは？作り方・基本操作・Seriesとの違いを初心者向けに解説</title>
		<link>https://pythondatalab.com/pandas-dataframe/</link>
					<comments>https://pythondatalab.com/pandas-dataframe/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 30 Mar 2025 14:51:24 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=636</guid>

					<description><![CDATA[<p>Pandas DataFrameとは何かを、Google Colabでの作り方から基本操作まで初心者向けに解説します。辞書・リストからの作成、列選択、列追加、条件抽出、並べ替え、集計、Seriesとの違い、出力結果の確認方法がわかります。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？作り方・基本操作・Seriesとの違いを初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>
<style>
  .colab-article pre.line-numbers,
  .colab-article pre.colab-output {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    padding: 1em;
  }
  .colab-article .table-scroll {
    overflow-x: auto;
    margin: 0;
  }
  .colab-article table.wp-block-table {
    width: auto;
    border-collapse: collapse !important;
    border-spacing: 0 !important;
    border: 1px solid #9aa7b3 !important;
  }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    white-space: nowrap;
    padding: 0.2em 0.4em;
    border: 1px solid #9aa7b3 !important;
  }
  .colab-article table.wp-block-table thead th {
    background: #eef3f7 !important;
    font-weight: 700 !important;
  }
  .colab-article table.wp-block-table th:first-child,
  .colab-article table.wp-block-table td:first-child {
    min-width: 3em;
  }
</style>
<div class="colab-article">

<p>Pandasを学び始めると、最初に登場するのが<strong>DataFrame（データフレーム）</strong>です。しかし、<code>pd.DataFrame()</code>で表を作れても、「辞書とリストのどちらを使うのか」「表示された表のどこを確認するのか」「次に何をすればよいのか」で迷いやすいものです。</p>
<p>この記事では、Google Colabで小さな売上データを作り、<strong>作成→確認→列選択→列追加→条件抽出→並べ替え→集計</strong>までを同じDataFrameで実行します。コードを動かすだけでなく、出力の行・列・型を読み、想定外の結果を自分で確認する方法まで身につけます。</p>

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">先に結論：DataFrameは複数列を持つ表形式データに使う</a></li><li><a href="#toc3" tabindex="0">辞書から売上DataFrameを作る</a><ol><li><a href="#toc4" tabindex="0">実行目的と実行前の状態</a></li></ol></li><li><a href="#toc5" tabindex="0">DataFrameの行・列・インデックスを確認する</a><ol><li><a href="#toc6" tabindex="0">図解：DataFrameのどこが行・列・インデックスか</a></li></ol></li><li><a href="#toc7" tabindex="0">辞書のリストから作る場合との違い</a></li><li><a href="#toc8" tabindex="0">作成後は5項目を確認する</a></li><li><a href="#toc9" tabindex="0">DataFrameとSeriesを使い分ける</a></li><li><a href="#toc10" tabindex="0">同じDataFrameで基本操作をつなげる</a><ol><li><a href="#toc11" tabindex="0">必要な列を選ぶ</a></li><li><a href="#toc12" tabindex="0">売上列を追加する</a></li><li><a href="#toc13" tabindex="0">売上1,000円以上の商品を抽出する</a></li><li><a href="#toc14" tabindex="0">売上の高い順に並べる</a></li><li><a href="#toc15" tabindex="0">カテゴリ別に売上を集計する</a></li></ol></li><li><a href="#toc16" tabindex="0">コードは動くが結果を誤解しやすい例</a><ol><li><a href="#toc17" tabindex="0">数字が文字列のままでもDataFrameは作れる</a></li><li><a href="#toc18" tabindex="0">抽出・並べ替えは元データを自動変更しない</a></li></ol></li><li><a href="#toc19" tabindex="0">DataFrame作成時のエラーを確認して修正する</a><ol><li><a href="#toc20" tabindex="0">NameError: name &#x27;pd&#x27; is not defined</a></li><li><a href="#toc21" tabindex="0">ValueError: All arrays must be of the same length</a></li><li><a href="#toc22" tabindex="0">KeyErrorで列を選べない</a></li></ol></li><li><a href="#toc23" tabindex="0">自分のデータへ置き換えるときのチェックリスト</a></li><li><a href="#toc24" tabindex="0">DataFrameから次の分析へ進む</a></li><li><a href="#toc25" tabindex="0">まとめ</a></li><li><a href="#toc26" tabindex="0">関連記事</a><ol><li><a href="#toc27" tabindex="0"> カテゴリから探す</a></li><li><a href="#toc28" tabindex="0">DataFrameとSeriesはどう使い分けますか？</a></li><li><a href="#toc29" tabindex="0">辞書と辞書のリストでは、どちらからDataFrameを作ればよいですか？</a></li><li><a href="#toc30" tabindex="0">df["列名"]とdf[["列名"]]は何が違いますか？</a></li><li><a href="#toc31" tabindex="0">All arrays must be of the same lengthはどう直しますか？</a></li><li><a href="#toc32" tabindex="0">DataFrameを作った後、最初に何を確認すればよいですか？</a></li><li><a href="#toc33" tabindex="0">行を追加するときにappend()を使ってもよいですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>
<ul>
  <li>DataFrameの行・列・インデックスの意味</li>
  <li>元データの形に合うDataFrameの作り方</li>
  <li>作成後に<code>shape</code>・<code>columns</code>・<code>dtypes</code>・<code>head()</code>・<code>info()</code>で確認する手順</li>
  <li>DataFrameとSeries、<code>df[&quot;列名&quot;]</code>と<code>df[[&quot;列名&quot;]]</code>の違い</li>
  <li>列追加・条件抽出・並べ替え・集計の基本的な流れ</li>
  <li>列の長さ、列名、データ型が原因の失敗を確認して直す方法</li>
</ul>
<p>DataFrameはPandas学習の入口です。ここで全操作を暗記する必要はありません。まず表を正しく作って確認し、目的に合う個別の操作へ進めるようになることが目標です。</p>
<h2><span id="toc2">先に結論：DataFrameは複数列を持つ表形式データに使う</span></h2>
<p>DataFrameは、<strong>行と列で構成され、列ごとに異なるデータ型を持てる2次元のデータ構造</strong>です。Excelの表に似ていますが、Pythonコードで確認・加工・集計を再現できる点が特徴です。</p>
<p>元データの状態に応じて、最初の作り方を選びます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>元データの状態</th>
        <th>選ぶ方法</th>
        <th>最小構文</th>
        <th>向いている場面</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>列ごとに値がまとまっている</td>
        <td>辞書から作る</td>
        <td><code>pd.DataFrame(data)</code></td>
        <td>小さな練習データ、列単位のデータ</td>
      </tr>
      <tr>
        <td>1件ずつ行としてまとまっている</td>
        <td>辞書のリストから作る</td>
        <td><code>pd.DataFrame(records)</code></td>
        <td>API結果、レコード形式のデータ</td>
      </tr>
      <tr>
        <td>CSVファイルに保存されている</td>
        <td>CSVを読み込む</td>
        <td><code>pd.read_csv(path)</code></td>
        <td>実務データ、配布データ</td>
      </tr>
      <tr>
        <td>Excelファイルに保存されている</td>
        <td>Excelを読み込む</td>
        <td><code>pd.read_excel(path)</code></td>
        <td>シート形式の業務データ</td>
      </tr>
    </tbody>
  </table>
</div>
<p>どの方法でも、作成後はすぐ加工せず、<strong>行数・列名・データ型・欠損・先頭の値</strong>を確認します。</p>
<h2><span id="toc3">辞書から売上DataFrameを作る</span></h2>
<h3><span id="toc4">実行目的と実行前の状態</span></h3>
<p>商品名・カテゴリ・単価・数量が列ごとにまとまった辞書を、DataFrameへ変換します。各列の要素数は4件でそろえています。</p>
<pre class="line-numbers language-python"><code class="language-python">import pandas as pd

data = {
    "商品名": ["ノート", "ペン", "電卓", "ファイル"],
    "カテゴリ": ["文具", "文具", "事務用品", "文具"],
    "単価": [120, 80, 1500, 300],
    "数量": [3, 10, 2, 5],
}

df = pd.DataFrame(data)
df</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>120</td>
        <td>3</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>80</td>
        <td>10</td>
      </tr>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>事務用品</td>
        <td>1500</td>
        <td>2</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>文具</td>
        <td>300</td>
        <td>5</td>
      </tr>
    </tbody>
  </table>
</div>
<p>辞書のキーが列名になり、各リストの同じ位置にある値が1行になります。左端の<code>0</code>〜<code>3</code>は<strong>インデックス</strong>です。通常のデータ列ではなく、行を識別するラベルとして使われます。</p>
<p>最初に見るのは、列名が「商品名・カテゴリ・単価・数量」になっているか、4行すべてが表示されているか、値が意図した列に入っているかです。</p>
<h2><span id="toc5">DataFrameの行・列・インデックスを確認する</span></h2>
<h3><span id="toc6">図解：DataFrameのどこが行・列・インデックスか</span></h3>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>インデックス（行ラベル）↓／列名→</th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><strong>0</strong></td>
        <td>ノート</td>
        <td>文具</td>
        <td>120</td>
        <td>3</td>
      </tr>
      <tr>
        <td><strong>1</strong></td>
        <td>ペン</td>
        <td>文具</td>
        <td>80</td>
        <td>10</td>
      </tr>
    </tbody>
  </table>
</div>
<p>上端の「商品名・カテゴリ・単価・数量」が<strong>列名</strong>、左端の<code>0</code>・<code>1</code>が<strong>インデックス</strong>、横方向の1組が<strong>行</strong>です。たとえば、インデックス<code>0</code>と「単価」が交差するセルの値は<code>120</code>です。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>要素</th>
        <th>このDataFrameでの例</th>
        <th>意味</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>行</td>
        <td><code>0</code>〜<code>3</code>の4行</td>
        <td>1件分のデータ</td>
      </tr>
      <tr>
        <td>列</td>
        <td>商品名、カテゴリ、単価、数量</td>
        <td>同じ種類の値のまとまり</td>
      </tr>
      <tr>
        <td>インデックス</td>
        <td><code>0</code>、<code>1</code>、<code>2</code>、<code>3</code></td>
        <td>行を識別するラベル</td>
      </tr>
      <tr>
        <td>セル</td>
        <td>商品名列の「ノート」など</td>
        <td>行と列が交差する1つの値</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>shape</code>は行数と列数、<code>columns</code>は列名、<code>index</code>は行ラベルを返します。</p>
<pre class="line-numbers language-python"><code class="language-python">print("行数・列数:", df.shape)
print("列名:", df.columns.tolist())
print("インデックス:", df.index.tolist())</code></pre>
<pre class="colab-output">行数・列数: (4, 4)
列名: ['商品名', 'カテゴリ', '単価', '数量']
インデックス: [0, 1, 2, 3]
</pre>
<p><code>df.shape</code>の結果は<code>(4, 4)</code>です。<strong>先が行数、後ろが列数</strong>なので、「4行4列」と読みます。<code>columns</code>と<code>index</code>も、作成前の想定と一致していることを確認します。</p>
<h2><span id="toc7">辞書のリストから作る場合との違い</span></h2>
<p>1件ずつ「商品名・カテゴリ・単価・数量」がまとまっている場合は、辞書のリストが自然です。作り方は異なっても、完成する表の形は同じです。</p>
<pre class="line-numbers language-python"><code class="language-python">records = [
    {"商品名": "ノート", "カテゴリ": "文具", "単価": 120, "数量": 3},
    {"商品名": "ペン", "カテゴリ": "文具", "単価": 80, "数量": 10},
    {"商品名": "電卓", "カテゴリ": "事務用品", "単価": 1500, "数量": 2},
    {"商品名": "ファイル", "カテゴリ": "文具", "単価": 300, "数量": 5},
]

df_records = pd.DataFrame(records)
df_records</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>120</td>
        <td>3</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>80</td>
        <td>10</td>
      </tr>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>事務用品</td>
        <td>1500</td>
        <td>2</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>文具</td>
        <td>300</td>
        <td>5</td>
      </tr>
    </tbody>
  </table>
</div>
<p>列ごとの辞書を無理に辞書のリストへ直す必要はありません。<strong>元データが列単位なら辞書、行単位なら辞書のリスト</strong>と判断すると迷いにくくなります。</p>
<p>CSVを使う場合は、ファイルパスを指定して<code>pd.read_csv(&quot;ファイルパス&quot;)</code>とします。Google ColabへのアップロードやDrive接続は、<a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a>で詳しく確認できます。Excelの場合は<a href="https://pythondatalab.com/pandas-read-excel/">pandas read_excel()の使い方</a>へ進んでください。</p>
<h2><span id="toc8">作成後は5項目を確認する</span></h2>
<p>DataFrameが表示されても、中身が正しいとは限りません。加工前に次の5項目を確認します。</p>
<ol>
  <li><code>shape</code>：想定した行数と列数か</li>
  <li><code>columns</code>：列名の空白や表記違いがないか</li>
  <li><code>dtypes</code>：数値や日付が適切な型か</li>
  <li><code>head()</code>：先頭の値と列の対応が正しいか</li>
  <li><code>info()</code>：Non-Null Countと型に異常がないか</li>
</ol>
<p>まず、先頭行とデータ型を確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">print(df.head())
print("\nデータ型:")
print(df.dtypes)</code></pre>
<pre class="colab-output">    商品名  カテゴリ    単価  数量
0   ノート    文具   120   3
1    ペン    文具    80  10
2    電卓  事務用品  1500   2
3  ファイル    文具   300   5

データ型:
商品名     object
カテゴリ    object
単価       int64
数量       int64
dtype: object
</pre>
<p><code>商品名</code>と<code>カテゴリ</code>は文字列を持つ<code>object</code>型、<code>単価</code>と<code>数量</code>は整数の<code>int64</code>型です。今回の売上計算では単価と数量が数値型であることが重要です。</p>
<p><code>head()</code>は先頭だけを確認するメソッドです。全行の欠損や異常を保証するものではありません。詳しい使い分けは<a href="https://pythondatalab.com/pandas-head/">pandas head()の使い方</a>を参照してください。</p>
<pre class="line-numbers language-python"><code class="language-python">df.info()</code></pre>
<pre class="colab-output">&lt;class 'pandas.core.frame.DataFrame'&gt;
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   商品名     4 non-null      object
 1   カテゴリ    4 non-null      object
 2   単価      4 non-null      int64 
 3   数量      4 non-null      int64 
dtypes: int64(2), object(2)
memory usage: 260.0+ bytes
</pre>
<p><code>info()</code>では4行すべてについて各列の<code>Non-Null Count</code>が<code>4 non-null</code>なので、この例に欠損値はありません。<code>Non-Null Count</code>は欠損数ではなく、<strong>欠損していない値の数</strong>です。</p>
<p>実データで構造・型・欠損を診断する方法は<a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a>、値の分布は<a href="https://pythondatalab.com/pandas-info-describe/">pandas describe()の使い方</a>で確認できます。</p>
<h2><span id="toc9">DataFrameとSeriesを使い分ける</span></h2>
<p>DataFrameは2次元の表、Seriesは1次元のデータです。同じ1列を選んでも、角括弧の数で戻り値が変わります。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>書き方</th>
        <th>戻り値</th>
        <th>次元</th>
        <th>選ぶ場面</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><code>df[&quot;単価&quot;]</code></td>
        <td>Series</td>
        <td>1次元</td>
        <td>1列を計算・集計したい</td>
      </tr>
      <tr>
        <td><code>df[[&quot;単価&quot;]]</code></td>
        <td>DataFrame</td>
        <td>2次元</td>
        <td>1列でも表形式を保ちたい</td>
      </tr>
    </tbody>
  </table>
</div>
<p>実際の型と表示の違いを確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">price_series = df["単価"]
price_frame = df[["単価"]]

print("1組の角括弧:", type(price_series).__name__, price_series.shape)
print("2組の角括弧:", type(price_frame).__name__, price_frame.shape)
price_frame</code></pre>
<pre class="colab-output">1組の角括弧: Series (4,)
2組の角括弧: DataFrame (4, 1)
</pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>単価</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>120</td>
      </tr>
      <tr>
        <td>1</td>
        <td>80</td>
      </tr>
      <tr>
        <td>2</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>3</td>
        <td>300</td>
      </tr>
    </tbody>
  </table>
</div>
<p><code>price_series</code>の形は<code>(4,)</code>、<code>price_frame</code>は<code>(4, 1)</code>です。見た目が似ていても型と次元が違うため、後続処理がDataFrameを前提にする場合は<code>df[[&quot;単価&quot;]]</code>を選びます。</p>
<h2><span id="toc10">同じDataFrameで基本操作をつなげる</span></h2>
<p>ここからは、作成した<code>df</code>を使って、列選択・計算列追加・条件抽出・並べ替え・集計を順番に行います。個別メソッドの引数を網羅するのではなく、DataFrameを分析へつなげる全体像を確認します。</p>
<h3><span id="toc11">必要な列を選ぶ</span></h3>
<p>複数列をDataFrameとして残すため、列名をリストで指定します。</p>
<pre class="line-numbers language-python"><code class="language-python">selected = df[["商品名", "単価", "数量"]]
selected</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>単価</th>
        <th>数量</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>120</td>
        <td>3</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>80</td>
        <td>10</td>
      </tr>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>1500</td>
        <td>2</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>300</td>
        <td>5</td>
      </tr>
    </tbody>
  </table>
</div>
<p>3列だけを持つDataFrameが返りました。元の<code>df</code>は削除されず、4列のまま残っています。</p>
<h3><span id="toc12">売上列を追加する</span></h3>
<p>元データを残して処理前後を比較できるように、<code>copy()</code>で<code>df_sales</code>を作ってから「単価×数量」を計算します。</p>
<pre class="line-numbers language-python"><code class="language-python">df_sales = df.copy()
df_sales["売上"] = df_sales["単価"] * df_sales["数量"]
df_sales</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>120</td>
        <td>3</td>
        <td>360</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>80</td>
        <td>10</td>
        <td>800</td>
      </tr>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>事務用品</td>
        <td>1500</td>
        <td>2</td>
        <td>3000</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>文具</td>
        <td>300</td>
        <td>5</td>
        <td>1500</td>
      </tr>
    </tbody>
  </table>
</div>
<p>処理前は4列、処理後は右端に<code>売上</code>列が加わって5列になりました。たとえばノートは<code>120 × 3 = 360</code>、電卓は<code>1500 × 2 = 3000</code>です。値だけでなく、計算に使った単価・数量と対応させて検算します。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>商品名</th>
        <th>処理前の単価</th>
        <th>処理前の数量</th>
        <th>処理後の売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>ノート</td>
        <td>120</td>
        <td>3</td>
        <td>360</td>
      </tr>
      <tr>
        <td>ペン</td>
        <td>80</td>
        <td>10</td>
        <td>800</td>
      </tr>
      <tr>
        <td>電卓</td>
        <td>1500</td>
        <td>2</td>
        <td>3000</td>
      </tr>
      <tr>
        <td>ファイル</td>
        <td>300</td>
        <td>5</td>
        <td>1500</td>
      </tr>
    </tbody>
  </table>
</div>
<p>列を追加する複数の方法は、<a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a>で詳しく説明しています。</p>
<h3><span id="toc13">売上1,000円以上の商品を抽出する</span></h3>
<p>条件式<code>df_sales[&quot;売上&quot;] &gt;= 1000</code>を使い、条件を満たす行だけを残します。</p>
<pre class="line-numbers language-python"><code class="language-python">high_sales = df_sales[df_sales["売上"] &gt;= 1000]
high_sales</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>事務用品</td>
        <td>1500</td>
        <td>2</td>
        <td>3000</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>文具</td>
        <td>300</td>
        <td>5</td>
        <td>1500</td>
      </tr>
    </tbody>
  </table>
</div>
<p>残ったのは電卓とファイルの2行です。左端のインデックスは元の<code>2</code>と<code>3</code>を維持しています。抽出後のインデックスが必ず0から始まるわけではありません。行ラベルの意味を残したい場合もあるため、無条件に振り直さないでください。</p>
<p>複数条件や<code>query()</code>の使い方は<a href="https://pythondatalab.com/pandas-filtering/">pandas 条件抽出の基本</a>、ラベル・位置指定は<a href="https://pythondatalab.com/pandas-loc-iloc/">Pandas locとilocの違い</a>へ進みます。</p>
<h3><span id="toc14">売上の高い順に並べる</span></h3>
<p><code>sort_values()</code>は並べ替えたDataFrameを返します。結果を<code>sorted_sales</code>へ代入し、元の<code>df_sales</code>と区別します。</p>
<pre class="line-numbers language-python"><code class="language-python">sorted_sales = df_sales.sort_values("売上", ascending=False)
sorted_sales</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>カテゴリ</th>
        <th>単価</th>
        <th>数量</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>事務用品</td>
        <td>1500</td>
        <td>2</td>
        <td>3000</td>
      </tr>
      <tr>
        <td>3</td>
        <td>ファイル</td>
        <td>文具</td>
        <td>300</td>
        <td>5</td>
        <td>1500</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>文具</td>
        <td>80</td>
        <td>10</td>
        <td>800</td>
      </tr>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>文具</td>
        <td>120</td>
        <td>3</td>
        <td>360</td>
      </tr>
    </tbody>
  </table>
</div>
<p>売上が<code>3000、1500、800、360</code>の順になりました。<code>sort_values()</code>を実行しただけでは、元の<code>df_sales</code>の行順は変わりません。並べ替え結果を後で使うなら、戻り値を変数へ保存します。</p>
<h3><span id="toc15">カテゴリ別に売上を集計する</span></h3>
<p>最後に、カテゴリごとの売上合計を計算します。<code>as_index=False</code>を使い、結果を通常の2列のDataFrameとして表示します。</p>
<pre class="line-numbers language-python"><code class="language-python">category_sales = (
    df_sales.groupby("カテゴリ", as_index=False)["売上"]
    .sum()
    .sort_values("売上", ascending=False)
)
category_sales</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>カテゴリ</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>事務用品</td>
        <td>3000</td>
      </tr>
      <tr>
        <td>1</td>
        <td>文具</td>
        <td>2660</td>
      </tr>
    </tbody>
  </table>
</div>
<p>文具は<code>360 + 800 + 1500 = 2660</code>、事務用品は<code>3000</code>です。集計結果は、元の4商品がカテゴリ別の2行へまとまったことを確認します。集計方法の選び方は<a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方</a>で詳しく学べます。</p>
<div class="table-scroll">
  <table class="wp-block-table">
    <thead>
      <tr>
        <th>やりたいこと</th>
        <th>最初に使う方法</th>
        <th>詳細記事</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>先頭の値を確認する</td>
        <td><code>head()</code></td>
        <td>pandas head()記事</td>
      </tr>
      <tr>
        <td>構造・型・欠損を診断する</td>
        <td><code>info()</code></td>
        <td>pandas info()記事</td>
      </tr>
      <tr>
        <td>行・列を指定する</td>
        <td><code>loc</code> / <code>iloc</code></td>
        <td>locとilocの比較記事</td>
      </tr>
      <tr>
        <td>条件に合う行を残す</td>
        <td>ブール条件</td>
        <td>pandas条件抽出記事</td>
      </tr>
      <tr>
        <td>グループ別に集計する</td>
        <td><code>groupby()</code></td>
        <td>pandas groupby・agg記事</td>
      </tr>
      <tr>
        <td>グラフを作る</td>
        <td>Matplotlib</td>
        <td>Matplotlib FigureとAxes記事</td>
      </tr>
    </tbody>
  </table>
</div>
<h2><span id="toc16">コードは動くが結果を誤解しやすい例</span></h2>
<h3><span id="toc17">数字が文字列のままでもDataFrameは作れる</span></h3>
<p>次のDataFrameはエラーなく作れますが、単価が文字列です。文字列と整数の掛け算は数値計算ではなく、文字の繰り返しになります。</p>
<pre class="line-numbers language-python"><code class="language-python">bad_df = pd.DataFrame({
    "商品名": ["ノート", "ペン"],
    "単価": ["120", "80"],
    "数量": [3, 10],
})

bad_df["誤った売上"] = bad_df["単価"] * bad_df["数量"]
bad_df</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>単価</th>
        <th>数量</th>
        <th>誤った売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>120</td>
        <td>3</td>
        <td>120120120</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>80</td>
        <td>10</td>
        <td>80808080808080808080</td>
      </tr>
    </tbody>
  </table>
</div>
<p>ノートの結果が<code>360</code>ではなく<code>120120120</code>になっています。コードが止まらなくても、結果は売上として誤りです。<code>dtypes</code>と元の値を確認し、数値へ変換してから計算します。</p>
<pre class="line-numbers language-python"><code class="language-python">bad_df["単価"] = pd.to_numeric(bad_df["単価"], errors="raise")
bad_df["売上"] = bad_df["単価"] * bad_df["数量"]
bad_df[["商品名", "単価", "数量", "売上"]]</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>単価</th>
        <th>数量</th>
        <th>売上</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>120</td>
        <td>3</td>
        <td>360</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>80</td>
        <td>10</td>
        <td>800</td>
      </tr>
    </tbody>
  </table>
</div>
<p>修正後はノートが360、ペンが800になりました。自分のデータに変換できない値が混ざる場合は、<a href="https://pythondatalab.com/pandas-to-numeric/">pandas to_numeric()の使い方</a>で<code>errors</code>の選び方と変換失敗の確認方法を確認してください。</p>
<h3><span id="toc18">抽出・並べ替えは元データを自動変更しない</span></h3>
<p><code>df_sales[条件]</code>や<code>sort_values()</code>は結果を返します。結果を変数へ代入せず、元のDataFrameも変わったと思い込むと、次のセルで古い行や行順を使うことになります。処理後に<code>shape</code>・列名・先頭行を再表示し、どの変数を使っているか確認します。</p>
<h2><span id="toc19">DataFrame作成時のエラーを確認して修正する</span></h2>
<h3><span id="toc20">NameError: name &#x27;pd&#x27; is not defined</span></h3>
<p><strong>現象</strong>：<code>pd.DataFrame(data)</code>で<code>NameError</code>が出ます。<br><strong>原因</strong>：<code>import pandas as pd</code>を実行していないか、Colabの再接続後にimportセルが未実行です。<br><strong>確認方法</strong>：上のimportセルに実行済み番号があるか確認します。<br><strong>修正方法</strong>：<code>import pandas as pd</code>から順番に再実行します。<br><strong>修正後の確認</strong>：<code>pd.__name__</code>が<code>pandas</code>となり、DataFrameが表示されることを確認します。</p>
<h3><span id="toc21">ValueError: All arrays must be of the same length</span></h3>
<p><strong>現象</strong>：列単位の辞書からDataFrameを作ると<code>ValueError</code>が出ます。<br><strong>原因</strong>：辞書に入れたリストの要素数がそろっていません。<br><strong>確認方法</strong>：列名と要素数を表示します。</p>
<pre class="line-numbers language-python"><code class="language-python">uneven_data = {
    "商品名": ["ノート", "ペン", "電卓"],
    "単価": [120, 80],
}

{column: len(values) for column, values in uneven_data.items()}</code></pre>
<pre class="colab-output">{'商品名': 3, '単価': 2}</pre>
<p>商品名は3件、単価は2件です。<strong>修正方法</strong>は、抜けた値の意味を確認し、誤って省略した値を追加するか、行単位の辞書のリストにして欠損を明示することです。意味を確認せず0を足してはいけません。修正後は<code>shape</code>と表示結果を再確認します。</p>
<pre class="line-numbers language-python"><code class="language-python">fixed_records = [
    {"商品名": "ノート", "単価": 120},
    {"商品名": "ペン", "単価": 80},
    {"商品名": "電卓", "単価": None},
]

fixed_df = pd.DataFrame(fixed_records)
fixed_df</code></pre>
<div class="table-scroll">
  <table border="1" class="wp-block-table">
    <thead>
      <tr>
        <th></th>
        <th>商品名</th>
        <th>単価</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>0</td>
        <td>ノート</td>
        <td>120.0</td>
      </tr>
      <tr>
        <td>1</td>
        <td>ペン</td>
        <td>80.0</td>
      </tr>
      <tr>
        <td>2</td>
        <td>電卓</td>
        <td>NaN</td>
      </tr>
    </tbody>
  </table>
</div>
<p>3行のDataFrameを作成でき、未確認の単価は欠損値<code>NaN</code>として明示されました。欠損を埋めるか削除するかはデータの意味で判断します。確認は<a href="https://pythondatalab.com/pandas-isnull/">Pandas isnull()で欠損値を確認する方法</a>、補完は<a href="https://pythondatalab.com/pandas-fillna/">pandas fillna()の使い方</a>へ進みます。</p>
<h3><span id="toc22">KeyErrorで列を選べない</span></h3>
<p><strong>現象</strong>：存在するはずの列を<code>df[&quot;商品名&quot;]</code>で選ぶと<code>KeyError</code>が出ます。<br><strong>原因</strong>：列名の打ち間違い、前後空白、大文字・小文字の違いが考えられます。<br><strong>確認方法</strong>：推測せず、<code>df.columns.tolist()</code>で実際の列名を確認します。<br><strong>修正方法</strong>：指定を実在する列名へ直します。前後空白が原因なら、データの仕様を確認したうえで<code>df.columns = df.columns.str.strip()</code>を使います。<br><strong>修正後の確認</strong>：列名一覧を再表示し、目的の列だけが選べることを確認します。</p>
<h2><span id="toc23">自分のデータへ置き換えるときのチェックリスト</span></h2>
<ul>
  <li>辞書の各列で要素数がそろっているか</li>
  <li>行単位と列単位を取り違えていないか</li>
  <li><code>shape</code>が想定した行数・列数か</li>
  <li><code>columns</code>に空白や表記違いがないか</li>
  <li><code>head()</code>で値と列の対応が正しいか</li>
  <li>数値列や日付列が文字列になっていないか</li>
  <li><code>info()</code>で欠損していない件数を確認したか</li>
  <li>抽出後の行数とインデックスを確認したか</li>
  <li>並べ替えや集計の結果を新しい変数へ保存したか</li>
  <li>集計値を元データの一部から手計算して検算したか</li>
</ul>
<p>行を追加する古い例で<code>DataFrame.append()</code>を見かけることがありますが、現在のPandasでは削除されています。行方向の結合には<code>pd.concat()</code>を使います。詳しくは<a href="https://pythondatalab.com/pandas-concat/">pandas concat()の使い方</a>を参照してください。</p>
<h2><span id="toc24">DataFrameから次の分析へ進む</span></h2>
<p>DataFrameを作った後は、いきなり複雑な分析へ進まず、次の順序で確認すると安全です。</p>
<ol>
  <li><code>head()</code>・<code>info()</code>・<code>describe()</code>で内容、型、欠損、分布を確認する</li>
  <li>必要なら<code>to_numeric()</code>・<code>to_datetime()</code>で型を直す</li>
  <li><code>isnull()</code>で欠損を確認し、意味に応じて補完・削除を判断する</li>
  <li><code>loc</code>・<code>iloc</code>・条件式で必要な行と列を抽出する</li>
  <li><code>groupby()</code>等で集計する</li>
  <li>Matplotlibで可視化して傾向を確認する</li>
</ol>
<p>この記事の<code>category_sales</code>は、そのままカテゴリ別の棒グラフへつなげられます。グラフ作成の土台は<a href="https://pythondatalab.com/matplotlib-figure-axes-colab-font/">Matplotlib入門：FigureとAxes</a>で確認できます。</p>
<h2><span id="toc25">まとめ</span></h2>
<ul>
  <li>DataFrameは、複数列を持つ表形式データを扱う2次元のデータ構造です。</li>
  <li>列単位のデータは辞書、行単位のデータは辞書のリスト、既存ファイルは読み込み関数を選びます。</li>
  <li>作成後は<code>shape</code>・<code>columns</code>・<code>dtypes</code>・<code>head()</code>・<code>info()</code>で、行数・列名・型・欠損・値を確認します。</li>
  <li>1列をSeriesとして扱うなら<code>df[&quot;列名&quot;]</code>、DataFrameを保つなら<code>df[[&quot;列名&quot;]]</code>を使います。</li>
  <li>列追加・抽出・並べ替え・集計の後も、行数・値・順序・合計を検算します。</li>
  <li>エラー時は、import、各列の長さ、実際の列名、データ型を順に確認します。</li>
</ul>
<p>DataFrameの基本は、表を作ることだけではありません。<strong>出力を読み、正しいか判断し、目的に合う次の処理を選ぶこと</strong>までが一連の操作です。</p>
<h2><span id="toc26">関連記事</span></h2>
<ul>
  <li><a href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-info-method/">pandas info()の使い方</a></li>
  <li><a href="https://pythondatalab.com/pandas-add-column/">pandasで新しい列を追加する方法</a></li>
  <li><a href="https://pythondatalab.com/pandas-loc-iloc/">Pandas locとilocの違い</a></li>
  <li><a href="https://pythondatalab.com/pandas-groupby-agg/">pandas groupby・aggの使い方</a></li>
  <li><a href="https://pythondatalab.com/matplotlib-figure-axes-colab-font/">Matplotlib入門：FigureとAxes</a></li>
</ul>
<!-- ▼▼▼ カテゴリから探す　 共通スタイル（カテゴリ）▼▼▼ -->
<style> .related-box { border: 2px solid #0073aa; border-radius: 10px; padding: 1em 1.2em; margin-top: 2em; background: #f8faff; } .related-box h3 { margin-top: 0; color: #0073aa; } .related-box ul { list-style-type: none; margin: 0; padding: 0; } .related-box li { margin: 0.4em 0; } .related-box a { text-decoration: none; color: #333; } .related-box a:hover { text-decoration: underline; color: #0073aa; } </style> <div class="related-box"> <h3><span id="toc27"> カテゴリから探す</span></h3> <ul>
<ul>
<li><a href="https://pythondatalab.com/category/pandas/basic/">◀ Pandas 基礎</a></li>
<li><a href="https://pythondatalab.com/category/pandas/preprocessing/">◀ Pandas 抽出・前処理</a></li>
<li><a href="https://pythondatalab.com/category/pandas/aggregation/">◀ Pandas 集計・変形</a></li>
<li><a href="https://pythondatalab.com/category/pandas/visualization/">▶ Matplotlib　可視化</a></li> </ul> </ul></div>
<!-- ▼▼▼ カテゴリから探す　共通スタイル（カテゴリ）終了▼▼▼ -->
<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>
</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1788591986884" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc28">DataFrameとSeriesはどう使い分けますか？</span></h3>
<div class="rank-math-answer ">

<p>複数の列を持つ表として処理するならDataFrame、1列だけを計算・集計するならSeriesが基本です。1列でも表形式を保つ必要がある場合は<code>df[["列名"]]</code>を使います。</p>

</div>
</div>
<div id="faq-question-1788592014000" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc29">辞書と辞書のリストでは、どちらからDataFrameを作ればよいですか？</span></h3>
<div class="rank-math-answer ">

<p>値が列ごとにまとまっているなら辞書、1件分の値が行ごとにまとまっているなら辞書のリストが自然です。完成する表だけでなく、元データの形に合わせて選びます。</p>

</div>
</div>
<div id="faq-question-1788592028194" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc30">df["列名"]とdf[["列名"]]は何が違いますか？</span></h3>
<div class="rank-math-answer ">

<p>前者は1次元のSeries、後者は2次元のDataFrameを返します。後続処理が求める型に合わせて選びます。</p>

</div>
</div>
<div id="faq-question-1788592039353" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc31">All arrays must be of the same lengthはどう直しますか？</span></h3>
<div class="rank-math-answer ">

<p>辞書の各リストの要素数を確認します。入力漏れを直すか、行単位の辞書のリストを使って未確認値を欠損として明示し、作成後に<code>shape</code>と内容を再確認します。</p>

</div>
</div>
<div id="faq-question-1788592051284" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc32">DataFrameを作った後、最初に何を確認すればよいですか？</span></h3>
<div class="rank-math-answer ">

<p><code>shape</code>、<code>columns</code>、<code>dtypes</code>、<code>head()</code>、<code>info()</code>を使い、行数・列名・型・先頭値・欠損していない件数を確認します。</p>

</div>
</div>
<div id="faq-question-1788592061282" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc33">行を追加するときにappend()を使ってもよいですか？</span></h3>
<div class="rank-math-answer ">

<p><code>DataFrame.append()</code>は現在のPandasでは削除されています。行方向にDataFrameをつなぐ場合は<code>pd.concat()</code>を使ってください。</p>

</div>
</div>
</div>
</div>


<p class="wp-block-paragraph"></p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrameとは？作り方・基本操作・Seriesとの違いを初心者向けに解説</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/pandas-dataframe/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</title>
		<link>https://pythondatalab.com/google-colab-csv/</link>
					<comments>https://pythondatalab.com/google-colab-csv/#respond</comments>
		
		<dc:creator><![CDATA[coin_collector]]></dc:creator>
		<pubDate>Sun, 23 Mar 2025 14:56:18 +0000</pubDate>
				<category><![CDATA[基礎]]></category>
		<guid isPermaLink="false">https://pythondatalab.com/?p=522</guid>

					<description><![CDATA[<p>Google ColabでCSVを読み込む方法を初心者向けに解説。Google Driveのマウント、ファイルパス確認、pandas read_csvでのCSV読み込み、読み込めないときの対処法、CSV保存までわかりやすく説明します。</p>
<p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></description>
										<content:encoded><![CDATA[
<!-- WordPress カスタムHTMLブロック貼り付け用：Google Colab CSV 読み込み記事 読みやすさ改善版 -->
<div id="top" class="colab-article">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/themes/prism-tomorrow.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.css">
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-clike.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/components/prism-python.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<style>
  .colab-article {
    line-height: 1.85;
    font-size: 16px;
  }
  .colab-article p {
    margin: 0.7em 0;
  }
  .colab-article h2 {
    margin-top: 2.2em;
    margin-bottom: 0.8em;
    padding-bottom: 0.35em;
    border-bottom: 2px solid #e0f2f1;
    line-height: 1.45;
  }
  .colab-article h3 {
    margin-top: 1.8em;
    margin-bottom: 0.6em;
    line-height: 1.45;
  }
  .colab-article pre[class*="language-"] {
    margin: 0.9em 0 1.3em 0 !important;
    padding: 1em;
    border-radius: 8px;
    overflow-x: auto;
  }
  .colab-article code {
    font-family: Consolas, Monaco, "Courier New", monospace;
  }
  .colab-article .lead-box,
  .colab-article .point-box,
  .colab-article .note-box,
  .colab-article .warning-box,
  .colab-article .answer-box {
    border-radius: 10px;
    padding: 1em 1.2em;
    margin: 1.2em 0;
  }
  .colab-article .lead-box {
    border: 2px solid #4db6ac;
    background: #f0fdfa;
  }
  .colab-article .point-box {
    border: 2px solid #4db6ac;
    background: #f0fdfa;
  }
  .colab-article .answer-box {
    border-left: 5px solid #00897b;
    background: #f4fffd;
  }
  .colab-article .note-box {
    border-left: 5px solid #0073aa;
    background: #f8faff;
  }
  .colab-article .warning-box {
    border-left: 5px solid #e67e22;
    background: #fff8ee;
  }
  .colab-article .mini-title {
    font-weight: 700;
    margin-bottom: 0.4em;
  }
  .colab-article .toc-box {
    border: 1px solid #d9ecea;
    background: #fbfffe;
    border-radius: 10px;
    padding: 1em 1.2em;
    margin: 1.4em 0;
  }
  .colab-article .toc-box ul {
    margin: 0.4em 0 0 1.2em;
    padding: 0;
  }
  .colab-article .toc-box li {
    margin: 0.25em 0;
  }
  .colab-article .step-summary {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.75em;
    margin: 1em 0;
  }
  .colab-article .step-card {
    border: 1px solid #d9ecea;
    background: #ffffff;
    border-radius: 10px;
    padding: 0.8em 1em;
  }
  .colab-article .step-card strong {
    color: #00695c;
  }
  .colab-article table.wp-block-table {
    width: auto;
    max-width: 100%;
    border-collapse: collapse;
    margin: 0.9em 0 1.3em 0;
    overflow-x: auto;
    display: block;
  }
  .colab-article table.wp-block-table th,
  .colab-article table.wp-block-table td {
    padding: 0.35em 0.6em;
    white-space: nowrap;
    border: 1px solid #ddd;
  }
  .colab-article table.wp-block-table th {
    background: #f7f7f7;
  }
  .colab-article table.wp-block-table td:first-child,
  .colab-article table.wp-block-table th:first-child {
    min-width: 3em;
  }
  .colab-article figure {
    margin: 1.2em 0;
  }
  .colab-article figure img {
    max-width: 100%;
    height: auto;
    border: 1px solid #ddd;
    border-radius: 6px;
  }
  .colab-article figcaption {
    font-size: 0.9em;
    color: #666;
    margin-top: 0.4em;
  }
  .colab-article .series-nav {
    border: 2px solid #4db6ac;
    background: linear-gradient(135deg, #f0fdfa 0%, #e0f7f4 100%);
    padding: 14px 18px;
    border-radius: 10px;
    margin: 1.5em 0;
    box-shadow: 0 3px 6px rgba(0,0,0,0.05);
  }
  .colab-article .related-box {
    border: 2px solid #0073aa;
    border-radius: 10px;
    padding: 1em 1.2em;
    margin-top: 2em;
    background: #f8faff;
  }
  .colab-article .related-box h3 {
    margin-top: 0;
    color: #0073aa;
  }
  .colab-article .related-box ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
  }
  .colab-article .related-box li {
    margin: 0.45em 0;
  }
</style>

<div class="lead-box">
  <p><strong>Google ColabでCSVを読み込むには、Google Driveを接続して、pandasの<code>read_csv()</code>を使います。</strong></p>
  <p>この記事では、CSVをGoogle Driveに置くところから、Colabで読み込み、読み込んだデータを確認し、必要に応じてCSVとして保存するところまでを、初心者向けに順番に解説します。</p>
</div>

<div class="answer-box">
  <p class="mini-title">まずは結論：最短コード</p>
  <p>Google Driveのマイドライブ直下に<code>height_weight.csv</code>を置いている場合は、次のコードで読み込めます。</p>
</div>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">from google.colab import drive
drive.mount('/content/drive')

import pandas as pd

df = pd.read_csv('/content/drive/MyDrive/height_weight.csv')
df.head()</code></pre>

<div class="note-box">
  <p><strong>ポイント：</strong><code>/content/drive/MyDrive/height_weight.csv</code>の部分は、自分のCSVファイルの保存場所に合わせて変更してください。</p>
</div>

<div class="toc-box">
  <p class="mini-title">この記事の流れ</p>
  <ul>
    <li><a href="#overview">Google ColabでCSVを読み込む全体像</a></li>
    <li><a href="#upload">ステップ1：CSVをGoogle Driveにアップロードする</a></li>
    <li><a href="#mount">ステップ2：Google Driveをマウントする</a></li>
    <li><a href="#path">ステップ3：CSVファイルのパスを確認する</a></li>
    <li><a href="#readcsv">ステップ4：read_csv()でCSVを読み込む</a></li>
    <li><a href="#check">ステップ5：読み込んだデータを確認する</a></li>
    <li><a href="#trouble">CSVが読み込めないときの対処法</a></li>
    <li><a href="#save">CSVとしてGoogle Driveに保存する</a></li>
  </ul>
</div>

<!-- ▼▼▼ Pandasシリーズナビ（開始） ▼▼▼ -->
<div id="pandas-series-nav" class="series-nav">
  <p style="margin: 0 0 6px 0; font-weight: 600; color: #00695c; font-size: 1.05em;">💡 Pandas DataFrame入門シリーズ</p>
  <p style="margin: 0; line-height: 1.7; color: #333;">
    このページは「<a style="color: #00796b; text-decoration: underline; font-weight: 500;" href="https://pythondatalab.com/pandas-dataframe/">Pandas DataFrame入門</a>」シリーズの一部です。<br>
    データの作成から結合・集計までを体系的に学べます。
  </p>
</div>
<!-- ▲▲▲ Pandasシリーズナビ（終了） ▲▲▲ -->


  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">この記事でわかること</a></li><li><a href="#toc2" tabindex="0">Google ColabでCSVを読み込む全体像</a></li><li><a href="#toc3" tabindex="0">ステップ1｜CSVファイルをGoogle Driveにアップロードする</a></li><li><a href="#toc4" tabindex="0">ステップ2｜Google ColabでGoogle Driveをマウントする</a><ol><li><a href="#toc5" tabindex="0">Driveが接続できたか確認する</a></li></ol></li><li><a href="#toc6" tabindex="0">ステップ3｜CSVファイルのパスを確認する</a><ol><li><a href="#toc7" tabindex="0">ファイルパスは「パスをコピー」で確認する</a></li></ol></li><li><a href="#toc8" tabindex="0">ステップ4｜pandasのread_csv()でCSVを読み込む</a></li><li><a href="#toc9" tabindex="0">ステップ5｜読み込んだCSVを確認する</a><ol><li><a href="#toc10" tabindex="0">info()で列名・データ型・欠損値を確認する</a></li><li><a href="#toc11" tabindex="0">describe()で数値データの統計量を確認する</a></li></ol></li><li><a href="#toc12" tabindex="0">Google ColabでCSVが読み込めないときの対処法</a><ol><li><a href="#toc13" tabindex="0">FileNotFoundError：ファイルが見つからない</a></li><li><a href="#toc14" tabindex="0">文字化けする場合：encodingを指定する</a></li><li><a href="#toc15" tabindex="0">列がうまく分かれない場合：sepを指定する</a></li><li><a href="#toc16" tabindex="0">ヘッダー行がずれる場合：headerを指定する</a></li></ol></li><li><a href="#toc17" tabindex="0">読み込んだデータをCSVとしてGoogle Driveに保存する</a></li><li><a href="#toc18" tabindex="0">Excelファイルを読み込みたい場合</a></li><li><a href="#toc19" tabindex="0">まとめ：Google ColabでCSVを読み込む基本はDrive接続とread_csv()</a><ol><li><a href="#toc20" tabindex="0">関連記事：次に読むと理解が深まる記事</a></li><li><a href="#toc21" tabindex="0">Google Colabでは毎回Google Driveをマウントする必要がありますか？</a></li><li><a href="#toc22" tabindex="0">CSVファイルはGoogle Driveのどこに置けばよいですか？</a></li><li><a href="#toc23" tabindex="0">read_csv()で読み込んだデータはどこに入りますか？</a></li><li><a href="#toc24" tabindex="0">CSV保存時のindex=Falseは必要ですか？</a></li></ol></li></ol>
    </div>
  </div>

<h2><span id="toc1">この記事でわかること</span></h2>

<ul>
  <li>Google Driveに保存したCSVをGoogle Colabで読み込む方法</li>
  <li>Google ColabでGoogle Driveをマウントする方法</li>
  <li>CSVファイルのパスを確認する方法</li>
  <li>pandasの<code>read_csv()</code>でCSVを読み込む方法</li>
  <li>CSVが読み込めないときの主な原因と対処法</li>
  <li>読み込んだDataFrameをCSVとしてGoogle Driveに保存する方法</li>
</ul>

<p>Pythonの実行環境で迷っている方は、先にこちらの記事も参考にしてください。</p>
<p><a href="https://pythondatalab.com/python-install/">【初心者向け】Pythonの実行環境を比較！Colab・Anaconda・インストールの違いと使い方</a></p>

<h2 id="overview"><span id="toc2">Google ColabでCSVを読み込む全体像</span></h2>

<p>Google Colabは、ブラウザ上でPythonを実行できる便利な環境です。ただし、Google Driveに保存したCSVを読み込むには、まずColabからDriveにアクセスできる状態にする必要があります。</p>

<p>基本の流れは、次の5つです。</p>

<div class="step-summary">
  <div class="step-card"><strong>1. CSVをGoogle Driveに置く</strong><br>読み込みたいCSVファイルを、Google Driveにアップロードします。</div>
  <div class="step-card"><strong>2. DriveをColabに接続する</strong><br><code>drive.mount('/content/drive')</code>で、ColabからDriveを使えるようにします。</div>
  <div class="step-card"><strong>3. CSVのパスを確認する</strong><br>Colabのファイル一覧から「パスをコピー」すると安全です。</div>
  <div class="step-card"><strong>4. CSVを読み込む</strong><br><code>pd.read_csv()</code>でCSVをDataFrameとして読み込みます。</div>
  <div class="step-card"><strong>5. 必要に応じて保存する</strong><br><code>df.to_csv()</code>で、処理結果をCSVとして保存できます。</div>
</div>


<h2 id="upload"><span id="toc3">ステップ1｜CSVファイルをGoogle Driveにアップロードする</span></h2>

<p>まず、読み込みたいCSVファイルをGoogle Driveに保存します。</p>

<p>この記事では、例としてマイドライブ直下に<code>height_weight.csv</code>というファイルを置いた前提で進めます。自分のCSVを使う場合は、ファイル名を読み替えてください。</p>

<figure>
  <img src="https://pythondatalab.com/wp-content/uploads/2025/06/google_drive_mydrive.jpg" alt="Google DriveのマイドライブにCSVファイルを保存した画面" width="800" height="500" loading="lazy" decoding="async">
  <figcaption>図：Google DriveのマイドライブにCSVファイルを保存した例</figcaption>
</figure>

<div class="warning-box">
  <p><strong>注意：</strong>ファイル名は、大文字・小文字、拡張子の<code>.csv</code>、スペースの有無まで一致させる必要があります。</p>
</div>

<h2 id="mount"><span id="toc4">ステップ2｜Google ColabでGoogle Driveをマウントする</span></h2>

<p>次に、Google ColabからGoogle Driveにアクセスできるようにします。この接続作業を「マウント」といいます。</p>

<p>Colabのコードセルに、次のコードを入力して実行してください。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">from google.colab import drive
drive.mount('/content/drive')</code></pre>

<figure>
  <img src="https://pythondatalab.com/wp-content/uploads/2025/06/drive_mount.png" alt="Google Colabでdrive.mount()を実行してGoogle Driveを接続する画面" width="800" height="500" loading="lazy" decoding="async">
  <figcaption>図：Google Colabで<code>drive.mount()</code>を実行する画面</figcaption>
</figure>

<p>実行すると、Google Driveへの接続を許可する画面が表示されます。「Googleドライブに接続」をクリックし、画面の指示に従って進めます。</p>

<figure>
  <img src="https://pythondatalab.com/wp-content/uploads/2025/03/drive_mount2.png" alt="Google ColabでGoogle Driveへのアクセスを許可する画面" width="800" height="500" loading="lazy" decoding="async">
  <figcaption>図：Google Driveへのアクセスを許可する画面</figcaption>
</figure>

<p>認証が完了すると、<code>Mounted at /content/drive</code>のようなメッセージが表示されます。これで、ColabからGoogle Drive内のファイルにアクセスできます。</p>

<h3><span id="toc5">Driveが接続できたか確認する</span></h3>

<p>Colab画面の左側にあるフォルダアイコンをクリックします。ファイル一覧に<code>drive</code>フォルダが表示されていれば成功です。</p>

<figure>
  <img src="https://pythondatalab.com/wp-content/uploads/2025/03/drive_mount3-1.png" alt="Google Colabのファイル一覧にdriveフォルダが表示されている画面" width="800" height="500" loading="lazy" decoding="async">
  <figcaption>図：ファイル一覧に<code>drive</code>フォルダが表示された状態</figcaption>
</figure>

<h2 id="path"><span id="toc6">ステップ3｜CSVファイルのパスを確認する</span></h2>

<p>CSVを読み込むには、「どこにあるCSVファイルを読み込むのか」をColabに教える必要があります。この場所を表す文字列がファイルパスです。</p>

<p>Google Driveをマウントした場合、マイドライブは通常、次の場所から始まります。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">/content/drive/MyDrive/</code></pre>

<p>例えば、マイドライブ直下に<code>height_weight.csv</code>を保存している場合、ファイルパスは次のようになります。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">/content/drive/MyDrive/height_weight.csv</code></pre>

<h3><span id="toc7">ファイルパスは「パスをコピー」で確認する</span></h3>

<p>手入力すると、ファイル名やフォルダ名を間違えやすくなります。初心者の方は、Colabのファイル一覧からパスをコピーする方法がおすすめです。</p>

<ol>
  <li>Colab左側のフォルダアイコンをクリックする</li>
  <li><code>drive</code> → <code>MyDrive</code>を開く</li>
  <li>読み込みたいCSVファイルを右クリックする</li>
  <li>「パスをコピー」をクリックする</li>
</ol>

<div class="note-box">
  <p><strong>よくある失敗：</strong><code>FileNotFoundError</code>の多くは、ファイルパスの入力ミスが原因です。迷ったら、手入力ではなく「パスをコピー」を使いましょう。</p>
</div>

<h2 id="readcsv"><span id="toc8">ステップ4｜pandasのread_csv()でCSVを読み込む</span></h2>

<p>ファイルパスを確認できたら、pandasの<code>read_csv()</code>でCSVを読み込みます。</p>

<p>まず、pandasを使えるようにします。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">import pandas as pd</code></pre>

<p>次に、CSVファイルを読み込みます。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df = pd.read_csv('/content/drive/MyDrive/height_weight.csv')</code></pre>

<p>このコードは、指定した場所にあるCSVファイルを読み込み、<code>df</code>という名前のDataFrameとして扱えるようにする、という意味です。</p>

<div class="note-box">
  <p><strong>DataFrameとは：</strong>pandasで扱う表形式データのことです。Excelの表のように、行と列でデータを管理できます。</p>
</div>

<p>pandasの<code>read_csv()</code>の詳しい仕様は、公式ドキュメントでも確認できます。</p>
<p><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html" target="_blank">pandas read_csv 公式ドキュメント</a></p>

<h2 id="check"><span id="toc9">ステップ5｜読み込んだCSVを確認する</span></h2>

<p>CSVを読み込んだら、まず<code>df.head()</code>で先頭の数行を確認します。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df.head()</code></pre>

<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>Name</th>
      <th>Height(cm)</th>
      <th>Weight(kg)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>NQjXU</td>
      <td>152</td>
      <td>53</td>
    </tr>
    <tr>
      <th>1</th>
      <td>rcXej</td>
      <td>165</td>
      <td>51</td>
    </tr>
    <tr>
      <th>2</th>
      <td>FMtIp</td>
      <td>188</td>
      <td>56</td>
    </tr>
    <tr>
      <th>3</th>
      <td>gymZI</td>
      <td>183</td>
      <td>64</td>
    </tr>
    <tr>
      <th>4</th>
      <td>BqzCl</td>
      <td>150</td>
      <td>81</td>
    </tr>
  </tbody>
</table>

<p>このように表の先頭行が表示されれば、CSVファイルの読み込みは成功です。</p>

<p><code>head()</code>の詳しい使い方は、こちらの記事で解説しています。</p>
<p><a href="https://pythondatalab.com/pandas-head/">【初心者向け】Pandasのhead関数の使い方とDataFrameの先頭行を表示する具体的手順を解説</a></p>

<h3><span id="toc10">info()で列名・データ型・欠損値を確認する</span></h3>

<p>CSVが読み込めたら、<code>info()</code>で列名、データ型、欠損値の有無を確認できます。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df.info()</code></pre>

<figure>
  <img src="https://pythondatalab.com/wp-content/uploads/2025/05/df.info_.png" alt="pandasのdf.info()で列名やデータ型を確認した結果" width="800" height="500" loading="lazy" decoding="async">
  <figcaption>図：<code>df.info()</code>の表示結果</figcaption>
</figure>

<h3><span id="toc11">describe()で数値データの統計量を確認する</span></h3>

<p>数値列の平均値、標準偏差、最小値、最大値などを確認したい場合は、<code>describe()</code>を使います。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df.describe()</code></pre>

<table class="wp-block-table">
  <thead>
    <tr>
      <th></th>
      <th>Height(cm)</th>
      <th>Weight(kg)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>count</th>
      <td>100.000000</td>
      <td>100.000000</td>
    </tr>
    <tr>
      <th>mean</th>
      <td>173.110000</td>
      <td>70.960000</td>
    </tr>
    <tr>
      <th>std</th>
      <td>16.084936</td>
      <td>16.403941</td>
    </tr>
    <tr>
      <th>min</th>
      <td>150.000000</td>
      <td>45.000000</td>
    </tr>
    <tr>
      <th>25%</th>
      <td>160.000000</td>
      <td>58.000000</td>
    </tr>
    <tr>
      <th>50%</th>
      <td>171.500000</td>
      <td>69.000000</td>
    </tr>
    <tr>
      <th>75%</th>
      <td>188.000000</td>
      <td>85.250000</td>
    </tr>
    <tr>
      <th>max</th>
      <td>200.000000</td>
      <td>100.000000</td>
    </tr>
  </tbody>
</table>

<p><code>info()</code>と<code>describe()</code>の詳しい使い方は、こちらの記事で解説しています。</p>
<p><a href="https://pythondatalab.com/pandas-info-describe/">【初心者向け】Pandasのinfo()・describe()でデータ構造と統計量をやさしく理解する方法</a></p>

<h2 id="trouble"><span id="toc12">Google ColabでCSVが読み込めないときの対処法</span></h2>

<p>CSVが読み込めないときは、まず次の順番で確認しましょう。</p>

<div class="point-box">
  <ol>
    <li>Google Driveをマウントしたか</li>
    <li>CSVファイルのパスを正しくコピーしたか</li>
    <li>ファイル名と拡張子<code>.csv</code>が合っているか</li>
    <li>日本語が文字化けする場合は<code>encoding</code>を指定したか</li>
    <li>列が分かれない場合は<code>sep</code>を指定したか</li>
  </ol>
</div>

<h3><span id="toc13">FileNotFoundError：ファイルが見つからない</span></h3>

<p><code>FileNotFoundError: [Errno 2] No such file or directory</code>は、指定した場所にファイルが見つからないときに出るエラーです。</p>

<p>主な原因は、ファイルパスの間違いです。次の点を確認してください。</p>

<ul>
  <li>Google Driveをマウントしているか</li>
  <li>ファイル名の大文字・小文字が一致しているか</li>
  <li><code>.csv</code>の拡張子まで正しく書いているか</li>
  <li>フォルダ名やスラッシュ<code>/</code>が間違っていないか</li>
  <li>ファイルが本当にマイドライブ内にあるか</li>
</ul>

<p>対処法としては、CSVファイルを右クリックし、「パスをコピー」を使うのが一番確実です。</p>

<h3><span id="toc14">文字化けする場合：encodingを指定する</span></h3>

<p>日本語が文字化けする場合は、<code>encoding</code>を指定します。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df = pd.read_csv('/content/drive/MyDrive/height_weight.csv', encoding='utf-8')</code></pre>

<p>日本語Windows環境で作成したCSVの場合は、<code>cp932</code>や<code>shift_jis</code>で読み込めることがあります。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df = pd.read_csv('/content/drive/MyDrive/height_weight.csv', encoding='cp932')</code></pre>

<h3><span id="toc15">列がうまく分かれない場合：sepを指定する</span></h3>

<p>CSVファイルによっては、カンマではなくタブやセミコロンで区切られていることがあります。その場合は、<code>sep</code>を指定します。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python"># タブ区切りの場合
df = pd.read_csv('/content/drive/MyDrive/sample.tsv', sep='\t')

# セミコロン区切りの場合
df = pd.read_csv('/content/drive/MyDrive/sample.csv', sep=';')</code></pre>

<h3><span id="toc16">ヘッダー行がずれる場合：headerを指定する</span></h3>

<p>CSVの1行目が列名ではない場合は、<code>header</code>を指定します。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python"># 1行目を列名として扱わない場合
df = pd.read_csv('/content/drive/MyDrive/sample.csv', header=None)</code></pre>

<h2 id="save"><span id="toc17">読み込んだデータをCSVとしてGoogle Driveに保存する</span></h2>

<p>読み込んだデータを加工したあと、CSVとしてGoogle Driveに保存したい場合は、pandasの<code>to_csv()</code>を使います。</p>

<p>例えば、<code>df</code>をマイドライブに<code>height_weight2.csv</code>として保存する場合は、次のように書きます。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df.to_csv('/content/drive/MyDrive/height_weight2.csv', index=False)</code></pre>

<p><code>index=False</code>を付けると、DataFrameの左端にあるインデックス番号をCSVに保存しないようにできます。通常、CSVとして保存するときは<code>index=False</code>を付けることが多いです。</p>

<div class="warning-box">
  <p><strong>注意：</strong>同じファイル名で保存すると、既存のファイルが上書きされる場合があります。大切なファイルを残したい場合は、別のファイル名で保存しましょう。</p>
</div>

<p>pandasの<code>to_csv()</code>の詳しい仕様は、公式ドキュメントで確認できます。</p>
<p><a rel="noopener" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html" target="_blank">pandas DataFrame.to_csv 公式ドキュメント</a></p>

<h2><span id="toc18">Excelファイルを読み込みたい場合</span></h2>

<p>CSVではなくExcelファイルを読み込みたい場合は、pandasの<code>read_excel()</code>を使います。</p>

<pre class="language-python" data-prismjs-copy="コピー"><code class="language-python">df_excel = pd.read_excel('/content/drive/MyDrive/sample.xlsx')</code></pre>

<p>詳しい使い方は、こちらの記事で解説しています。</p>
<p><a href="https://pythondatalab.com/pandas-read-excel/">pandas read_excelの使い方｜Excelファイルを読み込む方法を初心者向けに解説</a></p>


<h2><span id="toc19">まとめ：Google ColabでCSVを読み込む基本はDrive接続とread_csv()</span></h2>

<p>この記事では、Google ColabでGoogle Drive上のCSVファイルを読み込む方法を解説しました。</p>

<ol>
  <li>CSVファイルをGoogle Driveにアップロードする</li>
  <li><code>drive.mount()</code>でGoogle DriveをColabに接続する</li>
  <li>CSVファイルのパスを確認する</li>
  <li><code>pd.read_csv()</code>でCSVファイルを読み込む</li>
  <li><code>df.head()</code>や<code>df.info()</code>で読み込み結果を確認する</li>
  <li><code>df.to_csv()</code>でCSVとしてGoogle Driveに保存する</li>
</ol>

<p>Google ColabでCSVを扱えるようになると、pandasを使ったデータ分析を進めやすくなります。まずは自分のCSVファイルをGoogle Driveに置き、今回のコードを使って読み込んでみましょう。</p>

<div class="related-box">
  <h3><span id="toc20">関連記事：次に読むと理解が深まる記事</span></h3>
  <ul>
    <li><a href="https://pythondatalab.com/pandas-dataframe/">▶ Pandas DataFrame入門｜表形式データの基本を理解する</a></li>
    <li><a href="https://pythondatalab.com/pandas-head/">▶ Pandasのhead()でDataFrameの先頭行を確認する方法</a></li>
    <li><a href="https://pythondatalab.com/pandas-info-describe/">▶ pandas info()・describe()でデータ構造と統計量を確認する方法</a></li>
    <li><a href="https://pythondatalab.com/pandas-read-excel/">▶ pandas read_excelの使い方｜Excelファイルを読み込む方法</a></li>
    <li><a href="https://pythondatalab.com/category/pandas/preprocessing/">▶ Pandasでデータ抽出・前処理を行う方法</a></li>
  </ul>
</div>

<p style="text-align: center; margin-top: 2em;"><a href="#top">▲ ページトップへ戻る</a></p>

<script>
  if (window.Prism) {
    Prism.highlightAll();
  }
</script>

</div>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1780149747919" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc21">Google Colabでは毎回Google Driveをマウントする必要がありますか？</span></h3>
<div class="rank-math-answer ">

<p>基本的には、ノートブックを開き直したり、ランタイムを再起動したりした場合は、再度<code>drive.mount('/content/drive')</code>を実行する必要があります。</p>

</div>
</div>
<div id="faq-question-1780149773668" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc22">CSVファイルはGoogle Driveのどこに置けばよいですか？</span></h3>
<div class="rank-math-answer ">

<p>初心者の方は、まずマイドライブ直下に置くのがおすすめです。ファイルパスが<code>/content/drive/MyDrive/ファイル名.csv</code>になり、指定しやすいからです</p>

</div>
</div>
<div id="faq-question-1780149794699" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc23">read_csv()で読み込んだデータはどこに入りますか？</span></h3>
<div class="rank-math-answer ">

<p><code>df = pd.read_csv(...)</code>と書いた場合、読み込んだCSVデータは<code>df</code>というDataFrameに入ります。以後は、<code>df.head()</code>や<code>df.info()</code>などで中身を確認できます。</p>

</div>
</div>
<div id="faq-question-1780149803157" class="rank-math-list-item">
<h3 class="rank-math-question "><span id="toc24">CSV保存時のindex=Falseは必要ですか？</span></h3>
<div class="rank-math-answer ">

<p>多くの場合は付けた方がよいです。<code>index=False</code>を付けないと、CSVの左端にインデックス番号の列が追加されることがあります。</p>

</div>
</div>
</div>
</div><p>&lt;p&gt;The post <a rel="nofollow" href="https://pythondatalab.com/google-colab-csv/">Google ColabでCSVを読み込む方法｜アップロード・Drive・read_csv</a> first appeared on <a rel="nofollow" href="https://pythondatalab.com">Python Data Lab（Pythonデータラボ）</a>.&lt;/p&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://pythondatalab.com/google-colab-csv/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
