注:本文节选自清华大学出版社出版的《ChatGPT数据分析实践》,略有改动,以纸质书出版为准。
在数据的海洋中,信息是隐藏的宝藏,而数据采集则是寻找这些宝藏的第一步。但在这个广阔的数据领域中,如何有效、准确地进行数据采集?如何确保所采集的数据能够为后续的分析和决策提供有价值的洞见?在本文章中,我们将深入探讨这些问题。我们将带带领大家学习如何使用ChatGPT进行数据采集,包括使用ChatGPT实现网络爬虫和设计调研问卷两部分内容。
ChatGPT爬虫实战分析
我们可以发现由于A公司需要的是其他平台相关品类的数据,而我们自然无法在其他平台进行埋点获取数据,因此想要获取其他平台的相关数据,我们优先考虑在合法合规的前提下使用网络爬虫进行爬取。
在向ChatGPT正式提问前我们要先理清我们的需求和标准:
(1)最重要也最基本的,代码要能够运行并且输出该页面的商品信息,该页面如图1所示。
图1某商场网站页面
(2)爬取的结果应当为中文,不可出现乱码等影响阅读的内容;
(3)仅有爬取得到的原始数据是无法得出结论的,我们需要ChatGPT在原始数据的基础上进一步进行加工。
基于这些考虑,我们的提示词应当包括这些内容:
(1)考虑到电商平台网页基本上都是动态页面,为了顺利完成数据抓取,我们应当提醒ChatGPT使用selenium框架实现爬虫;
(2)我们要在提示中指出我们具体需要的数据字段;
(3)我们需要在提示词中直接说明需要后续的分析操作,在本案例中,我们将首页商品的名称物尽其用,对其进行分词拆解、频率统计最终得到可视化结果。
在后续的文本分析的章节中我们对“分词”还会做更详细的阐述,这里简单介绍一下。在中文分词中,主要目标是将一段连续的汉字文本划分为有意义的词语。例如,在句子“我爱中国”中,分词的结果便是[“我”,“爱”,“中国”]。
让我们先向ChatGPT提问。
User:假设你是一位数据科学家,请你执行以下步骤,每执行完一步先输出结果,每一步生成的代码都需要清洗的中文注释,等我确认后再进行下一步:1.在url:https://list.xx.com/list.html?cat=1316,1387,1425使用selenium框架爬取该页面所有口红的名称、品牌、评论数量,将爬取的结果存在csv文件中;2.根据爬取的数据中的名称,将其名称进行分词,拆分成一个个元素,并统计各个元素的频次;3.根据各个元素的出现频次,取出现频次排名前20的元素,绘制条形图进行展示
针对第一个任务,ChatGPT生成的代码如下。
ChatGPT:import pandas as pdfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport time
URL = 'https://list.xx.com/list.html?cat=1316,1387,1425'
# 使用Selenium启动一个浏览器实例(这里使用的是Chrome,你可能需要下载相应的驱动)driver = webdriver.Chrome()driver.get(URL)
# 等待页面加载wait = WebDriverWait(driver, 10)wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'gl-item')))
# 提取数据items = driver.find_elements(By.CLASS_NAME, 'gl-item')data = []for item in items: name = item.find_element(By.CLASS_NAME, 'p-name').text try: brand = item.find_element(By.CLASS_NAME, 'p-shop').text except: brand = '' sales = item.find_element(By.CLASS_NAME, 'p-commit').text try: comments = item.find_element(By.CLASS_NAME, 'p-icons').text
except: comments = '' data.append([name, brand, sales, comments])
# 关闭浏览器实例driver.quit()
# 将数据转换为 DataFramedf = pd.DataFrame(data, columns=['Name', 'Brand', 'Sales', 'Comments'])
# 保存到 CSV 文件df.to_csv('lipsticks_data.csv', index=False, encoding=’UTF-8’)
我们将上述代码在Jupyter Notebook中进行运行,没有发生报错,但是打开文件后,却出现了乱码如图2所示。
图2 乱码示意图
这显然不符合我们的要求,为了定位问题点,我们先判断ChatGPT给出的代码是否有正确爬取数据,我们可以在Jupyter Notebook中直接输出爬取结果(在ChatGPT给出的代码中,爬取结果均存在data这个变量中,因此我们想要查看变量内容,只需直接在Jupyter Notebook中键入data即可),部分爬取结果如图3所示。
图3 部分爬取结果展示
可以看到,ChatGPT给出的代码是可以正确爬取数据的,那么我们将目光放到输出CSV文件这一步,要求ChatGPT做出修正。
User:虽然爬取结果正确,但是输出的CSV文件中汉字均为乱码,请检查如下代码是否正确:df = pd.DataFrame(data, columns=['Name', 'Brand', 'Sales', 'Comments'])df.to_csv('lipsticks_data.csv', index=False, encoding= ‘UTF-8’)
在指出了问题后,ChatGPT迅速判读是保存CSV文件时的编码有误,并给出了修改方案。
ChatGPT:df.to_csv('lipsticks_data.csv', index=False, encoding='GBK')
这次输出的CSV文件不再是乱码如图4所示。
图4消除乱码后的爬取结果展示
至此第一步算是完成了,我们回复ChatGPT继续后续步骤,于是ChatGPT生成了分词和词频统计代码如下。
ChatGPT:import jiebawords = []for name in df["Name"]: words.extend(jieba.lcut(name))
# 统计词频word_counts = pd.Series(words).value_counts()
print(word_counts)
运行该代码,我们会发现排在前列的都是各种符号和一些没有实际意义的助词,前三名分别是“.”、“【”和“】”,因此我们需要进一步告诉ChatGPT标点符号和分词结果中的噪声(也被称为“停用词”)等需要剔除,我们可以对ChatGPT追加提示。
User:在分词处理的过程中请注意不要将停用词和符号纳入统计。
ChatGPT生成的去除停用词和符号后的代码如下:
ChatGPT:from collections import Counterimport restopwords = set(['的', '和', '是', '了', '在', '有', '与', '等', '及', '或', '之', '也', '及其', '和', '与其', '或者'])words = []for item in data: name = item[0] word_list = jieba.cut(name) for word in word_list: if word not in stopwords and not re.match(r'\W+', word): words.append(word)
# 统计词频word_count = Counter(words)word_count.most_common()
现在我们再看输出的结果前几名:七夕、口红、礼盒、限定、情人节,比我们之前未去除符号和停用词的结果更加可用。
到这里第二步也完成了,我们回复ChatGPT继续后续步骤,这里我们让ChatGPT生成条形图即可,更复杂和更精致的可视化我们将在后续章节重点讲述。
代码如下:
ChatGPT:
import matplotlib.pyplot as plt
# 获取词频前20的结果top_20_words = word_count.most_common(20)words, counts = zip(*top_20_words)
# 绘制条形图plt.figure(figsize=(12, 8))plt.barh(words, counts, color='skyblue')plt.xlabel('Count')plt.ylabel('Words')plt.title('Top 20 Words in Lipstick Names')plt.gca().invert_yaxis()plt.show()
运行后,我们会得到条形图如图5所示。
图5词频排名前20的关键词可视化
虽然生成的图表已经可以满足我们的需求了,但是该图表显得较为模糊,纵轴部分汉字已经有些看不清了,假设我们不知道如何才能让图像更清晰,我们可以提出优化要求:
User:请列出可以让生成的图片更加清晰的办法和具体代码。
ChatGPT给出的解决方案如下。
ChatGPT为了使生成的图像更加清晰,你可以采取以下方法:1.增加图像尺寸:通过调整 figsize 参数,你可以增加图像的尺寸,从而使其更加清晰。2.增加分辨率:使用 dpi 参数可以增加图像的分辨率。3.使用更清晰的字体:通过调整字体大小和样式,可以使图像上的文字更加清晰。4.保存为矢量图格式:保存为 SVG 或 PDF 格式可以保持图像的清晰度,无论放大到什么程度。
这里我们选择使用dpi 参数可以增加图像的分辨率,我们按照它的回将原代码中的plt.figure(figsize=(12, 8))改写为plt.figure(figsize=(12, 8), dpi=150),提高图片分辨率,运行结果如图6所示。
图6 改进后的词频排名前20的关键词可视化
如此一来,我们得到了清晰的条形图。从图形结果中,我们能直观地得出一些对于设计新口红有用的结论:
(1)节日与特殊日子:关键词如“七夕”、“情人节”表明节日限定或特殊日子限定的口红很受欢迎。设计一款与特定节日或季节相关的口红,如“圣诞限定”或“春日特色”,有助于吸引消费者的注意;
(2)仪式感:关键词如“礼盒”、“礼物”、“送”、“礼袋”、“生日礼物”表明口红常常作为礼物赠送,因此要注重新产品的仪式感,可以考虑设计精美的包装,或者推出礼盒装,增加口红的赠送价值;
(3)口红特性:关键词如“哑光”、“满赠”、“高订”、“夜光”、“烈艳”、“蓝金”等表明消费者对口红的特性和效果很感兴趣。可以考虑研发具有独特效果或特性的口红,如“超持久”、“不沾杯”等;
(4)与消费者的互动:关键词如“会员”、“专享”、“加入”、“尊享”等表明品牌与消费者的互动和特权也是吸引消费者的方式。可以考虑针对新产品推出会员制度,为会员提供专属优惠或礼物。
ChatGPT调查问卷设计实战
爬虫固然可以帮助我们采集到许多数据为我们带来客观中立的事实判断,但是问卷调查可以针对特定的目标人群或问题进行设计,并且可以捕捉到受访者的情感、态度和意图,这些是网络爬虫难以取代的。因此A公司的数据部门决定要通过ChatGPT设计一份调查消费者对于口红偏好的问卷。
首先要先定下我们预期生成的问卷的标准:
(1)问卷的问题需要清晰明确,不能有歧义、不能有导向性,比如像“您也认为这款口红的颜色亮度过高吗?”,这就带有导向性,在刻意引导受访者回答“是的,亮度过高”;
(2)问卷需要分部分进行题目设置,避免题目全部混在一起分不清主题;
(3)问卷的题目数量设置不宜过多,否则容易导致受访者产生厌恶心理;也不宜过短,否则无法获取足够信息,控制问卷在15~25题之间。
基于这些预期,我们给到ChatGPT的提示词应当包括:
(1)说明公司背景并赋予ChatGPT扮演角色;
(2)详细说明问卷的内容和目的;
(3)详细说明问卷具体分为哪几个部分,每部分各需要多少题目以及题目的类型。
下面让我们向ChatGPT提问吧。
User:A公司是一家初创的高端美妆平台,假设你是A公司的一位资深数据分析师,要创建一个有关口红的市场调查问卷,用于设计新产品,了解消费者对口红的喜好,据此设计一份问卷。注意:问卷中要包括受访者基本信息、受访者口红购买偏好、受访者对A公司过往口红满意度这几个部分,第一部分出3道题,均为单选;第二部分5-10题,均为量表题;第三部分5题,单选、多选和量表均可。请完整的输出问卷的内容。
ChatGPT生成的问卷如下所示。
ChatGPT: 以下是我为您设计的问卷内容:A公司口红市场调查问卷一. 受访者基本信息 (单选题)1.您的性别是?男女不愿透露2.您的年龄范围是?18岁以下18-25岁26-35岁36-45岁46岁以上3.您的月均个人消费水平是?2000元以下2000-5000元5001-10000元10001-20000元20000元以上二.受访者口红购买偏好 (量表题)4.您多久购买一次口红?1 (每周)2345 (每年)5.您更偏好哪种口红质地?1 (完全偏好哑光)2345 (完全偏好滋润)6.您在选择口红时更看重哪一点?1 (完全看重颜色)2345 (完全看重品牌)7.您愿意为一支高端口红支付的价格是?1 (200元以下)2345 (1000元以上)8.您更喜欢哪种口红包装设计?1 (完全偏好简约)2345 (完全偏好奢华)9.您对口红的持久度的要求是?1 (不需要持久)2345 (非常需要持久)10.您对口红的滋润度的要求是?1 (不需要滋润)2345 (非常需要滋润)三. 受访者对A公司过往口红满意度11.您是否了解A公司?是否12.如果您购买过A公司的产品,您对A公司的口红满意度如何?1 (非常不满意)2345 (非常满意)13.您最喜欢A公司哪个系列的口红? (多选)系列A系列B系列C系列D其他14.您认为A公司的口红在哪方面需要改进? (多选)颜色选择持久度滋润度包装设计价格其他15.如果A公司推出新口红,您愿意尝试吗?一定会尝试可能会尝试不太可能尝试一定不会尝试16.针对A公司目前的口红,您有哪些建议?请写下来。(简答)
可以看到,ChatGPT设计了一份有3个部分16道题目的问卷,长度基本适宜,没有过长或过短的问题,且问卷兼具了单选、多选、简答和量表题,题型丰富;同时问题语句意思明确清晰,不存在模糊、歧义的地方。
A公司数据部门一致同意了采用该问卷,经过一周的问卷发放,共计收回1200份有效问卷,问卷结果如下。
一. 受访者基本信息1.您的性别是?男: 5%女: 92%其他: 2%不愿透露: 1% 2.您的年龄范围是?18岁以下: 8%18-25岁: 45%26-35岁: 35%36-45岁: 10%46岁以上: 2% 3.您的月均个人消费水平是?2000元以下: 10%2000-5000元: 40%5001-10000元: 35%10001-20000元: 10%20000元以上: 5% 二. 受访者口红购买偏好4.您多久购买一次口红?每周: 5%每月: 45%每季度: 30%每半年: 15%每年: 5% 5.您更偏好哪种口红质地?哑光: 40%滋润: 60% 6.您在选择口红时更看重哪一点?颜色: 60%品牌: 40% 7.您愿意为一支高端口红支付的价格是?200元以下: 15%200-500元: 50%500-800元: 25%800-1000元: 7%1000元以上: 3% 8.您更喜欢哪种口红包装设计?简约: 45%奢华: 55% 9.您对口红的持久度的要求是?不需要持久: 10%较不需要持久: 15%中等: 35%较需要持久: 25%非常需要持久: 15% 10.您对口红的滋润度的要求是?不需要滋润: 5%较不需要滋润: 10%中等: 30%较需要滋润: 40%非常需要滋润: 15% 三.受访者对A公司过往口红满意度11.您是否了解A公司?是: 60%否: 40% 12.如果您购买过A公司的产品,您对A公司的口红满意度如何?非常不满意: 5%不满意: 10%中等: 40%满意: 35%非常满意: 10% 13.您最喜欢A公司哪个系列的口红?系列a: 40%系列b: 30%系列c: 20%系列d: 5%其他: 5% 14.您认为A公司的口红在哪方面需要改进?颜色选择: 50%持久度: 40%滋润度: 30%包装设计: 20%价格: 10%其他: 5% 15.如果A公司推出新口红,您愿意尝试吗?一定会尝试: 35%可能会尝试: 45%不太可能尝试: 15%一定不会尝试: 5%
根据问卷调查结果,数据部门反馈的新产品设计方向要点包括。
(1)目标人群:应定位为18-35岁的女性,其中18-25岁的年轻女性占比最高。这意味着我们的产品设计和市场策略应更加年轻化,同时考虑到26-35岁的成熟女性的需求;
(2)消费意愿:大部分受访者愿意为高端口红支付200-500元,这应成为我们的主要定价区间。在这个消费范围内,确保产品既有高端感,又不超出大部分消费者的接受范围;
(3)消费频率:大多数消费者每季度购买一次口红,这意味着我们后续可以考虑推出季度限定色或新品来吸引消费者;
(4)质地偏好:滋润型口红的需求略高于哑光口红,但两者都有较大的市场。建议我们在新产品线中均衡这两种质地。
(5)品牌知名度:60%的受访者了解A公司,这是一个很好的开始,但也意味着我们还有很大的市场推广空间。
(6)改进方向:对于消费者希望A公司改进的方面,颜色选择和持久度是消费者最关心的两点。建议我们在新产品设计中增加颜色选择,并加强产品的持久度。
注:本文节选自清华大学出版社出版的《ChatGPT数据分析实践》,略有改动,以纸质书出版为准。