Анализ отзывов клиентов имеет решающее значение для доходов и прибыльности компании, поскольку отзывы клиентов могут сильно повлиять на бизнес. Изучая отзывы клиентов, компании могут определить области, требующие улучшения в их брендинге, продуктах и ​​услугах. Это помогает принимать обоснованные решения, которые приводят к снижению скорости оттока. Важным инструментом бизнес-аналитики, который можно использовать, является АНАЛИЗ ОТНОШЕНИЙ, также называемый анализом мнений.

Анализ настроений относится к процессу выявления и категоризации мнений, выраженных в данном тексте, с целью определения того, является ли позиция клиента положительной, отрицательной или нейтральной.

Тематическое исследование

Цель этого анализа — оценить общую удовлетворенность клиентов iPhone от Apple, используя данные DataDNA iPhone Reviews Dataset Challenge.

Набор данных

Набор данных, содержащий более 5000 обзоров Apple iPhone от Amazon.com, предлагает ценную информацию и обширные мнения, которые могут помочь в оценке текущего отношения клиентов к продукту. Благодаря исключительным рейтингам обзоров и подробным текстовым обзорам читатели могут понять, почему клиенты оценили или не полюбили продукт, предоставляя важные отзывы для рынка, включая подробную информацию о том, что сработало (или не сработало) хорошо.

Анализ

Я проведу вас через весь процесс проведения анализа настроений на значительном объеме данных. Хотя я использовал Jupyter Notebook для всего анализа и визуализации, подойдет любая Python IDE. Обратите внимание, что все пакеты были ранее импортированы.

Шаг 1: Считайте фрейм данных

import pandas as pd
df = pd.read_csv("DataDNA March 2023.csv")
df.head()

Проверка первых пяти строк фрейма данных:

Из фрейма данных видно, что он содержит различные детали, связанные с продуктами, пользователями и их отзывами. Важнейшими данными для нашего анализа будут «review_title», «review_text», и «review_rating».

review_text — текст отзыва. (Нить)

review_rating —оценка, присвоенная продукту рецензентом. (Целое число)

review_title — название обзора. (Нить)

Шаг 2: Анализ данных

Мы изучим переменную «review_rating» и определим, являются ли большинство оценок клиентов положительными или отрицательными.

Для анализа необходимо установить библиотеку Plotly.

# Product Scores
fig = px.histogram(df, x="review_rating", category_orders={"review_rating": ["1.0", "2.0", "3.0", "4.0", "5.0"]})
fig.update_traces(marker_color="turquoise",marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5)
fig.update_layout(title_text='Product rating')
fig.show()

Отсюда видно, что большинство оценок клиентов положительные. Это говорит о том, что отзывы, вероятно, также будут преимущественно положительными, которые будут проанализированы в ближайшее время.

Теперь мы можем создавать облака слов, чтобы визуализировать наиболее часто используемые слова в обзорах.

import nltk
from nltk.corpus import stopwords
from wordcloud import WordCloud,STOPWORDS

# Create stopword list:
stopwords = set(STOPWORDS)
stopwords.update(["br", "href"])
textt = " ".join(review for review in df.review_text)
wordcloud = WordCloud(stopwords=stopwords).generate(textt)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.savefig('wordcloud11.png')
plt.show()

Судя по отзывам, преобладают такие общие термины, как «хороший», «потрясающий», «лучший», «потрясающий» и «Amazon». Эти термины в основном передают положительное настроение, предполагая, что большинство обзоров в наборе данных выражают положительные эмоции.

Шаг 3. Классификация отзывов

Следующий этап включает в себя классификацию отзывов как «положительных» или «отрицательных» для обучения нашей модели классификации настроений.

Отзывы со значением «Оценка» > 3 будут помечены как +1, что указывает на положительное отношение. С другой стороны, отзывы с «Оценкой» ‹ 3 будут помечены как 0, что указывает на негативное настроение.

Поскольку отзывы с «Оценкой» 3 являются нейтральными, мы исключим их из нашего анализа. Наша модель направлена ​​на то, чтобы различать положительные и отрицательные отзывы, т. е. клиенты, в целом довольные и недовольные iPhone от Apple.

df['review_rating'] = df['review_rating'].astype(str).astype(float)
df = df[df['review_rating'] != 3.0]
df['sentiment_val'] = df['review_rating'].apply(lambda rating : +1 
if rating > 3 else 0)

Теперь мы можем увидеть новый столбец с именем «sentiment_val» во фрейме данных:

Шаг 4: Больше анализа

Давайте создадим облака слов для положительных и отрицательных отзывов после их классификации.

Для начала мы создадим два отдельных фрейма данных, один для положительных отзывов, а другой для отрицательных.

# split df - positive and negative sentiment:
positive = df[df['sentiment_val'] == 1]
negative = df[df['sentiment_val'] == 0]

Wordcloud — Положительное отношение

stopwords = set(STOPWORDS)
stopwords.update(["br", "href","good", "iPhone", "phone", "product", 
"Amazon", "Apple"]) 

pos = " ".join(review for review in positive.review_text)
wordcloud2 = WordCloud(stopwords=stopwords).generate(pos)
plt.imshow(wordcloud2, interpolation='bilinear')
plt.savefig('wordcloud31.png')
plt.axis("off")
plt.show()

Wordcloud — негативное отношение

neg = " ".join(review for review in negative.review_text)
wordcloud3 = WordCloud(stopwords=stopwords).generate(neg)
plt.imshow(wordcloud3, interpolation='bilinear')
plt.axis("off")
plt.savefig('wordcloud33.png')
plt.show()

Как было замечено ранее, облако слов положительного настроения содержало множество оптимистичных слов, в том числе «отлично», «потрясающе", "отлично", "лучше" и "потрясающе».

Облако негативных слов было заполнено в основном негативными словами, такими как «проблема» и «вопрос».

Наконец, мы можем изучить распределение отзывов с настроением по набору данных:

df['sentiment'] = df['sentiment_val'].replace({0 : 'negative'})
df['sentiment'] = df['sentiment'].replace({1 : 'positive'})
fig = px.histogram(df, x="sentiment")
fig.update_traces(marker_color="indianred",marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5)
fig.update_layout(title_text='Product Sentiment')
fig.show()

Основываясь на приведенном выше наблюдении, можно сделать вывод, что большая часть клиентов в целом удовлетворена iPhone от Apple.

Шаг 5: Построение модели

Теперь можно построить модель анализа настроений. Его цель состоит в том, чтобы классифицировать отзывы как положительные или отрицательные на основе полученных данных. Для этого будет обучена простая модель логистической регрессии.

Чтобы делать прогнозы с использованием данных review_text, первым делом необходимо удалить из данных все знаки препинания.

def remove_punctuation(review_text):
    final = "".join(u for u in review_text if u not in ("?", ".", ";", ":", 
 "!",'"'))
    return final

df['review_text'] = df['review_text'].apply(remove_punctuation)
#df = df.dropna(subset=['review_title'])
df['review_title'] = df['review_title'].apply(remove_punctuation)

Чтобы разделить фрейм данных, создайте новый фрейм данных только с двумя столбцами — «review_title» и «sentiment_val». должна быть создана целевая переменная.

dfNew = df[['review_title','sentiment_val']]
dfNew.head()

Теперь мы разделим фрейм данных на обучающие и тестовые наборы. 80% данных будут использоваться для обучения, а 20% — для тестирования.

# random split train and test data
index = df.index
df['random_number'] = np.random.randn(len(index))
train = df[df['random_number'] <= 0.8]
test = df[df['random_number'] > 0.8]

Создайте набор слов

Далее мы будем использовать векторизатор подсчета из библиотеки Scikit-learn.

Чтобы позволить алгоритму логистической регрессии понять текст, мы должны преобразовать текст в нашем фрейме данных в модель набора слов, которая создает разреженную матрицу целых чисел. Эта модель подсчитывает количество вхождений каждого слова и печатает его.

# count vectorizer:
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(token_pattern=r'\b\w+\b')
train_matrix = vectorizer.fit_transform(train['review_title'])
test_matrix = vectorizer.transform(test['review_title'])

Импорт логистической регрессии

# Logistic Regression
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()

Разделить целевые и независимые переменные

#Split target and independent variables
X_train = train_matrix
X_test = test_matrix
y_train = train['sentiment_val']
y_test = test['sentiment_val']

Подгонка модели к данным и создание прогнозов

#Fit model on data
lr.fit(X_train,y_train)

#Make predictions
predictions = lr.predict(X_test)

Мы успешно сгенерировали прогнозы с использованием модели.

Шаг 6: Тестирование

Теперь мы можем проверить точность нашей модели!

# find accuracy, precision, recall:
from sklearn.metrics import confusion_matrix,classification_report
new = np.asarray(y_test)
confusion_matrix(predictions,y_test)
print(classification_report(predictions,y_test))

Отчет о классификации:

Точность тестовых данных модели составляет примерно 94%, что весьма впечатляет, учитывая, что не производилось выделение признаков или обширная предварительная обработка.

Спасибо, что нашли время, чтобы прочитать этот учебник. Я надеюсь, что вы нашли это полезным. Блокнот доступен на моей странице GitHub, и вы можете связаться со мной в LinkedIn. Я приветствую любой вклад или вопросы в разделе комментариев.