質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1822閲覧

kMeansでエラー

_hh

総合スコア79

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/10 07:56

Pythonのjupyter notebookで、あるcsvデータを読み込み、クラスタリングしたいと考えております。
以下の様なコードで試みたところ、以下の様なエラーが出てしまいます。

当該csvデータの'階級'という列は、データでは整数値が入っております。エラーをみますと、数字であるにも関わらず、なぜか数値の型?でないのかと思いますが、なぜそうなるのか、またどのように対処して良いかわからず、こちらに記載させて頂きました。
どなかたご教示頂けますと幸いです.

【環境】Windows10, 64bit chrome

【コード】

import numpy as np
import pandas as pd
csv_in = 'data.csv'
df = pd.read_csv(csv_in, delimiter=',', encoding='shift-jis')

df2 = df[['生年月日','階級']]
df2.head()
df3=np.array(df2)
print(df3)

from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=3)
kmeans.fit(df3)


【エラー】
ValueError Traceback (most recent call last)
<ipython-input-10-623bc5f5d3ff> in <module>()
16 #X, y = make_blobs(random_state=1)
17 kmeans=KMeans(n_clusters=3)
---> 18 kmeans.fit(df3)

~\Miniconda3\envs\stats\lib\site-packages\sklearn\cluster\k_means_.py in fit(self, X, y)
885 """
886 random_state = check_random_state(self.random_state)
--> 887 X = self.check_fit_data(X)
888
889 self.cluster_centers
, self.labels_, self.inertia_, self.n_iter_ = \

~\Miniconda3\envs\stats\lib\site-packages\sklearn\cluster\k_means_.py in _check_fit_data(self, X)
856 def _check_fit_data(self, X):
857 """Verify that the number of samples given is larger than k"""
--> 858 X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32])
859 if X.shape[0] < self.n_clusters:
860 raise ValueError("n_samples=%d should be >= n_clusters=%d" % (

~\Miniconda3\envs\stats\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
431 force_all_finite)
432 else:
--> 433 array = np.array(array, dtype=dtype, order=order, copy=copy)
434
435 if ensure_2d:

ValueError: could not convert string to float: '7S'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

エラーに書かれております通り、'生年月日'列か'階級'列のどちらかのデータに '7S' という値が入っているため、文字列型(object型)として扱われているようです。

とりあえず
print(df.dtypes)
としてデータ型がどうなっているのか、データに'7S'がないかを確認してみてください。

投稿2018/10/10 08:06

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

magichan

2018/10/10 08:07

完全に被ってしまいました。スミマセン
guest

0

ベストアンサー

単純に、データが'7S'という文字列になっているのではないですか?

確認してみてほしい事項。

  • 直接df2の中身を見てください。あと、df2.dtypesを見ましょう。
  • csvの中身を見て、変なことになっていないか確認する(可能なら一部だけでも良いので質問本文にcsvの中身を追記して頂けるとこちらでも検証しやすいです)

投稿2018/10/10 08:06

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_hh

2018/10/10 08:17

有難うございました!ご指摘の通り、7Sという文字列が入っておりました。。 これをどうするか途方に暮れておりますが、、原因が分かり大変感謝しております。 恐縮ですが最初に答えて下さった方をベストアンサーにさせて頂きました。。
hayataka2049

2018/10/10 08:21 編集

そもそもデータのcsvが間違っていた(思っていたフォーマットと違った)、ということでしょうか
hayataka2049

2018/10/10 08:24

もしかしたら勘違いしているかもしれないので、念の為伝えておきますが、 df2 = df[['生年月日','階級']] df2.head() df3=np.array(df2) は生年月日と階級の2列がデータになったnumpy配列を生成します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問