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
データの読み込み
エージェントは正規分布に見える Genderの男女の割合は に近い. Ageを除く連続型変数は左に傾いていることに留意されたい. targetはわずかに異なるが、深刻なアンバランスではないように見える.
1)カテゴリ変数のカテゴリに基づいてターゲットフィーチャーを使用してvillinパターンを分布する
villen graph:一目でデータの分布と範囲のグラフィックフォーマットが見え、ダンボール図と似ていますが、実際の分布に近いことがわかります.
参照)
https://blog.naver.com/PostView.nhn?blogId=youji4ever&logNo=221864110030
https://hleecaster.com/python-seaborn-violinplot/
バイオリン図を見ると,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/
ブロック図から,Agent,Departure/Arraitteは時間的に便利であり,Gate位置はターゲットに影響を及ぼさないようであることがわかる.(分析から削除しても大丈夫)
すべてのプロパティ間の相関
顧客満足度のtargetとinflightエンターテインメントの相関性が最も高かった(0.52).
このほか、オンラインサポート、オンライン予約、オンラインサービスにも大きな関係があります.
コード+コード作成時に知らない部分学習記事は、出典構成を参考にします.
trainデータ説明
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()
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
測定値確認
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()
ターゲットとフィーチャーの関係
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).
このほか、オンラインサポート、オンライン予約、オンラインサービスにも大きな関係があります.
Reference
この問題について(DACON航空の顧客満足度予測コンテスト1), 我々は、より多くの情報をここで見つけました https://velog.io/@jokwed/DACON-항공사-고객-만족도-예측-경진대회-1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol