728x90
반응형
# 1 - 미세먼지 데이터 회귀 문제
1. 시간 or 날짜 or 월 or 년에 맞게 그룹화 하기
2. 그룹화된 데이터 pyplot으로 시각화하기
3. 시간 순으로 정렬되어 있다면 이전 n개의 데이터를 input으로 하고 현재 미세 먼지 농도를 타겟 변수로 하도록 바꾸기
4. 모델에 학습 시키고, csv에 저장하기.
# 데이터 호출 및 결측치 처리
import pandas as pd
import sklearn
data = pd.read_csv('PM10_seoul.csv') # csv 데이터를 호출한다.
data.head() # 데이터를 대략적으로 확인
data.isna().sum() #각 컬럼별 결측치의 숫자 확인
data = data.fillna(0) #결측치를 0으로 채우기
data = data.dropna() #결측치 제거
# 날짜 나누기 ex) 2022-12-08:24 순서대로 연 월 일 시간
data['year'] = data['date'].str.split('-').str[0] #문자열로 나누고, 첫번째
data['month'] = data['date'].str.split('-').str[1] #문자열로 나누고, 두번째
data['day'] = data['date'].str.split('-').str[2].str.split(':').str[0] #: 기준으로 한번더 나눔
data['time'] = data['date'].str.split('-').str[2].str.split(':').str[1] # 위와 동일
# 그룹화 하기
new_data = data.groupby('time')['PM-10'].mean().reset_index() #reset_index를 해줘야 데이터프레임으로 반환
# 데이터 정렬
data.sort_values('date',ascending=False,inplace=True) #ascending은 정렬 방향
# 이전 n개의 데이터를 해당 데이터의 컬럼으로 사용하는 방법
for i in range(1,n+1):
data['PM-10'+str(i)] = data['PM-10'].shift(-i) #필연적으로 마지막 데이터들은 NAN이 생긴다
# pyplot으로 시각화 하기
import matplotlib.pyplot as plt
plt.plot(new_data['time'],new_data['pm10-by-time'])
plt.xlabel('time')
plt.ylabel('pm-10 by time')
plt.show()
# 모델 호출 및 학습
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
X = data.drop(['PM-10','year','month','day','time','date'],axis=1) #필요 없는 컬럼들 제거
y = data['PM-10']
X_train,X_test,y_train,y_test = train_test_split(X,y) # 테스트 데이터셋 나누기
model = GradientBoostingRegressor() # 앙상블 그래디언트 부스팅 모델
model.fit(X_train,y_train) # 모델 학습
#모델 예측 및 저장
y_pred = model.predict(X_test) #이거는 Series 형태로 저장 됨
y_pred_df = pd.DataFrame(y_pred,columns=['Predicted']) #데이터 프레임 변환
y_pred_df.to_csv('answer.csv',index=False) # 인덱스 없이 csv로 저장.
#만약 정답 양식이 미리 주어진 경우
answer_df = pd.read_csv('answer.csv')
answer_df['result'] = y_pred #해당 컬럼에 데이터 저장
answer.to_csv('answer.csv',index=False) #csv로 저장
# 2 - 교통사고 데이터 분석
import pandas as pd
from matplotlib import pyplot as plt
import sklearn
data = pd.read_csv('accident_stat.csv') #데이터 호출
new_data = data.loc[data['사고유형대분류'] == '차대차'].reset_index(drop=True)
#차대차 만 따로 분류, loc는 행을 필터링
new_data = new_data.drop(columns=['aaa','bbb','ccc']) #기존 인덱스 컬럼 삭제
new_data = new_data.drop(0,axis=0) #axis가 0이면 행 삭제
new_data = new_data.drop('사망비율',axis=1) #axis가 1이면 열 삭제
plt.bar(range(len(new_data)),new_data['사망비율'])
plt.xticks(range(len(new_data)),new_data['사고유형'])
plt.show()
grouped_data = data.groupby('사고유형대분류')['사망자수'].idxmax() #그룹화 후 idx가 가장 많은것 반환
grouped_data2 = data.loc[grouped_data,'사고유형'] #grouped_data에 해당 하는 row들 반환
data['비율'] = data['중상자수']/data['사고건수'] #중상자수 대비 사고건수 컬럼생성
answer = data.loc[data['비율'] > 0.5] #loc를 사용해서 조건에 맞게 필터링
answer.to_csv('중상비율.csv',index=False) #csv로 출력
# 3 자전거 데이터 분석
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('bike_sampleSubmission.csv')
train.info()
test.info()
train.isna().sum() # 각 컬럼별 nan의 개수
test.isna().sum() # 각 컬럼별. nan의 개수
train['datetime'] = pd.to_datetime(train['datetime']) #문자열에서 날짜 형식으로 변환
test['datetime'] = pd.to_datetime(test['datetime']) #문자열에서 날짜 형식으로 변환
train['year'] = train['datetime'].dt.year #년
train['month'] = train['datetime'].dt.month #월
train['day'] = train['datetime'].dt.day #일
train['hour'] = train['datetime'].dt.hour #시
train['minute'] = train['datetime'].dt.minute #분
train['second'] = train['datetime'].dt.second #초
train['dayofweek'] = train['datetime'].dt.dayofweek #무슨요일
test[year] = test['datetime'].dt.year #년
test['month'] = test['datetime'].dt.month #월
test['day'] = test['datetime'].dt.day #일
test['hour'] = test['datetime'].dt.hour #시
test['minute'] = test['datetime'].dt.minute #분
test['second'] = test['datetime'].dt.second #초
sns.barplot(data=train,x='year',y='count') #가로축: 년, 세로축: 타겟 변수
sns.pointplot(data=train,x='hour',y='count',hue='workingday') #평일 vs 휴일의 실시간 이용자수, hue는 나누는 범주의 기준을 정함
corr_data = ['season','holiday','weather','temp','atemp','humidity'] # 상관 관계를 찾을 변수
sns.heatmap(train[corr_data].corr()) #상관 관계 히트맵으로 표현
fig,(ax1,ax2) = plt.subplots(ncols=2,figsize=(12,5)) #서브플롯 생성
sns.scatterplot(data=train, x='windspeed',y='count',ax=ax1)
sns.scatterplot(data=train,x='temp' y='count',ax=ax2)
train = pd.get_dummies(data=train,colums=['holiday'],prefix='holiday') #원핫인코딩
train = pd.get_dummies(data=train,colums=['weather'],prefix='weather') #원핫인코딩
train = pd.get_dummies(data=train,colums=['workingday',prefix='workingday']) #원핫인코딩
train = pd.get_dummies(data=train,columns=['season'],prefix='season') #원핫인코딩
test = pd.get_dummies(data=test,columns=['holiday'],prefix='holiday') #원핫인코딩
test = pd.get_dummies(data=test,columns=['weather'],prefix='weather') #원핫인코딩
test = pd.get_dummies(data=test,columns=['workingday'],prefix='workingday') #원핫인코딩
test = pd.get_dummies(data=test,columns=['season'],prefix='season') #원핫인코딩
test_datetime = test['datetime']
train.drop(columns = ['datetime','casual','reigsterd'],inplace=True) #학습에 사용 안할 변수
test.drop(columns = ['datetime'],inplace=True) #사용 안하는 특성들
X = train.drop(columns=['count']) #학습에 사용될 데이터
y = train['count'] #타겟 변수
from sklearn.ensemble import GradientBoostingClassifier #모델 호출
model = GradientBoostingClassifier() #모델 생성
model.fit(x,y) #학습
y_pred = model.predict(test) #예측
submission['count'] = y_pred #결과물 저장
answer = train.loc[train.month == 1] #월이 1월인것만 필터링
day_count_sum = answer.groupby('day of week')[count].sum() #요일 기준으로 카운트값 그룹화
day_count_sum = day_count_sum.sort_values(ascending=False) #정렬
top3 = day_count_sum.head(3) #상위 3개 출력
day_count_sum = answer.groupby('day of week')['count'].quantile(0.1) #하위 10%
day_count_sum
answer = train.loc[train.humidity>75] #특정 범위 이상일때
ans = answer['company'].unique() #고유값 반환
ans = answer['company'].max() #가장 값이 많은 것 반환
ans = answer['company'].min() #가장 값이 적은 것 반환
728x90
반응형
'AI & Data Science' 카테고리의 다른 글
AI & DS 기술 면접 - ML (0) | 2023.11.25 |
---|---|
2023 스마트 빌딩 빅데이터 분석 경진대회 후기 (최우수상 수상) (0) | 2023.06.24 |
IoT 중간고사 정리 (0) | 2023.04.18 |
CNN (0) | 2023.04.01 |
Isolation Forest (0) | 2023.01.29 |