Раскрытие возможностей ChatGPT: глубокое погружение в исследовательский анализ данных и будущие возможности

ChatGPT — это необычный инструмент для более эффективной работы, и это не ограничивается анализом данных. В этой статье мы рассмотрим пример исследовательского анализа данных (EDA), выполняемого ChatGPT. Мы рассмотрим различные этапы EDA, увидим некоторые впечатляющие результаты (Wordclouds!) и отметим, где ChatGPT работает хорошо (и не очень). Наконец, мы коснемся будущего LLM в аналитике и того, насколько мы рады этому.

Набор данных, используемый для анализа, представляет собой образец из Common Crawl, который бесплатно доступен и может быть проанализирован кем угодно. Набор данных Common Crawl представляет собой обширную коллекцию данных веб-сканирования, включающую миллиарды веб-страниц из Интернета. Набор данных включает различные типы веб-контента и регулярно обновляется. Он служит важным ресурсом для обучения языковых моделей, таких как LLM, и составляет 60% обучающих данных для ChatGPT. Образец набора данных, созданный автором и размещенный на Kaggle, можно найти здесь.

На протяжении всего поста контент будет обрезан, поэтому не стесняйтесь следовать прямо в Google Colab, который использовался для проведения этого анализа.

Мы разбили анализ на пять разделов:

  • 🤔 Общая структура
  • 🧹 Очистка данных
  • 💯 Базовый анализ
  • 🇷🇺 Подходы НЛП
  • 🔑 Ключевые выводы

Со всем этим давайте перейдем к анализу!

Структурирование работы

Прежде чем приступить к аналитической работе, хорошо бы сформулировать план. EDA обычно следуют стандартной структуре для начала, прежде чем перейти к касательным, поскольку в анализе обнаруживаются интересные идеи. Одним из таких шаблонов является этот, в котором подробно описаны основные компоненты: данные предварительного просмотра, чистые данные, данные графика. Мы могли бы использовать это как отправную точку, но давайте предположим, что мы ничего не знаем, и посмотрим, что придумает ChatGPT.

Быстрый:

Let's run an EDA on the Common Crawl text dataset together. The dataset is a scrape of many web pages on the internet. The columns are 'text', 'WARC-Type', 'WARC-Target-URI', 'WARC-Date', 'WARC-Record-ID', 'WARC-Refers-To', 'WARC-Block-Digest', 'WARC-Identified-Content-Language', 'Content-Type', and 'Content-Length'. The dataset is saved in a csv file called common_crawl_text.

You should give me an overall plan, then we can go through step-by-step. In each step you should write some code and I will run it in the terminal then report back to you the results.

Ответ:

Sure, here's a high-level plan for the EDA on the Common Crawl text dataset:

  1. Load the dataset into a pandas DataFrame.
  2. Check for missing values in each column and handle them appropriately.
  3. Explore the distribution of the target variable 'WARC-Type'.
  4. Check the distribution of 'WARC-Identified-Content-Language'.
  5. Check the distribution of 'Content-Type'.
  6. Explore the 'text' column, including the distribution of text lengths and the most common words.
  7. Check for any correlations between the different columns.
  8. Summarize the findings and identify any interesting patterns or insights.

Let's start with step 1 and load the dataset into a pandas DataFrame.

ChatGPT проделал здесь довольно хорошую работу, охватив стандартные шаги. Обратите внимание, что он не хочет, чтобы мы глубоко анализировали все столбцы, но имеет подмножество, которое его особенно интересует. Это разумно, но я думаю, что в нем отсутствуют некоторые ценные точки данных. Например, стоит изучить «WARC-Target-URI», а столбец «WARC-Date» даст представление о том, когда были собраны данные.

Я подсказал об этом ChatGPT, и он с радостью включил их в план. В то же время, это добавило в создание Wordcloud то, что я имел в виду.

Мне нравится такое взаимодействие, когда оно похоже на партнерство, а не просто на чтение книги.

Очистка данных

С каждым из шагов, описанных в структуре, мы можем попросить ChatGPT расширить этот шаг и предоставить нам точный код для запуска. Для начала предлагает:

We can start by loading the Common Crawl text dataset and taking a look at its structure. Here's the code to load the dataset into a Pandas DataFrame:

import pandas as pd

df = pd.read_csv("common_crawl_text.csv")

Once you've loaded the dataset, you can check the structure of the DataFrame using the following code:

df.head()

This will show you the first five rows of the DataFrame. You can also use the [df.info](<http://df.info/>)() method to get an overview of the columns and their data types, as well as the number of non-null values in each column.

После предоставления ему результатов он может поделиться некоторой базовой информацией:

Based on the provided data, it seems like we have a dataset of web archive records with different attributes such as the type of the record, the URI (Uniform Resource Identifier) of the record, the date it was recorded, the length of the content, and the content itself. The content is in different languages and formats, such as plain text, and the length of the content varies. The dataset contains 37832 records, and some of them have null values in the content length column.

Мы можем пойти немного дальше и попросить дать подробное описание каждой колонки:

Быстрый:

Can you give a detailed list of the columns and the expected meaning?

Ответ:

Sure! Here's a detailed list of the columns in the DataFrame and their expected meaning:

  1. WARC-Type: The type of WARC record. A WARC (Web ARChive) record is a format for storing internet resources such as web pages and their associated metadata.
  2. WARC-Target-URI: The target URI (Uniform Resource Identifier) of the archived web page.
  3. WARC-Date: The date and time when the web page was archived.
  4. WARC-Record-ID: The unique identifier of the WARC record.
  5. WARC-Refers-To: The identifier of a related WARC record that this record refers to.
  6. WARC-Block-Digest: A cryptographic hash value computed over the contents of the WARC record.
  7. WARC-Identified-Content-Language: The language(s) identified in the content of the web page.
  8. Content-Type: The media type of the content, such as text/plain or text/html.
  9. Content-Length: The length of the content in bytes.
  10. text: The extracted text content of the web page.

Note that some of these columns are specific to the WARC format and may not be present in other types of data.

Он довольно хорошо угадал, что означают эти столбцы. Некоторые из них могут быть неправильными (например, Content-Length), но это полезная отправная точка. На самом деле он может знать эти конкретные имена благодаря своим обучающим данным, но я экспериментировал с произвольными именами столбцов, и обычно он может угадать, что будет содержать столбец, по комбинации имени и возвращаемых данных.

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

Быстрый:

Should we do something about the missing values?

Ответ:

Yes, it would be a good idea to handle the missing values in the Content-Length column. One option is to remove the rows that have missing values if they are not a significant portion of the data. Another option is to impute the missing values using some statistical method such as mean, median, or mode. However, the best approach would depend on the nature of the data and the analysis being performed.

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

Быстрый:

Let's just remove them as there are very few. How can I do that?

Ответ:

You can drop the rows containing missing values using the dropna() function in pandas. Here's an example:

import pandas as pd

# create a dataframe

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

# drop rows with missing values

df.dropna(inplace=True) print(df)

Output:

A B 0 1.0 5.0 3 4.0 8.0

In this example, the dropna() function removes the second row which contains missing values. The inplace=True argument modifies the original DataFrame, so the resulting DataFrame only contains rows without any missing values.

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

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

Базовый анализ

Шаги 3–5 примерно такие же, постройте несколько распределений данных и посмотрите, есть ли там что-нибудь интересное.

Когда будет предложено начать шаг 3:

Sure, let's explore the distribution of the target variable 'WARC-Type'. We can do this by creating a histogram or a bar chart of the variable to see the count or percentage of each value in the dataset. If you are using Python, you can use libraries like Matplotlib or Seaborn to create visualizations. Here is an example code snippet to create a bar chart using Matplotlib: python import matplotlib.pyplot as plt
# Count the number of occurrences of each value in the 'WARC-Type' column
value_counts = df['WARC-Type'].value_counts()
# Create a bar chart of the value counts
plt.bar(value_counts.index, value_counts.values)
# Set the title and axis labels
plt.title('Distribution of WARC-Type')
plt.xlabel('WARC-Type')
plt.ylabel('Count')
# Show the plot plt.show() This code will create a bar chart showing the count of each value in the 'WARC-Type' column. You can modify the code to show the percentage of each value instead of the count.

И это выводит график для нас. В данном случае это не очень интересно, так как на самом деле есть только один «WARC-Type», но это была хорошая идея. Проблема с изображениями заключается в том, что трудно передать результаты обратно в ChatGPT. Я обнаружил, что для решения этой проблемы лучше предложить ChatGPT возвращать таблицы данных, а также дополнительные графики, где это имеет смысл.

Узнав, что столбец имеет только одно значение, ChatGPT с радостью переходит к следующему этапу. При изучении «WARC-Content-Language» мы начинаем видеть нечто более сложное. Возвращаемые результаты:

eng 15903

rus 1551

...

hrv,nno,bel 1

zul,eng 1

Из которых он узнает:

It seems like there are 1187 unique values for the 'WARC-Identified-Content-Language' column, and the most common language is English ('eng') followed by Russian ('rus'), German ('deu'), and Chinese ('zho'). Since there are so many unique values, it might be difficult to analyze the distribution of the variable. One approach to simplifying the analysis could be to group languages into broader categories, such as "English", "Romance languages", "Slavic languages", etc. depending on the research question.

Это отличный момент в отношении группировки, но здесь что-то упущено — в каждой строке может быть несколько языков. Когда его об этом спрашивают (несколько раз), он предлагает хороший подход.

Here's an updated code that splits the rows with multiple languages and weighs them accordingly: import pandas as pd

# Split the rows with multiple languages
df['WARC-Identified-Content-Language'] = df['WARC-Identified-Content-Language'].str.split(',')

# Create a new DataFrame to store the split rows
df_split = pd.DataFrame({ 'WARC-Identified-Content-Language': [lang for langs in df['WARC-Identified-Content-Language'].tolist() for lang in langs], 'count': [1/len(langs) for langs in df['WARC-Identified-Content-Language'].tolist() for lang in langs] })

# Aggregate by language
df_agg = df_split.groupby('WARC-Identified-Content-Language')['count'].sum().reset_index()

# Plot the distribution of languages
plt.figure(figsize=(10,6))
sns.barplot(data=df_agg, x='WARC-Identified-Content-Language', y='count', order=df_agg.sort_values('count', ascending=False)['WARC-Identified-Content-Language'])
plt.title('Distribution of WARC-Identified-Content-Language') plt.xticks(rotation=90)
plt.show() 

This code splits the rows with multiple languages into separate rows, and weights them by the number of languages in each row. Then it aggregates the rows by language and plots the distribution of languages.

После объединения этого с некоторыми подсказками о группировке языков мы можем получить хороший сюжет:

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

Кажется, английский по-прежнему является доминирующим языком — насколько?

Быстрый:

It looks like it's mostly English language. Can you calculate what percentage of the agg data is english?

Ответ:

Sure, here's some code to calculate the percentage of the aggregated data that is English: english_percentage = (agg_data.loc['eng', 'weight'] / agg_data['weight'].sum()) * 100

print(f"The percentage of the aggregated data that is English is: {english_percentage:.2f}%")

This should output the percentage of the aggregated data that is English, rounded to 2 decimal places.

Обработка естественного языка

Теперь мы можем перейти к шагу 6, который включает в себя некоторое исследование текстового столбца. Это будет более сложная аналитика и потребует методов обработки естественного языка (NLP). Давайте посмотрим, как работает ChatGPT.

Быстрый:

Great. Let's move on to step 6:

"Explore the 'text' column, including the distribution of text lengths and the most common words."

Ответ:

Sure! To explore the 'text' column, we can start by calculating the length of each text and creating a histogram to visualize the distribution of text lengths. Here's the code to do that:

# Calculate the length of each text
df['text_length'] = df['text'].str.len()

# Create a histogram of text lengths
plt.hist(df['text_length'], bins=50)

This will create a histogram that shows the distribution of text lengths in the 'text' column. We can then look at the most common words in the 'text' column by first removing any HTML tags, punctuation, and stop words. Here's the code to do that: import re

import nltk from nltk.corpus
import stopwords

# Remove HTML tags from text
df['text'] = df['text'].apply(lambda x: re.sub('<.*?>', '', x))
# Remove punctuation from text
df['text'] = df['text'].str.replace('[^\\w\\s]','')
# Convert text to lowercase
df['text'] = df['text'].str.lower()
# Remove stop words from text
stop_words = set(stopwords.words('english'))
df['text'] = df['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in stop_words]))
# Tokenize text into individual words
df['text'] = df['text'].apply(nltk.word_tokenize)
# Flatten list of words into a single list
word_list = [word for sublist in df['text'] for word in sublist]

# Calculate frequency distribution of words
freq_dist = nltk.FreqDist(word_list)

# Print the 20 most common words
print(freq_dist.most_common(20)) 

This code will remove HTML tags and punctuation from the 'text' column, convert all text to lowercase, remove stop words, tokenize the text into individual words, and then calculate the frequency distribution of words. Finally, it will print the 20 most common words in the 'text' column.

Это дает:

[('nan', 36847), ('0', 3467), ('1', 2809), ('keresőoptimalizálás', 2498), ('idősgondozás', 1852), ('2', 1740), ('3', 1559), ('szerződés', 1529), ('eltartási', 1527), ('brands', 1442), ('5', 1362), ('4', 1350), ('usd', 1245), ('us', 1205), ('2023', 1204), ('new', 1178), ('sex', 1165), ('2022', 1031), ('home', 919), ('cookies', 904)]

Меня это не очень обрадовало, так как мы видим, что многие «лучшие слова» — это просто числа или стоп-слова из другого языка (использовались только английские). Я смог подтолкнуть его к этому, и это помогло очистить его, отфильтровав слова, которые не были буквенными токенами, и включив списки стоп-слов для других языков. Теперь давайте визуализируем их в Wordcloud.

Быстрый:

Can you make it a wordcloud?

Ответ:

Sure! To create a wordcloud from the top 50 most frequent words, you can use the WordCloud library in Python as follows: from wordcloud import WordCloud

import matplotlib.pyplot as plt

# Convert the top 50 most frequent words to a dictionary
freq_dict = dict(top_words)

# Generate the wordcloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate_from_frequencies(freq_dict)

# Display the wordcloud
plt.figure(figsize=(12, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
This code will generate a wordcloud with the top 50 most frequent words in the text column. You can adjust the parameters of the WordCloud function to customize the appearance of the wordcloud.

Не знаю, что вынести из этого сюжета. Кажется, что есть некоторые слова, которые могут быть связаны с полезным содержанием (например, «информация», «блог», «бренды»), но есть и много нежелательного содержания. Я поделился лучшими словами с ChatGPT и спросил, что он думает:

Быстрый:

What can we say about this?

Ответ:

Based on the top words found in the 'text' column, it appears that the data may contain a lot of spam or irrelevant information, as many of the top words are related to online dating, reviews, loans, and escorts. Additionally, the presence of words like 'nan' suggests that there may be missing or incomplete data in the 'text' column. It would be important to further investigate the nature and quality of the data in the 'text' column to determine how useful it is for any downstream analysis.

Это справедливый вывод, и действительно, компании, работающие с набором данных Common Crawl, заявили, что они вкладывают значительные ресурсы в очистку набора данных, чтобы сделать его пригодным для обучения моделей ИИ.

Подведение итогов

На этом план, изложенный ChatGPT, завершается, поэтому мы завершим здесь анализ и посмотрим, какие выводы он сделал.

Быстрый:

Great. Let's move on to step 8. Can you summarise the findings from all our analysis so far?

Ответ:

Sure, based on the analysis we have conducted so far, here are some key findings: Language distribution: The most common language in the dataset is English, followed by Russian, German, Chinese, and Spanish. Content-Type distribution: The majority of the content in the dataset is of the type "text/plain". Text length: The text length in the dataset ranges from 0 to 8,542,524, with an average length of 20,566. Common words: The most frequent words in the dataset are not particularly informative, as they include many stop words and other non-informative terms. Correlations: There is a strong positive correlation between the length of the text and the content length. There is also a weak positive correlation between the number of languages detected in a text and the content length.

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

Обсуждение

Как видите, подсказки, используемые повсюду, были относительно простыми. Учитывая это, впечатляет то, насколько хорошо ChatGPT смог понять, что я хотел сделать, и дать полезные ответы. Эти подсказки определенно можно было бы улучшить, предоставив больше контекста в каждой подсказке и более строго определяя, что мы хотим получить в ответ. Например, каждое приглашение может содержать ссылки на конкретную задачу, на которой оно сосредоточено, а также дополнительный текст, чтобы оно делало именно то, что нам нужно:

Don’t respond with superfluous text. Assume pandas, numpy and matplotlib have been imported in the standard way.

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

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

Хотя было весело ходить туда-сюда с ChatGPT, чтобы получить на него выходные данные, это быстро стало утомительным. ChatGPT намного мощнее, когда он может сам запускать код. ChatGPT может подключаться к среде выполнения Python, вместо этого работая с Python API. В этом случае код может запускаться автоматически, но чтобы исключить человека из цикла, нам понадобится еще один инструмент.

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

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

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

Заключение

В этой статье мы увидели, как можно использовать ChatGPT для поддержки проведения исследовательского анализа данных (EDA). Мы увидели, что можем получить удивительно хорошие результаты, работая с системой, с небольшой внешней помощью. Мы также отметили, что уже есть инструменты, которые позволяют нам расширить эту идею, такие как AutoGPT, который может стать еще более мощным помощником.

Как аналитик данных, я уже использую ChatGPT для помощи в аналитике некоторыми способами, описанными выше, хотя я редко использую его для сквозного анализа, как подробно описано в этой статье. По мере того, как с такими инструментами, как AutoGPT, создается больше интеграций, а трение при использовании уменьшается, я ожидаю, что буду использовать его все больше и больше, и очень рад этому (хотя я не устарел;)).