<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://mnogress.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mnogress.github.io/" rel="alternate" type="text/html" /><updated>2026-05-11T04:53:24+00:00</updated><id>https://mnogress.github.io/feed.xml</id><title type="html">so-wi.com_blog</title><subtitle>Blog for Data Analysis and more..</subtitle><author><name>Author</name></author><entry><title type="html">データセットの結合 pd.concat 縦向き、横向き結合</title><link href="https://mnogress.github.io/reference/pd_concat_axis_tate_yoko_df/" rel="alternate" type="text/html" title="データセットの結合 pd.concat 縦向き、横向き結合" /><published>2026-04-12T00:00:00+00:00</published><updated>2026-04-12T11:00:00+00:00</updated><id>https://mnogress.github.io/reference/pd_concat_axis_tate_yoko_df</id><content type="html" xml:base="https://mnogress.github.io/reference/pd_concat_axis_tate_yoko_df/"><![CDATA[<!--more-->

<hr />

<h3 id="pdconcat-の引数axisとignore_index">pd.concat の引数axisとignore_index</h3>

<p>下図を参照してください。</p>

<p><img src="/images/img/fig_1117_01.png" alt="concat_format" /></p>

<h4 id="リスト形式で連結対象データフレームを指定する">リスト形式で連結対象データフレームを指定する</h4>
<p>concat 関数には連結したいデータフレームをリスト形式で渡します。　図のように、df1, df2, df3 の3つのデータフレームを一つに連結したいのであれば
<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">[df1, df2, df3]</code> とします。　pd.concat では一度に複数のデータフレームの結合が可能です。</p>

<h4 id="axis-で連結方向縦横が指定可能">axis で連結方向：縦横が指定可能</h4>
<p>axisは連結方向を示します。デフォルトの<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">axis=0</code>は縦方向、<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">axis=1</code>は横方向の連結です。</p>

<p>縦方向の連結では、列の内容が同じで行（データを追加したい等）のケースでとても便利です。いわゆる行を増やす縦持ちデータ追加です。　</p>

<p>一方、社員や製品の属性情報を追加する等の行ではなく、列を追加する場合は横方向にデータが追加します。　
縦方向でも横方向でも結合できるのがconcat関数の大きな特徴です。</p>

<h4 id="ignore_index-連結されたインデックスをそのままか振り直すかを指定する">ignore_index 連結されたインデックスをそのままか、振り直すかを指定する</h4>

<p>ignoreindexにはインデックスを振り直すか、そのまま他を指定します。falseを指定すると、そのままです。trueを指定すると、インデックスを振り直します。デフォルトはfalseでそのままです。</p>

<h4 id="axis0-デフォルトで縦向きに連結する">axis=0 （デフォルト）で縦向きに連結する</h4>

<p>連結するデータフレーム(df1,df2,df3)です。３つのデータフレームの列は同一です。</p>

<p><img src="/images/img/fig_1117_02.png" alt="concat_axis_0" /></p>

<p>連結結果です。<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">ignore_index</code>の設定でインデックス番号がそのままだったり、振り直されたりしています。</p>

<p><img src="/images/img/fig_1117_03.png" alt="concat_axis_0" /></p>

<p>このように、pd.concat の<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">axis=0</code> 縦向き連結はデータの追加に適しています。</p>

<h4 id="axis1-横向き連結">axis=1 横向き連結</h4>

<p>df4を作りたいと思います。<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">df3.set_index(「名前」)</code>で名前列をインデックスにします。
df4です。「名前」がインデックスになっていることがわかります。</p>

<p>新しいデータフレームを作成します。df5とします。
df5は名前と役職を持つデータフレームとします。そしてこのデータフレームのインデックスも「名前」に設定します。</p>

<p><img src="/images/img/fig_1117_04.png" alt="concat_axis_1" /></p>

<h4 id="joinouterは外部結合-joininnerは内部結合">join=”outer”は外部結合 、join=”inner”は内部結合</h4>

<p>この名前の列を軸（キー）に
df4とdf5の２つのデータフレームを横方向に結合してみます。<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">axis=1</code> を指定します。
今度は引数joinを指定してすることで連結のスタイルを指定します。<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">join="outer"</code> は外部結合です。
joinを指定しなかった時と同じ結果になります。</p>

<p><code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">join="inner"</code>は内部結合です。お互いに存在するデータのみが結合されます。
outerjoinとinnerjoinの違いは覚えておきたいところです。縦方向でも横方向でも結合できるのがconcat関数の特徴です。</p>

<p><img src="/images/img/fig_1117_06.png" alt="concat_axis_1" /></p>

<hr />

<h3 id="まとめ"><strong>まとめ</strong></h3>

<ul>
  <li><strong>pd.concat は複数の DataFrame を一度に結合できる便利な関数</strong></li>
  <li><strong>axis=0（縦結合）</strong> は行の追加に最適で、データ拡張に向いている</li>
  <li><strong>axis=1（横結合）</strong> は列の追加に使い、属性情報の付与に便利</li>
  <li><strong>ignore_index</strong> でインデックスを保持するか振り直すかを選べる</li>
  <li><strong>join=”outer” / “inner”</strong> により、横結合時のデータの残し方を制御できる</li>
  <li><strong>縦横どちらの結合にも対応できる柔軟性が concat の最大の特徴</strong></li>
</ul>

<hr />

<p><code style="color: blue; font-size: 120" class="language-plaintext highlighter-rouge">参照：</code><a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html" target="_blank">pd.concat</a></p>

<hr />]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="script" /><summary type="html"><![CDATA[Pandas の pd.concat を使ったデータフレームの縦結合・横結合をわかりやすく解説。 複数データの統合、行追加・列追加の基本を図解で理解できます。 データ分析で必須の concat の使い方を短時間でマスターしましょう。]]></summary></entry><entry><title type="html">異なる列間で値の一致、不一致を調べる</title><link href="https://mnogress.github.io/reference/function_to_compare_between_rows/" rel="alternate" type="text/html" title="異なる列間で値の一致、不一致を調べる" /><published>2026-04-04T00:00:00+00:00</published><updated>2026-04-04T11:00:00+00:00</updated><id>https://mnogress.github.io/reference/function_to_compare_between_rows</id><content type="html" xml:base="https://mnogress.github.io/reference/function_to_compare_between_rows/"><![CDATA[<!--more-->
<p>二つ以上のデータフレームを結合し、データをクリーニングする際、よく必要となるデータフレーム内の異なる列間で値の一致、不一致を調べる関数を紹介します。
一致のみならず、大小比較も等式を変更するだ、応用の範囲の広い関数例です。</p>

<hr />

<h3 id="問題の所在">問題の所在</h3>

<p>実務では、同じ社員が提出したはずの報告データなのに、集計後に「列Aと列Bで値が違う」「本来同じはずの情報がズレている」といったケースがよく発生します。
たとえば、部署名の表記ゆれ、日付の入力ミス、マスタ更新漏れなど、原因はさまざまですが、人が入力したデータが複数の列にまたがると、どこかで不一致が生まれるのは珍しくありません。</p>

<p>こうした “同じはずなのに違う” 行を素早く見つけることは、データクレンジングや報告書の整合性チェックにおいて非常に重要です。</p>

<p>この記事では、Pandas を使って 行単位で複数列の一致・不一致を判定し、新しい列として付与するシンプルな関数の作り方 を紹介します。
最小限のコードで、実務で頻出する<strong>「整合性チェック」</strong>を効率化できます。</p>

<p><img src="/images/img/fig4.png" alt="what_is_problem" /><br /></p>

<h3 id="関数を定義する">関数を定義する</h3>

<p><code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">if row['記録 列A'] == row['報告 列B']:</code> の等式<code style="background: #eda0c4; font-size: 1.00em;" class="language-plaintext highlighter-rouge">==</code>　で一致であれば、1を返し、不一致の場合は9を返すようにしています。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre><span class="k">def</span> <span class="nf">func_row_check</span><span class="p">(</span><span class="n">row</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">
    列間を比較する

    引数:
        row[</span><span class="sh">'</span><span class="s">col1</span><span class="sh">'</span><span class="s">]: 比較したい列名 col1
        row[</span><span class="sh">'</span><span class="s">col2</span><span class="sh">'</span><span class="s">]: 比較したいもう一つの列名 col2

    Returns:
        1 : 一致
        9 : 不一致
    </span><span class="sh">"""</span>
    <span class="k">if</span> <span class="n">row</span><span class="p">[</span><span class="sh">'</span><span class="s">記録 列A</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="n">row</span><span class="p">[</span><span class="sh">'</span><span class="s">報告 列B</span><span class="sh">'</span><span class="p">]:</span>
        <span class="k">return</span> <span class="mi">1</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">9</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>上図はコメントを入れた関数になっています。実際に必要なコードはLine #1,13,14,15,16 だけで十分です。簡単ですね。</p>

<h3 id="関数を適用する">関数を適用する</h3>

<p>関数を適用した結果は、列名「結果」という新しい列に内容を追加します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">結果</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">apply</span><span class="p">(</span><span class="n">func_row_check</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></code></pre></figure>

<h3 id="データフレームで内容を確認">データフレームで内容を確認</h3>

<p><img src="/images/img/fig6.png" alt="fnction" /><br /></p>

<hr />

<h3 id="サンプルコード練習用データ付き">サンプルコード（練習用データ付き）</h3>

<p>サンプルコードでは、データフレームの作成から、関数の定義と適用、結果の確認までを紹介していますので、お手元の
Python 環境(Jupyrt Notebook 等)でお確かめくださいませ。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre><span class="c1"># 必要なモジュールをインポートします
</span><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="c1"># 演習用のデータフレームを作成します。
</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span> <span class="sh">'</span><span class="s">社員番号</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">01285679</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">01340788</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">02123782</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">03541976</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">04297411</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">13299899</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">30144450</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">47339981</span><span class="sh">'</span><span class="p">],</span>
                   <span class="sh">'</span><span class="s">記録 列A</span><span class="sh">'</span><span class="p">:</span>   <span class="p">[</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">8</span><span class="p">],</span>
                   <span class="sh">'</span><span class="s">報告 列B</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">8</span><span class="p">]},</span>
                    <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">])</span>
<span class="c1"># オリジナルのデータフレームを表示
</span><span class="nf">display</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
<span class="c1"># 関数を定義
</span><span class="k">def</span> <span class="nf">func_row_check</span><span class="p">(</span><span class="n">row</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">
    列間を比較する

    引数:
        row[</span><span class="sh">'</span><span class="s">col1</span><span class="sh">'</span><span class="s">]: 比較したい列名 col1
        row[</span><span class="sh">'</span><span class="s">col2</span><span class="sh">'</span><span class="s">]: 比較したいもう一つの列名 col2

    Returns:
        1 : 一致
        9 : 不一致
    </span><span class="sh">"""</span>
    <span class="k">if</span> <span class="n">row</span><span class="p">[</span><span class="sh">'</span><span class="s">記録 列A</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="n">row</span><span class="p">[</span><span class="sh">'</span><span class="s">報告 列B</span><span class="sh">'</span><span class="p">]:</span>
        <span class="k">return</span> <span class="mi">1</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">9</span>
<span class="c1"># 関数を適用
</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">結果</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">apply</span><span class="p">(</span><span class="n">func_row_check</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="c1"># 結果のデータフレームを表示
</span><span class="nf">display</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<div class="box33">
    <span class="box-title">ここがポイント！</span>
    <ol>
      <li><strong>df['結果'] = df.apply(func_row_check, axis=1)</strong>で、 <span class="rouge">axis=1</span>の指定すること</li>
      <li>デフォルトでは、<strong>axis=0</strong>のためKeyErroで例外となってしまい関数が上手く働きません。</li>
    </ol> 
</div>

<hr />]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="Function" /><summary type="html"><![CDATA[データフレーム内の異なる列同士の値が一致しているか、不一致かを判定する関数の作り方と適用方法を紹介します。行単位で比較し、新しい列に結果を付与する実務でよく使う処理を、最小限のコードでシンプルにまとめた Reference 記事です。]]></summary></entry><entry><title type="html">クロス集計表とヒートマップでデータセットを理解する</title><link href="https://mnogress.github.io/reference/cross_tab_heat_map/" rel="alternate" type="text/html" title="クロス集計表とヒートマップでデータセットを理解する" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T11:00:00+00:00</updated><id>https://mnogress.github.io/reference/cross_tab_heat_map</id><content type="html" xml:base="https://mnogress.github.io/reference/cross_tab_heat_map/"><![CDATA[<h4 id="-はじめに">🎯 はじめに</h4>
<!--more-->
<p>
実務のデータ分析では、50列以上ある複雑なデータセットの中から
「どの変数同士に関係がありそうか？」を素早く見つけることが重要です。
しかし、いきなり相関係数や機械学習に進むと、前処理や前提条件に左右され、
本質的な“気づき”を得にくいことがあります。
</p>

<p>
このページでは、Pandas の <strong>クロス集計表（crosstab）</strong> と
Seaborn の <strong>ヒートマップ</strong> を使って、
大量のカテゴリ・数値データの中から「関係のありそうな組み合わせ」を
効率よく探索するための実践的アプローチをまとめています。
年齢 × 収入のような一例にとどまらず、
データセット全体の構造を理解し、分析の糸口をつかむための
 <span class="bleu2">“発見のためのサーチ方法” </span>を体系的に学べます。
</p>

<h4 id="-クロス集計表とヒートマップ">① クロス集計表とヒートマップ</h4>

<ul>
  <li>
    <p>クロス集計表とは、２つのカテゴリーに属するデータを各々のカテゴリーで分類して、それぞれのカテゴリーに交わるセルにその度数（サンプル数、頻度）を集計した表のことです。</p>
  </li>
  <li>
    <p>クロス集計表では度数は数字で表していますが、その数字の大小を色の濃淡で視覚的に表現するヒートマップの形にすると今まで見えていなかったものが見えたりします。</p>
  </li>
  <li>
    <p>クロス集計表のサンプルとして、今回使う<a href="https://www.kaggle.com/search?q=hr+attrition" target="_blank">Kaggle_HR_attrition</a>のうち、男女(Gender)の列と仕事満足度(JobSatisfaction)の列の２軸でクロス集計してみました。</p>
  </li>
</ul>

<p><img src="/images/img/cross_tab_sample1.png" alt="countplot" /><br /></p>

<p>Pandasを使えば、簡単にクロス集計表やヒートマップを作成、描画が可能です。ここでは<span class="bleu2">Kaggle のHRデータの年齢とMonthly Salary のデータ</span>でクロス集計表とヒートマップの作成をご紹介したいと思います。</p>

<h4 id="-度数分布グラフを作成する">② 度数分布グラフを作成する</h4>

<p>クロス集計する二つのカテゴリーとして”Age”と”MonthlyIncome”で集計したいと思います。集計にあたり、”Age” と”MonthlyIncome” 各々の度数分布を棒グラフで確認します。</p>

<p>seabornを使えば、簡単にきれいな度数分布グラフを作成することができます。 カラーパレット<code style="background: #cbe8f5; font-size: 1.00em;" class="language-plaintext highlighter-rouge">palette='hls'</code> で各棒(bar)に色をつけてメリハリをつけてみました。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="code"><pre><span class="c1"># カレントディレクトリからKaggleデータ data.csv を読み込みます
</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">read_csv</span><span class="p">(</span><span class="sh">'</span><span class="s">/data.csv</span><span class="sh">'</span><span class="p">,</span> <span class="n">delimiter</span> <span class="o">=</span><span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">,</span> <span class="n">header</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># 年齢別の度数分布を作成します
</span><span class="n">sns</span><span class="p">.</span><span class="nf">countplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="sh">'</span><span class="s">Age</span><span class="sh">'</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">palette</span><span class="o">=</span><span class="sh">'</span><span class="s">hls</span><span class="sh">'</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><img src="/images/img/countplot_age.png" alt="countplot" /><br /></p>

<p>”MonthlyIncome”は１ドル単位までデータとしてあります。これでは、度数分布としては細か過ぎますので、roundメソッド<code style="background: #cbe8f5; font-size: 1.00em;" class="language-plaintext highlighter-rouge">.round(-3)</code> として1,000ドル単位のレンジにして、新しい列名”MonthlyRate”を作成します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="code"><pre><span class="c1"># 1,000ドル単位に下3桁で切り捨てて、それを列名'MonthlyRateに格納します
</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">MonthlyRate</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">MonthlyIncome</span><span class="sh">'</span><span class="p">].</span><span class="nf">round</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">)</span>
<span class="c1"># MonthlyRateの度数分布を作成します
</span><span class="n">sns</span><span class="p">.</span><span class="nf">countplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="sh">'</span><span class="s">MonthlyRate</span><span class="sh">'</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">palette</span><span class="o">=</span><span class="sh">'</span><span class="s">hls</span><span class="sh">'</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><img src="/images/img/monthly_rate_hr.png" alt="countplot" /><br /></p>

<h4 id="-クロス集計表を作成する">③ クロス集計表を作成する</h4>

<p>集計する２つの列の値が整数やカテゴリカルデータであれば、クロス集計表はとても簡単に作成できます。
18歳から60歳までのそれぞれの年齢ごとの、月額給与が1,000ドル以上から20,000ドル以上までのクロス集計表を作成します。
この集計表の表のサイズは、43 x 20 になります。
Pandas では、以下のように指定します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
</pre></td><td class="code"><pre><span class="n">ct</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">crosstab</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">Age</span><span class="sh">'</span><span class="p">],</span> <span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">MonthlyRate</span><span class="sh">'</span><span class="p">])</span>
<span class="n">ct</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>結果は、以下のようになります。</p>

<p><img src="/images/img/cross_table_hr_age_monthlurate.png" alt="cross_tab_2" /><br /></p>

<h4 id="-ヒートマップで大小を可視化する">④ ヒートマップで大小を可視化する</h4>

<p>それぞれのセルの大小関係を可視化するため、ヒートマップで色の濃淡で大小関係を見るとことにします。ヒートマップは今回のように表のサイズが大きい場合に特に有効な方法といえます。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre><span class="c1"># figsizeを変更するモジュール rcParsmsを読み込みます
</span><span class="kn">from</span> <span class="n">pylab</span> <span class="kn">import</span> <span class="n">rcParams</span>
<span class="c1"># figsize を24 x 13インチにします
</span><span class="n">rcParams</span><span class="p">[</span><span class="sh">'</span><span class="s">figure.figsize</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">24</span><span class="p">,</span><span class="mi">13</span>
<span class="c1"># クロス集計表のデータフレーム ct のヒートマップを作成します。
# 色だけでなく、度数も表示するため、annot = True を指定します
</span><span class="n">sns</span><span class="p">.</span><span class="nf">heatmap</span><span class="p">(</span><span class="n">ct</span><span class="p">,</span> <span class="n">annot</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="sh">'</span><span class="s">BuGn</span><span class="sh">'</span><span class="p">)</span>
<span class="c1"># カレントディレクトリにヒートマップ図をimg_hr.pngとして保存します
</span><span class="n">plt</span><span class="p">.</span><span class="nf">savefig</span><span class="p">(</span><span class="sh">"</span><span class="s">img_hr.png</span><span class="sh">"</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><img src="/images/img/heatmap_age_monthlyrate_1.png" alt="heatmap_2" /><br /></p>

<h4 id="-列ごとまたは行ごとに正規化して比率で比較する">⑤ 列ごとまたは行ごとに正規化して比率で比較する</h4>

<p><code style="background: #cbe8f5; font-size: 1.00em;" class="language-plaintext highlighter-rouge">normalize = 'columns'</code> とすると、列ごとに0～1までに正規化(normalize)します。また、小数点以下2桁でパーセント表示したい場合は、<code style="background: #cbe8f5; font-size: 1.00em;" class="language-plaintext highlighter-rouge">ct2.style.format("{:.2%}")</code> とします。　ここでは、婚姻状況(MaritalStatus)と退職状況(Attrition)で見てみたいと思います。　まずは、列ごとに正規化します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
</pre></td><td class="code"><pre><span class="n">ct</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">crosstab</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">MaritalStatus</span><span class="sh">'</span><span class="p">],</span> <span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">Attrition</span><span class="sh">'</span><span class="p">],</span> <span class="n">normalize</span> <span class="o">=</span> <span class="sh">'</span><span class="s">columns</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ct</span><span class="p">.</span><span class="n">style</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="sh">"</span><span class="s">{:.2%}</span><span class="sh">"</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><img src="/images/img/column_norm.png" alt="norm_1" /><br /></p>

<p>行単位で正規化したい場合は、<code style="background: #cbe8f5; font-size: 1.00em;" class="language-plaintext highlighter-rouge">normalize = 'index'</code>とすればいいだけです。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ct</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">crosstab</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">MaritalStatus</span><span class="sh">'</span><span class="p">],</span> <span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">Attrition</span><span class="sh">'</span><span class="p">],</span> <span class="n">normalize</span> <span class="o">=</span> <span class="sh">'</span><span class="s">index</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ct</span><span class="p">.</span><span class="n">style</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="sh">"</span><span class="s">{:.2%}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="/images/img/index_norm.png" alt="norm_2" /><br /></p>]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="Function" /><summary type="html"><![CDATA[50列以上ある複雑なデータセットから「どの変数同士に関係がありそうか」を 見つけるための実践的なサーチ方法をまとめたリファレンスです。 Pandas のクロス集計表と Seaborn のヒートマップを使い、 度数分布の確認、クロス集計、正規化、可視化までを通して データの構造を素早く理解し“発見の糸口”をつかむ手順を解説します。]]></summary></entry><entry><title type="html">DataFrame, ndarray, list の使い分けについて実用的に考える</title><link href="https://mnogress.github.io/python/python_ndarray_dataframe_conversion/" rel="alternate" type="text/html" title="DataFrame, ndarray, list の使い分けについて実用的に考える" /><published>2026-03-22T00:00:00+00:00</published><updated>2026-03-24T09:00:00+00:00</updated><id>https://mnogress.github.io/python/python_ndarray_dataframe_conversion</id><content type="html" xml:base="https://mnogress.github.io/python/python_ndarray_dataframe_conversion/"><![CDATA[<p>このブログではデータハンドリングの基本である、DataFrame, ndarray, list の形式変換について「DataFrame,  ndarray,  list の使い分けについて実用的に考える」という問いに対してブログにしました。</p>

<!--more-->

<h3 id="この記事の目的">この記事の目的</h3>

<p>データ分析をするデータセットはそのほとんどは、n行 ｘ ｍ列の２次元のデータです。２次元のデータを扱うためのデータ形式には、Pandas のデータフレーム、Numpyのndarray、Python標準の list が一般的です。それぞれの形式をその用途に合わせて相互変換します。</p>

<p>このブログでは、２次元のデータに絞って、データ分析の観点から使い方に合わせて変換できることを目標にしています。</p>

<style type="text/css">

</style>

<h3 id="dataframe---ndarray---list-間の相互変換">DataFrame &lt;-&gt; ndarray &lt;-&gt; list 間の相互変換</h3>

<p>Python では次の3つの形式をよく使います：</p>

<ul>
  <li><strong>list（リスト）</strong></li>
  <li><strong>ndarray（NumPy 配列）</strong></li>
  <li><strong>DataFrame（Pandas の表形式データ）</strong></li>
</ul>

<p>これらは用途が違うため、必要に応じて相互に変換して使います。</p>

<h4 id="1-list--ndarraynumpy-配列">1. list → ndarray（NumPy 配列）</h4>

<p>Python の list を NumPy の ndarray に変換します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="code"><pre><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">my_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">my_array</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">my_list</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h4 id="2-ndarray--list">2. ndarray → list</h4>

<p>NumPy 配列を Python の list に戻します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="n">my_list</span> <span class="o">=</span> <span class="n">my_array</span><span class="p">.</span><span class="nf">tolist</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></figure>

<hr />

<h4 id="3-ndarray--dataframepandas">3. ndarray → DataFrame（Pandas）</h4>

<p>NumPy 配列を Pandas の DataFrame に変換します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="code"><pre><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="n">my_df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">(</span><span class="n">my_array</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<hr />

<h4 id="4-dataframe--ndarray">4. DataFrame → ndarray</h4>

<p>DataFrame から ndarray に変換します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="n">my_array</span> <span class="o">=</span> <span class="n">my_df</span><span class="p">.</span><span class="n">values</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>※ <code class="language-plaintext highlighter-rouge">.values</code> は ndarray を返します<br />
（Pandas 1.0以降は <code class="language-plaintext highlighter-rouge">.to_numpy()</code> を使うことも推奨されています）</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
</pre></td><td class="code"><pre><span class="n">my_array</span> <span class="o">=</span> <span class="n">my_df</span><span class="p">.</span><span class="nf">to_numpy</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h3 id="dataframe---ndarray---list-相互変換イメージ">DataFrame &lt;-&gt; ndarray &lt;-&gt; list 相互変換イメージ</h3>

<p><img src="/images/img/df_ndarray_list_conversion.png" alt="df_ndarray_list_conversion" height="600px" width="600px" /><br /></p>

<h3 id="変換一覧">変換一覧　</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">変換</th>
      <th style="text-align: left">コード</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>list → ndarray</strong></td>
      <td style="text-align: left"><span class="bleu2"> np.array(my_list)</span></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>ndarray → list</strong></td>
      <td style="text-align: left"><span class="bleu2">my_array.tolist()</span></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>ndarray → DataFrame</strong></td>
      <td style="text-align: left"><span class="bleu2">pd.DataFrame(my_array)</span></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>DataFrame → ndarray</strong></td>
      <td style="text-align: left"><span class="bleu2">my_df.values</span> または <span class="bleu2">my_df.to_numpy()</span></td>
    </tr>
  </tbody>
</table>

<h3 id="pandas-が用意する二次元データセットdataframeデータフレーム">Pandas が用意する二次元データセット｜DataFrame：データフレーム</h3>

<p>Pandasは、Pythonでのデータ分析ライブラリとして最も活⽤されているライブラリです。</p>

<p>PandasはNumpyを、Numpyを基盤に、シリーズ（Series、１次元データ）とデータフレーム（DataFrame、二次元データ）という二つのデータ型を提供します。</p>

<p>特に、データフレームは使いやすく、豊富な機能(メソッド)が用意され、データ分析のための必須のデータセットを扱う二次元データです。</p>

<div class="box33">
    <span class="box-title">DataFrameの使い道</span>
  <ol>  
<li>DataFrameはインデックス（index）やカラム（column）名を指定して、Excelのシートのようにデータセットを用意するために利用します</li>
 </ol>
</div>

<h3 id="数値計算に特化したnumpy-ndarray">数値計算に特化したNumPy ndarray</h3>

<p>NumPy（ナンパイ）は、<strong>数値計算を効率よく行うためのPythonのライブラリ</strong>です。
Pythonには標準で「リスト型」がありますが(後述します)、大量の数値データを扱うときは処理が遅くなったり、複雑になったりします。そこで役に立つのが <strong>NumPy</strong> です。</p>

<h3 id="numpy-を使うとできること"><strong>NumPy を使うとできること</strong></h3>

<p>(1)  <strong>多次元配列（行列など）を高速に扱える</strong><br /> 
(2)  <strong>標準偏差・分散などの統計量を簡単に計算できる</strong><br /> 
(3)  科学技術計算や、機械学習・ディープラーニングでもよく使われる</p>

<h3 id="numpy-の-ndarrayエヌディーアレイとは"><strong>NumPy の ndarray（エヌディーアレイ）とは？</strong></h3>

<p>NumPyには <strong>ndarray（エヌディーアレイ）</strong> という、数値データのための特別な配列型があります。</p>

<p>(1) 見た目はPythonのリストに似ている<br />
(2) しかし、<strong>ベクトル計算のように、要素をまとめて高速に計算できる</strong><br /><br />
    （例：配列に <span class="rouge">+1</span> すると、全ての要素に一気に1が足される）</p>

<h3 id="ndarray-と-list-の計算の違い">ndarray と list の計算の違い</h3>

<p><img src="/images/img/ndarray_vs_list.png" alt="ndarray_vs_list" height="600px" width="600px" /><br /></p>

<div class="box33">
    <span class="box-title">ndarrayの使い道</span>
  <ol>  
<li>機械学習での学習用と検証用に分割したデータセットなど分析モデルの入出力形式です</li>
 </ol>
</div>

<p class="notice--danger"><strong>Pandas, Numpyとも「統計量」を算出するメソッドは多数提供されています。Pandas の方が使いやすく、見やすいという意見も多いです。</strong></p>

<h3 id="python-にもともと用意されている配列listリスト"><strong>Python にもともと用意されている配列：list（リスト）</strong></h3>

<p>Python には <strong>list（リスト）</strong> という、複数の値をひとまとめにして扱える便利なデータ形式があります。</p>

<p>(1) 1つの変数の中に、いくつものデータを入れられる<br />
         例：<span class="rouge">[1, 2, 3]</span> や <span class="rouge">[“apple”, “banana”]</span><br />
(2) Python では、<strong>入力や出力でよく使われる基本的なデータ形式</strong></p>

<p>そのため「とりあえず配列を使いたい」というときは、まず list を使うことが多いです。</p>

<div class="box33">
    <span class="box-title">listの使い道</span>
  <ol>  
<li>インデックス番号（添字と呼んだりします）で要素を指定することができる、Pyhtonプログラムの入出力データの標準的な配列形式です
</li>
 </ol>
</div>

<h3 id="まとめ">まとめ</h3>

<table class="table">
  <thead>
    <tr>
      <th style="text-align: left"> </th>
      <th style="text-align: left">DataFrame</th>
      <th style="text-align: left">ndarray</th>
      <th style="text-align: left">list</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">利用するライブラリ</td>
      <td style="text-align: left">Pandas</td>
      <td style="text-align: left">Numpy</td>
      <td style="text-align: left">Python標準</td>
    </tr>
    <tr>
      <td style="text-align: left">ラベルインデックス<br />(列、行に任意の名前を付けること)</td>
      <td style="text-align: left">可（列名、行名を指定してにデータの操作が可能）</td>
      <td style="text-align: left">不可(0から始まるインデックス番号で操作する)</td>
      <td style="text-align: left">不可(0から始まるインデックス番号で操作する)</td>
    </tr>
    <tr>
      <td style="text-align: left">特徴</td>
      <td style="text-align: left">使いやすい、メソッドが豊富</td>
      <td style="text-align: left">計算に特化した配列形式</td>
      <td style="text-align: left">tuple, dictionaryと並ぶ配列形式の一つ</td>
    </tr>
    <tr>
      <td style="text-align: left">目的</td>
      <td style="text-align: left">欠損値処理、標準化等の分析データの整形</td>
      <td style="text-align: left">機械学習、ディープラーニングの目的、説明変数等</td>
      <td style="text-align: left">Pythonプログラムのデータの入出力等</td>
    </tr>
  </tbody>
</table>]]></content><author><name>サイト作成者</name></author><category term="[&quot;Python&quot;]" /><category term="DataFrame" /><category term="ndarray" /><category term="list" /><summary type="html"><![CDATA[データ分析でよく使う DataFrame・ndarray・list の違いと使い分けを、実務目線でわかりやすく整理した How To 記事です。2次元データを扱う際に、それぞれの形式がどんな場面で適しているのかを比較し、用途に応じて変換できるようになることを目的に解説しています。]]></summary></entry><entry><title type="html">Python と SPSS® Modeler で XGBoost の特徴量選択を比較する</title><link href="https://mnogress.github.io/python/XGBoost_Python_vs_SPSS/" rel="alternate" type="text/html" title="Python と SPSS® Modeler で XGBoost の特徴量選択を比較する" /><published>2026-03-11T00:00:00+00:00</published><updated>2026-03-23T09:00:00+00:00</updated><id>https://mnogress.github.io/python/XGBoost_Python_vs_SPSS</id><content type="html" xml:base="https://mnogress.github.io/python/XGBoost_Python_vs_SPSS/"><![CDATA[<p>特徴量選択（feature selection）＝ 「どれを説明変数として使うか」は、データ分析では重要です。このBlogでは、特徴量選択についてXGBoostのアルゴリズムでSPSS® Modeler の特徴量選択とPython Scikit-Learnの結果を比較してみたいと思います。</p>

<!--more-->

<h3 id="-この記事の結論-">🧩 この記事の結論 🧩</h3>

<p>データ分析では、どのアルゴリズムを使うかよりも、  <strong>「どの特徴量を使うか」</strong> を決める前段階の判断が結果を大きく左右します。</p>

<p>今回、Python（Scikit-Learn）と SPSS Modeler の XGBoost を比較したところ、  両者はほぼ同じ特徴量重要度を返しました。 つまり、ツールの違いによる差は小さく、本当に重要なのは <strong>ドメイン知識による次元削減</strong> です。特に今回の住宅価格データでは、  地理的座標（緯度・経度）はドメイン知識により除外されるべき特徴量であり、 これを含めるかどうかでモデルの解釈が大きく変わります。
<span class="bleu24">この記事では、「ツールの違いよりも、前段階の判断が本質である」 という点を実例を通して示します。</span></p>

<style type="text/css">

</style>

<h4 id="-前提pc環境">● 前提PC環境</h4>

<p>この記事で扱うPC環境は以下のとおりです。</p>

<table class="table">
  <thead>
    <tr>
      <th style="text-align: left">ソフトウエア</th>
      <th style="text-align: left">バージョン</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">SPSS Modeler</td>
      <td style="text-align: left">18.3  on Windows 10</td>
    </tr>
    <tr>
      <td style="text-align: left">XGBoost on Scikit-learn</td>
      <td style="text-align: left">1.4.0 on Python 3.8</td>
    </tr>
  </tbody>
</table>

<p>使うデータは<a href="https://scikit-learn.org/stable/datasets/real_world.html#california-housing-dataset" target="_blank">カリフォルニア住宅価格</a>です。Scikit-Learnの標準データセットです。</p>

<p>20640 rows × 9 columns　のサイズです。各々のカラムの意味は以下のとおりです。</p>

<ul>
  <li> <span class="bleu2">F0: (MedInc)median income in block- 収入の中央値</span></li> 
  <li> <span class="bleu2">F1: (HouseAge)median house age in block- 築年数の中央値</span></li> 
  <li> <span class="bleu2">F2: (AveRooms)average number of rooms- 平均部屋数</span></li>
  <li> <span class="bleu2">F3: (AveBedrms)average number of bedrooms-平均ベッドルーム数</span></li>
  <li> <span class="bleu2">F4: (Population)block population- 人口</span></li> 
  <li> <span class="bleu2">F5: (AveOccup)average house occupancy- 平均住宅占有率</span></li>
  <li> <span class="bleu2">F6: (Latitude)house block latitude- 家屋の緯度</span></li>
  <li> <span class="bleu2">F7:  (Longitude)house block longitude- ハウスブロックの経度</span></li>
</ul>
<p><br />
目的変数はカリフォルニア地区の住宅価格で単位は10万ドルです。データセット自体は1990年の米国国勢調査(U.S. census) のもので、一行に国勢調査で使われるブロックグループ単位で集計されています。ブロックグループは米国国勢調査において、最小の地理的な単位です。概ね、600～3,000人を一つのグループにしています。　<br /></p>

<p>世帯（household) は一つの住宅に居住する人数です。平均部屋数、ベッドルーム数はこの統計が世帯当たりで計算していますが、しばしばブロックグループ単位で計算すると「数世帯」と「多くの空き家」があるようなリゾート地では現実離れした大きな数字になる場合があります。それら大きな数字は外れ値としての処理が必要です。<br /></p>

<p><img src="/images/img/fig_0.png" alt="outliner" height="600px" width="600px" /><br /></p>

<p>外れ値の求め方には色々な方法があります。代表的な方法は以下の二つです。　いずれも、SPSS Modeler でサポートされています。</p>
<ol>
<li>平均から標準偏差のn倍(例：3倍）を範囲外とする</li>
<li>全体のnパーセンタイル（例：0.99)を超えるものを範囲外とする</li>
</ol>

<p>ここでは、方法2の 99パーセンタイルで平準化した場合の分布イメージを載せます。</p>

<p><img src="/images/img/fig_99.png" alt="percentail" height="600px" width="600px" /><br /></p>

<h3 id="-ドメイン知識による次元削減">🧠 ドメイン知識による次元削減</h3>

<p>特徴量の抽出で重要なタスクはドメイン知識を持つ、データセット由来の業界知識・専門知識を持ついわゆる専門家からデータセットのカラムのうち、特徴量（説明変数）としては
適切で無いものを除外する事です。今回の不動産価格においてはその地理的座標は不要とのことなので、ブロックの地理的座標軸（経度:F6、緯度:F7）は除きます。</p>

<div class="box33">
    <span class="box-title">ドメイン知識</span>
  <ol>  
<li>説明変数のうちドメイン知識よりブロックの地理的座標軸（経度:F6、緯度:F7）は除きます。</li>
 </ol>
</div>

<h3 id="-ドメイン知識で除かれる経度f6緯度f7のデータの影響を可視化">🧪 ドメイン知識で除かれる経度:F6、緯度:F7のデータの影響を可視化</h3>

<p>経度:F6、緯度:F7を除く前のXGBoostによるFeature Imporanceの計算をPythonで行ない、経度:F6、緯度:F7の影響を見ておく事とします。
Code は以下の通りです。　とても簡単なコードですね。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre><span class="kn">from</span> <span class="n">sklearn.datasets</span> <span class="kn">import</span> <span class="n">fetch_california_housing</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">seaborn</span> <span class="k">as</span> <span class="n">sns</span>
<span class="kn">import</span> <span class="n">xgboost</span> <span class="k">as</span> <span class="n">xgb</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span> 
<span class="kn">from</span> <span class="n">pylab</span> <span class="kn">import</span> <span class="n">rcParams</span>
<span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="n">rcParams</span><span class="p">[</span><span class="sh">'</span><span class="s">figure.figsize</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span><span class="mi">6</span>

<span class="n">housing_array</span> <span class="o">=</span> <span class="nf">fetch_california_housing</span><span class="p">()</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">housing_array</span><span class="p">.</span><span class="n">data</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">housing_array</span><span class="p">.</span><span class="n">target</span>

<span class="n">xgb_model</span> <span class="o">=</span> <span class="n">xgb</span><span class="p">.</span><span class="nc">XGBRegressor</span><span class="p">()</span>
<span class="n">xgb_model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>特徴量を可視化します。左の図のとおり、経度:F6、緯度:F7は計算上は、住宅価格の決定要因としては、収入に次ぐ要因となっています。
それらを除外して再計算した結果を右側に並べて見るとその影響がよく分かります。</p>

<p><img src="/images/img/fig_3.png" alt="feature_importance1" height="900px" width="900px" /><br /></p>

<h3 id="-python-scikit-learn-vs-spss-modeler-特徴量計算を比較する">🚀 Python (Scikit-Learn) vs SPSS® Modeler 特徴量計算を比較する</h3>

<p>次に同じデータセットでSPSS® Modeler を使って計算します。　左がPythonで右がSPSS® Modeler での計算結果です。 計算結果に少しだけ、差異があります。
Python では：</p>
<ul>
<li> <span class="bleu2">F0: (MedInc)median income in block-収入の中央値</span></li>
<li> <span class="bleu2">F5: (AveOccup)average number of household members-平均世帯人数</span></li>
<li> <span class="bleu2">F2: (AveRooms)average number of rooms-平均部屋数</span></li>
</ul>
<p>と平均住宅占有率が２番目に大きな影響力があるとい結果でしたが</p>

<p>SPSS® Modeler では：</p>
<ul>
<li> <span class="bleu2">F0: (MedInc)median income in block-収入の中央値</span></li>
<li> <span class="bleu2">F2: (AveRooms)average number of rooms-平均部屋数</span></li>
<li> <span class="bleu2">F5: (AveOccup)average number of household members-平均世帯人数</span></li>
</ul>
<p>とPython では3番目の<strong>平均部屋数</strong>が２番目という結果でしたが、それ以外は同じ順位でした。</p>

<p><img src="/images/img/fig_5.png" alt="feature_importance1" height="900px" width="900px" /><br /></p>

<p><span class="rouge">＊SPSS® Modelerでは、Feature をF1から始めて作図されます。本ブログではPythonとの比較のため、Python と同じようにF0からに変更しています。</span></p>

<h3 id="-spss-modeler-ストリームと設定">🎯 SPSS® Modeler ストリームと設定</h3>
<p>SPSS® Modeler 上でのストリームと設定の概要は以下のとおりです。</p>

<h4 id="-ストリーム画面">① ストリーム画面</h4>
<p><img src="/images/img/fig_6.png" alt="SPSS_Modeler1" height="600px" width="600px" /><br /></p>

<h4 id="-データ型ノードの設定">② データ型ノードの設定</h4>
<p><img src="/images/img/fig_7.png" alt="SPSS_Modeler1" height="600px" width="600px" /><br /></p>

<h4 id="-xgboost-tree-pythonノードの作成オプション">③ XGBoost Tree Pythonノードの作成オプション</h4>
<p><img src="/images/img/fig_8.png" alt="SPSS_Modeler1" height="450px" width="450px" /><br /></p>

<div class="box33">
    <span class="box-title">カルフォルニアの住宅価格の決定要因</span>
  <ol>
<li>収入(お金に余裕があるかどうか)　＞　部屋数（家の広さ）＞　平均世帯人数（何人暮らしか）</li>
<li>築年数はさほど影響しない</li>
<li>計算に使用したアルゴリズム XGBoostにおいてPython, SPSS® ともほぼ同じ結論を導いている</li>
</ol>
</div>]]></content><author><name>サイト作成者</name></author><category term="[&quot;Python&quot;]" /><category term="Python" /><category term="SPSS Modeler" /><category term="XGBoost" /><summary type="html"><![CDATA[Python（Scikit-Learn）と SPSS Modeler の XGBoost を比較し、特徴量重要度がほぼ同じ結果になることを示しながら、実務で本当に重要なのはツールの違いではなく「どの特徴量を使うか」を決める前段階の判断であることを解説した記事です。地理的座標のようにドメイン知識で除外すべき特徴量を含めるかどうかでモデル解釈が大きく変わる点を、実例と可視化を通して示しています。]]></summary></entry><entry><title type="html">イラレのアピアランスパネルを理解する</title><link href="https://mnogress.github.io/illustrator/illustrator_pannel_1/" rel="alternate" type="text/html" title="イラレのアピアランスパネルを理解する" /><published>2026-03-01T00:00:00+00:00</published><updated>2026-04-12T09:00:00+00:00</updated><id>https://mnogress.github.io/illustrator/illustrator_pannel_1</id><content type="html" xml:base="https://mnogress.github.io/illustrator/illustrator_pannel_1/"><![CDATA[<p>アピアランスパネルは、オブジェクトの実体は同じままで、見た目を変えるものです。イラストレーターの数ある機能の中で押さえておくべアピアランス機能にいて説明します。<!--more--></p>

<h3 id="-このページの目的">🎯 このページの目的</h3>

<p>アピアランスパネルは、Illustrator の中でも特に「デザインの自由度」と「修正のしやすさ」を両立させるための重要な機能です。</p>

<p>「塗り」・「線」・「効果」を重ねて見た目だけを変えられるため、同じオブジェクトから複数のバリエーションを作ったり、後から簡単に調整したりできます。</p>

<p>この記事では、アピアランスの仕組みと活用方法を整理し、<strong>文字装飾や図形デザインを効率的に行うための基本をまとめます。</strong></p>

<hr />
<style type="text/css">
</style>

<h3 id="-アピアランスパネルとは見た目を変えるためのパネル">🌱 アピアランスパネルとは見た目を変えるためのパネル</h3>

<ul>
  <li>アピアランスパネルは、<strong>ウインドウ→アピアランス</strong>で出現します。</li>
  <li>通常、一つのオブジェクトに対して<strong>「塗り」</strong>と　<strong>「線」</strong>の設定をひとつずつ行うことができます。</li>
  <li>アピアランスパネルを使うと、この一対の塗りと線の設定を複数設定し編集することができます。</li>
  <li>アピアランスとは英語で外見とか見た目と訳されます。　すなわち、オブジェクトの実体（内面）は同じままで、見た目を変えるためのパネルということです。</li>
  <li>イラストレーターでのアピアランスは 、<strong>「塗り」「線」,「効果」,「不透明度」</strong>の4つの属性から構成されています。</li>
  <li>アピアランスパネルでは４つすべての属性を操作できます。</li>
</ul>

<p>以下の図では、</p>

<p><img src="/images/img/appearance_intro_2.png" alt="appearance_panel" height="600px" width="600px" /><br /></p>

<p>この図では、３層のアピアランスの構造になっています。上からパス、<strong>「線」,「塗」</strong> りの順に重なっています。<br /></p>

<div class="box33">
    <span class="box-title">概要</span>
    <ol>
<li> パス＝オブジェクトに対してのアピアランスです。実際のオブジェクトは左の円です。</li>
<li>線には、<strong>イエロー(#FFFF00)</strong>で太さは<span class="bleu">3pt</span>のアピアランスがあたっています。　この部分だけ色が変わっていますが、線のアピアランスを選択しています。</li>
<li>塗りは、<strong>オレンジ(#C1272D)</strong>のアピアランスがかかっています</li>
<li>アピアランスは、パス、線、塗それぞれにかけることが可能です。さらにグループ、サブレイヤー、レイヤのレベルまでアピアランスの
対象になることができます。</li>
   </ol>
</div>

<p>最も一般的なパス、線、塗に対するアピアランスについて研究します。</p>

<hr />

<h3 id="-見た目が違うだけで図形は元のままだから修正に強い">🧩 見た目が違うだけで、図形は元のままだから修正に強い</h3>

<ul>
  <li>アピアランスでは「塗り」「線」「効果」を複数重ねることができます。</li>
  <li>特に効果は、オブジェクトの形そのものを変えずに“見た目だけ”を変えられるのが特徴です。</li>
</ul>

<p>下の動画では、<strong>「パス」・「線」・「塗り」</strong>のそれぞれにジグザグ効果をかけ、  元はただの円が「ばくだん」のような形に見えるようになっています。</p>

<ul>
  <li>同じジグザグでも  「パスにかけるのか」「線にかけるのか」「塗りにかけるのか」で  見た目がまったく変わるということです。</li>
  <li>そして、それらが重なって最終的な見た目が作られます。</li>
  <li>見た目がどれだけ複雑になっても、実体は元の円のままです。<strong>「表示 → アウトライン」</strong>で確認すると一目瞭然です。</li>
  <li>
    <p>この“実体はそのまま・見た目だけ変える”という仕組みこそ、アピアランスが修正に強く、流用しやすいデザインを作れる理由です。</p>

    <p><strong>「パス」、「線」、「塗り」</strong>、それぞれのジグザグの「あて方」で効果が　<strong>「パス」、「線」、「塗り」</strong>のそれぞれにあたる、そしてそれらが合わさるとはどういうことか、この例で理解できると思います。</p>
  </li>
</ul>

<p><img src="/images/img/%E3%82%B8%E3%82%B0%E3%82%B6%E3%82%B0%E3%82%A2%E3%83%94%E3%82%A2%E3%83%A9%E3%83%B3%E3%82%B90928_195e5c67ac.autosave1008.gif" alt="アピアランスをかける" height="100%" width="100%" /><br /></p>

<ul>
  <li>見た目が複雑になっても、オブジェクトは元の図形のままです。</li>
  <li>試しに <strong>「表示」メニュー</strong>で <strong>「アウトライン」</strong>をすれば一目瞭然です。</li>
  <li>このことが、アピアランスパネルの活用は修正に強く、流用しやすいパーツ作成のための必須ツールと言われる理由です。</li>
</ul>

<h3 id="-アピアランスの当たり方はそれぞれの重なり順で決まります">🧩 アピアランスの当たり方はそれぞれの重なり順で決まります</h3>

<ul>
  <li><strong>「新規線の追加」</strong>は、元の <strong>「線」</strong>に対してアピアランスをもう一つ重ねる操作です。</li>
  <li>動画の例では、新規線を追加すると、黄色・2pt の線アピアランスが複製され、同じ線が 2 枚重なった状態になります。</li>
  <li>複製された線は一番上に追加されます。</li>
  <li>この状態で、下側の線の色を黄色から青に変えても、上にある黄色の線が覆いかぶさっているため、青色は見えません。</li>
  <li>試しに、上側の黄色の線の太さを 「2pt → 1pt」 に細くすると、覆いかぶさる部分が減り、下の青い線が半分だけ見えてきます。</li>
</ul>

<p class="notice--primary"><strong>Notice:</strong> 
このように、アピアランスの見え方は  <strong>「どのアピアランスが上にあるか」＝重なり順</strong> で決まります。 
同じ種類のアピアランスを複数持っていても、順序が変わるだけで見た目は大きく変わります。</p>

<p><img src="/images/img/%E3%82%B8%E3%82%B0%E3%82%B6%E3%82%B0%E3%82%A2%E3%83%94%E3%82%A2%E3%83%A9%E3%83%B3%E3%82%B90928_195e5c67ac.autosave2.gif" alt="アピアランスの順番" height="600px" width="600px" /><br /></p>

<h3 id="-グラフィックスタイルに登録すればアピアランスを別のオブジェクトに簡単に反映できます">🧩 グラフィックスタイルに登録すれば、アピアランスを別のオブジェクトに簡単に反映できます</h3>

<ul>
  <li>アピアランスを別のオブジェクトにも使いたい場合は、<strong>「ウィンドウ」→「グラフィックスタイル」</strong>を開きます。</li>
  <li>アピアランスパネルで作成したスタイルを、そのままグラフィックスタイルパネルへドラッグすると登録できます。</li>
  <li>こうして登録しておけば、別の図形を選択してグラフィックスタイルをクリックするだけで、同じアピアランスを一瞬で適用できます。</li>
</ul>

<p><span class="bleu">毎回アピアランスを一から設定する必要がなくなり、デザインの統一やバリエーション作成がとても効率的になります。</span></p>

<p><img src="/images/img/graphic_style.gif" alt="アピアランスの順番" height="600px" width="600px" /><br /></p>

<h3 id="-アピアランスの分割でオブジェクトの中身にも反映させます">🍎 アピアランスの分割でオブジェクトの中身にも反映させます</h3>

<ol>
  <li><strong>「オブジェクト」メニュー</strong>から <strong>「アピアランスを分割」</strong>を選択します。</li>
  <li>すると、<strong>「アウトライン」</strong>で見るとこれまで、見た目だけのアピアランスが実際の図形として認識されています。</li>
  <li>ダイレクト選択ツールなどでこのオブジェクトを部分的に編集が可能になります。</li>
</ol>

<p><img src="/images/img/%E3%82%A2%E3%83%94%E3%82%A2%E3%83%A9%E3%83%B3%E3%82%B9%E5%88%86%E5%89%B2.gif" alt="アピアランスの順番" height="600px" width="600px" /><br /></p>

<ul>
  <li>アピアランスを分割すると、これまで“見た目だけ”だった効果や線・塗りが、実際のパスとして確定します。</li>
  <li>そのため、ダイレクト選択ツールなどで細かく形を編集できるようになりますが、同時にアピアランスとしての情報は失われます。</li>
  <li>つまり、分割前のように「線の太さを変える」「効果の数値を調整する」といったアピアランス編集はできなくなります。</li>
  <li>分割は“最終的な形を確定させたいとき”に使う操作であり、後から柔軟に調整したい場合は分割しない方が良い、という点がポイントです。</li>
</ul>]]></content><author><name>サイト作成者</name></author><category term="illustrator" /><category term="illustrator" /><category term="appearance_pannel" /><category term="design" /><summary type="html"><![CDATA[Illustrator のアピアランスパネルの仕組みと使い方を、塗り・線・効果の重なりや見た目の変化を GIF 動画つきでわかりやすく解説したページです。オブジェクトの実体を変えずに見た目だけを編集できるアピアランスの特徴や、重なり順・グラフィックスタイル・分割など、デザイン効率を高める基本操作を体系的にまとめています。]]></summary></entry><entry><title type="html">df_overview スクリプト</title><link href="https://mnogress.github.io/reference/df_overview/" rel="alternate" type="text/html" title="df_overview スクリプト" /><published>2026-01-31T00:00:00+00:00</published><updated>2026-03-22T15:23:00+00:00</updated><id>https://mnogress.github.io/reference/df_overview</id><content type="html" xml:base="https://mnogress.github.io/reference/df_overview/"><![CDATA[<p>データフレームの概要理解する “df_overview” スクリプトを紹介します。<!--more--></p>

<h4 id="-データを俯瞰する作業は分析の最初の重要なステップ">🧩 データを俯瞰する作業は分析の最初の重要なステップ</h4>

<p>データ分析を始めたばかりのとき、最もつまずきやすいのが 「データの全体像がつかめない」 という問題です。
列が多かったり、欠損があったり、文字列と数値が混ざっていたりすると、どこから手をつければよいのか迷ってしまいます。</p>

<p>そこで役立つのが、このページで紹介する  <span class="bleu">df_overview</span> スクリプトです。
<strong>列名・データ型・ユニーク数・欠損数</strong>などを一覧で確認できるため、データセットの特徴を短時間で把握し、次に行うべき前処理や分析の方向性を決める助けになります。</p>

<p>初心者にとって、こうした <strong>「データを俯瞰する作業」</strong>は、分析の最初の重要なステップです。</p>

<h4 id="-スクリプトの内容">🧩 スクリプトの内容</h4>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre><span class="c1"># 必要なモジュールをインポート
</span><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="c1"># DataFrame 要約　列番号、列名、ユニーク変数数、データタイプ、NaN の個数
</span><span class="n">pd</span><span class="p">.</span><span class="n">options</span><span class="p">.</span><span class="n">display</span><span class="p">.</span><span class="n">max_rows</span> <span class="o">=</span> <span class="mi">220</span>
<span class="c1">## Check for unique values of categorical variables
</span><span class="n">df_overview</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">([[</span><span class="n">i</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">unique</span><span class="p">()),</span> <span class="n">df</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">dtypes</span><span class="p">,</span> <span class="n">df</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">isnull</span><span class="p">().</span><span class="nf">sum</span><span class="p">()]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">df</span><span class="p">.</span><span class="n">columns</span><span class="p">],</span> 
                          <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">Feature</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Unique Values</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dtypes</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">NaN</span><span class="sh">'</span><span class="p">])</span>
<span class="n">df_overview</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h4 id="-結果">🧩 結果</h4>

<p><img src="/images/2024-07150340.png" alt="image" height="500px" width="500px" /><br /></p>

<h4 id="ユニーク数を見ると何がわかるのか">🧩「ユニーク数を見ると何がわかるのか」</h4>

<p>ユニーク数（その列に含まれる異なる値の数）を見ることで、<strong>列の性質</strong>がつかめます。
例えば、ユニーク数が少なければカテゴリ変数の可能性が高く、逆に非常に多ければIDのような識別子かもしれません。<br />
<span class="bleu">この情報は、どの列を分析に使えるか、どの列を前処理すべきかを判断する助けになります。</span></p>

<h4 id="欠損値が多い列はどう扱うのか">🧩「欠損値が多い列はどう扱うのか」</h4>

<p>欠損値（NaN）が多い列は、分析の精度に影響するため注意が必要です。
欠損が多い列は、</p>

<p>(1) 削除する<br />
(2) 平均値・中央値・最頻値で補完する<br />
(3) モデルを使って補完する<br />
(4) そもそも使わない列として除外する</p>

<p>などの判断が必要になります。まずは <strong>「どの列にどれくらい欠損があるのか」 を把握することが、前処理の第一歩です。</strong></p>

<h4 id="データ型を確認する理由">🧩「データ型を確認する理由」</h4>

<p>データ型（int, float, object など）を確認することで、その列がどのように扱われるべきかがわかります。
例えば、数字に見えるのに object 型になっている場合、文字列として扱われてしまい、計算や集計が正しくできません。
<strong>データ型の確認は、後の分析でエラーを防ぐための重要なチェックポイントです。</strong></p>

<h4 id="このスクリプトを使うとどんな分析準備が楽になるのか">🧩「このスクリプトを使うと、どんな分析準備が楽になるのか」</h4>

<p>df_overview を使うと、列名・ユニーク数・データ型・欠損数を一覧で確認できるため、次のような作業がスムーズになります。</p>

<p>(1) どの列を前処理すべきか判断しやすくなる<br />
(2) カテゴリ変数・数値変数の分類がすぐにできる<br />
(3) 欠損値の扱い方針を立てやすくなる<br />
(4) 不要な列（ID列など）を早い段階で除外できる</p>

<p>つまり、データセットの全体像を短時間でつかみ、分析の準備を効率化できるのが最大のメリットです。</p>

<h4 id="データフレームのインデックス番号インデックス名を指定してその行を削除する">データフレームのインデックス番号、インデックス名を指定してその行を削除する</h4>

<p>おまけとして、インデックス名を指定してその行を削除するとてもよく使うコマンドを併記します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="code"><pre><span class="c1"># データフレームの2行目にもタイトルの残骸があり、その行は無効なの
# 行を指定して削除する
# index[0] はデータフレームとしては最初の行だが、無効なため削除する
</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">drop</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">index</span><span class="p">[[</span><span class="mi">0</span><span class="p">]])</span>
</pre></td></tr></tbody></table></code></pre></figure>

<style>
</style>]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="Function" /><summary type="html"><![CDATA[データ分析の最初のステップとして、データセットの全体像を短時間で把握するための必須スクリプト df_overview を紹介します。列名・ユニーク数・データ型・欠損数を一覧で確認でき、次に行うべき前処理や分析方針を判断しやすくなるように、初心者がつまずきやすいポイントも丁寧に解説しています。]]></summary></entry><entry><title type="html">カテゴリカルデータの個数、構成比率、トータル行を集計、整形する</title><link href="https://mnogress.github.io/reference/df_velue_counts_formatting/" rel="alternate" type="text/html" title="カテゴリカルデータの個数、構成比率、トータル行を集計、整形する" /><published>2026-01-21T00:00:00+00:00</published><updated>2026-01-21T11:00:00+00:00</updated><id>https://mnogress.github.io/reference/df_velue_counts_formatting</id><content type="html" xml:base="https://mnogress.github.io/reference/df_velue_counts_formatting/"><![CDATA[<p>カテゴリカルデータの個数、構成比率、トータル行を集計、整形する方法をまとめました。</p>

<p>データフレームの特定の列（例：部門）ごとに、❶件数（何件あるか）、❷構成比（全体のうち何%か）を出して、
後で加工しやすい「表（データフレーム）」の形にまと、ついでに合計（Total）行も付けるためのスクリプトをまとめました。
<!--more--></p>

<h4 id="サンプルコードの紹介">サンプルコードの紹介</h4>

<p>カテゴリカルデータのそれぞれの個数を大きい順に表示し、その構成比率とトータル行を追加した内容を
データフレームとして提供するスクリプトになります。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre><span class="c1"># 件数（count）と構成比（normalize=Trueで比率が出せる）
</span><span class="n">vc</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">col_name</span><span class="p">].</span><span class="nf">value_counts</span><span class="p">(</span><span class="n">dropna</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>         <span class="c1"># 件数
</span><span class="n">ratio</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="n">col_name</span><span class="p">].</span><span class="nf">value_counts</span><span class="p">(</span><span class="n">dropna</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">normalize</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>  <span class="c1"># 構成比
</span>
<span class="c1"># データフレーム化して結合
</span><span class="n">tab</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">件数</span><span class="sh">'</span><span class="p">:</span> <span class="n">vc</span><span class="p">,</span>
    <span class="sh">'</span><span class="s">構成比</span><span class="sh">'</span><span class="p">:</span> <span class="n">ratio</span>
<span class="p">})</span>

<span class="c1"># 合計行（Total）を追加
</span><span class="n">tab</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="sh">'</span><span class="s">Total</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">件数</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tab</span><span class="p">[</span><span class="sh">'</span><span class="s">件数</span><span class="sh">'</span><span class="p">].</span><span class="nf">sum</span><span class="p">()</span>
<span class="n">tab</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="sh">'</span><span class="s">Total</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">構成比</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tab</span><span class="p">[</span><span class="sh">'</span><span class="s">構成比</span><span class="sh">'</span><span class="p">].</span><span class="nf">sum</span><span class="p">()</span>

<span class="c1"># 表示用フォーマット
</span><span class="n">format_dict</span> <span class="o">=</span> <span class="p">{</span><span class="sh">'</span><span class="s">構成比</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">{:.1%}</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">件数</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">{:n}</span><span class="sh">'</span><span class="p">}</span>
<span class="nf">display</span><span class="p">(</span><span class="n">tab</span><span class="p">.</span><span class="n">style</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">format_dict</span><span class="p">))</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h4 id="サンプルデータフレーム">サンプルデータフレーム</h4>

<p>以下のとおり、サンプルデータフレームの集計結果をデータフレームとして得ることができます。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre><span class="c1"># 演習用のデータフレームを作成します。
</span><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span> <span class="sh">'</span><span class="s">ID</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">01285679</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">01340788</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">02123782</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">10541976</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">12297411</span><span class="sh">'</span><span class="p">,</span> 
                             <span class="sh">'</span><span class="s">13299899</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">48144450</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">55339981</span><span class="sh">'</span><span class="p">],</span>
                   <span class="sh">'</span><span class="s">出身地</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">東京都</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">山口県</span><span class="sh">"</span><span class="p">,</span><span class="sh">'</span><span class="s">大阪府</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">千葉県</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">東京都</span><span class="sh">'</span><span class="p">,</span>
                          <span class="sh">'</span><span class="s">埼玉県</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">千葉県</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">千葉県</span><span class="sh">'</span><span class="p">],</span>
                  <span class="sh">'</span><span class="s">部門</span><span class="sh">'</span><span class="p">:</span>   <span class="p">[</span><span class="sh">"</span><span class="s">首都圏営業部</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">関西支部</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">本部総務</span><span class="sh">"</span><span class="p">,</span>
                               <span class="sh">"</span><span class="s">研究開発</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">東北支部</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">北海道支部</span><span class="sh">"</span><span class="p">,</span>
                               <span class="sh">"</span><span class="s">首都圏営業部</span><span class="sh">"</span><span class="p">,</span><span class="sh">"</span><span class="s">研究開発</span><span class="sh">"</span><span class="p">]},</span>
                    <span class="n">index</span><span class="o">=</span><span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">])</span>
<span class="c1"># オリジナルのデータフレームを表示</span>
</pre></td></tr></tbody></table></code></pre></figure>

<div class="notice"><span style="font-size:1.15em;">
<p><strong>サンプルデータフレームを表示</strong>:</p>

<p><code style="background: #f5e964; font-size: 120%" class="language-plaintext highlighter-rouge">&gt;&gt; display(df)</code></p>

<p><img src="/images/fig_1.png" alt="image" height="300px" width="300px" /><br /></p>

<p>–&gt; 部門別に集計します。</p>
</span></div>

<h4 id="スクリプトの結果">スクリプトの結果</h4>

<div class="notice"><span style="font-size:1.15em;">
<p><strong>‘部門’で集計結果を表示</strong>:</p>

<p><code style="background: #f5e964; font-size: 120%" class="language-plaintext highlighter-rouge">&gt;&gt; format_dict = {'構成比': '{:.1%}', '件数' : '{:n}'}</code> <br /><code style="background: #f5e964; font-size: 120%" class="language-plaintext highlighter-rouge">&gt;&gt; display(tab.style.format(format_dict))</code></p>

<p><img src="/images/fig_2.png" alt="image" height="300px" width="300px" /><br /></p>

</span></div>]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="Function" /><summary type="html"><![CDATA[カテゴリカルデータの個数・構成比率・Total 行を、最小限のコードで一度に集計できる実務向けスクリプトを紹介します。日常の Excel 作業を Python でサクッと再現したい人のために、見やすい表への整形までをシンプルにまとめた How To 記事です。]]></summary></entry><entry><title type="html">【Pandas】日付の新しい方を残す重複排除</title><link href="https://mnogress.github.io/reference/sort_drop_duplicate/" rel="alternate" type="text/html" title="【Pandas】日付の新しい方を残す重複排除" /><published>2025-10-20T00:00:00+00:00</published><updated>2025-10-20T15:23:00+00:00</updated><id>https://mnogress.github.io/reference/sort_drop_duplicate</id><content type="html" xml:base="https://mnogress.github.io/reference/sort_drop_duplicate/"><![CDATA[<p>日付の新しい方を残す重複排除やり方をまとめました。重複排除するルールとして、❶新しいものを残す。❷古い方を残す。といった一工夫が必要な場合があります。そのステップをまとめました。<!--more--> 概要は以下のとおりです。</p>
<div class="box33">
    <span class="box-title">概要</span>
    <ol>
      <li><strong>keep='first'</strong> でデータフレームを上から下へ重複チェックするとして、最初のものを残す</li>
      <li>新しいものが最初にチェックされるよう降順に並べ替える</li>
    </ol> 
</div>

<style>
</style>

<h4 id="step-1datetime-オブジェクトの確認">Step 1：datetime オブジェクトの確認</h4>

<p>日付の列でソートするには、その列がdatetime オブジェクトでなければなりません。まず、ソートする列のデータ型を確認します。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre><span class="c1"># データ型を確認する
</span>
<span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">].</span><span class="n">dtypes</span>

<span class="o">&gt;&gt;</span> <span class="nf">dtype</span><span class="p">(</span><span class="sh">'</span><span class="s">&lt;M8[ns]</span><span class="sh">'</span><span class="p">)</span>  <span class="o">--&gt;</span> <span class="n">OK</span>
<span class="o">&gt;&gt;</span> <span class="nf">dtype</span><span class="p">(</span><span class="sh">'</span><span class="s">O</span><span class="sh">'</span><span class="p">)</span>  <span class="o">--------&gt;</span> <span class="n">NG</span>  <span class="n">datetime</span> <span class="n">型式にする必要ある</span>
<span class="o">&gt;&gt;</span> <span class="nf">dtype</span><span class="p">(</span><span class="sh">'</span><span class="s">int64</span><span class="sh">'</span><span class="p">)</span>  <span class="o">----&gt;</span> <span class="n">NG</span>  <span class="n">datetime</span> <span class="n">型式にする必要ある</span>
<span class="o">&gt;&gt;</span> <span class="nf">dtype</span><span class="p">(</span><span class="sh">'</span><span class="s">float64</span><span class="sh">'</span><span class="p">)</span> <span class="o">---&gt;</span> <span class="n">NG</span>  <span class="n">datetime</span> <span class="n">型式にする必要ある</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>NGの場合には、datetime オブジェクトにします。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="code"><pre><span class="c1"># データ型をdatetime にする
</span>
<span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">]</span><span class="o">=</span><span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">])</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h4 id="step-2新しい順に並び替える">Step 2：新しい順に並び替える</h4>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="code"><pre><span class="c1"># ascending = False -&gt; 値の大きい順、日付けの新しい順　
</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">([</span><span class="sh">"</span><span class="s">date</span><span class="sh">"</span><span class="p">],</span> <span class="n">ascending</span> <span class="o">=</span> <span class="bp">False</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p>列名<strong>date</strong>で新しい順に並び替えておく。</p>

<h5 id="ascending--false-降順-新しいものから古いもの"><em>ascending = False</em> » 降順 » 新しいものから古いもの</h5>

<div class="box33">
<span class="box-title">Point!</span>
<dl><strong>ascending の意味：上昇</strong>
<dt>ascending = True</dt> 
<dd>昇順　古いものから新しいものへ　小さいものから大きいものへ</dd>
<dt>ascending = False</dt>
<dd>降順　新しいものから古いものへ　大きいものから小さいものへ</dd>
</dl>
</div>

<h4 id="step-3列a例社員番号の重複排除の基準として新しいものを残す">Step 3：列A（例：社員番号）の重複排除の基準として新しいものを残す</h4>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="code"><pre><span class="c1"># 新しいものが最初にソートされているので、keep='first'とする
# inplace=True で上書きする
# 前後にdf.shapeで要素数をプリントし排除された数を把握する
</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
<span class="n">df</span><span class="p">.</span><span class="nf">drop_duplicates</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="sh">'</span><span class="s">社員番号</span><span class="sh">'</span><span class="p">,</span> <span class="n">keep</span><span class="o">=</span><span class="sh">'</span><span class="s">first</span><span class="sh">'</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>]]></content><author><name>サイト作成者</name></author><category term="Reference" /><category term="Pandas" /><category term="Function" /><summary type="html"><![CDATA[日付の新しい（または古い）方を残して重複排除するための実務的な手順を、datetime の確認からソート、drop_duplicates まで3ステップでまとめた How To 記事です。最初に並び替えておくことが成功のポイントで、日常の集計で頻出する処理を Python で確実に再現できるように解説しています。]]></summary></entry><entry><title type="html">seaborn barplot の棒グラフに平均値のannotationをつける</title><link href="https://mnogress.github.io/python/seaborn_brplot_annotation/" rel="alternate" type="text/html" title="seaborn barplot の棒グラフに平均値のannotationをつける" /><published>2025-06-11T00:00:00+00:00</published><updated>2025-10-30T09:00:00+00:00</updated><id>https://mnogress.github.io/python/seaborn_brplot_annotation</id><content type="html" xml:base="https://mnogress.github.io/python/seaborn_brplot_annotation/"><![CDATA[<p><a href="https://seaborn.pydata.org" target="_blank">seaborn</a>は<a href="https://matplotlib.org" target="_blank">matplotlib</a>をベースにしたデータビジュアライゼーションライブラリです。countplot はカテゴリカルデータを集計から度数分布図までを一気に行なってくれる大変便利なツールです。</p>

<p><strong>barplot</strong> で棒グラフを作成し、各々のbarの値をannotationしたいと思います。Excelの代わりにseanborn でサクサク、グラフ化します。</p>

<!--more-->
<style type="text/css">
</style>

<h3 id="サンプルデータセット">サンプルデータセット</h3>

<ol>
  <li>日本語化した棒グラフを作成するためにデータセットを用意します。<br /></li>
  <li>Kagle のHRデータを編集して使っています。HRデータのうち、<strong>Age</strong>,	<strong>EducationField</strong>,	<strong>TotalWorkingYears</strong>　<strong>MonthlyIncome</strong> の列をそれぞれ、「年齢」、「専攻」、「勤続年数」、「月収」と書き換えました。<br /></li>
  <li><strong>EducationField</strong>で含まれるカテゴリカルデータを日本語するとろまでは同じです。<br /></li>
  <li>二次元データを作るために、「専攻」のカテゴリカルデータを軸に<strong>groupby</strong>メソッドでデータを集約します。<br /></li>
  <li><strong>groupby</strong>メソッドを使うと<strong>mean()</strong>平均値 や<strong>sum()</strong>トータルで各カテゴリー値を集約できますが、平均値で各カテゴリの値を集約したいと思います。</li>
</ol>

<h3 id="groupby-での集約のイメージ">groupby での集約のイメージ</h3>

<p><img src="/images/img/seaborn_pic4.png" alt="groupby" height="600px" width="600px" /></p>

<h3 id="reset_indexでx軸y軸をcolumnに配置する">reset_index()でx軸、y軸をColumnに配置する</h3>

<p>seaborn の barplotを利用するためには、ｘ軸、y軸ともデータフレームのcolumn で指定する必要があります。　しかし、groupby で集約したカテゴリカルデータのcolumn
は、集約化されたデータフレームではラベルインデックスとして配置されています。　従って、reset_index()でカテゴリをcolumnに再配置させます。そのコードとデータフレームを図示しておきます。</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="code"><pre><span class="c1">#月収の列のみにする
</span><span class="n">df_gsum</span> <span class="o">=</span>  <span class="n">df_gsum</span><span class="p">.</span><span class="n">iloc</span><span class="p">[:,</span> <span class="p">[</span><span class="mi">2</span><span class="p">]]</span>

<span class="c1">#ラベルインデックスをreset_index()で列に配置する
</span><span class="n">df_gsum</span> <span class="o">=</span> <span class="n">df_gsum</span><span class="p">.</span><span class="nf">reset_index</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></figure>

<p><img src="/images/img/seaborn_pic5.png" alt="reset_index()" height="600px" width="600px" /></p>

<h3 id="python-コードの紹介">Python コードの紹介</h3>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><table class="rouge-table"><tbody><tr><td class="gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code"><pre><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">seaborn</span> <span class="k">as</span> <span class="n">sns</span>
<span class="c1">#matplotlibのグラフをRetinaの高解像度で表示する
</span><span class="o">%</span><span class="n">config</span> <span class="n">InlineBackend</span><span class="p">.</span><span class="n">figure_formats</span> <span class="o">=</span> <span class="p">{</span><span class="sh">'</span><span class="s">png</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">retina</span><span class="sh">'</span><span class="p">}</span>
<span class="c1">#Jupyter Notebookの中で作図した画像を表示させる
</span><span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="c1">#matplotlib をインポートする
</span><span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="c1">#日本語タイトルのため、japanizeをインポートする
</span><span class="kn">import</span> <span class="n">japanize_matplotlib</span>
<span class="n">plt</span><span class="p">.</span><span class="n">rcParams</span><span class="p">[</span><span class="sh">'</span><span class="s">font.family</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="sh">'</span><span class="s">IPAexGothic</span><span class="sh">'</span>

<span class="n">order</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="s">マーケティング</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">理工学</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">医薬、保健</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">人文科学</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">教育・人事</span><span class="sh">'</span><span class="p">,</span><span class="sh">'</span><span class="s">その他</span><span class="sh">'</span><span class="p">]</span>
<span class="n">title</span> <span class="o">=</span> <span class="sh">'</span><span class="s">専攻分野別平均月収</span><span class="sh">'</span>
<span class="n">y_name</span> <span class="o">=</span> <span class="sh">'</span><span class="s">月収</span><span class="sh">'</span>
<span class="n">x_name</span> <span class="o">=</span> <span class="sh">'</span><span class="s">専攻</span><span class="sh">'</span>
<span class="n">y_label</span> <span class="o">=</span> <span class="sh">'</span><span class="s">平均月収(US$)</span><span class="sh">'</span>

<span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="n">figsize</span> <span class="o">=</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span><span class="mi">9</span><span class="p">))</span>
<span class="n">ax</span> <span class="o">=</span> <span class="n">sns</span><span class="p">.</span><span class="nf">barplot</span><span class="p">(</span><span class="n">x</span> <span class="o">=</span> <span class="n">x_name</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">y_name</span><span class="p">,</span>
                   <span class="n">data</span> <span class="o">=</span> <span class="n">df_gsum</span><span class="p">,</span> 
                   <span class="n">palette</span><span class="o">=</span><span class="sh">'</span><span class="s">pastel</span><span class="sh">'</span><span class="p">,</span>
                  <span class="n">order</span> <span class="o">=</span> <span class="n">order</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">title</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">18</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">'</span><span class="s">bold</span><span class="sh">'</span> <span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">xticks</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">90</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">xlabel</span><span class="p">(</span><span class="n">x_name</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">'</span><span class="s">bold</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">ylabel</span><span class="p">(</span><span class="n">y_label</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">'</span><span class="s">bold</span><span class="sh">'</span><span class="p">)</span>

<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">ax</span><span class="p">.</span><span class="n">patches</span><span class="p">:</span>
    <span class="n">ax</span><span class="p">.</span><span class="nf">annotate</span><span class="p">(</span><span class="nf">format</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="nf">get_height</span><span class="p">(),</span> <span class="sh">'</span><span class="s">.2f</span><span class="sh">'</span><span class="p">),</span> 
                   <span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="nf">get_x</span><span class="p">()</span> <span class="o">+</span> <span class="n">p</span><span class="p">.</span><span class="nf">get_width</span><span class="p">()</span> <span class="o">/</span> <span class="mf">2.</span><span class="p">,</span> 
                    <span class="n">p</span><span class="p">.</span><span class="nf">get_height</span><span class="p">()),</span> 
                    <span class="n">ha</span> <span class="o">=</span> <span class="sh">'</span><span class="s">center</span><span class="sh">'</span><span class="p">,</span> 
                    <span class="n">va</span> <span class="o">=</span> <span class="sh">'</span><span class="s">center</span><span class="sh">'</span><span class="p">,</span> 
                    <span class="n">xytext</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span> 
                    <span class="n">textcoords</span> <span class="o">=</span> <span class="sh">'</span><span class="s">offset points</span><span class="sh">'</span><span class="p">,</span>
                    <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">,</span>
                    <span class="n">color</span> <span class="o">=</span> <span class="sh">'</span><span class="s">blue</span><span class="sh">'</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></figure>

<h3 id="小数点何位までの表示とするかの指定">小数点何位までの表示とするかの指定</h3>

<p>数字表記の肝心な点として小数点何位まで表記するかだと思います。　平均値のため、小数点第二位まで表記するようにしています。　以下の<strong>format( ‘.2f’)</strong>の部分がそれに相当します。</p>

<div class="box33">
    <span class="box-title">Point！</span>
  <ol>  
<li>format(p.get_height(), '.2f')</li>
<li>値pの小数点以下何位まで表記かを指定する　.2f = 小数点第二位</li>

 </ol>
</div>

<h3 id="度数分布図任意のカテゴリー順">度数分布図、任意のカテゴリー順</h3>

<p><span class="bleu">order = [‘マーケティング’, ‘理工学’, ‘医薬、保健’,’人文科学’,’教育・人事’,’その他’]</span>として<br />
<span class="bleu">order = order</span>とすると、<span class="bleu">order</span>で指定した順に棒グラフが並びます。</p>

<p>イメージは以下のとおりです。</p>

<p><img src="/images/img/seaborn_pic6.png" alt="月収平均" height="600px" width="600px" /></p>

<hr />]]></content><author><name>サイト作成者</name></author><category term="Python" /><category term="seaborn" /><category term="visualization" /><category term="Python" /><summary type="html"><![CDATA[seaborn の barplot に平均値のラベル（annotation）を追加する方法を、groupby から reset_index、描画、桁数指定まで実務的な手順でまとめた How To 記事です。Excel で行っていた棒グラフ作成を Python だけで完結させたい人向けに、コード例とポイントをわかりやすく解説しています。]]></summary></entry></feed>