ラベル テキストマイニング の投稿を表示しています。 すべての投稿を表示
ラベル テキストマイニング の投稿を表示しています。 すべての投稿を表示

2019年7月29日月曜日

Watson Explorer(WEX)V12のコレクション作成が劇的に簡単に。

前回、「NTHSA(米国の国家道路交通安全局)」に寄せられる「自動車の故障に関するオーナーのテキストデータ」をサンプリングし、30MB程度のコンパクトなデータセットを作成しました。

(R言語)NHTSAから4行でテキストマイニング 用データをサンプリングする
https://sapporomkt.blogspot.com/2019/07/rnhtsa4.html

今回は、このデータセットを使って、IBMが誇るテキストマイニング ソリューションである「Watson Explorer(WEX)」用の分析データ(WEXでは「コレクション」と言います)を作成します。

実施環境については、以下の通りです。
・IBM Watson Explorer Deep Analytics Edition Version 12.0.2

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。 

WEX Deep Analytics Edition(ver12)の概要



(そもそも「WEXってなに?」の方向けです。ご存知の方は、当パートは読み飛ばしてください)
詳細は、下記のWEX紹介ページをご参照ください。
簡単に言うと「人間が読みきれない大量の文献、文書、レポートを分類・分析して知見を獲得」するための、IBMのテキストマイニングソリューションです。

ウリとしては、下記5点ですが、特に、V12になって機械学習(AI含む)とUI/UXが大幅に強化されました。

1.ビッグデータ対応:
他社ソリューションでも数十万件レコードレベルなら対応可能と思いますが、WEXは数百万件レコードでも難なく分析するスケーラビリティを有しています。
(ただし、それに合ったシステム基盤が必要です)

2.高度な言語理解と深い洞察
同義語辞書だけではなく、様々な言い回しの意図も抽出可能な機能があります。
「IBM Watson Knowledge Studio(WKS)」を用いると、文章に注釈としてメタデータを付与し、WEX上で利用することができます。

3.多言語対応
もともと、日本IBMが開発したソリューションであるため、日本語の解析を得意としていますが、全部で16カ国もの多言語分析が可能です。

4.機械学習を用いた自動文書分類
V12から新たに機械学習を用いた分類機能が実装されました。

5.データに基づく分析ステップのガイド
テキストマイニング未経験者でも直感的に使えるUI/UXとなりました。
(初見だと、V11以前のユーザーは面食らうかもしれませんが、すぐ慣れると思います)

WEX Deep Analytics Edition(ver12)の概要


WEXに限らず、テキストマイニング ソリューションは、「文字コード指定」や「フィールド設定」など、分析着手までの作業負担が重くゲンナリすることが多いのですが、WEXはこの辺りの作業がかなり楽です。

下記に手順を記載しますが、ローデータのフィールドずれなどが無ければ、ほとんどポチポチとボタンを押せば完了するかと思います。

1.WEXにログインする
まずは、管理者から配布されたIDとPASSでログインしてください。



2.「コレクションを作成」を選択する
コレクション(WEXの分析対象となるデータ)一覧画面が表示されるので、「コレクションを作成」を選んでください。



3.「次へ」をそのまま選択する
既に「コンテンツ・マイニング」にチェックされているので、そのまま「次へ」を選択してください。


4.分析対象ファイルをアップロードする
画面下部のアップロードスペースに、前回サンプリングした分析対象ファイルをアップロードします(リンクをクリックしてのファイル選択でも可能です)。


5.コレクション名を記載する
アップロードが完了すると画面が切り替わるので、コレクション名を記載します。
なお、実務上は、ファセットのテスト用コレクションなど複数のコレクションを作ることが多いと思います。
「テスト/本番」や日付など、誰が見てもわかるコレクション名を記載するよう、習慣づけると良いと思います。

「説明」欄は、複数メンバーでの作業であれば記載してください。


6.「フィールド」画面が表示される
取り込みが完了すると、「フィールド」画面が表示されます。
「CSVプレビュー」の部分を見ると、各フィールドが自動的に識別されています。

あと、WEX V11と比べると、画面上段に「テンプレート」から「保存」までの作業ステップが明示されており、どのステップまで進んでいるかがわかりやすいですね。


7.「LDATE」を「日付」形式に変更する
「LDATE」がユーザーからクルマの異変を報告された日のため、このフィールドを「日付」に変更します。


すると、「LDATE」フィールドで取り込んだデータがグラフ化されます。
WEX V11までは、コレクション作成が全て完了しないと見れなかったため、これはとても助かりますね。特に、V11まで日付形式は鬼門で何度も取り込みを繰り返していたのでありがたいです。

また、右下の「フィールド・マッピング」では、分析対象となるテキスト本文が記載されているフィールド(「CDESCR」フィールド)が自動的に指定されています。
V11までは、「Body」フィールドとして都度指定が必要でしたが、随分と楽になりましたね。


8.「CSVパーサーの構成」をチェックする
「CSVプレビュー」パートの右上部分にある「CSVパーサーの構成」をクリックします。
文字コードや区切り文字の指定が可能です。今回のデータは変更は不要なので、このまま閉じて、「次へ」ボタンを押してください。


9.アノテーターを指定する
「コレクションのエンリッチ」画面に遷移します。
ここでは、非構造化データ(ここでは「CDESCR」フィールド)に様々なアノテーション(注釈)をつけることができます。
「アノテーション??」な方は、次回以降のエントリーで記載しますので、今は、「文章や単語に意味をつけて、分析に利用できるようにする」ぐらいのご理解でOKです。


ここでは、「評判分析」と「固有表現抽出」にチェックをつけて、「次へ」ボタンを押してください。


10.ファセットを指定する
分析用ファセットの指定画面に遷移します。WEXではデフォルトで様々な品詞や語句などを抽出可能です。実務的には色々とやることがあるプロセスですが、今回はデフォルトのままでOKです。

















11.コレクションを保存する
ここはデフォルトのままでOKです。
「保存」ボタンを押すと、文章へのインデクシング(索引付け)が走ります。
分析対象となるレコード数やサーバー環境により、インデクシング時間は変動しますが、結構かかるはずですので、別作業を行いながら完了をお待ちください。




12.完了したコレクションをクリックする
しばらく経つと、下記のように「100%索引付き」と表示されるので、当該コレクションをクリックしてください。



ファセットに合わせて単語の頻度数が表示されました!
次回は、このコレクションを使って、分析機能の詳細をご紹介します。

Watson関連エントリー


Watson Explorerでディズニーの人気作品をテキストマイニング

自動でAIモデルが出来ちゃう〜Watson Studio AutoAI Experiment

SPSS Modeler flowのモデルをWebサービスとしてデプロイする

(無料)Watson StudioでSPSS Modeler flowの決定木を動かす

Watson Studioの「Data Refinery」機能で「馬の疝痛(せんつう)」データを眺めてみた。

2019年7月27日土曜日

(R言語)NHTSAから4行でテキストマイニング 用データをサンプリングする

「Watson Explorer(WEX)」に関するテキストマイニングのエントリーを書きたくなり、「NHTSA(※)」のローデータをダウンロードしたのですが・・・
※National Highway Traffic Safety Administration:自動車や運転者の安全を監視する米国運輸省の部局(コトバンク)


解凍すると1GB越え・・・。
「大規模データに潜む有用な声をクイックに発見する」のがWEXのウリだったりするので、このまま分析用サーバーにアップしちゃおうかな・・・。

・・・と、私の中の妖精が何度か囁いたのですが、本当にやっちゃうと怒られそうなので、扱いやすいファイルサイズになるよう、サンプリングしてみます。

実施環境については、以下の通りです。
・MacBook Air(CPU:1.6GHz,Memory 8GB)
・macOS Mojave ver10.14.5
・Rstudio ver1.2.1335(R version 3.6.0)

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。 

サンプリングの手順


1.Rstudioを端末にインストールする
このブログで何度かご紹介しているIBMのAI開発環境である「Watson studio」内にあるRstudioでも実行可能ですが、無料枠のCPU時間をデータ前処理で使うのも勿体ないので、ローカル端末にあるRstudioで実行します。
インストールプログラムが必要な方は、ここからダウンロードし、インストールしてください。

2.NHTSAからローデータをダウンロードする
下記URLからローデータ(FLAT_CMPL.csv)をダウンロードしてください。圧縮されてはいるものの、200MB以上あるので、通信環境によっては少々時間がかかります。

https://www-odi.nhtsa.dot.gov/downloads/


3.フィールド情報をダウンロードする
ローデータには、フィールド名が記載されていないため、ローデータと同じフォルダに「CMPL.txt」もダウンロードしておきます。
※この後、ソースコードで整形済みのフィールド一覧テキストを記載しますので、面倒でしたら無視してもOKです。


4.作業ディレクトリを変更する
「setwd("ディレクトリのパス")」をRstudioのコンソールに入力してもいいのですが、面倒なので、Rstudioのメニュー画面から「Session→Set Working Directory」を選び、ローデータが入っているディレクトリを指定します。


5.以下のコードを実行する。
「dplyrパッケージ」のロードを除くと、わずか4行のコードでサンプリングされたファイルが生成されます。
特に便利なのが、「dplyrパッケージ」の中にある「sample_frac()」関数です。
当該関数の引数にパーセンテージとなる引数を入れると、入力ファイル(この場合、master.df)を母数として、指定したパーセント分のレコードをサンプリングしてくれます。

# dplyrのロード。初めて利用する場合は、事前に当該パッケージをインストールしてください。
library(dplyr)

# 「sep="\t"」でTab区切りファイルを読み込み。
# 「FLAT_CMPL.txt」にはフィールド名が記載されていないので、最初のレコードをフィールド名として
# 読み込まないように「header = FALSE」を指定する。
# デフォルトのFactorデータで読み込むと重くなる。今回は、ローデータ抽出が目的のため、
# 「stringsAsFactors = FALSE」とする。
master.df <- read.csv("FLAT_CMPL.txt",sep="\t",header = FALSE,stringsAsFactors = FALSE)

# 下記にフィールド定義が記載されています
# https://www-odi.nhtsa.dot.gov/downloads/folders/Complaints/Import_Instructions.pdf
# 先ほど読み込んだデータフレームのフィールド名を上書き。
colnames(master.df) <- c("CMPLID","ODINO","MFR_NAME","MAKETXT","MODELTXT","YEARTXT","CRASH","FAILDATE","FIRE","INJURED","DEATHS","COMPDESC","CITY","STATE","VIN","DATEA","LDATE","MILES","OCCURENCES","CDESCR","CMPL_TYPE","POLICE_RPT_YN","PURCH_DT","ORIG_OWNER_YN","ANTI_BRAKES_YN","CRUISE_CONT_YN","NUM_CYLS","DRIVE_TRAIN","FUEL_SYS","FUEL_TYPE","TRANS_TYPE","VEH_SPEED","DOT","TIRE_SIZE","LOC_OF_TIRE","TIRE_FAIL_TYPE","ORIG_EQUIP_YN","MANUF_DT","SEAT_TYPE","RESTRAINT_TYPE","DEALER_NAME","DEALER_TEL","DEALER_CITY","DEALER_STATE","DEALER_ZIP","PROD_TYPE","REPAIRED_YN","MEDICAL_ATTN","VEHICLES_TOWED_YN")

# 取り込み直後は、782,115 records。
# 「Ctrl+Shift+M」でpipe演算子(`%>%`)を挿入
# マスターのデータフレーム(master.df)から3%を無作為抽出し、別のデータフレーム
# (sample_3_percent.df)に書き出す。今回は3%で指定するため、23,463 recordsとなる。
sample_3_percent.df <- master.df %>% sample_frac(0.03)

# CSVファイルとして書き出し
write.csv(sample_3_percent.df,"sample_3_percent.csv")

サンプリングされたファイルを見ると、32.1MBなのでExcelでも開けるサイズになりました。


次回は、このファイルを使って新しくなったWEXのご紹介をしたいと思います。

R関連エントリー


R言語:starwarsキャラの身長や年齢をdplyrで加工してggplot2する。http://sapporomkt.blogspot.jp/2017/08/rstarwarsdplyrggplot2.html 

RESASの不動産取引データでheatmapを作ってみた。
http://sapporomkt.blogspot.jp/2017/05/resasheatmap.html 

RESASデータを「IBM Data Scientist Workbench」でゴニョゴニョしてみた。
http://sapporomkt.blogspot.jp/2017/05/resasibm-data-scientist-workbench.html

ggplot2でクロス集計的に複数グラフをプロットする方法 
http://sapporomkt.blogspot.jp/2016/11/ggplot2.html

R開発環境が無料で簡単導入!「Data Scientist Workbench」を使ってみた。
 
http://sapporomkt.blogspot.jp/2016/10/rdata-scientist-workbench.html

(Bluemix)知ってた?dashDBってTwitter分析にもツカエルのさ(+ちょっとだけコンサドーレ調べ) 
http://sapporomkt.blogspot.jp/2016/07/bluemixdashdbtwitter.html

RMeCabで形容詞の形態素解析をやってみた。 
http://sapporomkt.blogspot.jp/2016/07/rmecab.html

【R言語】今年は、leafletでマップをグリグリしたい。 
http://sapporomkt.blogspot.jp/2016/01/rleaflet.html

(R言語)当ブログアクセス者の興味関心事をコレポン(コレスポンデンス)した。
http://sapporomkt.blogspot.jp/2015/12/r.htm

2019年6月23日日曜日

(Watson)Personality InsightsのJSONをR言語でパースしてみた

現在、Python勉強中ですが、どちらかと言うとR言語派の私は肩身が狭いです。。
いろんなサンプルスクリプトを調べても、Pythonばかりで。。
一矢を報いたくなったので、WatsonのAPIである「Personality Insights」から出力されたjsonをR言語でパースする、超簡単なスクリプトを書いみました。

ローカル環境でも出来るのですが、せっかくなので、Cloud上でAI開発が可能な「Watson Studio」(無料プラン)でやってみたいと思います。

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。 
 

「Personality Insights」からのjson取得


「Personality Insights(PI)」については、Qiitaなどで複数紹介されているのでご存知の方も多いと思いますが、簡単に言うと、言語学的分析とパーソナリティ理論を応用し、テキストから筆者の性格や特徴を推測するWatson APIのひとつです。

本来は、PythonやcURLからアクセスしてjsonを入手する必要があるのですが、やや敷居が高いので、コピペだけで済む方法をご紹介します。

1.「Personality Insights」のデモサイトにアクセスする。
デモサイトでは、スクリプトなど一切書かずに、PIの実行と出力結果を得ることができます。
自分で準備したテキストファイルでも分析可能ですが、今回は、リンクされている著名人のTwitterデータを使いますので、画面の「ツイート分析」をクリックしてください。
私は、「ダルビッシュ有」さんのツイートを選びました。


画面右下の「分析」画面を押すと、下記のような分析結果の画面が表示されるはずです。



2. JSONを取得する
画面をスクロールし、「JSONを見る」をクリックしてください。



JSONが表示されるので、ドラッグ&ドロップで全選択してください。
残念ながら、ショートカットキーだと、ページ全体が対象となるので、ドラッグ&ドロップのみです。


コピーした結果をエディターに貼ります。ファイル名は「PI_sample.json」にしました。
猛者たちの「スクリプトでやれよ」的な声が聞こえてくるかもしれませんが、そっと耳を塞ぎます。。


これでスクリプトを書かずに、JSONを入手することができました。

Watson StudioのR環境(Rstudio)でJSONをパースする


1.Watson Studioにアクセスする
以降の作業は「Watson Studio」で行いますが、登録の仕方はQiitaなど、他サイトをご覧ください。なお、当エントリーに記載する作業は、全て無料で実施可能です。何回も試行したとしても、勝手に課金されることはありませんので、ご安心ください。

まずは、下記サイトにある「ライト・アカウントを今すぐ登録」を選び、登録に必要な情報をインプットしてください。

Watson Studioへのアクセス手順で迷う方は、下記サイトをご覧ください。

Watson Studioセットアップガイド(ライトアカウント可)


2.新規プロジェクトを作成する
Watson Studioに入った後は、「Create a project」を選択してください。


3.「Standard」を選択
「Creat a project」画面が表示されるので、「Standard」を押してください。



4.プロジェクトネームを入力する
「Name」欄にお好きなプロジェクトネームを入力してください。
私は「PI_R_sample」としました。Descriptionは空欄でOKです。
入力が終わりましたら、右下の「Create」を押してください。



5.「Rstudio」を起動する
「Launch IDE」を押した後にプルダウンで表示される「Rstudio」を選択してください。
少し待つとRの統合開発環境である「Rstudio」が起動します。














RStudioが出ましたっ!!
右下の「Upload」を選択してください。


ファイルがアップされました。




6.Rスクリプトを実行する
左側のコンソールペインに下記スクリプトをコピー&ペーストし、enterを押してください。


# jsonliteパッケージのインストール
install.packages("jsonlite")

# jsonファイルのパースパッケージを呼び出し
library(jsonlite)

# jsonファイルをパース。" "内のファイル名は、都度書き換え
PI_result <- read_json("PI_sample.json", simplifyVector = TRUE)

# =====================PI項目名とスコアを抽出=====================

# ---------------------各「PIword_count」パート----------------

# count数を抽出。 countだけ%ではなく、N
word.name = "word_count"
word.count = unlist(PI_result$word_count)

# word_count項目名と%スコアをつなげたデータフレームを作成
word_count.df <- data.frame(word.name,word.count)
colnames(word_count.df) <- c("item","score")


# ---------------------各「PIBig5」パート----------------

# Big5big5_openness(知的好奇心)
# jsonをパースしたList形式からBig5big5_openness(知的好奇心)スコアを抽出
big5_openness.name <- unlist(PI_result$personality$name[[1]])
big5_openness.percentile <- unlist(PI_result$personality$percentile[[1]])

# openness項目名と%スコアをつなげたデータフレームを作成
big5_openness.df <- data.frame(big5_openness.name,big5_openness.percentile)
colnames(big5_openness.df) <- c("item","score")


# Big5big5_Conscientiousness(誠実性)
# jsonをパースしたList形式からBig5big5_Conscientiousness(誠実性)スコアを抽出
big5_conscientiousness.name <- unlist(PI_result$personality$name[[2]])
big5_conscientiousness.percentile <- unlist(PI_result$personality$percentile[[2]])

# consciousness項目名と%スコアをつなげたデータフレームを作成
big5_conscientiousness.df <- data.frame(big5_conscientiousness.name,big5_conscientiousness.percentile)
colnames(big5_conscientiousness.df) <- c("item","score")


# Big5big5_Extraversion(外向性)
# jsonをパースしたList形式からBig5big5_Extraversion(外向性)スコアを抽出
big5_extraversion.name <- unlist(PI_result$personality$name[[3]])
big5_extraversion.percentile <- unlist(PI_result$personality$percentile[[3]])

# Extraversion項目名と%スコアをつなげたデータフレームを作成
big5_extraversion.df <- data.frame(big5_extraversion.name,big5_extraversion.percentile)
colnames(big5_extraversion.df) <- c("item","score")


# Big5big5_Agreeableness(協調性)
# jsonをパースしたList形式からBig5big5_Agreeableness(協調性)スコアを抽出
big5_agreeableness.name <- unlist(PI_result$personality$name[[4]])
big5_agreeableness.percentile <- unlist(PI_result$personality$percentile[[4]])

# Agreeableness項目名と%スコアをつなげたデータフレームを作成
big5_agreeableness.df <- data.frame(big5_agreeableness.name,big5_agreeableness.percentile)
colnames(big5_agreeableness.df) <- c("item","score")


# Big5big5_Emotional_range(感情起伏)
# jsonをパースしたList形式からBig5big5_Emotional_range(感情起伏)スコアを抽出
big5_emotional_range.name <- unlist(PI_result$personality$name[[5]])
big5_emotional_range.percentile <- unlist(PI_result$personality$percentile[[5]])

# Emotional_range項目名と%スコアをつなげたデータフレームを作成
big5_emotional_range.df <- data.frame(big5_emotional_range.name,big5_emotional_range.percentile)
colnames(big5_emotional_range.df) <- c("item","score")


# ---------------------各「PINeed(欲求)」パート----------------

# jsonをパースしたList形式からNeed(欲求)スコアを抽出
need.name <- unlist(PI_result$needs$name)
need.percentile <- unlist(PI_result$needs$percentile)

# Need項目名と%スコアをつなげたデータフレームを作成
need.df <- data.frame(need.name,need.percentile)
colnames(need.df) <- c("item","score")


# ---------------------各「PIValue(価値)」パート----------------

# jsonをパースしたList形式からValue(価値)スコアを抽出
value.name <- unlist(PI_result$value$name)
value.percentile <- unlist(PI_result$value$percentile)

# Value項目名と%スコアをつなげたデータフレームを作成
value.df <- data.frame(value.name,value.percentile)
colnames(value.df) <- c("item","score")


# ---------------------各「PI:各パートの行結合」パート----------------

# 個別データフレームの行結合(バインド)
pi_merge.df <- rbind(
  word_count.df,
  big5_openness.df,
  big5_conscientiousness.df,
  big5_extraversion.df,
  big5_agreeableness.df,
  big5_emotional_range.df,
  need.df,
  value.df)


# PIデータフレームのCSV書き出し
write.csv(pi_merge.df,"pi_merge.df.csv")

7.CSVファイルをダウンロードする
Rスクリプトが完了すると、右下にCSVファイルが表示されるはずです。
「More」から「Export」を選び、CSVファイルをダウンロードしてください。







ダウンロード後のCSVファイルを開くと、PIのスコアが一覧化されています。


当エントリーは手順を全て記載したので手間のかかる作業のように見えますが、実際は、特別なスキル無しに20分あればCSVファイル取得まで行けると思います。

想定ユースケースなど



実務上のユースケースとしては、異なるセグメントやグループに属する方の発話テキストを個別のJSONとして読み込ませ、各人のPIスコアを比較し、そこから何らかの分析の切り口を見つけ出すといった使い方は面白いと思います。

ただし、「PIスコアから、ターゲットのインサイトが全てわかる」「打ち手イメージの導出まで繋がる」とは考えない方がいいと思います。これは、PIの機能どうこうという問題ではなく、結局、読み込ませるデータの内容や、分析者の目的や意図によって「(解釈上の)PIスコアの意味」が変わってくるものだと思うからです。
(ex.アウドドアグッズメーカーと、文房具メーカーのレビューを読み込ませた場合の”Openness”の意味合いは違うはず)

個人的には、非構造化データ分析時に、最初の取っ掛かりとしてPIにかけると、新たな分析仮説がイメージしやすい場合もあって有用かなと思っています。

ご参考:その他のWatson関連エントリー


Watson Studioの「Data Refinery」機能で「馬の疝痛(せんつう)」データを眺めてみた。
https://sapporomkt.blogspot.com/2019/06/watson-studiodata-refinery.html

Watson AnalyticsとMeCabで「老人と海」を軽く可視化してみた。
https://sapporomkt.blogspot.com/2017/08/watson-analyticsmecab.html

Watson Explorerでディズニーの人気作品をテキストマイニング
http://sapporomkt.blogspot.jp/2017/04/watson-explorer.html

いま話題のIBM「Bluemix(ワトソンくん)」が「老人と海」をサマったら。
http://sapporomkt.blogspot.jp/2015/11/ibmbluemix.html

2017年8月29日火曜日

R言語:「stringr」パッケージでレビューデータの加工が簡単(その3)

ほんとに小ネタなのですが、原因気づくのに時間がかかったので備忘録がわりに。
過去、何回かに分けて宿泊レビューのテキストマイニングの前処理を色々やっておりました。

R言語:「stringr」パッケージでレビューデータの加工が簡単。
http://sapporomkt.blogspot.jp/2017/08/rstringr.html

R言語:「stringr」パッケージでレビューデータの加工が簡単(その2)
http://sapporomkt.blogspot.jp/2017/08/rstringr2.html


今回、テキストマイニングで集計したデータ(品詞の頻度など)と、性別や年代といった属性データを掛け合わせた分析するため、後者の分布状況などをヒストグラムなどで確認しようと思ったところ凡ミスしたのでご紹介です。

実施環境については、以下の通りです。

・MacBook Air(CPU:1.6GHz,Memory 8GB)
・macOS Sierra ver10.12.3
・RStudio ver 1.0.136


ソースコードのご紹介


わかったら何のこともない凡ミスだったのですが、ソースコードは以下です。
データの読み込みプロセスなどは以前のエントリーをご参照ください。

# 宿泊者の満足度(CS)が入っている「rank」でヒストグラムを・・・できません。
hist(hotel2.dat[,"rank"])
 hist.default(hotel2.dat[, "purpose1"]) でエラー:
   'x' は数値でなければなりません


# 各変数のクラスをザラーっと調べてみます。
# 「rank」がcharacter型になっていますね。numeric型じゃなきゃ、ダメだこりゃ。
sapply(hotel2.dat,class)
          rank           user          time1   com_sentence       purpose1
   "character"    "character"    "character"    "character"    "character"
      purpose2       purpose3          time2 reply_sentence          plan1
   "character"    "character"    "character"    "character"    "character"
         plan2      user_name            age            sex            flg
   "character"    "character"    "character"    "character"      "logical"

# rankをnumeric型に変換して元のデータセットに上書きします。
hotel2.dat$rank <- as.numeric(hotel2.dat$rank)

# 念のためチェックします。「rank」がnumeric型になっていますね。
sapply(hotel2.dat,class)
          rank           user          time1   com_sentence       purpose1
     "numeric"    "character"    "character"    "character"    "character"
      purpose2       purpose3          time2 reply_sentence          plan1
   "character"    "character"    "character"    "character"    "character"
         plan2      user_name            age            sex            flg
   "character"    "character"    "character"    "character"      "logical"

# 再度、ヒストグラムにトライです。colには他の色も適用可能です。colors() で色々出てきます。
hist(hotel2.dat[,"rank"], col ="aliceblue")


# せっかくなのでクロス集計もしてみます。
hotel2.crs <- xtabs(~purpose2+sex, data=hotel2.dat)
hotel2.crs

         sex
purpose2   女性 男性
              1    1
  その他      1    1
  一人        6   12
  家族       58   77
  仕事仲間    1    0
  友達        8    6
  恋人        4    7

# 有用性はアレですが、モザイクプロットでも。
# どうてもいいですが、表頭と表側が入れ替わるんですね。
mosaicplot(hotel2.crs)


以上です。

R関連エントリー


R言語:starwarsキャラの身長や年齢をdplyrで加工してggplot2する。http://sapporomkt.blogspot.jp/2017/08/rstarwarsdplyrggplot2.html

RESASの不動産取引データでheatmapを作ってみた。
http://sapporomkt.blogspot.jp/2017/05/resasheatmap.html 

RESASデータを「IBM Data Scientist Workbench」でゴニョゴニョしてみた。
http://sapporomkt.blogspot.jp/2017/05/resasibm-data-scientist-workbench.html

ggplot2でクロス集計的に複数グラフをプロットする方法
http://sapporomkt.blogspot.jp/2016/11/ggplot2.html

R開発環境が無料で簡単導入!「Data Scientist Workbench」を使ってみた。

http://sapporomkt.blogspot.jp/2016/10/rdata-scientist-workbench.html

(Bluemix)知ってた?dashDBってTwitter分析にもツカエルのさ(+ちょっとだけコンサドーレ調べ)
http://sapporomkt.blogspot.jp/2016/07/bluemixdashdbtwitter.html

RMeCabで形容詞の形態素解析をやってみた。
http://sapporomkt.blogspot.jp/2016/07/rmecab.html

【R言語】今年は、leafletでマップをグリグリしたい。
http://sapporomkt.blogspot.jp/2016/01/rleaflet.html

(R言語)当ブログアクセス者の興味関心事をコレポン(コレスポンデンス)した。
http://sapporomkt.blogspot.jp/2015/12/r.htm

2017年8月24日木曜日

R言語:「stringr」パッケージでレビューデータの加工が簡単。

レビューデータのテキストマイニングがしたくて、データ加工プロセスのお勉強なうです。
「stringr」パッケージが使いやすいと評判だったので、今更ながら書いてみました。

実施環境については、以下の通りです。

・MacBook Air(CPU:1.6GHz,Memory 8GB)
・macOS Sierra ver10.12.3
・RStudio ver 1.0.136


思ってたよりも簡単だったソースコードのご紹介


実施前は難しいかなと思っていましたが、やってみたら意外と簡単でした。

# パッケージの読み込み。
# 「xlsx」形式の読み込みは他にもパッケージがありますが、Javaの導入など面倒が増えるので、このパッケージがオススメです。ただし、「xls」形式は読めません。
library(openxlsx)
library(dplyr)

# データの読み込み
setwd("~/blog/hotel_170819_TM")
hotel.dat <- read.xlsx("170819_hotel.xlsx")

# カラム名を表示します。不要なカラムもたくさん含まれています。
colnames(hotel.dat)
 [1] "url"            "rank"           "com_title"    
 [4] "com_title_link" "user"           "time1"        
 [7] "com_sentence"   "flg1"           "flg1_link"    
[10] "flg2"           "flg2_link"      "flg3"         
[13] "flg3_link"      "purpose1"       "purpose2"     
[16] "purpose3"       "time2"          "reply_sentence"
[19] "plan1"          "plan2_link"     "plan2"

# 分析データをattachします。「hotel.dat$hoge」と入力せずに、hogeで狙ったカラムにアクセスできます。
attach(hotel.dat)

# 分析に必要なカラムだけ抜き出します。見た目はわかりづらいですが、「dplyr」パッケージのおかげです。
hotel2.dat <- select(hotel.dat,rank,user,time1,com_sentence,purpose1,purpose2,purpose3,time2,reply_sentence,plan1,plan2)

# データ内容を確認してみます。
View(hotel2.dat)

今回用いたデータセットでは、user列に、「ユーザー名・年代・性別」データが同一カラムに入っていました。年代・性別は分析に有用なので別カラムに切り出したいです。

小田一弥さん [30代/男性]

user_nameagesex
小田一弥さん30代男性

「おっと、正規表現だな・・・」と思われたあなた、大丈夫です。
自分も不慣れですが、今回はとっても簡単です。

# パッケージを読み込みます。最初は「for」で繰り返し処理を書こうと思ったのですが、こちらの方がずっとシンプルで早いそうです。
library(stringr)

# userの名前と年代・性別を分離
hotel2.dat$user_name <- str_extract(hotel2.dat$user,"^.*さん")
hotel2.dat$age <- str_extract(hotel2.dat$user,"\\d{2}代")
hotel2.dat$sex <- str_extract(hotel2.dat$user,".性")

 View関数で見ると下記のようになります。


# パッケージを読み込みます。
library(rpivotTable)
# グラフ化します
rpivotTable(hotel2.dat)


以上です。

R関連エントリー


R言語:starwarsキャラの身長や年齢をdplyrで加工してggplot2する。http://sapporomkt.blogspot.jp/2017/08/rstarwarsdplyrggplot2.html

RESASの不動産取引データでheatmapを作ってみた。
http://sapporomkt.blogspot.jp/2017/05/resasheatmap.html 

RESASデータを「IBM Data Scientist Workbench」でゴニョゴニョしてみた。
http://sapporomkt.blogspot.jp/2017/05/resasibm-data-scientist-workbench.html

ggplot2でクロス集計的に複数グラフをプロットする方法
http://sapporomkt.blogspot.jp/2016/11/ggplot2.html

R開発環境が無料で簡単導入!「Data Scientist Workbench」を使ってみた。

http://sapporomkt.blogspot.jp/2016/10/rdata-scientist-workbench.html

(Bluemix)知ってた?dashDBってTwitter分析にもツカエルのさ(+ちょっとだけコンサドーレ調べ)
http://sapporomkt.blogspot.jp/2016/07/bluemixdashdbtwitter.html

RMeCabで形容詞の形態素解析をやってみた。
http://sapporomkt.blogspot.jp/2016/07/rmecab.html

【R言語】今年は、leafletでマップをグリグリしたい。
http://sapporomkt.blogspot.jp/2016/01/rleaflet.html

(R言語)当ブログアクセス者の興味関心事をコレポン(コレスポンデンス)した。
http://sapporomkt.blogspot.jp/2015/12/r.htm

2017年8月4日金曜日

Watson AnalyticsとMeCabで「老人と海」を軽く可視化してみた。

趣味とお仕事のお勉強を兼ねて、形態素解析エンジンの「MeCab」を触っているのですが、「集計結果の可視化にWatsonAnalytics使えば楽かも?」と思って試したらその通りだったので軽くご紹介します。

最終的には、こんな可視化をします。


実施環境については、以下の通りです。
・MacBook Air(CPU:1.6GHz,Memory 8GB)
・macOS Sierra ver10.12.3
・RStudio ver 1.0.136
・分析データ:「青空文庫」よりヘミングウェイの「老人と海」の全文を取得

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。

まずは、MeCabで形態素解析。


まずは、形態素解析エンジンである「MeCab」を使って、頻度表を出力します。
環境構築がお済みではない方は下記をご参照ください。

RおよびRStudioのインストール方法(Mac/Windows)
http://qiita.com/daifuku_mochi2/items/ad0b398e6affd0688c97

RとLinuxと...
http://rmecab.jp/wiki/index.php?RMeCab



「形態素解析って難しそう・・・」と感じるかもしれませんが、以下のソースコードをRStudioコンソールにコピペするだけで出来ちゃいますのでご安心を。


# 読み込みファイルがあるディレクトリを指定します
# コード入力よりもRStudioメニューの「Session→Set Working Directory」の方が楽です。
setwd("~/blog/170722_roujin_MeCab/roujin")

# RMeCabパッケージを呼び出しておきます
library(RMeCab)

# 形態素解析を行い、タームと品詞別の頻度表を得ます。たったこれだけ!
roujin_count <- RMeCabFreq("roujintoumi.txt")

# RMeCabFreqで集計した結果を確認します。
View(roujin_count)


RStudio上に下記のようなビューワー形式で表示されます。
左から「Term(形態素)」「品詞分類1」「品詞分類2」「頻度数」となります。


一応、データ構造も確認してみますが、RStudio上でこのデータを可視化するには、ggplot2などを使ってゴニョゴニョするわけですが・・・うーん、ちょっと面倒臭いので楽したいですね。

今回は他のツールで可視化するために、一旦、RStudioから「roujin_count」データを出力します。

# str関数でデータ構造を確認します。
str(roujin_count)
'data.frame':    3214 obs. of  4 variables:
 $ Term : chr  "あの" "いかん" "いかんせん" "いくら" ...
 $ Info1: chr  "フィラー" "副詞" "副詞" "副詞" ...
 $ Info2: chr  "*" "一般" "一般" "一般" ...
 $ Freq : int  1 2 1 1 1 1 2 4 6 1 ...

# write.csv関数を使って集計データをCSV形式で出力します。
# 「quote=FALSE」は、データに引用符の「"」を付けないオプションです。
# 「row.names=FALSE」は、行番号を付けないオプションです。
# 「fileEncoding="CP932" 」は、「Shift-JIS」で出力するオプションとなります。

 write.csv(roujin_count,"roujin_count.csv",quote=FALSE,row.names=FALSE,fileEncoding = "CP932")



可視化は「Watson Analytics」にお任せ。


 ここからは、IBMが提供するクラウド上でビックデータ分析が可能な「Watson Analytics」を用います。

 なお、この時点では何となくはあるのですが、具体的に「こんな可視化をしよう」といったイメージ無しで作業を進めています。 事前にしっかりとしたアウトプットイメージを持ちながら作業を進めることは重要ですが、「とりあえずデータの概観を見たい」といった局面もあると思います。「Watson Analytics」には、データの特性を自動的に解析し、「もしかして、こんな風に見たいと思ってない?」といったオプションを先に提示してくれる機能が実装されています。

以下にその機能の一部と操作手順をご紹介します。
「Watson Analytics」の利用登録がお済みではない方は、下記URLからご登録ください(無料です)

IBM Watson Analytics
https://www.ibm.com/watson-analytics


1.まずは集計データのアップロード
「Watson Analytics」にログインしましたら、画面中央の「Add」ボタンから「Or add your data」→「Drop file or browse」を選択してください。


macOSだとFinder、Windowsだとexplorerが立ち上がりますので、読み込ませたい集計ファイル(この場合、「roujin_count」)を選択してください。


たったこれだけで「Watson Analytics」上に集計ファイルがアップロードされます。


2.可視化の実施
アップロードされた「DATA SET CSV」パネルをクリックすると、「Watson Analytics」が下記のようなオプションを自動提示します。

とりあえず、品詞分類1レベルで大まかなボリューム感を見たいので、一番右を選択します。


品詞別のボリューム感がわかるグラフが瞬時に表示されました。
同じ作家の異なる作品をこのグラフで出力して円の大きさを比較しても面白そうですね。


他の形式でも確認して見たいので、画面右側の「>」マークを押してください。
今後は「Watson Analytics」からオススメされた一番左のグラフを選択してみましょう。


先ほどと同じ「品詞分類1」のグラフが表示されました。X軸は「品詞分類1名称」、Y軸は「品詞分類1別の頻度」となります。
降順でソートしたいので、X軸ラベル「info」を右クリック→「Sort→Descending by value」を選択してください。


簡単に降順ソートができました。
せっかくなので、Term(形態素)別の頻度も見たいので、画面左下の「applied filter」 を選択してください。


「Add a filter」から「Freq」を選ぶと下限値と上限値を入力する欄が表示されるので、バーを動かすか値を直接入力してください。



 「Info1」の 部分をクリックし、「Term」を選択すると下記のように頻度数30以上の全Termが表示されます。


これでは分かりづらいので、もう一度「Add filter」を選択し、「Info1」で「名詞」をフィルターの追加条件として設定すると下記のような名詞頻度数のグラフが表示されます。
※Term数が多すぎたので、頻度の下限値を50に修正しています。


原作を読まれた方は「あー、なるほどね」な結果になったのではないでしょうか。
今回のご紹介は以上です。

このように「Watson Analytics」を用いると、通常の集計ファイルで必要な各変数の形式設定などせずに直ぐに可視化作業に移ることが可能です。
データサイズの大きいファイルでなければ、無料で使えますので、ご興味ありましたら是非お試しください。

Watson関連エントリー


Watson Explorerでディズニーの人気作品をテキストマイニング
http://sapporomkt.blogspot.jp/2017/04/watson-explorer.html

 Watson Explorer Content Analytics(WCA)の紹介動画を紹介したいんです。
http://sapporomkt.blogspot.jp/2017/03/watson-explorer-content-analyticswca.html

分析の常識が変わる?「Watson Analytics」すげー!!
http://sapporomkt.blogspot.jp/2016/01/watson-analytics.html 

「データ・ビジュアライゼーション」でも便利な「Watson Analytics」。
http://sapporomkt.blogspot.jp/2016/01/watson-analytics_13.html

 いま話題のIBM「Bluemix(ワトソンくん)」が「老人と海」をサマったら。
http://sapporomkt.blogspot.jp/2015/11/ibmbluemix.html

「Watson」先生に、AdSenseビンボーの理由を聞いてみた・・・
http://sapporomkt.blogspot.jp/2016/01/watsonadsense.html