红酒数据分析-python

目的:研究红酒品质和理化性质的关系

import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

读取数据

df = pd.read_csv("D:\Study\AI_data\winequality-red.csv",sep=';')
df.head(5)#显示前五行数据
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
07.40.700.001.90.07611.034.00.99783.510.569.45
17.80.880.002.60.09825.067.00.99683.200.689.85
27.80.760.042.30.09215.054.00.99703.260.659.85
311.20.280.561.90.07517.060.00.99803.160.589.86
47.40.700.001.90.07611.034.00.99783.510.569.45
df.info()#数据表的基本信息
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1599 entries, 0 to 1598
Data columns (total 12 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   fixed acidity         1599 non-null   float64
 1   volatile acidity      1599 non-null   float64
 2   citric acid           1599 non-null   float64
 3   residual sugar        1599 non-null   float64
 4   chlorides             1599 non-null   float64
 5   free sulfur dioxide   1599 non-null   float64
 6   total sulfur dioxide  1599 non-null   float64
 7   density               1599 non-null   float64
 8   pH                    1599 non-null   float64
 9   sulphates             1599 non-null   float64
 10  alcohol               1599 non-null   float64
 11  quality               1599 non-null   int64  
dtypes: float64(11), int64(1)
memory usage: 150.0 KB
df.shape#维度查看,几行几列
(1599, 12)
df.describe() #查看常见统计量
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
count1599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.000000
mean8.3196370.5278210.2709762.5388060.08746715.87492246.4677920.9967473.3111130.65814910.4229835.636023
std1.7410960.1790600.1948011.4099280.04706510.46015732.8953240.0018870.1543860.1695071.0656680.807569
min4.6000000.1200000.0000000.9000000.0120001.0000006.0000000.9900702.7400000.3300008.4000003.000000
25%7.1000000.3900000.0900001.9000000.0700007.00000022.0000000.9956003.2100000.5500009.5000005.000000
50%7.9000000.5200000.2600002.2000000.07900014.00000038.0000000.9967503.3100000.62000010.2000006.000000
75%9.2000000.6400000.4200002.6000000.09000021.00000062.0000000.9978353.4000000.73000011.1000006.000000
max15.9000001.5800001.00000015.5000000.61100072.000000289.0000001.0036904.0100002.00000014.9000008.000000
plt.style.use('ggplot')
colnm = df. columns.tolist()#dataframe数据类型转换为list数据类型
fig = plt.figure(figsize = (12,6))

for i in range(12):
        plt.subplot(2,6,i+1) #将整个图像划分为两行六列共12个图像
        sns.boxplot(df[colnm[i]],orient = "v",width = 0.5,color='r')
        plt.ylabel(colnm[i],fontsize=12)
        
plt.tight_layout()#自动调整子图参数,使之填充整个图像区域。这是个实验特性,可能在一些情况下不工作。它仅检查坐标轴刻度、刻度标签以及标题部分
print('\nFigure 1: Univariate Boxplots(单变量箱线图)')
Figure 1: Univariate Boxplots(单变量箱线图)

在这里插入图片描述

箱线图的各线释义

箱子的上下底分别是上四分之位0.75和下四分之位0.25,箱体包含50%的数据,箱体中间的线指的是中位数。箱子高度在一定程度上反映了数据的波动程度

上边界和下边界之外的值可以理解为异常值

还有一些极端情况,箱子被压得很扁,甚至只剩下一条线,同时还存在着很多异常值。这些情况的出现,有两个常见的原因。第一,样本数据中,存在特别大或者特别小的异常值,这种离群的表现,导致箱子整体被压缩,反而凸显出来这些异常,第二,样本数据特别少,因此箱体受单个数据的影响被放大了。

colnm1 = df.columns.tolist()
plt.figure(figsize = (12,8))

for i in range(12):
    plt.subplot(4,3,i+1)#创建四行三列十二个图像
    df[colnm1[i]].hist(bins = 100 ,color ='b')#直方图df.hist()
    plt.xlabel(colnm1[i],fontsize=12)#横轴字段名
    plt.ylabel('Frequency')#纵轴频率

plt.tight_layout()
print('\nFigure 2:Univariate Histograms单变量直方图')
Figure 2:Univariate Histograms单变量直方图

在这里插入图片描述

品质评价范围是0-10,这个数据集中范围是3到8,有82%的红酒品质是5或6(690+650=1340)

这个数据集有7个酸度相关的特征:fixed acidity(非挥发性酸),volatile acidity(挥发性酸),citric acid(柠檬酸),free sulfur dioxide游离二氧化硫,total sulfur dioxide总二氧化硫,sulphates硫酸盐类,pH。

前6个特征都与红酒的pH相关。pH是对数的尺度,下面对前6个特征取对数然后作直方图。

另外,pH值主要是与fixed acidity有关,fixed acidity比volatile acidity和citric acid高1到2个数量级

acidityFeat =['fixed acidity','volatile acidity','citric acid','free sulfur dioxide','total sulfur dioxide','sulphates']

plt.figure(figsize=(12,4))

for i in range(len(acidityFeat)):
    ax = plt.subplot(2,3,i+1)#两行三列六副图
    v = np.log10(np.clip(df[acidityFeat[i]].values,a_min = 0.001,a_max = None))
    plt.hist(v,bins=50,color = 'g')
    plt.xlabel('log(' + acidityFeat[i]+')',fontsize = 12)
    
    plt.ylabel('Frequency')
    
plt.tight_layout()
print('\nFigure:3 acidity Features in log10 Scale')
Figure:3 acidity Features in log10 Scale

在这里插入图片描述

plt.figure(figsize=(12,6))

bins = 10**(np.linspace(-2,2))

plt.hist(df['fixed acidity'],bins = bins,edgecolor='k',label = 'Fixed acidity')
plt.hist(df['volatile acidity'],bins=bins,edgecolor='k',label='volatile acidity')
plt.hist(df['citric acid'],bins=bins,edgecolor='k',label='citric acid')
plt.xscale('log')
plt.xlabel('Acid Concentration(g/dm^3)')
plt.ylabel('Frequency')
plt.title('Histogram of Acid Concentration')
plt.legend()
plt.tight_layout()

print('Figure 4')
Figure 4 Histogram of Acid Concentration

在这里插入图片描述

df['total acid'] = df['fixed acidity']+df['volatile acidity']+df['citric acid']
plt.figure(figsize = (12,5))

plt.subplot(121)
plt.hist(df['total acid'],bins=50,color = 'm')
plt.xlabel('total acid')
plt.ylabel('Frequency')

plt.subplot(122)
plt.hist(np.log(df['total acid']),bins = 50,color='m')
plt.xlabel('log(total acid)')
plt.ylabel('Frequency')

plt.tight_layout()

print("Figure 5: Total Acid Histogram")
Figure 5: Total Acid Histogram

在这里插入图片描述

甜度(sweetness)

Residual sugar(剩余糖分) 与酒的甜度有关,通常用来区别各种红酒,干红(<= 4g/L),半干(4-12 g/L),半甜(12-45g/L)和甜(>45g/L)。这个数据中,主要为干红,没有甜葡萄酒。

print(df.columns.tolist())
['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates', 'alcohol', 'quality', 'total acid']
#residual sugar
df['sweetness'] = pd.cut(df['residual sugar'],bins = [0,4,12,45],labels = ['dry','medium dry','semi-sweet'])
plt.figure(figsize=(8,4))
df['sweetness'].value_counts().plot(kind='bar',color='y')

#value_counts()函数用于数据表的计数及排序。可用于查看指定列中有多少不同的数据值。
#图类型是柱状图bar

plt.xticks(rotation=0)#横轴分类字体倾斜程度

plt.xlabel('sweetness',fontsize=12)
plt.ylabel('Frequency',fontsize=12)

plt.tight_layout()

print('Figure 6:sweetness')
Figure 6:sweetness

在这里插入图片描述

双变量分析

红酒品质与理化性质分析
sns.set_style('ticks')
sns.set_context('notebook',font_scale=1.1)

colnm = df.columns.tolist()[:11] + ['total acid']
plt.figure(figsize=(10,8))

for i in range(12):
    plt.subplot(4,3,i+1)
    sns.boxplot(x='quality',y=colnm[i],data=df,color='g',width=0.6)
    plt.ylabel(colnm[i],fontsize=12)
    
plt.tight_layout()
print('\nFigure 7:Physicochemical Propertirs and Wine Quality by Boxplot')
Figure 7:Physicochemical Propertirs and Wine Quality by Boxplot

在这里插入图片描述

品质更好的酒有更高的柠檬酸,硫酸盐(sulphates)和酒精度数。硫酸盐(硫酸钙)的加入通常是调整酒的酸度的。其中酒精度数和品质的相关性最高。

品质好的酒有较低的挥发性酸类,密度和ph。

残留糖分,氯离子,二氧化硫似乎对酒的品质影响不大。

sns.set_style('dark')#主题设置为dark

plt.figure(figsize=(12,8))
colnm = df.columns.tolist()[:11] + ['total acid','quality']
mcorr = df[colnm].corr()
mask = np.zeros_like(mcorr,dtype=np.bool_)
mask[np.triu_indices_from(mask)] = True
cmap = sns.diverging_palette(220,10,as_cmap=True)
g = sns.heatmap(mcorr,mask=mask,cmap=cmap,square = True,annot=True,fmt='0.2f')
print('\nFigure 8:Pairwise Correlation Plot 两两相关图')
Figure 8:Pairwise Correlation Plot 两两相关图

在这里插入图片描述

密度和酒精浓度

密度和酒精浓度是相关的,物理上,两者并不是线性关系。Figure 8展示了两者的关系。另外密度还与酒中其他物质的含量有关,但是关系很小。

#style
sns.set_style('ticks')
sns.set_context("notebook",font_scale=1.4)
 
plt.figure(figsize=(6,4))
sns.regplot(x='density',y='alcohol',data = df,scatter_kws = {'s':10},color='g')
#sns.regplot()绘图数据和线性回归模型拟合。

plt.xlim(0.989,1.005)#x轴范围
plt.ylim(7,16)#y轴范围
print('Figure 9: Density vs Alchol')
Figure 9: Density vs Alchol

在这里插入图片描述

酸性物质含量和pH

pH和非挥发性酸性物质由-0.683的相关性。因为非挥发性酸性物质的含量远远高于其它酸性物质,总酸性物质(total acidity)这个特征并没有太多意义

otherFeat = ['fixed acidity','volatile acidity','total sulfur dioxide','sulphates','total acid']
plt.figure(figsize = (12,6))

for i in range(len(otherFeat)):
    plt.subplot(2,3,i+1)
    sns.regplot(x='pH',y=otherFeat[i],data = df, scatter_kws={'s':10},color='k')
plt.tight_layout()
print("Figure 10: pH vs acid")
Figure 10: pH vs acid

在这里插入图片描述

多变量分析

与品质相关性最高的三个特征是酒精浓度、挥发性酸度和柠檬酸。下面图中显示的酒精浓度,挥发性酸和品质的关系。

plt.style.use('ggplot')

sns.lmplot(x='alcohol',y='volatile acidity',hue='quality',
           data=df, fit_reg = False, scatter_kws={'s':10})#lmplot用于绘制回归图,fit_reg参数为Fasle时不显示拟合线

plt.title("Figure 11-1: Scatter Plots of Alcohol,Volatile Acid and Quality")
plt.show()

在这里插入图片描述

酒精浓度,挥发性酸和品质对于好酒(7,8)以及差酒(3,4),关系很明显。但是对于中等酒(5,6),酒精浓度的挥发性酸度有很大程度的交叉。

sns.lmplot(x='alcohol',y='volatile acidity',col='quality',hue='quality',
           data=df,fit_reg=False,
           aspect=0.9,col_wrap=3,scatter_kws={'s':20})
print("Figure 11-2: Scatter Plots of Alcohol,Volatile Acid and quality")
plt.show()
Figure 11-2: Scatter Plots of Alcohol,Volatile Acid and quality

在这里插入图片描述

pH,非挥发性酸,和柠檬酸

pH和非挥发性的酸以及柠檬酸有相关性。整体趋势也很合理,即浓度越高,pH越低。

#style
sns.set_style('ticks')
sns.set_context("notebook",font_scale=1.4)

plt.figure(figsize=(12,10))
cm = plt.cm.get_cmap('RdBu')
sc = plt.scatter(df['fixed acidity'],df['citric acid'],c=df['pH'],
               vmin=2.6,vmax=4,s=15,cmap=cm)
bar=plt.colorbar(sc)
bar.set_label('pH',rotation=0)
plt.xlabel('fixed acidity')
plt.ylabel('citric acid')
plt.xlim(4,18)
plt.ylim(0,1)
print('Figure 12: pH with Fixed Acidity and Citric Acid')
C:\Users\60545\AppData\Local\Temp\ipykernel_8216\1399992010.py:6: MatplotlibDeprecationWarning: The get_cmap function was deprecated in Matplotlib 3.7 and will be removed two minor releases later. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap(obj)`` instead.
  cm = plt.cm.get_cmap('RdBu')


Figure 12: pH with Fixed Acidity and Citric Acid

在这里插入图片描述

红酒品质主要与酒精浓度,挥发性酸和柠檬酸有关。对于品质优于7,或者劣于4的酒,直观上是线性可分的。但是分支为5,6的酒很难线性区分。

lt.colorbar(sc)
bar.set_label('pH',rotation=0)
plt.xlabel('fixed acidity')
plt.ylabel('citric acid')
plt.xlim(4,18)
plt.ylim(0,1)
print('Figure 12: pH with Fixed Acidity and Citric Acid')
Figure 12: pH with Fixed Acidity and Citric Acid

在这里插入图片描述

红酒品质主要与酒精浓度,挥发性酸和柠檬酸有关。对于品质优于7,或者劣于4的酒,直观上是线性可分的。但是分支为5,6的酒很难线性区分。

参考:https://aistudio.baidu.com/aistudio/projectdetail/757183?channelType=0&channe

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值