Pythonで魅せる!一歩進んだデータ可視化術 – 株価分析で学ぶ、差がつくグラフ作成テクニック

Python

はじめに

データ分析の世界では、「百聞は一見に如かず」という言葉がまさに当てはまります。優れたデータ可視化は、複雑な数値の羅列から瞬時にインサイトを抽出し、説得力のあるストーリーを伝えるための最も強力な武器です。しかし、いつも同じ棒グラフや折れ線グラフばかり使っていては、伝えられるストーリーも限定されてしまいます。

本記事では、Pythonを使ったデータ可視化のスキルを次のレベルに引き上げたい方のために、標準的なグラフから一歩進んだ3つの強力な手法を、具体的な株価データや経済ニュースの分析を例に徹底解説します。

  1. ワードクラウド: テキストデータから市場心理を読み解く。
  2. Folium: 世界の証券取引所をインタラクティブな地図上に示す。
  3. Plotly: 動的な操作が可能な本格的な株価チャートを作成する。

これらのテクニックと、グラフを単なる「見やすい」から「魅力的でかっこいい」レベルに引き上げるためのコツを学び、あなたの分析レポートやプレゼンテーションを格段にレベルアップさせましょう。


1. 市場の声を可視化する「ワードクラウド」

こんな時に便利!

経済ニュース、企業の決算短信、アナリストレポート、SNSの投稿など、大量のテキストデータが溢れています。ワードクラウドを使えば、これらのテキストから頻出するキーワードを直感的にハイライトし、「今、市場で何が話題になっているのか」というセンチメント(市場心理)を素早く掴むことができます。

準備

日本語のテキストを扱うため、形態素解析ライブラリのJanomeと、ワードクラウド生成のwordcloud、そして表示用のmatplotlibをインストールします。

pip install janome wordcloud matplotlib

具体的なサンプルコード

ここでは、架空の経済ニュース記事から市場の関心事をワードクラウドにしてみましょう。

import matplotlib.pyplot as plt
from wordcloud import WordCloud
from janome.tokenizer import Tokenizer
import re

# --- 1. サンプルテキストデータ ---
# 架空の経済ニュース記事
text = """
東京市場は続伸。日銀の金融緩和策の維持が好感され、円安が進行した。
特に輸出関連の自動車株や半導体株が買われた。
一方で、米国の金利引き上げ懸念から、ハイテク株の一部には売りも見られた。
来週の決算発表を前に、投資家は慎重な姿勢を崩していない。
新しい技術として注目されるAI関連の銘柄も、物色の対象となっている。
企業の業績回復と世界経済の動向が、今後の株価の鍵を握るだろう。
"""

# --- 2. 形態素解析 (Janome) ---
t = Tokenizer()
words = []
for token in t.tokenize(text):
    part_of_speech = token.part_of_speech.split(',')[0]
    # 名詞、動詞、形容詞のみを抽出し、意味のある単語に絞る
    if part_of_speech in ['名詞', '動詞', '形容詞']:
        words.append(token.base_form)

# --- 3. ストップワードの除去 ---
# 一般的すぎる単語や、分析に不要な単語を除外
stop_words = ['こと', 'もの', 'ため', '的', 'する', 'いる', 'なる', 'ない']
words = [word for word in words if word not in stop_words and len(word) > 1]

# リストをスペース区切りの文字列に変換
text_for_wordcloud = ' '.join(words)

# --- 4. ワードクラウドの生成と表示 ---
# 日本語表示のため、フォントパスを指定
font_path = 'C:/Windows/Fonts/meiryo.ttc' # ご自身の環境に合わせて変更してください

wordcloud = WordCloud(
    font_path=font_path,
    width=800,
    height=400,
    background_color='white',
    colormap='viridis', # 色のテーマ
    stopwords=set(stop_words)
).generate(text_for_wordcloud)

# --- 表示 ---
plt.figure(figsize=(15, 7))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off') # 軸を非表示
plt.show()

かっこよく見せるコツ

  • フォントにこだわるfont_pathで指定するフォントを、Windows標準の「メイリオ」や「游ゴシック」だけでなく、Google Fontsなどで手に入るデザイン性の高いフリーフォントに変えるだけで、グラフの雰囲気がガラッと変わります。
  • 配色を操るcolormap引数を変更してみましょう。'viridis''plasma''inferno''magma'などは美しく、'coolwarm''bwr'(青-白-赤)はポジティブ・ネガティブ分析で色に意味を持たせたい時に有効です。
  • マスク機能で形を作る: 最もインパクトがあるのがこの機能。numpyPillowを使い、画像を白黒のマスクとして読み込ませることで、ワードクラウドを好きな形(企業のロゴ、通貨記号¥、上昇矢印など)に切り抜けます。これにより、視覚的なメッセージ性が格段に向上します。

2. 世界の市場を鳥瞰する「Folium」地図プロット

こんな時に便利!

「当社のサプライヤーは世界中にこのように分布しています」「世界の主要な証券取引所のリアルタイム情報」といった、地理的な情報を伴うデータを提示したい時に絶大な効果を発揮します。インタラクティブな操作が可能なため、見る人が能動的に情報を探索できます。

準備

foliumと、データ管理に便利なpandasをインストールします。

pip install folium pandas

具体的なサンプルコード

世界の主要な証券取引所の場所を、スタイリッシュな地図上にプロットしてみましょう。

import folium
import pandas as pd

# --- 1. データ準備 ---
# 世界の主要な証券取引所のデータ
data = {
    'Name': ['Tokyo Stock Exchange', 'New York Stock Exchange', 'London Stock Exchange', 'Hong Kong Stock Exchange'],
    'City': ['Tokyo', 'New York', 'London', 'Hong Kong'],
    'Latitude': [35.6797, 40.7069, 51.5155, 22.2831],
    'Longitude': [139.779, -74.0113, -0.0985, 114.158],
    'Icon': ['yen-sign', 'dollar-sign', 'pound-sign', 'database'] # Font Awesomeのアイコン名
}
df = pd.DataFrame(data)

# --- 2. 地図の初期化 ---
# 背景タイルを'CartoDB positron'にして、データを引き立たせる
m = folium.Map(location=[20, 0], zoom_start=2, tiles='CartoDB positron')

# --- 3. マーカーの追加 ---
for i, row in df.iterrows():
    folium.Marker(
        location=[row['Latitude'], row['Longitude']],
        # クリック時に表示されるポップアップ (HTMLが使える)
        popup=f"<strong>{row['Name']}</strong><br>{row['City']}",
        # マウスオーバーで表示されるツールチップ
        tooltip=row['Name'],
        # アイコンをカスタマイズ
        icon=folium.Icon(color='cadetblue', icon=row['Icon'], prefix='fa')
    ).add_to(m)

# --- 4. 地図の保存 ---
# HTMLファイルとして保存し、ブラウザで開く
m.save('world_stock_exchanges.html')

かっこよく見せるコツ

  • 背景タイルを使い分けるtiles引数がキモです。
    • 'CartoDB positron''CartoDB dark_matter': 白黒基調でミニマルかつスタイリッシュ。プロットしたデータが主役になります。
    • 'Stamen Toner': 白黒でアート性が高く、ユニークなプレゼン資料に最適です。
    • 'OpenStreetMap': 標準的で最も情報量が多く、詳細な地理情報が必要な場合に。
  • マーカーを意味あるアイコンにfolium.Iconを使えば、マーカーの色や形を自由自在に変更できます。prefix='fa'とすることでFont Awesomeの豊富なアイコンが利用可能に。通貨記号や'chart-line'(折れ線グラフ)、'building'(ビル)など、データの内容に即したアイコンを選ぶことで、情報の伝達速度が格段に上がります。
  • 円で規模を示すfolium.CircleMarkerを使えば、データの量(例: 市場の取引高)に応じて円の半径を変えることができます。これにより、位置情報に加えて規模感も同時に表現できます。

3. 動的に分析する「Plotly」インタラクティブ株価チャート

こんな時に便利!

株価や経済指標のような複雑な時系列データを、静的な画像ではなく、ユーザー自身が期間を拡大・縮小したり、特定の日付の正確な数値をマウスオーバーで確認したりできる、本格的な分析ツールとして提供したい場合に最適です。Webアプリケーションへの埋め込みにも適しています。

準備

plotlyと、Yahoo Financeから株価データを簡単に取得できるyfinanceをインストールします。

pip install plotly pandas yfinance

具体的なサンプルコード

日本の代表的な企業、トヨタ自動車(銘柄コード: 7203.T)の株価を、移動平均線付きの本格的なローソク足チャートで可視化します。

import yfinance as yf
import pandas as pd
import plotly.graph_objects as go

# --- 1. 株価データの取得 ---
# トヨタ自動車 (7203.T) の過去2年分のデータを取得
ticker = '7203.T'
df = yf.download(ticker, period='2y')

# --- 2. テクニカル指標の計算 ---
# 5日移動平均線と25日移動平均線
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA25'] = df['Close'].rolling(window=25).mean()

# --- 3. インタラクティブなチャートの作成 ---
fig = go.Figure()

# ローソク足チャート
fig.add_trace(go.Candlestick(
    x=df.index,
    open=df['Open'],
    high=df['High'],
    low=df['Low'],
    close=df['Close'],
    name='OHLC'
))

# 移動平均線 (5日)
fig.add_trace(go.Scatter(
    x=df.index,
    y=df['MA5'],
    mode='lines',
    name='MA5',
    line=dict(color='orange', width=1)
))

# 移動平均線 (25日)
fig.add_trace(go.Scatter(
    x=df.index,
    y=df['MA25'],
    mode='lines',
    name='MA25',
    line=dict(color='skyblue', width=1)
))

# --- 4. レイアウトの調整 (かっこよく見せるコツ) ---
fig.update_layout(
    title=f'{ticker} Stock Price Analysis',
    yaxis_title='Stock Price (JPY)',
    # デザインテンプレートを適用 (ダークテーマ)
    template='plotly_dark',
    # ローソク足の隙間をなくす
    xaxis_rangeslider_visible=True,
    # 期間選択ボタンを追加
    xaxis=dict(
        rangeselector=dict(
            buttons=list([
                dict(count=1, label="1m", step="month", stepmode="backward"),
                dict(count=6, label="6m", step="month", stepmode="backward"),
                dict(count=1, label="YTD", step="year", stepmode="todate"),
                dict(count=1, label="1y", step="year", stepmode="backward"),
                dict(step="all")
            ])
        ),
        rangeslider=dict(visible=True),
        type="date"
    )
)

fig.write_html("output.html")
import webbrowser
webbrowser.open("output.html")

かっこよく見せるコツ

  • デザインテンプレートを一発適用template引数を設定するだけで、プロがデザインしたような見た目に。金融系で人気の'plotly_dark'のほか、'seaborn''ggplot2''presentation'など、目的に合わせて選びましょう。
  • レンジスライダーとセレクターは必須xaxis_rangeslider_visible=Trueで表示期間を直感的にドラッグできるスライダーを追加し、さらにrangeselectorで「1ヶ月」「年初来」「全期間」などのボタンを配置します。これにより、静的なグラフが本格的な分析ツールへと進化します。
  • 出来高グラフを組み合わせるplotly.subplots.make_subplotsを使い、上段にローソク足、下段に出来高の棒グラフを配置すると、より専門的な分析が可能になります。「価格が急騰した日の出来高は?」といった相関関係が一目瞭然になります。
  • ホバー情報をリッチにするhovertemplate引数を使い、マウスを当てた時に表示されるツールチップの情報を自由にカスタマイズできます。日付、4本値、前日比、出来高などをまとめて表示させることで、詳細なデータ確認が容易になります。

まとめ

今回は、Pythonを使った一歩進んだデータ可視化手法として、「ワードクラウド」「Folium」「Plotly」の3つを、株価分析という実践的なテーマでご紹介しました。

  • ワードクラウドは、テキストの渦から市場の声を拾い上げる。
  • Foliumは、地理的な視点からビジネスの全体像を捉える。
  • Plotlyは、時系列データを深く、インタラクティブに掘り下げる。

そして、「かっこよく見せるコツ」は、単なる見た目の装飾ではありません。フォント、配色、アイコン、レイアウトを工夫することは、情報をより速く、より正確に、そしてより記憶に残る形で伝えるための高度な技術です。

ぜひ、この記事のコードをご自身のPCで動かし、興味のあるニュース記事や銘柄で試してみてください。きっと、データの中に隠されていた新しい発見と、それを表現する楽しさに出会えるはずです。

コメント