派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

Python×Excel:感情分析で一歩進んだアンケート集計をしてみよう

Pythonを実際に動かしてみよう!ということで、ビギナーも取り掛かりやすい、Microsoft Officeのアプリがより便利になる【Pythonのサンプルコード・ライブラリ】をご紹介します。今回は、Excel。【読むだけでも、なるほど】と思っていただけるよう、関連トピックも多く記載しています。スキルアップのお役に立てますように。

▼Pythonのインストールがまだの方はこちらから!

【筆者】 watさん
メーカー勤務機械系エンジニア。WATLABブログ運営者。工学計算に関する知識の習得を目指し、Pythonの学習を2019年から始める。仕事以外にも、趣味のプログラミングやPythonコミュニティへの参加を行っている。また、月間数万PVのPythonブログ「WATLAB」を立ち上げ、初心者向けに図を多くしたわかりやすい記事を作成・公開している。著書は『いきなりプログラミング Python』(翔泳社)。
ブログ:https://watlab-blog.com/
 

1.アンケートの自由記入欄の分析に、苦労したことはありませんか?

アンケートは顧客や従業員の声を直接収集する貴重な手段です。通常は数段階(1から5など)の数値(スコア)を記入者に選択してもらい、そのスコアの最小値や最大値、平均を集計して今後の方針のヒントとします。一方で、自由に文章を記述できる欄には記入者の生の声が書かれることが多いのに、一文一文細かく分析することは困難です。

単なる数値の集計であればExcelの基本機能だけで十分ですが、Pythonで感情分析を導入することで、一歩進んだ自由記入欄の分析を行うことができます。

感情分析とは?
感情分析(Sentiment Analysis)とは、テキストデータに含まれる感情や意見の傾向を分析することです。これにより、顧客のレビューやアンケートの自由記入欄から肯定的な意見や否定的な意見を数値化して表すことができます。
 
感情分析の基本的な仕組みは、自然言語処理(NLP:Natural Language Processing)の技術に基づいています。NLPはテキストデータを解析して構造を理解し、文脈や意味を捉える技術です。
 
今回はNLPによる感情分析で文章に含まれる微妙なニュアンス(ポジティブ・ネガティブ)を判定してスコアに変換します。一般的に感情分析のプログラムを自分でゼロから構築するのは困難ですが、Pythonは世界中の開発者が便利なライブラリを開発しているため、簡単に感情分析を活用したアプリを作成できます。

2. Pythonプログラミングの準備

■Pythonプログラミング環境の構築

Pythonプログラミングの環境は前回の「最速でPython環境を構築してプログラミングをはじめよう」を参照してください。Pythonのインストール方法、プログラムの記述・実行方法、外部ライブラリのインストール方法をまとめています。

■必要なライブラリのインストール

まずは次の3つの外部ライブラリをインストールしておきましょう。

POINT
第0回:最速でPython環境を構築してプログラミングをはじめよう」から始める方は、JupyterLabを立ち上げる前の状態にしておきましょう(仮想環境を使わない場合は5節、仮想環境を使う場合は7節の、いずれもjupyter labコマンドを実行する手前)。

(1)Pandas

PandasはPythonで表形式のデータ操作を行う際に便利なライブラリです。Excelファイルの読み込みや各種集計などに活用されています。次のコマンドでインストールしましょう。

pip install pandas

(2)TextBlob

TextBlobはシンプルかつ強力な自然言語処理ライブラリで、テキストの感情分析や文法の解析を行うことができます。TextBlob自体は英語の文章しか扱えませんが、他の多くの自然言語処理ライブラリと異なり、ユーザー登録や認証処理が不要です。初心者はそれらの事前処理で挫折することもあるので、今回は手軽に始められるTextBlobを使ってみます。次のコマンドでインストールを行いましょう。

pip install textblob

(3)deep-translator

deep-translatorはテキスト翻訳を簡単に行うための外部ライブラリです。GoogleTranslatorというモジュールを使うことで、Google翻訳を活用できます。先ほどのTextBlobは英語ベースなので、日本語の文章を一度英語に翻訳してから感情解析を行うために使用します。次のコマンドでインストールしましょう。

pip install deep-translator

外部ライブラリのインストールが終了したら、以下のコマンドを入力して、JupyterLabを立ち上げましょう。

jupyter lab

■サンプルファイル

この記事ではサンプルのExcelファイルを使いながらプログラムを作ります。PCで記事をご覧の方は、次のsample.xlsxをダウンロードしてPythonプログラムと同じフォルダに置いておきましょう。

▼クリックするとExcelファイルがダウンロードされます。

https://www.r-staffing.co.jp/rasisa/wp-content/uploads/2024/10/sample.xlsx

サンプルファイルの中身はこちらです。A列からE列が計5個の質問を意味しています。1行目はヘッダーで、各質問をQ1からQ5と名前を付けています。2行目以降がそれぞれの回答者の結果を意味しており、Q1からQ4は1〜5までの5段階評価、Q5は自由記入欄として日本語の文章が記載されているという内容です。

3. まずは普通に集計してみる

いきなり感情分析から入るのではなく、Pythonに慣れるためにまずは普通の集計をしてみましょう。Q1からQ4はすべて数値データで構成されているため、この数値の最小値や最大値、平均値を計算します。

■Excelファイルを読み込んで集計する

はじめにExcelファイルを読み込みます。次のPythonコードを入力してみましょう。

import pandas as pd

# Excelファイルを読み込む
df = pd.read_excel('sample.xlsx')

# 集計:最小値、最大値、平均値を計算
min_values = df[['Q1', 'Q2', 'Q3', 'Q4']].min()
max_values = df[['Q1', 'Q2', 'Q3', 'Q4']].max()
mean_values = df[['Q1', 'Q2', 'Q3', 'Q4']].mean()
POINT
1行目:pandasをimportする
Excelファイルを読み込むためにpandasをimportします。
 
POINT
4行目:Excelファイルを読み込み、データフレームに格納する
Excelファイルはデータフレームと呼ばれる構造体に格納されます。データフレームはExcelの表に似ており、行と列から構成される2次元のデータを効率的に管理、操作するためのフレームワークです。データフレームには異なるデータ型(数値型、文字列型)が混在していても構いません。
 
POINT
7〜9行目:集計する

この部分で最小値min_values、最大値max_values、平均値mean_valuesを算出しています。.min().max().mean()がそれらを計算するためのメソッドです。ここで各計算行で共通している[['Q1', 'Q2', 'Q3', 'Q4']]という部分は、データフレームの中で「Q1」から「Q4」までの列を抽出していることを意味します。
 
【こんなとき、どうする?】
ModuleNotFoundError: No module named 'pandas'が出る
プログラムを実行して、実行結果に「ModuleNotFoundError」が出る場合はpandasが正常にインストールされていません。再度pip install pandasを実行し、何かエラーが出ていないか確認しましょう。
 
【こんなとき、どうする?】
ImportError: Missing optional dependency ‘openpyxl’が出る
Pythonの外部ライブラリをインストールする際、自動的に関連ライブラリもインストールされます。しかし、環境によってはそのインストールに失敗している場合があります。その場合はImportErrorが表示されるので、足りないライブラリをpip installしましょう。ここではopenpyxlが足りないのでpip install openpyxlを実行しましょう。openpyxl以外のライブラリが足りない場合も足りないライブラリをインストールすれば解決します。
 
【こんなとき、どうする?】
FileNotFoundError: [Errno 2] No such file or directory: 'sample.xlsx'が出る
プログラミングにエラーは付きものです。FileNotFoundErrorが出る場合はサンプルのExcelファイルがプログラム実行フォルダにない可能性があります。ファイルの置き場やファイル名に間違いがないかを確認してみましょう。

■集計結果をデータフレームに追加する

次のコードを追加し、先ほど集計した結果をデータフレームに追加しましょう。

<省略>
# 計算した結果をデータフレームに追加
df.loc['Min'] = min_values
df.loc['Max'] = max_values
df.loc['Ave'] = mean_values

# 既存の列ヘッダーの調整
df.insert(0, 'Summary', [''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])
 
POINT
12〜14行目:集計結果をデータフレームに追加
最小値min_values、最大値max_values、平均値mean_valuesをデータフレームに追加します。.locは行方向のデータ参照を行う操作です。この操作で新しくMin, Max, Aveという行が作成され、各データが代入されます。
 
POINT
17行目:新規列ヘッダーを追加
.insert()で0番目の行にSummaryという列を追加し、行の値を設定しています。先ほど集計した3行より前には空白文字を設定し、その後にMin, Max, Aveのラベルをセルに代入します。この値は[''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])というリストにて与えられます。

■新しいExcelファイルに保存する

データ集計とセルの値設定が終了したら、最後に新しいExcelファイルを保存しましょう。次のコードを追加します。

<省略>
# 新しいExcelファイルとして保存
output_file = 'results.xlsx'
df.to_excel(output_file, index=False)
 
POINT
20, 21行目:Excelファイルの保存
output_fileという変数は保存するファイル名です。Pythonではシングルクォート「'」やダブルクォート「"」で囲んだ範囲を文字列として扱えます。文字列でファイル名を設定し、.to_excel()メソッドでExcelファイルに保存します。

プログラムの実行フォルダにresults.xlsxが保存されていることを確認したら、ファイルを開いてみましょう。集計結果の3行とSummary列が追加されていることが確かめられるはずです。

ここまでで数値データの集計やExcelファイルのデータを操作する基礎を習得したことになります。

4. 「感情分析」を試してみよう

■関数を定義する

上記のコードは単純に数値データを集計しただけです。この内容であればExcel単体の方がまだ簡単にできるでしょう。続いてPythonならではのデータ分析として冒頭で紹介した感情分析を行ってみましょう。

次のライブラリをコード上でimportします。一行目の下に追加してください。

import pandas as pd
from textblob import TextBlob                    # 追加
from deep_translator import GoogleTranslator     # 追加
<省略>

そしてimport文の下に、関数を定義します。

<省略>
from deep_translator import GoogleTranslator

def sentiment_analysis(text, min_score=1, max_score=5):        # ここから追加
    """感情解析をする関数"""

    translated_text = GoogleTranslator(source='ja', target='en').translate(text)
    analysis = TextBlob(translated_text)
    polarity = analysis.sentiment.polarity

    # 指定範囲のスコアにスケーリング
    score = ((polarity + 1) * (max_score - min_score) / 2) + min_score

    return score                                               # ここまで追加
<省略>
 
POINT
5〜15行目:感情解析関数の定義
コードの上部、import文の下にsentiment_analysis()という関数を定義しました。Pythonで関数を定義するには、まずdefというキーワードを書き、その後に半角スペースを1つ空けて任意の関数名を書きます。
関数には引数と戻り値を設定できます。今回は引数としてテキストtextと最小スコアmin_score、最大スコアmax_scoreを受け取ります。そしてテキストの感情分析を行い、min_scoreからmax_scoreまでの範囲にスケーリングしたスコア(感情を数値化したもの)を戻り値とする設定がされています。戻り値はreturnの後に半角スペースを入れて設定します。
 
POINT
8〜10行目:感情解析を行う
8行目でGoogleTranslator()を使い、日本語を英語に翻訳します。sourcejaを指定することで元の言語が日本語であることを示し、targetenを指定することで翻訳先の言語を英語に設定しています。
9行目でTextBlobによる感情解析が実行され、10行目でスコアを取得します。ここでスコアはpolarity(極性)という形で表現され、-1.0(ネガティブ)から1.0(ポジティブ)の範囲で得られます。
 
POINT
13行目:スケーリング
polarityの値は-1.0〜1.0の範囲ですが、アンケートの数値範囲は1.0〜5.0です。この範囲にデータをスケーリングすることで、他のアンケート結果と同じスケールで評価ができるようにしています。

■関数を使う

関数を定義したら、メイン文でその関数を呼びだすことで関数を使うことができます。次のコード修正を行い、sentiment_analysis()関数を使ってみましょう。

<省略>
df = pd.read_excel('sample.xlsx')

# Q5の文章を感情解析し、新規作成したQ5_score列に結果を追加   # 追加
df['Q5_score'] = df['Q5'].apply(sentiment_analysis)                # 追加

# 集計:最小値、最大値、平均値を計算
min_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].min()        # Q5_scoreを追加
max_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].max()        # Q5_scoreを追加
mean_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].mean()      # Q5_scoreを追加
<省略>
 
POINT
21〜26行目:新しい列に関数を適用した結果を追加
df['Q5_score']で新しい「Q5_score」という列を「Q5」の右隣に作成します。.apply()メソッドは指定した列や行のすべての要素に対して同じ関数による処理を実行するためのメソッドです。
 
集計部分に新しく作成したQ5_scoreを追加することで、この列に対しても集計が行われるようになります。

■結果を確認する

こちらが実行した後に作られるExcelファイルの中身です。Q5列の文章に対して感情分析された結果がQ5_score列に数値化され、その数値データがMin, Max, Aveで集計されている結果となりました。

5. 全体のコードはこちらから

Excelは色々な企業でさまざまな用途に使える素晴らしいソフトです。しかし、Pythonと併用することでより柔軟で高度な分析が可能になります。世界中で開発が進んでいるPythonのライブラリ群を使えば、きっとあなたの仕事に役立つ新たな可能性が見えてくるはずです。

今回のコードは詳細な説明をあえて省きました。ご興味のある読者はぜひ基礎からPythonの文法を学び、何か面白いアプリを作ってみてください。

最後に、この記事で紹介した全体のコードを載せます。PCで開ける方はぜひコピペして遊んでみてください。

import pandas as pd
from textblob import TextBlob
from deep_translator import GoogleTranslator

def sentiment_analysis(text, min_score=1, max_score=5):
    """感情解析をする関数"""

    translated_text = GoogleTranslator(source='ja', target='en').translate(text)
    analysis = TextBlob(translated_text)
    polarity = analysis.sentiment.polarity

    # 指定範囲のスコアにスケーリング
    score = ((polarity + 1) * (max_score - min_score) / 2) + min_score

    return score

# Excelファイルを読み込む
df = pd.read_excel('sample.xlsx')

# Q5の文章を感情解析し、新規作成したQ5_score列に結果を追加
df['Q5_score'] = df['Q5'].apply(sentiment_analysis)

# 集計:最小値、最大値、平均値を計算
min_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].min()
max_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].max()
mean_values = df[['Q1', 'Q2', 'Q3', 'Q4', 'Q5_score']].mean()

# 計算した結果をデータフレームに追加
df.loc['Min'] = min_values
df.loc['Max'] = max_values
df.loc['Ave'] = mean_values

# 既存の列ヘッダーの調整
df.insert(0, 'Summary', [''] * (len(df) - 3) + ['Min', 'Max', 'Ave'])

# 新しいExcelファイルとして保存
output_file = 'results.xlsx'
df.to_excel(output_file, index=False)

いかがでしたか。次回はPython×PowerPointというテーマで学んでいきます。お楽しみに。

リクルートスタッフィング