Анализ отзывов клиентов имеет решающее значение для доходов и прибыльности компании, поскольку отзывы клиентов могут сильно повлиять на бизнес. Изучая отзывы клиентов, компании могут определить области, требующие улучшения в их брендинге, продуктах и услугах. Это помогает принимать обоснованные решения, которые приводят к снижению скорости оттока. Важным инструментом бизнес-аналитики, который можно использовать, является АНАЛИЗ ОТНОШЕНИЙ, также называемый анализом мнений.
Анализ настроений относится к процессу выявления и категоризации мнений, выраженных в данном тексте, с целью определения того, является ли позиция клиента положительной, отрицательной или нейтральной.
Тематическое исследование
Цель этого анализа — оценить общую удовлетворенность клиентов 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. Я приветствую любой вклад или вопросы в разделе комментариев.