5. 데이터 분석하기와인 품질 분류
[기술통계 분석 + 그래프]
목표: 와인 속성 분석 + 품질 등급 예측
- >와인 데이터의 기술 통계를 구함 / 와인 그룹 품질에 대한 t검정 수행 / 와인속성과 품질등급으로 선형회귀분석 수행
기술통계란?: 데이터의 특성을 나타내는 수치들을 분석하는 기본적인 통계 방법. 수치들에는 평균,중앙값,최빈값,표준편차등이 포함됨.
회귀분석이란?: 독립변수X와 종속변수Y간의 연관성 정도를 파악하는 분석기법 변수간의 인과관계를 분석
독립변수의 갯수에 따라 단순, 다중회귀분석으로 나뉘고 독립변수와 종속변수의 관계에 따라 선형, 비선형회귀분석으로 나뉜다.
t검정이란? 데이터에서 찾은 평균을 통해 두 그룹에 차이가 있는지를 알아내는 방법이다.
히스토그램이란? 데이터값의 범위를 구간으로 나누고 그 구간에 해당하는 값을 막대그래프로 나타내는 것이다.
1.데이터 수집
아래 링크에서 데이터를 다운받는다.
2.데이터 정제
파일을 열어보면 열이 제대로 구분되어 있지 않은 것을 볼 수 있다. 원래 csv는 세미콜론, 쉼표, 띄어쓰기를 통해 열을 구분하는데 파일을 보면 깨져보이기 때문에 이를 보기 쉽게 바꿔준다.
red_df=pd.read_csv("data/winequality-red.csv",sep=';',header=0,engine='python')
white_df=pd.read_csv("data/winequality-white.csv",sep=';',header=0,engine='python')
red_df.to_csv("data/winequality_red2.csv",index=False)
white_df.to_csv("data/winequality_white2.csv",index=False)
이 데이터셋들은 애초에 머신러닝용 입력데이터셋으로 작성되어 있어서 따로 전처리 작업은 할 필요없다.
다음으로는 화이트와인, 레드와인으로 나누어진 데이터셋을 병합할 것이다. 데이터를 병합하면 구분이 안되기 때문에 type이라는 새로운 column을 만들어서 화이트와인과 레드와인을 구분해줄 것이다.
red_df.insert(0,column='type',value='red')
white_df.insert(0,column='type',value='white')
wine=pd.concat([red_df,white_df])
wine.to_csv('data/predict_winequality/wine.csv')
[01행]: red_df에 type이라는 column을 맨 앞에 추가해준뒤, 값은 red를 채워준다.
[02행]: white_df에 type이라는 column을 맨 앞에 추가해준뒤, 값은 white를 채워준다.
[03행]: concat을 통해 두 데이터셋을 합쳐준다.
3.데이터 탐색
우선 info함수를 통해서 기본적인 데이터의 정보를 알아본다.
wine.info()
출력값을 보면 우선 6497개의 데이터가 있고, 속성을 나타내는 column은 13개가 존재하며 이름 또한 나와있다. 11개는 싥수타입, 1개는 정수타입, 1개는 오브젝트 타입으로 되어있다. 우리는 와인품질을 예측하는 것이 목표이기 때문에 독립변수는 type~alcohol까지 12개가 존재하고, 종속변수는 quality로 한개가 존재한다.
다음으로는 pandas의 함수를 이용해서 분석해보자.
wine.columns=wine.columns.str.replace(' ','_')
wine.describe()
sorted(wine.quality.unique())
wine.quality.value_counts()
[01행]:wine데이터의 column명에서 공백을 _로 바꿔준다.
[02행]: describe함수를 통해서 속성별갯수, 평균, 표준편차, 최소값등을 출력한다.
[03행]:quality속성값의 종류들을 정렬해서 출력
[04행]:quality속성값에 대한 빈도수를 보여준다.
4.데이터 모델링
기술통계를 사용하여 탐색한 내용으로 화이트와인과 레드와인을 비교해보자.
wine.groupby('type')['quality'].describe()
그룹을 비교하기 위해서 t-검정을 사용한후에 회귀분석을 할 것이다.
from scipy import stats
red_wine_quality=wine.loc[wine['type']=='red','quality']
white_wine_quality=wine.loc[wine['type']=='white','quality']
stats.ttest_ind(red_wine_quality,white_wine_quality,equal_var=False)
[01행]: t검정을 하기 위해서 scipy패키지의 stats함수를 가져온다.
[04행]: t-검정을 하기위해 stats.ttest()인자에 레드와인과 화이트와인의 품질을 넣는다.
이렇게 t검정결과가 나오게 된다.
from statsmodels.formula.api import ols,glm
Rformula = 'quality ~ fixed_acidity + volatile_acidity + citric_acid +residual_sugar + chlorides + free_sulfur_dioxide + total_sulfur_dioxide + density + pH + sulphates + alcohol'
regression_result=ols(Rformula,data=wine).fit()
regression_result.summary()
[01행] statsmodels 패키지에서 ols,와 glm을 import
[02행] 종속변수y와 독립변수x를 구성한다. 구성방식은 종속변수~독립변수1+독립변수2 ..으로 구성하면된다.
[03행]: 선형회귀모델중 OLS(Ordinary Least Squares)을 사용한다.
이렇게 회귀분석 모델을만든뒤에 품질을 예측하기 위해서는 독립변수인 11개의 속성에 대한 샘플데이터가 필ㅇ하다. 우선 임의의 샘플을 만들어서 예측을 해보자.
sample1=wine[wine.columns.difference(['quality','type'])]
sample1=sample1[0:5][:]
sample1_predict=regression_result.predict(sample1)
sample1_predict
wine[0:5]['quality']
[01행]: sample1에 회귀분석모델에 사용할 독립변수만 추출하여 저장
[02행]: sample1에서 5개의 sample만 뺴내서 다시 저장
[03행]: sample1을 이전에 만들어놓은 회귀분석모델에 넣고 돌림
아래와 같이 좌측은 회귀분석을 통해 예측한 와인의 품질이고 우측은 실제 해당 샘플의 품질이다.
다음으로는 sample2를 딕셔너리형태로 구성해본뒤에 동일하게 회귀분석모델에 넣어봤다.
data = {"fixed_acidity" : [8.5, 8.1], "volatile_acidity": [0.8, 0.5],
"citric_acid": [0.3, 0.4], "residual_sugar": [6.1, 5.8], "chlorides": [0.055,0.04],
"free_sulfur_dioxide": [30.0, 31.0], "total_sulfur_dioxide": [98.0,99],
"density": [0.996, 0.91], "pH": [3.25, 3.01], "sulphates": [0.4, 0.35],"alcohol": [9.0, 0.881]}
sample2=pd.DataFrame(data,columns=sample1.columns)
sample2
sample2_predict=regression_result.predict(sample2)
sample2_predict
4.결과 시각화
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('dark')
sns.histplot(red_wine_quality,kde=True,color='red',label='red wine',stat="density")
sns.histplot(white_wine_quality,kde=True,color='white',label='white wine',stat="density")
plt.title("Quality of Wine Type")
plt.legend()
plt.show()
[01행]:히스토그램 차트의 배경색 스타일을 설정
[02,03행]: 레드와인과 화이트와인에 대한 histplot객체를 생성한다. 인자로는 데이터, 확률밀도함수설정,그래프 색상,라벨,y축값을 넣어준다.
[04~06행]: 차트 제목과 범례를 정해주고 출력한다.
x축은 quality y축은 확률밀도 함수값이 나타난다.
다음으로는 부분회귀 플롯을 그려볼 것이다.
부분회귀플롯은 하나의 독립변수가 종속변수에 미치는 영향을 분석하는 것으로 이번 실습처럼 다중선형회귀분석모델에 적용하야 각변수가 얼마나 영향을 끼치는지 알아볼 수 있다.
import statsmodels.api as sm
others=list(set(wine.columns).difference(set(['quality','fixed_acidity'])))
p,resids=sm.graphics.plot_partregress('quality','fixed_acidity',others,data=wine,ret_coords=True)
plt.show()
[02행]: 종속변수(quality)와 독립변수(fixed_acidity)를 제외한 변수를 others에 저장
[03행]:나머지 변수들은 고정하고 독립변수(fixed_acidity)가 종속변수(quality)에 끼치는 영향을 부분회귀를 시행
fig=plt.figure(figsize=(8,13))
sm.graphics.plot_partregress_grid(regression_result,fig=fig)
plt.show
이번에는 다중회귀분석 결과가 들어있는 regression_result을 통해 각 독립변수별 부분회귀 플롯을 출력해보았다.
'데이터분석실습 > 데이터 과학 기반의 파이썬 빅데이터 분석' 카테고리의 다른 글
파이썬 빅데이터 분석 Day 7 (1) | 2023.10.26 |
---|---|
파이썬 빅데이터 분석 Day 6 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 4 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 3 (0) | 2023.10.26 |
파이썬 빅데이터 분석 Day 2 (0) | 2023.10.26 |