{"id":2398,"date":"2021-01-26T21:08:44","date_gmt":"1970-01-01T00:00:00","guid":{"rendered":"https://freelance.indieverse.co.jp/media/?p=2398"},"modified":"2025-11-01T17:49:34","modified_gmt":"2025-11-01T08:49:34","slug":"python-pandas","status":"publish","type":"post","link":"https://freelance.indieverse.co.jp/media/programming/python/python-pandas","title":{"rendered":"Python | Pandasの使い方 | よく使う前処理、可視化方法をまとめみた"},"content":{"rendered":"<p>Pythonの前処理ライブラリPandasを利用して、データの前処理を行うことが多いのですが、そこでよく使う処理をまとめます。</p>\n<h2>Pandasとは</h2>\n<p>Pandasは、データの前処理を行うライブラリです。エクセルで行うような、行列を扱うことができます。</p>\n<ul>\n<li>データの入力</li>\n<li>データの並び替え</li>\n<li>データの修正</li>\n<li>CSVのエクスポート</li>\n<li>簡易的な描画</li>\n</ul>\n<p>などができます。</p>\n<h2>Pandasと併用して利用するライブラリ</h2>\n<p>Pandasと併用するライブラリは、</p>\n<ul>\n<li>matplotlib: 描画ライブラリ</li>\n<li>seaborn: matplotlibのラッパー。もっとかんたんに描画を行うことができる</li>\n</ul>\n<p>という感じです。</p>\n<h2>Pandasのメリット</h2>\n<p>個人的に、データの前処理はこういう場合はExcelかGoogle Spreadsheetを使います。</p>\n<ul>\n<li>データ量が少ない</li>\n<li>外部サービスとのデータの連携が必要ない</li>\n<li>複数のデータセットを扱う必要がない</li>\n</ul>\n<p>一方で、Pandasを利用する場合は、</p>\n<ul>\n<li>データ量が多い</li>\n<li>外部サービスとのデータの連携が多い</li>\n<li>複数のデータセットを扱う必要がある</li>\n</ul>\n<p>という場合には、非常に重宝します。</p>\n<h2>ライブラリのインポート</h2>\n<p>Pandasをインストールしていなければ、以下のコマンドでインストールして下さい。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>pip install pandas</code></pre>\n</div>\n<p>して下さい。</p>\n<h2>データのインポート</h2>\n<p>データセットをインポートします。</p>\n<p><strong>CSVインポートする</strong></p>\n<p>CSVファイルを、Pandasを利用してインポートします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import pandas as pd\r\n<span style=\"background-color: inherit; color: inherit;\">df = pd.read_csv(\"あなたのCSV名.csv\", index_col=0)</span></code></pre>\n</div>\n<ul>\n<li>CSV名を設定します。</li>\n<li>dfはデータフレームの略。</li>\n<li>index_col=0は、インデックスの列名。0を指定すると、最初の列がインデックスとなります。ないと、Unnamed:0 という列が自動で付与されます。</li>\n</ul>\n<p><strong>BigQueryからインポートする</strong></p>\n<p>Google Big Queryからデータをインポートします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import pandas as pd\r\nsql = \"\"\"SELECT nameFROM `bigquery-public-data.usa_names.usa_1910_current`WHERE state = 'TX'LIMIT 100\"\"\"\r\nproject_id = 'your-project-id'\r\ndf = pandas.read_gbq(sql, project_id=project_id, dialect='standard')</code></pre>\n</div>\n<ul>\n<li>SQLを記述します</li>\n<li>BigQueryのプロジェクトIDを入れます</li>\n<li>dialect:standardにするとスタンダードSQLが利用できます。</li>\n</ul>\n<p>引用：<a href=\"https://cloud.google.com/bigquery/docs/pandas-gbq-migration?hl=ja\">pandas-gbq からの移行</a></p>\n<p>データフレームを結合する</p>\n<p><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" title=\"Python pandas 図でみる データ連結 / 結合処理 - StatsFragments\" src=\"https://hatenablog-parts.com/embed?url=http%3A%2F%2Fsinhrks.hatenablog.com%2Fentry%2F2015%2F01%2F28%2F073327#?secret=o1d70dpUO9\" data-secret=\"o1d70dpUO9\" scrolling=\"no\" frameborder=\"0\"></iframe></p>\n<h2>データを眺める</h2>\n<p><strong>先頭行をみる</strong></p>\n<p>データの中身を確認するため、最初の行を確認します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.head(50) #最初の50個を取得</code></pre>\n</div>\n<ul>\n<li>引数には行数が入る</li>\n<li>先頭行が見れる head</li>\n<li>最終行からn番目を見たい場合は tailを使う</li>\n</ul>\n<p><strong>最終行をみる</strong></p>\n<p>データの最終行を確認します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.tail(30)</code></pre>\n</div>\n<ul>\n<li>引数には行数を入れる</li>\n</ul>\n<p><strong>要約統計量を出力する</strong></p>\n<p>要約統計量を出力します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.describe()</code></pre>\n</div>\n<ul>\n<li>count: データセットの個数</li>\n<li>mean: データセットの平均値</li>\n<li>min: データセットの最小値</li>\n<li>max: データセットの最大値</li>\n<li>std: 標準偏差</li>\n<li>25%: 第一分位点</li>\n<li>50%: 第二分位点</li>\n<li>75%: 第三分位点</li>\n</ul>\n<p><strong>変数の個数を確認する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.info()</code></pre>\n</div>\n<p>&nbsp;</p>\n<p><strong>列名を取得する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.columns</code></pre>\n</div>\n<p><strong>列名の型を取得する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.dtypes</code></pre>\n</div>\n<p>&nbsp;</p>\n<p><strong>データフレームを結合する</strong></p>\n<p>複数のデータフレームがある場合に結合します。df1とdf2を組み合わせて、df3を出力します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df1 = pd.read_csv(\"df1.csv\")\r\n<span style=\"background-color: inherit; color: inherit;\">df2 = pd.read_csv(\"df2.csv\")\r\ndf3 = pd.concat([df1, df2])</span></code></pre>\n</div>\n<p>参考）<a href=\"http://sinhrks.hatenablog.com/entry/2015/01/28/073327\">http://sinhrks.hatenablog.com/entry/2015/01/28/073327</a></p>\n<h2>データをソートする</h2>\n<p>列名を指定して、昇順、降順に並び替える</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.sort_values(by=[\"bookmarks\"], ascending=False)</code></pre>\n</div>\n<ul>\n<li>byでは、列名を指定します。</li>\n<li>asending=Falseで昇順、Trueで降順になります。</li>\n</ul>\n<h2>データを抽出する</h2>\n<p>列名から、条件を指定して取得します。</p>\n<p><strong>列名から、以上、以下を指定して取得する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[df[\"列名\"] &gt; 20] # 列名の値が20以上の値のみ返します\r\ndf[df[\"列名\"] &lt; 20] # 20以下の値のみ返します\r\n</code><code>df[df[\"列名\"] &gt; 20][df[\"列名\"] &lt;30] # 20以上30未満の値を返します</code></pre>\n</div>\n<p><strong>特定の行の値のものを検索する</strong></p>\n<p>ある列から、&#8221;2017&#8243;が含まれるキーワードを抽出します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[df[\"date\"].str.contains(\"2017\", na=False)]</code></pre>\n</div>\n<ul>\n<li>列名dataで、2017という値が含まれているデータを返します</li>\n</ul>\n<p><strong>データをランダムにサンプリングする</strong></p>\n<p>APIの利用制限等で、データの取得が限定される時は、ランダムにサンプリングする</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.sample(n=100)</code></pre>\n</div>\n<ul>\n<li>n:サンプリングする数</li>\n</ul>\n<p><strong>GROUP BY</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)</code></pre>\n</div>\n<p>&nbsp;</p>\n<h2>データを消去する</h2>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>del df['col'] \r\ndf.drop(['col'], axis = 1)</code></pre>\n<ul>\n<li>どちらでもできるが、<span style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\">列&#8221;col&#8221;を削除します。</span></li>\n</ul>\n<p><strong>列名を並び替える</strong></p>\n<p>A, B, C, D, Eという列があると仮定します。</p>\n</div>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df = df[['A', 'B', 'C','D','E']]　#列を指定した列で並び替える</code></pre>\n</div>\n<h2>データをコピーする（バックアップ用）</h2>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df2 = df.copy()</code></pre>\n</div>\n<h2>列名を変更する</h2>\n<p>事前に、</p>\n<ul>\n<li>クエリ数</li>\n<li>クリック数</li>\n<li>表示回数</li>\n<li>CTR</li>\n<li>掲載順位</li>\n</ul>\n<p>というカラムがあるとします。</p>\n<p>列名を後から変更します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>#クエリ数 クリック数 表示回数 CTR 掲載順位\r\ndf = df.rename(columns={'クエリ数': 'query', 'クリック数':'clicks','表示回数':'apparence',\"掲載順位\":\"ranks\"})</code></pre>\n</div>\n<h2>CSVに書き込む</h2>\n<p>CSVファイルにデータを書き込みます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.to_csv(\"csv名.csv\")</code></pre>\n</div>\n<h2>データのクリーニング</h2>\n<p><strong>置換を行う</strong></p>\n<p>変更したい文字と、変換後の文字でデータを置換します。</p>\n<p>列の値に制限して置換したい場合</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df['列名'] = df2['列名'].str.replace('変更したい文字', '変更後の文字')　#特定の列の一文字を置き換える</code></pre>\n<p>データフレーム全体を置換したい場合</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.replace('変更したい文字', '変更後の文字')　</code></pre>\n<p><strong>正規表現で置換する</strong></p>\n</div>\n</div>\n<p>正規表現を利用した置換を行う</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.列名.str.extract('(.+)@', expand=True) # @よりも前を検索</code>df[\"age\"]= df.列名.str.extract('(\\d\\d)さい', expand=True) # 「さい」の前の整数値2つを取得した列ageを追加 df.loc[df.iloc[:,0].str.contains(r'(Hel|Just)')] <code>df.loc[df.列名1 &lt;= 4, '新規列名'] = True # 列名1の値が4未満なら、新規列名にTrueの値をだす</code></pre>\n</div>\n<p><strong>全角・半角文字の変換</strong></p>\n<p>日本語文字列を扱っているデータの中に数値が全角で入っている場合がある。これをそのまま集計に入れるとエラーが起こるので、データを変換する。</p>\n<p>japandasをインストールする。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>pip install japandas</code></pre>\n</div>\n<p>あとは普通にpandasをインポートしてあげて、実行する</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import japandas as jpd\r\ndf.列名.str.h2z() # 全角から半角に変換する\r\n</code></pre>\n</div>\n<p>参考）https://japandas.readthedocs.io/en/latest/jpstrings.html</p>\n<p>正規表現についてはこちらの記事を参照。</p>\n<p><a href=\"https://qiita.com/jnchito/items/893c887fbf19e17d3ff9\">＞初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」</a></p>\n<p>もしくは</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>pip install jaconv</code></pre>\n</div>\n<p>して、</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code># 全角の数値を半角に変換する関数\r\ndef normalize(s):  \r\n    import numpy as np\r\n    s = str(s)  \r\n    if s == \"nan\":\r\n        return np.nan\r\n    s = jaconv.hira2kata(s)   \r\n    s = jaconv.z2h(s)\r\n    s = float(s)\r\n    return s\r\n\r\ndf['新しい列名'] = df.全角数値が入っている列名.apply(normalize)</code></pre>\n<p>してあげると良い。</p>\n<p>参考）<a href=\"https://qiita.com/shakechi/items/d12641d6cad01479785f\">【保存版】Pythonの文字変換（半角,全角,小文字,大文字）</a></p>\n</div>\n<p><strong>データ型を数値リテラルに変換する</strong></p>\n<p>統計処理を行う際、文字列（String）だと動作しない場合があるので、数値列（numeric）に変換します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df['列名'] = pd.to_numeric(df['列名']) </code></pre>\n</div>\n<p><strong>列名の、指定した文字から先を削除する</strong></p>\n<p>単位を揃えるときによく利用します。</p>\n<ul>\n<li>str.split: 「万」という文字よりも前と後に分け、リストで返します</li>\n<li>[0]でリストの最初の方を取ります</li>\n</ul>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[\"列名\"] = df[\"列名\"].str.split(\"万\").str[0]</code></pre>\n</div>\n<p><strong>特定の文字列を含んでいた時に、Trueなら1, Falseなら0に変換</strong></p>\n<p>カテゴリカルデータを0-1に変換する場合に利用する。ただし、数値として扱われるので、クロス集計をする場合はカテゴリカルデータに変換する必要もある。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[\"新しい列名\"] = df.列名.str.contains(\"^[0-9]\", regex=True) * 1 # 0-9の数値が含まれていたら \r\ndf[\"新しい列名\"] = df.列名.isnull() * 1 # NaNの数値が含まれていたら0\r\ndf[(df['列名1'].str.contains('文字列1')) &amp; (df['列名1'].str.contains('文字列2'))] # 列名1に文字列1と文字列2が含まれたら</code></pre>\n<p>特定の数字以上なら●●</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.loc[df.列名1 &lt;= 4, '新規列名'] = 'True' # 列名1の値が4未満なら、新規列名にTrueの値をだす\r\ndf.loc[(df.列名1 &gt;= 1) &amp; (df.列名2 &lt; 5), \"新規列名\"] = 1 # 1-5nの数値なら、なら、1を返す新規列名を作成</code></pre>\n</div>\n<p>&nbsp;</p>\n</div>\n<p><strong>経過日数の取得</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[\"新しい列名\"] = pd.to_datetime(df['日付の列']) - pd.to_datetime(df['日付の列2'])\r\ndf[\"新しい列名\"] = pd.datetime.today() - pd.to_datetime(df['日付の列1']) # 本日までの経過時間</code></pre>\n</div>\n<p><strong>欠損値処理</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.fillna(0)　# nanを0に変換する</code><code>df.列名.fillna(0)　# nanを0に変換する</code></pre>\n</div>\n<p>&nbsp;</p>\n<p><strong>データに重複があるかチェックする</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.duplicated().any() </code></pre>\n</div>\n<h2>Seabornを使ってグラフ表示</h2>\n<p>matplotlibのラッパーであるSeabornを使うと、シャレオツな感じでグラフを描画できます。</p>\n<ul>\n<li>fig.set_size_inches: 画像サイズを変更しおます</li>\n</ul>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27) #画像サイズを設定する</code></pre>\n</div>\n<p>&nbsp;</p>\n<p><strong>散布行列を書く</strong></p>\n<p>全ての列と列で、散布図を作成します。</p>\n<div>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)\r\n\r\npg = sns.pairplot(df.dropna()) #NaNの削除\r\npg.fig.title(\"Correlation Matrix of RTs, Likes, Follower Increase\", fontsize=12) #タイトルの設定\r\npg.fig.suptitle(\"Outlier in RT and Favs observable\", fontsize=12) </code></pre>\n<p><strong>ヒストグラム</strong></p>\n<p>ヒストグラムを書きます。</p>\n</div>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)\r\n\r\nsns.distplot(df.列名,kde = True).set_title('タイトル') #列名Seriesを引数に。\r\nplt.show()</code></pre>\n</div>\n</div>\n<p><strong>箱ひげ図</strong></p>\n<p>箱ひげ図を書きます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)\r\nsns.boxplot(x=df[\"列名\"])</code></pre>\n<p><strong>棒グラフ</strong></p>\n<p>棒グラフを描きます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)\r\nsns.countplot(x=df[\"列名\"]).set_title(\"タイトル名\")</code></pre>\n</div>\n</div>\n<h2>分析処理</h2>\n<p>Pandasでは、簡単な統計分析を行うことができます。</p>\n<p><strong>相関係数を出力する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.corr()</code></pre>\n</div>\n<p><strong>相関係数をヒートマップで可視化する</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)\r\nsns.heatmap(df.dropna().corr(), vmax=1, vmin=-1, center=0)\r\n</code></pre>\n</div>\n<p>デフォルトのカラーパレットはみにくいので、下記記事を参考に色を設定します。</p>\n<p><a href=\"https://qiita.com/SaitoTsutomu/items/c79c9973a92e1e2c77a7\">≫Seabornのカラーパレットの選び方 </a></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>sns.set_palette(\"husl\")</code></pre>\n</div>\n<p><strong>散布図・ヒストグラムを同時出力 (jointplot)</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>sns.jointplot('列名1', '列名2', data=df)</code></pre>\n</div>\n<ul>\n<li>xlim: x軸の最大値を指定</li>\n<li>ylim: y軸の最大値を指定</li>\n<li>dropna: Trueの場合は欠損値を削除</li>\n<li></li>\n</ul>\n<p>参考）<a href=\"https://seaborn.pydata.org/generated/seaborn.jointplot.html\">https://seaborn.pydata.org/generated/seaborn.jointplot.html</a></p>\n<p><strong>クロス集計</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df[[\"列名1\", \"列名2\"]].groupby(['列名1'], as_index=False).mean().sort_values(by='列名2', ascending=False)</code></pre>\n</div>\n<p>&nbsp;</p>\n<h2>Pandasのデータ分析のサンプル</h2>\n<p>実際に上の処理を参考に、データ分析を行います。</p>\n<ol>\n<li>Pandasのインポート</li>\n<li>データセットのインポート</li>\n<li>データセットの表示</li>\n</ol>\n<p>処理の内容は、以下のURLから確認できます。</p>\n<p><a href=\"https://colab.research.google.com/drive/1yon3xk685OlQp6hjw7i2f2HoxVA4BKA-#scrollTo=gcQOvSgJI0pg\">≫ Pandasチュートリアル</a></p>\n<p><strong>Pandasのインポート</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import pandas as pd</code></pre>\n</div>\n<p><strong>データセットのインポート</strong></p>\n<p>今回はCSVがないので、sklearnと言うライブラリから、データをインポートします。<br />\n利用するデータセットは、ボストン市の住宅価格を利用します。各変数には、以下のような値が含まれています。</p>\n<ol>\n<li>CRIM 犯罪発生率</li>\n<li>ZN 住居区画の密集度</li>\n<li>INDUS 非小売業の土地割合</li>\n<li>CHAS チャールズ川 (1: 川の周辺, 0: それ以外)</li>\n<li>NOX NOx濃度</li>\n<li>RM 住居の平均部屋数</li>\n<li>AGE 1940年より前に建てられた物件割合</li>\n<li>DIS 5つのボストン市の雇用施設からの重み付き距離</li>\n<li>RAD 大きな道路へのアクセスしやすさ</li>\n<li>TAX $10,000ドルあたりの所得税率</li>\n<li>PTRATIO 教師あたりの生徒数</li>\n<li>B 黒人の比率 1000(Bk – 0.63)^2</li>\n<li>LSTAT 低所得者の割合</li>\n</ol>\n<p>データセットの詳細は、以下のURLを参考にしてください。</p>\n<p>引用元： <a href=\"https://momonoki2017.blogspot.com/2018/01/scikit-learn_28.html\">≫ Scikit-learnで機械学習（回帰分析）</a></p>\n<p>早速、データを解析します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import pandas as pd\r\nfrom sklearn.datasets import load_boston\r\nboston = load_boston()\r\ndf = pd.DataFrame(boston.data, columns=boston.feature_names)</code></pre>\n</div>\n<p><strong>データセットの表示</strong></p>\n<p>取得したデータセットを表示します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.head(10)</code></pre>\n</div>\n<p><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08.png\" alt=\"データセットの表示\" width=\"1678\" height=\"794\" class=\"alignnone wp-image-2505 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08.png 1678w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08-300x142.png 300w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08-1024x485.png 1024w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08-768x363.png 768w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.55.08-1536x727.png 1536w\" sizes=\"(max-width: 1678px) 100vw, 1678px\" /></p>\n<p><strong>要約統計量の出力</strong></p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.describe()</code></pre>\n</div>\n<p><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57.png\" alt=\"要約統計量の出力\" width=\"1678\" height=\"794\" class=\"alignnone wp-image-2506 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57.png 1678w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57-300x142.png 300w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57-1024x485.png 1024w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57-768x363.png 768w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-9.58.57-1536x727.png 1536w\" sizes=\"(max-width: 1678px) 100vw, 1678px\" /></p>\n<p><strong>散布行列</strong></p>\n<p>データの全体像を把握するために、散布行列を確認します。<br />\n本来はもっとまえに前処理が必要なのですが、データセットがすでに綺麗なので省略します。</p>\n<p>まずはseabornとmatplotlibをセットアップします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import seaborn as sns\r\nimport matplotlib.pyplot as plt\r\nfig, ax = plt.subplots()\r\nfig.set_size_inches(11.7, 8.27)</code></pre>\n<p>散布行列を描きます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>pg = sns.pairplot(df.dropna()) #NaNの削除</code></pre>\n</div>\n</div>\n<p><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure.png\" alt=\"散布行列を描きます。\" width=\"2331\" height=\"2332\" class=\"alignnone wp-image-2508 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure.png 2331w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-300x300.png 300w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-1024x1024.png 1024w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-150x150.png 150w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-768x768.png 768w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-1536x1536.png 1536w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/figure-2048x2048.png 2048w\" sizes=\"(max-width: 2331px) 100vw, 2331px\" /></p>\n<p>&nbsp;</p>\n<p>こうすると、変数間の関係性を確認することができます。</p>\n<p><strong>相関係数の出力</strong></p>\n<p>変数間の相関係数を出力します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>df.corr()</code></pre>\n</div>\n<p><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28.png\" alt=\"相関係数の出力\" width=\"2530\" height=\"1016\" class=\"alignnone wp-image-2509 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28.png 2530w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28-300x120.png 300w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28-1024x411.png 1024w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28-768x308.png 768w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28-1536x617.png 1536w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/スクリーンショット-2019-07-22-10.13.28-2048x822.png 2048w\" sizes=\"(max-width: 2530px) 100vw, 2530px\" /></p>\n<p>ヒートマップで可視化すると、どこがどう関係しているのかわかりやすいです。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>sns.heatmap(df.dropna().corr(), vmax=1, vmin=-1, center=0)</code></pre>\n</div>\n<p><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/heatmap.png\" alt=\"ヒートマップで可視化すると、どこがどう関係しているのかわかりやすいです。\" width=\"672\" height=\"484\" class=\"alignnone wp-image-2510 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/heatmap.png 672w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2019/07/heatmap-300x216.png 300w\" sizes=\"(max-width: 672px) 100vw, 672px\" /></p>\n<h2>最後に</h2>\n<p>簡易的ではありますが、Pandasで何ができるのかがわかるかと思います。ぜひ参考にしてみてください！</p>\n<h2>Pythonを無料で学ぼう！ DAINOTE公式チュートリアルを公開しました</h2>\n<p><a href=\"https://freelance.indieverse.co.jp/media/try-python-scraping-lp/\" rel=\"https://freelance.indieverse.co.jp/media/try-python-scraping-lp/\"><img decoding=\"async\" src=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2020/03/custom-–-1-2.png\" alt=\"Pythonを無料で学ぼう！ DAINOTE公式チュートリアルを公開しました\" width=\"1080\" height=\"867\" class=\"alignnone wp-image-3368 size-full\" srcset=\"https://freelance.indieverse.co.jp/media/wp-content/uploads/2020/03/custom-–-1-2.png 1080w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2020/03/custom-–-1-2-300x241.png 300w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2020/03/custom-–-1-2-1024x822.png 1024w, https://freelance.indieverse.co.jp/media/wp-content/uploads/2020/03/custom-–-1-2-768x617.png 768w\" sizes=\"(max-width: 1080px) 100vw, 1080px\" /></a></p>\n<ul>\n<li>Pythonで簡単なアプリを開発してみたい</li>\n<li>でもまずは無料で勉強してみたい</li>\n<li>ただの基礎ではなく、応用が聴くような技術を身に付けたい</li>\n</ul>\n<p>という方向けに、DAINOTE編集部が作成した、Pythonのチュートリアルを用意しました。</p>\n<p>まずは、簡単な技術で、プログラミングを楽しんでみませんか？</p>\n<a href='https://freelance.indieverse.co.jp/media/try-python-scraping-lp/' class='cta' rel='nofollow noopener' target='_blank'>チュートリアルを見る（無料）</a>\n<p>&nbsp;</p>\n","protected":false},"excerpt":{"rendered":"<p>PythonのPandas入門。CSV/BigQueryの読み込み、結合・集計・抽出・ソート、可視化までをコード例で解説します。describeやinfo、matplotlib・seaborn連携紹介、実務で役立つ前処理のコツが分かります。</p>\n","protected":false},"author":1,"featured_media":2512,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[191],"tags":[],"class_list":["post-2398","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"aioseo_notices":[],"meta_description":"PythonのPandas入門。CSV/BigQueryの読み込み、結合・集計・抽出・ソート、可視化までをコード例で解説します。describeやinfo、matplotlib・seaborn連携紹介、実務で役...","_links":{"self":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/2398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts"}],"about":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/comments?post=2398"}],"version-history":[{"count":2,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/2398/revisions"}],"predecessor-version":[{"id":94375,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/2398/revisions/94375"}],"wp:featuredmedia":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media/2512"}],"wp:attachment":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media?parent=2398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/categories?post=2398"},{"taxonomy":"post_tag","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/tags?post=2398"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}