新着記事一覧

転職エージェント

キャリア形成・転職 仕事・キャリア

2026/10/20

【40代の転職】転職エージェントの選び方

転職活動を始めるとき、利用する人も多い「転職サイト」。 転職サイトに登録していると、様々な転職エージェントからスカウトや連絡があります。 私も今回の転職活動では、複数の転職サイトに登録し、その中でスカウトを送ってくれたいくつかの転職エージェントの担当者と実際に話をしました。 そこで感じたのが、「転職エージェントなら、どこでも同じというわけではない」ということです。 求人の紹介方法も違えば、書類添削や面接対策などのサポート内容も違います。 そして何より、担当者によって熱量や相性がかなり違うと感じました。 今 ...

続きを読む

ポケモン 遊び・趣味

2026/10/20

【ポケモン】ポケモンGo リアルイベントの醍醐味

ポケモンGOのリアルイベントに参加してみて、改めて感じたことがあります。 それは、「ポケモンGOって、こんなに人とつながれるゲームだったんだ!」ということ。 普段もポケモンGOをプレイしていますが、家の近所や通勤途中で遊んでいるときは、一人(もしくは子供と)で黙々とポケモンを捕まえています。 知らない人に話しかけることも、ほとんどありません。 ところが、リアルイベントになると、それがちょっと変わります。 そこには、同じようにポケモンが好きな人が全国、そして世界中から集まっている。 「ポケモンが好き」という ...

続きを読む

キャリア形成・転職 仕事・キャリア

2026/10/20

【40代の転職】転職活動のスケジュールと進め方

海外営業からデジタルマーケティングへキャリアチェンジし、やりたい仕事に手応えを感じていたものの、組織変更によってデジタルマーケティングの仕事そのものがなくなってしまったことが、転職を考える大きなきっかけでした。 今回は、その後の転職活動のスケジュールと、実際にどのように転職活動を進めたのかを書いてみたいと思います。 結果的には、3月に本格的に転職活動を始め、4月に転職先を決定、4月22日を最終出社日として、5月は少しゆっくり過ごし、6月から新しい会社で働き始めました。 これから転職を考えている方の参考にな ...

続きを読む

ポケモン 遊び・趣味

2026/10/18

【ポケモン】Pokémon GO Fest 2026:東京!5月のリアルイベントの服装と持ち物まとめ

5月に開催されたPokémon GO Fest 東京に、小学2年生の息子と一緒に参加してきました!リアルイベントは初参加です! 今回が初めてのリアルイベント参加。 参加する前は、 「5月ならそこまで暑くないかな?」 「飲み物はどれくらい持っていけばいい?」 「スマホの充電は足りる?」 など、いろいろと気になることがありました。 実際に参加してみると、ポケモンGOのリアルイベントならではの準備がかなり重要! 特に、たくさんの人が集まるイベントなので、飲み物やモバイルバッテリーなどは「ちょっと多いかな?」くら ...

続きを読む

キャリア形成・転職 仕事・キャリア

2026/10/20

【40代の転職】転職のきっかけ

Haruは41歳で転職をしました。この記事では、40代の転職のきっかけをお伝えしようと思います。 なぜ転職を決めたのか 「なぜ転職したの?」 転職すると、よく聞かれる質問です。 私の場合、突然「今の会社が嫌になったから」というわけではありません。むしろ、これまでの会社で自分なりにやりたいことを見つけ、勉強して、部署異動まで実現させて、少しずつキャリアを変えてきました。 それでも最終的に転職を決めたのは、「この会社にいても、これ以上自分がやりたい方向には進めない」と思う出来事があったからです。 今回は、私が ...

続きを読む

ポケモン 遊び・趣味

2026/10/11

【ポケモン】豊橋ポケモン天文台に行ってきた話

三連休の土曜日、子どもたちと一緒にポケモン天文台へ行ってきました!ポケモンと宇宙が組み合わさった施設ということで、子どもたちは行く前から楽しみにしていました。今回は、実際に訪れてみて感じたことを中心に、アクセスや駐車場、混雑状況、館内の見どころ、グッズ購入までまとめてみます。(ネタばれしない範囲で) ポケモン天文台ってどんなところ? ポケモン天文台は、宇宙や星について楽しく学べる、ポケモン好きの子どもにはたまらないスポット。単に展示を見るだけではなく、ポケモンと一緒に太陽系や星、隕石などについて学べるので ...

続きを読む

Python 仕事・キャリア

2026/10/10

【Python】Pythonでの自然言語処理(日本語)

こちらの記事では、自然言語処理についてまとめています。 自然言語処理とは? 自然言語とは、日本語や英語のような自然発生的に生まれた言語です。日常的に使用している自然言語について、言葉が持つ意味を解析し処理します。活用事例としては、チャットボット、音声認識AI、文字認識(手書き文字をカメラが認識し文字データへと変換する技術)、検索エンジン、翻訳、感情分析、文章要約などがあります。 文章の意味を機械に理解させるには、単語分割を行う必要があります。手法は主に2つあります。 1.形態素解析形態素とは意味を持つ最小 ...

続きを読む

Python 仕事・キャリア

【Python】機械学習(教師なし) クラスタリング k-meansの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング k-means法についてまとめていきます。

クラスタリングとは

データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。

1.階層的クラスタリング
データの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。

2.非階層的クラスタリング
階層的クラスタリングと同様、似ているものをまとめてクラスターを作っていきますが階層構造を持ちません。
データが与えられた際、予めクラスターをいくつ作るかを決定し、その分だけデータからクラスターを作ります。階層構造がないため、計算量が少なく、データ量が多い時に有効な手段です。非階層的クラスタリングの代表的な手法として、k-means法が挙げられます。

k-means法での実装

k-means法は、データを分散の等しいn個のクラスターに分けることができる手法です。各クラスター毎にデータの重心(セントロイド)にあたる平均値が割り当てられます。分散の等しいクラスターに分けるには、SSEという指標を使用します。SSEとは、各クラスターに含まれるデータ点とセントロイドとの2乗和を求めたもの(=分散)です。k-means法は、SSEを全クラスターで等しくかつ最小化するようセントロイドを選びます。
SSEの値が小さいほどクラスタリングがうまくいっているモデルと言えます。

また、k-means法でのクラスター数の決め方として、エルボー法というものがあります。クラスター数を大きくしていった時にSSEがどのように変化するかプロットし、その結果からクラスタ数を決める手法です。出力されるグラフの傾きが急激に曲がる箇所がありますが、この時のクラスタ数を最適とみなします。

それではエルボー法を実施しつつ、k-means法でのクラスタリングを実装してみたいと思います。

#必要なライブラリをインポートする
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.cm as cm
import numpy as np

#sklearn.datasetsのmake_blobs関数をインポートし、データ構造を持っている練習用のデータを準備する
X,Y = make_blobs(n_samples=200, #sサンプル点の数
                 n_features=2, #特徴量(次元数)
                 centers=5,#クラスタの個数
                 cluster_std=0.5,#クラスタ内の標準偏差
                 shuffle=True, #サンプルをシャッフル
                 random_state=0 #乱数生成器の状態を指定
                 )

print(X.shape)
print(Y.shape)

#練習用のデータをプロットする
plt.scatter(X[:, 0],X[:, 1], c="black", marker="*", s=50)
plt.grid()
plt.show()

#エルボー法でk-meansでのクラスターの最適数を決定する
#inertia_でSSEの値を取得する
distortions = []
for i in range (1,11):
    km_test = KMeans(n_clusters=i, #クラスターの数
                     init="random", #初期化手法
                     n_init=10,     #異なる初期中心点を使用したk-menasアルゴリズムの実行回数(10回)
                     max_iter=300,  #各実行での最大反復回数
                     tol=1e-04,     #収束を宣言するための相対的な許容誤差
                     random_state=0 #乱数生成器の状態を指定
                    )
    km_test.fit(X)
    distortions.append(km_test.inertia_)

#グラフのプロットを行う
plt.plot(range(1,11),distortions, marker="o")
plt.xticks(np.arange(1,11))
plt.xlabel("number of clusters")
plt.ylabel("Distortion")
plt.show()

#クラスター数5とし、K-meansクラスからkmインスタンスを作成する
#fit_ptredictでクラスタリングを行う
km = KMeans(n_clusters=5,
            init="random", # セントロイドの初期値をランダムに設定  default: "k-means++"
            n_init=10,       # 異なるセントロイドの初期値を用いたk-meansの実行回数
            max_iter=300,    # k-meansアルゴリズムを繰り返す最大回数
            tol=1e-04,        # 収束と判定するための相対的な許容誤差
            random_state=0)  #乱数発生初期化

Y_km = km.fit_predict(X)

#クラスター番号(Y_km)に応じてデータをプロットする
for n in range(len(Y_km)):
        plt.scatter(X[Y_km == n, 0], X[Y_km == n, 1], s=50, c=cm.hsv(
        float(n) / 10), marker="*", label="cluster"+str(n+1))

# セントロイドをプロット
plt.scatter(km.cluster_centers_[:,0],km.cluster_centers_[:,1],s=250, marker="*", c="black", label="centroids")
plt.grid()
plt.show()

# クラスタ内誤差平方和にアクセスする
print ("Distortion: %.2f"% km.inertia_)

以下、各ブロック毎の説明です。

#必要なライブラリをインポートする
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.cm as cm
import numpy as np

#sklearn.datasetsのmake_blobs関数をインポートし、データ構造を持っている練習用のデータを準備する
X,Y = make_blobs(n_samples=200, #sサンプル点の数
                 n_features=2, #特徴量(次元数)
                 centers=5,#クラスタの個数
                 cluster_std=0.5,#クラスタ内の標準偏差
                 shuffle=True, #サンプルをシャッフル
                 random_state=0 #乱数生成器の状態を指定
                 )

print(X.shape)
print(Y.shape)

まず、必要なライブラリをインポートし、sklearn.datasetsのmake_blobs関数をインポートし、データ構造を持っている練習用のデータを準備します。make_blobs関数の引数は上記の通りです。shapeでX,Yのデータの形状を確認してみます。

#練習用のデータをプロットする
plt.scatter(X[:, 0],X[:, 1], c="black", marker="*", s=50)
plt.grid()
plt.show()

上で作った練習用のデータXを散布図にプロットしてみます。
Xの1列目・全行をx軸に、Xの2列目・全行をy軸としてプロットします。c=色指定、marker=プロットのマーカー形状、s=プロットサイズです。

#エルボー法でk-meansでのクラスターの最適数を決定し、inertia_でSSEの値を取得する
distortions = []
for i in range (1,11):
    km_test = KMeans(n_clusters=i, #クラスターの数
                     init="random", #初期化手法
                     n_init=10,     #異なる初期中心点を使用したk-menasアルゴリズムの実行回数(10回)
                     max_iter=300,  #各実行での最大反復回数
                     tol=1e-04,     #収束を宣言するための相対的な許容誤差
                     random_state=0 #乱数生成器の状態を指定
                    )
    km_test.fit(X)
    distortions.append(km_test.inertia_)

クラスター数を1~10まで変化させて、K-meansアルゴリズムを使用し、SSE(歪みの値)をinertia_で取得しdistiortionsに格納しています。

#グラフのプロットを行う
plt.plot(range(1,11),distortions, marker="o")
plt.xticks(np.arange(1,11))
plt.xlabel("number of clusters")
plt.ylabel("Distortion")
plt.show()

描画すると以下のようになります。k=5を超えるとクラスタ数を増やしても歪みがほとんど改善しないので、k=5を最適とみなして以下コードを書き進めています。

#クラスター数5とし、K-meansクラスからkmインスタンスを作成する
#fit_ptredictでクラスタリングを行う
km = KMeans(n_clusters=5,
            init="random", # セントロイドの初期値をランダムに設定  default: "k-means++"
            n_init=10,       # 異なるセントロイドの初期値を用いたk-meansの実行回数
            max_iter=300,    # k-meansアルゴリズムを繰り返す最大回数
            tol=1e-04,        # 収束と判定するための相対的な許容誤差
            random_state=0)  #乱数発生初期化

Y_km = km.fit_predict(X)

エルボー法で決定した最適クラスター数を入れ、K-means法を行います。fit_predictにより、各データポイントがクラスタ番号に割り当てられ、結果がY_kmに返ります。Y_kmには以下が入っています。

#クラスター番号(Y_km)に応じてデータをプロットする
for n in range(len(Y_km)):
        plt.scatter(X[Y_km == n, 0], X[Y_km == n, 1], s=50, c=cm.hsv(
        float(n) / 10), marker="*", label="cluster"+str(n+1))

クラスタ番号に対して、そのクラスタに属するデータポイントのX座標とY座標をプロットします。各クラスタのデータポイントは色とマーカー7の種類が異なるように設定されます。

X[Y_km == n, 0]は、Numpyのインデックスを参照する手法です。ブールインデックス参照と呼ばれる手法を使用して、条件に一致する要素のみを取り出しています。
具体的には、Y_km == nはブールの配列を生成します。ブールの配列は、Y_kmの各要素がnと等しいかどうか示します。このブール配列を使用してXをインデックス参照することで、条件に一致する要素を取り出します。

例として、Xが2次元の配置であり、Y_kmの値が[0,1,1,0,2]であった場合、X[Y_km == 1, 0]は以下のように解釈されます。
Y_km == 1は、[False, True, True, False,False]というブールの配列を生成します。つまり、Y_kmの値が1に等しい要素は2番目と3番目になります。
X[Y_km == 1, 0]はXの各行に対して、Y_kmの値が1に等しい場合にその行の0番目の要素を取り出します。結果、2番目と3番目の行の0番目の要素からなる配列が返ります。

各クラスターのプロットは、cm.hsv(float(n)/10) を使用して設定された異なる色とマーカーの種類を持ちます。

# セントロイドをプロット
plt.scatter(km.cluster_centers_[:,0],km.cluster_centers_[:,1],s=250, marker="*", c="black", label="centroids")
plt.grid()
plt.show()

km.cluster_centers_はK-menas法により見つけられたクラスターの中心座標を含む配列です。km.cluster_centers_[:,0]は中心点のX座標を表す配列、km.cluster_centers_[:,1]はY座標を表す配列です。表示させてみると、5つのクラスターの中心点の座標が以下のように入っています。

散布図に描画してみます。

# クラスタ内誤差平方和にアクセスする
print ("Distortion: %.2f"% km.inertia_)

クラスタ数5のSSEも出しておきます。

  • この記事を書いた人

Haru

会社員。育休2回取得、40代で転職。
職種はデジタルマーケティング。
ポケモン、スノボ、IT系の学び、キャリア、育児について発信していきます。

-Python, 仕事・キャリア
-, ,