Поиск корреляции между несколькими переменными и целевым значением

#python #pandas #numpy #correlation

#python #pandas #numpy #корреляция

Вопрос:

У меня есть массив слов, взятых из обзора отеля. Например

 array(['advantage', 'advice', 'anniversary', 'arrived', 'aveda', 'bangs',
       'bath', 'bed', 'check', 'clean', 'closing', 'comfortable', 'deal',
       'did', 'disappointed', 'distance', 'doors', 'easy', 'evening',
       'existent', 'expensive', 'experience', 'goldfish', 'good', 'got',
       'great', 'hallway', 'having', 'hear', 'heard', 'high', 'hotel',
       'just', 'late', 'like', 'little', 'location', 'longer', 'loud',
       'maybe', 'morning', 'music', 'neck', 'neighbors', 'nice', 'night',
       'noisy', 'non', 'not', 'opening', 'overall', 'parking', 'pay',
       'people', 'pillows', 'previous', 'products', 'quick', 'reviews',
       'room', 'shopping', 'size', 'soundproof', 'stay', 'staying',
       'stiff', 'taken', 'talking', 'took', 'touch', 'valet', 'view',
       'walking', 'woke'], dtype='<U12')
  

Тогда у меня есть рейтинг, который отель получил за этот обзор
, например, в этом случае отель получил 4 звезды.

У меня то же самое примерно для 20 тыс. отзывов.

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

Например, можно предположить, что обзоры, содержащие такие слова, как «Чистый», «отличный», «понравился», «рекомендую», получат более высокий рейтинг, чем обзоры с «грязными», «нелюбимыми», «маленькими», «разочаровывающими»

Я попытался подойти к этому с помощью pandas corr и corrwith функций, а также использовать NumPy для вычисления корреляции, но я не смог заставить его работать и получить хороший результат.

Комментарии:

1. что именно нужно? какой результат?

2. Ну, в идеале оценка для каждого слова, которая описывает, как они влияют на рейтинг. Например, «грязный» может получить -0.6, что означает, что он сильно снижает рейтинг. (Нормализовано до -1-1, конечно)

Ответ №1:

Я не эксперт pandas, но я мог бы предложить возможный подход. Вы могли бы создать dict, где ключ — это слово, а значение — список звезд отеля, с которым связано это слово. Давайте предположим, что ваши данные представляют собой список dicts, которые представляют отели и имеют по крайней мере следующие ключи: оценка, слова. Где score — это оценка отеля, words — ваши данные words

 from collections import defaultdict
word_rates = defaultdict(list())
for hotel in hotels:
    for word in hotel['words']:
        word_rates.append(hotel['score'])
  

Теперь у вас есть оценки за слово, например:

 {
    'bad': [1, 2, 1, 2, 2, 3, 2],
    'great': [4, 5, 5, 4, 4, 5, 4],
    ...
}
  

Вам решать, как это интерпретировать, но подсчет хороших / плохих результатов должен дать вам приблизительную оценку.

Комментарии:

1. Я собираюсь отметить это как «правильный» ответ, поскольку это тот, с которым я закончил. При этом, если бы я мог, я бы отметил это, а также правильный ответ от @agcala.

Ответ №2:

Вам нужно придумать код, который присвоил бы каждому слову ранг от хорошего до плохого, начиная с хорошего прилагательного с более низким рангом до плохих с более высоким рангом. Я бы начал с их сортировки, а затем дал им числовой код, который отражал бы, насколько хорошо / плохо слово. Обратите внимание, что не всем словам нужно указывать код. В этом случае 0 будет в порядке.

Я бы начал с чего-то вроде

 words.sort()
word_coded=dict([[x,0] for x in words])
  

даст вам словарь

 {'advantage': 0,
 'advice': 0,
 ......
 'bed': 0,
 'check': 0,
 'clean': 0,
 ...
 'comfortable': 0,
 'deal': 0,
 'did': 0,
 ...
 'disappointed': 0,
  

Со словарем было бы проще работать, чем со списком. Тогда я бы сказал, например

  words_coded['advantage']=10
 ........
 words_coded['disappointed']=120
  

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

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

Ответ №3:

corr и corrwith предназначены для числовых столбцов. Для вашей цели взгляните на:

Фортманн, Борис. (2015). Re: Могу ли я использовать коэффициент корреляции Пирсона, чтобы узнать связь между восприятием и полом, возрастом, доходом?. Извлечено из:

https://www.researchgate.net/post/Can_I_use_Pearsons_correlation_coefficient_to_know_the_relation_between_perception_and_gender_age_income/567f17ed61432567d88b45e8/citation/download.

Комментарии:

1. Коэффициент корреляции Пирсона предполагает нормальное распределение переменных. Я не думаю, что это верно в данном случае.