<jupyter_start><jupyter_text>항공편 분석<jupyter_code>#Pandas로 데이터 로드
import pandas as pd

df = pd.read_csv('data/flightdata.csv')
df.head()
df = df.drop('Unnamed: 25', axis=1)#25번째 행 날림
df.isnull().sum()#널값 세기
df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "ORIGIN", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]#필요없는 셀 다 날리고 필요한 부분만 취함
df.isnull().sum()#필요한 부분에서만 널값 검사

#ARR_DEL15에 널값이 많네
#왜 누락되었는지 찾기 위해 널값이 나온 줄만 골라서 표시
df[df.isnull().values.any(axis=1)].head()
#이건 취소되었거나 회항된 항공편으로 파악됨
df = df.fillna({'ARR_DEL15': 1}) #fillna -> NaN인 값을 채우는 함수. ARR_DEL15의 널값을 1로 채움
df.iloc[177:185] #그렇게 해서 뒤쪽 파악
#출발 시간을 그룹화할거임

import math #반올림을 위해 math 모듈 가져옴

#데이터프레임의 줄을 돌면서 시작
for index, row in df.iterrows():
    #CRS_DEP_TIME(출발 예정 시간)을 1시간마다 하나씩으로 묶음 -> 100으로 나누고 반올림(HHMM형식이니까)
    df.loc[index, 'CRS_DEP_TIME'] = math.floor(row['CRS_DEP_TIME'] / 100)
df.head()
df = pd.get_dummies(df, columns=['ORIGIN', 'DEST']) #get_dummy를 하면 내용을 주르륵 펼쳐서 True/False 형태로 바꿈
df.head()<jupyter_output><empty_output><jupyter_text>모델 빌드<jupyter_code>from sklearn.model_selection import train_test_split
#변수들을 split함. 15분 이상 연착여부는 결과, 나머지는 원인으로 생각.
#80%는 학습데이터, 20%는 평가데이터로 넣을거임.
train_x, test_x, train_y, test_y = train_test_split(df.drop('ARR_DEL15', axis=1), df['ARR_DEL15'], test_size=0.2, random_state=42)
#df.drop(...) -> 원인 부분  : 15분 이상 연착여부를 제외한 나머지
#df(...) : 결과 부분 : 15분 이상 연착여부
#test_size : 평가데이터로 넘길부분
#random_state : 랜덤값 시드는 42로 씀
train_x.shape
test_x.shape
#랜덤포레스트모델을 돌리기 위해 sklearn 투입
from sklearn.ensemble import RandomForestClassifier

#랜덤포레스트를 쓰고 시드값은 13 사용
model = RandomForestClassifier(random_state=13)
#바로 피팅 시작
model.fit(train_x, train_y)

#모델 예측
predicted = model.predict(test_x)
#평가
model.score(test_x, test_y)
#평가정리를 위한 메트릭값을 가져옴
from sklearn.metrics import roc_auc_score
#예측 확률 시트 생성
probabilities = model.predict_proba(test_x)
#그리고 roc, auc값을 획득
roc_auc_score(test_y, probabilities[:, 1])
#Confusion Matrix를 위해 또 모듈 임포트
from sklearn.metrics import confusion_matrix
#Confusion Matrix를 생성)
confusion_matrix(test_y, predicted)

#아까 했던 정밀도 계산
from sklearn.metrics import precision_score

train_predictions = model.predict(train_x)
precision_score(train_y, train_predictions)
#재현률도 계산
from sklearn.metrics import recall_score

recall_score(train_y, train_predictions)<jupyter_output><empty_output><jupyter_text>데이터 시각화<jupyter_code>#matplotlib을 매번 show하지 않아도 보이게 함
%matplotlib inline
#모듈 모두 첨부
import matplotlib.pyplot as plt
import seaborn as sns
#seaborn 초기화
sns.set()
#roc curve 생성
from sklearn.metrics import roc_curve

#roc_curve의 x,y를 fpr, tpr에 입력
fpr, tpr, _ = roc_curve(test_y, probabilities[:, 1])
plt.plot(fpr, tpr)
plt.plot([0, 1], [0, 1], color='grey', lw=1, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
#이제 입력값만 넣으면 연착 여부를 예상해주는 함수를 만듭시다

def predict_delay(departure_date_time, origin, destination):
    #departure_date_time : 출발일/시간
    #origin : 출발점
    #destination : 도착점

    from datetime import datetime
    #출발시간을 datetime으로 변경함. 입력값이 개판일 수 있으니 try-catch구문 사용
    try:
        departure_date_time_parsed = datetime.strptime(departure_date_time, '%d/%m/%Y %H:%M:%S')
    except ValueError as e:
        return 'Error parsing date/time - {}'.format(e)
    #날짜값 추출
    month = departure_date_time_parsed.month
    day = departure_date_time_parsed.day
    day_of_week = departure_date_time_parsed.isoweekday()
    hour = departure_date_time_parsed.hour
    #origin-destination을 대소문자 여부 상관없게 모두 대문자로 변경
    origin = origin.upper()
    destination = destination.upper()

    #모델에 넣을 입력값 넣음. dummy로 만든 부분이 있으니 저렇게 파싱해야 함
    #for문쓰면 편할건데, 뭐 MS가 저렇게 적었으니 그냥 내버려둡시다.
    input = [{'MONTH': month,
              'DAY': day,
              'DAY_OF_WEEK': day_of_week,
              'CRS_DEP_TIME': hour,
              'ORIGIN_ATL': 1 if origin == 'ATL' else 0,
              'ORIGIN_DTW': 1 if origin == 'DTW' else 0,
              'ORIGIN_JFK': 1 if origin == 'JFK' else 0,
              'ORIGIN_MSP': 1 if origin == 'MSP' else 0,
              'ORIGIN_SEA': 1 if origin == 'SEA' else 0,
              'DEST_ATL': 1 if destination == 'ATL' else 0,
              'DEST_DTW': 1 if destination == 'DTW' else 0,
              'DEST_JFK': 1 if destination == 'JFK' else 0,
              'DEST_MSP': 1 if destination == 'MSP' else 0,
              'DEST_SEA': 1 if destination == 'SEA' else 0 }]
    #그리고 이제 모델에서 실행 결과를 리턴
    return model.predict_proba(pd.DataFrame(input))[0][0]


    
#함수 테스트
predict_delay('1/10/2018 21:45:00', 'JFK', 'ATL')
#이값 저값 넣어보기
predict_delay('2/10/2018 21:45:00', 'JFK', 'ATL')
#계속
predict_delay('2/10/2018 10:00:00', 'ATL', 'SEA')
#이번엔 지정된 항공편들 주르륵 넣어서 연착확률 구해봅시다

import numpy as np

labels = ('Oct 1', 'Oct 2', 'Oct 3', 'Oct 4', 'Oct 5', 'Oct 6', 'Oct 7')
values = (predict_delay('1/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('2/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('3/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('4/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('5/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('6/10/2018 21:45:00', 'JFK', 'ATL'),
          predict_delay('7/10/2018 21:45:00', 'JFK', 'ATL'))#왜 이렇게 넣어 for문좀 쓰자;;;
alabels = np.arange(len(labels))

plt.bar(alabels, values, align='center', alpha=0.5)
plt.xticks(alabels, labels)
plt.ylabel('Probability of On-Time Arrival')
plt.ylim((0.0, 1.0))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13831567205800335, 'fraction_numerical': 0.0420152444692322, 'mean_word_length': 3.8998178506375227, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 16, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '293286', 'license': 'CC-BY-4.0', 'n_tokens_mistral': 2933, 'n_tokens_neox': 3200, 'n_words': 570, 'path': 'analysis/wed2.ipynb', 'repo_name': 'edangros/SDDataExpertProgram2021', 'size': '5379'}