<jupyter_start><jupyter_text>Análisis con los datos disponibles del REPDA  ¿De dónde provienen los datos?Los datos provienen del conjunto [Concesiones, asignaciones, permisos otorgados y registros de obras situadas en zonas de libre alumbramiento de CONAGUA](https://datos.gob.mx/busca/dataset/concesiones-asignaciones-permisos-otorgados-y-registros-de-obras-situadas-en-zonas-de-libre-alu), una vez descargados, se hicieron los filtros necesarios para quedarnos únicamente con los datos que corresponden a Morelia. Es importante mencionar que existen dos versiones de este conjunto, la segunda se encuentran disponible en [Consulta a la base de datos del REPDA](https://app.conagua.gob.mx/ConsultaRepda.aspx). Si bien, en esencia son lo mismo, el orden de los atributos son diferentes al igual que los nombres, la codificación de formato es diferente y en ninguno de los dos sitios se indica que existe una relación.<jupyter_code>#Librerías necesarias
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
# Configuramos el formato
pd.options.display.float_format = '{:.3f}'.format
custom_params = {"axes.spines.right": False, "axes.spines.top": False}
sns.set_theme(style="ticks", rc=custom_params)<jupyter_output><empty_output><jupyter_text>Cargamos los datos<jupyter_code>folder = './datasets/'
repdaMor = pd.read_csv(folder+'RepdaMorelia.csv', parse_dates=['FECHA DE REGISTRO'], infer_datetime_format=True)<jupyter_output><empty_output><jupyter_text>Revisamos la estructura que tienen<jupyter_code>repdaMor.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 529 entries, 0 to 528
Data columns (total 14 columns):
 #   Column                                                                      Non-Null Count  Dtype         
---  ------                                                                      --------------  -----         
 0   TÍTULO                                                                      529 non-null    object        
 1   USO QUE AMPARA EL TÍTULO                                                    529 non-null    object        
 2   TITULAR                                                                     529 non-null    object        
 3   VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3  529 non-null    float64       
 4   APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO                         529 non-null    int64         
 5   VOLUMEN DE EXTRACCIÓN ANUAL DE APROVECHAMIENTOS SUPERFICIALES EN m3         529 non-null    float64       [...]<jupyter_text>Volúmenes de extracción de aguas nacionales El primer punto de interés es el volumn de aguas nacionales que se extrae cada año. Para ello podemos revisar algunos valores estadísticos importantes<jupyter_code>repdaMor['VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3'].describe()<jupyter_output><empty_output><jupyter_text>Con esto nos damos cuenta que en promedio se extraen 290,858.85 m³ de agua al año, sin embargo, al menos la mitad de los registros extraen menos de 6,200 m³ al año, incluso hay algunos donde se indica que no s extrae agua, los cuales debemos de revisar a profundidad.<jupyter_code>sinExtraccion = repdaMor[repdaMor['VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3']==0]<jupyter_output><empty_output><jupyter_text>Revisemos los usos que amparan estos títulos<jupyter_code>sns.countplot(x='USO QUE AMPARA EL TÍTULO', data=sinExtraccion, color='b')
plt.title('Usos de los registros que no extraen agua', fontsize=18)
plt.ylabel("Cantidad de registros")
plt.xticks(rotation=90)
plt.savefig('./Graficas/UsosSinExtraccion.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que la mayoría de los registros en los que **no** se extrae agua tienen como fin los servicios. También vemos que hay dos usos que no se entienden, "OTROS" y "DIFERENTES USOS", los cuales no tenemos forma de saber a qué se refieren. Podemos ver los titulares que no extraen agua<jupyter_code>for titular, registros in zip(sinExtraccion.TITULAR.value_counts().index,sinExtraccion.TITULAR.value_counts()):
    print(f"{titular} tiene {registros} registros donde no se presenta una extracción de agua nacional.\n")<jupyter_output>ORGANISMO OPERADOR DE AGUA POTABLE, ALCANTARILLADO Y SANEAMIENTO DE MORELIA tiene 5 registros donde no se presenta una extracción de agua nacional.

NUEVA WAL-MART DE MEXICO, S. DE R.L. DE C.V. tiene 4 registros donde no se presenta una extracción de agua nacional.

INSTITUTO TECNOLOGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY tiene 2 registros donde no se presenta una extracción de agua nacional.

TIENDAS COMERCIAL MEXICANA, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

<NAME> tiene 2 registros donde no se presenta una extracción de agua nacional.

INMOBILIARIA Y CONSTRUCTORA SOLORZANO S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

LA VOZ DE MICHOACAN, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

PAROM, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

FRIGORIFICO Y RASTRO DE MORELIA, S.A. DE C.V. tiene 2 regis[...]<jupyter_text>De esta lista llama la atencia que el OOAPAS esté registrado de dos maneras diferentes, como _ORGANISMO OPERADOR DE AGUA POTABLE, ALCANTARILLADO Y SANEAMIENTO DE MORELIA_ y _ORGANISMO OPERADOR DE AGUA POTABLE ALCANTARILLADO Y SANEAMIENTO DE MORELIA_, lo que nos indica una inconsistencia en los registros, por lo que debemos de arregrarlo.<jupyter_code>repdaMor['TITULAR'].replace('ORGANISMO OPERADOR DE AGUA POTABLE, ALCANTARILLADO Y SANEAMIENTO DE MORELIA','ORGANISMO OPERADOR DE AGUA POTABLE ALCANTARILLADO Y SANEAMIENTO DE MORELIA', inplace=True)
sinExtraccion['TITULAR'].replace('ORGANISMO OPERADOR DE AGUA POTABLE, ALCANTARILLADO Y SANEAMIENTO DE MORELIA','ORGANISMO OPERADOR DE AGUA POTABLE ALCANTARILLADO Y SANEAMIENTO DE MORELIA', inplace=True)<jupyter_output>/home/jazminlc/.local/lib/python3.8/site-packages/pandas/core/series.py:4575: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  return super().replace(<jupyter_text>Volvemos a revisar a los titulares que no extraen agua<jupyter_code>for titular, registros in zip(sinExtraccion.TITULAR.value_counts().index,sinExtraccion.TITULAR.value_counts()):
    print(f"{titular} tiene {registros} registros donde no se presenta una extracción de agua nacional.\n")<jupyter_output>ORGANISMO OPERADOR DE AGUA POTABLE ALCANTARILLADO Y SANEAMIENTO DE MORELIA tiene 7 registros donde no se presenta una extracción de agua nacional.

NUEVA WAL-MART DE MEXICO, S. DE R.L. DE C.V. tiene 4 registros donde no se presenta una extracción de agua nacional.

INSTITUTO TECNOLOGICO Y DE ESTUDIOS SUPERIORES DE MONTERREY tiene 2 registros donde no se presenta una extracción de agua nacional.

INMOBILIARIA Y CONSTRUCTORA SOLORZANO S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

LA VOZ DE MICHOACAN, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

<NAME> tiene 2 registros donde no se presenta una extracción de agua nacional.

PAROM, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

FRIGORIFICO Y RASTRO DE MORELIA, S.A. DE C.V. tiene 2 registros donde no se presenta una extracción de agua nacional.

UNION NACIONAL DE RESINEROS, A.C. tiene 2 registros don[...]<jupyter_text>Otra información que puede ser relevante a la hora de entender porqué hay registros que no extraen agua, es la fecha, ya que es posible que sean registros que se hicieron en cuerpos de agua que ahora ya no existen.<jupyter_code>sinExtraccion['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)<jupyter_output><empty_output><jupyter_text>Vemos que las fechas son realmente variadas por lo que no podemos suponer nada. Finalmente, debemos destacar el hecho de que el 43.67% de los registros no extraen aguas nacionales. Ahora podemos enfocarnos en los registros donde sí se extrae agua nacional<jupyter_code>conExtraccion = repdaMor[~repdaMor.TÍTULO.isin(sinExtraccion.TÍTULO)]
sns.countplot(x='USO QUE AMPARA EL TÍTULO', data=conExtraccion, color='b')
plt.title('Usos de los registros que extraen agua', fontsize=18)
plt.ylabel('Cantidad de registros')
plt.xticks(rotation=90)
plt.savefig('./Graficas/UsosConExtraccion.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que la mayoría son de uso agrícola, lo cual coincide con el hecho de que el 76% del agua en México se utilicen con fines agrícolas [con18]. Pero, gracias a la información que tenemos podemos la cantidad de agua que se extra en total para cada uso.<jupyter_code>sumExtUso = pd.pivot_table(data=conExtraccion, index = 'USO QUE AMPARA EL TÍTULO', values = 'VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3', aggfunc=np.sum).sort_values(by= 'VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3', ascending=False)
sumExtUso
sns.barplot(x=sumExtUso.index,y='VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3', data=sumExtUso,color='b')
plt.title('Volumen de extracción de de aguas nacionales\nsegún su uso', fontsize=18)
plt.ylabel('Volumen\n(hm³/año)')
plt.xticks(rotation=90)
plt.yticks(ticks=[int(i) for i in range(0,int(100e6),int(10e6))],labels=[int(i/1e6) for i in range(0,int(100e6),int(10e6))])
plt.savefig('./Graficas/VolumenExtraccionSegunUso.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que a pesar de ser el uso más común, el uso agrícola es el cuarto que más extrae agua, siendo el primero el público urbano, seguido del industrial. Otra cosa que llama mucho la atención es el uso de generación de energía eléctrica, pues es el menos común, pero es el tercero que más extrae agua.  Usos Ya que pusimos parte de nuestra atención en los usos, valdría la pena revisarlos a fondo. Lo primero que podemos hacer es revisar la cantidad de registros que hay para cada título.<jupyter_code>#Distribución
sns.countplot(x='USO QUE AMPARA EL TÍTULO', data=repdaMor, color='b')
plt.title('Distribución de usos', fontsize=18)
plt.ylabel("Cantidad de registros")
plt.xticks(rotation=90)
plt.savefig('./Graficas/DistribucionUsos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que la mayoría de los registros tienen como fin el uso de servicios. Lo siguienet que puede llamar la atención, es si hay tiutulares que tengan control sobre cierto uso<jupyter_code>usosTitular = pd.pivot_table(data=repdaMor, columns='USO QUE AMPARA EL TÍTULO', values='VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3',index='TITULAR', aggfunc='count')
usosTitular.fillna(0,inplace=True)
usosTitular.head()<jupyter_output><empty_output><jupyter_text>Revisamos los tres titulares con más títulos para cada uno de los usos<jupyter_code>for col in usosTitular.columns:
    print(col.center(80))
    print(usosTitular.sort_values(by=col, ascending=False)[col].head(3))<jupyter_output>ACUACULTURA                                   
TITULAR
<NAME>   1.000
<NAME>            1.000
AAK MEXICO, S. A. <NAME>.          0.000
Name: ACUACULTURA, dtype: float64
                                    AGRÍCOLA                                    
TITULAR
<NAME>                     2.000
UNIVERSIDAD AUTONOMA CHAPINGO                     2.000
<NAME>, <NAME>   2.000
Name: AGRÍCOLA, dtype: float64
                                DIFERENTES USOS                                 
TITULAR
EJIDO COINTZIO                         2.000
VICTOR <NAME>ADO      2.000
<NAME>   2.000
Name: DIFERENTES USOS, dtype: float64
                                   DOMÉSTICO                                    
TITULAR
SALVADOR ABUD ANTONIO            1.000
AMPLIACION DEL EJIDO EL PARIAN   1.000
PLACIDO PEREZ CORTES             1[...]<jupyter_text>Vemos que realmente solo para el la generación de energía eléctrica y el uso público urbano, que son dominados por la CFE y el OOAPAS respectivamente.  Lo siguiente en lo que nos podemos enfocar es en la superficie total de cada uso.<jupyter_code>sumSupUso = pd.pivot_table(data=repdaMor, index = 'USO QUE AMPARA EL TÍTULO', values = 'SUPERFICIE EN m2', aggfunc=np.sum).sort_values(by='SUPERFICIE EN m2', ascending=False)
sumSupUso
sns.barplot(x=sumSupUso.index,y='SUPERFICIE EN m2', data=sumSupUso, color='b')
plt.title('Superficie de las aguas nacionales \nsegún su uso', fontsize=18)
plt.ylabel('Superficie (m²)')
plt.xticks(rotation=90)
plt.savefig('./Graficas/SuperficieUsos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Llama la atención que no se cuente con la información de la superficie de los tres usos que más extraen agua, por lo que debemos revisar qué pasa con estre atributo.<jupyter_code>repdaMor['SUPERFICIE EN m2'].describe()<jupyter_output><empty_output><jupyter_text>Vemos que no se cuenta con esta información para más de la mitad de los registros.<jupyter_code>print(f"No se cuenta con la superficie del {sum(repdaMor['SUPERFICIE EN m2']==0)/repdaMor.shape[0]*100:.3f}% de los datos")<jupyter_output>No se cuenta con la superficie del 67.108% de los datos<jupyter_text>AnexosLos anexos hacen referencia a los cuerpos de agua que están registrados para cada título, un título puede tener más de un anexo y de diferente clase. Las clases de anexos son _superficiales,subterráneos, zonas federales_ y _descargas_. Lo primero que nos puede interesar es ver la cantidad total de anexos que hay por uso.<jupyter_code>#Anexos
repdaMor['TOTAL DE ANEXOS'] = repdaMor['APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO']+repdaMor['APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO']+repdaMor['PUNTOS DE DESCARGA QUE AMPARA EL TÍTULO']+repdaMor['ZONAS FEDERALES QUE AMPARA EL TITULO']
usosAnexos =  pd.pivot_table(data=repdaMor, index='USO QUE AMPARA EL TÍTULO', values='TOTAL DE ANEXOS', aggfunc='sum').sort_values('TOTAL DE ANEXOS', ascending=False)
usosAnexos
sns.barplot(x=usosAnexos.index,y='TOTAL DE ANEXOS', data=usosAnexos, color='b')
plt.title('Distribución de anexos\nsegún su uso', fontsize=18)
plt.ylabel('Cantidad de anexos')
plt.xticks(rotation=90)
plt.savefig('./Graficas/AnexosUsos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que el resultado es similar al del total de registros, lo cual tiene sentido. Lo siguiente es fijarnos en cada tipo de anexo.  Superficiales<jupyter_code>usosSup = pd.pivot_table(data=repdaMor, index='USO QUE AMPARA EL TÍTULO', values=['APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO','VOLUMEN DE EXTRACCIÓN ANUAL DE APROVECHAMIENTOS SUPERFICIALES EN m3'], aggfunc='sum')
usosSup = usosSup.sort_values(by = 'VOLUMEN DE EXTRACCIÓN ANUAL DE APROVECHAMIENTOS SUPERFICIALES EN m3', ascending=False)
usosSup<jupyter_output><empty_output><jupyter_text>En este caso vemos que el uso agrícola es el que tiene más anexos de tipo superficiales, sin emabrgo, no es el que más extrae agua de este tipo, ese es el público úrbano. En particular, algo que llama la atención es que la generación de energía eléctrica es el segundo uso que más extrae agua de este tipo a pesar de ser un único anexo, es decir, la CFE es el segundo mayor extractor de aguas superficiales en Morelia.  Subterráneos<jupyter_code>usosSub = pd.pivot_table(data=repdaMor, index='USO QUE AMPARA EL TÍTULO', values=['APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO','VOLUMEN DE EXTRACCIÓN ANUAL DE APROVECHAMIENTOS SUBTERRÁNEOS EN m3'], aggfunc='sum')
usosSub = usosSub.sort_values(by = 'VOLUMEN DE EXTRACCIÓN ANUAL DE APROVECHAMIENTOS SUBTERRÁNEOS EN m3', ascending=False)
usosSub<jupyter_output><empty_output><jupyter_text>Para este tipo de anexo, vemos que de nuevo el uso público urbano es el  que extrae más agua. Sin embargo, algo que llama la atención es que el uso industrial extrae 2.93 veces más agua que el uso agrícola a pesar de tener menos de la mitad de anexos.  Zonas Federales<jupyter_code>usosZonFed = pd.pivot_table(data=repdaMor, index='USO QUE AMPARA EL TÍTULO', values=['ZONAS FEDERALES QUE AMPARA EL TITULO','SUPERFICIE EN m2'], aggfunc='sum')
usosZonFed = usosZonFed.sort_values(by = 'SUPERFICIE EN m2', ascending=False)
usosZonFed<jupyter_output><empty_output><jupyter_text>Vemos que nos da exactamente los mismos resultados que cuando analizamos la superficie según los usos, por lo que ahora sabemos que el atributo de superficie solo está presente en aquellos registros con una zona federal. Por esto debemos ver aquellos títulos donde se tengan exclusivamente zonas federales.<jupyter_code>temp = repdaMor[(repdaMor['ZONAS FEDERALES QUE AMPARA EL TITULO']>0)&(repdaMor['APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO']==0)&(repdaMor['APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO']==0)&(repdaMor['PUNTOS DE DESCARGA QUE AMPARA EL TÍTULO']==0)].shape[0]
print(f"Hay {temp} registros que solo tienen zonas federales.")
print(f"Eso representa el {temp/repdaMor.shape[0]*100:.3f}% de los datos totales.")
print(f"Y el {temp/231*100:.3f}% de los registros que no extraen agua")<jupyter_output>Hay 172 registros que solo tienen zonas federales.
Eso representa el 32.514% de los datos totales.
Y el 74.459% de los registros que no extraen agua<jupyter_text>Descargas<jupyter_code>usosDes = pd.pivot_table(data=repdaMor, index='USO QUE AMPARA EL TÍTULO', values=['PUNTOS DE DESCARGA QUE AMPARA EL TÍTULO','VOLUMEN DE DESCARGA DIARIO EN m3'], aggfunc='sum')
usosDes = usosDes.sort_values(by =  'VOLUMEN DE DESCARGA DIARIO EN m3', ascending=False)
usosDes<jupyter_output><empty_output><jupyter_text>De nuevo es el uso público el que mayor volumen tiene, sin embargo, llama la atención que solo se presente el volumen diario cuando en los otros anexos se nos presenta el volumen anual, y es más interesante porque dentro de la base de anexos que está disponible, sí se cuenta con el volumen anual de descarga. También valdría la pena revisar qué pasa con el volumen de extracción de aguas cuando solo se cuenta con este tipo de anexo.<jupyter_code>temp = repdaMor[(repdaMor['ZONAS FEDERALES QUE AMPARA EL TITULO']==0)&(repdaMor['APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO']==0)&(repdaMor['APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO']==0)&(repdaMor['PUNTOS DE DESCARGA QUE AMPARA EL TÍTULO']>0)].shape[0]
print(f"Hay {temp} registros que solo tienen puntos de descarga.")
print(f"Eso representa el {temp/repdaMor.shape[0]*100:.3f}% de los datos totales.")
print(f"Y el {temp/231*100:.3f}% de los registros que no extraen agua")<jupyter_output>Hay 56 registros que solo tienen puntos de descarga.
Eso representa el 10.586% de los datos totales.
Y el 24.242% de los registros que no extraen agua<jupyter_text>Con esto ya tenemos cubierto la mayor parte de los registros donde no se extrae agua.  Titulares El siguiente punto de interés es revisar quién es dueño del agua, por lo que nos enfocaremos en los titulares que aparecen en el registro.<jupyter_code>#Con más de un registro
titgt2 = repdaMor.TITULAR.value_counts()[:36].index<jupyter_output><empty_output><jupyter_text>Usos<jupyter_code>titularUsos = pd.pivot_table(data=repdaMor[repdaMor.TITULAR.isin(titgt2)], columns='USO QUE AMPARA EL TÍTULO', values='VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3',index='TITULAR', aggfunc='count')
titularUsos.fillna(0,inplace=True)
titularUsos['TOTAL'] = sum([usosTitular[col] for col in usosTitular.columns])
titularUsos.sort_values(by='TOTAL', ascending=False,inplace=True)
titularUsos
for col in titularUsos.columns[:-1]:
    temp = titularUsos[titularUsos[col]>1].sort_values(by=col, ascending=False)
    if temp.shape[0]==0:
        continue
    sns.barplot(y=temp.index,x=temp[col], color='b')
    plt.title("Titulares para el uso "+col.lower(),fontsize=16)
    plt.xlabel("Cantitdad de títulos")
    plt.xticks(rotation=90)
    plt.savefig('./Graficas/Titulares'+col+'.svg',dpi=350,bbox_inches="tight")
    plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que solo para el uso público urbano hay un claro dueño y ese es el OOAPAS. Lo siguiente es revisar la cantidad de títulos que tiene cada titular.<jupyter_code>sns.barplot(y=titularUsos.head(5).index,x=titularUsos.head(5)['TOTAL'], palette='Blues_r')
plt.title("Los titulares con la mayor cantidad de títulos",fontsize=16)
plt.xlabel("Cantitdad de títulos")
plt.xticks(rotation=90)
plt.savefig('./Graficas/TitularesTitulos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que el OOAPAS es por mucho el organismo con la mayor cantidad de títulos. Los siguiente es revisar cuánta agua es extraída por cada uno de los títulares.<jupyter_code>titularesExtra = pd.pivot_table(data=repdaMor, index = 'TITULAR', values = 'VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3', aggfunc='sum')
titularesExtra.sort_values(by='VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3', ascending=False, inplace=True)
titularesExtra
sns.barplot(y=titularesExtra.head(5).index,x=titularesExtra.head(5)['VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3'], color='b')
plt.title("Los titulares con la mayor extracción de agua",fontsize=16)
plt.xlabel("Agua extraída\n(hm³/año)")
plt.xticks(ticks=[int(i) for i in range(0,int(100e6),int(10e6))],labels=[int(i/1e6) for i in range(0,int(100e6),int(10e6))],rotation=90)
plt.savefig('./Graficas/TitularesExtraccion.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Una vex más, es el OOAPAS el titular que más destaca, sin embargo, tanto CRISOBA INDUSTRIAL S.A. DE C.V. como la CFE no están presentes en los titulares con más títulos. Por ello valdría la pena revisar el promedio de extracción por los anexos totales que sirven para la extracción.<jupyter_code>titularesExtraAvg = pd.pivot_table(data=repdaMor, index = 'TITULAR', values = ['VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3','APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO','APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO'], aggfunc='sum')
titularesExtraAvg['ANEXOS DE EXTRACCIÓN'] = titularesExtraAvg['APROVECHAMIENTOS SUPERFICIALES QUE AMPARA EL TÍTULO']+ titularesExtraAvg['APROVECHAMIENTOS SUBTERRÁNEOS QUE AMPARA EL TÍTULO']
titularesExtraAvg = titularesExtraAvg[titularesExtraAvg['ANEXOS DE EXTRACCIÓN']>0]
titularesExtraAvg['PROMEDIO EN m3'] = titularesExtra['VOLUMEN DE EXTRACCIÓN ANUAL DE AGUAS NACIONALES QUE AMPARA EL TÍTULO EN m3']/ titularesExtraAvg['ANEXOS DE EXTRACCIÓN']
titularesExtraAvg.sort_values(by='PROMEDIO EN m3', ascending=False, inplace=True)
titularesExtraAvg
sns.barplot(y=titularesExtraAvg.head(5).index,x=titularesExtraAvg.head(5)['PROMEDIO EN m3'], color='b')
plt.title("Los titulares que extraen más agua por título",fontsize=16)
plt.xlabel("Agua extraída\n(hm³/año)")
plt.xticks(ticks=[int(i) for i in range(0,int(17e6),int(1e6))],labels=[int(i/1e6) for i in range(0,int(17e6),int(1e6))],rotation=90)
plt.savefig('./Graficas/TitularesExtraccionPromedio.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que en promedio la CFE y CRISOBA INDUSTRIAL S.A. DE C.V. son quienes extraen la mayor cantidad de aguas nacionales en Morelia. Lo siguiente es ver la cantidad de anexos que tiene cada titular.<jupyter_code>titularesAnexo = pd.pivot_table(data=repdaMor, index = 'TITULAR', values = 'TOTAL DE ANEXOS', aggfunc='sum')
titularesAnexo.sort_values(by='TOTAL DE ANEXOS', ascending=False, inplace=True)
titularesAnexo.head()
sns.barplot(y=titularesAnexo.head(5).index,x=titularesAnexo.head(5)['TOTAL DE ANEXOS'], color='b')
plt.title("Los titulares con la mayor cantidad de anexos",fontsize=16)
plt.xlabel("Cantitdad de anexos")
plt.xticks(rotation=90)
plt.savefig('./Graficas/TitularesAnexos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>De nuevo aparece el OOAPAS en primer lugar, pero llama la atención la aparición de otros titulares que no figuraban por tener una gran cantidad de registros o extracción de agua. Lo siguiente que podemos revisar es la superficie, teniendo en cuenta que tendremos como resultado unicamente a aquellos que tienen anexos de Zonas Federales.<jupyter_code>titularesSuper = pd.pivot_table(data=repdaMor, index = 'TITULAR', values = 'SUPERFICIE EN m2', aggfunc='sum')
titularesSuper.sort_values(by='SUPERFICIE EN m2', ascending=False, inplace=True)
titularesSuper
sns.barplot(y=titularesSuper.head(5).index,x=titularesSuper.head(5)['SUPERFICIE EN m2'], color='b')
plt.title("Titulares con la mayor cantidad de superficie",fontsize=16)
plt.xlabel("Superficie m²")
plt.xticks(rotation=90)
plt.savefig('./Graficas/TitularesSuperficie.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que la mayor cantidad de superficie la tiene un particular.  Fechas  Títulos Una de las cosas que llama la atención es la variadad de formatos que existen para el título, de acuerdo al  [diccionario de datos](https://files.conagua.gob.mx/conagua/Diccionarios/Diccionario_Datos_concesiones.pdf), la longitud del título debería ser de 20 caracteres, son embargo, hay algunos que solo tienen digitos.  Para revisar los formatos, nos vamos a enfocar en las longitudes<jupyter_code>pd.Series(repdaMor.TÍTULO.apply(lambda x: len(x))).value_counts()<jupyter_output><empty_output><jupyter_text>Veamos ejemplos para cada longitud<jupyter_code>for l in [20,19,6,9,11]:
    temp = repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==l]['TÍTULO'].head(1)
    print(f"Título con {l} caracteres:")
    print(list(temp)[0])<jupyter_output>Título con 20 caracteres:
08MCH102078/12AOGE00
Título con 19 caracteres:
4MCH100151/12FMGR94
Título con 6 caracteres:
814967
Título con 9 caracteres:
MCH100116
Título con 11 caracteres:
08MCH104357<jupyter_text>Vemos que parece que la diferencia entre el registro de 20 caracteres y el de 19, es que el de 19 no considera el cero inicial, por lo que podemos revisar todos para comprobar que esto es lo que pasa.<jupyter_code>np.array(repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==19]['TÍTULO'])<jupyter_output><empty_output><jupyter_text>Con esto comprobamos la sospecha existente. Por lo que entre estos dos formatos, lo que se debe de revisar son las fechas, para ver si fue un cambio que se hizo a partir de algún año.<jupyter_code>repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==20]['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)
repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==19]['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)<jupyter_output><empty_output><jupyter_text>Podemos darnos cuenta que existe un traslape de fehcas entre ambos formatos, lo que nos indica que se trata de una inconsistencia en los registros. Otra similutud entre los formatos es cuando tienen 9 y 11 caracteres, ya que la diferencia parece ser los dos dígitos antes del _MCH_, a su vez parece ser la primera parte de los que tienen 20 caracteres. Así que vamos a revisar lo que pasa con las fechas de los registros.<jupyter_code>repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==9]['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)
repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==11]['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)<jupyter_output><empty_output><jupyter_text>Vemos que de nuevo se traslpa con el formato correcto de 20 caracteres, por lo que podemos decir que se trata de una inconsistencia de formato. Sin embargo, hay un formato que es totalmente diferente al resto y es el de 6 caracteres, ya que no aparece la palabra _MCH_, solo se trata de dígitos. Así que revisemos las fechas en las que este formato está presente.<jupyter_code>repdaMor[repdaMor.TÍTULO.apply(lambda x: len(x))==6]['FECHA DE REGISTRO'].describe(datetime_is_numeric=True)<jupyter_output><empty_output><jupyter_text>Vemos que para este formato no hay un traslape con el de 20 caracteres, y es el que se ha estado usando recientemente, por lo que puede que se trate de un cambio de formato.<jupyter_code>sns.countplot(x = pd.DatetimeIndex(repdaMor['FECHA DE REGISTRO']).year, color='b')
plt.title("Distribución de permisos\npor año",size=16)
plt.ylabel("Cantidad de registros")
plt.xlabel("Año de registro")
plt.xticks(rotation=90)
plt.savefig('./Graficas/AnioPermisos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Vemos que en 2018 hubo la mayor cantidad de registros y en 2011 la menor. También podemos revisar los meses.<jupyter_code>orden = ['January','February','March','April','May','June','July',
         'August','September','October','November','December']
meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio',
        'Agosto','Septiembre','Octubre','Noviembre','Diciembre']
sns.countplot(x = pd.DatetimeIndex(repdaMor['FECHA DE REGISTRO']).month_name(), color='b',order=orden)
plt.title("Cantidad de permisos por mes",size=16)
plt.ylabel("Cantidad de registros")
plt.xlabel("Mes de registro")
plt.xticks(ticks=list(range(12)),labels=meses,rotation=90)
plt.savefig('./Graficas/MesPermisos.svg',dpi=350,bbox_inches="tight")
plt.show()<jupyter_output><empty_output><jupyter_text>Naturalmente, es al inicio del año cuando se hacen más registros.  Autoridades que emiten el acto<jupyter_code>repdaMor['AUTORIDAD QUE EMITE EL ACTO'].value_counts()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09157127991675339, 'fraction_numerical': 0.017219965761471584, 'mean_word_length': 5.2812565886569685, 'pattern_counts': {'":': 2, '<': 167, '<?xml version=': 0, '>': 171, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 18, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '41', 'dir': 'jupyter-structured-clean-dedup', 'id': '374585', 'license': 'CC0-1.0', 'n_tokens_mistral': 11667, 'n_tokens_neox': 11022, 'n_words': 3147, 'path': 'Analisis.ipynb', 'repo_name': 'tipicanerd/REPDA_analisis', 'size': '29986'}