DACON航空の顧客満足度予測コンテスト1


DACONの基本コード+人々が共有するコードを学ぶことにしました.ここに書いたコードはアクティブコードを教えてくれます
コード+コード作成時に知らない部分学習記事は、出典構成を参考にします.
trainデータ説明
  • train.csv(学習データ)
    id:例id
    Gender:性別
    顧客タイプ:Dis忠顧客またはLoyal顧客
    Agent:年齢
    旅行タイプ:ビジネス旅行または個人旅行
    等級:等級
    Flight Distance:飛距離
    快適度:座席満足度
    Departure/ARrated time利便性:出発/到着時間利便性
    Food and飲料:飲料満足度
    Gate location:ゲートウェイ位置満足度
    Infolight Wifiサービス:機内WiFiサービス満足度
    Infolight entertainment:機内エンターテインメント満足度
    オンラインサポート:オンラインサポート満足度
    オンライン予約:オンライン予約の利便性満足度
    搭乗サービス:搭乗サービス満足度
    Legroomサービス:Legroomサービス満足度
    Baggage Handling:荷物処理満足度
    Checkin Service:登録サービス満足度
    清潔度:清潔度満足度
    オンライン搭乗:オンライン搭乗満足度
    Departure Delay in Minutes:起動遅延
    ライバルのDelay in Minutes:到着遅延
    target:満足
  • 試合リンク:
    https://dacon.io/competitions/official/235871/overview/description

    データの読み込み

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    data = pd.read_csv('/content/drive/MyDrive/dacon/항공사 고객 만족도 예측 경진대회/train.csv')
    
    data = data.drop('id', axis=1) #id 제거하고 분석
    pd.set_option('display.max_columns', None) #열 요약되지 않고 전부 출력, display.max_rows: 행 요약x
    data

    ->Gender、Customer Type、Travelタイプ、Classはテキストのカテゴリデータです
    Agent、Flight Distance、Departure Delay in Minutes、Arbiant Delay in Minutes以外のデータは0~5の整数データです.

    EDA


    測定値確認

    def check_missing_col(dataframe):
      missing_col = []
      for col in dataframe.columns:
        missing_values = sum(dataframe[col].isna())
        is_missing = True if missing_values >= 1 else False
        if is_missing :
          print(f'결측치가 있는 컬럼은: {col} 입니다') # 문자열 포매팅 방법: https://blockdmask.tistory.com/429
          print(f'해당 컬럼에 총 {missing_values} 개의 결측치가 존재합니다.')
          missing_col.append([col,dataframe[col].dtype]) #컬럼과 타입 추가
      if missing_col == []:
        print('결측치가 존재하지 않습니다')
      return missing_col
    missing_col = check_missing_col(data)
    >> 결측치가 존재하지 않습니다

    きそとうけいてきかいせき

    #기초 통계량
    data.describe()
    #전체의 데이터 타입 확인 #각각: data['열이름'].dtype
    data.dtypes

    ビジュアル化

    plt.style.use("ggplot") # https://hong-yp-ml-records.tistory.com/88
    
    plt.figure(figsize=(25,20))
    plt.suptitle("Data Histogram", fontsize=40) # 모든 서브 플로트 위에 메인 타이틀 설정
    
    #id 제외 시각화
    cols = data.columns
    for i in range(len(cols)):
      plt.subplot(5,5,i+1) # 5*5의 형태, 1~25번 위치, https://codetorial.net/matplotlib/subplot.html
      plt.title(cols[i], fontsize=20)
      if len(data[cols[i]].unique()) > 20:
          plt.hist(data[cols[i]],bins=20, color='b', alpha=0.7) #bins: 칸 개수, color: 색깔, alpha: 투명도 https://jimmy-ai.tistory.com/74
      else:
          temp = data[cols[i]].value_counts() #동일한 요소가 몇 개나 있는지 출력, 각 요소별로 개수 출력한다면 히스토그램 작성 가능 https://kongdols-room.tistory.com/174
          plt.bar(temp.keys(), temp.values, width=0.5, alpha=0.7)
          plt.xticks(temp.keys()) #x축 눈금 설정 함수 https://jimmy-ai.tistory.com/17
    plt.tight_layout(rect=[0,0.03, 1, 0.95]) # https://kongdols-room.tistory.com/98
    plt.show()
  • エージェントは正規分布に見える
  • Genderの男女の割合は
  • に近い.
  • Ageを除く連続型変数は左に傾いていることに留意されたい.
  • targetはわずかに異なるが、深刻なアンバランスではないように見える.

    ターゲットとフィーチャーの関係


    1)カテゴリ変数のカテゴリに基づいてターゲットフィーチャーを使用してvillinパターンを分布する
    villen graph:一目でデータの分布と範囲のグラフィックフォーマットが見え、ダンボール図と似ていますが、実際の分布に近いことがわかります.
    参照)
    https://blog.naver.com/PostView.nhn?blogId=youji4ever&logNo=221864110030
    https://hleecaster.com/python-seaborn-violinplot/
    target = "target" #타겟 설정
    categorical_feature = data.columns[data.dtypes == 'object'] #범주형 데이터 분리
    
    plt.figure(figsize = (20,15))
    plt.suptitle("Violin Plot", fontsize=40)
    
    # id는 제외하고 시각화
    for i in range(len(categorical_feature)):
        plt.subplot(2,2,i+1)
        plt.xlabel(categorical_feature[i])
        plt.ylabel(target)
        sns.violinplot(x=data[categorical_feature[i]], y=data[target])
    plt.tight_layout(rect=[0,0.03, 1, 0.95])
    plt.show()

    バイオリン図を見ると,Customer型変数では満足度(target)に大きな差があることが分かった.
    ->この変数は予測の重要な変数と見なすことができます.
    2)数値型変数カテゴリに基づくターゲット特徴分布box plotの使用
    fig, axes = plt.subplots(3,6,figsize=(25,20)) #nrows = 3, ncols = 6
    コードを記述する理由:
    図はグラフの大きなフレームで、軸はその中のサブブロックです.
    つまり、図、軸1、軸2...これは、一度に1つの軸18を作成することと同じである.
    http://daplus.net/python-%EB%A7%8E%EC%9D%80-%EC%98%88%EC%A0%9C%EA%B0%80-matplotlib-pyplot-python%EC%97%90%EC%84%9Cfig-ax-plt-subplots-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/
    zip():
    パラメータとしてiterableオブジェクトを受信します.複数のIterableオブジェクトを受信した後、データ型をグループ化してTupleとして出力する
    https://chancoding.tistory.com/144
    axes.flat
    axesはnumpy配列です.flatはnumpy関数で平らにする役割を果たした.
    https://stackoverflow.com/questions/46862861/what-does-axes-flat-in-matplotlib-do
    https://www.delftstack.com/ko/howto/python/how-to-flatten-a-list-in-python/
    #수치형 데이터 분리
    numeric_feature = data.columns[(data.dtypes == 'int64') | (data.dtypes == 'float')]
    num_data = data[numeric_feature]
    
    #박스플롯
    fig, axes = plt.subplots(3,6,figsize=(25,20)) #nrows = 3, ncols = 6 #이렇게 코드 짜는 이유: fig는 그래프의 큰 틀이고 axes는 그 안에 들어가는 subplot들이다.
    
    fig.suptitle("feature distributions per quality", fontsize=40)
    for ax, col in zip(axes.flat, num_data.columns[:-1]): #[:-1]: 맨 오른쪽 값 제외하고 모두(맨 오른쪽 값: target)
        sns.boxplot(x='target', y=col, ax=ax, data=num_data)
        ax.set_title(col, fontsize=20)
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])
    plt.show()

    ブロック図から,Agent,Departure/Arraitteは時間的に便利であり,Gate位置はターゲットに影響を及ぼさないようであることがわかる.(分析から削除しても大丈夫)

    視覚的な依存関係


    すべてのプロパティ間の相関
    #계산을 위해 텍스트 형식의 데이터를 숫자로 변환
    corr_df=data.copy() #얕은 복사, 깊은 복사 https://blockdmask.tistory.com/576, https://wikidocs.net/16038
    corr_df[corr_df.columns[corr_df.dtypes=='O']] = corr_df[corr_df.columns[corr_df.dtypes=='O']].astype(str).apply(LabelEncoder().fit_transform) #카테고리->수치형 https://teddylee777.github.io/scikit-learn/labelencoder-%EC%82%AC%EC%9A%A9%EB%B2%95
    #dtypes == 'O' https://stackoverflow.com/questions/37561991/what-is-dtypeo-in-pandas
    plt.figure(figsize=(35,25))
    
    heat_table = corr_df.corr() #상관계수
    mask = np.zeros_like(heat_table) #배열의 크기만큼 0으로 채움. https://aigong.tistory.com/62
    mask[np.triu_indices_from(mask)] = True #위 쪽 삼각형에 마스크를 만듬(아래쪽 삼각형만 보이게) #https://m.blog.naver.com/kiddwannabe/221763497317
    heatmap_ax = sns.heatmap(heat_table, annot=True, mask=mask, cmap='coolwarm') #annot= True 각 셀에 숫자 입력, cmap 색깔 지정 #https://rfriend.tistory.com/419
    heatmap_ax.set_xticklabels(heatmap_ax.get_xticklabels(), fontsize=15, rotation=45) #눈금이름 설정
    heatmap_ax.set_yticklabels(heatmap_ax.get_yticklabels(), fontsize=15)
    plt.title('correlation between features', fontsize=40)
    plt.show()

    顧客満足度のtargetとinflightエンターテインメントの相関性が最も高かった(0.52).
    このほか、オンラインサポート、オンライン予約、オンラインサービスにも大きな関係があります.