mygems

CSVファイルからグラフを作る方法

CSVのグラフが崩れる原因はデータです。数値がテキスト、N/A、ラベル列の間違い。Excel、スプレッドシート、Python、スマホでの作り方。

執筆: mygems ·

グラフを作ること自体は簡単です。2つの列を選んで、グラフの種類を選べば完了です。うまくいかないときは、CSVファイルではよくあることですが、原因はほとんどの場合グラフではなくデータにあります。テキストとして保存された数値、数字の列に紛れた N/A が1つ、データ系列だと判断されてしまう年の列。これらを直せば、どのツールでもグラフは描けます。

先に結論

  • Excel: CSVを開き、ラベルの列と数値の列を選んで、挿入 → おすすめグラフ。
  • Google スプレッドシート: アップロードして開き、範囲を選んで、挿入 → グラフ。
  • Python: pandas と df.plot() の3行。下に例があります。
  • スマートフォン: CSVを表計算ファイルに変換せず、直接グラフにできるアプリを使う。
  • どれを使う場合も先に: 数値の列が本当に数値になっているか確認し、先にデータを集計する必要があるか判断します。

ステップ0: 先にデータを集計する必要はありますか

CSVのエクスポートは、たいてい注文ごと、取引ごと、訪問ごとのように、イベントごとに1行です。それをそのままグラフにすると、細い棒が4万本並びます。本当に見たいのは、月別の売上、地域別の注文数のように、カテゴリごとに1本の棒です。

そこでまず考えます。1行は何の単位ですか。 その答えがグラフの横軸にしたいものと違うなら、先に集計します。ExcelやスプレッドシートならピボットテーブルでOKです。SQLならクエリ1つで済みます。

duckdb -c "SELECT region, sum(amount) AS revenue FROM 'orders.csv' GROUP BY region ORDER BY revenue DESC"

グラフにするのは、大きなファイルではなく、この小さな結果です。この手順はCSVの列を合計する方法のガイドで詳しく説明しています。

目的に合わせてグラフを選ぶ

見せたいこと使うグラフ避けるもの
どのカテゴリが一番大きいか棒グラフ(ラベルが長いときは横棒)6項目以上の円グラフ
時間による変化折れ線グラフ約20点を超える棒グラフ
全体に占める割合積み上げ棒グラフ、2〜5項目なら円グラフ3Dのグラフ全般
2つの数値の関係散布図折れ線(順序があるように見えてしまう)
1つの数値の分布ヒストグラム生の値の棒グラフ

Excelの場合

  1. CSVを開きます。(IDや郵便番号、桁数の多い数値が含まれている場合は、開くのではなくインポートしてください。ExcelでCSVのデータが勝手に変わるのを防ぐ方法を参照してください。)
  2. ラベルの列を選び、Ctrl(Macでは ⌘)を押しながら数値の列を選びます。
  3. 挿入 → おすすめグラフを選ぶか、種類を直接選びます。

定番のトラブル: 年の列がデータ系列になってしまう。 ラベルが数値(2021、2022、2023)だと、Excelはそれをデータとして扱い、2本目の折れ線として下の方に描いてしまいます。ラベルの列をテキストに変換するか、その列の先頭セルの見出しテキストを削除してください。左上のセルが空なら、Excelはその列をラベルとして読み取ります。

もう1つの定番トラブル: 何も描かれない。 テキストとして保存された数値(セルの隅に緑の三角が出ます)は、ゼロとして描かれます。列を選び、警告アイコンをクリックして、数値に変換を選んでください。

Google スプレッドシートの場合

  1. CSVをドライブにアップロードしてスプレッドシートで開くか、既存のシートに ファイル → インポート で取り込みます。
  2. 列を選んで 挿入 → グラフ を選びます。
  3. グラフエディタで 列 A をラベルとして使用 にチェックを入れ、グラフの縦横が入れ替わっているように見えたら 行/列を切り替える を使います。

スプレッドシートには、Excelでは面倒な機能が1つあります。グラフエディタの 設定 タブで、横軸の隣にある 集計 にチェックを入れると、同じラベルの値を自動で合計してくれます。生の行から手早く「カテゴリごとの合計」を出したいときは、ピボットテーブルを作らずに済みます。

Pythonの場合

何度も作るものなら、クリックするよりスクリプトの方が楽です。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("orders.csv")
df.groupby("region")["amount"].sum().sort_values().plot(kind="barh")
plt.tight_layout()
plt.savefig("revenue-by-region.png", dpi=200)

来月、新しいエクスポートで同じスクリプトをもう一度実行すれば、グラフは自動で更新されます。

グラフが崩れる原因になりやすいデータの問題

  • 数値でない値が1つだけ混ざった列。 N/A、-、TBC、あるいはスペースで入力された空欄です。多くのツールは列全体をテキストとして扱うため、グラフから列が消えるか、ゼロとして描かれます。
  • 通貨記号と桁区切り。 $1,200 はほとんどのパーサーにとってテキストです。記号と区切りを取り除くか、それを理解できるツールを使ってください。
  • 小数点のカンマ。 ドイツやフランスのシステムから出たファイルでは 1.234,50 と書かれます。英語ロケールで開くと、テキストになるか、もっと悪いと1000倍大きな数値になります。
  • テキストの日付。 アルファベット順に並べると Apr が Jan より前に来ます。本物の日付に変換するか、月を 2026-01、2026-02 のように書いてください。これならテキストのままでも正しい順に並びます。
  • 末尾の合計行。 エクスポートの最後に「Total」行が付いていることが多く、本来の棒を押しのけて突き抜けてしまいます。グラフにする前に削除してください。

スマートフォンの場合

スマートフォンの表計算アプリでも、変換すればCSVをグラフにできます。ただし上と同じデータの問題があり、直すための画面は小さくなります。CSVを直接グラフにするCSVアプリなら、変換の手間が省けます。

Smart CSV Viewerでは ⋯ → Chart から操作します。種類を選び、Labels の列と1つ以上の Series の列を指定して、グラフを画像として書き出せます。系列の列に数値でないものがあると、どの列のどのセルかを教えてくれて、タップするとそのセルに移動して直せます。上のリストにある最初の問題は、これで解決できます。

行き先別の予算を示す縦棒グラフ。下部のバーで Labels が Destination、Series が Budget に設定されている
Labels、Series、書き出し
CSV File Viewer - Smart CSViPhone・iPad · Android

iPhoneやAndroidで、CSVを変換せずにグラフにできます。数値でないセルを教えてくれて、グラフを画像として書き出せます。

できること

制限についても正直にお伝えします。無料版では、最初の10行から縦棒・横棒・折れ線グラフを描けます。Proではすべてのグラフの種類と、最大1,000行に対応します。大きな生ファイルのグラフを作るなら、ステップ0のように先に集計してください。これはどんなツールを使う場合にも役立つ方法です。

よくある質問

ExcelでCSVファイルからグラフを作るには?
CSVを開き、ラベルの列と数値の列を選び(Ctrl または Cmd を押しながら両方を選択)、挿入 → おすすめグラフを選びます。数値がテキストとして保存されている場合は先に変換してください。そうしないとグラフはゼロになります。
Excelで年の列が折れ線として描かれるのはなぜ?
Excelは数値だけの列を、年であってもデータとして扱います。年の列をテキストに変換するか、先頭セルの見出しテキストを消してください。左上のセルが空なら、Excelはその列をラベルとして読み取ります。
CSVのデータがグラフに表示されないのはなぜ?
たいていは数値がテキストとして保存されています。原因は、通貨記号、桁区切り、小数点のカンマ、列に1つだけ紛れた N/A などです。これらの値をきれいにするか、列を数値に変換すれば、グラフが描かれます。
Excelなしでも、CSVからグラフを作れますか?
はい。Google スプレッドシートは無料で、アップロード後にCSVをグラフにできます。Pythonのpandasなら数行で描けます。スマートフォンでは、CSVアプリで変換せずにファイルを直接グラフにできます。
数千行あるCSVをグラフにするには?
先に集計します。生のエクスポートは1イベントにつき1行です。グラフに載せたいカテゴリや期間でピボットテーブルやSQLのGROUP BYを使ってまとめ、その合計をグラフにします。数千本の棒は、どのツールでも読み取れません。

mygems — CSV EditorとSmart CSV Viewerを開発しています。表計算ソフトが大きなファイルで音を上げるから生まれた2つのアプリです。