此时,我们可以生成第一个有意义的可视化。
fig, ax=plt.subplots(figsize= (14,4)) ax.bar(to_1D(fruits["favorite_fruits"]).value_counts().index, to_1D(fruits["favorite_fruits"]).value_counts().values) ax.set_ylabel("Frequency", size=12) ax.set_title("Children's Favorite Fruits", size=14)
图4 -显示所有水果的频率的条形图。
问题3:针对有唯一值的单独列
如果您对我们之前得到的结果感到满意,就到此为止吧。但是,您的研究目标可能需要更深层次的分析。也许您希望将所有列表元素相互关联以计算相似度得分。比如吃香蕉的孩子也喜欢芒果吗?或者你想知道哪些水果是大多数孩子最喜欢的水果。这些问题只能通过更深层次的分析才能得到答案。
为此,我将介绍两种有用的方法。它们的复杂性不同。
方法一
这是我偶然发现的一个非常简单快速的方法。而且它非常有用!您只需要一行代码。
fruits_expanded_v1=fruits["favorite_fruits"].apply(pd.Series)
图5 -使用方法1的水果列表的扩展版本
正如您所看到的,这单独生成了一个dataframe
,每个列表都分为单个元素。有了这个方法,您将总是得到一个具有一个(n,len(lonsig_list))
的dataframe
。在这种情况下,10个孩子中有两个叫了5个最喜欢的水果,结果是一个10x5
的dataframe
。
通过这个,我们就可以知道哪些水果是人们最喜欢的水果。
fruits_expanded_v1.iloc[:,0].value_counts(normalize=True)##OUTPUT##banana0.222222pear0.111111watermelon0.111111blueberry0.111111strawberry0.111111apple0.111111peach0.111111mango0.111111
我们可以看到香蕉是孩子们最喜欢的水果。
或者,我们可以以单个水果为目标,找出它们在列表的每个位置被命名的次数。这是我写的函数:
defget_rankings(item, df): #Emptydictforresultsitem_count_dict= {} #Foreverytagindfforiinrange(df.shape[1]): #Calculate%ofcasesthattaggedtheitemval_counts=df.iloc[:,i].value_counts(normalize=True) ifiteminval_counts.index: item_counts=val_counts[item] else: item_counts=0#Addscoretodictitem_count_dict["tag_{}".format(i)] =item_countsreturnitem_count_dict
如果我们应用它,我们得到:
get_rankings(item="apple", df=fruits_expanded_v1)##OUTPUT##{'tag_0': 0.1111111111111111, 'tag_1': 0.1111111111111111, 'tag_2': 0.2222222222222222, 'tag_3': 0.2, 'tag_4': 0}
正如您所看到的,我们可以用这种方法进行大量的基于rpc的分析。然而,这种方法几乎没有其他用处。因为列不代表一个标记,而是一个级别,大多数在标签上的操作不能正确地完成。例如,计算香蕉和桃子之间的相关性是不可能的,我们从方法1得到了dataframe
。如果这是你的研究目标,使用下一种方法。
方法二
这种方法更加复杂,需要更多的空间。其思想是,我们创建一个dataframe
,其中的行与以前相同,但每个水果都被分配了自己的列。如果只有孩子#2命名为banana,那么banana列在第2行将具有“True”值,而在其他地方将具有“False”值(参见图6)。我写了一个函数来执行这个操作。它依赖于循环,这意味着它将花费大量时间处理大型数据集。然而,在我所尝试的所有方法中,这是最有效的方法。
defboolean_df(item_lists, unique_items):#Createemptydictbool_dict= {} #Loopthroughallthetagsfori, iteminenumerate(unique_items): #Applybooleanmaskbool_dict[item] =item_lists.apply(lambdax: iteminx) #Returntheresultsasadataframereturnpd.DataFrame(bool_dict)
如果我们现在应用这个函数
fruits_bool=boolean_df(fruits[“favorite_fruits”], unique_items.keys())
我们得到这个表格:
图6 - 布尔表格。
从这里,我们可以很容易地计算相关性。请注意,“相关性”并不是真正正确的术语,因为我们使用的不是度量或序数数据,而是二进制数据。
同样,有多种方法来关联这些水果。一个直接的方法是皮尔逊相关系数,它也可以用于二进制数据。Pandas对此有一个内置函数。
fruits_corr=fruits_bool.corr(method="pearson")
图7 -皮尔逊相关数据图
另一种方法是简单地数一种水果和其他水果一起被命名的次数。这可以用矩阵乘法来解决。为此,我们需要将布尔型1转换为整数。
fruits_int=fruits_bool.astype(int)
然后,我们可以计算频率。
fruits_freq_mat=np.dot(fruits_int.T, fruits_int) ##OUTPUT##array([[5, 3, 3, 2, 2, 1, 1, 1, 0, 2, 0, 1], [3, 4, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1], [3, 2, 4, 3, 1, 2, 0, 0, 0, 1, 0, 0], [2, 1, 3, 4, 2, 2, 0, 0, 0, 1, 0, 0], [2, 1, 1, 2, 3, 1, 0, 0, 0, 1, 0, 0], [1, 1, 2, 2, 1, 3, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 2, 1, 1, 0, 1, 1], [1, 2, 0, 0, 0, 0, 1, 2, 1, 0, 1, 1], [0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 0], [2, 0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0], [0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, 0], [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1]])
现在我们需要做的就是添加标签并将其转换为dataframe
。
fruits_freq=pd.DataFrame(fruits_freq_mat, columns=unique_items.keys(), index=unique_items.keys())
图8 -频率数据表。
如果你正在寻找一个漂亮的可视化方式,你可以创建一个seaborn库热图。
importseabornassnfig, ax=plt.subplots(figsize= (9,5)) sn.heatmap(fruits_freq, cmap="Blues") plt.xticks(rotation=50) plt.savefig("heatmap.png", dpi=300)
图9 -热图。
利用皮尔逊矩阵,我们可以很容易地建立一个水果推荐系统。例如,如果你输入你喜欢香蕉,它会推荐你吃西番莲,因为这两者的相关性最高(0.67)。您会对这种简单的方法的强大程度感到惊讶。我已经成功地用过很多次了。如果您想对频率 dataframe
做类似的事情,您需要首先对数据进行规范化。然而,这是另一篇文章的主题。
我希望这个指南对你有用,可以节省您的时间。谢谢大家的阅读!